blob: ef3171bb28929991c428375d7f05bb3cb547a768 [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>*
Andreas Traczykb8b13ba2018-08-21 16:30:16 -04004 * Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com> *
Edric Milaret627500d2015-03-27 16:41:40 -04005 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 3 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
18 **************************************************************************/
19
20#include "mainwindow.h"
21#include "ui_mainwindow.h"
22
Edric Milaret06c531a2016-05-06 13:27:37 -040023#include <QDesktopWidget>
Edric Milaret2cf34292015-06-22 16:27:03 -040024
25#include "media/text.h"
26#include "media/textrecording.h"
Edric Milaret627500d2015-03-27 16:41:40 -040027
Edric Milaret36587362016-02-04 12:30:52 -050028#ifdef Q_OS_WIN
Edric Milareted0b2802015-10-01 15:10:02 -040029#include <windows.h>
30#include <QWinThumbnailToolBar>
31#include <QWinThumbnailToolButton>
32#endif
33
Nicolas Jager97a21b42015-12-03 16:55:45 -050034#include "aboutdialog.h"
Edric Milaretdb818e52016-02-02 14:53:19 -050035#include "settingskey.h"
Edric Milaret79d3f682015-12-09 12:32:52 -050036#include "winsparkle.h"
Edric Milaretfe390942015-08-04 13:41:03 -040037#include "callmodel.h"
Olivier SOLDANOc1ca2df2017-09-06 16:01:46 -040038#include "callwidget.h"
39#include "utils.h"
Andreas Traczyk55f92cb2018-10-23 12:26:25 -040040#include "wizarddialog.h"
Andreas Traczyk43c08232018-10-31 13:42:09 -040041#include "version.h"
Isa Nanic6e4a39a2018-12-04 14:26:02 -050042#include "settingswidget.h"
Edric Milaretfe390942015-08-04 13:41:03 -040043
Edric Milaret36587362016-02-04 12:30:52 -050044MainWindow::MainWindow(QWidget* parent) :
Edric Milaret627500d2015-03-27 16:41:40 -040045 QMainWindow(parent),
Isa Nanic6e4a39a2018-12-04 14:26:02 -050046
Nicolas Jager74fe46f2016-02-29 14:55:09 -050047 ui(new Ui::MainWindow)
Edric Milaret627500d2015-03-27 16:41:40 -040048{
49 ui->setupUi(this);
Andreas Traczykb8b13ba2018-08-21 16:30:16 -040050
Andreas Traczyk55f92cb2018-10-23 12:26:25 -040051 connect(ui->wizardwidget, &WizardWidget::NavigationRequested,
52 [this](ScreenEnum scr) {
53 Utils::setStackWidget(ui->navStack, ui->navStack->widget(scr));
54 });
55
Andreas Traczyke0a60b52018-07-10 18:16:15 -040056 connect(ui->callwidget, &CallWidget::NavigationRequested,
Andreas Traczykb8b13ba2018-08-21 16:30:16 -040057 [this](ScreenEnum scr) {
58 Utils::setStackWidget(ui->navStack, ui->navStack->widget(scr));
59 });
60
Isa Nanic6e4a39a2018-12-04 14:26:02 -050061 connect(ui->settingswidget, &SettingsWidget::NavigationRequested,
Andreas Traczykb8b13ba2018-08-21 16:30:16 -040062 [this](ScreenEnum scr) {
63 Utils::setStackWidget(ui->navStack, ui->navStack->widget(scr));
64 if (scr == ScreenEnum::CallScreen) {
65 ui->callwidget->update();
66 }
67 });
Edric Milaret627500d2015-03-27 16:41:40 -040068
Isa Nanic6e4a39a2018-12-04 14:26:02 -050069 connect(ui->callwidget, &CallWidget::setLeftSizeWidget, [=](int size) {
70 ui->settingswidget->updateSettings(size);
71 }
72 );
73
Edric Milaret18e81842015-04-29 13:51:36 -040074 QIcon icon(":images/ring.png");
Edric Milaret627500d2015-03-27 16:41:40 -040075
76 this->setWindowIcon(icon);
77
Edric Milaret2cf34292015-06-22 16:27:03 -040078 GlobalSystemTray& sysIcon = GlobalSystemTray::instance();
79 sysIcon.setIcon(icon);
Edric Milaret627500d2015-03-27 16:41:40 -040080
Edric Milaret36587362016-02-04 12:30:52 -050081 QMenu* menu = new QMenu();
Edric Milaret2cf34292015-06-22 16:27:03 -040082
Edric Milarete14cd6b2016-04-25 11:48:28 -040083 auto configAction = new QAction(tr("Configuration"), this);
Edric Milaret2cf34292015-06-22 16:27:03 -040084 menu->addAction(configAction);
85
Edric Milarete14cd6b2016-04-25 11:48:28 -040086 auto exitAction = new QAction(tr("Exit"), this);
87 connect(exitAction, &QAction::triggered, [this](){
88 QCoreApplication::exit();
89 });
90 menu->addAction(exitAction);
91
Edric Milaret2cf34292015-06-22 16:27:03 -040092 sysIcon.setContextMenu(menu);
93 sysIcon.show();
94
95 connect(&sysIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
Edric Milaret627500d2015-03-27 16:41:40 -040096 this, SLOT(trayActivated(QSystemTrayIcon::ActivationReason)));
97
Edric Milareta3e47282015-10-23 15:20:30 -040098 connect(&CallModel::instance(), SIGNAL(incomingCall(Call*)),
Edric Milaret3a23e492015-04-29 14:23:48 -040099 this, SLOT(onIncomingCall(Call*)));
100
Edric Milaret36587362016-02-04 12:30:52 -0500101#ifdef Q_OS_WIN
Edric Milareted0b2802015-10-01 15:10:02 -0400102 HMENU sysMenu = ::GetSystemMenu((HWND) winId(), FALSE);
103 if (sysMenu != NULL) {
104 ::AppendMenuA(sysMenu, MF_SEPARATOR, 0, 0);
105 QString aboutTitle = tr("About");
Edric Milaret022bd512016-03-18 11:37:33 -0400106 ::AppendMenuW(sysMenu, MF_STRING, IDM_ABOUTBOX, aboutTitle.toStdWString().c_str());
Edric Milareted0b2802015-10-01 15:10:02 -0400107 }
108#endif
Nicolas Jager97a21b42015-12-03 16:55:45 -0500109
Andreas Traczykd063d5a2018-08-10 12:56:23 -0400110 readSettingsFromRegistry();
Nicolas Jager97a21b42015-12-03 16:55:45 -0500111
Olivier SOLDANO257e0682016-11-09 13:59:04 -0500112 win_sparkle_set_appcast_url("http://dl.ring.cx/windows/winsparkle-ring.xml");
Andreas Traczyk43c08232018-10-31 13:42:09 -0400113 win_sparkle_set_app_details(L"Savoir-faire Linux", L"Ring", QString(VERSION_STRING).toStdWString().c_str());
Edric Milaret79d3f682015-12-09 12:32:52 -0500114 win_sparkle_set_shutdown_request_callback([]() {QCoreApplication::exit();});
Edric Milaret9c3e7f72016-01-27 10:48:20 -0500115 win_sparkle_set_did_find_update_callback([]() {MainWindow::instance().showNormal();});
Edric Milaret79d3f682015-12-09 12:32:52 -0500116 win_sparkle_init();
117
118 if (win_sparkle_get_last_check_time() == -1) {
Olivier SOLDANO5f783b62017-09-06 17:00:08 -0400119 win_sparkle_set_update_check_interval(86400);
Edric Milaret79d3f682015-12-09 12:32:52 -0500120 }
121
122 QObject::connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, [=]() {
123 win_sparkle_cleanup();
124 });
Edric Milaret3e1ffe62016-01-21 10:59:53 -0500125
126 setContextMenuPolicy(Qt::NoContextMenu);
Edric Milaret568a0e52016-09-02 16:26:58 -0400127
Edric Milaret568a0e52016-09-02 16:26:58 -0400128 connect(&GlobalSystemTray::instance(), SIGNAL(messageClicked()), this, SLOT(notificationClicked()));
Edric Milaret28290e32016-09-07 15:51:41 -0400129
130 connect(&netManager_, &QNetworkConfigurationManager::onlineStateChanged, [=](bool online) {
131 Q_UNUSED(online)
132 AccountModel::instance().slotConnectivityChanged();
133 });
Andreas Traczyk55f92cb2018-10-23 12:26:25 -0400134
135 auto accountList = LRCInstance::accountModel().getAccountList();
136 if (accountList.size()) {
137 for (const auto& accountId : accountList) {
138 auto& accountInfo = LRCInstance::accountModel().getAccountInfo(accountId);
139 if (accountInfo.profileInfo.type == lrc::api::profile::Type::RING) {
140 if (accountInfo.status == lrc::api::account::Status::ERROR_NEED_MIGRATION) {
141 WizardDialog dlg(WizardDialog::MIGRATION);
142 dlg.exec();
143 }
144 }
145 }
146 Utils::setStackWidget(ui->navStack, ui->navStack->widget(ScreenEnum::CallScreen));
147 } else {
148 Utils::setStackWidget(ui->navStack, ui->navStack->widget(ScreenEnum::WizardScreen));
149 }
Edric Milaret627500d2015-03-27 16:41:40 -0400150}
151
152MainWindow::~MainWindow()
153{
154 delete ui;
155}
156
Edric Milaretfe390942015-08-04 13:41:03 -0400157void
Edric Milaret36587362016-02-04 12:30:52 -0500158MainWindow::onRingEvent(const QString& uri)
Edric Milaretfe390942015-08-04 13:41:03 -0400159{
160 this->showNormal();
161 if (not uri.isEmpty()) {
162 auto outCall = CallModel::instance().dialingCall();
163 outCall->setDialNumber(uri);
164 outCall->performAction(Call::Action::ACCEPT);
165 }
166}
167
Edric Milareted0b2802015-10-01 15:10:02 -0400168bool
Edric Milaret36587362016-02-04 12:30:52 -0500169MainWindow::nativeEvent(const QByteArray& eventType, void* message, long* result)
Edric Milaret627500d2015-03-27 16:41:40 -0400170{
Edric Milareted0b2802015-10-01 15:10:02 -0400171 Q_UNUSED(eventType)
Edric Milaret627500d2015-03-27 16:41:40 -0400172
Edric Milaret36587362016-02-04 12:30:52 -0500173#ifdef Q_OS_WIN
174 MSG* msg = (MSG*) message;
Edric Milareted0b2802015-10-01 15:10:02 -0400175
176 if (msg->message == WM_SYSCOMMAND) {
177 if ((msg->wParam & 0xfff0) == IDM_ABOUTBOX) {
178 *result = 0;
179
180 AboutDialog aboutDialog;
181 aboutDialog.exec();
182
183 return true;
184 }
Edric Milaret627500d2015-03-27 16:41:40 -0400185 }
Edric Milaret36587362016-02-04 12:30:52 -0500186#else
187 Q_UNUSED(message)
188 Q_UNUSED(result)
Edric Milareted0b2802015-10-01 15:10:02 -0400189#endif
190 return false;
Edric Milaret627500d2015-03-27 16:41:40 -0400191}
192
193void
Edric Milaret2cf34292015-06-22 16:27:03 -0400194MainWindow::trayActivated(QSystemTrayIcon::ActivationReason reason)
195{
Edric Milaret627500d2015-03-27 16:41:40 -0400196 if (reason != QSystemTrayIcon::ActivationReason::Context)
197 this->show();
198}
Edric Milaret3a23e492015-04-29 14:23:48 -0400199
Edric Milaret4bba46d2015-04-29 16:33:38 -0400200void
Edric Milaret568a0e52016-09-02 16:26:58 -0400201MainWindow::notificationClicked() {
202 showNormal();
Anthony Léonardc4e65352017-05-05 15:47:52 -0400203 activateWindow();
204 raise();
Edric Milaret568a0e52016-09-02 16:26:58 -0400205}
206
207void
Edric Milaret36587362016-02-04 12:30:52 -0500208MainWindow::onIncomingCall(Call* call)
Edric Milaret2cf34292015-06-22 16:27:03 -0400209{
Edric Milaret3a23e492015-04-29 14:23:48 -0400210 Q_UNUSED(call);
211 QWidget::showNormal();
212}
Edric Milaret2cf34292015-06-22 16:27:03 -0400213
214void
215MainWindow::createThumbBar()
216{
Edric Milaret36587362016-02-04 12:30:52 -0500217#ifdef Q_OS_WIN
218 QWinThumbnailToolBar* thumbbar = new QWinThumbnailToolBar(this);
Edric Milaret2cf34292015-06-22 16:27:03 -0400219 thumbbar->setWindow(this->windowHandle());
Edric Milaret36587362016-02-04 12:30:52 -0500220 QWinThumbnailToolButton* settings = new QWinThumbnailToolButton(thumbbar);
Edric Milaret2cf34292015-06-22 16:27:03 -0400221 settings->setToolTip("Settings");
222 QIcon icon(":/images/settings.png");
223 settings->setIcon(icon);
224 settings->setDismissOnClick(true);
225 connect(settings, &QWinThumbnailToolButton::clicked, [this]() {
Andreas Traczyk7548e732018-12-12 10:47:21 -0500226 Utils::setStackWidget(ui->navStack, ui->settingswidget);
Edric Milaret2cf34292015-06-22 16:27:03 -0400227 });
228
229 thumbbar->addButton(settings);
Edric Milareted0b2802015-10-01 15:10:02 -0400230#endif
Edric Milaret2cf34292015-06-22 16:27:03 -0400231}
Nicolas Jager97a21b42015-12-03 16:55:45 -0500232
233void
234MainWindow::switchNormalMaximize()
235{
236 if(isMaximized())
237 showNormal();
238 else
239 showMaximized();
240}
Edric Milaretdb818e52016-02-02 14:53:19 -0500241
242void
243MainWindow::closeEvent(QCloseEvent* event)
244{
Andreas Traczyk55f92cb2018-10-23 12:26:25 -0400245 Video::PreviewManager::instance().stopPreview();
Edric Milaretdb818e52016-02-02 14:53:19 -0500246 QSettings settings;
247 if (settings.value(SettingsKey::closeOrMinimized).toBool()) {
248 this->hide();
249 event->ignore();
Edric Milaretcb364742016-03-15 16:45:16 -0400250 } else {
Andreas Traczykfdc7f9b2018-08-14 18:42:03 -0400251 settings.setValue(SettingsKey::geometry, saveGeometry());
Andreas Traczykd063d5a2018-08-10 12:56:23 -0400252 settings.setValue(SettingsKey::windowState, saveState());
Edric Milaretdb818e52016-02-02 14:53:19 -0500253 }
Andreas Traczyk43c08232018-10-31 13:42:09 -0400254 LRCInstance::reset();
Andreas Traczykd063d5a2018-08-10 12:56:23 -0400255 QMainWindow::closeEvent(event);
Edric Milaretdb818e52016-02-02 14:53:19 -0500256}
Andreas Traczykd063d5a2018-08-10 12:56:23 -0400257
Andreas Traczykfdc7f9b2018-08-14 18:42:03 -0400258void
259MainWindow::readSettingsFromRegistry()
260{
261 QSettings settings;
262 restoreGeometry(settings.value(SettingsKey::geometry).toByteArray());
263 restoreState(settings.value(SettingsKey::windowState).toByteArray());
Andreas Traczykd063d5a2018-08-10 12:56:23 -0400264 if (not settings.contains(SettingsKey::enableNotifications)) {
265 settings.setValue(SettingsKey::enableNotifications, true);
Andreas Traczykfdc7f9b2018-08-14 18:42:03 -0400266 }
Andreas Traczykd063d5a2018-08-10 12:56:23 -0400267}