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