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