From d7b836858e37916c8a1aa344e5ca9dca63a5563f Mon Sep 17 00:00:00 2001 From: Rhin Date: Thu, 11 Jul 2019 13:52:33 -0500 Subject: [PATCH] TextEditor: Move the application UI into a dedicated TextEditorWidget. (#292) Added a main widget for the text editor as a stepping stone to add new features. --- Applications/TextEditor/Makefile | 3 +- Applications/TextEditor/TextEditorWidget.cpp | 124 +++++++++++++++++ Applications/TextEditor/TextEditorWidget.h | 20 +++ Applications/TextEditor/main.cpp | 137 ++----------------- 4 files changed, 154 insertions(+), 130 deletions(-) create mode 100644 Applications/TextEditor/TextEditorWidget.cpp create mode 100644 Applications/TextEditor/TextEditorWidget.h diff --git a/Applications/TextEditor/Makefile b/Applications/TextEditor/Makefile index c1d774f9ea..32e76a8d43 100755 --- a/Applications/TextEditor/Makefile +++ b/Applications/TextEditor/Makefile @@ -1,7 +1,8 @@ include ../../Makefile.common OBJS = \ - main.o + TextEditorWidget.o \ + main.o APP = TextEditor diff --git a/Applications/TextEditor/TextEditorWidget.cpp b/Applications/TextEditor/TextEditorWidget.cpp new file mode 100644 index 0000000000..3943c012fb --- /dev/null +++ b/Applications/TextEditor/TextEditorWidget.cpp @@ -0,0 +1,124 @@ +#include "TextEditorWidget.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +TextEditorWidget::TextEditorWidget() +{ + set_layout(make(Orientation::Vertical)); + layout()->set_spacing(0); + + auto* toolbar = new GToolBar(this); + m_editor = new GTextEditor(GTextEditor::MultiLine, this); + m_editor->set_ruler_visible(true); + m_editor->set_automatic_indentation_enabled(true); + auto* statusbar = new GStatusBar(this); + + m_editor->on_cursor_change = [statusbar, this] { + StringBuilder builder; + builder.appendf("Line: %d, Column: %d", m_editor->cursor().line(), m_editor->cursor().column()); + statusbar->set_text(builder.to_string()); + }; + + auto new_action = GAction::create("New document", { Mod_Ctrl, Key_N }, GraphicsBitmap::load_from_file("/res/icons/16x16/new.png"), [](const GAction&) { + dbgprintf("FIXME: Implement File/New\n"); + }); + + auto open_action = GAction::create("Open document", { Mod_Ctrl, Key_O }, GraphicsBitmap::load_from_file("/res/icons/16x16/open.png"), [this](const GAction&) { + GFilePicker picker; + + if (picker.exec() == GDialog::ExecOK) { + m_path = picker.selected_file().string(); + open_sesame(m_path); + } + }); + + auto save_action = GAction::create("Save document", { Mod_Ctrl, Key_S }, GraphicsBitmap::load_from_file("/res/icons/16x16/save.png"), [this](const GAction&) { + dbgprintf("Writing document to '%s'\n", m_path.characters()); + m_editor->write_to_file(m_path); + }); + + auto menubar = make(); + auto app_menu = make("Text Editor"); + app_menu->add_action(GAction::create("Quit", { Mod_Alt, Key_F4 }, [](const GAction&) { + GApplication::the().quit(0); + return; + })); + menubar->add_menu(move(app_menu)); + + auto file_menu = make("File"); + file_menu->add_action(new_action.copy_ref()); + file_menu->add_action(open_action.copy_ref()); + file_menu->add_action(save_action.copy_ref()); + menubar->add_menu(move(file_menu)); + + auto edit_menu = make("Edit"); + edit_menu->add_action(m_editor->undo_action()); + edit_menu->add_action(m_editor->redo_action()); + edit_menu->add_separator(); + edit_menu->add_action(m_editor->cut_action()); + edit_menu->add_action(m_editor->copy_action()); + edit_menu->add_action(m_editor->paste_action()); + edit_menu->add_action(m_editor->delete_action()); + menubar->add_menu(move(edit_menu)); + + auto font_menu = make("Font"); + GFontDatabase::the().for_each_fixed_width_font([&](const StringView& font_name) { + font_menu->add_action(GAction::create(font_name, [this](const GAction& action) { + m_editor->set_font(GFontDatabase::the().get_by_name(action.text())); + m_editor->update(); + })); + }); + menubar->add_menu(move(font_menu)); + + auto help_menu = make("Help"); + help_menu->add_action(GAction::create("About", [](const GAction&) { + dbgprintf("FIXME: Implement Help/About\n"); + })); + menubar->add_menu(move(help_menu)); + + GApplication::the().set_menubar(move(menubar)); + + toolbar->add_action(move(new_action)); + toolbar->add_action(move(open_action)); + toolbar->add_action(move(save_action)); + + toolbar->add_separator(); + + toolbar->add_action(m_editor->cut_action()); + toolbar->add_action(m_editor->copy_action()); + toolbar->add_action(m_editor->paste_action()); + toolbar->add_action(m_editor->delete_action()); + + toolbar->add_separator(); + + toolbar->add_action(m_editor->undo_action()); + toolbar->add_action(m_editor->redo_action()); + + m_editor->set_focus(true); +} + +TextEditorWidget::~TextEditorWidget() +{ +} + +void TextEditorWidget::open_sesame(const String& path) +{ + dbgprintf("Our path to file in open_sesame: %s\n", path.characters()); + CFile file(path); + + if (!file.open(CIODevice::ReadOnly)) { + GMessageBox::show(String::format("Opening \"%s\" failed: %s", path.characters(), strerror(errno)), "Error", GMessageBox::Type::Error, window()); + } + + window()->set_title(String::format("Text Editor: %s", path.characters())); + m_editor->set_text(String::copy(file.read_all())); +} \ No newline at end of file diff --git a/Applications/TextEditor/TextEditorWidget.h b/Applications/TextEditor/TextEditorWidget.h new file mode 100644 index 0000000000..107ce2c461 --- /dev/null +++ b/Applications/TextEditor/TextEditorWidget.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include +#include +#include +#include + +class GTextEditor; + +class TextEditorWidget final : public GWidget { +public: + TextEditorWidget(); + virtual ~TextEditorWidget() override; + void open_sesame(const String& path); + +private: + GTextEditor* m_editor{ nullptr }; + String m_path = "/tmp/TextEditor.save.txt"; +}; diff --git a/Applications/TextEditor/main.cpp b/Applications/TextEditor/main.cpp index b0dbf8175d..a503980901 100644 --- a/Applications/TextEditor/main.cpp +++ b/Applications/TextEditor/main.cpp @@ -1,33 +1,4 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -void open_sesame(GWindow& window, GTextEditor& editor, const String& path) -{ - CFile file(path); - - if (!file.open(CIODevice::ReadOnly)) { - GMessageBox::show(String::format("Opening \"%s\" failed: %s", path.characters(), strerror(errno)), "Error", GMessageBox::Type::Error, &window); - } - - window.set_title(String::format("Text Editor: %s", path.characters())); - editor.set_text(String::copy(file.read_all())); -} +#include "TextEditorWidget.h" int main(int argc, char** argv) { @@ -35,109 +6,17 @@ int main(int argc, char** argv) auto* window = new GWindow; window->set_title("Text Editor"); - auto* widget = new GWidget; - widget->set_layout(make(Orientation::Vertical)); - widget->layout()->set_spacing(0); - - auto* toolbar = new GToolBar(widget); - auto* text_editor = new GTextEditor(GTextEditor::MultiLine, widget); - text_editor->set_ruler_visible(true); - text_editor->set_automatic_indentation_enabled(true); - auto* statusbar = new GStatusBar(widget); - - text_editor->on_cursor_change = [statusbar, text_editor] { - StringBuilder builder; - builder.appendf("Line: %d, Column: %d", text_editor->cursor().line(), text_editor->cursor().column()); - statusbar->set_text(builder.to_string()); - }; - - String path = "/tmp/TextEditor.save.txt"; - if (argc >= 2) { - path = argv[1]; - open_sesame(*window, *text_editor, path); - } - - auto new_action = GAction::create("New document", { Mod_Ctrl, Key_N }, GraphicsBitmap::load_from_file("/res/icons/16x16/new.png"), [](const GAction&) { - dbgprintf("FIXME: Implement File/New\n"); - }); - - auto open_action = GAction::create("Open document", { Mod_Ctrl, Key_O }, GraphicsBitmap::load_from_file("/res/icons/16x16/open.png"), [window, text_editor, &path](const GAction&) { - GFilePicker picker; - if (picker.exec() == GDialog::ExecOK) { - path = picker.selected_file().string(); - open_sesame(*window, *text_editor, path); - } - }); - - auto save_action = GAction::create("Save document", { Mod_Ctrl, Key_S }, GraphicsBitmap::load_from_file("/res/icons/16x16/save.png"), [&](const GAction&) { - dbgprintf("Writing document to '%s'\n", path.characters()); - text_editor->write_to_file(path); - }); - - auto menubar = make(); - auto app_menu = make("Text Editor"); - app_menu->add_action(GAction::create("Quit", { Mod_Alt, Key_F4 }, [](const GAction&) { - GApplication::the().quit(0); - return; - })); - menubar->add_menu(move(app_menu)); - - auto file_menu = make("File"); - file_menu->add_action(new_action); - file_menu->add_action(open_action); - file_menu->add_action(save_action); - menubar->add_menu(move(file_menu)); - - auto edit_menu = make("Edit"); - edit_menu->add_action(text_editor->undo_action()); - edit_menu->add_action(text_editor->redo_action()); - edit_menu->add_separator(); - edit_menu->add_action(text_editor->cut_action()); - edit_menu->add_action(text_editor->copy_action()); - edit_menu->add_action(text_editor->paste_action()); - edit_menu->add_action(text_editor->delete_action()); - menubar->add_menu(move(edit_menu)); - - auto font_menu = make("Font"); - GFontDatabase::the().for_each_fixed_width_font([&](const StringView& font_name) { - font_menu->add_action(GAction::create(font_name, [text_editor](const GAction& action) { - text_editor->set_font(GFontDatabase::the().get_by_name(action.text())); - text_editor->update(); - })); - }); - menubar->add_menu(move(font_menu)); - - auto help_menu = make("Help"); - help_menu->add_action(GAction::create("About", [](const GAction&) { - dbgprintf("FIXME: Implement Help/About\n"); - })); - menubar->add_menu(move(help_menu)); - - app.set_menubar(move(menubar)); - - toolbar->add_action(move(new_action)); - toolbar->add_action(move(open_action)); - toolbar->add_action(move(save_action)); - - toolbar->add_separator(); - - toolbar->add_action(text_editor->cut_action()); - toolbar->add_action(text_editor->copy_action()); - toolbar->add_action(text_editor->paste_action()); - toolbar->add_action(text_editor->delete_action()); - - toolbar->add_separator(); - - toolbar->add_action(text_editor->undo_action()); - toolbar->add_action(text_editor->redo_action()); window->set_rect(20, 200, 640, 400); - window->set_main_widget(widget); window->set_should_exit_event_loop_on_close(true); - text_editor->set_focus(true); window->show(); - window->set_icon_path("/res/icons/TextEditor16.png"); + auto* text_widget = new TextEditorWidget(); + window->set_main_widget(text_widget); + + if (argc >= 2) + text_widget->open_sesame(argv[1]); + return app.exec(); -} +} \ No newline at end of file