From 30029fdec51cd20babc4c4d4f783613595c44364 Mon Sep 17 00:00:00 2001 From: Jim A Kinsman Date: Thu, 12 Sep 2013 22:01:28 -0500 Subject: [PATCH] working tray icon example. no bells and whistles --- JsRoboKey.pro | 3 ++ dlgjsrobokey.cpp | 113 +++++++++++++++++++++++++++++++++++++++++++++++ dlgjsrobokey.h | 29 +++++++++++- resources.qrc | 7 +++ 4 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 resources.qrc diff --git a/JsRoboKey.pro b/JsRoboKey.pro index 53face3..b9a3207 100644 --- a/JsRoboKey.pro +++ b/JsRoboKey.pro @@ -47,3 +47,6 @@ FORMS += dlgjsrobokey.ui VERSION = 130805 + +RESOURCES += \ + resources.qrc diff --git a/dlgjsrobokey.cpp b/dlgjsrobokey.cpp index 833fc36..d658db8 100644 --- a/dlgjsrobokey.cpp +++ b/dlgjsrobokey.cpp @@ -49,9 +49,122 @@ DlgJsRoboKey::DlgJsRoboKey(QWidget *parent) : editor.setColor(JSEdit::BracketError, QColor("#A82224")); editor.setColor(JSEdit::FoldIndicator, QColor("#555555")); + createActions(); + createTrayIcon(); + + connect(trayIcon, SIGNAL(messageClicked()), this, SLOT(messageClicked())); + connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), + this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason))); + + setIcon(1); + trayIcon->show(); + + + //initalize the v8 engine initialize(); } +void DlgJsRoboKey::createActions() +{ + minimizeAction = new QAction(tr("Mi&nimize"), this); + connect(minimizeAction, SIGNAL(triggered()), this, SLOT(hide())); + + maximizeAction = new QAction(tr("Ma&ximize"), this); + connect(maximizeAction, SIGNAL(triggered()), this, SLOT(showMaximized())); + + restoreAction = new QAction(tr("&Restore"), this); + connect(restoreAction, SIGNAL(triggered()), this, SLOT(showNormal())); + + quitAction = new QAction(tr("&Quit"), this); + connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); +} + + +void DlgJsRoboKey::createTrayIcon() +{ + trayIconMenu = new QMenu(this); + trayIconMenu->addAction(minimizeAction); + trayIconMenu->addAction(maximizeAction); + trayIconMenu->addAction(restoreAction); + trayIconMenu->addSeparator(); + trayIconMenu->addAction(quitAction); + + trayIcon = new QSystemTrayIcon(this); + trayIcon->setContextMenu(trayIconMenu); +} + +void DlgJsRoboKey::showMessage(const QString& title, const QString& body, int iicon, int ms_duration, const QJSValue& callback, + const QString& action, const QString& param1) + { + //actions are to be defined in nature + //TODO: notice, this will screw up the previous callback, does it matter? + trayJsCallback = callback; + trayAction = action; + trayParam1 = param1; + // NoIcon, Information, Warning, Critical + QSystemTrayIcon::MessageIcon icon = (QSystemTrayIcon::MessageIcon)iicon; + trayIcon->showMessage(title, body, icon, ms_duration); + } + + +void DlgJsRoboKey::setVisible(bool visible) +{ + minimizeAction->setEnabled(visible); + maximizeAction->setEnabled(!isMaximized()); + restoreAction->setEnabled(isMaximized() || !visible); + QDialog::setVisible(visible); +} + +void DlgJsRoboKey::closeEvent(QCloseEvent *event) + { + if (trayIcon->isVisible()) { + /* + QMessageBox::information(this, tr("Systray"), + tr("The program will keep running in the " + "system tray. To terminate the program, " + "choose Quit in the context menu " + "of the system tray entry."));*/ + showMessage("JsRoboKey is still running in the tray", + "To exit the program completly and all running scripts, Right click -> quit ", 1); + hide(); + event->ignore(); + } + } + +void DlgJsRoboKey::messageClicked() + { + //TODO: depending on the action we need to do something + if (trayJsCallback.isCallable()){ + trayJsCallback.call(); + //it was already called, now make it undefined + trayJsCallback = QJSValue(); + } + } + +void DlgJsRoboKey::iconActivated(QSystemTrayIcon::ActivationReason reason) + { + switch (reason) { + case QSystemTrayIcon::Trigger: + case QSystemTrayIcon::DoubleClick: + //do something + setVisible(true); + break; + case QSystemTrayIcon::MiddleClick: + //what the heck are we going to do with a middle click? + break; + default: + ; + } + } + +void DlgJsRoboKey::setIcon(int index) +{ + + QIcon icon = QIcon(tr(":/jsrobokeyicon%1.png").arg(index)); + trayIcon->setIcon(icon); + setWindowIcon(icon); +} + DlgJsRoboKey::~DlgJsRoboKey() { delete m_jsengine; diff --git a/dlgjsrobokey.h b/dlgjsrobokey.h index 9d123c2..0075b75 100644 --- a/dlgjsrobokey.h +++ b/dlgjsrobokey.h @@ -13,6 +13,8 @@ #include #include #include +#include +#include #include "jsrobokey.h" class JsRoboKey; @@ -37,12 +39,23 @@ class DlgJsRoboKey : public QDialog bool loadJS(const QString& code, const QString &module_or_filename); QJSEngine* jsengine(); + void setIcon(int index = 1); + void iconActivated(QSystemTrayIcon::ActivationReason reason); + void showMessage(const QString &title, const QString &body, int iicon = 0, + int ms_duration = 3500, const QJSValue &callback = QJSValue(), const QString &action="", const QString ¶m1=""); + void setVisible(bool visible); + void createTrayIcon(); + void createActions(); private slots: void on_btnInstaRun_clicked(); - void on_btnUnloadAll_clicked(); + void messageClicked(); + +protected: + virtual void closeEvent(QCloseEvent *event); private: + Ui::DlgJsRoboKey *ui; QJSEngine* m_jsengine; QJSValue m_rk; @@ -51,6 +64,20 @@ private slots: QString m_lastRunCode; QString m_lastRunFileOrModule; JsRoboKey* m_pjsrobokey; + + + QAction *minimizeAction; + QAction *maximizeAction; + QAction *restoreAction; + QAction *quitAction; + + + QSystemTrayIcon *trayIcon; + QMenu *trayIconMenu; + + QString trayAction; + QString trayParam1; + QJSValue trayJsCallback; }; diff --git a/resources.qrc b/resources.qrc new file mode 100644 index 0000000..c4ef79d --- /dev/null +++ b/resources.qrc @@ -0,0 +1,7 @@ + + + jsrobokeyicon1.icns + jsrobokeyicon1.ico + jsrobokeyicon1.png + +