Add EditControl support for wxTreeCtrl under wxQT

This commit is contained in:
Graham Dawes
2019-02-06 09:20:13 +00:00
parent cfe36f7ae7
commit 57348b4a59
3 changed files with 120 additions and 97 deletions

View File

@@ -2,6 +2,8 @@
#define _WX_TREEITEM_FACTORY_H_ #define _WX_TREEITEM_FACTORY_H_
#include <QtWidgets/QItemEditorFactory> #include <QtWidgets/QItemEditorFactory>
#include <QtWidgets/QTreeWidget>
#include <QtWidgets/QItemDelegate>
#include "wx/recguard.h" #include "wx/recguard.h"
#include "wx/textctrl.h" #include "wx/textctrl.h"
@@ -71,6 +73,12 @@ public:
{ {
} }
void AttachTo(QTreeWidget *tree)
{
QItemDelegate *qItemDelegate = static_cast<QItemDelegate*>(tree->itemDelegate());
qItemDelegate->setItemEditorFactory(this);
}
QWidget* createEditor(int WXUNUSED(userType), QWidget* parent) const wxOVERRIDE QWidget* createEditor(int WXUNUSED(userType), QWidget* parent) const wxOVERRIDE
{ {
m_textCtrl = new wxQtListTextCtrl(m_parent, parent); m_textCtrl = new wxQtListTextCtrl(m_parent, parent);

View File

@@ -8,7 +8,7 @@
#ifndef _WX_QT_TREECTRL_H_ #ifndef _WX_QT_TREECTRL_H_
#define _WX_QT_TREECTRL_H_ #define _WX_QT_TREECTRL_H_
class QTreeWidget; class wxQTreeWidget;
class WXDLLIMPEXP_CORE wxTreeCtrl : public wxTreeCtrlBase class WXDLLIMPEXP_CORE wxTreeCtrl : public wxTreeCtrlBase
{ {
@@ -140,7 +140,7 @@ private:
void SendDeleteEvent(const wxTreeItemId &item); void SendDeleteEvent(const wxTreeItemId &item);
wxTreeItemId GetNext(const wxTreeItemId &item) const; wxTreeItemId GetNext(const wxTreeItemId &item) const;
QTreeWidget *m_qtTreeWidget; wxQTreeWidget *m_qtTreeWidget;
wxDECLARE_DYNAMIC_CLASS(wxTreeCtrl); wxDECLARE_DYNAMIC_CLASS(wxTreeCtrl);
}; };

View File

@@ -8,9 +8,11 @@
// For compilers that support precompilation, includes "wx.h". // For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h" #include "wx/wxprec.h"
#include "wx/treectrl.h" #include "wx/treectrl.h"
#include "wx/qt/private/winevent.h"
#include "wx/imaglist.h" #include "wx/imaglist.h"
#include "wx/qt/private/winevent.h"
#include "wx/qt/private/treeitemfactory.h"
#include <QtWidgets/QTreeWidget> #include <QtWidgets/QTreeWidget>
namespace namespace
@@ -25,17 +27,53 @@ namespace
return wxTreeItemId(item); return wxTreeItemId(item);
} }
size_t CountChildren(QTreeWidgetItem *item)
{
const int currentCount = item->childCount();
size_t totalCount = currentCount;
for (int i = 0; i < currentCount; ++i)
{
totalCount += CountChildren(item->child(i));
}
return totalCount;
}
QIcon::Mode TreeIconToQIconMode(wxTreeItemIcon icon)
{
switch (icon)
{
case wxTreeItemIcon_Normal:
return QIcon::Normal;
case wxTreeItemIcon_Selected:
return QIcon::Selected;
}
wxFAIL_MSG("Unspported tree icon state");
return QIcon::Normal;
}
}
class wxQTreeWidget : public wxQtEventSignalHandler<QTreeWidget, wxTreeCtrl> class wxQTreeWidget : public wxQtEventSignalHandler<QTreeWidget, wxTreeCtrl>
{ {
public: public:
wxQTreeWidget(wxWindow *parent, wxTreeCtrl *handler) : wxQTreeWidget(wxWindow *parent, wxTreeCtrl *handler) :
wxQtEventSignalHandler(parent, handler) wxQtEventSignalHandler(parent, handler),
m_editorFactory(handler)
{ {
connect(this, &QTreeWidget::currentItemChanged, this, &wxQTreeWidget::OnCurrentItemChanged); connect(this, &QTreeWidget::currentItemChanged, this, &wxQTreeWidget::OnCurrentItemChanged);
connect(this, &QTreeWidget::itemActivated, this, &wxQTreeWidget::OnItemActivated); connect(this, &QTreeWidget::itemActivated, this, &wxQTreeWidget::OnItemActivated);
connect(this, &QTreeWidget::itemClicked, this, &wxQTreeWidget::OnItemClicked); connect(this, &QTreeWidget::itemClicked, this, &wxQTreeWidget::OnItemClicked);
connect(this, &QTreeWidget::itemCollapsed, this, &wxQTreeWidget::OnItemCollapsed); connect(this, &QTreeWidget::itemCollapsed, this, &wxQTreeWidget::OnItemCollapsed);
connect(this, &QTreeWidget::itemExpanded, this, &wxQTreeWidget::OnItemExpanded); connect(this, &QTreeWidget::itemExpanded, this, &wxQTreeWidget::OnItemExpanded);
m_editorFactory.AttachTo(this);
}
wxTextCtrl *GetEditControl()
{
return m_editorFactory.GetEditControl();
} }
private: private:
@@ -112,38 +150,10 @@ namespace
EmitEvent(expandedEvent); EmitEvent(expandedEvent);
} }
wxQtTreeItemEditorFactory m_editorFactory;
}; };
size_t CountChildren(QTreeWidgetItem *item)
{
const int currentCount = item->childCount();
size_t totalCount = currentCount;
for(int i = 0; i < currentCount; ++i)
{
totalCount += CountChildren(item->child(i));
}
return totalCount;
}
QIcon::Mode TreeIconToQIconMode(wxTreeItemIcon icon)
{
switch (icon)
{
case wxTreeItemIcon_Normal:
return QIcon::Normal;
case wxTreeItemIcon_Selected:
return QIcon::Selected;
}
wxFAIL_MSG("Unspported tree icon state");
return QIcon::Normal;
}
}
wxTreeCtrl::wxTreeCtrl() : wxTreeCtrl::wxTreeCtrl() :
m_qtTreeWidget(NULL) m_qtTreeWidget(NULL)
{ {
@@ -772,17 +782,22 @@ void wxTreeCtrl::ScrollTo(const wxTreeItemId& item)
wxTextCtrl *wxTreeCtrl::EditLabel(const wxTreeItemId& item, wxClassInfo* textCtrlClass) wxTextCtrl *wxTreeCtrl::EditLabel(const wxTreeItemId& item, wxClassInfo* textCtrlClass)
{ {
wxCHECK_MSG(item.IsOk(), NULL, "invalid tree item"); wxCHECK_MSG(item.IsOk(), NULL, "invalid tree item");
return NULL;
QTreeWidgetItem *qTreeItem = wxQtConvertTreeItem(item);
m_qtTreeWidget->openPersistentEditor(qTreeItem);
return m_qtTreeWidget->GetEditControl();
} }
wxTextCtrl *wxTreeCtrl::GetEditControl() const wxTextCtrl *wxTreeCtrl::GetEditControl() const
{ {
return NULL; return m_qtTreeWidget->GetEditControl();
} }
void wxTreeCtrl::EndEditLabel(const wxTreeItemId& item, bool discardChanges) void wxTreeCtrl::EndEditLabel(const wxTreeItemId& item, bool discardChanges)
{ {
wxCHECK_RET(item.IsOk(), "invalid tree item"); wxCHECK_RET(item.IsOk(), "invalid tree item");
QTreeWidgetItem *qTreeItem = wxQtConvertTreeItem(item);
m_qtTreeWidget->closePersistentEditor(qTreeItem);
} }
void wxTreeCtrl::SortChildren(const wxTreeItemId& item) void wxTreeCtrl::SortChildren(const wxTreeItemId& item)