aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYordan Karadzhov <y.karadz@gmail.com>2023-01-04 20:01:34 +0200
committerYordan Karadzhov <y.karadz@gmail.com>2023-01-04 21:32:37 +0200
commit5599c4c111d27da9964c0b2e649e4af4461b5bc4 (patch)
treed01052ca43ffc7b2fb349d795acc4d521713dce0
parent8723a2dce4a459e01b65ed520497cb1ac751a982 (diff)
downloadkernel-shark-5599c4c111d27da9964c0b2e649e4af4461b5bc4.tar.gz
kernel-shark: Make the text to be copyable.
Implement an item delegate class for the Table widget. This will make possible the text of the records to be selected and copied so that it can be pasted into another windows. Signed-off-by: Yordan Karadzhov <y.karadz@gmail.com>
-rw-r--r--src/KsModels.cpp14
-rw-r--r--src/KsModels.hpp2
-rw-r--r--src/KsTraceViewer.cpp27
-rw-r--r--src/KsTraceViewer.hpp22
4 files changed, 62 insertions, 3 deletions
diff --git a/src/KsModels.cpp b/src/KsModels.cpp
index df8373ec..e10f4112 100644
--- a/src/KsModels.cpp
+++ b/src/KsModels.cpp
@@ -482,6 +482,20 @@ size_t KsViewModel::search(int column,
return matchList->count();
}
+/** @brief Reimplements handler to return a flags that enables the item
+ * (ItemIsEnabled) and allows it to be selecte.
+ *
+ * @param index: The index of the item.
+ *
+ * @returns Returns the item flags for the given index.
+ */
+Qt::ItemFlags KsViewModel::flags(const QModelIndex &index) const {
+ if (!index.isValid())
+ return Qt::ItemIsEnabled;
+
+ return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
+}
+
/** Create a default (empty) KsFilterProxyModel object. */
KsGraphModel::KsGraphModel(QObject *parent)
: QAbstractTableModel(parent)
diff --git a/src/KsModels.hpp b/src/KsModels.hpp
index 3a6d3f1d..2883ce32 100644
--- a/src/KsModels.hpp
+++ b/src/KsModels.hpp
@@ -130,6 +130,8 @@ public:
TRACE_VIEW_N_COLUMNS,
};
+ Qt::ItemFlags flags(const QModelIndex &index) const;
+
private:
void _updateHeader();
diff --git a/src/KsTraceViewer.cpp b/src/KsTraceViewer.cpp
index 12a95a75..05f54612 100644
--- a/src/KsTraceViewer.cpp
+++ b/src/KsTraceViewer.cpp
@@ -20,6 +20,26 @@
#include "KsWidgetsLib.hpp"
/**
+ * Reimplemented handler for creating delegate widget.
+ */
+QWidget *KsTableItemDelegate::createEditor(QWidget *parent,
+ const QStyleOptionViewItem &option,
+ const QModelIndex &index) const {
+ QTextEdit *edit = new QTextEdit(parent);
+ edit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ edit->setReadOnly(true);
+ return edit;
+}
+
+/**
+ * Reimplemented handler setting the data shown by the delegate widget.
+ */
+void KsTableItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const {
+ QTextEdit *textEditor = qobject_cast<QTextEdit *>(editor);
+ textEditor->setPlainText(_model->getValueStr(index.column(), index.row()));
+}
+
+/**
* Reimplemented handler for mouse press events. Right mouse click events will
* be ignored. This is done because we want the Right click is being used to
* open a Context menu.
@@ -47,13 +67,13 @@ void KsTableView::scrollTo(const QModelIndex &index, ScrollHint hint)
QTableView::scrollTo(index, hint);
}
-
/** Create a default (empty) Trace viewer widget. */
KsTraceViewer::KsTraceViewer(QWidget *parent)
: KsWidgetsLib::KsDataWidget(parent),
_view(this),
_model(this),
_proxyModel(this),
+ _itemDelegate(&_model, this),
_toolbar(this),
_labelSearch("Search: Column", this),
_labelGrFollows("Graph follows ", this),
@@ -144,7 +164,7 @@ KsTraceViewer::KsTraceViewer(QWidget *parent)
/* Initialize the trace viewer. */
_view.horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
_view.verticalHeader()->setVisible(false);
- _view.setEditTriggers(QAbstractItemView::NoEditTriggers);
+ _view.setEditTriggers(QAbstractItemView::DoubleClicked);
_view.setSelectionBehavior(QAbstractItemView::SelectRows);
_view.setSelectionMode(QAbstractItemView::SingleSelection);
_view.verticalHeader()->setDefaultSectionSize(defaultRowHeight);
@@ -152,7 +172,8 @@ KsTraceViewer::KsTraceViewer(QWidget *parent)
_view.horizontalHeader()->setFont(
QFontDatabase::systemFont(QFontDatabase::GeneralFont));
- _proxyModel.setSource(&_model);
+ _view.setItemDelegate(&_itemDelegate);
+ _proxyModel.setSource(&_model);
_selectionModel.setModel(&_proxyModel);
_view.setModel(&_proxyModel);
_view.setSelectionModel(&_selectionModel);
diff --git a/src/KsTraceViewer.hpp b/src/KsTraceViewer.hpp
index ae1929d8..99e4d387 100644
--- a/src/KsTraceViewer.hpp
+++ b/src/KsTraceViewer.hpp
@@ -23,6 +23,26 @@
#include "KsWidgetsLib.hpp"
/**
+ * Class used to customize the display of the data items from the model.
+ */
+class KsTableItemDelegate : public QItemDelegate
+{
+public:
+ /** Create KsTableItemDelegate. */
+ KsTableItemDelegate(KsViewModel *model, QWidget *parent = nullptr)
+ : QItemDelegate(parent),
+ _model(model) {};
+
+private:
+ QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
+ const QModelIndex &index) const override;
+
+ void setEditorData(QWidget *editor, const QModelIndex &index) const override;
+
+ KsViewModel *_model;
+};
+
+/**
* Table View class, needed in order to reimplemented the handler for mouse
* press events.
*/
@@ -108,6 +128,8 @@ private:
QItemSelectionModel _selectionModel;
+ KsTableItemDelegate _itemDelegate;
+
QToolBar _toolbar;
QLabel _labelSearch, _labelGrFollows;