aboutsummaryrefslogtreecommitdiffstats
path: root/src/widgets/status_info.cpp
diff options
context:
space:
mode:
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);
+}