93 lines
3.1 KiB
C++
93 lines
3.1 KiB
C++
// ollie-gui-9p: minimal Qt GUI using 9P for all communication.
|
|
// Uses ollie-9p subprocess for 9P transport.
|
|
#include <QApplication>
|
|
#include <QIcon>
|
|
#include <QMenu>
|
|
#include <QSystemTrayIcon>
|
|
#include <QAction>
|
|
#include <QQuickWindow>
|
|
#include <QQmlApplicationEngine>
|
|
#include <QQmlContext>
|
|
#include <QQuickStyle>
|
|
|
|
#include "ollie9pclient.h"
|
|
#include "sessionmodel.h"
|
|
#include "chatblockmodel.h"
|
|
#include "thememanager.h"
|
|
#include "clipboardhelper.h"
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
|
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
|
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
|
|
#endif
|
|
|
|
QApplication app(argc, argv);
|
|
app.setApplicationName("ollie-gui");
|
|
|
|
if (qEnvironmentVariableIsEmpty("QT_QUICK_CONTROLS_STYLE"))
|
|
QQuickStyle::setStyle("Basic");
|
|
|
|
QQmlApplicationEngine engine;
|
|
|
|
auto *ollie = new Ollie9pClient(&app);
|
|
auto *sessionModel = new SessionModel(ollie, &app);
|
|
auto *chatModel = new ChatBlockModel(&app);
|
|
auto *theme = new ThemeManager(&app);
|
|
auto *clipboard = new ClipboardHelper(&app);
|
|
|
|
QObject::connect(ollie, &Ollie9pClient::chatReceived,
|
|
chatModel, &ChatBlockModel::appendData);
|
|
|
|
|
|
engine.rootContext()->setContextProperty("ollie", ollie);
|
|
engine.rootContext()->setContextProperty("sessionModel", sessionModel);
|
|
engine.rootContext()->setContextProperty("chatModel", chatModel);
|
|
engine.rootContext()->setContextProperty("theme", theme);
|
|
engine.rootContext()->setContextProperty("clipboard", clipboard);
|
|
|
|
const QUrl url(QStringLiteral("qrc:/main.qml"));
|
|
|
|
engine.load(url);
|
|
if (engine.rootObjects().isEmpty())
|
|
return -1;
|
|
|
|
auto *window = qobject_cast<QQuickWindow *>(engine.rootObjects().constFirst());
|
|
QIcon trayIconImage = QIcon::fromTheme("ollie");
|
|
if (trayIconImage.isNull()) {
|
|
trayIconImage.addFile(":/ollie.svg");
|
|
trayIconImage.addFile(":/gui/ollie.svg");
|
|
}
|
|
auto *trayIcon = new QSystemTrayIcon(trayIconImage, &app);
|
|
auto *trayMenu = new QMenu;
|
|
auto *showAction = trayMenu->addAction("Show Ollie");
|
|
trayMenu->addSeparator();
|
|
auto *quitAction = trayMenu->addAction("Quit");
|
|
trayIcon->setContextMenu(trayMenu);
|
|
trayIcon->setToolTip("Ollie");
|
|
|
|
engine.rootContext()->setContextProperty("trayIcon", trayIcon);
|
|
|
|
QObject::connect(showAction, &QAction::triggered, [window, trayIcon]() {
|
|
window->show();
|
|
window->raise();
|
|
window->requestActivate();
|
|
trayIcon->show();
|
|
});
|
|
QObject::connect(quitAction, &QAction::triggered, [window, &app]() {
|
|
window->setProperty("quitting", true);
|
|
app.quit();
|
|
});
|
|
QObject::connect(trayIcon, &QSystemTrayIcon::activated,
|
|
[showAction](QSystemTrayIcon::ActivationReason reason) {
|
|
if (reason == QSystemTrayIcon::Trigger)
|
|
showAction->trigger();
|
|
});
|
|
QObject::connect(theme, &ThemeManager::closeToTrayChanged,
|
|
[theme, trayIcon]() { trayIcon->setVisible(theme->closeToTray()); });
|
|
trayIcon->setVisible(theme->closeToTray());
|
|
|
|
return app.exec();
|
|
}
|