diff options
author | Rhin <ryanrhin@gmail.com> | 2019-07-11 13:52:33 -0500 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-07-11 20:52:33 +0200 |
commit | d7b836858e37916c8a1aa344e5ca9dca63a5563f (patch) | |
tree | cf0e26a3480b9cd0f876653ece5ea64b9d591fca | |
parent | 2dc0ea1cf94c392f43bbc7ec6830b4bdb767b16c (diff) | |
download | serenity-d7b836858e37916c8a1aa344e5ca9dca63a5563f.zip |
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.
-rwxr-xr-x | Applications/TextEditor/Makefile | 3 | ||||
-rw-r--r-- | Applications/TextEditor/TextEditorWidget.cpp | 124 | ||||
-rw-r--r-- | Applications/TextEditor/TextEditorWidget.h | 20 | ||||
-rw-r--r-- | Applications/TextEditor/main.cpp | 137 |
4 files changed, 154 insertions, 130 deletions
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 <AK/StringBuilder.h> +#include <LibCore/CFile.h> +#include <LibGUI/GAction.h> +#include <LibGUI/GBoxLayout.h> +#include <LibGUI/GFilePicker.h> +#include <LibGUI/GFontDatabase.h> +#include <LibGUI/GMenuBar.h> +#include <LibGUI/GMessageBox.h> +#include <LibGUI/GStatusBar.h> +#include <LibGUI/GTextEditor.h> +#include <LibGUI/GToolBar.h> + +TextEditorWidget::TextEditorWidget() +{ + set_layout(make<GBoxLayout>(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<GMenuBar>(); + auto app_menu = make<GMenu>("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<GMenu>("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<GMenu>("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<GMenu>("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<GMenu>("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 <AK/Function.h> +#include <LibGUI/GApplication.h> +#include <LibGUI/GTextEditor.h> +#include <LibGUI/GWidget.h> +#include <LibGUI/GWindow.h> + +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 <AK/StringBuilder.h> -#include <LibCore/CFile.h> -#include <LibGUI/GAction.h> -#include <LibGUI/GApplication.h> -#include <LibGUI/GBoxLayout.h> -#include <LibGUI/GFilePicker.h> -#include <LibGUI/GFontDatabase.h> -#include <LibGUI/GMenuBar.h> -#include <LibGUI/GMessageBox.h> -#include <LibGUI/GStatusBar.h> -#include <LibGUI/GTextEditor.h> -#include <LibGUI/GToolBar.h> -#include <LibGUI/GWidget.h> -#include <LibGUI/GWindow.h> -#include <fcntl.h> -#include <signal.h> -#include <stdio.h> -#include <unistd.h> - -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<GBoxLayout>(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<GMenuBar>(); - auto app_menu = make<GMenu>("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<GMenu>("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<GMenu>("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<GMenu>("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<GMenu>("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 |