From 4aecafef4cd8a6fdba9c85c8714c29bdfab4ced4 Mon Sep 17 00:00:00 2001
From: "craig.p.drummond"
Date: Thu, 31 May 2012 19:48:31 +0000
Subject: [PATCH] Add Track Organizer dialog to Qt-only build.
---
CMakeLists.txt | 17 +-
ChangeLog | 1 +
devices/actiondialog.cpp | 6 +-
devices/actiondialog.h | 4 +-
devices/device.cpp | 278 --------------------
devices/device.h | 49 +---
devices/deviceoptions.cpp | 321 +++++++++++++++++++++++
devices/deviceoptions.h | 81 ++++++
devices/devicepropertiesdialog.cpp | 2 +-
devices/devicepropertiesdialog.h | 4 +-
devices/devicepropertieswidget.cpp | 8 +-
devices/devicepropertieswidget.h | 6 +-
devices/devicespage.cpp | 6 +-
devices/filenameschemedialog.cpp | 38 +--
devices/filenameschemedialog.h | 4 +-
devices/filenameschemedialog.ui | 27 +-
devices/mtpdevice.cpp | 6 +-
devices/mtpdevice.h | 2 +-
devices/remotedevicepropertiesdialog.cpp | 2 +-
devices/remotedevicepropertiesdialog.h | 4 +-
devices/remotefsdevice.cpp | 10 +-
devices/remotefsdevice.h | 6 +-
devices/remotekiodevice.cpp | 8 +-
devices/remotekiodevice.h | 4 +-
devices/trackorganiser.cpp | 48 ++--
devices/trackorganiser.h | 8 +-
devices/umsdevice.cpp | 10 +-
devices/umsdevice.h | 2 +-
devices/utils.cpp | 30 +++
devices/utils.h | 2 +
gui/albumspage.cpp | 4 +-
gui/folderpage.cpp | 7 +-
gui/librarypage.cpp | 4 +-
gui/mainwindow.cpp | 31 ++-
gui/mainwindow.h | 4 +-
models/devicesmodel.cpp | 2 +-
models/devicesmodel.h | 2 +-
widgets/dialog.h | 5 +-
widgets/messagebox.cpp | 22 +-
widgets/messagebox.h | 9 +-
40 files changed, 627 insertions(+), 457 deletions(-)
create mode 100644 devices/deviceoptions.cpp
create mode 100644 devices/deviceoptions.h
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7d30b7f3e..70a1706a2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -128,9 +128,12 @@ SET( CANTATA_SRCS
libmaia/maiaObject.cpp
libmaia/maiaFault.cpp
libmaia/maiaXmlRpcClient.cpp
+ devices/deviceoptions.cpp
+ devices/trackorganiser.cpp
devices/utils.cpp
http/httpserver.cpp
http/httpsocket.cpp
+ devices/filenameschemedialog.cpp
devices/tags.cpp
)
@@ -187,6 +190,8 @@ SET( CANTATA_MOC_HDRS
libmaia/maiaFault.h
libmaia/maiaXmlRpcClient.h
http/httpsocket.h
+ devices/filenameschemedialog.h
+ devices/trackorganiser.h
)
SET( CANTATA_UIS
@@ -206,6 +211,8 @@ SET( CANTATA_UIS
lyrics/lyricspage.ui
lyrics/lyricsettings.ui
widgets/itemview.ui
+ devices/filenameschemedialog.ui
+ devices/trackorganiser.ui
)
if (NOT WIN32)
@@ -341,14 +348,14 @@ IF( ENABLE_KDE_SUPPORT )
SET( CANTATA_SRCS ${CANTATA_SRCS} devices/mediadevicecache.cpp devices/devicespage.cpp
devices/device.cpp devices/fsdevice.cpp devices/umsdevice.cpp
models/devicesmodel.cpp devices/filetyperesolver.cpp devices/actiondialog.cpp devices/devicepropertieswidget.cpp
- devices/devicepropertiesdialog.cpp devices/filenameschemedialog.cpp devices/encoders.cpp
- devices/transcodingjob.cpp devices/valueslider.cpp devices/trackorganiser.cpp devices/syncdialog.cpp devices/synccollectionwidget.cpp)
+ devices/devicepropertiesdialog.cpp devices/encoders.cpp
+ devices/transcodingjob.cpp devices/valueslider.cpp devices/syncdialog.cpp devices/synccollectionwidget.cpp)
SET( CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} devices/mediadevicecache.h devices/devicespage.h
devices/device.h devices/fsdevice.h devices/umsdevice.h models/devicesmodel.h
devices/actiondialog.h devices/devicepropertieswidget.h devices/devicepropertiesdialog.h
- devices/filenameschemedialog.h devices/transcodingjob.h devices/valueslider.h devices/trackorganiser.h devices/syncdialog.h devices/synccollectionwidget.h)
+ devices/transcodingjob.h devices/valueslider.h devices/syncdialog.h devices/synccollectionwidget.h)
SET( CANTATA_UIS ${CANTATA_UIS} devices/devicespage.ui devices/actiondialog.ui devices/devicepropertieswidget.ui
- devices/filenameschemedialog.ui devices/trackorganiser.ui devices/synccollectionwidget.ui)
+ devices/synccollectionwidget.ui)
if (ENABLE_REMOTE_DEVICES)
SET(CANTATA_SRCS ${CANTATA_SRCS} devices/remotefsdevice.cpp devices/remotedevicepropertiesdialog.cpp
@@ -527,7 +534,7 @@ IF( ENABLE_KDE_SUPPORT )
endif( NOT MTP_FOUND OR NOT FFMPEG_FOUND OR NOT MPG123_FOUND )
ELSE( ENABLE_KDE_SUPPORT )
if (NOT WIN32)
- message("INFO: Building WITHOUT KDE support - Device sync, Track organizer, ReplayGain calculation, and CommandLine support DISABLED")
+ message("INFO: Building WITHOUT KDE support - Device sync, ReplayGain calculation, and CommandLine support DISABLED")
endif (NOT WIN32)
ENDIF( ENABLE_KDE_SUPPORT )
message("")
diff --git a/ChangeLog b/ChangeLog
index 27748c4cb..0b120a03e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,7 @@
2. Implement Ctrl+MouseWheel zoom for Qt-only info view.
3. Initial attempt at a Windows port. (This is my 1st EVER windows build, so
don't expect much!). See README.
+4. Add Track Organizer dialog to Qt-only build.
0.7.1
-----
diff --git a/devices/actiondialog.cpp b/devices/actiondialog.cpp
index c39b09592..4bd433b3c 100644
--- a/devices/actiondialog.cpp
+++ b/devices/actiondialog.cpp
@@ -446,8 +446,8 @@ void ActionDialog::configure(const QString &udi)
{
if (udi.isEmpty()) {
DevicePropertiesDialog *dlg=new DevicePropertiesDialog(this);
- connect(dlg, SIGNAL(updatedSettings(const QString &, const QString &, const Device::Options &)),
- SLOT(saveProperties(const QString &, const QString &, const Device::Options &)));
+ connect(dlg, SIGNAL(updatedSettings(const QString &, const QString &, const DeviceOptions &)),
+ SLOT(saveProperties(const QString &, const QString &, const DeviceOptions &)));
dlg->setCaption(i18n("Local Music Library Properties"));
dlg->show(Settings::self()->mpdDir(), QString(), namingOptions, DevicePropertiesWidget::Prop_Basic);
} else {
@@ -458,7 +458,7 @@ void ActionDialog::configure(const QString &udi)
}
}
-void ActionDialog::saveProperties(const QString &path, const QString &coverFile, const Device::Options &opts)
+void ActionDialog::saveProperties(const QString &path, const QString &coverFile, const DeviceOptions &opts)
{
Q_UNUSED(path)
Q_UNUSED(coverFile)
diff --git a/devices/actiondialog.h b/devices/actiondialog.h
index 67d169643..13a0b4a8a 100644
--- a/devices/actiondialog.h
+++ b/devices/actiondialog.h
@@ -59,7 +59,7 @@ Q_SIGNALS:
private Q_SLOTS:
void configureSource();
void configureDest();
- void saveProperties(const QString &path, const QString &coverFile, const Device::Options &opts);
+ void saveProperties(const QString &path, const QString &coverFile, const DeviceOptions &opts);
void actionStatus(int status);
void doNext();
void removeSongResult(KJob *job);
@@ -92,7 +92,7 @@ private:
bool haveVariousArtists;
Device *currentDev;
QString destFile;
- Device::Options namingOptions;
+ DeviceOptions namingOptions;
};
#endif
diff --git a/devices/device.cpp b/devices/device.cpp
index b59171378..2958cd091 100644
--- a/devices/device.cpp
+++ b/devices/device.cpp
@@ -39,288 +39,10 @@
#include
#include
#include
-#include
-#include
-#include
-#include
#include
-static QString cleanPath(const QString &path)
-{
- /* Unicode uses combining characters to form accented versions of other characters.
- * (Exception: Latin-1 table for compatibility with ASCII.)
- * Those can be found in the Unicode tables listed at:
- * http://en.wikipedia.org/w/index.php?title=Combining_character&oldid=255990982
- * Removing those characters removes accents. :) */
- QString result = path;
-
- // German umlauts
- result.replace(QChar(0x00e4), "ae").replace(QChar(0x00c4), "Ae");
- result.replace(QChar(0x00f6), "oe").replace(QChar(0x00d6), "Oe");
- result.replace(QChar(0x00fc), "ue").replace(QChar(0x00dc), "Ue");
- result.replace(QChar(0x00df), "ss");
-
- // other special cases
- result.replace(QChar(0x00C6), "AE");
- result.replace(QChar(0x00E6), "ae");
-
- result.replace(QChar(0x00D8), "OE");
- result.replace(QChar(0x00F8), "oe");
-
- // normalize in a form where accents are separate characters
- result = result.normalized(QString::NormalizationForm_D);
-
- // remove accents from table "Combining Diacritical Marks"
- for (int i = 0x0300; i <= 0x036F; i++) {
- result.remove(QChar(i));
- }
-
- return result;
-}
-
-static QString asciiPath(const QString &path)
-{
- QString result = path;
- for (int i = 0; i < result.length(); i++) {
- QChar c = result[ i ];
- if (c > QChar(0x7f) || c == QChar(0)) {
- c = '_';
- }
- result[ i ] = c;
- }
- return result;
-}
-
-QString vfatPath(const QString &path)
-{
- QString s = path;
-
- if (QDir::separator() == '/') {// we are on *nix, \ is a valid character in file or directory names, NOT the dir separator
- s.replace('\\', '_');
- } else {
- s.replace('/', '_'); // on windows we have to replace / instead
- }
-
- for (int i = 0; i < s.length(); i++) {
- QChar c = s[ i ];
- if (c < QChar(0x20) || c == QChar(0x7F) // 0x7F = 127 = DEL control character
- || c=='*' || c=='?' || c=='<' || c=='>'
- || c=='|' || c=='"' || c==':') {
- c = '_';
- } else if(c == '[') {
- c = '(';
- } else if (c == ']') {
- c = ')';
- }
- s[ i ] = c;
- }
-
- /* beware of reserved device names */
- uint len = s.length();
- if (len == 3 || (len > 3 && s[3] == '.')) {
- QString l = s.left(3).toLower();
- if(l=="aux" || l=="con" || l=="nul" || l=="prn")
- s = '_' + s;
- } else if (len == 4 || (len > 4 && s[4] == '.')) {
- QString l = s.left(3).toLower();
- QString d = s.mid(3,1);
- if ((l=="com" || l=="lpt") &&
- (d=="0" || d=="1" || d=="2" || d=="3" || d=="4" ||
- d=="5" || d=="6" || d=="7" || d=="8" || d=="9")) {
- s = '_' + s;
- }
- }
-
- // "clock$" is only allowed WITH extension, according to:
- // http://en.wikipedia.org/w/index.php?title=Filename&oldid=303934888#Comparison_of_file_name_limitations
- if (QString::compare(s, "clock$", Qt::CaseInsensitive) == 0) {
- s = '_' + s;
- }
-
- /* max path length of Windows API */
- s = s.left(255);
-
- /* whitespace at the end of folder/file names or extensions are bad */
- len = s.length();
- if (s[len-1] == ' ') {
- s[len-1] = '_';
- }
-
- int extensionIndex = s.lastIndexOf('.'); // correct trailing spaces in file name itself
- if ((s.length() > 1) && (extensionIndex > 0)) {
- if(s.at(extensionIndex - 1) == ' ') {
- s[extensionIndex - 1] = '_';
- }
- }
-
- for (int i = 1; i < s.length(); i++) {// correct trailing whitespace in folder names
- if ((s.at(i) == QDir::separator()) && (s.at(i - 1) == ' ')) {
- s[i - 1] = '_';
- }
- }
-
- return s;
-}
-
-static void manipulateThe(QString &str, bool reverse)
-{
- if (reverse)
- {
- if (!str.startsWith("the ", Qt::CaseInsensitive)) {
- return;
- }
-
- QString begin = str.left(3);
- str = str.append(", %1").arg(begin);
- str = str.mid(4);
- return;
- }
-
- if(!str.endsWith(", the", Qt::CaseInsensitive)) {
- return;
- }
-
- QString end = str.right(3);
- str = str.prepend("%1 ").arg(end);
- str.truncate(str.length() - end.length() - 2);
-}
-
-const QLatin1String Device::Options::constAlbumArtist("%albumartist%");
-const QLatin1String Device::Options::constAlbumTitle("%album%");
-const QLatin1String Device::Options::constTrackArtist("%artist%");
-const QLatin1String Device::Options::constTrackTitle("%title%");
-const QLatin1String Device::Options::constTrackNumber("%track%");
-const QLatin1String Device::Options::constCdNumber("%discnumber%");
-const QLatin1String Device::Options::constGenre("%genre%");
-const QLatin1String Device::Options::constYear("%year%");
const QLatin1String Device::constNoCover("-");
-Device::Options::Options()
- : scheme(constAlbumArtist+QChar('/')+
- constAlbumTitle+QChar('/')+
- constTrackNumber+QChar(' ')+
- constTrackTitle)
- , vfatSafe(true)
- , asciiOnly(false)
- , ignoreThe(false)
- , replaceSpaces(false)
- , fixVariousArtists(false)
- , transcoderValue(0)
- , transcoderWhenDifferent(false)
- , useCache(false)
- , autoScan(false)
-{
-}
-
-void Device::Options::load(const QString &group)
-{
- KConfigGroup grp(KGlobal::config(), group);
- scheme=grp.readEntry("scheme", scheme);
- vfatSafe=grp.readEntry("vfatSafe", vfatSafe);
- asciiOnly=grp.readEntry("asciiOnly", asciiOnly);
- ignoreThe=grp.readEntry("ignoreThe", ignoreThe);
- replaceSpaces=grp.readEntry("replaceSpaces", replaceSpaces);
- if (QLatin1String("mpd")!=group) {
- fixVariousArtists=grp.readEntry("fixVariousArtists", fixVariousArtists);
- transcoderCodec=grp.readEntry("transcoderCodec", transcoderCodec);
- transcoderValue=grp.readEntry("transcoderValue", transcoderValue);
- transcoderWhenDifferent=grp.readEntry("transcoderWhenDifferent", transcoderWhenDifferent);
- }
-}
-
-void Device::Options::save(const QString &group)
-{
- KConfigGroup grp(KGlobal::config(), group);
- grp.writeEntry("scheme", scheme);
- grp.writeEntry("vfatSafe", vfatSafe);
- grp.writeEntry("asciiOnly", asciiOnly);
- grp.writeEntry("ignoreThe", ignoreThe);
- grp.writeEntry("replaceSpaces", replaceSpaces);
- if (QLatin1String("mpd")!=group) {
- grp.writeEntry("fixVariousArtists", fixVariousArtists);
- grp.writeEntry("transcoderCodec", transcoderCodec);
- grp.writeEntry("transcoderValue", transcoderValue);
- grp.writeEntry("transcoderWhenDifferent", transcoderWhenDifferent);
- }
- grp.sync();
-}
-
-QString Device::Options::clean(const QString &str) const
-{
- QString result(str);
-
- if (asciiOnly) {
- result = cleanPath(result);
- result = asciiPath(result);
- }
-
- result.simplified();
- if (replaceSpaces) {
- result.replace(QRegExp("\\s"), "_");
- }
- if (vfatSafe) {
- result = vfatPath(result);
- }
-
- result.replace('/', '-');
-
- return result;
-}
-
-Song Device::Options::clean(const Song &s) const
-{
- Song copy=s;
- if (ignoreThe) {
- manipulateThe(copy.albumartist, true);
- manipulateThe(copy.artist, true);
- }
- copy.albumartist=clean(copy.albumartist);
- copy.artist=clean(copy.artist);
- copy.album=clean(copy.album);
- copy.title=clean(copy.title);
- copy.genre=clean(copy.genre);
- return copy;
-}
-
-QString Device::Options::createFilename(const Song &s) const
-{
- QString path=scheme;
- static QStringList ignore;
-
- if (ignore.isEmpty()) {
- ignore << QLatin1String("%composer%")
- << QLatin1String("%comment%")
- << QLatin1String("%filetype%")
- << QLatin1String("%ignore%")
- << QLatin1String("%folder%")
- << QLatin1String("%initial%");
- }
-
- foreach (const QString &i, ignore) {
- path.replace(i, QLatin1String(""));
- }
-
- Song copy=clean(s);
-
- path.replace(constAlbumArtist, copy.albumArtist());
- path.replace(constAlbumTitle, copy.album);
- path.replace(constTrackArtist, copy.artist);
- path.replace(constTrackTitle, copy.title);
- QString track(QString::number(copy.track));
- if (copy.track<10) {
- track=QChar('0')+track;
- }
- path.replace(constTrackNumber, track);
- path.replace(constCdNumber, copy.disc<1 ? QLatin1String("") : QString::number(copy.disc));
- path.replace(constGenre, copy.genre.isEmpty() ? i18n("Unknown") : copy.genre);
- path.replace(constYear, copy.year<1 ? QLatin1String("") : QString::number(copy.year));
- int extPos=s.file.lastIndexOf('.');
- if (-1!=extPos) {
- path+=s.file.mid(extPos);
- }
- return path;
-}
-
Device * Device::create(DevicesModel *m, const QString &udi)
{
Solid::Device device=Solid::Device(udi);
diff --git a/devices/device.h b/devices/device.h
index 61ec57f3e..d8f737dc2 100644
--- a/devices/device.h
+++ b/devices/device.h
@@ -27,6 +27,7 @@
#include "musiclibraryitemroot.h"
#include "song.h"
#include "encoders.h"
+#include "deviceoptions.h"
#include
#include
@@ -38,48 +39,6 @@ class Device : public MusicLibraryItemRoot
Q_OBJECT
public:
-
- struct Options {
- static const QLatin1String constAlbumArtist;
- static const QLatin1String constAlbumTitle;
- static const QLatin1String constTrackArtist;
- static const QLatin1String constTrackTitle;
- static const QLatin1String constTrackNumber;
- static const QLatin1String constCdNumber;
- static const QLatin1String constGenre;
- static const QLatin1String constYear;
-
- Options();
-
- void load(const QString &group);
- void save(const QString &group);
-
- bool operator==(const Options &o) const {
- return vfatSafe==o.vfatSafe && asciiOnly==o.asciiOnly && ignoreThe==o.ignoreThe &&
- replaceSpaces==o.replaceSpaces && scheme==o.scheme && fixVariousArtists==o.fixVariousArtists &&
- useCache==o.useCache && transcoderCodec==o.transcoderCodec && autoScan==o.autoScan &&
- (transcoderCodec.isEmpty() || (transcoderValue==o.transcoderValue && transcoderWhenDifferent==o.transcoderWhenDifferent));
- }
- bool operator!=(const Options &o) const {
- return !(*this==o);
- }
- QString clean(const QString &str) const;
- Song clean(const Song &s) const;
- QString createFilename(const Song &s) const;
-
- QString scheme;
- bool vfatSafe;
- bool asciiOnly;
- bool ignoreThe;
- bool replaceSpaces;
- bool fixVariousArtists;
- QString transcoderCodec;
- int transcoderValue;
- bool transcoderWhenDifferent;
- bool useCache;
- bool autoScan;
- };
-
static Device * create(DevicesModel *m, const QString &udi);
static bool fixVariousArtists(const QString &file, Song &song, bool applyFix);
@@ -162,10 +121,10 @@ public:
int newRows() const {
return update ? update->childCount() : 0;
}
- const Options & options() const {
+ const DeviceOptions & options() const {
return opts;
}
- void setOptions(const Options &o) {
+ void setOptions(const DeviceOptions &o) {
opts=o;
saveOptions();
}
@@ -216,7 +175,7 @@ Q_SIGNALS:
protected:
DevicesModel *model;
- Options opts;
+ DeviceOptions opts;
bool configured;
Solid::Device solidDev;
MusicLibraryItemRoot *update;
diff --git a/devices/deviceoptions.cpp b/devices/deviceoptions.cpp
new file mode 100644
index 000000000..89ae3b8b9
--- /dev/null
+++ b/devices/deviceoptions.cpp
@@ -0,0 +1,321 @@
+/*
+ * Cantata
+ *
+ * Copyright (c) 2011-2012 Craig Drummond
+ *
+ * ----
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "deviceoptions.h"
+#include "song.h"
+#include "localize.h"
+#ifdef ENABLE_KDE_SUPPORT
+#include
+#include
+#include
+#include
+#else
+#include
+#endif
+#include
+#include
+
+static QString cleanPath(const QString &path)
+{
+ /* Unicode uses combining characters to form accented versions of other characters.
+ * (Exception: Latin-1 table for compatibility with ASCII.)
+ * Those can be found in the Unicode tables listed at:
+ * http://en.wikipedia.org/w/index.php?title=Combining_character&oldid=255990982
+ * Removing those characters removes accents. :) */
+ QString result = path;
+
+ // German umlauts
+ result.replace(QChar(0x00e4), "ae").replace(QChar(0x00c4), "Ae");
+ result.replace(QChar(0x00f6), "oe").replace(QChar(0x00d6), "Oe");
+ result.replace(QChar(0x00fc), "ue").replace(QChar(0x00dc), "Ue");
+ result.replace(QChar(0x00df), "ss");
+
+ // other special cases
+ result.replace(QChar(0x00C6), "AE");
+ result.replace(QChar(0x00E6), "ae");
+
+ result.replace(QChar(0x00D8), "OE");
+ result.replace(QChar(0x00F8), "oe");
+
+ // normalize in a form where accents are separate characters
+ result = result.normalized(QString::NormalizationForm_D);
+
+ // remove accents from table "Combining Diacritical Marks"
+ for (int i = 0x0300; i <= 0x036F; i++) {
+ result.remove(QChar(i));
+ }
+
+ return result;
+}
+
+static QString asciiPath(const QString &path)
+{
+ QString result = path;
+ for (int i = 0; i < result.length(); i++) {
+ QChar c = result[ i ];
+ if (c > QChar(0x7f) || c == QChar(0)) {
+ c = '_';
+ }
+ result[ i ] = c;
+ }
+ return result;
+}
+
+QString vfatPath(const QString &path)
+{
+ QString s = path;
+
+ if (QDir::separator() == '/') {// we are on *nix, \ is a valid character in file or directory names, NOT the dir separator
+ s.replace('\\', '_');
+ } else {
+ s.replace('/', '_'); // on windows we have to replace / instead
+ }
+
+ for (int i = 0; i < s.length(); i++) {
+ QChar c = s[ i ];
+ if (c < QChar(0x20) || c == QChar(0x7F) // 0x7F = 127 = DEL control character
+ || c=='*' || c=='?' || c=='<' || c=='>'
+ || c=='|' || c=='"' || c==':') {
+ c = '_';
+ } else if(c == '[') {
+ c = '(';
+ } else if (c == ']') {
+ c = ')';
+ }
+ s[ i ] = c;
+ }
+
+ /* beware of reserved device names */
+ uint len = s.length();
+ if (len == 3 || (len > 3 && s[3] == '.')) {
+ QString l = s.left(3).toLower();
+ if(l=="aux" || l=="con" || l=="nul" || l=="prn")
+ s = '_' + s;
+ } else if (len == 4 || (len > 4 && s[4] == '.')) {
+ QString l = s.left(3).toLower();
+ QString d = s.mid(3,1);
+ if ((l=="com" || l=="lpt") &&
+ (d=="0" || d=="1" || d=="2" || d=="3" || d=="4" ||
+ d=="5" || d=="6" || d=="7" || d=="8" || d=="9")) {
+ s = '_' + s;
+ }
+ }
+
+ // "clock$" is only allowed WITH extension, according to:
+ // http://en.wikipedia.org/w/index.php?title=Filename&oldid=303934888#Comparison_of_file_name_limitations
+ if (QString::compare(s, "clock$", Qt::CaseInsensitive) == 0) {
+ s = '_' + s;
+ }
+
+ /* max path length of Windows API */
+ s = s.left(255);
+
+ /* whitespace at the end of folder/file names or extensions are bad */
+ len = s.length();
+ if (s[len-1] == ' ') {
+ s[len-1] = '_';
+ }
+
+ int extensionIndex = s.lastIndexOf('.'); // correct trailing spaces in file name itself
+ if ((s.length() > 1) && (extensionIndex > 0)) {
+ if(s.at(extensionIndex - 1) == ' ') {
+ s[extensionIndex - 1] = '_';
+ }
+ }
+
+ for (int i = 1; i < s.length(); i++) {// correct trailing whitespace in folder names
+ if ((s.at(i) == QDir::separator()) && (s.at(i - 1) == ' ')) {
+ s[i - 1] = '_';
+ }
+ }
+
+ return s;
+}
+
+static void manipulateThe(QString &str, bool reverse)
+{
+ if (reverse)
+ {
+ if (!str.startsWith("the ", Qt::CaseInsensitive)) {
+ return;
+ }
+
+ QString begin = str.left(3);
+ str = str.append(", %1").arg(begin);
+ str = str.mid(4);
+ return;
+ }
+
+ if(!str.endsWith(", the", Qt::CaseInsensitive)) {
+ return;
+ }
+
+ QString end = str.right(3);
+ str = str.prepend("%1 ").arg(end);
+ str.truncate(str.length() - end.length() - 2);
+}
+
+const QLatin1String DeviceOptions::constAlbumArtist("%albumartist%");
+const QLatin1String DeviceOptions::constAlbumTitle("%album%");
+const QLatin1String DeviceOptions::constTrackArtist("%artist%");
+const QLatin1String DeviceOptions::constTrackTitle("%title%");
+const QLatin1String DeviceOptions::constTrackNumber("%track%");
+const QLatin1String DeviceOptions::constCdNumber("%discnumber%");
+const QLatin1String DeviceOptions::constGenre("%genre%");
+const QLatin1String DeviceOptions::constYear("%year%");
+
+DeviceOptions::DeviceOptions()
+ : scheme(constAlbumArtist+QChar('/')+
+ constAlbumTitle+QChar('/')+
+ constTrackNumber+QChar(' ')+
+ constTrackTitle)
+ , vfatSafe(true)
+ , asciiOnly(false)
+ , ignoreThe(false)
+ , replaceSpaces(false)
+ #ifdef ENABLE_KDE_SUPPORT
+ , fixVariousArtists(false)
+ , transcoderValue(0)
+ , transcoderWhenDifferent(false)
+ , useCache(false)
+ , autoScan(false)
+ #endif
+{
+}
+
+void DeviceOptions::load(const QString &group)
+{
+ #ifdef ENABLE_KDE_SUPPORT
+ KConfigGroup grp(KGlobal::config(), group);
+ scheme=grp.readEntry("scheme", scheme);
+ vfatSafe=grp.readEntry("vfatSafe", vfatSafe);
+ asciiOnly=grp.readEntry("asciiOnly", asciiOnly);
+ ignoreThe=grp.readEntry("ignoreThe", ignoreThe);
+ replaceSpaces=grp.readEntry("replaceSpaces", replaceSpaces);
+ if (QLatin1String("mpd")!=group) {
+ fixVariousArtists=grp.readEntry("fixVariousArtists", fixVariousArtists);
+ transcoderCodec=grp.readEntry("transcoderCodec", transcoderCodec);
+ transcoderValue=grp.readEntry("transcoderValue", transcoderValue);
+ transcoderWhenDifferent=grp.readEntry("transcoderWhenDifferent", transcoderWhenDifferent);
+ }
+ #else
+ QSettings settings;
+
+ #endif
+}
+
+void DeviceOptions::save(const QString &group)
+{
+ #ifdef ENABLE_KDE_SUPPORT
+ KConfigGroup grp(KGlobal::config(), group);
+ grp.writeEntry("scheme", scheme);
+ grp.writeEntry("vfatSafe", vfatSafe);
+ grp.writeEntry("asciiOnly", asciiOnly);
+ grp.writeEntry("ignoreThe", ignoreThe);
+ grp.writeEntry("replaceSpaces", replaceSpaces);
+ if (QLatin1String("mpd")!=group) {
+ grp.writeEntry("fixVariousArtists", fixVariousArtists);
+ grp.writeEntry("transcoderCodec", transcoderCodec);
+ grp.writeEntry("transcoderValue", transcoderValue);
+ grp.writeEntry("transcoderWhenDifferent", transcoderWhenDifferent);
+ }
+ grp.sync();
+ #else
+ #endif
+}
+
+QString DeviceOptions::clean(const QString &str) const
+{
+ QString result(str);
+
+ if (asciiOnly) {
+ result = cleanPath(result);
+ result = asciiPath(result);
+ }
+
+ result.simplified();
+ if (replaceSpaces) {
+ result.replace(QRegExp("\\s"), "_");
+ }
+ if (vfatSafe) {
+ result = vfatPath(result);
+ }
+
+ result.replace('/', '-');
+
+ return result;
+}
+
+Song DeviceOptions::clean(const Song &s) const
+{
+ Song copy=s;
+ if (ignoreThe) {
+ manipulateThe(copy.albumartist, true);
+ manipulateThe(copy.artist, true);
+ }
+ copy.albumartist=clean(copy.albumartist);
+ copy.artist=clean(copy.artist);
+ copy.album=clean(copy.album);
+ copy.title=clean(copy.title);
+ copy.genre=clean(copy.genre);
+ return copy;
+}
+
+QString DeviceOptions::createFilename(const Song &s) const
+{
+ QString path=scheme;
+ static QStringList ignore;
+
+ if (ignore.isEmpty()) {
+ ignore << QLatin1String("%composer%")
+ << QLatin1String("%comment%")
+ << QLatin1String("%filetype%")
+ << QLatin1String("%ignore%")
+ << QLatin1String("%folder%")
+ << QLatin1String("%initial%");
+ }
+
+ foreach (const QString &i, ignore) {
+ path.replace(i, QLatin1String(""));
+ }
+
+ Song copy=clean(s);
+
+ path.replace(constAlbumArtist, copy.albumArtist());
+ path.replace(constAlbumTitle, copy.album);
+ path.replace(constTrackArtist, copy.artist);
+ path.replace(constTrackTitle, copy.title);
+ QString track(QString::number(copy.track));
+ if (copy.track<10) {
+ track=QChar('0')+track;
+ }
+ path.replace(constTrackNumber, track);
+ path.replace(constCdNumber, copy.disc<1 ? QLatin1String("") : QString::number(copy.disc));
+ path.replace(constGenre, copy.genre.isEmpty() ? i18n("Unknown") : copy.genre);
+ path.replace(constYear, copy.year<1 ? QLatin1String("") : QString::number(copy.year));
+ int extPos=s.file.lastIndexOf('.');
+ if (-1!=extPos) {
+ path+=s.file.mid(extPos);
+ }
+ return path;
+}
diff --git a/devices/deviceoptions.h b/devices/deviceoptions.h
new file mode 100644
index 000000000..b11d21836
--- /dev/null
+++ b/devices/deviceoptions.h
@@ -0,0 +1,81 @@
+/*
+ * Cantata
+ *
+ * Copyright (c) 2011-2012 Craig Drummond
+ *
+ * ----
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef DEVICE_OPTIONS_H
+#define DEVICE_OPTIONS_H
+
+#include
+#ifdef ENABLE_KDE_SUPPORT
+#include "encoders.h"
+#endif
+
+class Song;
+
+struct DeviceOptions {
+ static const QLatin1String constAlbumArtist;
+ static const QLatin1String constAlbumTitle;
+ static const QLatin1String constTrackArtist;
+ static const QLatin1String constTrackTitle;
+ static const QLatin1String constTrackNumber;
+ static const QLatin1String constCdNumber;
+ static const QLatin1String constGenre;
+ static const QLatin1String constYear;
+
+ DeviceOptions();
+
+ void load(const QString &group);
+ void save(const QString &group);
+
+ bool operator==(const DeviceOptions &o) const {
+ return vfatSafe==o.vfatSafe && asciiOnly==o.asciiOnly && ignoreThe==o.ignoreThe &&
+ replaceSpaces==o.replaceSpaces && scheme==o.scheme
+ #ifdef ENABLE_KDE_SUPPORT
+ && fixVariousArtists==o.fixVariousArtists && useCache==o.useCache &&
+ transcoderCodec==o.transcoderCodec && autoScan==o.autoScan &&
+ (transcoderCodec.isEmpty() || (transcoderValue==o.transcoderValue && transcoderWhenDifferent==o.transcoderWhenDifferent))
+ #endif
+ ;
+ }
+ bool operator!=(const DeviceOptions &o) const {
+ return !(*this==o);
+ }
+ QString clean(const QString &str) const;
+ Song clean(const Song &s) const;
+ QString createFilename(const Song &s) const;
+
+ QString scheme;
+ bool vfatSafe;
+ bool asciiOnly;
+ bool ignoreThe;
+ bool replaceSpaces;
+ #ifdef ENABLE_KDE_SUPPORT
+ bool fixVariousArtists;
+ QString transcoderCodec;
+ int transcoderValue;
+ bool transcoderWhenDifferent;
+ bool useCache;
+ bool autoScan;
+ #endif
+};
+
+#endif
diff --git a/devices/devicepropertiesdialog.cpp b/devices/devicepropertiesdialog.cpp
index 8541b32cd..78346a7ad 100644
--- a/devices/devicepropertiesdialog.cpp
+++ b/devices/devicepropertiesdialog.cpp
@@ -37,7 +37,7 @@ DevicePropertiesDialog::DevicePropertiesDialog(QWidget *parent)
setMainWidget(devProp);
}
-void DevicePropertiesDialog::show(const QString &path, const QString &coverName, const Device::Options &opts, int props)
+void DevicePropertiesDialog::show(const QString &path, const QString &coverName, const DeviceOptions &opts, int props)
{
devProp->update(path, coverName, opts, props);
connect(devProp, SIGNAL(updated()), SLOT(enableOkButton()));
diff --git a/devices/devicepropertiesdialog.h b/devices/devicepropertiesdialog.h
index 285ce9604..e02c459d3 100644
--- a/devices/devicepropertiesdialog.h
+++ b/devices/devicepropertiesdialog.h
@@ -36,10 +36,10 @@ class DevicePropertiesDialog : public Dialog
public:
DevicePropertiesDialog(QWidget *parent);
- void show(const QString &path, const QString &coverName, const Device::Options &opts, int props);
+ void show(const QString &path, const QString &coverName, const DeviceOptions &opts, int props);
Q_SIGNALS:
- void updatedSettings(const QString &path, const QString &coverName, const Device::Options &opts);
+ void updatedSettings(const QString &path, const QString &coverName, const DeviceOptions &opts);
void cancelled();
private Q_SLOTS:
diff --git a/devices/devicepropertieswidget.cpp b/devices/devicepropertieswidget.cpp
index fe66f325a..ede204298 100644
--- a/devices/devicepropertieswidget.cpp
+++ b/devices/devicepropertieswidget.cpp
@@ -108,7 +108,7 @@ DevicePropertiesWidget::DevicePropertiesWidget(QWidget *parent)
}
}
-void DevicePropertiesWidget::update(const QString &path, const QString &coverName, const Device::Options &opts, int props)
+void DevicePropertiesWidget::update(const QString &path, const QString &coverName, const DeviceOptions &opts, int props)
{
filenameScheme->setText(opts.scheme);
vfatSafe->setChecked(opts.vfatSafe);
@@ -221,7 +221,7 @@ void DevicePropertiesWidget::transcoderChanged()
void DevicePropertiesWidget::checkSaveable()
{
- Device::Options opts=settings();
+ DeviceOptions opts=settings();
bool checkFolder=musicFolder->isVisible();
modified=opts!=origOpts || albumCovers->currentText()!=origCoverName;
@@ -241,9 +241,9 @@ void DevicePropertiesWidget::configureFilenameScheme()
schemeDlg->show(settings());
}
-Device::Options DevicePropertiesWidget::settings()
+DeviceOptions DevicePropertiesWidget::settings()
{
- Device::Options opts;
+ DeviceOptions opts;
opts.scheme=filenameScheme->text().trimmed();
opts.vfatSafe=vfatSafe->isChecked();
opts.asciiOnly=asciiOnly->isChecked();
diff --git a/devices/devicepropertieswidget.h b/devices/devicepropertieswidget.h
index 8cc87cec6..36f7867f6 100644
--- a/devices/devicepropertieswidget.h
+++ b/devices/devicepropertieswidget.h
@@ -47,8 +47,8 @@ public:
};
DevicePropertiesWidget(QWidget *parent);
virtual ~DevicePropertiesWidget() { }
- void update(const QString &path, const QString &coverName, const Device::Options &opts, int props);
- Device::Options settings();
+ void update(const QString &path, const QString &coverName, const DeviceOptions &opts, int props);
+ DeviceOptions settings();
bool isModified() const { return modified; }
bool isSaveable() const { return saveable; }
QString music() const { return musicFolder->text().trimmed(); }
@@ -64,7 +64,7 @@ private Q_SLOTS:
private:
FilenameSchemeDialog *schemeDlg;
- Device::Options origOpts;
+ DeviceOptions origOpts;
QString origMusicFolder;
QString origCoverName;
QString noCoverText;
diff --git a/devices/devicespage.cpp b/devices/devicespage.cpp
index cac8ab9b6..dfb6afe06 100644
--- a/devices/devicespage.cpp
+++ b/devices/devicespage.cpp
@@ -427,9 +427,9 @@ void DevicesPage::deleteSongs()
void DevicesPage::addRemoteDevice()
{
RemoteDevicePropertiesDialog *dlg=new RemoteDevicePropertiesDialog(this);
- dlg->show("cover.jpg", Device::Options(), RemoteFsDevice::Details(), DevicePropertiesWidget::Prop_All-DevicePropertiesWidget::Prop_Folder, true);
- connect(dlg, SIGNAL(updatedSettings(const QString &, const Device::Options &, RemoteFsDevice::Details)),
- DevicesModel::self(), SLOT(addRemoteDevice(const QString &, const Device::Options &, RemoteFsDevice::Details)));
+ dlg->show("cover.jpg", DeviceOptions(), RemoteFsDevice::Details(), DevicePropertiesWidget::Prop_All-DevicePropertiesWidget::Prop_Folder, true);
+ connect(dlg, SIGNAL(updatedSettings(const QString &, const DeviceOptions &, RemoteFsDevice::Details)),
+ DevicesModel::self(), SLOT(addRemoteDevice(const QString &, const DeviceOptions &, RemoteFsDevice::Details)));
}
void DevicesPage::forgetRemoteDevice()
diff --git a/devices/filenameschemedialog.cpp b/devices/filenameschemedialog.cpp
index 5d40ba4ad..27fdb2933 100644
--- a/devices/filenameschemedialog.cpp
+++ b/devices/filenameschemedialog.cpp
@@ -24,8 +24,6 @@
#include "filenameschemedialog.h"
#include "song.h"
#include "localize.h"
-#include
-#include
#include
FilenameSchemeDialog::FilenameSchemeDialog(QWidget *parent)
@@ -49,18 +47,26 @@ FilenameSchemeDialog::FilenameSchemeDialog(QWidget *parent)
connect(genre, SIGNAL(clicked()), this, SLOT(insertGenre()));
connect(year, SIGNAL(clicked()), this, SLOT(insertYear()));
+ #ifdef ENABLE_KDE_SUPPORT
exampleSong.albumartist=i18nc("Example album artist", "Various Artists");
exampleSong.artist=i18nc("Example artist", "Wibble");
exampleSong.album=i18nc("Example album", "Now 5001");
exampleSong.title=i18nc("Example song name", "Wobble");
+ exampleSong.genre=i18nc("Example genre", "Dance");
+ #else
+ exampleSong.albumartist=tr("Various Artists");
+ exampleSong.artist=tr("Wibble");
+ exampleSong.album=tr("Now 5001");
+ exampleSong.title=tr("Wobble");
+ exampleSong.genre=tr("Dance");
+ #endif
exampleSong.track=1;
exampleSong.disc=2;
exampleSong.year=2001;
- exampleSong.genre=i18nc("Example genre", "Dance");
exampleSong.file="wibble.mp3";
}
-void FilenameSchemeDialog::show(const Device::Options &opts)
+void FilenameSchemeDialog::show(const DeviceOptions &opts)
{
origOpts=opts;
pattern->setText(opts.scheme);
@@ -104,10 +110,10 @@ void FilenameSchemeDialog::showHelp()
"| %6 | The album number of a multi-album album. Often compilations consist of several albums. |
"
"| %7 | The year of the album's release. |
"
"| %8 | The genre of the album. |
"
- "
", Device::Options::constAlbumArtist, Device::Options::constAlbumTitle,
- Device::Options::constTrackArtist, Device::Options::constTrackTitle,
- Device::Options::constTrackNumber, Device::Options::constCdNumber, Device::Options::constYear,
- Device::Options::constGenre), help);
+ "").arg(DeviceOptions::constAlbumArtist).arg(DeviceOptions::constAlbumTitle)
+ .arg(DeviceOptions::constTrackArtist).arg(DeviceOptions::constTrackTitle)
+ .arg(DeviceOptions::constTrackNumber).arg(DeviceOptions::constCdNumber).arg(DeviceOptions::constYear)
+ .arg(DeviceOptions::constGenre), help);
}
void FilenameSchemeDialog::enableOkButton()
@@ -118,42 +124,42 @@ void FilenameSchemeDialog::enableOkButton()
void FilenameSchemeDialog::insertAlbumArtist()
{
- insert(Device::Options::constAlbumArtist);
+ insert(DeviceOptions::constAlbumArtist);
}
void FilenameSchemeDialog::insertAlbumTitle()
{
- insert(Device::Options::constAlbumTitle);
+ insert(DeviceOptions::constAlbumTitle);
}
void FilenameSchemeDialog::insertTrackArtist()
{
- insert(Device::Options::constTrackArtist);
+ insert(DeviceOptions::constTrackArtist);
}
void FilenameSchemeDialog::insertTrackTitle()
{
- insert(Device::Options::constTrackTitle);
+ insert(DeviceOptions::constTrackTitle);
}
void FilenameSchemeDialog::insertTrackNumber()
{
- insert(Device::Options::constTrackNumber);
+ insert(DeviceOptions::constTrackNumber);
}
void FilenameSchemeDialog::insertCdNumber()
{
- insert(Device::Options::constCdNumber);
+ insert(DeviceOptions::constCdNumber);
}
void FilenameSchemeDialog::insertGenre()
{
- insert(Device::Options::constGenre);
+ insert(DeviceOptions::constGenre);
}
void FilenameSchemeDialog::insertYear()
{
- insert(Device::Options::constYear);
+ insert(DeviceOptions::constYear);
}
void FilenameSchemeDialog::insert(const QString &str)
diff --git a/devices/filenameschemedialog.h b/devices/filenameschemedialog.h
index ce7cb0fb9..be29be584 100644
--- a/devices/filenameschemedialog.h
+++ b/devices/filenameschemedialog.h
@@ -35,7 +35,7 @@ class FilenameSchemeDialog : public Dialog, Ui::FilenameSchemeDialog
public:
FilenameSchemeDialog(QWidget *parent);
- void show(const Device::Options &opts);
+ void show(const DeviceOptions &opts);
Q_SIGNALS:
void scheme(const QString &text);
@@ -58,7 +58,7 @@ private:
void insert(const QString &str);
private:
- Device::Options origOpts;
+ DeviceOptions origOpts;
Song exampleSong;
};
diff --git a/devices/filenameschemedialog.ui b/devices/filenameschemedialog.ui
index 0bf9a2544..b307ecdf9 100644
--- a/devices/filenameschemedialog.ui
+++ b/devices/filenameschemedialog.ui
@@ -53,7 +53,7 @@
-
-
+
About filename schemes
@@ -65,7 +65,7 @@
-
-
+
0
@@ -84,7 +84,7 @@
-
-
+
0
@@ -103,7 +103,7 @@
-
-
+
0
@@ -122,7 +122,7 @@
-
-
+
0
@@ -141,21 +141,21 @@
-
-
+
Track #
-
-
+
CD #
-
-
+
Genre
@@ -175,7 +175,7 @@
-
-
+
Year
@@ -185,14 +185,9 @@
- KUrlLabel
+ UrlLabel
QLabel
-
-
-
- KPushButton
- QPushButton
-
+
LineEdit
diff --git a/devices/mtpdevice.cpp b/devices/mtpdevice.cpp
index 434a1e497..efb08a621 100644
--- a/devices/mtpdevice.cpp
+++ b/devices/mtpdevice.cpp
@@ -554,8 +554,8 @@ void MtpDevice::configure(QWidget *parent)
}
DevicePropertiesDialog *dlg=new DevicePropertiesDialog(parent);
- connect(dlg, SIGNAL(updatedSettings(const QString &, const QString &, const Device::Options &)),
- SLOT(saveProperties(const QString &, const QString &, const Device::Options &)));
+ connect(dlg, SIGNAL(updatedSettings(const QString &, const QString &, const DeviceOptions &)),
+ SLOT(saveProperties(const QString &, const QString &, const DeviceOptions &)));
if (!configured) {
connect(dlg, SIGNAL(cancelled()), SLOT(saveProperties()));
}
@@ -827,7 +827,7 @@ void MtpDevice::libraryUpdated()
mtpUpdating=false;
}
-void MtpDevice::saveProperties(const QString &, const QString &, const Device::Options &newOpts)
+void MtpDevice::saveProperties(const QString &, const QString &, const DeviceOptions &newOpts)
{
if (configured && opts==newOpts) {
return;
diff --git a/devices/mtpdevice.h b/devices/mtpdevice.h
index 204c05068..e570be8cf 100644
--- a/devices/mtpdevice.h
+++ b/devices/mtpdevice.h
@@ -139,7 +139,7 @@ private Q_SLOTS:
void emitProgress(unsigned long);
void getSongStatus(bool ok);
void delSongStatus(bool ok);
- void saveProperties(const QString &newPath, const QString &newCoverFileName, const Device::Options &opts);
+ void saveProperties(const QString &newPath, const QString &newCoverFileName, const DeviceOptions &opts);
void saveProperties();
private:
diff --git a/devices/remotedevicepropertiesdialog.cpp b/devices/remotedevicepropertiesdialog.cpp
index e2f03b445..a964259a0 100644
--- a/devices/remotedevicepropertiesdialog.cpp
+++ b/devices/remotedevicepropertiesdialog.cpp
@@ -47,7 +47,7 @@ RemoteDevicePropertiesDialog::RemoteDevicePropertiesDialog(QWidget *parent)
setMainWidget(tab);
}
-void RemoteDevicePropertiesDialog::show(const QString &coverName, const Device::Options &opts, const RemoteFsDevice::Details &det, int props, bool create, bool isConnected)
+void RemoteDevicePropertiesDialog::show(const QString &coverName, const DeviceOptions &opts, const RemoteFsDevice::Details &det, int props, bool create, bool isConnected)
{
isCreate=create;
if (isCreate) {
diff --git a/devices/remotedevicepropertiesdialog.h b/devices/remotedevicepropertiesdialog.h
index 238a50996..6c82b53a5 100644
--- a/devices/remotedevicepropertiesdialog.h
+++ b/devices/remotedevicepropertiesdialog.h
@@ -37,10 +37,10 @@ class RemoteDevicePropertiesDialog : public Dialog
public:
RemoteDevicePropertiesDialog(QWidget *parent);
- void show(const QString &coverName, const Device::Options &opts, const RemoteFsDevice::Details &det, int props, bool creating=false, bool isConnected=false);
+ void show(const QString &coverName, const DeviceOptions &opts, const RemoteFsDevice::Details &det, int props, bool creating=false, bool isConnected=false);
Q_SIGNALS:
- void updatedSettings(const QString &coverName, const Device::Options &opts, const RemoteFsDevice::Details &det);
+ void updatedSettings(const QString &coverName, const DeviceOptions &opts, const RemoteFsDevice::Details &det);
void cancelled();
private Q_SLOTS:
diff --git a/devices/remotefsdevice.cpp b/devices/remotefsdevice.cpp
index c30c15bc2..a93830889 100644
--- a/devices/remotefsdevice.cpp
+++ b/devices/remotefsdevice.cpp
@@ -122,7 +122,7 @@ QList RemoteFsDevice::loadAll(DevicesModel *m)
return devices;
}
-Device * RemoteFsDevice::create(DevicesModel *m, const QString &cover, const Options &options, const Details &d)
+Device * RemoteFsDevice::create(DevicesModel *m, const QString &cover, const DeviceOptions &options, const Details &d)
{
if (d.isEmpty()) {
return false;
@@ -199,7 +199,7 @@ void RemoteFsDevice::renamed(const QString &oldName, const QString &newName)
KGlobal::config()->sync();
}
-RemoteFsDevice::RemoteFsDevice(DevicesModel *m, const QString &cover, const Options &options, const Details &d)
+RemoteFsDevice::RemoteFsDevice(DevicesModel *m, const QString &cover, const DeviceOptions &options, const Details &d)
: FsDevice(m, d.name)
, lastCheck(0)
, details(d)
@@ -430,8 +430,8 @@ void RemoteFsDevice::configure(QWidget *parent)
}
RemoteDevicePropertiesDialog *dlg=new RemoteDevicePropertiesDialog(parent);
- connect(dlg, SIGNAL(updatedSettings(const QString &, const Device::Options &, RemoteFsDevice::Details)),
- SLOT(saveProperties(const QString &, const Device::Options &, RemoteFsDevice::Details)));
+ connect(dlg, SIGNAL(updatedSettings(const QString &, const DeviceOptions &, RemoteFsDevice::Details)),
+ SLOT(saveProperties(const QString &, const DeviceOptions &, RemoteFsDevice::Details)));
if (!configured) {
connect(dlg, SIGNAL(cancelled()), SLOT(saveProperties()));
}
@@ -460,7 +460,7 @@ void RemoteFsDevice::saveProperties()
saveProperties(coverFileName, opts, details);
}
-void RemoteFsDevice::saveProperties(const QString &newCoverFileName, const Device::Options &newOpts, Details newDetails)
+void RemoteFsDevice::saveProperties(const QString &newCoverFileName, const DeviceOptions &newOpts, Details newDetails)
{
if (configured && opts==newOpts && newCoverFileName==coverFileName && details==newDetails) {
return;
diff --git a/devices/remotefsdevice.h b/devices/remotefsdevice.h
index 168659010..f2d383a4c 100644
--- a/devices/remotefsdevice.h
+++ b/devices/remotefsdevice.h
@@ -58,12 +58,12 @@ public:
static const QLatin1String constSshfsProtocol;
static QList loadAll(DevicesModel *m);
- static Device * create(DevicesModel *m, const QString &cover, const Options &options, const Details &d);
+ static Device * create(DevicesModel *m, const QString &cover, const DeviceOptions &options, const Details &d);
static void remove(Device *dev);
static void renamed(const QString &oldName, const QString &newName);
static QString createUdi(const QString &n);
- RemoteFsDevice(DevicesModel *m, const QString &cover, const Options &options, const Details &d);
+ RemoteFsDevice(DevicesModel *m, const QString &cover, const DeviceOptions &options, const Details &d);
RemoteFsDevice(DevicesModel *m, const Details &d);
virtual ~RemoteFsDevice();
@@ -94,7 +94,7 @@ protected:
protected Q_SLOTS:
void saveProperties();
- void saveProperties(const QString &newCoverFileName, const Device::Options &newOpts, RemoteFsDevice::Details newDetails);
+ void saveProperties(const QString &newCoverFileName, const DeviceOptions &newOpts, RemoteFsDevice::Details newDetails);
void procFinished(int exitCode);
protected:
diff --git a/devices/remotekiodevice.cpp b/devices/remotekiodevice.cpp
index 944d9f00b..410cf289d 100644
--- a/devices/remotekiodevice.cpp
+++ b/devices/remotekiodevice.cpp
@@ -310,7 +310,7 @@ void KioScanner::addSong(const Song &s)
// }
}
-RemoteKioDevice::RemoteKioDevice(DevicesModel *m, const QString &cover, const Options &options, const RemoteFsDevice::Details &d)
+RemoteKioDevice::RemoteKioDevice(DevicesModel *m, const QString &cover, const DeviceOptions &options, const RemoteFsDevice::Details &d)
: Device(m, d.name)
, scanned(false)
, scanner(0)
@@ -355,8 +355,8 @@ void RemoteKioDevice::configure(QWidget *parent)
}
RemoteDevicePropertiesDialog *dlg=new RemoteDevicePropertiesDialog(parent);
- connect(dlg, SIGNAL(updatedSettings(const QString &, const Device::Options &, RemoteFsDevice::Details)),
- SLOT(saveProperties(const QString &, const Device::Options &, RemoteFsDevice::Details)));
+ connect(dlg, SIGNAL(updatedSettings(const QString &, const DeviceOptions &, RemoteFsDevice::Details)),
+ SLOT(saveProperties(const QString &, const DeviceOptions &, RemoteFsDevice::Details)));
if (!configured) {
connect(dlg, SIGNAL(cancelled()), SLOT(saveProperties()));
}
@@ -644,7 +644,7 @@ void RemoteKioDevice::saveProperties()
saveProperties(coverFileName, opts, details);
}
-void RemoteKioDevice::saveProperties(const QString &newCoverFileName, const Device::Options &newOpts, RemoteFsDevice::Details newDetails)
+void RemoteKioDevice::saveProperties(const QString &newCoverFileName, const DeviceOptions &newOpts, RemoteFsDevice::Details newDetails)
{
if (configured && opts==newOpts && newCoverFileName==coverFileName && details==newDetails) {
return;
diff --git a/devices/remotekiodevice.h b/devices/remotekiodevice.h
index 5d6427255..30f7706ed 100644
--- a/devices/remotekiodevice.h
+++ b/devices/remotekiodevice.h
@@ -92,7 +92,7 @@ class RemoteKioDevice : public Device
Q_OBJECT
public:
- RemoteKioDevice(DevicesModel *m, const QString &cover, const Options &options, const RemoteFsDevice::Details &d);
+ RemoteKioDevice(DevicesModel *m, const QString &cover, const DeviceOptions &options, const RemoteFsDevice::Details &d);
RemoteKioDevice(DevicesModel *m, const RemoteFsDevice::Details &d);
virtual ~RemoteKioDevice();
@@ -132,7 +132,7 @@ private Q_SLOTS:
void libraryUpdated(const QString &errorMsg);
void rescan(bool full=true);
void saveProperties();
- void saveProperties(const QString &newCoverFileName, const Device::Options &newOpts, RemoteFsDevice::Details newDetails);
+ void saveProperties(const QString &newCoverFileName, const DeviceOptions &newOpts, RemoteFsDevice::Details newDetails);
void cacheRead();
private:
diff --git a/devices/trackorganiser.cpp b/devices/trackorganiser.cpp
index db9682d16..4df1b70fa 100644
--- a/devices/trackorganiser.cpp
+++ b/devices/trackorganiser.cpp
@@ -32,8 +32,6 @@
#include "lyricspage.h"
#include "localize.h"
#include "messagebox.h"
-#include
-#include
#include
#include
#include
@@ -69,7 +67,10 @@ TrackOrganiser::~TrackOrganiser()
void TrackOrganiser::show(const QList &songs, const QString &udi)
{
+ Q_UNUSED(udi)
+
origSongs=songs;
+ #ifdef ENABLE_KDE_SUPPORT
if (udi.isEmpty()) {
opts.load("mpd");
} else {
@@ -83,6 +84,9 @@ void TrackOrganiser::show(const QList &songs, const QString &udi)
opts=dev->options();
}
+ #else
+ opts.load("mpd");
+ #endif
qSort(origSongs);
filenameScheme->setText(opts.scheme);
@@ -112,7 +116,7 @@ void TrackOrganiser::slotButtonClicked(int button)
case Cancel:
if (!optionsBox->isEnabled()) {
paused=true;
- if (KMessageBox::No==KMessageBox::questionYesNo(this, i18n("Cancel renaming of files?"))) {
+ if (MessageBox::No==MessageBox::questionYesNo(this, i18n("Cancel renaming of files?"))) {
paused=false;
QTimer::singleShot(0, this, SLOT(renameFile()));
return;
@@ -176,15 +180,17 @@ void TrackOrganiser::startRename()
index=0;
paused=autoSkip=false;
readOptions();
+ #ifdef ENABLE_KDE_SUPPORT
if (!deviceUdi.isEmpty()) {
Device *dev=getDevice();
if (!dev) {
return;
}
dev->setOptions(opts);
- } else {
+ } else
+ #endif
opts.save("mpd");
- }
+
QTimer::singleShot(100, this, SLOT(renameFile()));
}
@@ -200,15 +206,16 @@ void TrackOrganiser::renameFile()
QString modified=opts.createFilename(s);
QString musicFolder;
+ #ifdef ENABLE_KDE_SUPPORT
if (!deviceUdi.isEmpty()) {
Device *dev=getDevice();
if (!dev) {
return;
}
musicFolder=dev->path();
- } else {
+ } else
+ #endif
musicFolder=Settings::self()->mpdDir();
- }
if (modified!=s.file) {
QString source=musicFolder+s.file;
@@ -236,8 +243,7 @@ void TrackOrganiser::renameFile()
// Create dest folder...
if (!skip) {
- KUrl d(dest);
- QDir dir(d.directory());
+ QDir dir(Utils::getDir(dest));
if(!dir.exists() && !Utils::createDir(dir.absolutePath(), musicFolder)) {
if (autoSkip) {
skip=true;
@@ -289,14 +295,18 @@ void TrackOrganiser::renameFile()
}
if (!skip) {
- KUrl su(source);
- KUrl du(dest);
- QDir sDir(su.directory());
- QDir dDir(du.directory());
+ QDir sDir(Utils::getDir(source));
+ QDir dDir(Utils::getDir(dest));
+ #ifdef ENABLE_KDE_SUPPORT
Device *dev=deviceUdi.isEmpty() ? 0 : getDevice();
if (sDir.absolutePath()!=dDir.absolutePath()) {
Utils::moveDir(sDir.absolutePath(), dDir.absolutePath(), musicFolder, dev ? dev->coverFile() : QString());
}
+ #else
+ if (sDir.absolutePath()!=dDir.absolutePath()) {
+ Utils::moveDir(sDir.absolutePath(), dDir.absolutePath(), musicFolder, QString());
+ }
+ #endif
item->setText(0, modified);
item->setFont(0, font());
item->setFont(1, font());
@@ -309,12 +319,15 @@ void TrackOrganiser::renameFile()
MusicLibraryModel::self()->updateSongFile(s, to);
DirViewModel::self()->removeFileFromList(s.file);
DirViewModel::self()->addFileToList(to.file);
- } else {
+ }
+ #ifdef ENABLE_KDE_SUPPORT
+ else {
if (!dev) {
return;
}
dev->updateSongFile(s, to);
}
+ #endif
}
}
index++;
@@ -330,12 +343,15 @@ void TrackOrganiser::finish(bool ok)
if (updated) {
if (deviceUdi.isEmpty()) {
emit update();
- } else {
+ }
+ #ifdef ENABLE_KDE_SUPPORT
+ else {
Device *dev=getDevice();
if (dev) {
dev->saveCache();
}
}
+ #endif
}
if (ok) {
accept();
@@ -344,6 +360,7 @@ void TrackOrganiser::finish(bool ok)
}
}
+#ifdef ENABLE_KDE_SUPPORT
Device * TrackOrganiser::getDevice(QWidget *p)
{
Device *dev=DevicesModel::self()->device(deviceUdi);
@@ -364,3 +381,4 @@ Device * TrackOrganiser::getDevice(QWidget *p)
}
return dev;
}
+#endif
diff --git a/devices/trackorganiser.h b/devices/trackorganiser.h
index 7623362a2..bb69868cd 100644
--- a/devices/trackorganiser.h
+++ b/devices/trackorganiser.h
@@ -27,7 +27,11 @@
#include "ui_trackorganiser.h"
#include "dialog.h"
#include "song.h"
+#ifdef ENABLE_KDE_SUPPORT
#include "device.h"
+#else
+#include "deviceoptions.h"
+#endif
class FilenameSchemeDialog;
class TrackOrganiser : public Dialog, Ui::TrackOrganiser
@@ -55,7 +59,9 @@ private Q_SLOTS:
private:
void slotButtonClicked(int button);
void readOptions();
+ #ifdef ENABLE_KDE_SUPPORT
Device * getDevice(QWidget *p=0);
+ #endif
void finish(bool ok);
private:
@@ -66,7 +72,7 @@ private:
bool autoSkip;
bool paused;
bool updated;
- Device::Options opts;
+ DeviceOptions opts;
};
#endif
diff --git a/devices/umsdevice.cpp b/devices/umsdevice.cpp
index 04ad21463..b28a30eb4 100644
--- a/devices/umsdevice.cpp
+++ b/devices/umsdevice.cpp
@@ -112,7 +112,7 @@ void UmsDevice::setup()
QFile file(path+constSettingsFile);
QString audioFolderSetting;
- opts=Device::Options();
+ opts=DeviceOptions();
// podcastFolder=QString();
if (file.open(QIODevice::ReadOnly|QIODevice::Text)) {
QTextStream in(&file);
@@ -218,8 +218,8 @@ void UmsDevice::configure(QWidget *parent)
}
DevicePropertiesDialog *dlg=new DevicePropertiesDialog(parent);
- connect(dlg, SIGNAL(updatedSettings(const QString &, const QString &, const Device::Options &)),
- SLOT(saveProperties(const QString &, const QString &, const Device::Options &)));
+ connect(dlg, SIGNAL(updatedSettings(const QString &, const QString &, const DeviceOptions &)),
+ SLOT(saveProperties(const QString &, const QString &, const DeviceOptions &)));
if (!configured) {
connect(dlg, SIGNAL(cancelled()), SLOT(saveProperties()));
}
@@ -252,7 +252,7 @@ void UmsDevice::saveOptions()
fixedPath=QLatin1String("./")+fixedPath.mid(path.length());
}
- Options def;
+ DeviceOptions def;
if (file.open(QIODevice::WriteOnly|QIODevice::Text)) {
QTextStream out(&file);
if (!fixedPath.isEmpty()) {
@@ -290,7 +290,7 @@ void UmsDevice::saveOptions()
}
}
-void UmsDevice::saveProperties(const QString &newPath, const QString &newCoverFileName, const Device::Options &newOpts)
+void UmsDevice::saveProperties(const QString &newPath, const QString &newCoverFileName, const DeviceOptions &newOpts)
{
QString nPath=MPDParseUtils::fixPath(newPath);
if (configured && opts==newOpts && nPath==audioFolder && newCoverFileName==coverFileName) {
diff --git a/devices/umsdevice.h b/devices/umsdevice.h
index ab556862c..cfdbd162b 100644
--- a/devices/umsdevice.h
+++ b/devices/umsdevice.h
@@ -50,7 +50,7 @@ private:
private Q_SLOTS:
void saveProperties();
- void saveProperties(const QString &newPath, const QString &newCoverFileName, const Device::Options &opts);
+ void saveProperties(const QString &newPath, const QString &newCoverFileName, const DeviceOptions &opts);
private:
Solid::StorageAccess *access;
diff --git a/devices/utils.cpp b/devices/utils.cpp
index b66516171..5690a409f 100644
--- a/devices/utils.cpp
+++ b/devices/utils.cpp
@@ -40,6 +40,36 @@
#include
#endif
+QString Utils::dirSyntax(const QString &d)
+{
+ if(!d.isEmpty())
+ {
+ QString ds(d);
+
+ ds.replace("//", "/");
+
+ int slashPos(ds.lastIndexOf('/'));
+
+ if(slashPos!=(((int)ds.length())-1))
+ ds.append('/');
+
+ return ds;
+ }
+
+ return d;
+}
+
+QString Utils::getDir(const QString &file)
+{
+ QString d(file);
+ int slashPos(d.lastIndexOf('/'));
+
+ if(slashPos!=-1)
+ d.remove(slashPos+1, d.length());
+
+ return dirSyntax(d);
+}
+
QString Utils::changeExtension(const QString &file, const QString &extension)
{
if (extension.isEmpty()) {
diff --git a/devices/utils.h b/devices/utils.h
index 3bd1b69bd..5270d4574 100644
--- a/devices/utils.h
+++ b/devices/utils.h
@@ -38,6 +38,8 @@ namespace Utils
return (fabs(d1 - d2) < precision);
}
+ extern QString dirSyntax(const QString &d);
+ extern QString getDir(const QString &file);
extern QString changeExtension(const QString &file, const QString &extension);
extern void moveDir(const QString &from, const QString &to, const QString &base, const QString &coverFile);
extern void cleanDir(const QString &dir, const QString &base, const QString &coverFile, int level=0);
diff --git a/gui/albumspage.cpp b/gui/albumspage.cpp
index 37bc43913..1169195e2 100644
--- a/gui/albumspage.cpp
+++ b/gui/albumspage.cpp
@@ -57,8 +57,8 @@ AlbumsPage::AlbumsPage(MainWindow *p)
// view->addAction(p->burnAction);
#ifdef ENABLE_DEVICES_SUPPORT
view->addAction(p->copyToDeviceAction);
- view->addAction(p->organiseFilesAction);
#endif
+ view->addAction(p->organiseFilesAction);
view->addAction(p->editTagsAction);
#ifdef ENABLE_REPLAYGAIN_SUPPORT
view->addAction(p->replaygainAction);
@@ -209,8 +209,8 @@ void AlbumsPage::controlActions()
mw->addToStoredPlaylistAction->setEnabled(enable);
#ifdef ENABLE_DEVICES_SUPPORT
mw->copyToDeviceAction->setEnabled(enable);
- mw->organiseFilesAction->setEnabled(enable);
#endif
+ mw->organiseFilesAction->setEnabled(enable);
mw->editTagsAction->setEnabled(enable);
#ifdef ENABLE_REPLAYGAIN_SUPPORT
mw->replaygainAction->setEnabled(enable);
diff --git a/gui/folderpage.cpp b/gui/folderpage.cpp
index 766b09721..ea80b6764 100644
--- a/gui/folderpage.cpp
+++ b/gui/folderpage.cpp
@@ -62,8 +62,8 @@ FolderPage::FolderPage(MainWindow *p)
// view->addAction(p->burnAction);
#ifdef ENABLE_DEVICES_SUPPORT
view->addAction(p->copyToDeviceAction);
- view->addAction(p->organiseFilesAction);
#endif
+ view->addAction(p->organiseFilesAction);
view->addAction(p->editTagsAction);
#ifdef ENABLE_REPLAYGAIN_SUPPORT
view->addAction(p->replaygainAction);
@@ -145,16 +145,13 @@ void FolderPage::controlActions()
mw->addToStoredPlaylistAction->setEnabled(enable);
#ifdef ENABLE_DEVICES_SUPPORT
mw->copyToDeviceAction->setEnabled(enable);
- mw->organiseFilesAction->setEnabled(enable);
#endif
+ mw->organiseFilesAction->setEnabled(enable);
mw->editTagsAction->setEnabled(enable);
#ifdef ENABLE_REPLAYGAIN_SUPPORT
mw->replaygainAction->setEnabled(enable);
#endif
#ifdef ENABLE_DEVICES_SUPPORT
- QAction *sep=new QAction(this);
- sep->setSeparator(true);
- view->addAction(sep);
mw->deleteSongsAction->setEnabled(enable);
#endif
#ifdef ENABLE_KDE_SUPPORT
diff --git a/gui/librarypage.cpp b/gui/librarypage.cpp
index d16e613eb..0689e9433 100644
--- a/gui/librarypage.cpp
+++ b/gui/librarypage.cpp
@@ -60,8 +60,8 @@ LibraryPage::LibraryPage(MainWindow *p)
// view->addAction(p->burnAction);
#ifdef ENABLE_DEVICES_SUPPORT
view->addAction(p->copyToDeviceAction);
- view->addAction(p->organiseFilesAction);
#endif
+ view->addAction(p->organiseFilesAction);
view->addAction(p->editTagsAction);
#ifdef ENABLE_REPLAYGAIN_SUPPORT
view->addAction(p->replaygainAction);
@@ -256,8 +256,8 @@ void LibraryPage::controlActions()
mw->addToStoredPlaylistAction->setEnabled(enable);
#ifdef ENABLE_DEVICES_SUPPORT
mw->copyToDeviceAction->setEnabled(enable);
- mw->organiseFilesAction->setEnabled(enable);
#endif
+ mw->organiseFilesAction->setEnabled(enable);
mw->editTagsAction->setEnabled(enable);
#ifdef ENABLE_REPLAYGAIN_SUPPORT
mw->replaygainAction->setEnabled(enable);
diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp
index 0f7a0df7f..4389d6f5c 100644
--- a/gui/mainwindow.cpp
+++ b/gui/mainwindow.cpp
@@ -79,11 +79,11 @@
#include "lyricspage.h"
#include "infopage.h"
#include "serverinfopage.h"
+#include "trackorganiser.h"
#ifdef ENABLE_DEVICES_SUPPORT
#include "devicespage.h"
#include "devicesmodel.h"
#include "actiondialog.h"
-#include "trackorganiser.h"
#include "syncdialog.h"
#endif
#ifdef ENABLE_REPLAYGAIN_SUPPORT
@@ -405,8 +405,8 @@ MainWindow::MainWindow(QWidget *parent)
copyToDeviceAction->setText(i18n("Copy To Device"));
copyToDeviceAction->setIcon(Icon("multimedia-player"));
deleteSongsAction = actionCollection()->addAction("deletesongs");
- organiseFilesAction = actionCollection()->addAction("organizefiles");
#endif
+ organiseFilesAction = actionCollection()->addAction("organizefiles");
#ifdef ENABLE_REPLAYGAIN_SUPPORT
replaygainAction = actionCollection()->addAction("replaygain");
#endif
@@ -538,6 +538,7 @@ MainWindow::MainWindow(QWidget *parent)
decreaseVolumeAction = new QAction(tr("Decrease Volume"), this);
addToPlayQueueAction = new QAction(tr("Add To Play Queue"), this);
addToStoredPlaylistAction = new QAction(tr("Add To Playlist"), this);
+ organiseFilesAction = new QAction(tr("Organize Files"), this);
removeAction = new QAction(tr("Remove"), this);
replacePlayQueueAction = new QAction(tr("Replace Play Queue"), this);
removeFromPlayQueueAction = new QAction(tr("Remove From Play Queue"), this);
@@ -696,9 +697,9 @@ MainWindow::MainWindow(QWidget *parent)
copyToDeviceAction->setMenu(DevicesModel::self()->menu());
deleteSongsAction->setIcon(Icon("edit-delete"));
deleteSongsAction->setText(i18n("Delete Songs"));
+ #endif
organiseFilesAction->setIcon(Icon("inode-directory"));
organiseFilesAction->setText(i18n("Organize Files"));
- #endif
searchAction->setIcon(Icon("edit-find"));
#ifdef ENABLE_REPLAYGAIN_SUPPORT
replaygainAction->setIcon(Icon("audio-x-generic"));
@@ -1008,12 +1009,12 @@ MainWindow::MainWindow(QWidget *parent)
connect(folderPage, SIGNAL(addToDevice(const QString &, const QString &, const QList &)), SLOT(copyToDevice(const QString &, const QString &, const QList &)));
connect(devicesPage, SIGNAL(addToDevice(const QString &, const QString &, const QList &)), SLOT(copyToDevice(const QString &, const QString &, const QList &)));
connect(deleteSongsAction, SIGNAL(triggered()), SLOT(deleteSongs()));
- connect(organiseFilesAction, SIGNAL(triggered()), SLOT(organiseFiles()));
connect(devicesPage, SIGNAL(deleteSongs(const QString &, const QList &)), SLOT(deleteSongs(const QString &, const QList &)));
connect(libraryPage, SIGNAL(deleteSongs(const QString &, const QList &)), SLOT(deleteSongs(const QString &, const QList &)));
connect(albumsPage, SIGNAL(deleteSongs(const QString &, const QList &)), SLOT(deleteSongs(const QString &, const QList &)));
connect(folderPage, SIGNAL(deleteSongs(const QString &, const QList &)), SLOT(deleteSongs(const QString &, const QList &)));
#endif
+ connect(organiseFilesAction, SIGNAL(triggered()), SLOT(organiseFiles()));
#ifdef ENABLE_REPLAYGAIN_SUPPORT
connect(replaygainAction, SIGNAL(triggered()), SLOT(replayGain()));
#endif
@@ -1361,10 +1362,10 @@ void MainWindow::updateSettings()
connectToMpd();
Covers::self()->setSaveInMpdDir(Settings::self()->storeCoversInMpdDir());
HttpServer::self()->setPort(Settings::self()->enableHttp() ? Settings::self()->httpPort() : 0);
+ organiseFilesAction->setEnabled(QDir(Settings::self()->mpdDir()).isReadable());
#ifdef ENABLE_DEVICES_SUPPORT
- copyToDeviceAction->setEnabled(QDir(Settings::self()->mpdDir()).isReadable());
- deleteSongsAction->setEnabled(copyToDeviceAction->isEnabled());
- organiseFilesAction->setEnabled(copyToDeviceAction->isEnabled());
+ copyToDeviceAction->setEnabled(organiseFilesAction->isEnabled());
+ deleteSongsAction->setEnabled(organiseFilesAction->isEnabled());
// burnAction->setEnabled(copyToDeviceAction->isEnabled());
deleteSongsAction->setVisible(Settings::self()->showDeleteAction());
#endif
@@ -2700,17 +2701,21 @@ void MainWindow::editTags(const QList &songs, bool isPlayQueue)
dlg->show();
}
-#ifdef ENABLE_DEVICES_SUPPORT
void MainWindow::organiseFiles()
{
if (0!=TrackOrganiser::instanceCount()) {
return;
}
- if (0!=TagEditor::instanceCount() || 0!=ActionDialog::instanceCount() || 0!=SyncDialog::instanceCount()) {
+ if (0!=TagEditor::instanceCount()) {
DIALOG_ERROR;
}
+ #ifdef ENABLE_DEVICES_SUPPORT
+ if (0!=ActionDialog::instanceCount() || 0!=SyncDialog::instanceCount()) {
+ DIALOG_ERROR;
+ }
+ #endif
#ifdef ENABLE_REPLAYGAIN_SUPPORT
if (0!=RgDialog::instanceCount()) {
DIALOG_ERROR;
@@ -2724,24 +2729,30 @@ void MainWindow::organiseFiles()
songs=albumsPage->selectedSongs();
} else if (folderPage->isVisible()) {
songs=folderPage->selectedSongs();
- } else if (devicesPage->isVisible()) {
+ }
+ #ifdef ENABLE_DEVICES_SUPPORT
+ else if (devicesPage->isVisible()) {
songs=devicesPage->selectedSongs();
}
+ #endif
if (!songs.isEmpty()) {
QString udi;
+ #ifdef ENABLE_DEVICES_SUPPORT
if (devicesPage->isVisible()) {
udi=devicesPage->activeFsDeviceUdi();
if (udi.isEmpty()) {
return;
}
}
+ #endif
TrackOrganiser *dlg=new TrackOrganiser(this);
dlg->show(songs, udi);
}
}
+#ifdef ENABLE_DEVICES_SUPPORT
void MainWindow::addToDevice(const QString &udi)
{
if (libraryPage->isVisible()) {
diff --git a/gui/mainwindow.h b/gui/mainwindow.h
index 53a3dcb2f..6e737e341 100644
--- a/gui/mainwindow.h
+++ b/gui/mainwindow.h
@@ -309,8 +309,8 @@ private Q_SLOTS:
// void createAudioCd();
void editTags();
void editPlayQueueTags();
- #ifdef ENABLE_DEVICES_SUPPORT
void organiseFiles();
+ #ifdef ENABLE_DEVICES_SUPPORT
void addToDevice(const QString &udi);
void deleteSongs();
void copyToDevice(const QString &from, const QString &to, const QList &songs);
@@ -398,8 +398,8 @@ private:
Action *devicesTabAction;
Action *copyToDeviceAction;
Action *deleteSongsAction;
- Action *organiseFilesAction;
#endif
+ Action *organiseFilesAction;
#ifdef ENABLE_REPLAYGAIN_SUPPORT
Action *replaygainAction;
#endif
diff --git a/models/devicesmodel.cpp b/models/devicesmodel.cpp
index 08c60b6fe..2d2879a2b 100644
--- a/models/devicesmodel.cpp
+++ b/models/devicesmodel.cpp
@@ -588,7 +588,7 @@ void DevicesModel::emitAddToDevice()
}
#ifdef ENABLE_REMOTE_DEVICES
-void DevicesModel::addRemoteDevice(const QString &coverFileName, const Device::Options &opts, RemoteFsDevice::Details details)
+void DevicesModel::addRemoteDevice(const QString &coverFileName, const DeviceOptions &opts, RemoteFsDevice::Details details)
{
Device *dev=RemoteFsDevice::create(this, coverFileName, opts, details);
diff --git a/models/devicesmodel.h b/models/devicesmodel.h
index 8b07d9ee1..9a626ed30 100644
--- a/models/devicesmodel.h
+++ b/models/devicesmodel.h
@@ -72,7 +72,7 @@ public Q_SLOTS:
void deviceUpdating(const QString &udi, bool state);
void emitAddToDevice();
#ifdef ENABLE_REMOTE_DEVICES
- void addRemoteDevice(const QString &coverFileName, const Device::Options &opts, RemoteFsDevice::Details details);
+ void addRemoteDevice(const QString &coverFileName, const DeviceOptions &opts, RemoteFsDevice::Details details);
void removeRemoteDevice(const QString &udi);
void changeDeviceUdi(const QString &from, const QString &to);
#endif
diff --git a/widgets/dialog.h b/widgets/dialog.h
index 19e621ce8..b075ebe7f 100644
--- a/widgets/dialog.h
+++ b/widgets/dialog.h
@@ -32,7 +32,7 @@ typedef KDialog Dialog;
#include
struct KGuiItem {
- KGuiItem(const QString &t, const QString &i)
+ KGuiItem(const QString &t=QString(), const QString &i=QString())
: text(t), icon(i) {
}
QString text;
@@ -89,6 +89,9 @@ public:
void setButtonGuiItem(ButtonCode button, const KGuiItem &item);
void setButtonMenu(ButtonCode button, QMenu *menu, ButtonPopupMode popupmode=InstantPopup);
void enableButton(ButtonCode button, bool enable);
+ void enableButtonOk(bool enable) {
+ enableButton(Ok, enable);
+ }
bool isButtonEnabled(ButtonCode button);
void setMainWidget(QWidget *widget);
virtual void slotButtonClicked(int button);
diff --git a/widgets/messagebox.cpp b/widgets/messagebox.cpp
index d52af8cb7..2680217d3 100644
--- a/widgets/messagebox.cpp
+++ b/widgets/messagebox.cpp
@@ -23,6 +23,7 @@
#include "messagebox.h"
#include
+#include
MessageBox::ButtonCode map(QMessageBox::StandardButton c)
{
@@ -35,8 +36,9 @@ MessageBox::ButtonCode map(QMessageBox::StandardButton c)
}
MessageBox::ButtonCode MessageBox::questionYesNoCancel(QWidget *parent, const QString &message, const QString &title,
- const QString &yesText, const QString &noText, bool showCancel, bool isWarning) {
- if (yesText.isEmpty() && noText.isEmpty()) {
+ const KGuiItem &yesText, const KGuiItem &noText, bool showCancel, bool isWarning)
+{
+ if (yesText.text.isEmpty() && noText.text.isEmpty()) {
return map(isWarning
? QMessageBox::warning(parent, message, title.isEmpty() ? QObject::tr("Warning") : title,
QMessageBox::Yes|QMessageBox::No|(showCancel ? QMessageBox::Cancel : QMessageBox::NoButton))
@@ -48,11 +50,19 @@ MessageBox::ButtonCode MessageBox::questionYesNoCancel(QWidget *parent, const QS
message, QMessageBox::Yes|QMessageBox::No|(showCancel ? QMessageBox::Cancel : QMessageBox::NoButton), parent);
box.setDefaultButton(QMessageBox::Yes);
- if (!yesText.isEmpty()) {
- box.button(QMessageBox::Yes)->setText(yesText);
+ if (!yesText.text.isEmpty()) {
+ QAbstractButton *btn=box.button(QMessageBox::Yes);
+ btn->setText(yesText.text);
+ if (!yesText.icon.isEmpty()) {
+ btn->setIcon(QIcon::fromTheme(yesText.icon));
+ }
}
- if (!noText.isEmpty()) {
- box.button(QMessageBox::No)->setText(noText);
+ if (!noText.text.isEmpty()) {
+ QAbstractButton *btn=box.button(QMessageBox::No);
+ btn->setText(noText.text);
+ if (!noText.icon.isEmpty()) {
+ btn->setIcon(QIcon::fromTheme(noText.icon));
+ }
}
return -1==box.exec() ? Cancel : map(box.standardButton(box.clickedButton()));
}
diff --git a/widgets/messagebox.h b/widgets/messagebox.h
index 84832d1b5..3c2c146bd 100644
--- a/widgets/messagebox.h
+++ b/widgets/messagebox.h
@@ -29,6 +29,7 @@
typedef KMessageBox MessageBox;
#else
#include
+#include "dialog.h"
namespace MessageBox {
enum ButtonCode {
Yes=QMessageBox::Yes,
@@ -37,15 +38,15 @@ namespace MessageBox {
};
extern ButtonCode questionYesNoCancel(QWidget *parent, const QString &message, const QString &title=QString(),
- const QString &yesText=QString(), const QString &noText=QString(), bool showCancel=true, bool isWarning=false);
- inline ButtonCode questionYesNo(QWidget *parent, const QString &message, const QString &title=QString(), const QString &yesText=QString(), const QString &noText=QString()) {
+ const KGuiItem &yesText=KGuiItem(), const KGuiItem &noText=KGuiItem(), bool showCancel=true, bool isWarning=false);
+ inline ButtonCode questionYesNo(QWidget *parent, const QString &message, const QString &title=QString(), const KGuiItem &yesText=KGuiItem(), const KGuiItem &noText=KGuiItem()) {
return questionYesNoCancel(parent, message, title, yesText, noText, false);
}
inline ButtonCode warningYesNoCancel(QWidget *parent, const QString &message, const QString &title=QString(),
- const QString &yesText=QString(), const QString &noText=QString()) {
+ const KGuiItem &yesText=KGuiItem(), const KGuiItem &noText=KGuiItem()) {
return questionYesNoCancel(parent, message, title, yesText, noText, true, true);
}
- inline ButtonCode warningYesNo(QWidget *parent, const QString &message, const QString &title=QString(), const QString &yesText=QString(), const QString &noText=QString()) {
+ inline ButtonCode warningYesNo(QWidget *parent, const QString &message, const QString &title=QString(), const KGuiItem &yesText=KGuiItem(), const KGuiItem &noText=KGuiItem()) {
return questionYesNoCancel(parent, message, title, yesText, noText, false, true);
}
inline void error(QWidget *parent, const QString &message, const QString &title=QString()) {