Git commit 2f09e7ee60d6553e545c7e677c3b64672a98448c by Thomas Eschenbacher. Committed on 03/11/2015 at 18:04. Pushed by eschenbacher into branch 'master'.
saveblocks: allow path separators in filename patterns to make it possible to create subdirectories M +2 -0 CHANGES M +8 -0 doc/en/index.docbook M +94 -31 plugins/saveblocks/SaveBlocksPlugin.cpp M +12 -0 plugins/saveblocks/SaveBlocksPlugin.h http://commits.kde.org/kwave/2f09e7ee60d6553e545c7e677c3b64672a98448c diff --git a/CHANGES b/CHANGES index 891d515..8994650 100644 --- a/CHANGES +++ b/CHANGES @@ -11,6 +11,8 @@ * cmdline option "--nofork" no longer exists * bugfix: multiple issues in context of switching the GUI type in scripts * saveblocks: fixed issues with special characters in filenames and patterns + * saveblocks: allow path separators in filename patterns to make it possible + to create subdirectories 0.9.0 [2015-05-25] diff --git a/doc/en/index.docbook b/doc/en/index.docbook index c2be02a..2169727 100644 --- a/doc/en/index.docbook +++ b/doc/en/index.docbook @@ -6915,6 +6915,14 @@ a pattern that can contain the original file name, an index and the number of sections. </para> + <para> + It is also allowed that the file name pattern contains forward + slashes as path separators, which allows saving the sections + into different sub directories. Please note that all whitespace + characters around such path separators are silently removed, to + avoid creation of directory names which begin or end with a + whitespace. + </para> </listitem> </varlistentry> <varlistentry> diff --git a/plugins/saveblocks/SaveBlocksPlugin.cpp b/plugins/saveblocks/SaveBlocksPlugin.cpp index 3c34813..298896f 100644 --- a/plugins/saveblocks/SaveBlocksPlugin.cpp +++ b/plugins/saveblocks/SaveBlocksPlugin.cpp @@ -153,6 +153,31 @@ QStringList *Kwave::SaveBlocksPlugin::setup(QStringList &previous_params) } //*************************************************************************** +QString Kwave::SaveBlocksPlugin::createDisplayList( + const QStringList &list, + unsigned int max_entries) const +{ + if (!max_entries || list.isEmpty()) return QString(); + + QString retval; + unsigned int count = 0; + + foreach (const QString &entry, list) { + if (count == 0) // first entry + retval = _("<br><br>"); + if (count < max_entries) + retval += entry + _("<br>"); + else if (count == max_entries) + retval += i18n("...") + _("<br>"); + + if (++count > max_entries) + break; + } + + return retval; +} + +//*************************************************************************** int Kwave::SaveBlocksPlugin::start(QStringList ¶ms) { qDebug("SaveBlocksPlugin::start()"); @@ -166,6 +191,7 @@ int Kwave::SaveBlocksPlugin::start(QStringList ¶ms) QString path = file.absolutePath(); QString ext = file.suffix(); QString base = findBase(filename, m_pattern); + QByteArray sep("/"); // determine the selection settings sample_index_t selection_left = 0; @@ -196,51 +222,81 @@ int Kwave::SaveBlocksPlugin::start(QStringList ¶ms) // qDebug("selection_only = %d", selection_only); // qDebug("indices = %u...%u (count=%u)", first, first+count-1,count); - // check for filenames that might be overwritten - const int max_overwrite_list_length = 7; - QDir dir(path, _("*")); - QStringList files; - files = dir.entryList(); - - QStringList overwritten; + // iterate over all blocks to check for overwritten files and missing dirs + QStringList overwritten_files; + QStringList missing_dirs; for (unsigned int i = first; i < (first + count); i++) { QString name = createFileName(base, ext, m_pattern, i, count, first + count - 1); - QRegExp rx(_("^(") + name + _(")$"), - Qt::CaseInsensitive); - QStringList matches = files.filter(rx); - if (matches.count() > 0) { - overwritten += Kwave::Parser::unescape(name); - if (overwritten.count() > max_overwrite_list_length) - break; // we have collected enough names... + QString display_name = Kwave::Parser::unescape(name); + + // split the name into directory and file name + name = QString::fromLatin1(QUrl::toPercentEncoding(display_name, sep)); + QUrl url = m_url.adjusted(QUrl::RemoveFilename); + url.setPath(url.path(QUrl::FullyEncoded) + name, QUrl::StrictMode); + + QString filename = url.path(); + QFileInfo file_info(filename); + + // check for potentially overwritten file + if (file_info.exists()) + overwritten_files += Kwave::Parser::unescape(display_name); + + // check for missing subdirectory + if (!file_info.dir().exists()) { + QFileInfo inf(display_name); + QString missing_dir = inf.path(); + if (!missing_dirs.contains(missing_dir)) + missing_dirs += missing_dir; } } - if (overwritten.count()) { - // ask the user for confirmation if he really wants to overwrite... - - QString list = _("<br><br>"); - int cnt = 0; - for (QStringList::Iterator it = overwritten.begin(); - it != overwritten.end() && (cnt <= max_overwrite_list_length); - ++it, ++cnt) - { - list += (*it); - list += _("<br>"); - } - if (overwritten.count() > max_overwrite_list_length) - list += i18n("..."); - list += _("<br>"); + // inform about overwritten files + if (!overwritten_files.isEmpty()) { + // ask the user for confirmation if he really wants to overwrite... if (Kwave::MessageBox::warningYesNo(parentWidget(), _("<html>") + i18n("This would overwrite the following file(s): %1" \ "Do you really want to continue?", - list) + _("</html>")) != KMessageBox::Yes) + createDisplayList(overwritten_files, 5)) + + _("</html>") ) != KMessageBox::Yes) { return -1; } } + // handle missing directories + if (!missing_dirs.isEmpty()) { + // ask the user if he wants to continue and create the directory + if (Kwave::MessageBox::warningContinueCancel(parentWidget(), + i18n("The following directories do not exist: %1" + "Do you want to create them and continue?", + createDisplayList(missing_dirs, 5)), + QString(), + QString(), + QString(), + _("saveblocks_create_missing_dirs") + ) != KMessageBox::Continue) + { + return -1; + } + + // create all missing directories + QUrl base_url = m_url.adjusted(QUrl::RemoveFilename); + foreach (const QString &missing, missing_dirs) { + QUrl url(base_url); + url.setPath( + base_url.path(QUrl::FullyEncoded) + + QString::fromLatin1(QUrl::toPercentEncoding(missing)), + QUrl::StrictMode + ); + QString path = url.path(); + QDir dir; + if (!dir.mkpath(path)) + qWarning("creating path '%s' failed", DBG(path)); + } + } + // save the current selection, we have to restore it afterwards! sample_index_t saved_selection_left = 0; sample_index_t saved_selection_right = 0; @@ -276,7 +332,7 @@ int Kwave::SaveBlocksPlugin::start(QStringList ¶ms) first + count - 1); name = Kwave::Parser::unescape(name); // use URL encoding for the filename - name = QString::fromLatin1(QUrl::toPercentEncoding(name)); + name = QString::fromLatin1(QUrl::toPercentEncoding(name, sep)); QUrl url = m_url.adjusted(QUrl::RemoveFilename); url.setPath(url.path(QUrl::FullyEncoded) + name, QUrl::StrictMode); @@ -416,6 +472,13 @@ QString Kwave::SaveBlocksPlugin::createFileName(const QString &base, } if (ext.length()) p += _(".") + ext; + + // sanitize the filename/path, make sure that there are no spaces + // before and after all path separators + QString sep = _("/"); + QRegExp rx_sep(_("\\s*") + sep + _("\\s*")); + p.replace(rx_sep, sep); + return p; } diff --git a/plugins/saveblocks/SaveBlocksPlugin.h b/plugins/saveblocks/SaveBlocksPlugin.h index 0c4836f..a7fc25d 100644 --- a/plugins/saveblocks/SaveBlocksPlugin.h +++ b/plugins/saveblocks/SaveBlocksPlugin.h @@ -154,6 +154,18 @@ namespace Kwave private: + /** + * internal helper to create a string that contains a HTML + * formated list of file names or directories + * @param list a list of file names or directories + * @param max_entries maximum number of entries to render + * @return the list as a single string, separated by "\<br\>" + */ + QString createDisplayList(const QStringList &list, + unsigned int max_entries) const; + + private: + /** the URL of the first file (user selection) */ QUrl m_url; _______________________________________________ kde-doc-english mailing list [email protected] https://mail.kde.org/mailman/listinfo/kde-doc-english
