1 //**************************************************************************
2 // Copyright 2006 - 2017 Martin Koller, kollix@aon.at
3 //
4 // This program is free software; you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, version 2 of the License
7 //
8 //**************************************************************************
9
10 #include <MainWidget.hxx>
11 #include <Archiver.hxx>
12 #include <Selector.hxx>
13
14 #include <KUrlCompletion>
15
16 #include <QPushButton>
17 #include <QFileDialog>
18
19 //krazy:excludeall=normalize
20 //--------------------------------------------------------------------------------
21
MainWidget(QWidget * parent)22 MainWidget::MainWidget(QWidget *parent)
23 : QWidget(parent), selector(nullptr)
24 {
25 ui.setupUi(this);
26
27 ui.startButton->setIcon(QIcon::fromTheme(QStringLiteral("kbackup_start")));
28 ui.cancelButton->setIcon(QIcon::fromTheme(QStringLiteral("kbackup_cancel")));
29 ui.folder->setIcon(QIcon::fromTheme(QStringLiteral("folder")));
30
31 connect(ui.startButton, &QAbstractButton::clicked, this, &MainWidget::startBackup);
32 connect(ui.cancelButton, &QAbstractButton::clicked, Archiver::instance, &Archiver::cancel);
33
34 connect(ui.forceFullBackup, &QAbstractButton::clicked, Archiver::instance, &Archiver::setForceFullBackup);
35
36 connect(Archiver::instance, &Archiver::logging, ui.log, &QTextEdit::append);
37 connect(Archiver::instance, &Archiver::warning, ui.warnings, &QTextEdit::append);
38
39 connect(Archiver::instance, &Archiver::targetCapacity, this, &MainWidget::setCapacity);
40
41 connect(Archiver::instance, SIGNAL(totalFilesChanged(int)), ui.totalFiles, SLOT(setNum(int)));
42 connect(Archiver::instance, &Archiver::totalBytesChanged, this, &MainWidget::updateTotalBytes);
43
44 connect(Archiver::instance, &Archiver::sliceProgress, ui.progressSlice, &QProgressBar::setValue);
45 connect(Archiver::instance, SIGNAL(newSlice(int)), ui.sliceNum, SLOT(setNum(int)));
46
47 connect(Archiver::instance, &Archiver::fileProgress, this, &MainWidget::setFileProgress);
48 connect(Archiver::instance, &Archiver::elapsedChanged, this, &MainWidget::updateElapsed);
49
50 connect(Archiver::instance, &Archiver::backupTypeChanged, this, &MainWidget::setIsIncrementalBackup);
51
52 connect(ui.folder, &QAbstractButton::clicked, this, &MainWidget::getMediaSize);
53 connect(ui.targetDir, SIGNAL(returnPressed(const QString &)), this, SLOT(setTargetURL(const QString &)));
54
55 KUrlCompletion *kc = new KUrlCompletion(KUrlCompletion::DirCompletion);
56 ui.targetDir->setCompletionObject(kc);
57 ui.targetDir->setAutoDeleteCompletionObject(true);
58
59 Archiver::instance->setForceFullBackup(ui.forceFullBackup->isChecked());
60 }
61
62 //--------------------------------------------------------------------------------
63
setIsIncrementalBackup(bool incremental)64 void MainWidget::setIsIncrementalBackup(bool incremental)
65 {
66 if ( incremental )
67 ui.backupType->setText(i18n("Incremental Backup"));
68 else
69 ui.backupType->setText(i18n("Full Backup"));
70 }
71
72 //--------------------------------------------------------------------------------
73
startBackup()74 void MainWidget::startBackup()
75 {
76 ui.log->clear();
77 ui.warnings->clear();
78 ui.cancelButton->setEnabled(true);
79 ui.startButton->setEnabled(false);
80
81 Archiver::instance->setTarget(QUrl::fromUserInput(ui.targetDir->text()));
82
83 QStringList includes, excludes;
84 selector->getBackupList(includes, excludes);
85
86 Archiver::instance->createArchive(includes, excludes);
87
88 ui.forceFullBackup->setChecked(false);
89 Archiver::instance->setForceFullBackup(false);
90
91 ui.cancelButton->setEnabled(false);
92 ui.startButton->setEnabled(true);
93 }
94
95 //--------------------------------------------------------------------------------
96
setSelector(Selector * s)97 void MainWidget::setSelector(Selector *s)
98 {
99 setCapacity(0);
100 setFileProgress(100); // to hide file progress bar
101
102 selector = s;
103 }
104
105 //--------------------------------------------------------------------------------
106
getMediaSize()107 void MainWidget::getMediaSize()
108 {
109 QUrl url = QFileDialog::getExistingDirectoryUrl(this);
110
111 if ( url.isEmpty() ) return; // cancelled
112
113 ui.targetDir->setText(url.toLocalFile());
114 Archiver::instance->setTarget(QUrl::fromUserInput(ui.targetDir->text()));
115 }
116
117 //--------------------------------------------------------------------------------
118
updateElapsed(const QTime & elapsed)119 void MainWidget::updateElapsed(const QTime &elapsed)
120 {
121 ui.elapsedTime->setText(elapsed.toString(QStringLiteral("HH:mm:ss")));
122 }
123
124 //--------------------------------------------------------------------------------
125
setTargetURL(const QString & url)126 void MainWidget::setTargetURL(const QString &url)
127 {
128 ui.targetDir->setText(url);
129 Archiver::instance->setTarget(QUrl::fromUserInput(ui.targetDir->text()));
130 }
131
132 //--------------------------------------------------------------------------------
133
updateTotalBytes()134 void MainWidget::updateTotalBytes()
135 {
136 // don't use KIO::convertSize() as this would not show good progress
137 // after reaching 1 GB; always show MBs
138 ui.totalSize->setText(
139 QString::number(Archiver::instance->getTotalBytes() / 1024.0 / 1024.0, 'f', 2));
140 }
141
142 //--------------------------------------------------------------------------------
143
setFileProgress(int percent)144 void MainWidget::setFileProgress( int percent )
145 {
146 if ( percent == 100 )
147 {
148 ui.fileProgressLabel->hide();
149 ui.fileProgress->hide();
150 }
151 else
152 {
153 ui.fileProgressLabel->show();
154 ui.fileProgress->show();
155 ui.fileProgress->setValue(percent);
156 }
157 }
158
159 //--------------------------------------------------------------------------------
160
setCapacity(KIO::filesize_t bytes)161 void MainWidget::setCapacity(KIO::filesize_t bytes)
162 {
163 if ( bytes == 0 )
164 ui.capacity->setText(i18n("unlimited"));
165 else
166 {
167 QString txt = KIO::convertSize(bytes);
168 if ( Archiver::instance->getMaxSliceMBs() != Archiver::UNLIMITED )
169 txt += QStringLiteral(" (*)");
170 ui.capacity->setText(txt);
171 }
172 }
173
174 //--------------------------------------------------------------------------------
175