123 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			123 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_
 |