From 9d7bd684330061a8c0a536586e48a2c09733b2aa Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Tue, 18 Feb 2014 14:32:01 +0100 Subject: [PATCH] refs #139 , improved version of CKeyboardLineEdit widget * CKeyboardLineEdit supports CKeyboardKey to set all details directly to object, sets native scan code, and native virtual code * CKeyboardKeyListModel::setData supports specialized line edit and combo box * fixed some wrong overrides --- src/blackgui/keyboardkeylistmodel.cpp | 49 ++++++++++++++++++++------- src/blackgui/keyboardkeylistmodel.h | 23 ++++++++----- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/blackgui/keyboardkeylistmodel.cpp b/src/blackgui/keyboardkeylistmodel.cpp index 856964a90..a1b127b3b 100644 --- a/src/blackgui/keyboardkeylistmodel.cpp +++ b/src/blackgui/keyboardkeylistmodel.cpp @@ -45,14 +45,28 @@ namespace BlackGui { if (role == Qt::EditRole) { - if (index.row() >= this->m_container.size()) return true; - CKeyboardKey key = this->m_container[index.row()]; - int propertyIndex = this->columnToPropertyIndex(index.column()); - key.setPropertyByIndex(value, propertyIndex); - key.cleanup(); - this->m_container[index.row()] = key; + int pi = this->indexToPropertyIndex(index); + if (pi == CKeyboardKey::IndexModifier1 || pi == CKeyboardKey::IndexModifier2 || pi == CKeyboardKey::IndexModifier1AsString || pi == CKeyboardKey::IndexModifier2AsString) + { + if (index.row() >= this->m_container.size()) return true; + CKeyboardKey key = this->m_container[index.row()]; + key.setPropertyByIndex(value, pi); + key.cleanup(); + this->m_container[index.row()] = key; + return true; + } + else if (pi == CKeyboardKey::IndexKey || pi == CKeyboardKey::IndexKeyAsString || pi == CKeyboardKey::IndexKeyAsStringRepresentation) + { + Q_ASSERT(value.canConvert()); + if (index.row() >= this->m_container.size()) return true; + CKeyboardKey key = this->m_container[index.row()]; + key.setPropertyByIndex(value, CKeyboardKey::IndexKeyObject); + key.cleanup(); + this->m_container[index.row()] = key; + return true; + } } - return true; + return CListModelBase::setData(index, value, role); } QWidget *CKeyboardKeyItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const @@ -62,7 +76,7 @@ namespace BlackGui if (index.row() < model->rowCount()) { - int pi = model->columnToPropertyIndex(index.column()); + int pi = model->indexToPropertyIndex(index); if (pi == CKeyboardKey::IndexModifier1 || pi == CKeyboardKey::IndexModifier2 || pi == CKeyboardKey::IndexModifier1AsString || pi == CKeyboardKey::IndexModifier2AsString) { CKeyboardKey key = model->at(index); @@ -75,7 +89,7 @@ namespace BlackGui else if (pi == CKeyboardKey::IndexKey || pi == CKeyboardKey::IndexKeyAsString || pi == CKeyboardKey::IndexKeyAsStringRepresentation) { CKeyboardKey key = model->at(index); - CKeyboardLineEdit *edit = new CKeyboardLineEdit(parent); + CKeyboardLineEdit *edit = new CKeyboardLineEdit(key, parent); edit->setText(key.getKeyAsString()); return edit; } @@ -88,12 +102,18 @@ namespace BlackGui QItemDelegate::setEditorData(editor, index); } - void CKeyboardKeyItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) + void CKeyboardKeyItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { - QItemDelegate::setModelData(editor, model, index); + // with our own line edit we have a special treatment + // otherwise (comboboxes) standard handling via QItemDelegate + CKeyboardLineEdit *lineEdit = qobject_cast(editor); + if (lineEdit) + model->setData(index, lineEdit->getKey().toQVariant() , Qt::EditRole); + else + QItemDelegate::setModelData(editor, model, index); } - void CKeyboardKeyItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) + void CKeyboardKeyItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { QItemDelegate::updateEditorGeometry(editor, option, index); } @@ -113,6 +133,11 @@ namespace BlackGui void CKeyboardLineEdit::keyPressEvent(QKeyEvent *event) { + const Qt::Key k = static_cast(event->key()); + if (k == Qt::Key_Shift || k == Qt::Key_Control || k == Qt::Key_Meta || k == Qt::Key_Alt || k == Qt::Key_CapsLock || k == Qt::Key_NumLock || k == Qt::Key_ScrollLock) return; + this->m_key.setKey(event->key()); + this->m_key.setNativeScanCode(event->nativeScanCode()); + this->m_key.setNativeVirtualKey(event->nativeVirtualKey()); this->setText(CKeyboardKey::toStringRepresentation(event->key())); } diff --git a/src/blackgui/keyboardkeylistmodel.h b/src/blackgui/keyboardkeylistmodel.h index 09fed949f..467c60e6c 100644 --- a/src/blackgui/keyboardkeylistmodel.h +++ b/src/blackgui/keyboardkeylistmodel.h @@ -31,7 +31,7 @@ namespace BlackGui void initAsHotkeyList() { this->m_container.initAsHotkeyList(); } //! \copydoc QAbstractTableModel::setData - bool setData(const QModelIndex &index, const QVariant &value, int role) override; + virtual bool setData(const QModelIndex &index, const QVariant &value, int role) override; }; /*! @@ -43,26 +43,25 @@ namespace BlackGui public: //! \brief Constructor - explicit CKeyboardKeyItemDelegate(QObject *parent = nullptr) : QItemDelegate(parent) {} + explicit CKeyboardKeyItemDelegate(QObject *parent = nullptr) : + QItemDelegate(parent) {} //! \copydoc QItemDelegate::createEditor - QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; + virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; //! \copydoc QItemDelegate::setEditorData - void setEditorData(QWidget *editor, const QModelIndex &index) const override; + virtual void setEditorData(QWidget *editor, const QModelIndex &index) const override; //! \copydoc QItemDelegate::setModelData - void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index); + virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; //! \copydoc QItemDelegate::updateEditorGeometry - void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index); + virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override; //! \brief correspondig model const CKeyboardKeyListModel *model() const; - }; - /*! * \brief Special edit widget for key sequence */ @@ -72,12 +71,18 @@ namespace BlackGui public: //! Constructor - CKeyboardLineEdit(QWidget *parent = nullptr) : QLineEdit(parent) { } + CKeyboardLineEdit(BlackMisc::Hardware::CKeyboardKey &key, QWidget *parent = nullptr) : + QLineEdit(parent), m_key(key) { } + + //! \brief get key + BlackMisc::Hardware::CKeyboardKey getKey() const { return this->m_key; } protected: //! \brief Overriding and handling key press virtual void keyPressEvent(QKeyEvent *event) override; + private: + BlackMisc::Hardware::CKeyboardKey m_key; }; } #endif // guard