diff mbox series

[v3,4/4] kernel-shark-qt: Add widget demo example.

Message ID 20181011165713.15257-5-ykaradzhov@vmware.com (mailing list archive)
State Accepted
Headers show
Series Add basic components to be used by the Qt GUI | expand

Commit Message

Yordan Karadzhov Oct. 11, 2018, 4:57 p.m. UTC
From: Yordan Karadzhov (VMware) <y.karadz@gmail.com>

This patch introduces a basic example, showing how to use KsUtils and
KsWidgetsLib.

Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
---
 kernel-shark-qt/examples/CMakeLists.txt |   4 +
 kernel-shark-qt/examples/widgetdemo.cpp | 158 ++++++++++++++++++++++++
 2 files changed, 162 insertions(+)
 create mode 100644 kernel-shark-qt/examples/widgetdemo.cpp
diff mbox series

Patch

diff --git a/kernel-shark-qt/examples/CMakeLists.txt b/kernel-shark-qt/examples/CMakeLists.txt
index 0c83293..e16216e 100644
--- a/kernel-shark-qt/examples/CMakeLists.txt
+++ b/kernel-shark-qt/examples/CMakeLists.txt
@@ -19,3 +19,7 @@  target_link_libraries(confio   kshark)
 message(STATUS "dataplot")
 add_executable(dplot          dataplot.cpp)
 target_link_libraries(dplot   kshark-plot)
+
+message(STATUS "widgetdemo")
+add_executable(widgetdemo          widgetdemo.cpp)
+target_link_libraries(widgetdemo   kshark-gui)
diff --git a/kernel-shark-qt/examples/widgetdemo.cpp b/kernel-shark-qt/examples/widgetdemo.cpp
new file mode 100644
index 0000000..73049bf
--- /dev/null
+++ b/kernel-shark-qt/examples/widgetdemo.cpp
@@ -0,0 +1,158 @@ 
+// SPDX-License-Identifier: GPL-2.0
+
+/*
+ * Copyright (C) 2017 VMware Inc, Yordan Karadzhov <ykaradzhov@vmware.com>
+ */
+
+// C
+#include <sys/stat.h>
+#include <getopt.h>
+#include <unistd.h>
+
+// C++
+#include <iostream>
+
+// Qt
+#include <QtWidgets>
+
+// KernelShark
+#include "KsUtils.hpp"
+#include "KsWidgetsLib.hpp"
+
+#define default_input_file (char*)"trace.dat"
+
+static char *input_file = nullptr;
+
+using namespace std;
+
+void usage(const char *prog)
+{
+	cout << "Usage: " << prog << endl
+	     << "  -h	Display this help message\n"
+	     << "  -v	Display version and exit\n"
+	     << "  -i	input_file, default is " << default_input_file << endl
+	     << "  -p	register plugin, use plugin name, absolute or relative path\n"
+	     << "  -u	unregister plugin, use plugin name or absolute path\n";
+}
+
+struct TaskPrint : public QObject
+{
+	tep_handle	*_pevent;
+
+	void print(QVector<int> pids)
+	{
+		for (auto const &pid: pids)
+			cout << "task: "
+			     << tep_data_comm_from_pid(_pevent, pid)
+			     << "  pid: " << pid << endl;
+	}
+};
+
+int main(int argc, char **argv)
+{
+	kshark_context *kshark_ctx(nullptr);
+	QApplication a(argc, argv);
+	KsPluginManager plugins;
+	KsDataStore data;
+	size_t nRows(0);
+	int c;
+
+	if (!kshark_instance(&kshark_ctx))
+		return 1;
+
+	while ((c = getopt(argc, argv, "hvi:p:u:")) != -1) {
+		switch(c) {
+		case 'v':
+			printf("kshark-gui %s\n", KS_VERSION_STRING);
+			return 0;
+
+		case 'i':
+			input_file = optarg;
+			break;
+
+		case 'p':
+			plugins.registerPlugin(QString(optarg));
+			break;
+
+		case 'u':
+			plugins.unregisterPlugin(QString(optarg));
+			break;
+
+		case 'h':
+			usage(argv[0]);
+			return 0;
+		}
+	}
+
+	if (!input_file) {
+			struct stat st;
+			if (stat(default_input_file, &st) == 0)
+				input_file = default_input_file;
+	}
+
+	if (input_file) {
+		data.loadDataFile(input_file);
+		nRows = data.size();
+	} else {
+		cerr << "No input file is provided.\n";
+	}
+
+	cout << nRows << " entries loaded\n";
+
+	auto lamPrintPl = [&]()
+	{
+		kshark_plugin_list *pl;
+		for (pl = kshark_ctx->plugins; pl; pl = pl->next)
+			cout << pl->file << endl;
+	};
+
+	cout << "\n\n";
+	lamPrintPl();
+	sleep(1);
+
+	QVector<bool> registeredPlugins;
+	QStringList pluginsList;
+
+	pluginsList << plugins._ksPluginList
+		    << plugins._userPluginList;
+
+	registeredPlugins << plugins._registeredKsPlugins
+			  << plugins._registeredUserPlugins;
+
+	KsCheckBoxWidget *pluginCBD
+		= new KsPluginCheckBoxWidget(pluginsList);
+
+	pluginCBD->set(registeredPlugins);
+
+	KsCheckBoxDialog *dialog1 = new KsCheckBoxDialog(pluginCBD);
+	QObject::connect(dialog1,	&KsCheckBoxDialog::apply,
+			&plugins,	&KsPluginManager::updatePlugins);
+
+	dialog1->show();
+	a.exec();
+
+	cout << "\n\nYou selected\n";
+	lamPrintPl();
+	sleep(1);
+
+	if (!nRows)
+		return 1;
+
+	KsCheckBoxWidget *tasks_cbd =
+		new KsTasksCheckBoxWidget(data.tep(), true);
+
+	tasks_cbd->setDefault(false);
+
+	TaskPrint p;
+	p._pevent = data.tep();
+
+	KsCheckBoxDialog *dialog2 = new KsCheckBoxDialog(tasks_cbd);
+	QObject::connect(dialog2,	&KsCheckBoxDialog::apply,
+			 &p,		&TaskPrint::print);
+
+	cout << "\n\nYou selected\n";
+	dialog2->show();
+	a.exec();
+
+	return 0;
+}