1 // SPDX-FileCopyrightText: 2005 Pino Toscano <toscano.pino@tiscali.it>
2 // SPDX-License-Identifier: GPL-2.0-or-later
3 
4 #include "kigfiledialog.h"
5 
6 #include <cassert>
7 
8 #include <QPointer>
9 #include <QPushButton>
10 #include <QVBoxLayout>
11 
12 #include <KLocalizedString>
13 #include <KMessageBox>
14 
KigFileDialog(const QString & startDir,const QString & filter,const QString & caption,QWidget * parent)15 KigFileDialog::KigFileDialog( const QString& startDir, const QString& filter,
16               const QString& caption,  QWidget* parent )
17   : QFileDialog( parent, caption, startDir, filter ),
18     mow( 0L )
19 {
20   setAcceptMode( QFileDialog::AcceptSave );
21   setFileMode( QFileDialog::AnyFile );
22   moptcaption = i18n( "Options" );
23 }
24 
setOptionsWidget(QWidget * w)25 void KigFileDialog::setOptionsWidget( QWidget* w )
26 {
27   mow = w;
28 }
29 
accept()30 void KigFileDialog::accept()
31 {
32   // i know this is an ugly hack, but i hadn't found other ways to get
33   // the selected file name _before_ the dialog is accept()'ed or
34   // reject()'ed... in every case, below we make sure to accept() or
35   // reject()...
36   setResult( QDialog::Accepted );
37 
38   QString sFile = selectedFile();
39 
40   if ( QFile::exists( sFile ) )
41   {
42     int ret = KMessageBox::warningContinueCancel( this,
43                                          i18n( "The file \"%1\" already exists. Do you wish to overwrite it?" ,
44                                            sFile ), i18n( "Overwrite File?" ), KStandardGuiItem::overwrite() );
45     if ( ret != KMessageBox::Continue )
46     {
47       QFileDialog::reject();
48       return;
49     }
50   }
51   if ( mow )
52   {
53     QPointer<QDialog> optdlg = new QDialog( this );
54     QDialogButtonBox* buttonBox = new QDialogButtonBox( QDialogButtonBox::Cancel | QDialogButtonBox::Ok );
55     QPushButton *okButton = buttonBox->button( QDialogButtonBox::Ok );
56     QVBoxLayout* mainLayout = new QVBoxLayout;
57 
58     okButton->setDefault( true );
59     okButton->setShortcut( Qt::CTRL | Qt::Key_Return );
60     optdlg->setLayout( mainLayout );
61     mainLayout->addWidget( mow );
62     mainLayout->addWidget( buttonBox );
63     optdlg->setWindowTitle( moptcaption );
64 
65     connect( buttonBox, &QDialogButtonBox::accepted, optdlg.data(), &QDialog::accept );
66     connect( buttonBox, &QDialogButtonBox::rejected, optdlg.data(), &QDialog::reject);
67 
68     (optdlg->exec() == QDialog::Accepted) ? QFileDialog::accept() : QFileDialog::reject();
69   }
70   else
71     QFileDialog::accept();
72 }
73 
setOptionCaption(const QString & caption)74 void KigFileDialog::setOptionCaption( const QString& caption )
75 {
76   if ( caption.isEmpty() )
77     return;
78 
79   moptcaption = caption;
80 }
81 
selectedFile()82 QString KigFileDialog::selectedFile()
83 {
84   QStringList files = selectedFiles();
85 
86   assert( files.size() == 1 );
87 
88   return files[0];
89 }
90 
91