config fixes
This commit is contained in:
@@ -42,6 +42,7 @@ qml_module(ZShell
|
||||
appdb.hpp appdb.cpp
|
||||
imageanalyser.hpp imageanalyser.cpp
|
||||
requests.hpp requests.cpp
|
||||
toaster.hpp toaster.cpp
|
||||
LIBRARIES
|
||||
Qt::Gui
|
||||
Qt::Quick
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
#include "toaster.hpp"
|
||||
|
||||
#include <qdebug.h>
|
||||
#include <qlogging.h>
|
||||
#include <qtimer.h>
|
||||
|
||||
namespace ZShell {
|
||||
|
||||
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) {
|
||||
}
|
||||
|
||||
QQmlListProperty<Toast> Toaster::toasts() {
|
||||
return QQmlListProperty<Toast>(this, &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 ZShell
|
||||
@@ -0,0 +1,82 @@
|
||||
#pragma once
|
||||
|
||||
#include <qobject.h>
|
||||
#include <qqmlintegration.h>
|
||||
#include <qqmllist.h>
|
||||
#include <qset.h>
|
||||
|
||||
namespace ZShell {
|
||||
|
||||
class Toast : public QObject {
|
||||
Q_OBJECT
|
||||
QML_ELEMENT
|
||||
QML_UNCREATABLE("Toast instances can only be retrieved from a Toaster")
|
||||
|
||||
Q_PROPERTY(bool closed READ closed NOTIFY closedChanged)
|
||||
Q_PROPERTY(QString title READ title CONSTANT)
|
||||
Q_PROPERTY(QString message READ message CONSTANT)
|
||||
Q_PROPERTY(QString icon READ icon CONSTANT)
|
||||
Q_PROPERTY(int timeout READ timeout CONSTANT)
|
||||
Q_PROPERTY(Type type READ type CONSTANT)
|
||||
|
||||
public:
|
||||
enum class Type {
|
||||
Info = 0,
|
||||
Success,
|
||||
Warning,
|
||||
Error
|
||||
};
|
||||
Q_ENUM(Type)
|
||||
|
||||
explicit Toast(const QString& title, const QString& message, const QString& icon, Type type, int timeout,
|
||||
QObject* parent = nullptr);
|
||||
|
||||
[[nodiscard]] bool closed() const;
|
||||
[[nodiscard]] QString title() const;
|
||||
[[nodiscard]] QString message() const;
|
||||
[[nodiscard]] QString icon() const;
|
||||
[[nodiscard]] int timeout() const;
|
||||
[[nodiscard]] Type type() const;
|
||||
|
||||
Q_INVOKABLE void close();
|
||||
Q_INVOKABLE void lock(QObject* sender);
|
||||
Q_INVOKABLE void unlock(QObject* sender);
|
||||
|
||||
signals:
|
||||
void closedChanged();
|
||||
void finishedClose();
|
||||
|
||||
private:
|
||||
QSet<QObject*> m_locks;
|
||||
|
||||
bool m_closed;
|
||||
QString m_title;
|
||||
QString m_message;
|
||||
QString m_icon;
|
||||
Type m_type;
|
||||
int m_timeout;
|
||||
};
|
||||
|
||||
class Toaster : public QObject {
|
||||
Q_OBJECT
|
||||
QML_ELEMENT
|
||||
QML_SINGLETON
|
||||
|
||||
Q_PROPERTY(QQmlListProperty<ZShell::Toast> toasts READ toasts NOTIFY toastsChanged)
|
||||
|
||||
public:
|
||||
explicit Toaster(QObject* parent = nullptr);
|
||||
|
||||
[[nodiscard]] QQmlListProperty<Toast> toasts();
|
||||
|
||||
Q_INVOKABLE void toast(const QString& title, const QString& message, const QString& icon = QString(),
|
||||
ZShell::Toast::Type type = Toast::Type::Info, int timeout = 5000);
|
||||
|
||||
signals:
|
||||
void toastsChanged();
|
||||
|
||||
private:
|
||||
QList<Toast*> m_toasts;
|
||||
};
|
||||
|
||||
} // namespace ZShell
|
||||
Reference in New Issue
Block a user