1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 13:48:12 +00:00

GWindow: Leave SerenityKey mode if non-existent keybind is used

This commit is contained in:
faissaloo 2019-06-03 18:13:41 +01:00
parent 72264661fd
commit 053f41f4f9
4 changed files with 26 additions and 19 deletions

View file

@ -64,9 +64,9 @@ void GButton::click()
on_click(*this); on_click(*this);
} }
/*bool GButton::accepts_keyboard_select() const { bool GButton::accepts_keyboard_select() const {
return is_enabled(); return is_enabled();
}*/ }
void GButton::set_action(GAction& action) void GButton::set_action(GAction& action)
{ {

View file

@ -33,6 +33,7 @@ public:
virtual const char* class_name() const override { return "GButton"; } virtual const char* class_name() const override { return "GButton"; }
virtual bool accepts_focus() const override { return true; } virtual bool accepts_focus() const override { return true; }
virtual bool accepts_keyboard_select() const;
protected: protected:
virtual void paint_event(GPaintEvent&) override; virtual void paint_event(GPaintEvent&) override;

View file

@ -278,24 +278,28 @@ void GWindow::event(CEvent& event)
} }
if (m_keybind_mode) { if (m_keybind_mode) {
StringBuilder builder; if (event.type() == GEvent::KeyUp) {
//Y u no work StringBuilder builder;
builder.append(m_entered_keybind); //Y u no work
builder.append(keyevent.text()); builder.append(m_entered_keybind);
m_entered_keybind = builder.to_string(); builder.append(keyevent.text());
m_entered_keybind = builder.to_string();
auto found_widget = m_hashed_potential_keybind_widgets.find(m_entered_keybind); auto found_widget = m_hashed_potential_keybind_widgets.find(m_entered_keybind);
if (found_widget != m_hashed_potential_keybind_widgets.end()) { if (found_widget != m_hashed_potential_keybind_widgets.end()) {
m_keybind_mode = false; m_keybind_mode = false;
const auto& point = Point(); const auto& point = Point();
auto event = make<GMouseEvent>(GEvent::MouseDown, point, 0, GMouseButton::Left, 0, 0); auto event = make<GMouseEvent>(GEvent::MouseDown, point, 0, GMouseButton::Left, 0, 0);
found_widget->value->event(*event); found_widget->value->event(*event);
event = make<GMouseEvent>(GEvent::MouseUp, point, 0, GMouseButton::Left, 0, 0); event = make<GMouseEvent>(GEvent::MouseUp, point, 0, GMouseButton::Left, 0, 0);
found_widget->value->event(*event); found_widget->value->event(*event);
//Call click on the found widget //Call click on the found widget
} else if (m_entered_keybind.length() >= m_max_keybind_length) {
m_keybind_mode = false;
}
//m_entered_keybind.append(keyevent.text());
update();
} }
//m_entered_keybind.append(keyevent.text());
update();
} else { } else {
if (m_focused_widget) if (m_focused_widget)
return m_focused_widget->event(event); return m_focused_widget->event(event);
@ -348,7 +352,8 @@ void GWindow::find_keyboard_selectable() {
m_hashed_potential_keybind_widgets.clear(); m_hashed_potential_keybind_widgets.clear();
find_keyboard_selectable_children(m_main_widget); find_keyboard_selectable_children(m_main_widget);
size_t buffer_length = ceil_div(m_potential_keybind_widgets.size(), ('z'-'a'))+1; m_max_keybind_length = ceil_div(m_potential_keybind_widgets.size(), ('z'-'a'));
size_t buffer_length = m_max_keybind_length + 1;
char keybind_buffer[buffer_length]; char keybind_buffer[buffer_length];
for (size_t i = 0; i < buffer_length-1; i++) { for (size_t i = 0; i < buffer_length-1; i++) {
keybind_buffer[i] = 'a'; keybind_buffer[i] = 'a';

View file

@ -166,6 +166,7 @@ private:
bool m_show_titlebar { true }; bool m_show_titlebar { true };
bool m_keybind_mode { false }; bool m_keybind_mode { false };
String m_entered_keybind; String m_entered_keybind;
size_t m_max_keybind_length;
Vector<GWidget*> m_potential_keybind_widgets; Vector<GWidget*> m_potential_keybind_widgets;
HashMap<String, GWidget*> m_hashed_potential_keybind_widgets; HashMap<String, GWidget*> m_hashed_potential_keybind_widgets;
}; };