kwave  18.07.70
Kwave::FileDialog Class Reference

#include <FileDialog.h>

Inheritance diagram for Kwave::FileDialog:
Inheritance graph
Collaboration diagram for Kwave::FileDialog:
Collaboration graph

Public Types

enum  OperationMode { SaveFile = 0, OpenFile, SelectDir }
 

Signals

void filterChanged (const QString &filter)
 

Public Member Functions

 FileDialog (const QString &startDir, OperationMode mode, const QString &filter, QWidget *parent, const QUrl last_url=QUrl(), const QString last_ext=QString())
 
virtual ~FileDialog () Q_DECL_OVERRIDE
 
QString selectedExtension ()
 
QUrl selectedUrl () const
 
QUrl baseUrl () const
 
void setDirectory (const QString &directory)
 
void selectUrl (const QUrl &url)
 
void setCustomWidget (QWidget *widget)
 
KUrlComboBox * locationEdit () const
 

Protected Slots

virtual void accept () Q_DECL_OVERRIDE
 
void saveConfig ()
 

Protected Member Functions

void loadConfig (const QString &section)
 

Private Member Functions

QString guessFilterFromFileExt (const QString &pattern, OperationMode mode)
 

Private Attributes

QVBoxLayout m_layout
 
KFileWidget m_file_widget
 
QString m_config_group
 
QUrl m_last_url
 
QString m_last_ext
 

Detailed Description

An improved version of KFileWidget that does not forget the previous directory and pre-selects the previous file extension.

Definition at line 41 of file FileDialog.h.

Member Enumeration Documentation

◆ OperationMode

Enumerator
SaveFile 

save a file

OpenFile 

open a file

SelectDir 

select a directory

Definition at line 45 of file FileDialog.h.

Constructor & Destructor Documentation

◆ FileDialog()

Kwave::FileDialog::FileDialog ( const QString &  startDir,
OperationMode  mode,
const QString &  filter,
QWidget *  parent,
const QUrl  last_url = QUrl(),
const QString  last_ext = QString() 
)

Constructor.

See also
KFileWidget
Parameters
startDirdirectory to start with, can start with the scheme "kfiledialog://scope/path"
modedetermines the mode in which the dialog is used, either to open a file, save a file or select a directory
filtera "\n" separated list of file filters, each filter consists of a space separated list of file patterns (including "*.") and a "|" as separator followed by a verbose description of the file type
parentthe parent widget of the dialog
last_urlURL used for the last call, optional
last_extfile extension (pattern) used for the last call (optional), including a "*."

Definition at line 41 of file FileDialog.cpp.

References _, accept(), Kwave::connect(), DBG, filterChanged(), guessFilterFromFileExt(), loadConfig(), m_file_widget, m_last_ext, m_last_url, m_layout, OpenFile, SaveFile, and SelectDir.

49  :QDialog(parent),
50  m_layout(this),
51  m_file_widget(QUrl::fromUserInput(startDir), this),
53  m_last_url(last_url),
54  m_last_ext(last_ext)
55 {
56  const bool saving = (mode == SaveFile);
57 
58  // do some layout and init stuff
59  m_layout.addWidget(&m_file_widget);
60  setMinimumSize(m_file_widget.dialogSizeHint());
61  setModal(true);
62  connect(&m_file_widget, SIGNAL(filterChanged(QString)),
63  this, SIGNAL(filterChanged(QString)));
64 
65  // connect the Cancel button
66  QPushButton *button;
67  button = m_file_widget.cancelButton();
68  connect(button, SIGNAL(clicked()), this, SLOT(reject()));
69  button->show();
70 
71  // connect the Open/Save button
72  button = m_file_widget.okButton();
73  connect(&m_file_widget, SIGNAL(accepted()), this, SLOT(accept()));
74  connect(button, SIGNAL(clicked(bool)), &m_file_widget, SLOT(slotOk()));
75  button->show();
76 
77  switch (mode) {
78  case SaveFile:
79  m_file_widget.setOperationMode(KFileWidget::Saving);
80  m_file_widget.setMode(KFile::File);
81  m_file_widget.setConfirmOverwrite(false);
82  break;
83  case OpenFile:
84  m_file_widget.setOperationMode(KFileWidget::Opening);
85  m_file_widget.setMode(KFile::File |
86  KFile::ExistingOnly);
87  break;
88  case SelectDir:
89  m_file_widget.setOperationMode(KFileWidget::Opening);
90  m_file_widget.setMode(KFile::Directory |
91  KFile::ExistingOnly);
92  break;
93  }
94 
95  QString special_prefix = _("kfiledialog:///");
96  if (startDir.startsWith(special_prefix)) {
97  // configuration key given
98  m_file_widget.setKeepLocation(true);
99 
100  // load initial settings
101  QString section = startDir;
102  section = section.remove(0, special_prefix.length());
103  if (section.contains(_("/")))
104  section = section.left(section.indexOf(_("/")));
105  section.prepend(_("KwaveFileDialog-"));
106  loadConfig(section);
107  }
108 
109  // if a file extension was passed but no filter, try to guess
110  // the mime type
111  QString file_filter = filter;
112  if (!file_filter.length() && m_last_ext.length()) {
113  file_filter = guessFilterFromFileExt(m_last_ext, mode);
114  qDebug("guessed filter for '%s': '%s",
115  DBG(m_last_ext), DBG(file_filter));
116  }
117 
118  // if a filename or directory URL was passed, try to re-use it
119  if (!m_last_url.isEmpty() && (m_last_url.isLocalFile() || saving)) {
120  QFileInfo file(m_last_url.toLocalFile());
121  if (QFileInfo(file.path()).exists() || saving)
122  m_file_widget.setUrl(m_last_url.adjusted(QUrl::RemoveFilename));
123  if (!file.isDir() && (file.exists() || saving))
124  m_file_widget.setSelectedUrl(
125  QUrl::fromLocalFile(m_last_url.fileName()));
126  }
127 
128  // parse the list of file filters and put the last extension on top
129  if (file_filter.length()) {
130  QStringList filter_list = file_filter.split(_("\n"));
131  QStringList name_filters;
132  QString best_filter;
133  QString best_pattern;
134  foreach (const QString &filter_item, filter_list) {
135  QString f(filter_item);
136  QString p(_("*"));
137  if (f.contains(_("|"))) {
138  int i = f.indexOf(_("|"));
139  p = f.left(i);
140  f = f.mid(i + 1);
141  }
142  if (!f.length()) continue;
143 
144  // put the last extension to the top of the list
145  // and thus make it selected
146  if (m_last_ext.length()) {
147  QStringList extensions = p.split(_(" "));
148  if (extensions.contains(m_last_ext)) {
149  if (!best_filter.length() ||
150  (p.length() <= best_pattern.length())) {
151  best_filter = filter_item;
152  best_pattern = p;
153  }
154  }
155  }
156 
157  name_filters.append(filter_item);
158  }
159  if (best_filter.length()) {
160  name_filters.removeAll(best_filter);
161  name_filters.prepend(best_filter);
162  }
163 
164  m_file_widget.setFilter(name_filters.join(QChar::fromLatin1('\n')));
165  }
166 }
KFileWidget m_file_widget
Definition: FileDialog.h:154
QVBoxLayout m_layout
Definition: FileDialog.h:151
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
Definition: Connect.cpp:48
QString guessFilterFromFileExt(const QString &pattern, OperationMode mode)
Definition: FileDialog.cpp:288
void loadConfig(const QString &section)
Definition: FileDialog.cpp:169
QString m_config_group
Definition: FileDialog.h:157
#define _(m)
Definition: memcpy.c:66
#define DBG(qs)
Definition: String.h:55
QString m_last_ext
Definition: FileDialog.h:163
void filterChanged(const QString &filter)
virtual void accept() Q_DECL_OVERRIDE
Definition: FileDialog.cpp:277
Here is the call graph for this function:

◆ ~FileDialog()

virtual Kwave::FileDialog::~FileDialog ( )
inlinevirtual

Destructor

Definition at line 75 of file FileDialog.h.

76  {
77  }

Member Function Documentation

◆ accept

void Kwave::FileDialog::accept ( )
protectedvirtualslot

overwritten to call accept() of the KFileWidget and saveConfig()

Definition at line 277 of file FileDialog.cpp.

References m_file_widget, and saveConfig().

Referenced by FileDialog().

278 {
279  m_file_widget.accept();
280 
281  // save the configuration when the dialog was accepted
282  saveConfig();
283 
284  QDialog::accept();
285 }
KFileWidget m_file_widget
Definition: FileDialog.h:154
Here is the call graph for this function:
Here is the caller graph for this function:

◆ baseUrl()

QUrl Kwave::FileDialog::baseUrl ( ) const

Returns the URL of the currently visible directory

Definition at line 259 of file FileDialog.cpp.

References m_file_widget.

Referenced by Kwave::SaveBlocksDialog::emitUpdate().

260 {
261  return m_file_widget.baseUrl();
262 }
KFileWidget m_file_widget
Definition: FileDialog.h:154
Here is the caller graph for this function:

◆ filterChanged

void Kwave::FileDialog::filterChanged ( const QString &  filter)
signal

Referenced by FileDialog(), and Kwave::SaveBlocksDialog::SaveBlocksDialog().

Here is the caller graph for this function:

◆ guessFilterFromFileExt()

QString Kwave::FileDialog::guessFilterFromFileExt ( const QString &  pattern,
OperationMode  mode 
)
private

Try to guess a file filter from a given file extension

Parameters
patterna file extension, e.g. "*.wav *.snd"
modedetermines the mode in which the dialog is used, see constructor
Returns
a filter string suitable for a KFileDialog

Definition at line 288 of file FileDialog.cpp.

References _, Kwave::CodecManager::decodingFilter(), Kwave::CodecManager::encodingFilter(), and SaveFile.

Referenced by FileDialog().

290 {
291  // if there are multiple extensions in a list, iterate over them
292  if (pattern.contains(_(" "))) {
293  QStringList patterns = pattern.split(_(" "));
294  foreach (const QString &p, patterns) {
295  QString f = guessFilterFromFileExt(p, mode);
296  if (f.length()) return f;
297  }
298  }
299 
300  // get the filter list of our own codecs, this prefers the Kwave internal
301  // mime types against the ones from KDE
302  QString filters = (mode == SaveFile) ?
305  foreach (const QString &filter, filters.split(_(" "))) {
306  QString p = filter;
307  if (p.contains(_("|"))) {
308  int i = p.indexOf(_("|"));
309  p = p.left(i);
310  }
311  foreach (const QString &mask, p.split(_(" "))) {
312  if (mask == pattern) {
313 // qDebug("MATCH from CodecManager: '%s' matches '%s' -> '%s'",
314 // DBG(mask), DBG(pattern), DBG(filter));
315  return filter;
316  }
317  }
318  }
319 
320  // try to find out by asking the Qt mime database
321  QMimeDatabase db;
322  QList<QMimeType> mime_types = db.mimeTypesForFileName(pattern);
323  if (!mime_types.isEmpty()) {
324  foreach (const QMimeType &m, mime_types) {
325  if (m.isValid() && !m.isDefault()) {
326  QString filter_string =
327  m.globPatterns().join(_(" ")) + _("|") +
328  m.filterString();
329 // qDebug("MATCH from QMimeDatabase: '%s' -> '%s'",
330 // DBG(pattern), DBG(filter_string));
331  return filter_string;
332  }
333  }
334  }
335 
336  return QString();
337 }
static QString encodingFilter()
QString guessFilterFromFileExt(const QString &pattern, OperationMode mode)
Definition: FileDialog.cpp:288
static QString decodingFilter()
#define _(m)
Definition: memcpy.c:66
Here is the call graph for this function:
Here is the caller graph for this function:

◆ loadConfig()

void Kwave::FileDialog::loadConfig ( const QString &  section)
protected

load previous settings

Definition at line 169 of file FileDialog.cpp.

References m_config_group, m_last_ext, and m_last_url.

Referenced by FileDialog().

170 {
171  if (!section.length()) return;
172  KConfigGroup cfg = KSharedConfig::openConfig()->group(section);
173  m_config_group = section;
174  if (!m_last_url.isEmpty()) {
175  QUrl last_path = cfg.readEntry("last_url", m_last_url);
176  if (!last_path.isEmpty()) {
177  // take last path, but user defined file name
178  QString file_name = m_last_url.fileName();
179  last_path = last_path.adjusted(QUrl::RemoveFilename);
180  m_last_url = QUrl::fromUserInput(last_path.path() + file_name);
181  }
182  } else {
183  m_last_url = QUrl::fromUserInput(cfg.readEntry("last_url",
184  m_last_url.toDisplayString()));
185  }
186  if (!m_last_ext.length())
187  m_last_ext = cfg.readEntry("last_ext", m_last_ext);
188 
189  // get last dialog size (Kwave global config)
190  cfg = KSharedConfig::openConfig()->group("FileDialog");
191  int w = cfg.readEntry("dialog_width", sizeHint().width());
192  int h = cfg.readEntry("dialog_height", sizeHint().height());
193  if (w < minimumWidth()) w = sizeHint().width();
194  if (h < minimumHeight()) w = sizeHint().height();
195  resize(w, h);
196 }
QString m_config_group
Definition: FileDialog.h:157
QString m_last_ext
Definition: FileDialog.h:163
Here is the caller graph for this function:

◆ locationEdit()

KUrlComboBox * Kwave::FileDialog::locationEdit ( ) const

Returns the combobox used to type the filename or full location of the file.

See also
KFileWidget

Definition at line 346 of file FileDialog.cpp.

References m_file_widget.

Referenced by Kwave::SaveBlocksDialog::emitUpdate(), and Kwave::SaveBlocksDialog::SaveBlocksDialog().

347 {
348  return m_file_widget.locationEdit();
349 }
KFileWidget m_file_widget
Definition: FileDialog.h:154
Here is the caller graph for this function:

◆ saveConfig

void Kwave::FileDialog::saveConfig ( )
protectedslot

save current settings

Definition at line 199 of file FileDialog.cpp.

References _, m_config_group, m_file_widget, m_last_ext, m_last_url, and selectedUrl().

Referenced by accept().

200 {
201  if (!m_config_group.length()) return;
202  if (selectedUrl().isEmpty()) return;
203 
204  QString file_name = selectedUrl().fileName();
205  if (!file_name.length()) return; // aborted
206 
207  // store the last URL
208  m_last_url = m_file_widget.baseUrl();
209 
210  // store the last extension if present
211  QFileInfo file(file_name);
212  QString extension = file.suffix();
213  if (extension.length()) {
214  // simple case: file extension
215  m_last_ext = _("*.") + extension;
216  } else {
217  // tricky case: filename mask
218  QString pattern = m_file_widget.currentFilter();
219  if (pattern.contains(_("|"))) {
220  int i = pattern.indexOf(_("|"));
221  pattern = pattern.left(i);
222  }
223  m_last_ext = _("");
224  foreach (const QString &mask, pattern.split(_(" "))) {
225  QRegExp regex(mask, Qt::CaseSensitive, QRegExp::Wildcard);
226  if (regex.indexIn(file_name) >= 0) {
227  m_last_ext = mask;
228  break;
229  }
230  }
231  }
232 
233  KConfigGroup cfg = KSharedConfig::openConfig()->group(m_config_group);
234  cfg.writeEntry("last_url", m_last_url);
235  cfg.writeEntry("last_ext", m_last_ext);
236  cfg.sync();
237 
238  // save the geometry of the dialog (Kwave global config)
239  cfg = KSharedConfig::openConfig()->group("FileDialog");
240  cfg.writeEntry("dialog_width", width());
241  cfg.writeEntry("dialog_height", height());
242  cfg.sync();
243 }
QUrl selectedUrl() const
Definition: FileDialog.cpp:253
KFileWidget m_file_widget
Definition: FileDialog.h:154
QString m_config_group
Definition: FileDialog.h:157
#define _(m)
Definition: memcpy.c:66
QString m_last_ext
Definition: FileDialog.h:163
Here is the call graph for this function:
Here is the caller graph for this function:

◆ selectedExtension()

QString Kwave::FileDialog::selectedExtension ( )

Returns the previously used extension, including "*."

Definition at line 246 of file FileDialog.cpp.

References _, and m_file_widget.

Referenced by Kwave::SaveBlocksDialog::emitUpdate().

247 {
248  QStringList ext_list = m_file_widget.currentFilter().split(_(" "));
249  return *(ext_list.begin());
250 }
KFileWidget m_file_widget
Definition: FileDialog.h:154
#define _(m)
Definition: memcpy.c:66
Here is the caller graph for this function:

◆ selectedUrl()

QUrl Kwave::FileDialog::selectedUrl ( ) const

Returns the first selected URL (if any)

Definition at line 253 of file FileDialog.cpp.

References m_file_widget.

Referenced by Kwave::MainWidget::loadLabels(), Kwave::TopWidget::openFile(), Kwave::SonagramWindow::save(), saveConfig(), Kwave::FileContext::saveFileAs(), Kwave::MainWidget::saveLabels(), and Kwave::MemoryDialog::searchSwapDir().

254 {
255  return m_file_widget.selectedUrl();
256 }
KFileWidget m_file_widget
Definition: FileDialog.h:154
Here is the caller graph for this function:

◆ selectUrl()

void Kwave::FileDialog::selectUrl ( const QUrl &  url)

Sets the currently selected URL

Parameters
urlthe new URL to show

Definition at line 271 of file FileDialog.cpp.

References m_file_widget.

Referenced by Kwave::PlayBackDialog::selectPlaybackDevice(), and Kwave::RecordDialog::selectRecordDevice().

272 {
273  m_file_widget.setUrl(url);
274 }
KFileWidget m_file_widget
Definition: FileDialog.h:154
Here is the caller graph for this function:

◆ setCustomWidget()

void Kwave::FileDialog::setCustomWidget ( QWidget *  widget)

Add a custom widget to the dialog

See also
KFileWidget

Definition at line 340 of file FileDialog.cpp.

References m_file_widget.

Referenced by Kwave::K3BExportDialog::K3BExportDialog(), and Kwave::SaveBlocksDialog::SaveBlocksDialog().

341 {
342  m_file_widget.setCustomWidget(widget);
343 }
KFileWidget m_file_widget
Definition: FileDialog.h:154
Here is the caller graph for this function:

◆ setDirectory()

void Kwave::FileDialog::setDirectory ( const QString &  directory)

Sets the current directory

Parameters
directorythe new directory to show

Definition at line 265 of file FileDialog.cpp.

References m_file_widget.

Referenced by Kwave::MP3EncoderDialog::browseFile().

266 {
267  m_file_widget.setStartDir(QUrl::fromUserInput(directory));
268 }
KFileWidget m_file_widget
Definition: FileDialog.h:154
Here is the caller graph for this function:

Member Data Documentation

◆ m_config_group

QString Kwave::FileDialog::m_config_group
private

name of the group in the config file

Definition at line 157 of file FileDialog.h.

Referenced by loadConfig(), and saveConfig().

◆ m_file_widget

KFileWidget Kwave::FileDialog::m_file_widget
private

the KFileWidget that we wrap

Definition at line 154 of file FileDialog.h.

Referenced by accept(), baseUrl(), FileDialog(), locationEdit(), saveConfig(), selectedExtension(), selectedUrl(), selectUrl(), setCustomWidget(), and setDirectory().

◆ m_last_ext

QString Kwave::FileDialog::m_last_ext
private

extension of the last selected single URL or file

Definition at line 163 of file FileDialog.h.

Referenced by FileDialog(), loadConfig(), and saveConfig().

◆ m_last_url

QUrl Kwave::FileDialog::m_last_url
private

URL of the previously opened file or directory

Definition at line 160 of file FileDialog.h.

Referenced by FileDialog(), loadConfig(), and saveConfig().

◆ m_layout

QVBoxLayout Kwave::FileDialog::m_layout
private

layout for holding the KFileWidget

Definition at line 151 of file FileDialog.h.

Referenced by FileDialog().


The documentation for this class was generated from the following files: