1 //////////////////////////////////////////////////
2 // //
3 // Emu64 //
4 // von Thorsten Kattanek //
5 // //
6 // #file: widget_file_browse.cpp //
7 // //
8 // Dieser Sourcecode ist Copyright geschützt! //
9 // Geistiges Eigentum von Th.Kattanek //
10 // //
11 // Letzte Änderung am 13.09.2019 //
12 // www.emu64.de //
13 // //
14 //////////////////////////////////////////////////
15
16 #include <QDebug>
17
18 #include "widget_file_browse.h"
19 #include "ui_widget_file_browse.h"
20
WidgetFileBrowse(QWidget * parent)21 WidgetFileBrowse::WidgetFileBrowse(QWidget *parent) :
22 QWidget(parent),
23 ui(new Ui::WidgetFileBrowse)
24 {
25 ui->setupUi(this);
26
27 tmp_path = nullptr;
28
29 ui->delete_file->setDisabled(true);
30
31 connect(ui->listView_filebrowser,SIGNAL(activated(QModelIndex)),this,SLOT(on_listView_filebrowser_clicked(QModelIndex)));
32
33 ui->listWidget_zip->setMinimumHeight(0);
34 ui->listWidget_zip->setMaximumHeight(0);
35
36 // Schreibschutzoption defaultmäßig verbergen
37 ui->WriteProtected->setVisible(false);
38
39 dirmodel = new QFileSystemModel(this);
40 dirmodel->setFilter(QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Files | QDir::AllEntries);
41 dirmodel->setRootPath(QDir::rootPath());
42 ui->listView_filebrowser->setModel(dirmodel);
43 akt_fullpath = dirmodel->rootPath();
44 ui->AktPath->setText(akt_fullpath);
45
46 // Laufwerke in Liste eintragen
47 QFileInfoList file_info_list = QDir::drives();
48
49 for(int i=0; i < file_info_list.count(); i++)
50 {
51 ui->drive_list->addItem(file_info_list.at(i).absoluteFilePath());
52 }
53 }
54
RetranslateUi()55 void WidgetFileBrowse::RetranslateUi()
56 {
57 ui->retranslateUi(this);
58 this->update();
59 }
60
~WidgetFileBrowse()61 WidgetFileBrowse::~WidgetFileBrowse()
62 {
63 delete dirmodel;
64 delete ui;
65 }
66
SetFileFilter(const QStringList & filters)67 void WidgetFileBrowse::SetFileFilter(const QStringList &filters)
68 {
69 ZIPExt = QStringList(filters);
70
71 QStringList filters1(filters);
72 #ifdef ZIP_SUPPORT
73 filters1 << "*.zip"; // ZIP Anhängen (Für Zip Unterstützung)
74 #endif
75 dirmodel->setNameFilterDisables(false);
76 dirmodel->setNameFilters(filters1);
77 }
78
GetAktDir(void)79 QString WidgetFileBrowse::GetAktDir(void)
80 {
81 return akt_fullpath;
82 }
83
GetAktFile(void)84 QString WidgetFileBrowse::GetAktFile(void)
85 {
86 return dirmodel->fileName(ui->listView_filebrowser->currentIndex());
87 }
88
SetTempDir(QString tmp_path)89 void WidgetFileBrowse::SetTempDir(QString tmp_path)
90 {
91 this->tmp_path = tmp_path;
92 }
93
SetAktDir(QString akt_dir)94 void WidgetFileBrowse::SetAktDir(QString akt_dir)
95 {
96 if(akt_dir == "") return;
97
98 ui->listView_filebrowser->setRootIndex(dirmodel->setRootPath(akt_dir));
99 akt_fullpath = dirmodel->rootPath();
100 ui->AktPath->setText(akt_fullpath);
101
102 QString lw = rootPathName(akt_dir);
103
104 if(lw == "")
105 {
106 QDir dir(akt_dir);
107 lw = dir.rootPath();
108 }
109
110 int idx = ui->drive_list->findText(lw);
111 ui->drive_list->setCurrentIndex(idx);
112 }
113
SetAktFile(QString akt_dir,QString akt_file)114 void WidgetFileBrowse::SetAktFile(QString akt_dir, QString akt_file)
115 {
116 if(akt_file == "") return;
117
118 ui->listView_filebrowser->setRootIndex(dirmodel->setRootPath(akt_dir));
119 akt_fullpath = dirmodel->rootPath();
120 ui->AktPath->setText(akt_fullpath);
121
122 QModelIndex idx = dirmodel->index(akt_dir + "/" + akt_file);
123 ui->listView_filebrowser->setCurrentIndex(idx);
124 ui->listView_filebrowser->scrollTo(idx,QAbstractItemView::PositionAtCenter);
125
126 on_listView_filebrowser_clicked(idx);
127
128 // Prüfen ob Aktuell ausgewählte Datei ein Verzeichnis ist oder nicht
129 // In Abhängigkeit davon den Delete Button setzen
130 if(!dirmodel->fileInfo(ui->listView_filebrowser->currentIndex()).isDir())
131 ui->delete_file->setDisabled(false);
132 else
133 ui->delete_file->setDisabled(true);
134
135
136 emit SelectFile(dirmodel->fileInfo(idx).absoluteFilePath());
137 }
138
RefreshAktDir()139 void WidgetFileBrowse::RefreshAktDir()
140 {
141 if(akt_fullpath == "") return;
142
143 dirmodel->setRootPath("");
144 dirmodel->setRootPath(akt_fullpath);
145 }
146
EnableWriteProtectCheck(bool enabled)147 void WidgetFileBrowse::EnableWriteProtectCheck(bool enabled)
148 {
149 ui->WriteProtected->setVisible(enabled);
150 }
151
isFileWriteProtect(QString filename)152 bool WidgetFileBrowse::isFileWriteProtect(QString filename)
153 {
154 QFileInfo file(filename);
155 QFile::Permissions permissions = file.permissions();
156
157 return !permissions.testFlag(QFile::WriteOwner);
158 }
159
160 #ifdef ZIP_SUPPORT
on_listWidget_zip_itemSelectionChanged()161 void WidgetFileBrowse::on_listWidget_zip_itemSelectionChanged()
162 {
163 QString AktZIPName = dirmodel->fileInfo(ui->listView_filebrowser->currentIndex()).absoluteFilePath();
164 QString ZIPInFile = ui->listWidget_zip->currentItem()->text();
165
166 QString file = ZIPInFile.section("/",-1,-1); // Evt. enthaltenen Pfad abschneiden
167
168 QString OutFileName = tmp_path + "/" + file;
169
170 QuaZip zip(AktZIPName);
171 if(zip.open(QuaZip::mdUnzip))
172 {
173 QuaZipFile zf(&zip);
174 if(!zip.setCurrentFile(ZIPInFile))
175 {
176 qDebug() << "Fehler in ZIP-Datei: " << AktZIPName;
177 return;
178 }
179 if(!zf.open(QIODevice::ReadOnly))
180 {
181 qDebug() << "Fehler beim Öffnen des ZIPFiles: " << ZIPInFile;
182 }
183
184 // Aus OutFileName alles entfernen mit '/'
185
186 QFile outfile(OutFileName);
187 if(outfile.open(QIODevice::ReadWrite))
188 {
189 outfile.write(zf.readAll());
190 outfile.close();
191 }
192 zip.close();
193 emit SelectFile(OutFileName);
194 }
195 }
196 #endif
197
on_listView_filebrowser_doubleClicked(const QModelIndex & index)198 void WidgetFileBrowse::on_listView_filebrowser_doubleClicked(const QModelIndex &index)
199 {
200 // Prüfe ob angeklicktes Element ein Verzeichnis ist
201 if(dirmodel->fileInfo(index).isDir())
202 {
203 //Ja
204 ui->listView_filebrowser->setRootIndex(index);
205 akt_fullpath = dirmodel->filePath(index);
206 ui->AktPath->setText(akt_fullpath);
207 }
208 else emit FileDoubleClick();
209 }
210
on_to_parent_clicked()211 void WidgetFileBrowse::on_to_parent_clicked()
212 {
213 akt_fullpath = dirmodel->filePath(dirmodel->parent(dirmodel->index(akt_fullpath)));
214 SetAktDir(akt_fullpath);
215 ui->AktPath->setText(akt_fullpath);
216 }
217
on_listView_filebrowser_clicked(const QModelIndex & index)218 void WidgetFileBrowse::on_listView_filebrowser_clicked(const QModelIndex &index)
219 {
220 if(!dirmodel->fileInfo(index).isDir())
221 {
222 // Kein Verzeichnis
223 QString AktFileName = dirmodel->filePath(index);
224
225 ui->delete_file->setEnabled(true);
226
227 emit SelectFile(AktFileName);
228
229 #ifdef ZIP_SUPPORT
230 if("ZIP" == AktFileName.right(3).toUpper())
231 {
232 ui->listWidget_zip->clear();
233 ui->listWidget_zip->setMaximumHeight(120);
234 ui->listWidget_zip->setMinimumHeight(120);
235
236 ui->WriteProtected->setChecked(true);
237 ui->WriteProtected->setEnabled(false);
238
239 if(ui->WriteProtected->isVisible())
240 emit WriteProtectedChanged(true);
241
242 QuaZip zip(AktFileName);
243 if(zip.open(QuaZip::mdUnzip))
244 {
245 QStringList FileList;
246 for(int i=0;i<ZIPExt.count();i++)
247 {
248 FileList << zip.getFileNameList().filter(ZIPExt[i].right(4),Qt::CaseInsensitive);
249 }
250
251 FileList.sort();
252 ui->listWidget_zip->addItems(FileList);
253 zip.close();
254 }
255
256 ui->listWidget_zip->setCurrentRow(0);
257 }
258 else
259 #endif
260 {
261 ui->listWidget_zip->setMaximumHeight(0);
262 ui->listWidget_zip->setMinimumHeight(0);
263 ui->WriteProtected->setEnabled(true);
264
265 QFileInfo file(AktFileName);
266 QFile::Permissions permissions = file.permissions();
267
268 bool wp = !permissions.testFlag(QFile::WriteOwner);
269
270 ui->WriteProtected->setChecked(wp);
271
272 if(ui->WriteProtected->isVisible())
273 {
274 emit WriteProtectedChanged(wp);
275 }
276 }
277 }
278 else
279 {
280 ui->delete_file->setEnabled(false);
281
282 ui->listWidget_zip->setMaximumHeight(0);
283 ui->listWidget_zip->setMinimumHeight(0);
284 }
285 }
286
on_WriteProtected_clicked(bool checked)287 void WidgetFileBrowse::on_WriteProtected_clicked(bool checked)
288 {
289 QString AktFileName = dirmodel->filePath(ui->listView_filebrowser->currentIndex());
290 QFile file(AktFileName);
291 QFile::Permissions permissions;
292
293 if(checked)
294 {
295 file.setPermissions(QFile::ReadOwner | QFile::ReadGroup | QFile::ReadOther);
296
297 permissions = QFileInfo(AktFileName).permissions();
298
299 if(permissions.testFlag(QFile::WriteOwner))
300 {
301 QMessageBox::warning(this,tr("Fehler !"),tr("Leider konnte der Schreibschutz der Disk Image Datei nicht gesetzt werden.\nBitte überprüfen Sie ob Sie über genügend Rechte verfügen.\nDer Emu64 wird diese Datei dennoch nicht verändern !"));
302 }
303 emit WriteProtectedChanged(checked);
304 }
305 else
306 {
307 file.setPermissions(QFile::ReadOwner | QFile::ReadGroup | QFile::ReadOther | QFile::WriteOwner);
308
309 permissions = QFileInfo(AktFileName).permissions();
310
311 if(!permissions.testFlag(QFile::WriteOwner))
312 {
313 ui->WriteProtected->setChecked(true);
314 QMessageBox::warning(this,tr("Fehler !"),tr("Leider konnte der Schreibschutz der Disk Image Datei nicht entfernt werden.\nBitte überprüfen Sie ob Sie über genügend Rechte verfügen.\n Auf das Disk Image kann momentan nicht geschrieben werden !"));
315 }
316 emit WriteProtectedChanged(ui->WriteProtected->isChecked());
317 }
318 }
319
on_view_refresh_clicked()320 void WidgetFileBrowse::on_view_refresh_clicked()
321 {
322 RefreshAktDir();
323 }
324
on_delete_file_clicked()325 void WidgetFileBrowse::on_delete_file_clicked()
326 {
327 QString file_path = dirmodel->fileInfo(ui->listView_filebrowser->currentIndex()).absoluteFilePath().toLocal8Bit();
328
329 if(!QFile(file_path).exists()) return;
330
331 if(QMessageBox::Yes == QMessageBox::question(this,tr("Löschen?"),tr("Möchten Sie diese Datei wirklich entfernen?\n\n") + "[" + file_path + "]",QMessageBox::Yes | QMessageBox::No))
332 {
333 QFile file(file_path);
334 if(!file.remove())
335 {
336 QMessageBox::critical(this,tr("Fehler !"),tr("Die Datei konnte nicht gelöscht werden.\n\n") + file.errorString());
337 }
338 }
339 }
340
on_to_home_clicked()341 void WidgetFileBrowse::on_to_home_clicked()
342 {
343 SetAktDir(QDir::homePath());
344 }
345
rootPathName(const QString & aPath)346 QString WidgetFileBrowse::rootPathName(const QString &aPath)
347 {
348 QRegExp reg("([A-Za-z]:[\\\\|/])");
349
350 int nIndex = reg.indexIn(aPath);
351
352 QString strRootPathName;
353
354 if (nIndex > -1)
355 {
356 strRootPathName = reg.cap(1);
357 }
358 return strRootPathName;
359 }
360
on_drive_list_currentIndexChanged(const QString & arg1)361 void WidgetFileBrowse::on_drive_list_currentIndexChanged(const QString &arg1)
362 {
363 SetAktDir(arg1);
364 }
365