GUI_ROADMAP.md 5.7 KB

GUI Frontend Roadmap: Lumacs with GTK4 (gtkmm)

This document outlines the phased approach to integrate a graphical frontend into Lumacs, utilizing GTK4 with its C++ bindings (gtkmm). The goal is to provide a rich, native user experience while leveraging the existing C++ core and Lua extensibility.

Phase 0: Preparation (Current State)

  • Status: Complete
  • Description: Core editor logic (EditorCore, Buffer) is decoupled from the UI. An abstract Face system is implemented, allowing for UI-agnostic styling definitions.
  • Key Achievements:
    • Abstract Face system in include/lumacs/face.hpp
    • Theme system refactored to manage Face definitions
    • Buffer stores face_name for styling ranges
    • NcursesEditor renders Faces to best of its ability (colors, bold, italic)

Phase 1: Abstract UI Interface Extraction

  • Goal: Define a clean separation between EditorCore and any UI frontend.
  • Tasks:
    1. Define IEditorView Interface: Create an abstract base class (e.g., IEditorView or EditorFrontend) in include/lumacs/ui_interface.hpp that EditorCore will interact with. This interface will declare methods for:
      • Receiving buffer content updates.
      • Receiving cursor position changes.
      • Receiving messages.
      • Requesting input (e.g., for minibuffer).
      • Triggering UI mode changes (Command, FindFile, etc.).
      • Rendering updates.
    2. Refactor NcursesEditor:
      • Rename NcursesEditor to TuiEditor.
      • Make TuiEditor implement IEditorView.
      • Modify EditorCore to hold a pointer/reference to IEditorView instead of tightly coupled NcursesEditor logic.
      • Update main.cpp (or main_ncurses.cpp) to instantiate TuiEditor and pass it to EditorCore.
    3. Refine EditorEvent Usage: Ensure EditorCore communicates solely via IEditorView or its existing event system (EditorEvent).
  • Output: A decoupled EditorCore that can interact with any IEditorView implementation.
  • Dependencies: Existing C++ codebase.

Phase 2: GTK4 Environment Setup & Basic Window

  • Goal: Integrate GTK4 into the build system and display a minimal window.
  • Tasks:
    1. Update CMakeLists.txt: Add find_package(PkgConfig REQUIRED) and pkg_check_modules(GTKMM REQUIRED gtkmm-4.0). Add GTKMM include directories and link libraries.
    2. Create main_gtk.cpp: A new entry point for the GTK frontend.
    3. Implement GtkEditor Stub: Create a placeholder class GtkEditor that inherits from IEditorView.
    4. Basic GTK Window: In main_gtk.cpp, initialize GTK, create a simple Gtk::Application and Gtk::Window, and show it.
    5. Conditional Build: Configure CMake to allow building either lumacs (TUI) or lumacs-gtk (GUI) executables based on a flag (e.g., -DBUILD_GUI=ON).
  • Output: A separate lumacs-gtk executable that opens an empty GTK window.
  • Dependencies: gtkmm-4.0 development libraries.

Phase 3: Displaying Buffer Content

  • Goal: Render the active buffer's text content within the GTK window.
  • Tasks:
    1. Gtk::DrawingArea: Use a Gtk::DrawingArea to draw text.
    2. Pango/Cairo Integration: Learn how to use Pango for text layout and Cairo for drawing on the DrawingArea.
    3. Text Display: Get the current buffer content from EditorCore and render it.
    4. Scrolling: Implement basic vertical scrolling.
  • Output: A GTK window displaying the text of the active buffer.
  • Dependencies: Pango, Cairo.

Phase 4: Styling with Faces

  • Goal: Implement the Face system within GtkEditor to render styled text.
  • Tasks:
    1. Pango Attributes: Map Lumacs FaceAttributes to Pango attributes (foreground, background, weight, slant, underline, font family, font size).
    2. Styled Text Rendering: Iterate through StyledRange objects from the Buffer and apply the corresponding Pango attributes before drawing text segments.
    3. Theme Integration: Ensure the active theme's face definitions are applied to the rendered text.
  • Output: A GTK window displaying syntax-highlighted and styled text according to the active theme.

Phase 5: Input Handling & Minibuffer

  • Goal: Capture keyboard input and integrate with the minibuffer and other interactive UI elements.
  • Tasks:
    1. Keyboard Input: Connect GTK keyboard events to EditorCore's key processing.
    2. Cursor Display: Render a blinking cursor in the DrawingArea.
    3. Minibuffer Input: Implement a Gtk::Entry for the minibuffer (command input, find file, etc.).
    4. Completion Popup: Implement a GTK popup for minibuffer completion suggestions.
  • Output: Fully interactive text editor with working cursor and minibuffer.

Phase 6: Full UI Feature Parity

  • Goal: Implement all existing features of TuiEditor (window splits, status lines, messages, marks, regions) in GtkEditor.
  • Tasks:
    1. Status Line/Modelines: Render status bars for each window.
    2. Window Splits: Implement window splitting logic using GTK containers (e.g., Gtk::Paned or Gtk::Grid).
    3. Selection/Regions: Visually render active text selections.
    4. Context Menus/Dialogs: Implement GTK equivalents for any UI popups.
  • Output: A fully functional GUI frontend with feature parity to the TUI.

Future Considerations

  • High-DPI Support: Ensure crisp rendering on high-resolution displays.
  • Accessibility: Integrate with GTK's accessibility features.
  • Native File Dialogs: Use Gtk::FileChooserDialog for find-file and save-as.