Compare commits

...

2 Commits

Author SHA1 Message Date
69f3e28f2c
editor: Use window->add_keyboard_shortcut to handle Ctrl+S
Some checks failed
Build and test / build (push) Failing after 13m5s
2024-04-15 19:34:09 +02:00
2f56a52489
libui: Add support for keyboard shortcuts natively 2024-04-15 19:33:32 +02:00
5 changed files with 52 additions and 18 deletions

View File

@ -98,24 +98,6 @@ Result<ui::EventResult> EditorWidget::handle_key_event(const ui::KeyEventRequest
return ui::EventResult::DidHandle;
}
if (request.modifiers & ui::Mod_Ctrl)
{
switch (request.key)
{
case 's': {
auto result = save_file();
if (result.has_error())
{
os::eprintln("editor: failed to save file: %s", result.error_string());
return ui::EventResult::DidNotHandle;
}
os::println("editor: buffer saved to %s successfully", m_path.name().chars());
return ui::EventResult::DidNotHandle;
}
default: return ui::EventResult::DidNotHandle;
}
}
if (request.code == moon::K_Backspace)
{
if (m_cursor == 0) return ui::EventResult::DidNotHandle;

View File

@ -26,6 +26,11 @@ class EditorWidget : public ui::TextInput
Result<void> draw(ui::Canvas& canvas) override;
os::Path& path()
{
return m_path;
}
private:
SharedPtr<ui::Font> m_font;

View File

@ -9,6 +9,7 @@
#include "EditorWidget.h"
#include <os/ArgumentParser.h>
#include <os/File.h>
#include <ui/App.h>
Result<int> luna_main(int argc, char** argv)
@ -33,6 +34,13 @@ Result<int> luna_main(int argc, char** argv)
window->set_main_widget(*editor);
if (!path.is_empty()) TRY(editor->load_file(path));
TRY(window->add_keyboard_shortcut({ moon::K_CH26, ui::Mod_Ctrl }, true, [&](ui::Shortcut) {
auto result = editor->save_file();
if (result.has_error()) os::eprintln("editor: failed to save file: %s", result.error_string());
else
os::println("editor: buffer saved to %s successfully", editor->path().name().chars());
}));
window->draw();
return app.run();

View File

@ -26,6 +26,17 @@ namespace ui
System,
};
struct [[gnu::packed]] Shortcut
{
moon::KeyCode key;
int modifiers;
bool operator==(const Shortcut& other) const
{
return key == other.key && modifiers == other.modifiers;
}
};
class Window
{
public:
@ -62,6 +73,8 @@ namespace ui
Result<ui::EventResult> handle_mouse_buttons(ui::Point position, int buttons);
Result<ui::EventResult> handle_key_event(const ui::KeyEventRequest& request);
Result<void> add_keyboard_shortcut(ui::Shortcut shortcut, bool intercept, os::Function<ui::Shortcut>&& action);
int id() const
{
return m_id;
@ -80,6 +93,14 @@ namespace ui
Option<int> m_old_mouse_buttons;
bool m_decorated { false };
struct ShortcutAction
{
bool intercept;
os::Function<Shortcut> action;
};
HashMap<Shortcut, ShortcutAction> m_shortcuts;
Result<void> draw_titlebar();
};
}

View File

@ -212,7 +212,25 @@ namespace ui
Result<ui::EventResult> Window::handle_key_event(const ui::KeyEventRequest& request)
{
if (request.pressed)
{
auto* shortcut = m_shortcuts.try_get_ref({ request.code, request.modifiers });
if (shortcut)
{
shortcut->action({ request.code, request.modifiers });
if (shortcut->intercept) return ui::EventResult::DidHandle;
}
}
if (!m_main_widget) return ui::EventResult::DidNotHandle;
return m_main_widget->handle_key_event(request);
}
Result<void> Window::add_keyboard_shortcut(ui::Shortcut shortcut, bool intercept,
os::Function<ui::Shortcut>&& action)
{
TRY(m_shortcuts.try_set(shortcut, { intercept, move(action) }));
return {};
}
}