1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 00:07:43 +00:00

GWindow: SerenityKeys refactor

This commit is contained in:
faissaloo 2019-06-08 15:13:16 +01:00
parent d449cda3d8
commit 185bff6714
2 changed files with 68 additions and 69 deletions

View file

@ -230,27 +230,7 @@ void GWindow::event(CEvent& event)
for (auto& rect : rects) for (auto& rect : rects)
m_main_widget->event(*make<GPaintEvent>(rect)); m_main_widget->event(*make<GPaintEvent>(rect));
if (m_keybind_mode) { paint_keybinds();
//If we're in keybind mode indicate widgets in m_potential_keybind_widgets
GPainter painter(*m_main_widget);
for (auto& keypair: m_hashed_potential_keybind_widgets) {
auto widget = keypair.value;
auto rect = Rect(widget->x()-5, widget->y()-5, 12, 12);
bool could_be_keybind = true;
for (size_t i = 0; i < m_entered_keybind.length(); i++) {
if (keypair.key.characters()[i] != m_entered_keybind.characters()[i]) {
could_be_keybind = false;
}
}
if (could_be_keybind) {
painter.draw_text(rect, keypair.key.characters(), TextAlignment::TopLeft, Color::Black);
painter.draw_text(rect, m_entered_keybind.characters(), TextAlignment::TopLeft, Color::Green);
}
}
}
if (m_double_buffering_enabled) if (m_double_buffering_enabled)
flip(rects); flip(rects);
@ -288,30 +268,29 @@ void GWindow::event(CEvent& event)
if (m_keybind_mode) { if (m_keybind_mode) {
if (event.type() == GEvent::KeyUp) { if (event.type() == GEvent::KeyUp) {
StringBuilder builder; StringBuilder builder;
builder.append(m_entered_keybind); builder.append(m_entered_keybind);
builder.append(keyevent.text()); builder.append(keyevent.text());
m_entered_keybind = builder.to_string(); 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 } else if (m_entered_keybind.length() >= m_max_keybind_length) {
} else if (m_entered_keybind.length() >= m_max_keybind_length) { m_keybind_mode = false;
m_keybind_mode = false; }
} update();
update();
} }
} else { } else {
if (m_focused_widget) if (m_focused_widget)
return m_focused_widget->event(event); return m_focused_widget->event(event);
if (m_main_widget) if (m_main_widget)
return m_main_widget->event(event); return m_main_widget->event(event);
} }
return; return;
} }
@ -354,40 +333,59 @@ void GWindow::event(CEvent& event)
CObject::event(event); CObject::event(event);
} }
void GWindow::find_keyboard_selectable() { void GWindow::paint_keybinds() {
m_potential_keybind_widgets.clear(); if (m_keybind_mode) {
m_hashed_potential_keybind_widgets.clear(); GPainter painter(*m_main_widget);
find_keyboard_selectable_children(m_main_widget);
m_max_keybind_length = ceil_div(m_potential_keybind_widgets.size(), ('z'-'a')); for (auto& keypair: m_hashed_potential_keybind_widgets) {
size_t buffer_length = m_max_keybind_length + 1; auto widget = keypair.value;
char keybind_buffer[buffer_length]; auto rect = Rect(widget->x()-5, widget->y()-5, 12, 12);
for (size_t i = 0; i < buffer_length-1; i++) { bool could_be_keybind = true;
keybind_buffer[i] = 'a'; for (size_t i = 0; i < m_entered_keybind.length(); i++) {
} if (keypair.key.characters()[i] != m_entered_keybind.characters()[i]) {
keybind_buffer[buffer_length-1] = '\0'; could_be_keybind = false;
}
for (auto& widget: m_potential_keybind_widgets) { }
m_hashed_potential_keybind_widgets.set(String(keybind_buffer), widget); if (could_be_keybind) {
painter.draw_text(rect, keypair.key.characters(), TextAlignment::TopLeft, Color::Black);
for (size_t i = 0; i < buffer_length-1; i++) { painter.draw_text(rect, m_entered_keybind.characters(), TextAlignment::TopLeft, Color::Green);
if (keybind_buffer[i] >= 'z') { }
keybind_buffer[i] = 'a';
} else {
keybind_buffer[i]++;
break;
} }
}
} }
} }
void GWindow::find_keyboard_selectable_children(GWidget* widget) { void GWindow::find_keyboard_selectable() {
//Rather than painting immediately we need a step to collect all the keybinds first Vector<GWidget*> potential_keybind_widgets;
m_hashed_potential_keybind_widgets.clear();
find_keyboard_selectable_children(m_main_widget, potential_keybind_widgets);
m_max_keybind_length = ceil_div(potential_keybind_widgets.size(), ('z'-'a'));
size_t buffer_length = m_max_keybind_length + 1;
char keybind_buffer[buffer_length];
for (size_t i = 0; i < buffer_length-1; i++) {
keybind_buffer[i] = 'a';
}
keybind_buffer[buffer_length-1] = '\0';
for (auto& widget: potential_keybind_widgets) {
m_hashed_potential_keybind_widgets.set(String(keybind_buffer), widget);
for (size_t i = 0; i < buffer_length-1; i++) {
if (keybind_buffer[i] >= 'z') {
keybind_buffer[i] = 'a';
} else {
keybind_buffer[i]++;
break;
}
}
}
}
void GWindow::find_keyboard_selectable_children(GWidget* widget, Vector<GWidget*> &potential_keybind_widgets) {
widget -> for_each_child_widget([&] (auto& child) { widget -> for_each_child_widget([&] (auto& child) {
if (child.accepts_keyboard_select()) { if (child.accepts_keyboard_select()) {
//auto rect = Rect(child.x()-5, child.y()-5, 10, 10); potential_keybind_widgets.append(&child);
m_potential_keybind_widgets.append(&child); find_keyboard_selectable_children(&child, potential_keybind_widgets);
find_keyboard_selectable_children(&child);
} }
return IterationDecision::Continue; return IterationDecision::Continue;
}); });

View file

@ -133,8 +133,10 @@ protected:
private: private:
virtual bool is_window() const override final { return true; } virtual bool is_window() const override final { return true; }
void paint_keybinds();
void find_keyboard_selectable(); void find_keyboard_selectable();
void find_keyboard_selectable_children(GWidget* widget); void find_keyboard_selectable_children(GWidget* widget, Vector<GWidget*> &potential_keybind_widgets);
Retained<GraphicsBitmap> create_backing_bitmap(const Size&); Retained<GraphicsBitmap> create_backing_bitmap(const Size&);
void set_current_backing_bitmap(GraphicsBitmap&, bool flush_immediately = false); void set_current_backing_bitmap(GraphicsBitmap&, bool flush_immediately = false);
void flip(const Vector<Rect, 32>& dirty_rects); void flip(const Vector<Rect, 32>& dirty_rects);
@ -167,6 +169,5 @@ private:
bool m_keybind_mode { false }; bool m_keybind_mode { false };
String m_entered_keybind; String m_entered_keybind;
size_t m_max_keybind_length; size_t m_max_keybind_length;
Vector<GWidget*> m_potential_keybind_widgets;
HashMap<String, GWidget*> m_hashed_potential_keybind_widgets; HashMap<String, GWidget*> m_hashed_potential_keybind_widgets;
}; };