#pragma once #include "lumacs/ui_interface.hpp" #include "lumacs/gtk_renderer.hpp" #include "lumacs/window.hpp" #include "lumacs/editor_core.hpp" #include "lumacs/face.hpp" #include "lumacs/gtk_window_controller.hpp" // Include GtkWindowController header #include #include #include #include #include // Forward declarations namespace lumacs { class EditorCore; class Window; } // Custom Gtk::ApplicationWindow to make constructor public class LumacsWindow : public Gtk::ApplicationWindow { public: explicit LumacsWindow(const Glib::RefPtr& application); }; namespace lumacs { class GtkEditor : public IEditorView { public: GtkEditor(); ~GtkEditor() override; void init() override; void run() override; void handle_editor_event(EditorEvent event) override; void set_core(EditorCore* core) override; void queue_redraw_all_windows(Gtk::Widget* widget); private: EditorCore* core_; std::shared_ptr cached_active_window_; Glib::RefPtr app_; Gtk::Window* window_ = nullptr; Gtk::DrawingArea* drawing_area_ = nullptr; Gtk::Widget* content_widget_ = nullptr; bool cursor_visible_ = true; sigc::connection cursor_timer_connection_; std::unique_ptr gtk_renderer_; std::vector> window_controllers_; protected: void on_activate(); void on_draw(const Cairo::RefPtr& cr, int width, int height); bool on_cursor_blink(); void rebuild_layout(); Gtk::Widget* create_widget_for_layout_node(std::shared_ptr node); }; std::unique_ptr create_gtk_editor(); } // namespace lumacs