From 2e547ce7a354df41c7a4b9e36479804d12e835e3 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 14 Sep 2020 12:51:12 +0200 Subject: [PATCH] TextEditor: Move the main window UI to JSON This is our first client of the new JSON GUI declaration thingy. The skeleton of the TextEditor app GUI is now declared separately from the C++ logic, and we use the Core::Object::name() of widgets to locate them once they have been instantiated by the GUI builder. --- Applications/TextEditor/CMakeLists.txt | 7 +++ Applications/TextEditor/MainWindow.json | 50 ++++++++++++++++++++ Applications/TextEditor/TextEditorWidget.cpp | 25 ++++------ CMakeLists.txt | 1 + 4 files changed, 67 insertions(+), 16 deletions(-) create mode 100644 Applications/TextEditor/MainWindow.json diff --git a/Applications/TextEditor/CMakeLists.txt b/Applications/TextEditor/CMakeLists.txt index 88bfe831711..1feb0ae1838 100644 --- a/Applications/TextEditor/CMakeLists.txt +++ b/Applications/TextEditor/CMakeLists.txt @@ -1,6 +1,13 @@ set(SOURCES main.cpp TextEditorWidget.cpp + MainWindowUI.h +) + +add_custom_command( + OUTPUT MainWindowUI.h + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/MainWindow.json + COMMAND ${write_if_different} MainWindowUI.h ${CMAKE_SOURCE_DIR}/Meta/text-to-cpp-string.sh main_window_ui_json ${CMAKE_CURRENT_SOURCE_DIR}/MainWindow.json ) serenity_bin(TextEditor) diff --git a/Applications/TextEditor/MainWindow.json b/Applications/TextEditor/MainWindow.json new file mode 100644 index 00000000000..7b9c9e9cb00 --- /dev/null +++ b/Applications/TextEditor/MainWindow.json @@ -0,0 +1,50 @@ +{ + "name": "main", + "fill_with_background_color": true, + + "layout": { + "class": "GUI::VerticalBoxLayout", + "spacing": 2 + }, + + "children": [ + { + "class": "GUI::ToolBarContainer", + "children": [ + { + "class": "GUI::ToolBar", + "name": "toolbar" + } + ] + }, + { + "class": "GUI::HorizontalSplitter", + "children": [ + { + "class": "GUI::TextEditor", + "name": "editor" + }, + { + "class": "Web::InProcessWebView", + "name": "webview" + } + ] + }, + { + "class": "GUI::Widget", + "name": "find_replace_widget", + "fill_with_background_color": true, + "horizontal_size_policy": "Fill", + "vertical_size_policy": "Fixed", + "preferred_height": 48, + "layout": { + "class": "GUI::VerticalBoxLayout", + "margins": [ 2, 2, 2, 4 ] + } + }, + { + "class": "GUI::StatusBar", + "name": "statusbar" + } + ] +} diff --git a/Applications/TextEditor/TextEditorWidget.cpp b/Applications/TextEditor/TextEditorWidget.cpp index 75396a36d58..688fa3eb9f4 100644 --- a/Applications/TextEditor/TextEditorWidget.cpp +++ b/Applications/TextEditor/TextEditorWidget.cpp @@ -25,9 +25,12 @@ */ #include "TextEditorWidget.h" +#include +#include #include #include #include +#include #include #include #include @@ -57,16 +60,11 @@ TextEditorWidget::TextEditorWidget() { - set_fill_with_background_color(true); - set_layout(); - layout()->set_spacing(2); + load_from_json(main_window_ui_json); - auto& toolbar_container = add(); - auto& toolbar = toolbar_container.add(); + auto& toolbar = static_cast(*find_descendant_by_name("toolbar")); - auto& splitter = add(); - - m_editor = splitter.add(); + m_editor = static_cast(*find_descendant_by_name("editor")); m_editor->set_ruler_visible(true); m_editor->set_automatic_indentation_enabled(true); m_editor->set_line_wrapping_enabled(true); @@ -86,7 +84,7 @@ TextEditorWidget::TextEditorWidget() update_title(); }; - m_page_view = splitter.add(); + m_page_view = static_cast(*find_descendant_by_name("webview")); m_page_view->set_visible(false); m_page_view->on_link_hover = [this](auto& url) { if (url.is_valid()) @@ -104,12 +102,7 @@ TextEditorWidget::TextEditorWidget() } }; - m_find_replace_widget = add(); - m_find_replace_widget->set_fill_with_background_color(true); - m_find_replace_widget->set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed); - m_find_replace_widget->set_preferred_size(0, 48); - m_find_replace_widget->set_layout(); - m_find_replace_widget->layout()->set_margins({ 2, 2, 2, 4 }); + m_find_replace_widget = *find_descendant_by_name("find_replace_widget"); m_find_replace_widget->set_visible(false); m_find_widget = m_find_replace_widget->add(); @@ -292,7 +285,7 @@ TextEditorWidget::TextEditorWidget() m_editor->add_custom_context_menu_action(*m_find_next_action); m_editor->add_custom_context_menu_action(*m_find_previous_action); - m_statusbar = add(); + m_statusbar = static_cast(*find_descendant_by_name("statusbar")); m_editor->on_cursor_change = [this] { update_statusbar_cursor_position(); }; diff --git a/CMakeLists.txt b/CMakeLists.txt index 427457019b1..bcd2efffeec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -197,6 +197,7 @@ add_link_options(--sysroot ${CMAKE_BINARY_DIR}/Root) include_directories(Libraries/LibC) include_directories(Libraries/LibM) include_directories(Services) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}/Services) include_directories(${CMAKE_CURRENT_BINARY_DIR}/Libraries)