123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- #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>
- GAbstractView::GAbstractView(GWidget* parent)
- : GScrollableWidget(parent)
- {
- }
- GAbstractView::~GAbstractView()
- {
- delete m_edit_widget;
- }
- void GAbstractView::set_model(RefPtr<GModel>&& model)
- {
- if (model == m_model)
- return;
- if (m_model)
- m_model->unregister_view({}, *this);
- m_model = move(model);
- if (m_model)
- m_model->register_view({}, *this);
- did_update_model();
- }
- void GAbstractView::model_notification(const GModelNotification& notification)
- {
- if (on_model_notification)
- on_model_notification(notification);
- }
- void GAbstractView::did_update_model()
- {
- if (!model() || model()->selected_index() != m_edit_index)
- stop_editing();
- model_notification(GModelNotification(GModelNotification::ModelUpdated));
- }
- void GAbstractView::did_update_selection()
- {
- if (!model() || model()->selected_index() != m_edit_index)
- stop_editing();
- if (model() && on_selection && model()->selected_index().is_valid())
- on_selection(model()->selected_index());
- }
- void GAbstractView::did_scroll()
- {
- update_edit_widget_position();
- }
- void GAbstractView::update_edit_widget_position()
- {
- if (!m_edit_widget)
- return;
- m_edit_widget->set_relative_rect(m_edit_widget_content_rect.translated(-horizontal_scrollbar().value(), -vertical_scrollbar().value()));
- }
- void GAbstractView::begin_editing(const GModelIndex& index)
- {
- ASSERT(is_editable());
- ASSERT(model());
- if (m_edit_index == index)
- return;
- if (!model()->is_editable(index))
- return;
- if (m_edit_widget)
- delete m_edit_widget;
- m_edit_index = index;
- 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_content_rect = content_rect(index).translated(frame_thickness(), frame_thickness());
- update_edit_widget_position();
- m_edit_widget->set_focus(true);
- m_editing_delegate->will_begin_editing();
- m_editing_delegate->on_commit = [this] {
- ASSERT(model());
- model()->set_data(m_edit_index, m_editing_delegate->value());
- stop_editing();
- };
- }
- void GAbstractView::stop_editing()
- {
- m_edit_index = {};
- delete m_edit_widget;
- m_edit_widget = nullptr;
- }
- void GAbstractView::activate(const GModelIndex& index)
- {
- if (on_activation)
- on_activation(index);
- }
|