diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index de9c45e..18c0904 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -91,6 +91,7 @@ set(HEADER_FILES QZoomChartView.h QZoomChart.h QClearLineEdit.h + QIndexTreeWidget.h ) set(SOURCE_FILES @@ -165,6 +166,7 @@ set(SOURCE_FILES QZoomChartView.cpp QZoomChart.cpp QClearLineEdit.cpp + QIndexTreeWidget.cpp ) qt5_add_resources(SOURCE_FILES resource.qrc) diff --git a/src/QIndexTreeWidget.cpp b/src/QIndexTreeWidget.cpp new file mode 100644 index 0000000..cbe88d9 --- /dev/null +++ b/src/QIndexTreeWidget.cpp @@ -0,0 +1,13 @@ +#include "QIndexTreeWidget.h" + +QIndexTreeWidget::QIndexTreeWidget (QWidget* parent) : QTreeWidget(parent) { +} + +QIndexTreeWidget::~QIndexTreeWidget () { +} + +QTreeWidgetItem* QIndexTreeWidget::getItemFromIndex (const QModelIndex& index) const { + + return itemFromIndex(index); +} + diff --git a/src/QIndexTreeWidget.h b/src/QIndexTreeWidget.h new file mode 100644 index 0000000..1445262 --- /dev/null +++ b/src/QIndexTreeWidget.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include +#include +#include + +class QIndexTreeWidget : public QTreeWidget { + + public: + QIndexTreeWidget(QWidget* parent = nullptr); + ~QIndexTreeWidget(); + + QTreeWidgetItem* getItemFromIndex (const QModelIndex& index) const; +}; + diff --git a/src/SeerRegisterValuesBrowserWidget.cpp b/src/SeerRegisterValuesBrowserWidget.cpp index 9f2e11a..3aa4f80 100644 --- a/src/SeerRegisterValuesBrowserWidget.cpp +++ b/src/SeerRegisterValuesBrowserWidget.cpp @@ -23,8 +23,17 @@ SeerRegisterValuesBrowserWidget::SeerRegisterValuesBrowserWidget (QWidget* paren registersTreeWidget->clear(); + // Create edit delegate. + MyEditingDelegate* editDelegate = new MyEditingDelegate(this); + + registersTreeWidget->setItemDelegateForColumn(0, new MyNoEditDelegate(this)); + registersTreeWidget->setItemDelegateForColumn(1, new MyNoEditDelegate(this)); + registersTreeWidget->setItemDelegateForColumn(2, editDelegate); + registersTreeWidget->setItemDelegateForColumn(3, new MyNoEditDelegate(this)); + // Connect things. - QObject::connect(registersTreeWidget, &QTreeWidget::itemEntered, this, &SeerRegisterValuesBrowserWidget::handleItemEntered); + QObject::connect(registersTreeWidget, &QTreeWidget::itemEntered, this, &SeerRegisterValuesBrowserWidget::handleItemEntered); + QObject::connect(editDelegate, &MyEditingDelegate::editingFinished, this, &SeerRegisterValuesBrowserWidget::handleIndexEditingFinished); } SeerRegisterValuesBrowserWidget::~SeerRegisterValuesBrowserWidget () { @@ -45,6 +54,8 @@ void SeerRegisterValuesBrowserWidget::handleText (const QString& text) { // \"r8\",\"r9\",\"r10\",\"r11\",\"r12\",\"r13\",\"r14\",\"r15\", // \"rip\",\"eflags\",\"cs\",\"ss\",\"ds\",\"es\",\"fs\",\"gs\", + registersTreeWidget->blockSignals(true); + // This recreates the tree. registersTreeWidget->clear(); @@ -64,6 +75,7 @@ void SeerRegisterValuesBrowserWidget::handleText (const QString& text) { } QTreeWidgetItem* topItem = new QTreeWidgetItem; + topItem->setFlags(topItem->flags() | Qt::ItemIsEditable); topItem->setText(0, QString::number(i)); topItem->setText(1, name_text); topItem->setText(2, ""); @@ -74,8 +86,12 @@ void SeerRegisterValuesBrowserWidget::handleText (const QString& text) { i++; } + registersTreeWidget->blockSignals(false); + }else if (text.startsWith("^done,register-values=[") && text.endsWith("]")) { + registersTreeWidget->blockSignals(true); + // Mark each entry initially as "unused". // Later, some will be marked as "reused" or "new". Then the "unused" ones will // be deleted. @@ -140,6 +156,8 @@ void SeerRegisterValuesBrowserWidget::handleText (const QString& text) { qDeleteAll(matches); + registersTreeWidget->blockSignals(false); + }else if (text.startsWith("^error,msg=\"No registers.\"")) { registersTreeWidget->clear(); @@ -187,6 +205,17 @@ void SeerRegisterValuesBrowserWidget::handleItemEntered (QTreeWidgetItem* item, } } +void SeerRegisterValuesBrowserWidget::handleIndexEditingFinished (const QModelIndex& index) { + + QTreeWidgetItem* item = registersTreeWidget->getItemFromIndex(index); + + if (item == 0) { + return; + } + + qDebug() << "Item changed: " << item->text(2); +} + void SeerRegisterValuesBrowserWidget::showEvent (QShowEvent* event) { QWidget::showEvent(event); diff --git a/src/SeerRegisterValuesBrowserWidget.h b/src/SeerRegisterValuesBrowserWidget.h index 435fd0a..70558a3 100644 --- a/src/SeerRegisterValuesBrowserWidget.h +++ b/src/SeerRegisterValuesBrowserWidget.h @@ -1,8 +1,43 @@ #pragma once -#include -#include #include "ui_SeerRegisterValuesBrowserWidget.h" +#include +#include +#include +#include +#include + +class MyEditingDelegate : public QStyledItemDelegate { + + Q_OBJECT + + public: + MyEditingDelegate(QObject* parent = nullptr) : QStyledItemDelegate(parent) {} + + virtual void setModelData (QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const { + + QStyledItemDelegate::setModelData(editor, model, index); + + emit editingFinished(index); + } + + signals: + void editingFinished(const QModelIndex& ) const; +}; + +class MyNoEditDelegate: public QStyledItemDelegate { + public: + MyNoEditDelegate(QObject* parent = nullptr): QStyledItemDelegate(parent) {} + + virtual QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const { + + Q_UNUSED(parent); + Q_UNUSED(option); + Q_UNUSED(index); + + return 0; + } +}; class SeerRegisterValuesBrowserWidget : public QWidget, protected Ui::SeerRegisterValuesBrowserWidgetForm { @@ -19,6 +54,7 @@ class SeerRegisterValuesBrowserWidget : public QWidget, protected Ui::SeerRegist protected slots: void handleItemEntered (QTreeWidgetItem* item, int column); + void handleIndexEditingFinished (const QModelIndex& index); signals: void refreshRegisterNames (); diff --git a/src/SeerRegisterValuesBrowserWidget.ui b/src/SeerRegisterValuesBrowserWidget.ui index 5aa96a7..6f95a70 100644 --- a/src/SeerRegisterValuesBrowserWidget.ui +++ b/src/SeerRegisterValuesBrowserWidget.ui @@ -15,7 +15,7 @@ - + 4 @@ -43,6 +43,13 @@ + + + QIndexTreeWidget + QTreeWidget +
QIndexTreeWidget.h
+
+