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() "%6The album number of a multi-album album. Often compilations consist of several albums." "%7The year of the album's release." "%8The 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 -
kurllabel.h
-
- - KPushButton - QPushButton -
kpushbutton.h
+
urllabel.h
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()) {