#include #include #include #include #include #include #include GAbstractView::GAbstractView(GWidget* parent) : GScrollableWidget(parent) { } GAbstractView::~GAbstractView() { delete m_edit_widget; } void GAbstractView::set_model(RefPtr&& 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); }