blob: e05a432765a1280d18739d79371d208be90fdaa1 [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
Nicolas Jager74fe46f2016-02-29 14:55:09 -05002 * Copyright (C) 2015-2016 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"
37
Edric Milaret36587362016-02-04 12:30:52 -050038MainWindow::MainWindow(QWidget* parent) :
Edric Milaret627500d2015-03-27 16:41:40 -040039 QMainWindow(parent),
Nicolas Jager74fe46f2016-02-29 14:55:09 -050040 ui(new Ui::MainWindow)
Edric Milaret627500d2015-03-27 16:41:40 -040041{
42 ui->setupUi(this);
43
Edric Milaret18e81842015-04-29 13:51:36 -040044 QIcon icon(":images/ring.png");
Edric Milaret627500d2015-03-27 16:41:40 -040045
46 this->setWindowIcon(icon);
47
Edric Milaret2cf34292015-06-22 16:27:03 -040048 GlobalSystemTray& sysIcon = GlobalSystemTray::instance();
49 sysIcon.setIcon(icon);
Edric Milaret627500d2015-03-27 16:41:40 -040050
Edric Milaret36587362016-02-04 12:30:52 -050051 QMenu* menu = new QMenu();
Edric Milaret2cf34292015-06-22 16:27:03 -040052
Edric Milarete14cd6b2016-04-25 11:48:28 -040053 auto configAction = new QAction(tr("Configuration"), this);
Edric Milaret2cf34292015-06-22 16:27:03 -040054 menu->addAction(configAction);
55
Edric Milarete14cd6b2016-04-25 11:48:28 -040056 auto exitAction = new QAction(tr("Exit"), this);
57 connect(exitAction, &QAction::triggered, [this](){
58 QCoreApplication::exit();
59 });
60 menu->addAction(exitAction);
61
Edric Milaret2cf34292015-06-22 16:27:03 -040062 sysIcon.setContextMenu(menu);
63 sysIcon.show();
64
65 connect(&sysIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
Edric Milaret627500d2015-03-27 16:41:40 -040066 this, SLOT(trayActivated(QSystemTrayIcon::ActivationReason)));
67
Edric Milareta3e47282015-10-23 15:20:30 -040068 connect(&CallModel::instance(), SIGNAL(incomingCall(Call*)),
Edric Milaret3a23e492015-04-29 14:23:48 -040069 this, SLOT(onIncomingCall(Call*)));
70
Nicolas Jager74fe46f2016-02-29 14:55:09 -050071 navStack_ = new NavStack(ui->stackedWidgetView, this);
Edric Milaret2cf34292015-06-22 16:27:03 -040072 connect(configAction, &QAction::triggered, [this]() {
73 navStack_->onNavigationRequested(ScreenEnum::ConfScreen);
74 });
Edric Milareted0b2802015-10-01 15:10:02 -040075
Edric Milaret36587362016-02-04 12:30:52 -050076#ifdef Q_OS_WIN
Edric Milareted0b2802015-10-01 15:10:02 -040077 HMENU sysMenu = ::GetSystemMenu((HWND) winId(), FALSE);
78 if (sysMenu != NULL) {
79 ::AppendMenuA(sysMenu, MF_SEPARATOR, 0, 0);
80 QString aboutTitle = tr("About");
Edric Milaret022bd512016-03-18 11:37:33 -040081 ::AppendMenuW(sysMenu, MF_STRING, IDM_ABOUTBOX, aboutTitle.toStdWString().c_str());
Edric Milareted0b2802015-10-01 15:10:02 -040082 }
83#endif
Nicolas Jager97a21b42015-12-03 16:55:45 -050084
Edric Milaretcb364742016-03-15 16:45:16 -040085 QSettings settings;
86 QVariant size = settings.value(SettingsKey::savedSize);
Edric Milaret06c531a2016-05-06 13:27:37 -040087 QVariant posV = settings.value(SettingsKey::savedPos);
88 if (size.isValid() && posV.isValid()) {
Edric Milaretcb364742016-03-15 16:45:16 -040089 resize(size.toSize());
Edric Milaret06c531a2016-05-06 13:27:37 -040090 auto screenSize = QApplication::desktop()->screenGeometry();
91 auto pos = posV.toPoint();
92 if (pos.rx() < screenSize.width() && pos.ry() < screenSize.height())
93 move(pos);
Edric Milaretcb364742016-03-15 16:45:16 -040094 } else
95 resize(1054, 600);
Nicolas Jager97a21b42015-12-03 16:55:45 -050096
Olivier SOLDANO257e0682016-11-09 13:59:04 -050097 win_sparkle_set_appcast_url("http://dl.ring.cx/windows/winsparkle-ring.xml");
Edric Milaret79d3f682015-12-09 12:32:52 -050098 win_sparkle_set_app_details(L"Savoir-faire Linux", L"Ring", QString(NIGHTLY_VERSION).toStdWString().c_str());
99 win_sparkle_set_shutdown_request_callback([]() {QCoreApplication::exit();});
Edric Milaret9c3e7f72016-01-27 10:48:20 -0500100 win_sparkle_set_did_find_update_callback([]() {MainWindow::instance().showNormal();});
Edric Milaret79d3f682015-12-09 12:32:52 -0500101 win_sparkle_init();
102
103 if (win_sparkle_get_last_check_time() == -1) {
104 win_sparkle_set_update_check_interval(7 * 86400);
105 }
106
107 QObject::connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, [=]() {
108 win_sparkle_cleanup();
109 });
Edric Milaret3e1ffe62016-01-21 10:59:53 -0500110
111 setContextMenuPolicy(Qt::NoContextMenu);
Edric Milaret568a0e52016-09-02 16:26:58 -0400112
113 if (not settings.contains(SettingsKey::enableNotifications)) {
114 settings.setValue(SettingsKey::enableNotifications, true);
115 }
116 connect(&GlobalSystemTray::instance(), SIGNAL(messageClicked()), this, SLOT(notificationClicked()));
Edric Milaret28290e32016-09-07 15:51:41 -0400117
118 connect(&netManager_, &QNetworkConfigurationManager::onlineStateChanged, [=](bool online) {
119 Q_UNUSED(online)
120 AccountModel::instance().slotConnectivityChanged();
121 });
122
Edric Milaret627500d2015-03-27 16:41:40 -0400123}
124
125MainWindow::~MainWindow()
126{
127 delete ui;
Edric Milaret01f23842015-06-22 14:46:01 -0400128 delete navStack_;
Edric Milaret627500d2015-03-27 16:41:40 -0400129}
130
Edric Milaretfe390942015-08-04 13:41:03 -0400131void
Edric Milaret36587362016-02-04 12:30:52 -0500132MainWindow::onRingEvent(const QString& uri)
Edric Milaretfe390942015-08-04 13:41:03 -0400133{
134 this->showNormal();
135 if (not uri.isEmpty()) {
136 auto outCall = CallModel::instance().dialingCall();
137 outCall->setDialNumber(uri);
138 outCall->performAction(Call::Action::ACCEPT);
139 }
140}
141
Edric Milareted0b2802015-10-01 15:10:02 -0400142bool
Edric Milaret36587362016-02-04 12:30:52 -0500143MainWindow::nativeEvent(const QByteArray& eventType, void* message, long* result)
Edric Milaret627500d2015-03-27 16:41:40 -0400144{
Edric Milareted0b2802015-10-01 15:10:02 -0400145 Q_UNUSED(eventType)
Edric Milaret627500d2015-03-27 16:41:40 -0400146
Edric Milaret36587362016-02-04 12:30:52 -0500147#ifdef Q_OS_WIN
148 MSG* msg = (MSG*) message;
Edric Milareted0b2802015-10-01 15:10:02 -0400149
150 if (msg->message == WM_SYSCOMMAND) {
151 if ((msg->wParam & 0xfff0) == IDM_ABOUTBOX) {
152 *result = 0;
153
154 AboutDialog aboutDialog;
155 aboutDialog.exec();
156
157 return true;
158 }
Edric Milaret627500d2015-03-27 16:41:40 -0400159 }
Edric Milaret36587362016-02-04 12:30:52 -0500160#else
161 Q_UNUSED(message)
162 Q_UNUSED(result)
Edric Milareted0b2802015-10-01 15:10:02 -0400163#endif
164 return false;
Edric Milaret627500d2015-03-27 16:41:40 -0400165}
166
167void
Edric Milaret2cf34292015-06-22 16:27:03 -0400168MainWindow::trayActivated(QSystemTrayIcon::ActivationReason reason)
169{
Edric Milaret627500d2015-03-27 16:41:40 -0400170 if (reason != QSystemTrayIcon::ActivationReason::Context)
171 this->show();
172}
Edric Milaret3a23e492015-04-29 14:23:48 -0400173
Edric Milaret4bba46d2015-04-29 16:33:38 -0400174void
Edric Milaret568a0e52016-09-02 16:26:58 -0400175MainWindow::notificationClicked() {
176 showNormal();
177}
178
179void
Edric Milaret36587362016-02-04 12:30:52 -0500180MainWindow::onIncomingCall(Call* call)
Edric Milaret2cf34292015-06-22 16:27:03 -0400181{
Edric Milaret3a23e492015-04-29 14:23:48 -0400182 Q_UNUSED(call);
183 QWidget::showNormal();
184}
Edric Milaret2cf34292015-06-22 16:27:03 -0400185
186void
187MainWindow::createThumbBar()
188{
Edric Milaret36587362016-02-04 12:30:52 -0500189#ifdef Q_OS_WIN
190 QWinThumbnailToolBar* thumbbar = new QWinThumbnailToolBar(this);
Edric Milaret2cf34292015-06-22 16:27:03 -0400191 thumbbar->setWindow(this->windowHandle());
Edric Milaret36587362016-02-04 12:30:52 -0500192 QWinThumbnailToolButton* settings = new QWinThumbnailToolButton(thumbbar);
Edric Milaret2cf34292015-06-22 16:27:03 -0400193 settings->setToolTip("Settings");
194 QIcon icon(":/images/settings.png");
195 settings->setIcon(icon);
196 settings->setDismissOnClick(true);
197 connect(settings, &QWinThumbnailToolButton::clicked, [this]() {
198 navStack_->onNavigationRequested(ScreenEnum::ConfScreen);
199 });
200
201 thumbbar->addButton(settings);
Edric Milareted0b2802015-10-01 15:10:02 -0400202#endif
Edric Milaret2cf34292015-06-22 16:27:03 -0400203}
Nicolas Jager97a21b42015-12-03 16:55:45 -0500204
205void
206MainWindow::switchNormalMaximize()
207{
208 if(isMaximized())
209 showNormal();
210 else
211 showMaximized();
212}
Edric Milaretdb818e52016-02-02 14:53:19 -0500213
214void
215MainWindow::closeEvent(QCloseEvent* event)
216{
217 QSettings settings;
218 if (settings.value(SettingsKey::closeOrMinimized).toBool()) {
219 this->hide();
220 event->ignore();
Edric Milaretcb364742016-03-15 16:45:16 -0400221 } else {
222 settings.setValue(SettingsKey::savedSize, size());
223 settings.setValue(SettingsKey::savedPos, pos());
Edric Milaretdb818e52016-02-02 14:53:19 -0500224 }
225}