summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rbutil/rbutilqt/base/rbsettings.cpp1
-rw-r--r--rbutil/rbutilqt/base/rbsettings.h1
-rw-r--r--rbutil/rbutilqt/gui/backupdialog.cpp141
-rw-r--r--rbutil/rbutilqt/gui/backupdialog.h49
-rw-r--r--rbutil/rbutilqt/gui/backupdialogfrm.ui142
-rw-r--r--rbutil/rbutilqt/icons/package-x-generic.pngbin540 -> 1900 bytes
-rw-r--r--rbutil/rbutilqt/rbutilqt.cpp9
-rw-r--r--rbutil/rbutilqt/rbutilqt.h3
-rw-r--r--rbutil/rbutilqt/rbutilqt.pri5
-rw-r--r--rbutil/rbutilqt/rbutilqtfrm.ui38
10 files changed, 376 insertions, 13 deletions
diff --git a/rbutil/rbutilqt/base/rbsettings.cpp b/rbutil/rbutilqt/base/rbsettings.cpp
index f584c6808c..f6a936ab9a 100644
--- a/rbutil/rbutilqt/base/rbsettings.cpp
+++ b/rbutil/rbutilqt/base/rbsettings.cpp
@@ -40,6 +40,7 @@ const static struct {
40 { RbSettings::OfPath, "ofpath", "" }, 40 { RbSettings::OfPath, "ofpath", "" },
41 { RbSettings::Platform, "platform", "" }, 41 { RbSettings::Platform, "platform", "" },
42 { RbSettings::Language, "lang", "" }, 42 { RbSettings::Language, "lang", "" },
43 { RbSettings::BackupPath, "backuppath", "" },
43#if defined(Q_OS_WIN32) 44#if defined(Q_OS_WIN32)
44 { RbSettings::Tts, "tts", "sapi" }, 45 { RbSettings::Tts, "tts", "sapi" },
45#elif defined(Q_OS_MACX) 46#elif defined(Q_OS_MACX)
diff --git a/rbutil/rbutilqt/base/rbsettings.h b/rbutil/rbutilqt/base/rbsettings.h
index 45ec7092e2..21234a4e9a 100644
--- a/rbutil/rbutilqt/base/rbsettings.h
+++ b/rbutil/rbutilqt/base/rbsettings.h
@@ -40,6 +40,7 @@ class RbSettings : public QObject
40 OfPath, 40 OfPath,
41 Platform, 41 Platform,
42 Language, 42 Language,
43 BackupPath,
43 Tts, 44 Tts,
44 UseTtsCorrections, 45 UseTtsCorrections,
45 TalkFolders, 46 TalkFolders,
diff --git a/rbutil/rbutilqt/gui/backupdialog.cpp b/rbutil/rbutilqt/gui/backupdialog.cpp
new file mode 100644
index 0000000000..5d04b322ed
--- /dev/null
+++ b/rbutil/rbutilqt/gui/backupdialog.cpp
@@ -0,0 +1,141 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2012 by Dominik Riebeling
10 *
11 * All files in this archive are subject to the GNU General Public License.
12 * See the file COPYING in the source tree root for full license agreement.
13 *
14 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
15 * KIND, either express or implied.
16 *
17 ****************************************************************************/
18
19#include <QtGui>
20#include "backupdialog.h"
21#include "ui_backupdialogfrm.h"
22#include "rbsettings.h"
23#include "progressloggergui.h"
24#include "ziputil.h"
25#include "rockboxinfo.h"
26
27class BackupSizeThread : public QThread
28{
29 public:
30 void run(void);
31 void setPath(QString p) { m_path = p; }
32 qint64 currentSize(void) { return m_currentSize; }
33
34 private:
35 QString m_path;
36 qint64 m_currentSize;
37};
38
39
40void BackupSizeThread::run(void)
41{
42 qDebug() << "BackupSizeThread] Thread started, calculating" << m_path;
43 m_currentSize = 0;
44
45 QDirIterator it(m_path, QDirIterator::Subdirectories);
46 while(it.hasNext()) {
47 m_currentSize += QFileInfo(it.next()).size();
48 }
49 qDebug() << "[BackupSizeThread] Thread done, sum:" << m_currentSize;
50}
51
52
53BackupDialog::BackupDialog(QWidget* parent) : QDialog(parent)
54{
55 ui.setupUi(this);
56
57 m_thread = new BackupSizeThread();
58 connect(m_thread, SIGNAL(finished()), this, SLOT(updateSizeInfo()));
59 connect(m_thread, SIGNAL(terminated()), this, SLOT(updateSizeInfo()));
60
61 connect(ui.buttonCancel, SIGNAL(clicked()), this, SLOT(close()));
62 connect(ui.buttonCancel, SIGNAL(clicked()), m_thread, SLOT(quit()));
63 connect(ui.buttonChange, SIGNAL(clicked()), this, SLOT(changeBackupPath()));
64 connect(ui.buttonBackup, SIGNAL(clicked()), this, SLOT(backup()));
65
66 ui.backupSize->setText(tr("Installation size: calculating ..."));
67 m_mountpoint = RbSettings::value(RbSettings::Mountpoint).toString();
68
69 m_backupName = RbSettings::value(RbSettings::BackupPath).toString();
70 if(m_backupName.isEmpty()) {
71 m_backupName = m_mountpoint;
72 }
73 RockboxInfo info(m_mountpoint);
74 m_backupName += "/.backup/rockbox-backup-" + info.version() + ".zip";
75 ui.backupLocation->setText(QDir::toNativeSeparators(m_backupName));
76
77 m_thread->setPath(m_mountpoint + "/.rockbox");
78 m_thread->start();
79}
80
81
82void BackupDialog::changeBackupPath(void)
83{
84 QString backupString = QFileDialog::getSaveFileName(this,
85 tr("Select Backup Filename"), m_backupName, "*.zip");
86 // only update if a filename was entered, ignore if cancelled
87 if(!backupString.isEmpty()) {
88 m_backupName = backupString;
89 ui.backupLocation->setText(QDir::toNativeSeparators(m_backupName));
90 RbSettings::setValue(RbSettings::BackupPath, QFileInfo(m_backupName).absolutePath());
91 }
92}
93
94
95void BackupDialog::updateSizeInfo(void)
96{
97 double size = m_thread->currentSize() / (1024 * 1024);
98 QString unit = "MiB";
99
100 if(size > 1024) {
101 size /= 1024;
102 unit = "GiB";
103 }
104
105 ui.backupSize->setText(tr("Installation size: %L1 %2").arg(size, 0, 'g', 4).arg(unit));
106}
107
108
109void BackupDialog::backup(void)
110{
111 m_logger = new ProgressLoggerGui(this);
112 connect(m_logger, SIGNAL(closed()), this, SLOT(close()));
113 m_logger->show();
114 m_logger->addItem(tr("Starting backup ..."),LOGINFO);
115 QCoreApplication::processEvents();
116
117 // create dir, if it doesnt exist
118 QFileInfo backupFile(m_backupName);
119 if(!QDir(backupFile.path()).exists())
120 {
121 QDir a;
122 a.mkpath(backupFile.path());
123 }
124
125 // create backup
126 ZipUtil zip(this);
127 connect(&zip, SIGNAL(logProgress(int, int)), m_logger, SLOT(setProgress(int, int)));
128 connect(&zip, SIGNAL(logItem(QString, int)), m_logger, SLOT(addItem(QString, int)));
129 zip.open(m_backupName, QuaZip::mdCreate);
130
131 QString mp = m_mountpoint + "/.rockbox";
132 if(zip.appendDirToArchive(mp, m_mountpoint)) {
133 m_logger->addItem(tr("Backup successful."), LOGINFO);
134 }
135 else {
136 m_logger->addItem(tr("Backup failed!"), LOGERROR);
137 }
138 zip.close();
139 m_logger->setFinished();
140}
141
diff --git a/rbutil/rbutilqt/gui/backupdialog.h b/rbutil/rbutilqt/gui/backupdialog.h
new file mode 100644
index 0000000000..cd5ea398d9
--- /dev/null
+++ b/rbutil/rbutilqt/gui/backupdialog.h
@@ -0,0 +1,49 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2012 by Dominik Riebeling
10 *
11 * All files in this archive are subject to the GNU General Public License.
12 * See the file COPYING in the source tree root for full license agreement.
13 *
14 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
15 * KIND, either express or implied.
16 *
17 ****************************************************************************/
18
19#ifndef BACKUPDIALOG_H
20#define BACKUPDIALOG_H
21
22#include <QWidget>
23#include <QDialog>
24#include "ui_backupdialogfrm.h"
25#include "progressloggergui.h"
26
27class BackupSizeThread;
28
29class BackupDialog : public QDialog
30{
31 Q_OBJECT
32 public:
33 BackupDialog(QWidget* parent = 0);
34
35 private slots:
36 void changeBackupPath(void);
37 void updateSizeInfo(void);
38 void backup(void);
39
40 private:
41 Ui::BackupDialog ui;
42 QString m_backupName;
43 QString m_mountpoint;
44 BackupSizeThread *m_thread;
45 ProgressLoggerGui *m_logger;
46};
47
48#endif
49
diff --git a/rbutil/rbutilqt/gui/backupdialogfrm.ui b/rbutil/rbutilqt/gui/backupdialogfrm.ui
new file mode 100644
index 0000000000..5de61d1e91
--- /dev/null
+++ b/rbutil/rbutilqt/gui/backupdialogfrm.ui
@@ -0,0 +1,142 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<ui version="4.0">
3 <class>BackupDialog</class>
4 <widget class="QDialog" name="BackupDialog">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>554</width>
10 <height>448</height>
11 </rect>
12 </property>
13 <property name="windowTitle">
14 <string>Backup</string>
15 </property>
16 <layout class="QGridLayout" name="gridLayout_2">
17 <item row="0" column="0" rowspan="4">
18 <widget class="QLabel" name="label_4">
19 <property name="text">
20 <string/>
21 </property>
22 <property name="pixmap">
23 <pixmap resource="../rbutilqt.qrc">:/icons/wizard.jpg</pixmap>
24 </property>
25 </widget>
26 </item>
27 <item row="0" column="1" colspan="3">
28 <widget class="QLabel" name="label_2">
29 <property name="text">
30 <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This dialog will create a backup by archiving the contents of the Rockbox installation on the player into a zip file. This will include installed themes and settings stored below the .rockbox folder on the player.&lt;/p&gt;&lt;p&gt;The backup filename will be created based on the installed version. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
31 </property>
32 <property name="wordWrap">
33 <bool>true</bool>
34 </property>
35 </widget>
36 </item>
37 <item row="1" column="1" colspan="3">
38 <widget class="QGroupBox" name="groupBox">
39 <property name="title">
40 <string>Backup</string>
41 </property>
42 <layout class="QGridLayout" name="gridLayout">
43 <item row="0" column="0">
44 <widget class="QLabel" name="backupSize">
45 <property name="text">
46 <string>Size: unknown</string>
47 </property>
48 </widget>
49 </item>
50 <item row="1" column="0">
51 <widget class="QLabel" name="backupLocation">
52 <property name="text">
53 <string>Backup to: unknown</string>
54 </property>
55 </widget>
56 </item>
57 <item row="1" column="1">
58 <spacer name="horizontalSpacer">
59 <property name="orientation">
60 <enum>Qt::Horizontal</enum>
61 </property>
62 <property name="sizeHint" stdset="0">
63 <size>
64 <width>78</width>
65 <height>20</height>
66 </size>
67 </property>
68 </spacer>
69 </item>
70 <item row="1" column="2">
71 <widget class="QPushButton" name="buttonChange">
72 <property name="text">
73 <string>&amp;Change</string>
74 </property>
75 <property name="icon">
76 <iconset resource="../rbutilqt.qrc">
77 <normaloff>:/icons/edit-find.png</normaloff>:/icons/edit-find.png</iconset>
78 </property>
79 </widget>
80 </item>
81 </layout>
82 </widget>
83 </item>
84 <item row="2" column="2" colspan="2">
85 <spacer name="verticalSpacer">
86 <property name="orientation">
87 <enum>Qt::Vertical</enum>
88 </property>
89 <property name="sizeHint" stdset="0">
90 <size>
91 <width>20</width>
92 <height>1</height>
93 </size>
94 </property>
95 </spacer>
96 </item>
97 <item row="3" column="1">
98 <spacer name="horizontalSpacer_2">
99 <property name="orientation">
100 <enum>Qt::Horizontal</enum>
101 </property>
102 <property name="sizeHint" stdset="0">
103 <size>
104 <width>143</width>
105 <height>20</height>
106 </size>
107 </property>
108 </spacer>
109 </item>
110 <item row="3" column="2">
111 <widget class="QPushButton" name="buttonBackup">
112 <property name="text">
113 <string>&amp;Backup</string>
114 </property>
115 <property name="icon">
116 <iconset resource="../rbutilqt.qrc">
117 <normaloff>:/icons/go-next.png</normaloff>:/icons/go-next.png</iconset>
118 </property>
119 </widget>
120 </item>
121 <item row="3" column="3">
122 <widget class="QPushButton" name="buttonCancel">
123 <property name="text">
124 <string>&amp;Cancel</string>
125 </property>
126 <property name="icon">
127 <iconset resource="../rbutilqt.qrc">
128 <normaloff>:/icons/process-stop.png</normaloff>:/icons/process-stop.png</iconset>
129 </property>
130 </widget>
131 </item>
132 </layout>
133 </widget>
134 <tabstops>
135 <tabstop>buttonBackup</tabstop>
136 <tabstop>buttonCancel</tabstop>
137 </tabstops>
138 <resources>
139 <include location="../rbutilqt.qrc"/>
140 </resources>
141 <connections/>
142</ui>
diff --git a/rbutil/rbutilqt/icons/package-x-generic.png b/rbutil/rbutilqt/icons/package-x-generic.png
index 9015426153..6728f590e0 100644
--- a/rbutil/rbutilqt/icons/package-x-generic.png
+++ b/rbutil/rbutilqt/icons/package-x-generic.png
Binary files differ
diff --git a/rbutil/rbutilqt/rbutilqt.cpp b/rbutil/rbutilqt/rbutilqt.cpp
index b62167a4e7..5bce622799 100644
--- a/rbutil/rbutilqt/rbutilqt.cpp
+++ b/rbutil/rbutilqt/rbutilqt.cpp
@@ -40,6 +40,7 @@
40#include "ziputil.h" 40#include "ziputil.h"
41#include "manualwidget.h" 41#include "manualwidget.h"
42#include "infowidget.h" 42#include "infowidget.h"
43#include "backupdialog.h"
43 44
44#include "progressloggerinterface.h" 45#include "progressloggerinterface.h"
45 46
@@ -152,6 +153,7 @@ RbUtilQt::RbUtilQt(QWidget *parent) : QMainWindow(parent)
152 connect(ui.buttonRemoveBootloader, SIGNAL(clicked()), this, SLOT(uninstallBootloader())); 153 connect(ui.buttonRemoveBootloader, SIGNAL(clicked()), this, SLOT(uninstallBootloader()));
153 connect(ui.buttonSmall, SIGNAL(clicked()), this, SLOT(smallInstall())); 154 connect(ui.buttonSmall, SIGNAL(clicked()), this, SLOT(smallInstall()));
154 connect(ui.buttonComplete, SIGNAL(clicked()), this, SLOT(completeInstall())); 155 connect(ui.buttonComplete, SIGNAL(clicked()), this, SLOT(completeInstall()));
156 connect(ui.buttonBackup, SIGNAL(clicked()), this, SLOT(backup()));
155 157
156 // actions accessible from the menu 158 // actions accessible from the menu
157 connect(ui.actionComplete_Installation, SIGNAL(triggered()), this, SLOT(completeInstall())); 159 connect(ui.actionComplete_Installation, SIGNAL(triggered()), this, SLOT(completeInstall()));
@@ -386,6 +388,13 @@ void RbUtilQt::updateDevice()
386} 388}
387 389
388 390
391void RbUtilQt::backup(void)
392{
393 backupdialog = new BackupDialog(this);
394 backupdialog->show();
395}
396
397
389void RbUtilQt::completeInstall() 398void RbUtilQt::completeInstall()
390{ 399{
391 if(chkConfig(this)) return; 400 if(chkConfig(this)) return;
diff --git a/rbutil/rbutilqt/rbutilqt.h b/rbutil/rbutilqt/rbutilqt.h
index 67fbff78e1..3e57af589b 100644
--- a/rbutil/rbutilqt/rbutilqt.h
+++ b/rbutil/rbutilqt/rbutilqt.h
@@ -34,6 +34,7 @@
34#include "bootloaderinstallbase.h" 34#include "bootloaderinstallbase.h"
35#include "manualwidget.h" 35#include "manualwidget.h"
36#include "infowidget.h" 36#include "infowidget.h"
37#include "backupdialog.h"
37 38
38class RbUtilQt : public QMainWindow 39class RbUtilQt : public QMainWindow
39{ 40{
@@ -47,6 +48,7 @@ class RbUtilQt : public QMainWindow
47 private: 48 private:
48 ManualWidget *manual; 49 ManualWidget *manual;
49 InfoWidget *info; 50 InfoWidget *info;
51 BackupDialog *backupdialog;
50 Ui::RbUtilQtFrm ui; 52 Ui::RbUtilQtFrm ui;
51 53
52 void changeEvent(QEvent *e); 54 void changeEvent(QEvent *e);
@@ -106,6 +108,7 @@ class RbUtilQt : public QMainWindow
106 void createVoiceFile(void); 108 void createVoiceFile(void);
107 void downloadDone(bool); 109 void downloadDone(bool);
108 void downloadInfo(void); 110 void downloadInfo(void);
111 void backup(void);
109 112
110 void installVoice(void); 113 void installVoice(void);
111 void installThemes(void); 114 void installThemes(void);
diff --git a/rbutil/rbutilqt/rbutilqt.pri b/rbutil/rbutilqt/rbutilqt.pri
index 6a74a7c52f..330a3cd19a 100644
--- a/rbutil/rbutilqt/rbutilqt.pri
+++ b/rbutil/rbutilqt/rbutilqt.pri
@@ -78,6 +78,7 @@ SOURCES += \
78 quazip/ioapi.c \ 78 quazip/ioapi.c \
79 base/ziputil.cpp \ 79 base/ziputil.cpp \
80 comboboxviewdelegate.cpp \ 80 comboboxviewdelegate.cpp \
81 gui/backupdialog.cpp \
81 82
82 83
83HEADERS += \ 84HEADERS += \
@@ -149,6 +150,7 @@ HEADERS += \
149 base/ziputil.h \ 150 base/ziputil.h \
150 lame/lame.h \ 151 lame/lame.h \
151 comboboxviewdelegate.h \ 152 comboboxviewdelegate.h \
153 gui/backupdialog.h \
152 154
153 155
154FORMS += \ 156FORMS += \
@@ -165,7 +167,8 @@ FORMS += \
165 previewfrm.ui \ 167 previewfrm.ui \
166 createvoicefrm.ui \ 168 createvoicefrm.ui \
167 sysinfofrm.ui \ 169 sysinfofrm.ui \
168 systracefrm.ui 170 systracefrm.ui \
171 gui/backupdialogfrm.ui \
169 172
170 173
171TRANSLATIONS += \ 174TRANSLATIONS += \
diff --git a/rbutil/rbutilqt/rbutilqtfrm.ui b/rbutil/rbutilqt/rbutilqtfrm.ui
index d851b19021..aae4bd4f9b 100644
--- a/rbutil/rbutilqt/rbutilqtfrm.ui
+++ b/rbutil/rbutilqt/rbutilqtfrm.ui
@@ -282,9 +282,6 @@
282 <property name="wordWrap"> 282 <property name="wordWrap">
283 <bool>true</bool> 283 <bool>true</bool>
284 </property> 284 </property>
285 <property name="buddy">
286 <cstring>buttonRockbox</cstring>
287 </property>
288 </widget> 285 </widget>
289 </item> 286 </item>
290 <item row="2" column="0"> 287 <item row="2" column="0">
@@ -549,12 +546,12 @@
549 </widget> 546 </widget>
550 <widget class="QWidget" name="uninstall"> 547 <widget class="QWidget" name="uninstall">
551 <attribute name="title"> 548 <attribute name="title">
552 <string>&amp;Uninstallation</string> 549 <string>Backup &amp;&amp; &amp;Uninstallation</string>
553 </attribute> 550 </attribute>
554 <attribute name="toolTip"> 551 <attribute name="toolTip">
555 <string>Uninstall Rockbox</string> 552 <string>Uninstall Rockbox</string>
556 </attribute> 553 </attribute>
557 <layout class="QGridLayout"> 554 <layout class="QGridLayout" name="gridLayout_2">
558 <item row="0" column="0"> 555 <item row="0" column="0">
559 <widget class="QToolButton" name="buttonRemoveBootloader"> 556 <widget class="QToolButton" name="buttonRemoveBootloader">
560 <property name="text"> 557 <property name="text">
@@ -616,19 +613,36 @@
616 </widget> 613 </widget>
617 </item> 614 </item>
618 <item row="2" column="0"> 615 <item row="2" column="0">
619 <spacer> 616 <widget class="QToolButton" name="buttonBackup">
620 <property name="orientation"> 617 <property name="text">
621 <enum>Qt::Vertical</enum> 618 <string>Backup</string>
622 </property> 619 </property>
623 <property name="sizeHint" stdset="0"> 620 <property name="icon">
621 <iconset resource="rbutilqt.qrc">
622 <normaloff>:/icons/package-x-generic.png</normaloff>:/icons/package-x-generic.png</iconset>
623 </property>
624 <property name="iconSize">
624 <size> 625 <size>
625 <width>20</width> 626 <width>56</width>
626 <height>40</height> 627 <height>46</height>
627 </size> 628 </size>
628 </property> 629 </property>
629 </spacer> 630 </widget>
630 </item> 631 </item>
631 <item row="2" column="1"> 632 <item row="2" column="1">
633 <widget class="QLabel" name="labelBackup">
634 <property name="text">
635 <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Backup current installation.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Create a backup by archiving the contents of the Rockbox installation folder.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
636 </property>
637 <property name="alignment">
638 <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
639 </property>
640 <property name="wordWrap">
641 <bool>true</bool>
642 </property>
643 </widget>
644 </item>
645 <item row="3" column="0">
632 <spacer> 646 <spacer>
633 <property name="orientation"> 647 <property name="orientation">
634 <enum>Qt::Vertical</enum> 648 <enum>Qt::Vertical</enum>