~ben-kietzman/ubuntu/quantal/mountmanager/fix-for-598070

« back to all changes in this revision

Viewing changes to sources/gui/mainwindow.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Fabrice Coutadeur
  • Date: 2008-08-20 10:22:14 UTC
  • Revision ID: james.westby@ubuntu.com-20080820102214-fv93myu0ncb1503r
Tags: upstream-0.2.4
ImportĀ upstreamĀ versionĀ 0.2.4

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
//MountManager - the program for easy mounting of storage devices in Linux
 
2
//Copyright (C) 2007-2008 Tikhonov Sergey
 
3
//
 
4
//This file is part of MountManager Gui
 
5
//
 
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.
 
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, 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"
 
39
#include "const.h"
 
40
#include "manual.h"
 
41
#include "aboutprogramdialog.h"
 
42
#include "usbmanager.h"
 
43
#include "popupwindow.h"
 
44
#include "menu.h"
 
45
#include "trayicon.h"
 
46
#include "restorationsystem.h"
 
47
#include "pluginsmanager.h"
 
48
#include "plugininterface.h"
 
49
 
 
50
#include <QDebug>
 
51
 
 
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);
 
62
 
 
63
        trayMenu = new Menu(true);
 
64
        trayMenu->setHeaderIcon(QIcon(PROGRAM_ICON_PATH));
 
65
        trayMenu->setHeaderText(PROGRAM_NAME);
 
66
        
 
67
        trayIcon = new TrayIcon;
 
68
        trayIcon->setContextMenu(trayMenu);
 
69
        trayIcon->show();
 
70
 
 
71
        // Creation of apply dialog
 
72
        
 
73
        applyDialog = new QDialog(this);
 
74
 
 
75
        QLabel *pixmapLabel = new QLabel;
 
76
        pixmapLabel->setPixmap(QPixmap(PROGRAM_ICON_PATH));
 
77
 
 
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);
 
81
        
 
82
        dontShowApplyDialog = new QCheckBox(tr("Don't show this message"));
 
83
        
 
84
        QPushButton *closeButton = new QPushButton(tr("Close"));
 
85
        connect(closeButton,SIGNAL(clicked()),applyDialog,SLOT(hide()));
 
86
        
 
87
        QHBoxLayout *bottomLayout = new QHBoxLayout;
 
88
        bottomLayout->addStretch();
 
89
        bottomLayout->addWidget(closeButton);
 
90
        bottomLayout->addStretch();
 
91
 
 
92
        QVBoxLayout *rightLayout = new QVBoxLayout;
 
93
        rightLayout->addWidget(textLabel);
 
94
        rightLayout->addWidget(dontShowApplyDialog);
 
95
        rightLayout->addStretch();
 
96
        
 
97
        QHBoxLayout *topLayout = new QHBoxLayout;
 
98
        topLayout->addWidget(pixmapLabel);
 
99
        topLayout->addLayout(rightLayout,1);
 
100
        
 
101
        QVBoxLayout *mainLayout = new QVBoxLayout;
 
102
        mainLayout->addLayout(topLayout);
 
103
        mainLayout->addLayout(bottomLayout);
 
104
        applyDialog->setLayout(mainLayout);
 
105
        applyDialog->setWindowTitle(tr("Information"));
 
106
        
 
107
        // Partition menu
 
108
        partitionMenu = menuBar()->addMenu("&" + tr("Partition"));
 
109
 
 
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"));
 
115
        
 
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"));
 
120
        
 
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"));
 
125
 
 
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);
 
134
        
 
135
        // Tools menu
 
136
        toolsMenu = menuBar()->addMenu("&" + tr("Tools"));
 
137
        
 
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"));
 
142
        
 
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"));
 
147
        
 
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"));
 
152
 
 
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"));
 
157
        
 
158
        toolsMenu->addAction(pluginsManagerAction);
 
159
        toolsMenu->addAction(usbManagerAction);
 
160
        toolsMenu->addAction(restorationSystemAction);
 
161
//      toolsMenu->addAction(wizardAction);
 
162
        
 
163
        // Plugins menu 
 
164
        pluginsMenu = menuBar()->addMenu("&" + tr("Plugins"));
 
165
        
 
166
        // Help menu
 
167
        helpMenu = menuBar()->addMenu("&" + tr("Help"));
 
168
 
 
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"));
 
174
 
 
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));
 
179
 
 
180
        helpMenu->addAction(documentationAction);
 
181
        helpMenu->addSeparator();
 
182
 
 
183
        // Links menu
 
184
        linksMenu = new QMenu(tr("Internet links"));
 
185
        linksMenu->setIcon(QIcon(ICONS_PATH"web.png"));
 
186
        
 
187
        reportBugAction = new QAction(linksMenu);
 
188
        reportBugAction->setText(tr("Report bugs"));
 
189
        reportBugAction->setIcon(QIcon(ICONS_PATH"send.png"));
 
190
        
 
191
        developerAction = new QAction(linksMenu);
 
192
        developerAction->setText(tr("Developer's e-mail"));
 
193
        developerAction->setIcon(QIcon(ICONS_PATH"send.png"));
 
194
        
 
195
        homePageAction = new QAction(linksMenu);
 
196
        homePageAction->setText(tr("Project home page"));
 
197
        homePageAction->setIcon(QIcon(ICONS_PATH"web.png"));
 
198
 
 
199
        linksMenu->addAction(developerAction);
 
200
        linksMenu->addAction(reportBugAction);
 
201
        linksMenu->addAction(homePageAction);
 
202
        
 
203
        helpMenu->addMenu(linksMenu);
 
204
 
 
205
        helpMenu->addSeparator();
 
206
        helpMenu->addAction(aboutProgramAction);
 
207
        // Tray menu
 
208
        trayMenu->addAction(aboutProgramAction);
 
209
        trayMenu->addAction(quitAction);
 
210
        
 
211
        // Status bar
 
212
        statBar = statusBar();
 
213
 
 
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()));
 
229
 
 
230
        connect(reportBugAction,SIGNAL(triggered()),this,SLOT(reportBug()));
 
231
        connect(developerAction,SIGNAL(triggered()),this,SLOT(sendLetterToDeveloper()));
 
232
        connect(homePageAction,SIGNAL(triggered()),this,SLOT(goToHomepage()));
 
233
 
 
234
        
 
235
        setWindowTitle(PROGRAM_NAME_WITH_VERSION);
 
236
        setWindowIcon(QIcon(PROGRAM_ICON_PATH));
 
237
        loadPlugins();
 
238
        loadSettings();
 
239
        show();
 
240
        emit (started());
 
241
}
 
242
 
 
243
MainWindow::~MainWindow() {
 
244
        delete core;
 
245
        delete centralWidget;
 
246
        delete manual;
 
247
        delete applyDialog;
 
248
        delete pluginsManager;
 
249
 
 
250
        delete trayMenu;
 
251
        delete trayIcon;
 
252
        
 
253
//      delete wizardAction;
 
254
 
 
255
        delete partitionMenu;
 
256
        delete pluginsMenu;
 
257
        delete toolsMenu;
 
258
        delete linksMenu;
 
259
        delete helpMenu;
 
260
}
 
261
 
 
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();
 
271
}
 
272
 
 
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();
 
281
}
 
282
 
 
283
void MainWindow::quit() {
 
284
        saveSettings();
 
285
        qApp->quit();
 
286
}
 
287
 
 
288
void MainWindow::closeEvent(QCloseEvent *) {
 
289
        quit();
 
290
}
 
291
 
 
292
void MainWindow::saveConfig() {
 
293
        QString filePath = QFileDialog::getSaveFileName(this,tr("Save config file"),QDir::homePath());
 
294
        if (filePath.isEmpty())
 
295
                return;
 
296
        QFile file(filePath);
 
297
        file.open(QIODevice::WriteOnly);
 
298
        QTextStream stream(&file);
 
299
        stream << centralWidget->currentFstabText();
 
300
}
 
301
 
 
302
void MainWindow::apply() {
 
303
        QSettings settings(ORGANIZATION,PROGRAM_NAME);
 
304
        if (settings.value("MainWindow/showApplyDialog",true).toBool()) {
 
305
                applyDialog->exec();
 
306
                settings.setValue("MainWindow/showApplyDialog",!dontShowApplyDialog->isChecked());
 
307
        }
 
308
        QString text = centralWidget->currentFstabText();
 
309
        if (core->setFstabContent(text) == 0) {
 
310
                restorationSystem->addBackup(text);
 
311
                restorationSystem->updateTextBrowser();
 
312
                core->unmountAll();
 
313
                core->mountAll();
 
314
                centralWidget->showInformation(tr("Configuration file was replaced by new content succesfully."));
 
315
        } else {
 
316
                QFile file(QDir::homePath() + "/fstab");
 
317
                file.open(QIODevice::WriteOnly);
 
318
                QTextStream stream(&file);
 
319
                stream << text;
 
320
                centralWidget->showWarning(tr("Cannot save configuration file - it is saved in %1").arg(QDir::homePath() + "/fstab"));
 
321
        }
 
322
}
 
323
 
 
324
void MainWindow::hideOrShow() {
 
325
        setVisible(isHidden());
 
326
}
 
327
 
 
328
void MainWindow::showTrayMessage(const QString& title,const QString& message) {
 
329
        trayIcon->showMessage(title,message);
 
330
}
 
331
 
 
332
void MainWindow::loadPlugins() {
 
333
        int pluginId = -1;
 
334
        foreach (MountManagerPlugin *plugin,pluginsManager->plugins()) {
 
335
                pluginId++;
 
336
                if (plugin == 0)
 
337
                        continue;
 
338
                enablePlugin(pluginId);
 
339
        }
 
340
}
 
341
 
 
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());
 
349
                                break;
 
350
                        case Qt::RightDockWidgetArea:
 
351
                                addDockWidget(Qt::RightDockWidgetArea,enabledPlugin->dockWidget());
 
352
                                break;
 
353
                        case Qt::LeftDockWidgetArea:
 
354
                                addDockWidget(Qt::LeftDockWidgetArea,enabledPlugin->dockWidget());
 
355
                                break;
 
356
                        case Qt::TopDockWidgetArea:
 
357
                                addDockWidget(Qt::TopDockWidgetArea,enabledPlugin->dockWidget());
 
358
                                break;
 
359
                        case Qt::BottomDockWidgetArea:
 
360
                                addDockWidget(Qt::BottomDockWidgetArea,enabledPlugin->dockWidget());
 
361
                                break;
 
362
                }
 
363
                enabledPlugin->dockWidget()->show();
 
364
        }
 
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());
 
371
 
 
372
        foreach (QAction *action,enabledPlugin->menuActions())
 
373
                pluginsMenu->addAction(action);
 
374
 
 
375
        centralWidget->emitSignalsForPlugins();
 
376
}
 
377
 
 
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);
 
390
}
 
391
 
 
392
 
 
393
void MainWindow::reportBug() {
 
394
        QDesktopServices::openUrl(QUrl("mailto:"AUTHOR_EMAIL"?subject=Bug report about "PROGRAM_NAME));
 
395
}
 
396
 
 
397
void MainWindow::sendLetterToDeveloper() {
 
398
        QDesktopServices::openUrl(QUrl("mailto:"AUTHOR_EMAIL"?subject=About "PROGRAM_NAME));
 
399
}
 
400
 
 
401
void MainWindow::goToHomepage() {
 
402
        QDesktopServices::openUrl(QUrl("http://vialinx.org"));
 
403
}