blob: c3cd8f69a9934ae59ff9f708380180e392fd62bb [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
Anthony Léonard2fde81d2017-04-17 10:06:55 -04002 * Copyright (C) 2015-2017 by Savoir-faire Linux *
Edric Milaret627500d2015-03-27 16:41:40 -04003 * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 3 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
17 **************************************************************************/
18
19#include "mainwindow.h"
20#include "ui_mainwindow.h"
21
Edric Milaret06c531a2016-05-06 13:27:37 -040022#include <QDesktopWidget>
Edric Milaret2cf34292015-06-22 16:27:03 -040023
24#include "media/text.h"
25#include "media/textrecording.h"
Edric Milaret627500d2015-03-27 16:41:40 -040026
Edric Milaret36587362016-02-04 12:30:52 -050027#ifdef Q_OS_WIN
Edric Milareted0b2802015-10-01 15:10:02 -040028#include <windows.h>
29#include <QWinThumbnailToolBar>
30#include <QWinThumbnailToolButton>
31#endif
32
Nicolas Jager97a21b42015-12-03 16:55:45 -050033#include "aboutdialog.h"
Edric Milaretdb818e52016-02-02 14:53:19 -050034#include "settingskey.h"
Edric Milaret79d3f682015-12-09 12:32:52 -050035#include "winsparkle.h"
Edric Milaretfe390942015-08-04 13:41:03 -040036#include "callmodel.h"
Olivier SOLDANOc1ca2df2017-09-06 16:01:46 -040037#include "callwidget.h"
38#include "utils.h"
Edric Milaretfe390942015-08-04 13:41:03 -040039
Edric Milaret36587362016-02-04 12:30:52 -050040MainWindow::MainWindow(QWidget* parent) :
Edric Milaret627500d2015-03-27 16:41:40 -040041 QMainWindow(parent),
Nicolas Jager74fe46f2016-02-29 14:55:09 -050042 ui(new Ui::MainWindow)
Edric Milaret627500d2015-03-27 16:41:40 -040043{
44 ui->setupUi(this);
Andreas Traczyke0a60b52018-07-10 18:16:15 -040045 connect(ui->callwidget, &CallWidget::NavigationRequested,
Olivier SOLDANOc1ca2df2017-09-06 16:01:46 -040046 [this](ScreenEnum scr){Utils::slidePage(ui->navStack, ui->navStack->widget(scr));});
Andreas Traczyke0a60b52018-07-10 18:16:15 -040047 connect(ui->configurationwidget, &ConfigurationWidget::NavigationRequested,
Olivier SOLDANOc1ca2df2017-09-06 16:01:46 -040048 [this](ScreenEnum scr){Utils::slidePage(ui->navStack, ui->navStack->widget(scr));});
Edric Milaret627500d2015-03-27 16:41:40 -040049
Edric Milaret18e81842015-04-29 13:51:36 -040050 QIcon icon(":images/ring.png");
Edric Milaret627500d2015-03-27 16:41:40 -040051
52 this->setWindowIcon(icon);
53
Edric Milaret2cf34292015-06-22 16:27:03 -040054 GlobalSystemTray& sysIcon = GlobalSystemTray::instance();
55 sysIcon.setIcon(icon);
Edric Milaret627500d2015-03-27 16:41:40 -040056
Edric Milaret36587362016-02-04 12:30:52 -050057 QMenu* menu = new QMenu();
Edric Milaret2cf34292015-06-22 16:27:03 -040058
Edric Milarete14cd6b2016-04-25 11:48:28 -040059 auto configAction = new QAction(tr("Configuration"), this);
Edric Milaret2cf34292015-06-22 16:27:03 -040060 menu->addAction(configAction);
61
Edric Milarete14cd6b2016-04-25 11:48:28 -040062 auto exitAction = new QAction(tr("Exit"), this);
63 connect(exitAction, &QAction::triggered, [this](){
64 QCoreApplication::exit();
65 });
66 menu->addAction(exitAction);
67
Edric Milaret2cf34292015-06-22 16:27:03 -040068 sysIcon.setContextMenu(menu);
69 sysIcon.show();
70
71 connect(&sysIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
Edric Milaret627500d2015-03-27 16:41:40 -040072 this, SLOT(trayActivated(QSystemTrayIcon::ActivationReason)));
73
Edric Milareta3e47282015-10-23 15:20:30 -040074 connect(&CallModel::instance(), SIGNAL(incomingCall(Call*)),
Edric Milaret3a23e492015-04-29 14:23:48 -040075 this, SLOT(onIncomingCall(Call*)));
76
Edric Milaret36587362016-02-04 12:30:52 -050077#ifdef Q_OS_WIN
Edric Milareted0b2802015-10-01 15:10:02 -040078 HMENU sysMenu = ::GetSystemMenu((HWND) winId(), FALSE);
79 if (sysMenu != NULL) {
80 ::AppendMenuA(sysMenu, MF_SEPARATOR, 0, 0);
81 QString aboutTitle = tr("About");
Edric Milaret022bd512016-03-18 11:37:33 -040082 ::AppendMenuW(sysMenu, MF_STRING, IDM_ABOUTBOX, aboutTitle.toStdWString().c_str());
Edric Milareted0b2802015-10-01 15:10:02 -040083 }
84#endif
Nicolas Jager97a21b42015-12-03 16:55:45 -050085
Andreas Traczykd063d5a2018-08-10 12:56:23 -040086 readSettingsFromRegistry();
Nicolas Jager97a21b42015-12-03 16:55:45 -050087
Olivier SOLDANO257e0682016-11-09 13:59:04 -050088 win_sparkle_set_appcast_url("http://dl.ring.cx/windows/winsparkle-ring.xml");
Edric Milaret79d3f682015-12-09 12:32:52 -050089 win_sparkle_set_app_details(L"Savoir-faire Linux", L"Ring", QString(NIGHTLY_VERSION).toStdWString().c_str());
90 win_sparkle_set_shutdown_request_callback([]() {QCoreApplication::exit();});
Edric Milaret9c3e7f72016-01-27 10:48:20 -050091 win_sparkle_set_did_find_update_callback([]() {MainWindow::instance().showNormal();});
Edric Milaret79d3f682015-12-09 12:32:52 -050092 win_sparkle_init();
93
94 if (win_sparkle_get_last_check_time() == -1) {
Olivier SOLDANO5f783b62017-09-06 17:00:08 -040095 win_sparkle_set_update_check_interval(86400);
Edric Milaret79d3f682015-12-09 12:32:52 -050096 }
97
98 QObject::connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, [=]() {
99 win_sparkle_cleanup();
100 });
Edric Milaret3e1ffe62016-01-21 10:59:53 -0500101
102 setContextMenuPolicy(Qt::NoContextMenu);
Edric Milaret568a0e52016-09-02 16:26:58 -0400103
Edric Milaret568a0e52016-09-02 16:26:58 -0400104 connect(&GlobalSystemTray::instance(), SIGNAL(messageClicked()), this, SLOT(notificationClicked()));
Edric Milaret28290e32016-09-07 15:51:41 -0400105
106 connect(&netManager_, &QNetworkConfigurationManager::onlineStateChanged, [=](bool online) {
107 Q_UNUSED(online)
108 AccountModel::instance().slotConnectivityChanged();
109 });
Edric Milaret627500d2015-03-27 16:41:40 -0400110}
111
112MainWindow::~MainWindow()
113{
114 delete ui;
115}
116
Olivier SOLDANO2100f1c2017-09-06 16:45:20 -0400117bool
118MainWindow::init()
119{
120 return ui->callwidget->findRingAccount();
121}
122
Edric Milaretfe390942015-08-04 13:41:03 -0400123void
Edric Milaret36587362016-02-04 12:30:52 -0500124MainWindow::onRingEvent(const QString& uri)
Edric Milaretfe390942015-08-04 13:41:03 -0400125{
126 this->showNormal();
127 if (not uri.isEmpty()) {
128 auto outCall = CallModel::instance().dialingCall();
129 outCall->setDialNumber(uri);
130 outCall->performAction(Call::Action::ACCEPT);
131 }
132}
133
Edric Milareted0b2802015-10-01 15:10:02 -0400134bool
Edric Milaret36587362016-02-04 12:30:52 -0500135MainWindow::nativeEvent(const QByteArray& eventType, void* message, long* result)
Edric Milaret627500d2015-03-27 16:41:40 -0400136{
Edric Milareted0b2802015-10-01 15:10:02 -0400137 Q_UNUSED(eventType)
Edric Milaret627500d2015-03-27 16:41:40 -0400138
Edric Milaret36587362016-02-04 12:30:52 -0500139#ifdef Q_OS_WIN
140 MSG* msg = (MSG*) message;
Edric Milareted0b2802015-10-01 15:10:02 -0400141
142 if (msg->message == WM_SYSCOMMAND) {
143 if ((msg->wParam & 0xfff0) == IDM_ABOUTBOX) {
144 *result = 0;
145
146 AboutDialog aboutDialog;
147 aboutDialog.exec();
148
149 return true;
150 }
Edric Milaret627500d2015-03-27 16:41:40 -0400151 }
Edric Milaret36587362016-02-04 12:30:52 -0500152#else
153 Q_UNUSED(message)
154 Q_UNUSED(result)
Edric Milareted0b2802015-10-01 15:10:02 -0400155#endif
156 return false;
Edric Milaret627500d2015-03-27 16:41:40 -0400157}
158
159void
Edric Milaret2cf34292015-06-22 16:27:03 -0400160MainWindow::trayActivated(QSystemTrayIcon::ActivationReason reason)
161{
Edric Milaret627500d2015-03-27 16:41:40 -0400162 if (reason != QSystemTrayIcon::ActivationReason::Context)
163 this->show();
164}
Edric Milaret3a23e492015-04-29 14:23:48 -0400165
Edric Milaret4bba46d2015-04-29 16:33:38 -0400166void
Edric Milaret568a0e52016-09-02 16:26:58 -0400167MainWindow::notificationClicked() {
168 showNormal();
Anthony Léonardc4e65352017-05-05 15:47:52 -0400169 activateWindow();
170 raise();
Edric Milaret568a0e52016-09-02 16:26:58 -0400171}
172
173void
Edric Milaret36587362016-02-04 12:30:52 -0500174MainWindow::onIncomingCall(Call* call)
Edric Milaret2cf34292015-06-22 16:27:03 -0400175{
Edric Milaret3a23e492015-04-29 14:23:48 -0400176 Q_UNUSED(call);
177 QWidget::showNormal();
178}
Edric Milaret2cf34292015-06-22 16:27:03 -0400179
180void
181MainWindow::createThumbBar()
182{
Edric Milaret36587362016-02-04 12:30:52 -0500183#ifdef Q_OS_WIN
184 QWinThumbnailToolBar* thumbbar = new QWinThumbnailToolBar(this);
Edric Milaret2cf34292015-06-22 16:27:03 -0400185 thumbbar->setWindow(this->windowHandle());
Edric Milaret36587362016-02-04 12:30:52 -0500186 QWinThumbnailToolButton* settings = new QWinThumbnailToolButton(thumbbar);
Edric Milaret2cf34292015-06-22 16:27:03 -0400187 settings->setToolTip("Settings");
188 QIcon icon(":/images/settings.png");
189 settings->setIcon(icon);
190 settings->setDismissOnClick(true);
191 connect(settings, &QWinThumbnailToolButton::clicked, [this]() {
Olivier SOLDANOc1ca2df2017-09-06 16:01:46 -0400192 Utils::slidePage(ui->navStack, ui->configurationwidget);
Edric Milaret2cf34292015-06-22 16:27:03 -0400193 });
194
195 thumbbar->addButton(settings);
Edric Milareted0b2802015-10-01 15:10:02 -0400196#endif
Edric Milaret2cf34292015-06-22 16:27:03 -0400197}
Nicolas Jager97a21b42015-12-03 16:55:45 -0500198
199void
200MainWindow::switchNormalMaximize()
201{
202 if(isMaximized())
203 showNormal();
204 else
205 showMaximized();
206}
Edric Milaretdb818e52016-02-02 14:53:19 -0500207
208void
209MainWindow::closeEvent(QCloseEvent* event)
210{
211 QSettings settings;
212 if (settings.value(SettingsKey::closeOrMinimized).toBool()) {
213 this->hide();
214 event->ignore();
Edric Milaretcb364742016-03-15 16:45:16 -0400215 } else {
Andreas Traczykfdc7f9b2018-08-14 18:42:03 -0400216 settings.setValue(SettingsKey::geometry, saveGeometry());
Andreas Traczykd063d5a2018-08-10 12:56:23 -0400217 settings.setValue(SettingsKey::windowState, saveState());
Edric Milaretdb818e52016-02-02 14:53:19 -0500218 }
Andreas Traczykd063d5a2018-08-10 12:56:23 -0400219 QMainWindow::closeEvent(event);
Edric Milaretdb818e52016-02-02 14:53:19 -0500220}
Andreas Traczykd063d5a2018-08-10 12:56:23 -0400221
Andreas Traczykfdc7f9b2018-08-14 18:42:03 -0400222void
223MainWindow::readSettingsFromRegistry()
224{
225 QSettings settings;
226 restoreGeometry(settings.value(SettingsKey::geometry).toByteArray());
227 restoreState(settings.value(SettingsKey::windowState).toByteArray());
Andreas Traczykd063d5a2018-08-10 12:56:23 -0400228 if (not settings.contains(SettingsKey::enableNotifications)) {
229 settings.setValue(SettingsKey::enableNotifications, true);
Andreas Traczykfdc7f9b2018-08-14 18:42:03 -0400230 }
Andreas Traczykd063d5a2018-08-10 12:56:23 -0400231}