All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yordan Karadzhov <y.karadz@gmail.com>
To: linux-trace-devel@vger.kernel.org
Cc: rostedt@goodmis.org, Yordan Karadzhov <y.karadz@gmail.com>
Subject: [PATCH] kernel-shark: Make the text to be copyable.
Date: Sun, 15 Jan 2023 20:44:12 +0200	[thread overview]
Message-ID: <20230115184412.46720-1-y.karadz@gmail.com> (raw)

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>
---
 src/KsModels.cpp      | 14 ++++++++++++++
 src/KsModels.hpp      |  2 ++
 src/KsTraceViewer.cpp | 27 ++++++++++++++++++++++++---
 src/KsTraceViewer.hpp | 22 ++++++++++++++++++++++
 4 files changed, 62 insertions(+), 3 deletions(-)

diff --git a/src/KsModels.cpp b/src/KsModels.cpp
index df8373e..e10f411 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 3a6d3f1..2883ce3 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 12a95a7..05f5461 100644
--- a/src/KsTraceViewer.cpp
+++ b/src/KsTraceViewer.cpp
@@ -19,6 +19,26 @@
 #include "KsTraceViewer.hpp"
 #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
@@ -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 ae1929d..99e4d38 100644
--- a/src/KsTraceViewer.hpp
+++ b/src/KsTraceViewer.hpp
@@ -22,6 +22,26 @@
 #include "KsDualMarker.hpp"
 #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;
-- 
2.38.1


                 reply	other threads:[~2023-01-15 18:44 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230115184412.46720-1-y.karadz@gmail.com \
    --to=y.karadz@gmail.com \
    --cc=linux-trace-devel@vger.kernel.org \
    --cc=rostedt@goodmis.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.