Merge branch 'qt_tree_control' of https://github.com/GeoTeric/wxWidgets into qt-fixes
See https://github.com/wxWidgets/wxWidgets/pull/1225
This commit is contained in:
@@ -15,10 +15,12 @@
|
||||
|
||||
#include "wx/kbdstate.h"
|
||||
#include "wx/gdicmn.h"
|
||||
#include "wx/colour.h"
|
||||
|
||||
#include <QtCore/QRect>
|
||||
#include <QtCore/QSize>
|
||||
#include <QtCore/QString>
|
||||
#include <QtGui/QColor>
|
||||
|
||||
// Rely on overloading and let the compiler pick the correct version, which makes
|
||||
// them easier to use then to write wxQtConvertQtRectToWxRect() or wxQtConvertWxRectToQtRect()
|
||||
@@ -54,6 +56,16 @@ inline QString wxQtConvertString( const wxString &str )
|
||||
return QString( str.utf8_str() );
|
||||
}
|
||||
|
||||
inline wxColour wxQtConvertColour(const QColor &colour)
|
||||
{
|
||||
return wxColour(colour.red(), colour.green(), colour.blue(), colour.alpha());
|
||||
}
|
||||
|
||||
inline QColor wxQtConvertColour(const wxColour &colour)
|
||||
{
|
||||
return QColor(colour.Red(), colour.Green(), colour.Blue(), colour.Alpha());
|
||||
}
|
||||
|
||||
#if wxUSE_DATETIME
|
||||
|
||||
class WXDLLIMPEXP_FWD_BASE wxDateTime;
|
||||
|
76
include/wx/qt/private/treeitemdelegate.h
Normal file
76
include/wx/qt/private/treeitemdelegate.h
Normal file
@@ -0,0 +1,76 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: wx/qt/private/treeitemdelegate.h
|
||||
// Purpose: Delegate to create text edit controls for the tree items
|
||||
// Author: Matthew Griffin
|
||||
// Created: 2019-05-29
|
||||
// Copyright: Matthew Griffin
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _WX_QT_PRIVATE_TREEITEM_DELEGATE_H
|
||||
#define _WX_QT_PRIVATE_TREEITEM_DELEGATE_H
|
||||
|
||||
#include <QtWidgets/QStyledItemDelegate>
|
||||
|
||||
#include "wx/app.h"
|
||||
#include "wx/textctrl.h"
|
||||
|
||||
#include "treeitemfactory.h"
|
||||
|
||||
class wxQTTreeItemDelegate : public QStyledItemDelegate
|
||||
{
|
||||
public:
|
||||
explicit wxQTTreeItemDelegate(wxWindow* parent)
|
||||
: m_parent(parent),
|
||||
m_textCtrl(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &WXUNUSED(option), const QModelIndex &index) const wxOVERRIDE
|
||||
{
|
||||
if ( m_textCtrl != NULL )
|
||||
destroyEditor(m_textCtrl->GetHandle(), m_currentModelIndex);
|
||||
|
||||
m_currentModelIndex = index;
|
||||
m_textCtrl = new wxQtListTextCtrl(m_parent, parent);
|
||||
m_textCtrl->SetFocus();
|
||||
return m_textCtrl->GetHandle();
|
||||
}
|
||||
|
||||
void destroyEditor(QWidget *WXUNUSED(editor), const QModelIndex &WXUNUSED(index)) const wxOVERRIDE
|
||||
{
|
||||
if ( m_textCtrl != NULL )
|
||||
{
|
||||
m_currentModelIndex = QModelIndex(); // invalidate the index
|
||||
wxTheApp->ScheduleForDestruction(m_textCtrl);
|
||||
m_textCtrl = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void setModelData(QWidget *WXUNUSED(editor), QAbstractItemModel *WXUNUSED(model), const QModelIndex &WXUNUSED(index)) const wxOVERRIDE
|
||||
{
|
||||
// Don't set model data until wx has had a chance to send out events
|
||||
}
|
||||
|
||||
wxTextCtrl* GetEditControl() const
|
||||
{
|
||||
return m_textCtrl;
|
||||
}
|
||||
|
||||
QModelIndex GetCurrentModelIndex() const
|
||||
{
|
||||
return m_currentModelIndex;
|
||||
}
|
||||
|
||||
void AcceptModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
|
||||
{
|
||||
QStyledItemDelegate::setModelData(editor, model, index);
|
||||
}
|
||||
|
||||
private:
|
||||
wxWindow* m_parent;
|
||||
mutable wxTextCtrl* m_textCtrl;
|
||||
mutable QModelIndex m_currentModelIndex;
|
||||
};
|
||||
|
||||
#endif // _WX_QT_PRIVATE_TREEITEM_DELEGATE_H
|
122
include/wx/qt/private/treeitemfactory.h
Normal file
122
include/wx/qt/private/treeitemfactory.h
Normal file
@@ -0,0 +1,122 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: wx/qt/private/treeitemfactory.h
|
||||
// Purpose: Factory to create text edit controls for the tree items
|
||||
// Author: Graham Dawes
|
||||
// Created: 2019-02-07
|
||||
// Copyright: Graham Dawes
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _WX_QT_PRIVATE_TREEITEM_FACTORY_H_
|
||||
#define _WX_QT_PRIVATE_TREEITEM_FACTORY_H_
|
||||
|
||||
#include <QtWidgets/QItemEditorFactory>
|
||||
#include <QtWidgets/QTreeWidget>
|
||||
#include <QtWidgets/QItemDelegate>
|
||||
|
||||
#include "wx/recguard.h"
|
||||
#include "wx/textctrl.h"
|
||||
|
||||
// wxQT Doesn't have a mechanism for "adopting" external widgets so we have to
|
||||
// create an instance of wxTextCtrl rather than adopting the control QT would
|
||||
// create.
|
||||
//
|
||||
// Unfortunately the factory is given an internal widget as the parent for
|
||||
// editor.
|
||||
//
|
||||
// To work around these issues we create a wxTextCtl parented by the wxListCtrl
|
||||
// then recalculate its position relative to the internal widget.
|
||||
|
||||
class wxQtListTextCtrl : public wxTextCtrl
|
||||
{
|
||||
public:
|
||||
wxQtListTextCtrl(wxWindow* parent, QWidget* actualParent)
|
||||
: wxTextCtrl(parent, wxID_ANY, wxEmptyString,
|
||||
wxDefaultPosition, wxDefaultSize,
|
||||
wxNO_BORDER),
|
||||
m_actualParent(actualParent),
|
||||
m_moving(0)
|
||||
{
|
||||
Bind(wxEVT_MOVE, &wxQtListTextCtrl::onMove, this);
|
||||
}
|
||||
|
||||
void onMove(wxMoveEvent &event)
|
||||
{
|
||||
// QWidget::move generates a QMoveEvent so we need to guard against
|
||||
// reentrant calls.
|
||||
wxRecursionGuard guard(m_moving);
|
||||
|
||||
if ( guard.IsInside() )
|
||||
{
|
||||
event.Skip();
|
||||
return;
|
||||
}
|
||||
|
||||
const QPoint eventPos = wxQtConvertPoint(event.GetPosition());
|
||||
const QPoint globalPos = m_actualParent->mapToGlobal(eventPos);
|
||||
|
||||
// For some reason this always gives us the offset from the header info
|
||||
// the internal control. So we need to treat this as an offset rather
|
||||
// than a position.
|
||||
QWidget* widget = GetHandle();
|
||||
const QPoint offset = widget->mapFromGlobal(globalPos);
|
||||
|
||||
widget->move(eventPos + offset);
|
||||
}
|
||||
|
||||
private:
|
||||
QWidget* m_actualParent;
|
||||
wxRecursionGuardFlag m_moving;
|
||||
|
||||
wxDECLARE_NO_COPY_CLASS(wxQtListTextCtrl);
|
||||
};
|
||||
|
||||
// QT doesn't give us direct access to the editor within the QTreeWidget.
|
||||
// Instead, we'll supply a factory to create the widget for QT and keep track
|
||||
// of it ourselves.
|
||||
|
||||
class wxQtTreeItemEditorFactory : public QItemEditorFactory
|
||||
{
|
||||
public:
|
||||
explicit wxQtTreeItemEditorFactory(wxWindow* parent)
|
||||
: m_parent(parent),
|
||||
m_textCtrl(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
void AttachTo(QTreeWidget *tree)
|
||||
{
|
||||
QAbstractItemDelegate* delegate = tree->itemDelegate();
|
||||
QItemDelegate *qItemDelegate = static_cast<QItemDelegate*>(delegate);
|
||||
qItemDelegate->setItemEditorFactory(this);
|
||||
}
|
||||
|
||||
QWidget* createEditor(int WXUNUSED(userType), QWidget* parent) const wxOVERRIDE
|
||||
{
|
||||
if (m_textCtrl != NULL)
|
||||
ClearEditor();
|
||||
|
||||
m_textCtrl = new wxQtListTextCtrl(m_parent, parent);
|
||||
m_textCtrl->SetFocus();
|
||||
return m_textCtrl->GetHandle();
|
||||
}
|
||||
|
||||
wxTextCtrl* GetEditControl() const
|
||||
{
|
||||
return m_textCtrl;
|
||||
}
|
||||
|
||||
void ClearEditor() const
|
||||
{
|
||||
delete m_textCtrl;
|
||||
m_textCtrl = NULL;
|
||||
}
|
||||
|
||||
private:
|
||||
wxWindow* m_parent;
|
||||
mutable wxTextCtrl* m_textCtrl;
|
||||
|
||||
wxDECLARE_NO_COPY_CLASS(wxQtTreeItemEditorFactory);
|
||||
};
|
||||
|
||||
#endif //_WX_QT_PRIVATE_TREEITEM_FACTORY_H_
|
Reference in New Issue
Block a user