blob: edbb96efcbca464252d8609e9e95ff0f93add0ae [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
Edric Milaretbab169d2016-01-07 15:13:33 -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
22#include <QSizeGrip>
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 Milareted0b2802015-10-01 15:10:02 -040027#ifdef Q_OS_WIN32
28#include <windows.h>
29#include <QWinThumbnailToolBar>
30#include <QWinThumbnailToolButton>
31#endif
32
Nicolas Jager97a21b42015-12-03 16:55:45 -050033#include "aboutdialog.h"
34#include "mainwindowtoolbar.h"
Edric Milaretdb818e52016-02-02 14:53:19 -050035#include "settingskey.h"
Nicolas Jager97a21b42015-12-03 16:55:45 -050036
Edric Milaret79d3f682015-12-09 12:32:52 -050037#ifdef ENABLE_AUTOUPDATE
38#include "winsparkle.h"
39#endif
40
Edric Milaretfe390942015-08-04 13:41:03 -040041#include "callmodel.h"
42
43#include <windows.h>
44
Edric Milaret627500d2015-03-27 16:41:40 -040045MainWindow::MainWindow(QWidget *parent) :
46 QMainWindow(parent),
Nicolas Jager97a21b42015-12-03 16:55:45 -050047 ui(new Ui::MainWindow),
48 mwToolBar_(new MainWindowToolBar)
Edric Milaret627500d2015-03-27 16:41:40 -040049{
50 ui->setupUi(this);
51
Edric Milaret18e81842015-04-29 13:51:36 -040052 QIcon icon(":images/ring.png");
Edric Milaret627500d2015-03-27 16:41:40 -040053
54 this->setWindowIcon(icon);
55
Edric Milaret2cf34292015-06-22 16:27:03 -040056 GlobalSystemTray& sysIcon = GlobalSystemTray::instance();
57 sysIcon.setIcon(icon);
Edric Milaret627500d2015-03-27 16:41:40 -040058
Edric Milaret2cf34292015-06-22 16:27:03 -040059 QMenu *menu = new QMenu();
60
61 auto configAction = new QAction("Configuration", this);
62 menu->addAction(configAction);
63
Edric Milaret2cf34292015-06-22 16:27:03 -040064 sysIcon.setContextMenu(menu);
65 sysIcon.show();
66
67 connect(&sysIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
Edric Milaret627500d2015-03-27 16:41:40 -040068 this, SLOT(trayActivated(QSystemTrayIcon::ActivationReason)));
69
Edric Milareta3e47282015-10-23 15:20:30 -040070 connect(&CallModel::instance(), SIGNAL(incomingCall(Call*)),
Edric Milaret3a23e492015-04-29 14:23:48 -040071 this, SLOT(onIncomingCall(Call*)));
72
Edric Milaret627500d2015-03-27 16:41:40 -040073 navStack_ = new NavStack(ui->bar, ui->stackedWidgetView, this);
Edric Milaret2cf34292015-06-22 16:27:03 -040074 connect(configAction, &QAction::triggered, [this]() {
75 navStack_->onNavigationRequested(ScreenEnum::ConfScreen);
76 });
Edric Milareted0b2802015-10-01 15:10:02 -040077
78#ifdef Q_OS_WIN32
79 HMENU sysMenu = ::GetSystemMenu((HWND) winId(), FALSE);
80 if (sysMenu != NULL) {
81 ::AppendMenuA(sysMenu, MF_SEPARATOR, 0, 0);
82 QString aboutTitle = tr("About");
83 ::AppendMenuA(sysMenu, MF_STRING, IDM_ABOUTBOX, aboutTitle.toStdString().c_str());
84 }
85#endif
Nicolas Jager97a21b42015-12-03 16:55:45 -050086
87 resize(1054, 600);
88
89 addToolBar(static_cast<QToolBar*>(mwToolBar_));
90
91 auto callWidget = static_cast<CallWidget*>(navStack_->getNavWidget(ScreenEnum::CallScreen));
92
93 connect(mwToolBar_->getSettingsButton(), &QAction::triggered,
Edric Milaret33cb4832016-01-08 10:14:14 -050094 callWidget, &CallWidget::settingsButton_clicked);
Nicolas Jager97a21b42015-12-03 16:55:45 -050095 connect(mwToolBar_->getHistoryButton(), &QAction::triggered,
Edric Milaret33cb4832016-01-08 10:14:14 -050096 callWidget, &CallWidget::historicButton_clicked);
Nicolas Jager97a21b42015-12-03 16:55:45 -050097 connect(mwToolBar_->getContactListButton(), &QAction::triggered,
Edric Milaret33cb4832016-01-08 10:14:14 -050098 callWidget, &CallWidget::contactButton_clicked);
Edric Milaret79d3f682015-12-09 12:32:52 -050099
100#ifdef ENABLE_AUTOUPDATE
101 win_sparkle_set_appcast_url("http://gpl.savoirfairelinux.net/ring-download/windows/winsparkle-ring.xml");
102 win_sparkle_set_app_details(L"Savoir-faire Linux", L"Ring", QString(NIGHTLY_VERSION).toStdWString().c_str());
103 win_sparkle_set_shutdown_request_callback([]() {QCoreApplication::exit();});
Edric Milaret9c3e7f72016-01-27 10:48:20 -0500104 win_sparkle_set_did_find_update_callback([]() {MainWindow::instance().showNormal();});
Edric Milaret79d3f682015-12-09 12:32:52 -0500105 win_sparkle_init();
106
107 if (win_sparkle_get_last_check_time() == -1) {
108 win_sparkle_set_update_check_interval(7 * 86400);
109 }
110
111 QObject::connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, [=]() {
112 win_sparkle_cleanup();
113 });
114#endif
Edric Milaret3e1ffe62016-01-21 10:59:53 -0500115
116 setContextMenuPolicy(Qt::NoContextMenu);
Edric Milaret627500d2015-03-27 16:41:40 -0400117}
118
119MainWindow::~MainWindow()
120{
121 delete ui;
Edric Milaret01f23842015-06-22 14:46:01 -0400122 delete navStack_;
Edric Milaret627500d2015-03-27 16:41:40 -0400123}
124
Edric Milaretfe390942015-08-04 13:41:03 -0400125void
126MainWindow::onRingEvent(const QString &uri)
127{
128 this->showNormal();
129 if (not uri.isEmpty()) {
130 auto outCall = CallModel::instance().dialingCall();
131 outCall->setDialNumber(uri);
132 outCall->performAction(Call::Action::ACCEPT);
133 }
134}
135
Edric Milareted0b2802015-10-01 15:10:02 -0400136bool
137MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
Edric Milaret627500d2015-03-27 16:41:40 -0400138{
Edric Milareted0b2802015-10-01 15:10:02 -0400139 Q_UNUSED(eventType)
Edric Milaret627500d2015-03-27 16:41:40 -0400140
Edric Milareted0b2802015-10-01 15:10:02 -0400141#ifdef Q_OS_WIN32
142 MSG *msg = (MSG*) message;
143
144 if (msg->message == WM_SYSCOMMAND) {
145 if ((msg->wParam & 0xfff0) == IDM_ABOUTBOX) {
146 *result = 0;
147
148 AboutDialog aboutDialog;
149 aboutDialog.exec();
150
151 return true;
152 }
Edric Milaret627500d2015-03-27 16:41:40 -0400153 }
Edric Milareted0b2802015-10-01 15:10:02 -0400154#endif
155 return false;
Edric Milaret627500d2015-03-27 16:41:40 -0400156}
157
158void
Edric Milaret2cf34292015-06-22 16:27:03 -0400159MainWindow::trayActivated(QSystemTrayIcon::ActivationReason reason)
160{
Edric Milaret627500d2015-03-27 16:41:40 -0400161 if (reason != QSystemTrayIcon::ActivationReason::Context)
162 this->show();
163}
Edric Milaret3a23e492015-04-29 14:23:48 -0400164
Edric Milaret4bba46d2015-04-29 16:33:38 -0400165void
Edric Milaret2cf34292015-06-22 16:27:03 -0400166MainWindow::onIncomingCall(Call *call)
167{
Edric Milaret3a23e492015-04-29 14:23:48 -0400168 Q_UNUSED(call);
169 QWidget::showNormal();
170}
Edric Milaret2cf34292015-06-22 16:27:03 -0400171
172void
173MainWindow::createThumbBar()
174{
Edric Milareted0b2802015-10-01 15:10:02 -0400175#ifdef Q_OS_WIN32
Edric Milaret2cf34292015-06-22 16:27:03 -0400176 QWinThumbnailToolBar *thumbbar = new QWinThumbnailToolBar(this);
177 thumbbar->setWindow(this->windowHandle());
178 QWinThumbnailToolButton *settings = new QWinThumbnailToolButton(thumbbar);
179 settings->setToolTip("Settings");
180 QIcon icon(":/images/settings.png");
181 settings->setIcon(icon);
182 settings->setDismissOnClick(true);
183 connect(settings, &QWinThumbnailToolButton::clicked, [this]() {
184 navStack_->onNavigationRequested(ScreenEnum::ConfScreen);
185 });
186
187 thumbbar->addButton(settings);
Edric Milareted0b2802015-10-01 15:10:02 -0400188#endif
Edric Milaret2cf34292015-06-22 16:27:03 -0400189}
Nicolas Jager97a21b42015-12-03 16:55:45 -0500190
191void
192MainWindow::switchNormalMaximize()
193{
194 if(isMaximized())
195 showNormal();
196 else
197 showMaximized();
198}
Edric Milaretdb818e52016-02-02 14:53:19 -0500199
200void
201MainWindow::closeEvent(QCloseEvent* event)
202{
203 QSettings settings;
204 if (settings.value(SettingsKey::closeOrMinimized).toBool()) {
205 this->hide();
206 event->ignore();
207 }
208}