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
This commit is contained in:
Klaus Basan
2014-02-18 14:32:01 +01:00
parent cdb6009b0d
commit 9d7bd68433
2 changed files with 51 additions and 21 deletions

View File

@@ -45,14 +45,28 @@ namespace BlackGui
{ {
if (role == Qt::EditRole) if (role == Qt::EditRole)
{ {
if (index.row() >= this->m_container.size()) return true; int pi = this->indexToPropertyIndex(index);
CKeyboardKey key = this->m_container[index.row()]; if (pi == CKeyboardKey::IndexModifier1 || pi == CKeyboardKey::IndexModifier2 || pi == CKeyboardKey::IndexModifier1AsString || pi == CKeyboardKey::IndexModifier2AsString)
int propertyIndex = this->columnToPropertyIndex(index.column()); {
key.setPropertyByIndex(value, propertyIndex); if (index.row() >= this->m_container.size()) return true;
key.cleanup(); CKeyboardKey key = this->m_container[index.row()];
this->m_container[index.row()] = key; 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<CKeyboardKey>());
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 QWidget *CKeyboardKeyItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
@@ -62,7 +76,7 @@ namespace BlackGui
if (index.row() < model->rowCount()) 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) if (pi == CKeyboardKey::IndexModifier1 || pi == CKeyboardKey::IndexModifier2 || pi == CKeyboardKey::IndexModifier1AsString || pi == CKeyboardKey::IndexModifier2AsString)
{ {
CKeyboardKey key = model->at(index); CKeyboardKey key = model->at(index);
@@ -75,7 +89,7 @@ namespace BlackGui
else if (pi == CKeyboardKey::IndexKey || pi == CKeyboardKey::IndexKeyAsString || pi == CKeyboardKey::IndexKeyAsStringRepresentation) else if (pi == CKeyboardKey::IndexKey || pi == CKeyboardKey::IndexKeyAsString || pi == CKeyboardKey::IndexKeyAsStringRepresentation)
{ {
CKeyboardKey key = model->at(index); CKeyboardKey key = model->at(index);
CKeyboardLineEdit *edit = new CKeyboardLineEdit(parent); CKeyboardLineEdit *edit = new CKeyboardLineEdit(key, parent);
edit->setText(key.getKeyAsString()); edit->setText(key.getKeyAsString());
return edit; return edit;
} }
@@ -88,12 +102,18 @@ namespace BlackGui
QItemDelegate::setEditorData(editor, index); 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<CKeyboardLineEdit *>(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); QItemDelegate::updateEditorGeometry(editor, option, index);
} }
@@ -113,6 +133,11 @@ namespace BlackGui
void CKeyboardLineEdit::keyPressEvent(QKeyEvent *event) void CKeyboardLineEdit::keyPressEvent(QKeyEvent *event)
{ {
const Qt::Key k = static_cast<Qt::Key>(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())); this->setText(CKeyboardKey::toStringRepresentation(event->key()));
} }

View File

@@ -31,7 +31,7 @@ namespace BlackGui
void initAsHotkeyList() { this->m_container.initAsHotkeyList(); } void initAsHotkeyList() { this->m_container.initAsHotkeyList(); }
//! \copydoc QAbstractTableModel::setData //! \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: public:
//! \brief Constructor //! \brief Constructor
explicit CKeyboardKeyItemDelegate(QObject *parent = nullptr) : QItemDelegate(parent) {} explicit CKeyboardKeyItemDelegate(QObject *parent = nullptr) :
QItemDelegate(parent) {}
//! \copydoc QItemDelegate::createEditor //! \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 //! \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 //! \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 //! \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 //! \brief correspondig model
const CKeyboardKeyListModel *model() const; const CKeyboardKeyListModel *model() const;
}; };
/*! /*!
* \brief Special edit widget for key sequence * \brief Special edit widget for key sequence
*/ */
@@ -72,12 +71,18 @@ namespace BlackGui
public: public:
//! Constructor //! 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: protected:
//! \brief Overriding and handling key press //! \brief Overriding and handling key press
virtual void keyPressEvent(QKeyEvent *event) override; virtual void keyPressEvent(QKeyEvent *event) override;
private:
BlackMisc::Hardware::CKeyboardKey m_key;
}; };
} }
#endif // guard #endif // guard