summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2012-06-26 00:24:58 +0200
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2012-06-26 18:30:27 +0200
commit362f447ede988023951f85f86dc3e7c609fd5014 (patch)
treecf26486dc8f62a25590a88e87f40e62645e5a5e0
parent8cc46fb01cc86c25e580400b6c2d6cc38665843d (diff)
downloadrockbox-362f447ede988023951f85f86dc3e7c609fd5014.tar.gz
rockbox-362f447ede988023951f85f86dc3e7c609fd5014.zip
Create dedicated backup dialog.
The "Installation" dialog allows backing up the current installation by creating a zip file from the .rockbox folder since quite a while. However, this has the drawback that you need to update your build to create a backup, but creating a backup might be desireable in other cases as well (before updating themes, or just for backup reasons). Since the functionality is somewhat hidden it's also not obvious to users such a functionality exists (most users are likely to use the "Quick Start" instead). Implement backup functionality as dedicated dialog placed on the Uninstall tab. Rename the Uninstall tab to accommodate this. Change-Id: I1d2c6c8f646672d1b66bb442408fbfc2eeec700d
-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>