zdoom-macos-deps/deps/wxwidgets/include/wx-3.1/wx/qt/private/treeitemfactory.h
2021-06-28 10:54:57 +03:00

122 lines
3.5 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// 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_