aboutsummaryrefslogtreecommitdiffstats
path: root/src/widgets/status_info.cpp
diff options
context:
space:
mode:
authorConfuSomu2023-11-12 00:16:02 -0500
committerConfuSomu2023-11-12 00:16:02 -0500
commit8ee7a379bbd8c1e2d7831208308bf11eabcdc79d (patch)
tree601b9d6e453d0be1acc7a56a3df6f233cc4a73da /src/widgets/status_info.cpp
parent80a658f062328ab8b47dc6b2557d274f51278b3a (diff)
downloadActorViewer-8ee7a379bbd8c1e2d7831208308bf11eabcdc79d.tar
ActorViewer-8ee7a379bbd8c1e2d7831208308bf11eabcdc79d.tar.gz
ActorViewer-8ee7a379bbd8c1e2d7831208308bf11eabcdc79d.zip
Move status info widget to its own widget
It is responsable of processing list items which are given to it, via signals, and then displaying them on the interface. Making this widget separate and modular will allow creating more advanced status views that aren't only HTML-based and that are more intuitive to use.
Diffstat (limited to 'src/widgets/status_info.cpp')
-rw-r--r--src/widgets/status_info.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/widgets/status_info.cpp b/src/widgets/status_info.cpp
new file mode 100644
index 0000000..847aec4
--- /dev/null
+++ b/src/widgets/status_info.cpp
@@ -0,0 +1,82 @@
+#include "status_info.h"
+#include "src/list_item.h"
+#include <QTimer>
+#include <QDebug>
+#include <QCloseEvent>
+
+StatusInfoWidget::StatusInfoWidget(QWidget* parent)
+ : QWidget(parent), ui(new Ui::StatusInfo)
+{
+ ui->setupUi(this);
+
+ worker.moveToThread(&worker_thread);
+ connect(this, &StatusInfoWidget::do_process_item, &worker, &StatusInfoWidgetWorker::process_item, Qt::QueuedConnection);
+ connect(this, &StatusInfoWidget::do_process_activity, &worker, &StatusInfoWidgetWorker::process_activity, Qt::QueuedConnection);
+ connect(&worker, &StatusInfoWidgetWorker::itemProcessed, this, &StatusInfoWidget::postProcess, Qt::QueuedConnection);
+ worker_thread.start();
+
+ worker.set_text_zone_width(ui->statusInfoText->width());
+}
+
+StatusInfoWidget::~StatusInfoWidget() {
+ worker_thread.quit();
+ worker_thread.wait();
+
+ delete displayed_activity;
+ delete ui;
+}
+
+void StatusInfoWidget::resizeEvent(QResizeEvent* event) {
+ // TODO: probably create a template, define or inline function for this
+ static QTimer* differed_resize = new QTimer(this);
+ if (static bool timer_init_done = false; not timer_init_done) {
+ differed_resize->setTimerType(Qt::CoarseTimer);
+ differed_resize->setSingleShot(true);
+ differed_resize->setInterval(150);
+ connect(differed_resize, &QTimer::timeout, this, [=]() {
+ worker.set_text_zone_width(ui->statusInfoText->width());
+ if (displayed_activity)
+ emit do_process_activity(displayed_activity);
+ });
+ }
+ differed_resize->start();
+ QWidget::resizeEvent(event);
+}
+
+void StatusInfoWidget::show_list_item(StatusListItem* new_item) {
+ qDebug() << "got item" << new_item << "old is" << displayed_item << displayed_activity;
+ if (new_item != displayed_item) {
+ delete displayed_activity; displayed_activity = nullptr;
+ displayed_item = new_item;
+ emit do_process_item(new_item);
+ }
+}
+
+// Update the GUI with the displayed Activity.
+// Has to be done on the GUI thread, no other way in Qt
+void StatusInfoWidget::postProcess(const QString &html, APActivity* activity) {
+ // Make sure to not delete the displayed_activity if we are reprocessing it after a resize event, else you get a crash that requires nasty debugging (don't ask how i found out ;)
+ if (activity != displayed_activity) {
+ // We are doing "double" deletion of old displayed_activity but sometimes that's important when really scrubbing the search results bar very quickly (we sometimes do reach that code and it hopefully helps against memory leaks)
+ if (displayed_activity)
+ delete displayed_activity;
+ displayed_activity = activity;
+ }
+ ui->statusInfoText->setHtml(html);
+}
+
+/*
+ * ----------------
+ * Worker functions. Ran on non-main, non-GUI, thread
+ * ----------------
+ */
+
+void StatusInfoWidgetWorker::process_item(StatusListItem* item) {
+ APActivity* activity = item->get_activity();
+ process_activity(activity);
+}
+
+void StatusInfoWidgetWorker::process_activity(APActivity* activity) {
+ QString html = activity->get_html_render(render_info);
+ emit itemProcessed(html, activity);
+}