1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-19 00:27:38 +00:00

LibGUI+VisualBuilder: Support custom editing widgets for property values.

Implemented this by letting GAbstractViews provide a GModelEditingDelegate
for a given index, which then knows how to create and setup a custom widget
appropriate for the data type being edited.
This commit is contained in:
Andreas Kling 2019-06-23 08:18:28 +02:00
parent 1d0ada32cc
commit 6a0011dcea
8 changed files with 170 additions and 7 deletions

View file

@ -1,6 +1,7 @@
#include <Kernel/KeyCode.h>
#include <LibGUI/GAbstractView.h>
#include <LibGUI/GModel.h>
#include <LibGUI/GModelEditingDelegate.h>
#include <LibGUI/GPainter.h>
#include <LibGUI/GScrollBar.h>
#include <LibGUI/GTextBox.h>
@ -71,15 +72,21 @@ void GAbstractView::begin_editing(const GModelIndex& index)
if (m_edit_widget)
delete m_edit_widget;
m_edit_index = index;
m_edit_widget = new GTextBox(this);
ASSERT(aid_create_editing_delegate);
m_editing_delegate = aid_create_editing_delegate(index);
m_editing_delegate->bind(*model(), index);
m_editing_delegate->set_value(model()->data(index, GModel::Role::Display));
m_edit_widget = m_editing_delegate->widget();
add_child(*m_edit_widget);
m_edit_widget->move_to_back();
m_edit_widget->set_text(model()->data(index, GModel::Role::Display).to_string());
m_edit_widget_content_rect = content_rect(index).translated(frame_thickness(), frame_thickness());
update_edit_widget_position();
m_edit_widget->set_focus(true);
m_edit_widget->on_return_pressed = [this] {
m_editing_delegate->will_begin_editing();
m_editing_delegate->on_commit = [this] {
ASSERT(model());
model()->set_data(m_edit_index, m_edit_widget->text());
model()->set_data(m_edit_index, m_editing_delegate->value());
stop_editing();
};
}