Git commit c0dd251ee2877e3553801367e9b698278fbdb455 by Thomas Eschenbacher.
Committed on 03/11/2015 at 18:04.
Pushed by eschenbacher into branch 'master'.

saveblocks: added pattern to include the title of the current block

M  +2    -1    CHANGES
M  +13   -0    doc/en/index.docbook
M  +69   -17   plugins/saveblocks/SaveBlocksPlugin.cpp
M  +15   -4    plugins/saveblocks/SaveBlocksPlugin.h
M  +8    -0    plugins/saveblocks/SaveBlocksWidget.cpp

http://commits.kde.org/kwave/c0dd251ee2877e3553801367e9b698278fbdb455

diff --git a/CHANGES b/CHANGES
index faaa5e5..a3af7e2 100644
--- a/CHANGES
+++ b/CHANGES
@@ -15,7 +15,8 @@
    of patterns were ignored
  * saveblocks: allow path separators in filename patterns to make it possible
    to create subdirectories
- * saveblocks: added pattern to include file info (file meta data)
+ * saveblocks: added patterns to include file info (file meta data) or the
+   title of the current block
 
 0.9.0 [2015-05-25]
 
diff --git a/doc/en/index.docbook b/doc/en/index.docbook
index 07e1746..27f8a55 100644
--- a/doc/en/index.docbook
+++ b/doc/en/index.docbook
@@ -6995,6 +6995,19 @@
                                                    for a list of all available 
keywords.
                                                </entry>
                                            </row>
+                                           <row>
+                                               
<entry>&no-i18n-tag;<command>[%title]</command></entry>
+                                               <entry>
+                                                   Will be replaced with the 
title the block, which is taken
+                                                   from the descriptive text 
of the label at the
+                                                   <emphasis>start</emphasis> 
of the block.
+                                                   If that text is empty it 
will fall back to the title
+                                                   of the file (see file 
information item
+                                                   "<link 
linkend="INF_NAME">Name</link>").
+                                                   If this also does not 
exist, it will fall back to the
+                                                   base file name as described 
above.
+                                               </entry>
+                                           </row>
                                        </tbody>
                                    </tgroup>
                                </informaltable>
diff --git a/plugins/saveblocks/SaveBlocksPlugin.cpp 
b/plugins/saveblocks/SaveBlocksPlugin.cpp
index 2d0453c..77ce529 100644
--- a/plugins/saveblocks/SaveBlocksPlugin.cpp
+++ b/plugins/saveblocks/SaveBlocksPlugin.cpp
@@ -28,6 +28,7 @@
 #include <KLocalizedString>
 
 #include "libkwave/CodecManager.h"
+#include "libkwave/FileInfo.h"
 #include "libkwave/Label.h"
 #include "libkwave/LabelList.h"
 #include "libkwave/MessageBox.h"
@@ -46,7 +47,7 @@ KWAVE_PLUGIN(Kwave::SaveBlocksPlugin, "saveblocks", "2.4",
 Kwave::SaveBlocksPlugin::SaveBlocksPlugin(Kwave::PluginManager &plugin_manager)
     :Kwave::Plugin(plugin_manager),
      m_url(), m_pattern(), m_numbering_mode(CONTINUE),
-     m_selection_only(true)
+     m_selection_only(true), m_block_info()
 {
 }
 
@@ -73,6 +74,10 @@ QStringList *Kwave::SaveBlocksPlugin::setup(QStringList 
&previous_params)
                          (selection_right + 1 >= signalLength()));
     bool enable_selection_only = selected_something && !selected_all;
 
+    QString filename = m_url.path();
+    QString base = findBase(filename, m_pattern);
+    scanBlocksToSave(base, m_selection_only && enable_selection_only);
+
     QPointer<Kwave::SaveBlocksDialog> dialog =
        new(std::nothrow) Kwave::SaveBlocksDialog(
            _("kfiledialog:///kwave_save_blocks"),
@@ -212,7 +217,8 @@ int Kwave::SaveBlocksPlugin::start(QStringList &params)
     }
 
     // get the index range
-    unsigned int count = blocksToSave(selection_only);
+    scanBlocksToSave(base, selection_only);
+    unsigned int count = m_block_info.count();
     unsigned int first = firstIndex(path, base, ext, m_pattern,
                                     m_numbering_mode, count);
 
@@ -396,13 +402,14 @@ int 
Kwave::SaveBlocksPlugin::interpreteParameters(QStringList &params)
 }
 
 //***************************************************************************
-unsigned int Kwave::SaveBlocksPlugin::blocksToSave(bool selection_only)
+void Kwave::SaveBlocksPlugin::scanBlocksToSave(const QString &base,
+                                               bool selection_only)
 {
-    unsigned int count = 0;
     sample_index_t selection_left, selection_right;
 
     sample_index_t block_start;
     sample_index_t block_end = 0;
+    QString        block_title;
     Kwave::LabelList labels(signalManager().metaData());
     Kwave::LabelListIterator it(labels);
     Kwave::Label label = (it.hasNext()) ? it.next() : Kwave::Label();
@@ -410,19 +417,39 @@ unsigned int Kwave::SaveBlocksPlugin::blocksToSave(bool 
selection_only)
     if (selection_only) {
        selection(0, &selection_left, &selection_right, true);
     } else {
-       selection_left = 0;
+       selection_left  = 0;
        selection_right = signalLength() - 1;
     }
+
+    // get the title of the whole file, in case that a block does not have
+    // an own title
+    FileInfo info(signalManager().metaData());
+    QString file_title = info.get(INF_NAME).toString();
+
+    // fallback: if there is no INF_NAME either, fall back to the file
+    //           name as last resort
+    if (!file_title.length()) file_title = base;
+
+    m_block_info.clear();
+    QString prev_title;
     for (;;) {
        block_start = block_end;
        block_end   = (label.isNull()) ? signalLength() : label.pos();
-       if ((selection_left < block_end) && (selection_right > block_start))
-           count++;
+       block_title = prev_title;
+       prev_title  = (label.isNull()) ? file_title     : label.name();
+
+       if ((block_end > selection_left) && (block_start <= selection_right)) {
+           BlockInfo block;
+           block.m_start  = block_start;
+           block.m_length = block_end - block_start;
+           block.m_title  = block_title;
+           if (!block.m_title.length()) block.m_title = file_title;
+           m_block_info.append(block);
+       }
+
        if (label.isNull()) break;
        label = (it.hasNext()) ? it.next() : Kwave::Label();
     }
-
-    return count;
 }
 
 //***************************************************************************
@@ -482,7 +509,7 @@ QString Kwave::SaveBlocksPlugin::createFileName(const 
QString &base,
 
     // support for file info
     QRegExp rx_fileinfo(
-       _("\\\\\\[%(\\d*)fileinfo\\\\\\{([A-Z,a-z]+)\\\\\\}\\\\\\]"),
+       _("\\\\\\[%(\\d*)fileinfo\\\\\\{([\\w\\s]+)\\\\\\}\\\\\\]"),
        Qt::CaseInsensitive
     );
     Kwave::FileInfo info(signalManager().metaData());
@@ -524,6 +551,17 @@ QString Kwave::SaveBlocksPlugin::createFileName(const 
QString &base,
        p.replace(rx, value);
     }
 
+    // format the "title" parameter
+    QRegExp rx_title(_("\\\\\\[%title\\\\\\]"), Qt::CaseInsensitive);
+    if (rx_title.indexIn(p) >= 0) {
+       QString title;
+       int idx = (index - 1) - (total - count);
+       if ((idx >= 0) && (idx < m_block_info.count()))
+           title = m_block_info[idx].m_title;
+       if (title.length())
+           p.replace(rx_title, QRegExp::escape(title));
+    }
+
     if (ext.length()) p += _(".") + ext;
 
     // sanitize the filename/path, make sure that there are no spaces
@@ -578,20 +616,28 @@ QString Kwave::SaveBlocksPlugin::findBase(const QString 
&filename,
     // \[%[0-9]?count\]   -> \d+
     // \[%[0-9]?total\]   -> \d+
     // \[%filename\]      -> base
+    // \[%fileinfo\]      -> .
+    // \[%title\]         -> .
     QRegExp rx_nr(_("\\\\\\[%\\d*nr\\\\\\]"), Qt::CaseInsensitive);
     QRegExp rx_count(_("\\\\\\[%\\d*count\\\\\\]"), Qt::CaseInsensitive);
     QRegExp rx_total(_("\\\\\\[%\\d*total\\\\\\]"), Qt::CaseInsensitive);
     QRegExp rx_filename(_("\\\\\\[%filename\\\\\\]"), Qt::CaseInsensitive);
+    QRegExp rx_fileinfo(_("\\\\\\[%fileinfo\\\\\\]"), Qt::CaseInsensitive);
+    QRegExp rx_title(_("\\\\\\[%title\\\\\\]"), Qt::CaseInsensitive);
 
     QString p = QRegExp::escape(pattern);
-    int idx_nr = rx_nr.indexIn(p);
-    int idx_count = rx_count.indexIn(p);
-    int idx_total = rx_total.indexIn(p);
+    int idx_nr       = rx_nr.indexIn(p);
+    int idx_count    = rx_count.indexIn(p);
+    int idx_total    = rx_total.indexIn(p);
     int idx_filename = rx_filename.indexIn(p);
-    p.replace(rx_nr, _("(\\d+)"));
-    p.replace(rx_count, _("(\\d+)"));
-    p.replace(rx_total, _("(\\d+)"));
+    int idx_fileinfo = rx_fileinfo.indexIn(p);
+    int idx_title    = rx_fileinfo.indexIn(p);
+    p.replace(rx_nr,       _("(\\d+)"));
+    p.replace(rx_count,    _("(\\d+)"));
+    p.replace(rx_total,    _("(\\d+)"));
     p.replace(rx_filename, _("(.+)"));
+    p.replace(rx_fileinfo, _("(.+)"));
+    p.replace(rx_title,    _("(.+)"));
 
     int max = 0;
     for (int i = 0; i < pattern.length(); i++) {
@@ -599,10 +645,15 @@ QString Kwave::SaveBlocksPlugin::findBase(const QString 
&filename,
        if (idx_count    == max) max++;
        if (idx_total    == max) max++;
        if (idx_filename == max) max++;
+       if (idx_fileinfo == max) max++;
+       if (idx_title    == max) max++;
+
        if (idx_nr       > max) idx_nr--;
        if (idx_count    > max) idx_count--;
        if (idx_total    > max) idx_total--;
        if (idx_filename > max) idx_filename--;
+       if (idx_fileinfo > max) idx_fileinfo--;
+       if (idx_title    > max) idx_title--;
     }
 
     if (ext.length()) p += _(".") + ext;
@@ -627,7 +678,8 @@ QString Kwave::SaveBlocksPlugin::firstFileName(const 
QString &filename,
 
     // now we have a new name, base and extension
     // -> find out the numbering, min/max etc...
-    unsigned int count = blocksToSave(selection_only);
+    scanBlocksToSave(base, selection_only);
+    unsigned int count = m_block_info.count();
     unsigned int first = firstIndex(path, base, ext, pattern, mode, count);
     unsigned int total = first + count - 1;
 
diff --git a/plugins/saveblocks/SaveBlocksPlugin.h 
b/plugins/saveblocks/SaveBlocksPlugin.h
index a7fc25d..399b717 100644
--- a/plugins/saveblocks/SaveBlocksPlugin.h
+++ b/plugins/saveblocks/SaveBlocksPlugin.h
@@ -70,12 +70,12 @@ namespace Kwave
        int interpreteParameters(QStringList &params);
 
        /**
-        * Returns the number of blocks to save, depending on whether
-        * we save everything or only the selection
+        * determines the blocks which should be saved, including
+        * start position, length and title.
+        * @param base the base name, without indices, extension etc...
         * @param selection_only if true, save only selected blocks
-        * @return number of blocks, [0...N]
         */
-       unsigned int blocksToSave(bool selection_only);
+       void scanBlocksToSave(const QString &base, bool selection_only);
 
        /**
         * create a filename (without extension) out of a given base name,
@@ -154,6 +154,14 @@ namespace Kwave
 
     private:
 
+       typedef struct {
+           sample_index_t m_start;  /**< start of the block [samples] */
+           sample_index_t m_length; /**< length of the block [samples] */
+           QString        m_title;  /**< title of the block */
+       } BlockInfo;
+
+    private:
+
        /**
         * internal helper to create a string that contains a HTML
         * formated list of file names or directories
@@ -178,6 +186,9 @@ namespace Kwave
        /** if true, only save stuff within the selection */
        bool m_selection_only;
 
+       /** list of all blocks to save */
+       QList<BlockInfo> m_block_info;
+
     };
 }
 
diff --git a/plugins/saveblocks/SaveBlocksWidget.cpp 
b/plugins/saveblocks/SaveBlocksWidget.cpp
index 12ae783..d5c6197 100644
--- a/plugins/saveblocks/SaveBlocksWidget.cpp
+++ b/plugins/saveblocks/SaveBlocksWidget.cpp
@@ -22,6 +22,7 @@
 
 #include <KComboBox>
 
+#include "libkwave/FileInfo.h"
 #include "libkwave/String.h"
 
 #include "SaveBlocksWidget.h"
@@ -36,8 +37,15 @@ Kwave::SaveBlocksWidget::SaveBlocksWidget(QWidget *parent,
 {
     setupUi(this);
 
+    Kwave::FileInfo info;
+
     // the file name pattern combo box
+    cbPattern->addItem(_("[%2nr]-[%title]"));
     cbPattern->addItem(_("[%filename] part [%nr] of [%total]"));
+    cbPattern->addItem(
+       _("[%fileinfo{") +
+       info.name(Kwave::INF_NAME) +
+       _("}] (part [%nr] of [%total])"));
     cbPattern->addItem(_("[%filename] - [%04nr]"));
     cbPattern->addItem(_("[%2nr] [%filename]"));
     cbPattern->addItem(_("[%2nr]-[%filename]"));

_______________________________________________
kde-doc-english mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/kde-doc-english

Reply via email to