1 /*
2 For general Scribus (>=1.3.2) copyright and licensing information please refer
3 to the COPYING file provided with the program. Following this notice may exist
4 a copyright and/or license notice that predates the release of Scribus 1.3.2
5 for which a new license (GPL+exception) is in place.
6 */
7 
8 /***************************************************************************
9                           customfdialog.cpp  -  description
10                              -------------------
11     begin                : Fri Nov 30 2001
12     copyright            : (C) 2001 by Franz Schmid
13     email                : Franz.Schmid@altmuehlnet.de
14  ***************************************************************************/
15 
16 /***************************************************************************
17  *                                                                         *
18  *   This program is free software; you can redistribute it and/or modify  *
19  *   it under the terms of the GNU General Public License as published by  *
20  *   the Free Software Foundation; either version 2 of the License, or     *
21  *   (at your option) any later version.                                   *
22  *                                                                         *
23  ***************************************************************************/
24 
25 #include <QApplication>
26 #include <QCheckBox>
27 #include <QComboBox>
28 #include <QDir>
29 #include <QFileInfo>
30 #include <QFrame>
31 #include <QHBoxLayout>
32 #include <QIcon>
33 #include <QImageReader>
34 #include <QLabel>
35 #include <QPainter>
36 #include <QPixmap>
37 #include <QPushButton>
38 #include <QTextCodec>
39 #include <QVBoxLayout>
40 
41 #include "customfdialog.h"
42 
43 #include "../plugins/formatidlist.h"
44 #include "cmsettings.h"
45 #include "commonstrings.h"
46 #include "fileloader.h"
47 #include "iconmanager.h"
48 #include "loadsaveplugin.h"
49 #include "prefsmanager.h"
50 #include "scfilewidget.h"
51 #include "scimage.h"
52 #include "scpreview.h"
53 #include "scribusstructs.h"
54 #include "scslainforeader.h"
55 #include "units.h"
56 #include "util.h"
57 #include "util_color.h"
58 #include "util_formats.h"
59 
60 
61 
62 
63 extern QString DocDir;
64 
ImIconProvider()65 ImIconProvider::ImIconProvider()
66 {
67 	QString tmp[] = {"eps", "epsi", "gif", "png", "jpg", "jpeg", "xpm", "tif", "tiff", "bmp", "pbm", "pgm", "ppm", "xbm", "xpm", "psd", "pat"};
68 	size_t arraySize = sizeof(tmp) / sizeof(*tmp);
69 	fmts.reserve(arraySize);
70 	for (size_t i = 0; i < arraySize; ++i)
71 		fmts.append(tmp[i]);
72 	IconManager& im=IconManager::instance();
73 	imagepm = im.loadIcon("16/image-x-generic.png");
74 	pspm = im.loadIcon("postscript.png");
75 	txtpm = im.loadIcon("txt.png");
76 	docpm = im.loadIcon("doc.png");
77 	pdfpm = im.loadIcon("pdf.png");
78 	oosxdpm = im.loadIcon("ooo_draw.png");
79 	oosxwpm = im.loadIcon("ooo_writer.png");
80 	vectorpm = im.loadIcon("vectorgfx.png");
81 }
82 
icon(const QFileInfo & fi) const83 QIcon ImIconProvider::icon(const QFileInfo &fi) const
84 {
85 	QStringList allFormatsV = LoadSavePlugin::getExtensionsForImport(FORMATID_FIRSTUSER);
86 	QString ext = fi.suffix().toLower();
87 	if (ext.isEmpty())
88 		return QFileIconProvider::icon(fi);
89 	if (fmts.contains(ext, Qt::CaseInsensitive))
90 		return imagepm;
91 	ext = fi.completeSuffix().toLower();
92 	if (ext.endsWith("ps", Qt::CaseInsensitive))
93 		return pspm;
94 	if (ext.endsWith("txt", Qt::CaseInsensitive))
95 		return txtpm;
96 	if (ext.endsWith("scd", Qt::CaseInsensitive) || ext.endsWith("scd.gz", Qt::CaseInsensitive))
97 		return docpm;
98 	if (ext.endsWith("sla", Qt::CaseInsensitive) || ext.endsWith("sla.gz", Qt::CaseInsensitive))
99 		return docpm;
100 	if (ext.endsWith("pdf", Qt::CaseInsensitive))
101 		return pdfpm;
102 	if (ext.endsWith("sxd", Qt::CaseInsensitive))
103 		return oosxdpm;
104 	if (ext.endsWith("sxw", Qt::CaseInsensitive))
105 		return oosxwpm;
106 	if (allFormatsV.contains(ext) || ext.endsWith("sce", Qt::CaseInsensitive) || ext.endsWith("shape", Qt::CaseInsensitive))
107 		return vectorpm;
108 	return QFileIconProvider::icon(fi);
109 }
110 
FDialogPreview(QWidget * pa)111 FDialogPreview::FDialogPreview(QWidget *pa) : QLabel(pa)
112 {
113 	setAlignment(Qt::AlignLeft | Qt::AlignTop);
114 	setFixedSize( QSize( 200, 200 ) );
115 	setScaledContents( false );
116 	setFrameShape( QLabel::WinPanel );
117 	setFrameShadow( QLabel::Sunken );
118 	updatePix();
119 }
120 
updatePix()121 void FDialogPreview::updatePix()
122 {
123 	QPixmap pm;
124 	QRect inside = contentsRect();
125 	pm = QPixmap(inside.width(), inside.height());
126 	pm.fill(Qt::white);
127 	setPixmap(pm);
128 }
129 
genPreview(const QString & name)130 void FDialogPreview::genPreview(const QString& name)
131 {
132 	QPixmap pm;
133 	QString Buffer;
134 	updatePix();
135 	if (name.isEmpty())
136 		return;
137 	QFileInfo fi = QFileInfo(name);
138 	if (fi.isDir())
139 		return;
140 	int w = pixmap()->width();
141 	int h = pixmap()->height();
142 	bool mode = false;
143 	QString ext = fi.suffix().toLower();
144 	QString formatD(FormatsManager::instance()->extensionListForFormat(FormatsManager::IMAGESIMGFRAME, 1));
145  	QStringList formats = formatD.split("|");
146 	formats.append("pat");
147 	formats.removeAll("pdf");
148 
149 	QStringList allFormatsV = LoadSavePlugin::getExtensionsForPreview(FORMATID_FIRSTUSER);
150 	if (ext.isEmpty())
151 		ext = getImageType(name);
152 	if (formats.contains(ext.toUtf8()))
153 	{
154 		ScImage im;
155 		//No doc to send data anyway, so no doc to get into scimage.
156 		CMSettings cms(nullptr, "", Intent_Perceptual);
157 		cms.allowColorManagement(false);
158 		if (!im.loadPicture(name, 1, cms, ScImage::Thumbnail, 72, &mode))
159 			return;
160 		int ix,iy;
161 		if ((im.imgInfo.exifDataValid) && (!im.imgInfo.exifInfo.thumbnail.isNull()))
162 		{
163 			ix = im.imgInfo.exifInfo.width;
164 			iy = im.imgInfo.exifInfo.height;
165 		}
166 		else
167 		{
168 			ix = im.width();
169 			iy = im.height();
170 		}
171 		int xres = im.imgInfo.xres;
172 		int yres = im.imgInfo.yres;
173 		QString tmp;
174 		QString tmp2;
175 		QImage im2 = im.scaled(w - 5, h - 44, Qt::KeepAspectRatio, Qt::SmoothTransformation);
176 		QPainter p;
177 		QBrush b(QColor(205,205,205), IconManager::instance().loadPixmap("testfill.png"));
178 		// Qt4 FIXME imho should be better
179 		pm = *pixmap();
180 		p.begin(&pm);
181 		p.fillRect(0, 0, w, h-44, b);
182 		p.fillRect(0, h-44, w, 44, QColor(255, 255, 255));
183 		p.drawImage((w - im2.width()) / 2, (h - 44 - im2.height()) / 2, im2);
184 		p.drawText(2, h-29, tr("Size:")+" "+tmp.setNum(ix)+" x "+tmp2.setNum(iy));
185 		if (!(extensionIndicatesPDF(ext) || extensionIndicatesEPSorPS(ext)))
186 			p.drawText(2, h-17, tr("Resolution:")+" "+tmp.setNum(xres)+" x "+tmp2.setNum(yres)+" "+ tr("DPI"));
187 		QString cSpace;
188 		if ((extensionIndicatesPDF(ext) || extensionIndicatesEPSorPS(ext)) && (im.imgInfo.type != ImageType7))
189 			cSpace = tr("Unknown");
190 		else
191 			cSpace=colorSpaceText(im.imgInfo.colorspace);
192 		p.drawText(2, h-5, tr("Colorspace:")+" "+cSpace);
193 		p.end();
194 		setPixmap(pm);
195 		repaint();
196 	}
197 	else if (allFormatsV.contains(ext.toUtf8()))
198 	{
199 		FileLoader *fileLoader = new FileLoader(name);
200 		int testResult = fileLoader->testFile();
201 		delete fileLoader;
202 		if ((testResult == -1) || (testResult < FORMATID_FIRSTUSER))
203 			return;
204 		const FileFormat * fmt = LoadSavePlugin::getFormatById(testResult);
205 		if (!fmt)
206 			return;
207 		QImage im = fmt->readThumbnail(name);
208 		if (im.isNull())
209 			return;
210 		QString desc = tr("Size:")+" ";
211 		desc += value2String(im.text("XSize").toDouble(), PrefsManager::instance().appPrefs.docSetupPrefs.docUnitIndex, true, true);
212 		desc += " x ";
213 		desc += value2String(im.text("YSize").toDouble(), PrefsManager::instance().appPrefs.docSetupPrefs.docUnitIndex, true, true);
214 		im = im.scaled(w - 5, h - 21, Qt::KeepAspectRatio, Qt::SmoothTransformation);
215 		QPainter p;
216 		QBrush b(QColor(205,205,205), IconManager::instance().loadPixmap("testfill.png"));
217 		pm = *pixmap();
218 		p.begin(&pm);
219 		p.fillRect(0, 0, w, h-21, b);
220 		p.fillRect(0, h-21, w, 21, QColor(255, 255, 255));
221 		p.drawImage((w - im.width()) / 2, (h - 21 - im.height()) / 2, im);
222 		p.drawText(2, h-5, desc);
223 		p.end();
224 		setPixmap(pm);
225 		repaint();
226 	}
227 	else if (ext.toUtf8() == "sce")
228 	{
229 		QByteArray cf;
230 		if (!loadRawText(name, cf))
231 			return;
232 		QString f;
233 		if (cf.left(16) == "<SCRIBUSELEMUTF8")
234 			f = QString::fromUtf8(cf.data());
235 		else
236 			f = cf.data();
237 		ScPreview *pre = new ScPreview();
238 		QImage im = pre->createPreview(f);
239 		im = im.scaled(w - 5, h - 21, Qt::KeepAspectRatio, Qt::SmoothTransformation);
240 		QPainter p;
241 		QBrush b(QColor(205,205,205), IconManager::instance().loadPixmap("testfill.png"));
242 		pm = *pixmap();
243 		p.begin(&pm);
244 		p.fillRect(0, 0, w, h-21, b);
245 		p.fillRect(0, h-21, w, 21, QColor(255, 255, 255));
246 		p.drawImage((w - im.width()) / 2, (h - 21 - im.height()) / 2, im);
247 		QString desc = tr("Size:")+QString(" %1 x %2").arg(im.width()).arg(im.height());
248 		p.drawText(2, h-5, desc);
249 		p.end();
250 		setPixmap(pm);
251 		repaint();
252 		delete pre;
253 	}
254 	else
255 	{
256 		ScSlaInfoReader slaInfos;
257 		if (slaInfos.readInfos(name))
258 		{
259 			QString Title = tr("Title:")+" ";
260 			QString ti2 = slaInfos.title();
261 			if (ti2.isEmpty())
262 				ti2= tr("No Title");
263 			Title += ti2+"\n";
264 			QString Author = tr("Author:")+" ";
265 			QString au2 = slaInfos.author();
266 			if (au2.isEmpty())
267 				au2 = tr("Unknown");
268 			Author += au2+"\n";
269 			QString Format =  tr("File Format:")+" ";
270 			QString fm2 = slaInfos.format();
271 			if (fm2.isEmpty())
272 				fm2 = tr("Unknown");
273 			Format += fm2;
274 			setText( tr("Scribus Document")+"\n\n"+Title+Author+Format);
275 		}
276 		else  if ((ext == "txt") || (ext == "html") || (ext == "xml"))
277 		{
278 			if (loadText(name, &Buffer))
279 				setText(Buffer.left(200));
280 		}
281 	}
282 }
283 
CustomFDialog(QWidget * parent,const QString & wDir,const QString & caption,const QString & filter,int flags)284 CustomFDialog::CustomFDialog(QWidget *parent, const QString& wDir, const QString& caption, const QString& filter, int flags)
285 			: QDialog(parent), m_optionFlags(flags)
286 {
287 	setModal(true);
288 	setWindowTitle(caption);
289 	setWindowIcon(IconManager::instance().loadIcon("AppIcon.png"));
290 	vboxLayout = new QVBoxLayout(this);
291 	vboxLayout->setSpacing(6);
292 	vboxLayout->setContentsMargins(9, 9, 9, 9);
293 	hboxLayout = new QHBoxLayout;
294 	hboxLayout->setSpacing(6);
295 	hboxLayout->setContentsMargins(0, 0, 0, 0);
296 	fileDialog = new ScFileWidget(this);
297 	fileDialog->setIconProvider(new ImIconProvider());
298 	fileDialog->setNameFilter(filter);
299 	fileDialog->selectNameFilter(filter);
300 	fileDialog->setDirectory(wDir);
301 	hboxLayout->addWidget(fileDialog);
302 	vboxLayout1 = new QVBoxLayout;
303 	vboxLayout1->setSpacing(6);
304 	vboxLayout1->setContentsMargins(0, 28, 0, 0);
305 	vboxLayout1->setAlignment( Qt::AlignTop );
306 	filePreview = new FDialogPreview( this );
307 	filePreview->setMinimumSize(QSize(200, 200));
308 	filePreview->setMaximumSize(QSize(200, 200));
309 	vboxLayout1->addWidget(filePreview);
310 	hboxLayout->addLayout(vboxLayout1);
311 	vboxLayout->addLayout(hboxLayout);
312 	QHBoxLayout *hboxLayout1 = new QHBoxLayout;
313 	hboxLayout1->setSpacing(6);
314 	hboxLayout1->setContentsMargins(0, 0, 0, 0);
315 	showPreview = new QCheckBox(this);
316 	showPreview->setText( tr("Show Preview"));
317 	showPreview->setToolTip( tr("Show a preview and information for the selected file"));
318 	showPreview->setChecked(true);
319 	m_previewIsShown = true;
320 	hboxLayout1->addWidget(showPreview);
321 	QSpacerItem *spacerItem = new QSpacerItem(2, 2, QSizePolicy::Expanding, QSizePolicy::Minimum);
322 	hboxLayout1->addItem(spacerItem);
323 	okButton = new QPushButton( CommonStrings::tr_OK, this);
324 	okButton->setDefault( true );
325 	hboxLayout1->addWidget( okButton );
326 	if (flags & fdDisableOk)
327 		okButton->setEnabled(false);
328 	cancelButton = new QPushButton( CommonStrings::tr_Cancel, this);
329 	cancelButton->setAutoDefault( false );
330 	hboxLayout1->addWidget( cancelButton );
331 	vboxLayout->addLayout(hboxLayout1);
332 
333 	if (flags & fdDirectoriesOnly)
334 	{
335 		Layout = new QFrame(this);
336 		Layout1 = new QHBoxLayout(Layout);
337 		Layout1->setSpacing(6);
338 		Layout1->setContentsMargins(0, 0, 0, 0);
339 		saveZip = new QCheckBox( tr( "&Compress File" ), Layout);
340 		Layout1->addWidget(saveZip, Qt::AlignLeft);
341 		QSpacerItem* spacer = new QSpacerItem( 2, 2, QSizePolicy::Expanding, QSizePolicy::Minimum );
342 		Layout1->addItem( spacer );
343 		vboxLayout->addWidget(Layout);
344 		LayoutC = new QFrame(this);
345 		Layout1C = new QHBoxLayout(LayoutC);
346 		Layout1C->setSpacing(6);
347 		Layout1C->setContentsMargins(0, 0, 0, 0);
348 		withFonts = new QCheckBox( tr( "&Include Fonts" ), LayoutC);
349 		Layout1C->addWidget(withFonts, Qt::AlignLeft);
350 		withProfiles = new QCheckBox( tr( "&Include Color Profiles" ), LayoutC);
351 		Layout1C->addWidget(withProfiles, Qt::AlignLeft);
352 		QSpacerItem* spacer2 = new QSpacerItem( 2, 2, QSizePolicy::Expanding, QSizePolicy::Minimum );
353 		Layout1C->addItem( spacer2 );
354 		vboxLayout->addWidget(LayoutC);
355 		fileDialog->setFileMode(QFileDialog::DirectoryOnly);
356 		fileDialog->forceDoubleClickActivation(false);
357 		filePreview->hide();
358 		showPreview->setVisible(false);
359 		showPreview->setChecked(false);
360 		m_previewIsShown = false;
361 	}
362 	else
363 	{
364 		if (flags & fdCompressFile)
365 		{
366 			Layout = new QFrame(this);
367 			Layout1 = new QHBoxLayout(Layout);
368 			Layout1->setSpacing(6);
369 			Layout1->setContentsMargins(0, 0, 0, 0);
370 			saveZip = new QCheckBox( tr( "&Compress File" ), Layout);
371 			Layout1->addWidget(saveZip);
372 			QSpacerItem* spacer = new QSpacerItem( 2, 2, QSizePolicy::Expanding, QSizePolicy::Minimum );
373 			Layout1->addItem( spacer );
374 		}
375 		if (flags & fdExistingFiles)
376 			fileDialog->setFileMode(QFileDialog::ExistingFile);
377 		else if (flags & fdExistingFilesI)
378 			fileDialog->setFileMode(QFileDialog::ExistingFiles);
379 		else
380 		{
381 			fileDialog->setFileMode(QFileDialog::AnyFile);
382 			if (flags & fdCompressFile)
383 				vboxLayout->addWidget(Layout);
384 		}
385 
386 		if (saveZip != nullptr)
387 			saveZip->setToolTip( "<qt>" + tr( "Compress the Scribus document on save" ) + "</qt>");
388 		if (withFonts != nullptr)
389 			withFonts->setToolTip( "<qt>" + tr( "Include fonts when collecting files for the document. Be sure to know and understand licensing information for any fonts you collect and possibly redistribute." ) + "</qt>");
390 		if (withProfiles != nullptr)
391 			withProfiles->setToolTip( "<qt>" + tr( "Include color profiles when collecting files for the document" ) + "</qt>");
392 
393 		if (flags & fdShowCodecs)
394 		{
395 			LayoutC = new QFrame(this);
396 			Layout1C = new QHBoxLayout(LayoutC);
397 			Layout1C->setSpacing(6);
398 			Layout1C->setContentsMargins(0, 0, 0, 0);
399 			optionLabel = new QLabel(this);
400 			optionLabel->setText( tr("Encoding:"));
401 			Layout1C->addWidget(optionLabel);
402 			optionCombo = new QComboBox(LayoutC);
403 			optionCombo->setEditable(false);
404 			QString tmp_txc[] = {"ISO 8859-1", "ISO 8859-2", "ISO 8859-3",
405 								"ISO 8859-4", "ISO 8859-5", "ISO 8859-6",
406 								"ISO 8859-7", "ISO 8859-8", "ISO 8859-9",
407 								"ISO 8859-10", "ISO 8859-13", "ISO 8859-14",
408 								"ISO 8859-15", "UTF-8", "UTF-16", "KOI8-R", "KOI8-U",
409 								"CP1250", "CP1251", "CP1252", "CP1253",
410 								"CP1254", "CP1255", "CP1256", "CP1257",
411 								"Apple Roman"};
412 			size_t array = sizeof(tmp_txc) / sizeof(*tmp_txc);
413 			for (uint a = 0; a < array; ++a)
414 				optionCombo->addItem(tmp_txc[a]);
415 			QString localEn = QTextCodec::codecForLocale()->name();
416 			if (localEn == "ISO-10646-UCS-2")
417 				localEn = "UTF-16";
418 			bool hasIt = false;
419 			for (int cc = 0; cc < optionCombo->count(); ++cc)
420 			{
421 				if (optionCombo->itemText(cc) == localEn)
422 				{
423 					optionCombo->setCurrentIndex(cc);
424 					hasIt = true;
425 					break;
426 				}
427 			}
428 			if (!hasIt)
429 			{
430 				optionCombo->addItem(localEn);
431 				optionCombo->setCurrentIndex(optionCombo->count()-1);
432 			}
433 			optionCombo->setMinimumSize(QSize(200, 0));
434 			Layout1C->addWidget(optionCombo);
435 			QSpacerItem* spacer2 = new QSpacerItem( 2, 2, QSizePolicy::Expanding, QSizePolicy::Minimum );
436 			Layout1C->addItem( spacer2 );
437 			vboxLayout->addWidget(LayoutC);
438 		}
439 		if (flags & fdShowImportOptions)
440 		{
441 			LayoutC = new QFrame(this);
442 			Layout1C = new QHBoxLayout(LayoutC);
443 			Layout1C->setSpacing(6);
444 			Layout1C->setContentsMargins(0, 0, 0, 0);
445 			optionLabel = new QLabel(this);
446 			optionLabel->setText( tr("Import Option:"));
447 			Layout1C->addWidget(optionLabel);
448 			optionCombo = new QComboBox(LayoutC);
449 			optionCombo->setEditable(false);
450 			optionCombo->addItem( tr("Keep original size"));
451 			optionCombo->addItem( tr("Downscale to page size"));
452 			optionCombo->addItem( tr("Upscale to page size"));
453 			optionCombo->setCurrentIndex(0);
454 			optionCombo->setMinimumSize(QSize(200, 0));
455 			Layout1C->addWidget(optionCombo);
456 			QSpacerItem* spacer2 = new QSpacerItem( 2, 2, QSizePolicy::Expanding, QSizePolicy::Minimum );
457 			Layout1C->addItem( spacer2 );
458 			vboxLayout->addWidget(LayoutC);
459 		}
460 		bool setter2 = flags & fdHidePreviewCheckBox;
461 		if (!setter2)
462 		{
463 			bool setter = flags & fdShowPreview;
464 			showPreview->setChecked(setter);
465 			m_previewIsShown = setter;
466 			filePreview->setVisible(setter);
467 		}
468 		else
469 		{
470 			showPreview->hide();
471 			m_previewIsShown = false;
472 			filePreview->setVisible(false);
473 		}
474 		if (flags & fdCompressFile)
475 			connect(saveZip, SIGNAL(clicked()), this, SLOT(handleCompress()));
476 	}
477 	fileDialog->forceDoubleClickActivation(m_previewIsShown);
478 	fileDialog->setOption(QFileDialog::HideNameFilterDetails, true);
479 	m_extZip = "gz";
480 	connect(okButton, SIGNAL(clicked()), this, SLOT(okClicked()));
481 	connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
482 	connect(showPreview, SIGNAL(clicked()), this, SLOT(togglePreview()));
483 	connect(fileDialog, SIGNAL(currentChanged(const QString &)), this, SLOT(fileClicked(const QString &)));
484 	connect(fileDialog, SIGNAL(filesSelected(const QStringList &)), this, SLOT(accept()));
485 	connect(fileDialog, SIGNAL(accepted()), this, SLOT(accept()));
486 	connect(fileDialog, SIGNAL(rejected()), this, SLOT(reject()));
487 	resize(minimumSizeHint());
488 }
489 
~CustomFDialog()490 CustomFDialog::~CustomFDialog()
491 {
492 }
493 
fileClicked(const QString & path)494 void CustomFDialog::fileClicked(const QString &path)
495 {
496 	if (m_optionFlags & fdDisableOk)
497 		okButton->setEnabled(!path.isEmpty());
498 	if (m_previewIsShown)
499 		filePreview->genPreview(path);
500 }
501 
okClicked()502 void CustomFDialog::okClicked()
503 {
504 	QString selFile=selectedFile();
505 	if (selFile.isEmpty())
506 		return;
507 	QFileInfo fi(selFile);
508 	if (fi.isDir() && (fileDialog->fileMode() != QFileDialog::DirectoryOnly))
509 		fileDialog->gotoSelectedDirectory();
510 	else
511 		accept();
512 }
513 
togglePreview()514 void CustomFDialog::togglePreview()
515 {
516 	m_previewIsShown = !m_previewIsShown;
517 	fileDialog->forceDoubleClickActivation(m_previewIsShown);
518 	filePreview->setVisible(m_previewIsShown);
519 	if (m_previewIsShown)
520 	{
521 		QStringList sel = fileDialog->selectedFiles();
522 		if (!sel.isEmpty())
523 			filePreview->genPreview(QDir::fromNativeSeparators(sel[0]));
524 	}
525 	// #11856: Hack to avoid file dialog widget turning black with Qt5
526 	qApp->processEvents();
527 	filePreview->setVisible(!m_previewIsShown);
528 	qApp->processEvents();
529 	filePreview->setVisible(m_previewIsShown);
530 	fileDialog->repaint();
531 	qApp->processEvents();
532 	repaint();
533 }
534 
setSelection(const QString & fileName)535 void CustomFDialog::setSelection(const QString& fileName)
536 {
537 	fileDialog->selectFile( QFileInfo(fileName).fileName() );
538 	if (m_previewIsShown)
539 		filePreview->genPreview(fileName);
540 }
541 
selectedFile() const542 QString CustomFDialog::selectedFile() const
543 {
544 	QStringList sel = fileDialog->selectedFiles();
545 	if (!sel.isEmpty())
546 		return QDir::fromNativeSeparators(sel[0]);
547 	return QString();
548 }
549 
selectedFiles() const550 QStringList CustomFDialog::selectedFiles() const
551 {
552 	return fileDialog->selectedFiles();
553 }
554 
addWidgets(QWidget * widgets)555 void CustomFDialog::addWidgets(QWidget *widgets)
556 {
557 	vboxLayout->addWidget(widgets);
558 }
559 
handleCompress()560 void CustomFDialog::handleCompress()
561 {
562 	QString   fileName;
563 	QFileInfo tmp(selectedFile());
564 	QString   fn(tmp.fileName());
565 	QStringList fc = fn.split(".", Qt::KeepEmptyParts);
566 	if (fc.count() > 0)
567 		fileName = fc.at(0);
568 	for (int a = 1; a < fc.count(); a++)
569 	{
570 		if (fc.at(a).compare("sla", Qt::CaseInsensitive) == 0)
571 			continue;
572 		if (fc.at(a).compare("gz", Qt::CaseInsensitive) == 0)
573 			continue;
574 		if (fc.at(a).compare(m_ext, Qt::CaseInsensitive) == 0)
575 			continue;
576 		if (fc.at(a).compare(m_extZip, Qt::CaseInsensitive) == 0)
577 			continue;
578 		fileName += "." + fc[a];
579 	}
580 	if (saveZip->isChecked())
581 		tmp.setFile(fileName + "." + m_extZip);
582 	else
583 		tmp.setFile(fileName + "." + m_ext);
584 	setSelection(tmp.fileName());
585 }
586 
setExtension(const QString & e)587 void CustomFDialog::setExtension(const QString& e)
588 {
589 	m_ext = e;
590 }
591 
extension() const592 const QString&  CustomFDialog::extension() const
593 {
594 	return m_ext;
595 }
596 
setZipExtension(const QString & e)597 void CustomFDialog::setZipExtension(const QString& e)
598 {
599 	m_extZip = e;
600 }
601 
zipExtension() const602 const QString& CustomFDialog::zipExtension() const
603 {
604 	return m_extZip;
605 }
606 
isTextCodecShown() const607 bool CustomFDialog::isTextCodecShown() const
608 {
609 	if ((m_optionFlags & fdShowCodecs) == 0)
610 		return false;
611 	if (optionCombo)
612 		return optionCombo->isVisible();
613 	return false;
614 }
615 
setTextCodec(const QString & textCodec)616 void CustomFDialog::setTextCodec(const QString& textCodec)
617 {
618 	if ((m_optionFlags & fdShowCodecs) == 0)
619 		return;
620 	if (!optionCombo)
621 		return;
622 
623 	QString textEncoding = textCodec;
624 	if (textCodec.isEmpty())
625 		textEncoding = "System";
626 
627 	int index = optionCombo->findText(textEncoding, Qt::MatchFixedString);
628 	if (index < 0)
629 		return;
630 	optionCombo->setCurrentIndex(index);
631 }
632 
textCodec() const633 QString CustomFDialog::textCodec() const
634 {
635 	if ((m_optionFlags & fdShowCodecs) == 0)
636 		return QString();
637 	if (optionCombo)
638 		return optionCombo->currentText();
639 	return QString();
640 }
641 
isSaveZipFileShown() const642 bool CustomFDialog::isSaveZipFileShown() const
643 {
644 	if (saveZip)
645 		return saveZip->isVisible();
646 	return false;
647 }
648 
setSaveZipFile(bool value)649 void CustomFDialog::setSaveZipFile(bool value)
650 {
651 	if (!saveZip)
652 		return;
653 	saveZip->setChecked(value);
654 }
655 
saveZipFile() const656 bool CustomFDialog::saveZipFile() const
657 {
658 	if (saveZip)
659 		return saveZip->isChecked();
660 	return false;
661 }
662 
isIncludeFontsShown() const663 bool CustomFDialog::isIncludeFontsShown() const
664 {
665 	if (withFonts)
666 		return withFonts->isVisible();
667 	return false;
668 }
669 
setIncludeFonts(bool value)670 void CustomFDialog::setIncludeFonts(bool value)
671 {
672 	if (!withFonts)
673 		return;
674 	withFonts->setChecked(value);
675 }
676 
includeFonts() const677 bool CustomFDialog::includeFonts() const
678 {
679 	if (withFonts)
680 		return withFonts->isChecked();
681 	return false;
682 }
683 
isIncludeProfilesShown() const684 bool CustomFDialog::isIncludeProfilesShown() const
685 {
686 	if (withProfiles)
687 		return withProfiles->isVisible();
688 	return false;
689 }
690 
setIncludeProfiles(bool value)691 void CustomFDialog::setIncludeProfiles(bool value)
692 {
693 	if (!withProfiles)
694 		return;
695 	withProfiles->setChecked(value);
696 }
697 
includeProfiles() const698 bool CustomFDialog::includeProfiles() const
699 {
700 	if (withProfiles)
701 		return withProfiles->isChecked();
702 	return false;
703 }
704 
currentOptionIndex() const705 int CustomFDialog::currentOptionIndex() const
706 {
707 	if (optionCombo)
708 		return optionCombo->currentIndex();
709 	return -1;
710 }
711