1
//MountManager - the program for easy mounting of storage devices in Linux
2
//Copyright (C) 2007-2008 Tikhonov Sergey
4
//This file is part of MountManager Gui
6
//This program is free software; you can redistribute it and/or
7
//modify it under the terms of the GNU General Public License
8
//as published by the Free Software Foundation; either version 2
9
//of the License, or (at your option) any later version.
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.
16
//You should have received a copy of the GNU General Public License
17
//along with this program; if not, write to the Free Software
18
//Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
#include <QtGui/QMenu>
20
#include <QtGui/QMenuBar>
21
#include <QtGui/QAction>
22
#include <QtGui/QStatusBar>
23
#include <QtGui/QApplication>
24
#include <QtGui/QVBoxLayout>
25
#include <QtGui/QHBoxLayout>
26
#include <QtGui/QFileDialog>
27
#include <QtGui/QLabel>
28
#include <QtGui/QCheckBox>
29
#include <QtGui/QPushButton>
30
#include <QtGui/QDockWidget>
31
#include <QtCore/QSettings>
32
#include <QtCore/QDir>
33
#include <QtCore/QTextStream>
34
#include <QDesktopServices>
35
#include <QtCore/QUrl>
36
#include "../core/diskcore.h"
37
#include "centralwidget.h"
38
#include "mainwindow.h"
41
#include "aboutprogramdialog.h"
42
#include "usbmanager.h"
43
#include "popupwindow.h"
46
#include "restorationsystem.h"
47
#include "pluginsmanager.h"
48
#include "plugininterface.h"
52
MainWindow::MainWindow() {
53
core = new DiskCore(BACKUPS_PATH);
54
popupWindow = new PopupWindow;
55
centralWidget = new CentralWidget(core,popupWindow);
56
setCentralWidget(centralWidget);
57
manual = new Manual(this);
58
aboutProgramDialog = new AboutProgramDialog(this);
59
usbManager = new UsbManager(popupWindow,this);
60
restorationSystem = new RestorationSystem(core,this);
61
pluginsManager = new PluginsManager(this);
63
trayMenu = new Menu(true);
64
trayMenu->setHeaderIcon(QIcon(PROGRAM_ICON_PATH));
65
trayMenu->setHeaderText(PROGRAM_NAME);
67
trayIcon = new TrayIcon;
68
trayIcon->setContextMenu(trayMenu);
71
// Creation of apply dialog
73
applyDialog = new QDialog(this);
75
QLabel *pixmapLabel = new QLabel;
76
pixmapLabel->setPixmap(QPixmap(PROGRAM_ICON_PATH));
78
QLabel *textLabel = new QLabel(tr("When you click on \"Ok\" button, the program will try to replace contents of the configuration file /etc/fstab and try to mount all devices with specified options. If you start program without root rights, the program will save configuration file in you home directory and you should replace /etc/fstab content on it by yourself."));
79
textLabel->setWordWrap(true);
80
textLabel->setAlignment(Qt::AlignTop);
82
dontShowApplyDialog = new QCheckBox(tr("Don't show this message"));
84
QPushButton *closeButton = new QPushButton(tr("Close"));
85
connect(closeButton,SIGNAL(clicked()),applyDialog,SLOT(hide()));
87
QHBoxLayout *bottomLayout = new QHBoxLayout;
88
bottomLayout->addStretch();
89
bottomLayout->addWidget(closeButton);
90
bottomLayout->addStretch();
92
QVBoxLayout *rightLayout = new QVBoxLayout;
93
rightLayout->addWidget(textLabel);
94
rightLayout->addWidget(dontShowApplyDialog);
95
rightLayout->addStretch();
97
QHBoxLayout *topLayout = new QHBoxLayout;
98
topLayout->addWidget(pixmapLabel);
99
topLayout->addLayout(rightLayout,1);
101
QVBoxLayout *mainLayout = new QVBoxLayout;
102
mainLayout->addLayout(topLayout);
103
mainLayout->addLayout(bottomLayout);
104
applyDialog->setLayout(mainLayout);
105
applyDialog->setWindowTitle(tr("Information"));
108
partitionMenu = menuBar()->addMenu("&" + tr("Partition"));
110
quitAction = new QAction(partitionMenu);
111
quitAction->setText(tr("Quit"));
112
quitAction->setShortcut(QKeySequence("Ctrl+Q"));
113
quitAction->setStatusTip(tr("Quit"));
114
quitAction->setIcon(QIcon(ICONS_PATH"quit.png"));
116
saveConfigFileAction = new QAction(partitionMenu);
117
saveConfigFileAction->setText(tr("Save configuration file"));
118
saveConfigFileAction->setStatusTip(tr("Save configuration file generated by the program as"));
119
saveConfigFileAction->setIcon(QIcon(ICONS_PATH"save_as.png"));
121
applyAction = new QAction(partitionMenu);
122
applyAction->setText(tr("Apply"));
123
applyAction->setStatusTip(tr("Replace configuration file of the system on generated by the program"));
124
applyAction->setIcon(QIcon(ICONS_PATH"apply.png"));
126
partitionMenu->addAction(applyAction);
127
partitionMenu->addSeparator();
128
partitionMenu->addAction(saveConfigFileAction);
129
partitionMenu->addSeparator();
130
foreach (QAction *action,centralWidget->actions())
131
partitionMenu->addAction(action);
132
partitionMenu->addSeparator();
133
partitionMenu->addAction(quitAction);
136
toolsMenu = menuBar()->addMenu("&" + tr("Tools"));
138
restorationSystemAction = new QAction(toolsMenu);
139
restorationSystemAction->setText(tr("Restoration system"));
140
restorationSystemAction->setStatusTip(tr("Back up to last content of configuration file"));
141
restorationSystemAction->setIcon(QIcon(ICONS_PATH"backward.png"));
143
usbManagerAction = new QAction(toolsMenu);
144
usbManagerAction->setText(tr("USB devices manager"));
145
usbManagerAction->setStatusTip(tr("Create rules for Udev"));
146
usbManagerAction->setIcon(QIcon(ICONS_PATH"usb_disk.png"));
148
// wizardAction = new QAction(toolsMenu);
149
// wizardAction->setText(tr("Disk wizard"));
150
// wizardAction->setStatusTip(tr("Set all partitions with help of the program"));
151
// wizardAction->setIcon(QIcon(ICONS_PATH"wizard.png"));
153
pluginsManagerAction = new QAction(toolsMenu);
154
pluginsManagerAction->setText(tr("Plugins manager"));
155
pluginsManagerAction->setStatusTip(tr("Enable or disable plugins for the program"));
156
pluginsManagerAction->setIcon(QIcon(ICONS_PATH"plugin_manager.png"));
158
toolsMenu->addAction(pluginsManagerAction);
159
toolsMenu->addAction(usbManagerAction);
160
toolsMenu->addAction(restorationSystemAction);
161
// toolsMenu->addAction(wizardAction);
164
pluginsMenu = menuBar()->addMenu("&" + tr("Plugins"));
167
helpMenu = menuBar()->addMenu("&" + tr("Help"));
169
documentationAction = new QAction(helpMenu);
170
documentationAction->setText(tr("Manual"));
171
documentationAction->setShortcut(QKeySequence("F1"));
172
documentationAction->setStatusTip(tr("Read documentation of the program"));
173
documentationAction->setIcon(QIcon(ICONS_PATH"manual.png"));
175
aboutProgramAction = new QAction(helpMenu);
176
aboutProgramAction->setText(tr("About the program"));
177
aboutProgramAction->setStatusTip(tr("Read information about the program"));
178
aboutProgramAction->setIcon(QIcon(PROGRAM_ICON_PATH));
180
helpMenu->addAction(documentationAction);
181
helpMenu->addSeparator();
184
linksMenu = new QMenu(tr("Internet links"));
185
linksMenu->setIcon(QIcon(ICONS_PATH"web.png"));
187
reportBugAction = new QAction(linksMenu);
188
reportBugAction->setText(tr("Report bugs"));
189
reportBugAction->setIcon(QIcon(ICONS_PATH"send.png"));
191
developerAction = new QAction(linksMenu);
192
developerAction->setText(tr("Developer's e-mail"));
193
developerAction->setIcon(QIcon(ICONS_PATH"send.png"));
195
homePageAction = new QAction(linksMenu);
196
homePageAction->setText(tr("Project home page"));
197
homePageAction->setIcon(QIcon(ICONS_PATH"web.png"));
199
linksMenu->addAction(developerAction);
200
linksMenu->addAction(reportBugAction);
201
linksMenu->addAction(homePageAction);
203
helpMenu->addMenu(linksMenu);
205
helpMenu->addSeparator();
206
helpMenu->addAction(aboutProgramAction);
208
trayMenu->addAction(aboutProgramAction);
209
trayMenu->addAction(quitAction);
212
statBar = statusBar();
214
// Actions connections
215
connect(quitAction,SIGNAL(triggered()),this,SLOT(quit()));
216
connect(documentationAction,SIGNAL(triggered()),manual,SLOT(show()));
217
connect(aboutProgramAction,SIGNAL(triggered()),aboutProgramDialog,SLOT(exec()));
218
connect(usbManagerAction,SIGNAL(triggered()),usbManager,SLOT(show()));
219
connect(saveConfigFileAction,SIGNAL(triggered()),this,SLOT(saveConfig()));
220
connect(restorationSystemAction,SIGNAL(triggered()),restorationSystem,SLOT(show()));
221
connect(pluginsManagerAction,SIGNAL(triggered()),pluginsManager,SLOT(show()));
222
connect(applyAction,SIGNAL(triggered()),this,SLOT(apply()));
223
connect(trayIcon,SIGNAL(hideOrShowSignal()),this,SLOT(hideOrShow()));
224
connect(centralWidget,SIGNAL(showTrayMessage(const QString&,const QString&)),this,SLOT(showTrayMessage(const QString&,const QString&)));
225
connect(centralWidget,SIGNAL(setAutomountSignal(DiskDevice *,VolumeWidget *)),usbManager,SLOT(setDeviceAutomount(DiskDevice *,VolumeWidget *)));
226
connect(pluginsManager,SIGNAL(pluginEnabled(int)),this,SLOT(enablePlugin(int)));
227
connect(pluginsManager,SIGNAL(pluginDisabled(int)),this,SLOT(disablePlugin(int)));
228
connect(this,SIGNAL(started()),centralWidget,SIGNAL(started()));
230
connect(reportBugAction,SIGNAL(triggered()),this,SLOT(reportBug()));
231
connect(developerAction,SIGNAL(triggered()),this,SLOT(sendLetterToDeveloper()));
232
connect(homePageAction,SIGNAL(triggered()),this,SLOT(goToHomepage()));
235
setWindowTitle(PROGRAM_NAME_WITH_VERSION);
236
setWindowIcon(QIcon(PROGRAM_ICON_PATH));
243
MainWindow::~MainWindow() {
245
delete centralWidget;
248
delete pluginsManager;
253
// delete wizardAction;
255
delete partitionMenu;
262
void MainWindow::saveSettings() {
263
QSettings settings(ORGANIZATION,PROGRAM_NAME);
264
settings.setValue("MainWindow/Position",pos());
265
settings.setValue("MainWindow/Size",size());
266
settings.setValue("MainWindow/State",saveState());
267
centralWidget->saveSettings();
268
manual->saveSettings();
269
restorationSystem->saveSettings();
270
pluginsManager->saveSettings();
273
void MainWindow::loadSettings() {
274
QSettings settings(ORGANIZATION,PROGRAM_NAME);
275
resize(settings.value("MainWindow/Size",QSize(800,400)).toSize());
276
move(settings.value("MainWindow/Position",QPoint(0,0)).toPoint());
277
restoreState(settings.value("MainWindow/State").toByteArray());
278
centralWidget->loadSettings();
279
manual->loadSettings();
280
restorationSystem->loadSettings();
283
void MainWindow::quit() {
288
void MainWindow::closeEvent(QCloseEvent *) {
292
void MainWindow::saveConfig() {
293
QString filePath = QFileDialog::getSaveFileName(this,tr("Save config file"),QDir::homePath());
294
if (filePath.isEmpty())
296
QFile file(filePath);
297
file.open(QIODevice::WriteOnly);
298
QTextStream stream(&file);
299
stream << centralWidget->currentFstabText();
302
void MainWindow::apply() {
303
QSettings settings(ORGANIZATION,PROGRAM_NAME);
304
if (settings.value("MainWindow/showApplyDialog",true).toBool()) {
306
settings.setValue("MainWindow/showApplyDialog",!dontShowApplyDialog->isChecked());
308
QString text = centralWidget->currentFstabText();
309
if (core->setFstabContent(text) == 0) {
310
restorationSystem->addBackup(text);
311
restorationSystem->updateTextBrowser();
314
centralWidget->showInformation(tr("Configuration file was replaced by new content succesfully."));
316
QFile file(QDir::homePath() + "/fstab");
317
file.open(QIODevice::WriteOnly);
318
QTextStream stream(&file);
320
centralWidget->showWarning(tr("Cannot save configuration file - it is saved in %1").arg(QDir::homePath() + "/fstab"));
324
void MainWindow::hideOrShow() {
325
setVisible(isHidden());
328
void MainWindow::showTrayMessage(const QString& title,const QString& message) {
329
trayIcon->showMessage(title,message);
332
void MainWindow::loadPlugins() {
334
foreach (MountManagerPlugin *plugin,pluginsManager->plugins()) {
338
enablePlugin(pluginId);
342
void MainWindow::enablePlugin(int pluginIndex) {
343
MountManagerPlugin *enabledPlugin = pluginsManager->plugins()[pluginIndex];
344
enabledPlugin->setParent(centralWidget);
345
if (enabledPlugin->dockWidget() != 0) {
346
switch(enabledPlugin->dockWidget()->allowedAreas()) {
347
case Qt::AllDockWidgetAreas:
348
addDockWidget(Qt::RightDockWidgetArea,enabledPlugin->dockWidget());
350
case Qt::RightDockWidgetArea:
351
addDockWidget(Qt::RightDockWidgetArea,enabledPlugin->dockWidget());
353
case Qt::LeftDockWidgetArea:
354
addDockWidget(Qt::LeftDockWidgetArea,enabledPlugin->dockWidget());
356
case Qt::TopDockWidgetArea:
357
addDockWidget(Qt::TopDockWidgetArea,enabledPlugin->dockWidget());
359
case Qt::BottomDockWidgetArea:
360
addDockWidget(Qt::BottomDockWidgetArea,enabledPlugin->dockWidget());
363
enabledPlugin->dockWidget()->show();
365
if (enabledPlugin->dialog() != 0)
366
enabledPlugin->dialog()->setParent(this,Qt::Dialog);
367
if (enabledPlugin->menu() != 0)
368
pluginsMenu->addMenu(enabledPlugin->menu());
369
if (enabledPlugin->toolBar() != 0)
370
addToolBar(enabledPlugin->toolBar());
372
foreach (QAction *action,enabledPlugin->menuActions())
373
pluginsMenu->addAction(action);
375
centralWidget->emitSignalsForPlugins();
378
void MainWindow::disablePlugin(int pluginIndex) {
379
MountManagerPlugin *disabledPlugin = pluginsManager->plugins()[pluginIndex];
380
if (disabledPlugin->dockWidget() != 0)
381
removeDockWidget(disabledPlugin->dockWidget());
382
if (disabledPlugin->dialog() != 0)
383
disabledPlugin->dialog()->hide();
384
if (disabledPlugin->menu() != 0)
385
disabledPlugin->menu()->hide();
386
if (disabledPlugin->toolBar() != 0)
387
removeToolBar(disabledPlugin->toolBar());
388
foreach (QAction *action,disabledPlugin->menuActions())
389
pluginsMenu->removeAction(action);
393
void MainWindow::reportBug() {
394
QDesktopServices::openUrl(QUrl("mailto:"AUTHOR_EMAIL"?subject=Bug report about "PROGRAM_NAME));
397
void MainWindow::sendLetterToDeveloper() {
398
QDesktopServices::openUrl(QUrl("mailto:"AUTHOR_EMAIL"?subject=About "PROGRAM_NAME));
401
void MainWindow::goToHomepage() {
402
QDesktopServices::openUrl(QUrl("http://vialinx.org"));