summaryrefslogtreecommitdiff
path: root/plugin/src/Caelestia/toaster.cpp
diff options
context:
space:
mode:
author2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-09-21 16:43:45 +1000
committer2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-09-21 16:43:45 +1000
commit0ca5d505468d8d9dfdf01531f869ff5904f25ccc (patch)
treec291eedfc0f309b659e5e965114ba60ec9aa02f5 /plugin/src/Caelestia/toaster.cpp
parentsidebar/notifs: add link support (diff)
downloadcaelestia-shell-0ca5d505468d8d9dfdf01531f869ff5904f25ccc.tar.gz
caelestia-shell-0ca5d505468d8d9dfdf01531f869ff5904f25ccc.tar.bz2
caelestia-shell-0ca5d505468d8d9dfdf01531f869ff5904f25ccc.zip
utilities: add toasts
Diffstat (limited to 'plugin/src/Caelestia/toaster.cpp')
-rw-r--r--plugin/src/Caelestia/toaster.cpp116
1 files changed, 116 insertions, 0 deletions
diff --git a/plugin/src/Caelestia/toaster.cpp b/plugin/src/Caelestia/toaster.cpp
new file mode 100644
index 0000000..4e2acd5
--- /dev/null
+++ b/plugin/src/Caelestia/toaster.cpp
@@ -0,0 +1,116 @@
+#include "toaster.hpp"
+
+#include <qdebug.h>
+#include <qlogging.h>
+#include <qtimer.h>
+
+namespace caelestia {
+
+Toast::Toast(const QString& title, const QString& message, const QString& icon, Type type, int timeout, QObject* parent)
+ : QObject(parent)
+ , m_closed(false)
+ , m_title(title)
+ , m_message(message)
+ , m_icon(icon)
+ , m_type(type)
+ , m_timeout(timeout) {
+ QTimer::singleShot(timeout, this, &Toast::close);
+
+ if (m_icon.isEmpty()) {
+ switch (m_type) {
+ case Type::Success:
+ m_icon = "check_circle_unread";
+ break;
+ case Type::Warning:
+ m_icon = "warning";
+ break;
+ case Type::Error:
+ m_icon = "error";
+ break;
+ default:
+ m_icon = "info";
+ break;
+ }
+ }
+
+ if (timeout <= 0) {
+ switch (m_type) {
+ case Type::Warning:
+ m_timeout = 7000;
+ break;
+ case Type::Error:
+ m_timeout = 10000;
+ break;
+ default:
+ m_timeout = 5000;
+ break;
+ }
+ }
+}
+
+bool Toast::closed() const {
+ return m_closed;
+}
+
+QString Toast::title() const {
+ return m_title;
+}
+
+QString Toast::message() const {
+ return m_message;
+}
+
+QString Toast::icon() const {
+ return m_icon;
+}
+
+int Toast::timeout() const {
+ return m_timeout;
+}
+
+Toast::Type Toast::type() const {
+ return m_type;
+}
+
+void Toast::close() {
+ if (!m_closed) {
+ m_closed = true;
+ emit closedChanged();
+ }
+
+ if (m_locks.isEmpty()) {
+ emit finishedClose();
+ }
+}
+
+void Toast::lock(QObject* sender) {
+ m_locks << sender;
+ QObject::connect(sender, &QObject::destroyed, this, &Toast::unlock);
+}
+
+void Toast::unlock(QObject* sender) {
+ if (m_locks.remove(sender) && m_closed) {
+ close();
+ }
+}
+
+Toaster::Toaster(QObject* parent)
+ : QObject(parent) {}
+
+QList<Toast*> Toaster::toasts() const {
+ return m_toasts;
+}
+
+void Toaster::toast(const QString& title, const QString& message, const QString& icon, Toast::Type type, int timeout) {
+ auto* toast = new Toast(title, message, icon, type, timeout, this);
+ QObject::connect(toast, &Toast::finishedClose, this, [toast, this]() {
+ if (m_toasts.removeOne(toast)) {
+ emit toastsChanged();
+ toast->deleteLater();
+ }
+ });
+ m_toasts.push_front(toast);
+ emit toastsChanged();
+}
+
+} // namespace caelestia