From c7f77ba7655a65ba822ffe878e040a3474b850b0 Mon Sep 17 00:00:00 2001 From: Graham Dawes Date: Tue, 5 Feb 2019 19:50:16 +0000 Subject: [PATCH] Add signal handlers to generate wx events for wxTreeCtrl under wxQT --- src/qt/treectrl.cpp | 99 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 90 insertions(+), 9 deletions(-) diff --git a/src/qt/treectrl.cpp b/src/qt/treectrl.cpp index 4ed8960ccf..4e12939906 100644 --- a/src/qt/treectrl.cpp +++ b/src/qt/treectrl.cpp @@ -15,15 +15,6 @@ namespace { - class wxQTreeWidget : public wxQtEventSignalHandler - { - public: - wxQTreeWidget(wxWindow *parent, wxTreeCtrl *handler) : - wxQtEventSignalHandler(parent, handler) - { - } - }; - QTreeWidgetItem *wxQtConvertTreeItem(const wxTreeItemId &item) { return static_cast(item.GetID()); @@ -34,6 +25,96 @@ namespace return wxTreeItemId(item); } + class wxQTreeWidget : public wxQtEventSignalHandler + { + public: + wxQTreeWidget(wxWindow *parent, wxTreeCtrl *handler) : + wxQtEventSignalHandler(parent, handler) + { + connect(this, &QTreeWidget::currentItemChanged, this, &wxQTreeWidget::OnCurrentItemChanged); + connect(this, &QTreeWidget::itemActivated, this, &wxQTreeWidget::OnItemActivated); + connect(this, &QTreeWidget::itemClicked, this, &wxQTreeWidget::OnItemClicked); + connect(this, &QTreeWidget::itemCollapsed, this, &wxQTreeWidget::OnItemCollapsed); + connect(this, &QTreeWidget::itemExpanded, this, &wxQTreeWidget::OnItemExpanded); + } + + private: + void OnCurrentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) + { + wxTreeEvent changingEvent(wxEVT_TREE_SEL_CHANGING, GetHandler(), wxQtConvertTreeItem(current)); + EmitEvent(changingEvent); + + if ( !changingEvent.IsAllowed() ) + { + blockSignals(true); + setCurrentItem(previous); + blockSignals(false); + return; + } + + wxTreeEvent changedEvent(wxEVT_TREE_SEL_CHANGED, GetHandler(), wxQtConvertTreeItem(current)); + EmitEvent(changedEvent); + } + + void OnItemActivated(QTreeWidgetItem *item, int WXUNUSED(column)) + { + wxTreeEvent event(wxEVT_TREE_ITEM_ACTIVATED, GetHandler(), wxQtConvertTreeItem(item)); + EmitEvent(event); + } + + void OnItemClicked(QTreeWidgetItem *item) + { + wxMouseState mouseState = wxGetMouseState(); + + wxEventType eventType; + if (mouseState.RightIsDown()) + eventType = wxEVT_TREE_ITEM_RIGHT_CLICK; + else if (mouseState.MiddleIsDown()) + eventType = wxEVT_TREE_ITEM_MIDDLE_CLICK; + else + return; + + wxTreeEvent event(eventType, GetHandler(), wxQtConvertTreeItem(item)); + EmitEvent(event); + } + + void OnItemCollapsed(QTreeWidgetItem *item) + { + wxTreeEvent collapsingEvent(wxEVT_TREE_ITEM_COLLAPSING, GetHandler(), wxQtConvertTreeItem(item)); + EmitEvent(collapsingEvent); + + if (!collapsingEvent.IsAllowed()) + { + blockSignals(true); + item->setExpanded(true); + blockSignals(false); + return; + } + + wxTreeEvent collapsedEvent(wxEVT_TREE_ITEM_COLLAPSED, GetHandler(), wxQtConvertTreeItem(item)); + EmitEvent(collapsedEvent); + } + + void OnItemExpanded(QTreeWidgetItem *item) + { + wxTreeEvent expandingEvent(wxEVT_TREE_ITEM_EXPANDING, GetHandler(), wxQtConvertTreeItem(item)); + EmitEvent(expandingEvent); + + if (!expandingEvent.IsAllowed()) + { + blockSignals(true); + item->setExpanded(false); + blockSignals(false); + return; + } + + wxTreeEvent expandedEvent(wxEVT_TREE_ITEM_EXPANDED, GetHandler(), wxQtConvertTreeItem(item)); + EmitEvent(expandedEvent); + + } + }; + + size_t CountChildren(QTreeWidgetItem *item) { const int currentCount = item->childCount();