Files
SysTray-X/app/SysTray-X/systrayx.cpp
2020-04-04 19:34:19 +02:00

279 lines
8.4 KiB
C++

#include "systrayx.h"
/*
* Local includes
*/
#include "debugwidget.h"
#include "preferencesdialog.h"
#include "systrayxlink.h"
#include "systrayxicon.h"
#include "windowctrl.h"
/*
* Qt includes
*/
#include <QCoreApplication>
#include <QMenu>
#include <QStyle>
#include <QIcon>
/*
* Constants
*/
const QString SysTrayX::JSON_PREF_REQUEST = "{\"preferences\":{}}";
/*
* Constructor
*/
SysTrayX::SysTrayX( QObject *parent ) : QObject( parent )
{
/*
* Setup preferences storage
*/
m_preferences = new Preferences();
/*
* Setup window control
*/
m_win_ctrl = new WindowCtrl( m_preferences );
/*
* Setup the link
*/
m_link = new SysTrayXLink( m_preferences );
/*
* Setup preferences dialog
*/
m_pref_dialog = new PreferencesDialog( m_link, m_preferences );
/*
* Setup tray icon
*/
createTrayIcon();
m_tray_icon->show();
/*
* Setup debug window
*/
m_debug = new DebugWidget( m_preferences );
if( m_preferences->getDebug() ) {
m_debug->show();
}
/*
* Connect debug link signals
*/
connect( m_link, &SysTrayXLink::signalUnreadMail, m_debug, &DebugWidget::slotUnreadMail );
connect( this, &SysTrayX::signalConsole, m_debug, &DebugWidget::slotConsole );
connect( m_win_ctrl, &WindowCtrl::signalConsole, m_debug, &DebugWidget::slotConsole );
connect( m_debug, &DebugWidget::signalTest1ButtonClicked, m_win_ctrl, &WindowCtrl::slotWindowTest1 );
connect( m_debug, &DebugWidget::signalTest2ButtonClicked, m_win_ctrl, &WindowCtrl::slotWindowTest2 );
connect( m_debug, &DebugWidget::signalTest3ButtonClicked, m_win_ctrl, &WindowCtrl::slotWindowTest3 );
/*
* Connect preferences signals
*/
connect( m_preferences, &Preferences::signalIconTypeChange, m_tray_icon, &SysTrayXIcon::slotIconTypeChange );
connect( m_preferences, &Preferences::signalIconDataChange, m_tray_icon, &SysTrayXIcon::slotIconDataChange );
connect( m_preferences, &Preferences::signalHideOnMinimizeChange, m_win_ctrl, &WindowCtrl::slotHideOnMinimizeChange );
connect( m_preferences, &Preferences::signalStartMinimizedChange, m_win_ctrl, &WindowCtrl::slotStartMinimizedChange );
connect( m_preferences, &Preferences::signalIconTypeChange, m_pref_dialog, &PreferencesDialog::slotIconTypeChange );
connect( m_preferences, &Preferences::signalIconDataChange, m_pref_dialog, &PreferencesDialog::slotIconDataChange );
connect( m_preferences, &Preferences::signalHideOnMinimizeChange, m_pref_dialog, &PreferencesDialog::slotHideOnMinimizeChange );
connect( m_preferences, &Preferences::signalStartMinimizedChange, m_pref_dialog, &PreferencesDialog::slotStartMinimizedChange );
connect( m_preferences, &Preferences::signalPollStartupDelayChange, m_pref_dialog, &PreferencesDialog::slotPollStartupDelayChange );
connect( m_preferences, &Preferences::signalPollIntervalChange, m_pref_dialog, &PreferencesDialog::slotPollIntervalChange );
connect( m_preferences, &Preferences::signalDebugChange, m_pref_dialog, &PreferencesDialog::slotDebugChange );
connect( m_preferences, &Preferences::signalIconTypeChange, m_link, &SysTrayXLink::slotIconTypeChange );
connect( m_preferences, &Preferences::signalIconDataChange, m_link, &SysTrayXLink::slotIconDataChange );
connect( m_preferences, &Preferences::signalHideOnMinimizeChange, m_link, &SysTrayXLink::slotHideOnMinimizeChange );
connect( m_preferences, &Preferences::signalStartMinimizedChange, m_link, &SysTrayXLink::slotStartMinimizedChange );
connect( m_preferences, &Preferences::signalPollStartupDelayChange, m_link, &SysTrayXLink::slotPollStartupDelayChange );
connect( m_preferences, &Preferences::signalPollIntervalChange, m_link, &SysTrayXLink::slotPollIntervalChange );
connect( m_preferences, &Preferences::signalDebugChange, m_link, &SysTrayXLink::slotDebugChange );
connect( m_preferences, &Preferences::signalDebugChange, m_debug, &DebugWidget::slotDebugChange );
/*
* Connect link signals
*/
connect( m_link, &SysTrayXLink::signalUnreadMail, m_tray_icon, &SysTrayXIcon::slotSetUnreadMail );
connect( m_link, &SysTrayXLink::signalAddOnShutdown, this, &SysTrayX::slotAddOnShutdown );
connect( m_link, &SysTrayXLink::signalWindowState, m_win_ctrl, &WindowCtrl::slotWindowState );
connect( m_link, &SysTrayXLink::signalTitle, m_win_ctrl, &WindowCtrl::slotWindowTitle );
connect( m_link, &SysTrayXLink::signalVersion, this, &SysTrayX::slotVersion );
/*
* Connect window signals
*/
connect( m_win_ctrl, &WindowCtrl::signalWindowNormal, m_link, &SysTrayXLink::slotWindowNormal );
connect( m_win_ctrl, &WindowCtrl::signalWindowMinimize, m_link, &SysTrayXLink::slotWindowMinimize );
/*
* Connect system tray signals
*/
connect( m_tray_icon, &SysTrayXIcon::signalShowHide, m_win_ctrl, &WindowCtrl::slotShowHide );
/*
* SysTrayX
*/
connect( this, &SysTrayX::signalClose, m_win_ctrl, &WindowCtrl::slotClose );
/*
* Request preferences from add-on
*/
getPreferences();
}
/*
* Send a preferences request
*/
void SysTrayX::getPreferences()
{
/*
* Request preferences from add-on
*/
QByteArray request = QString( SysTrayX::JSON_PREF_REQUEST ).toUtf8();
emit signalWriteMessage( request );
}
/*
* Create the actions for the system tray icon menu
*/
void SysTrayX::createActions()
{
m_showhide_action = new QAction(tr("&Show/Hide"), this);
m_showhide_action->setIcon( QIcon( ":/files/icons/window-restore.png" ) );
connect( m_showhide_action, &QAction::triggered, m_win_ctrl, &WindowCtrl::slotShowHide );
m_pref_action = new QAction(tr("&Preferences"), this);
m_pref_action->setIcon( QIcon( ":/files/icons/gtk-preferences.png" ) );
connect( m_pref_action, &QAction::triggered, m_pref_dialog, &PreferencesDialog::showNormal );
m_about_action = new QAction(tr("&About"), this);
m_about_action->setIcon( QIcon( ":/files/icons/help-about.png" ) );
connect( m_about_action, &QAction::triggered, this, &SysTrayX::slotAbout );
m_quit_action = new QAction( tr("&Quit"), this );
m_quit_action->setIcon( QIcon( ":/files/icons/window-close.png" ) );
connect( m_quit_action, &QAction::triggered, this, &SysTrayX::slotShutdown );
}
/*
* Create the system tray icon
*/
void SysTrayX::createTrayIcon()
{
/*
* Setup menu actions
*/
createActions();
/*
* Setup menu
*/
m_tray_icon_menu = new QMenu();
m_tray_icon_menu->addAction( m_showhide_action );
m_tray_icon_menu->addSeparator();
m_tray_icon_menu->addAction( m_pref_action );
m_tray_icon_menu->addAction( m_about_action );
m_tray_icon_menu->addSeparator();
m_tray_icon_menu->addAction( m_quit_action );
/*
* Create system tray icon
*/
m_tray_icon = new SysTrayXIcon( m_link, m_preferences );
m_tray_icon->setContextMenu( m_tray_icon_menu );
/*
* Set icon
*/
m_tray_icon->setIconMime( m_preferences->getIconMime() );
m_tray_icon->setIconData( m_preferences->getIconData() );
m_tray_icon->setIconType( m_preferences->getIconType() );
}
/*
* Quit the app by add-on request
*/
void SysTrayX::slotAddOnShutdown()
{
/*
* Hide systray icon to prevent ghost systray icon in Windows
*/
m_tray_icon->hide();
/*
* Let's quit
*/
QCoreApplication::quit();
}
/*
* Quit the app by quit menu
*/
void SysTrayX::slotShutdown()
{
/*
* Hide systray icon to prevent ghost systray icon in Windows
*/
m_tray_icon->hide();
/*
* Close the TB window
*/
emit signalClose();
/*
* Let's quit
*/
QCoreApplication::quit();
}
/*
* Show the about dialog
*/
void SysTrayX::slotAbout()
{
Ui::AboutDialog ui;
QDialog dialog;
ui.setupUi( &dialog );
ui.version->setText( m_preferences->getVersion() );
ui.build->setText( m_preferences->getBuild() );
ui.hash->setText( m_preferences->getHash() );
ui.branch->setText( m_preferences->getBranch() );
dialog.exec();
}
/*
* Handle the version info from the addon
*/
void SysTrayX::slotVersion( QString version )
{
if( version != m_preferences->getVersion() )
{
m_tray_icon->showMessage("SysTray-X Warning", "Version mismatch addon and app",
QApplication::style()->standardIcon( QStyle::SP_MessageBoxWarning ) );
}
}