From bc8d5430c9ef240caac89f37eacb028b7379572d Mon Sep 17 00:00:00 2001 From: Matthew Griffin <45285214+matthew-griffin@users.noreply.github.com> Date: Fri, 31 May 2019 09:51:16 +0100 Subject: [PATCH] Support click on selected item to edit Make QTreeWidgetItems editable and add SelectedClicked as an edit trigger. Simplify closing the editor as QAbstractItemView already connects to its delegate closeEditor signal. --- src/qt/treectrl.cpp | 105 +++++++++++++++++++++++++------------------- 1 file changed, 59 insertions(+), 46 deletions(-) diff --git a/src/qt/treectrl.cpp b/src/qt/treectrl.cpp index b951076393..016d7eb3f7 100644 --- a/src/qt/treectrl.cpp +++ b/src/qt/treectrl.cpp @@ -144,13 +144,11 @@ public: connect(this, &QTreeWidget::itemExpanded, this, &wxQTreeWidget::OnItemExpanded); - connect(&m_item_delegate, &QAbstractItemDelegate::closeEditor, - this, &wxQTreeWidget::OnCloseEditor); - setItemDelegate(&m_item_delegate); setDragEnabled(true); viewport()->setAcceptDrops(true); setDropIndicatorShown(true); + setEditTriggers(QAbstractItemView::SelectedClicked); } virtual void paintEvent (QPaintEvent * event) @@ -227,6 +225,62 @@ protected: } } + bool edit(const QModelIndex &index, EditTrigger trigger, QEvent *event) wxOVERRIDE + { + // AllEditTriggers means that editor is about to open, not waiting for double click + if (trigger == AllEditTriggers) + { + // Allow event handlers to veto opening the editor + wxTreeEvent wx_event( + wxEVT_TREE_BEGIN_LABEL_EDIT, + GetHandler(), + wxQtConvertTreeItem(itemFromIndex(index)) + ); + if (GetHandler()->HandleWindowEvent(wx_event) && !wx_event.IsAllowed()) + return false; + } + return QTreeWidget::edit(index, trigger, event); + } + + void closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint) wxOVERRIDE + { + // Close process can re-signal closeEditor so we need to guard against + // reentrant calls. + wxRecursionGuard guard(m_closing_editor); + + if (guard.IsInside()) + return; + + // There can be multiple calls to close editor when the item loses focus + const QModelIndex current_index = m_item_delegate.GetCurrentModelIndex(); + if (!current_index.isValid()) + return; + + wxTreeEvent event( + wxEVT_TREE_END_LABEL_EDIT, + GetHandler(), + wxQtConvertTreeItem(itemFromIndex(current_index)) + ); + if (hint == QAbstractItemDelegate::RevertModelCache) + { + event.SetEditCanceled(true); + EmitEvent(event); + } + else + { + // Allow event handlers to decide whether to accept edited text + const wxString editor_text = m_item_delegate.GetEditControl()->GetLineText(0); + event.SetLabel(editor_text); + if (!GetHandler()->HandleWindowEvent(event) || event.IsAllowed()) + m_item_delegate.AcceptModelData(editor, model(), current_index); + } + // wx doesn't have hints to edit next/previous item + if (hint == QAbstractItemDelegate::EditNextItem || hint == QAbstractItemDelegate::EditPreviousItem) + hint = QAbstractItemDelegate::SubmitModelCache; + + QTreeWidget::closeEditor(editor, hint); + } + private: void ReplaceIcons(QTreeWidgetItem *item) { @@ -352,42 +406,6 @@ private: EmitEvent(expandedEvent); } - void OnCloseEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint) - { - // Close process can re-signal closeEditor so we need to guard against - // reentrant calls. - wxRecursionGuard guard(m_closing_editor); - - if (guard.IsInside()) - return; - - // There can be multiple calls to close editor when the item loses focus - const QModelIndex current_index = m_item_delegate.GetCurrentModelIndex(); - if (!current_index.isValid()) - return; - - wxTreeEvent event( - wxEVT_TREE_END_LABEL_EDIT, - GetHandler(), - wxQtConvertTreeItem(itemFromIndex(current_index)) - ); - if (hint == QAbstractItemDelegate::RevertModelCache) - { - event.SetEditCanceled(true); - EmitEvent(event); - } - else - { - // Allow event handlers to decide whether to accept edited text - const wxString editor_text = m_item_delegate.GetEditControl()->GetLineText(0); - event.SetLabel(editor_text); - if (!GetHandler()->HandleWindowEvent(event) || event.IsAllowed()) - m_item_delegate.AcceptModelData(editor, model(), current_index); - } - - QAbstractItemView::closePersistentEditor(current_index); - } - void tryStartDrag(const QMouseEvent *event) { wxEventType command = event->buttons() & Qt::RightButton @@ -1175,13 +1193,7 @@ wxTextCtrl *wxTreeCtrl::EditLabel( ) { wxCHECK_MSG(item.IsOk(), NULL, "invalid tree item"); - - wxTreeEvent event(wxEVT_TREE_BEGIN_LABEL_EDIT, this, item); - if ( HandleWindowEvent(event) && !event.IsAllowed() ) - return NULL; - - QTreeWidgetItem *qTreeItem = wxQtConvertTreeItem(item); - m_qtTreeWidget->openPersistentEditor(qTreeItem); + m_qtTreeWidget->editItem(wxQtConvertTreeItem(item)); return m_qtTreeWidget->GetEditControl(); } @@ -1260,6 +1272,7 @@ wxTreeItemId wxTreeCtrl::DoInsertItem(const wxTreeItemId& parent, QTreeWidgetItem *newItem = new QTreeWidgetItem; newItem->setText(0, wxQtConvertString(text)); + newItem->setFlags(newItem->flags() | Qt::ItemIsEditable); TreeItemDataQt treeItemData(data); newItem->setData(0, Qt::UserRole, QVariant::fromValue(treeItemData));