diff -Nru cantata-2.3.0/cantata_icon.qrc cantata-2.3.1/cantata_icon.qrc
--- cantata-2.3.0/cantata_icon.qrc 1970-01-01 00:00:00.000000000 +0000
+++ cantata-2.3.1/cantata_icon.qrc 2018-05-22 08:54:17.000000000 +0000
@@ -0,0 +1,12 @@
+
+
+icons/cantata.svg
+icons/cantata16.png
+icons/cantata22.png
+icons/cantata24.png
+icons/cantata32.png
+icons/cantata48.png
+icons/cantata64.png
+icons/cantata128.png
+
+
diff -Nru cantata-2.3.0/cantata.qrc cantata-2.3.1/cantata.qrc
--- cantata-2.3.0/cantata.qrc 2018-02-07 21:59:25.000000000 +0000
+++ cantata-2.3.1/cantata.qrc 2018-05-24 17:06:58.000000000 +0000
@@ -3,10 +3,6 @@
icons/stars.svg
icons/consume.svg
-icons/mpd.svg
-icons/home.svg
-icons/hdd.svg
-
icons/sidebar-library.svg
icons/sidebar-devices.svg
icons/sidebar-folders.svg
@@ -16,28 +12,27 @@
icons/sidebar-playqueue.svg
icons/sidebar-search.svg
-online/icons/soundcloud.svg
-online/icons/jamendo.svg
-online/icons/magnatune.svg
-online/icons/podcasts.svg
-online/icons/itunes.svg
-online/icons/gpodder.svg
-
-streams/icons/favourites.svg
-streams/icons/icecast.svg
-streams/icons/shoutcast.svg
-streams/icons/tunein.svg
-streams/icons/dirble.svg
+online/icons/magnatune.svg
+online/icons/bbc.svg
+online/icons/cbc.svg
+
+streams/icons/shoutcast.svg
+streams/icons/tunein.svg
+streams/icons/station.svg
icons/media-optical.svg
icons/media-optical32.svg
icons/view-media-album.svg
icons/view-media-artist.svg
icons/view-media-genre.svg
-icons/dice.svg
-icons/playlist.svg
icons/radio.svg
-icons/gradcap.svg
+
+online/podcast_directories.xml
+context/lyrics_providers.xml
+scrobbling/scrobblers.xml
+context/weblinks.xml
+tags/tag_fixes.xml
+mpd-interface/mpd.conf.template
diff -Nru cantata-2.3.0/ChangeLog cantata-2.3.1/ChangeLog
--- cantata-2.3.0/ChangeLog 2018-04-24 21:49:10.000000000 +0000
+++ cantata-2.3.1/ChangeLog 2018-06-01 18:08:17.000000000 +0000
@@ -1,3 +1,68 @@
+2.3.1
+-----
+ 1. Update some translations.
+ 2. Set Smart rules 'files added in the last days' limit to 10*365
+ 3. Only sort playlists in folders view, and place these after tracks.
+ 4. Reduce width of statusbar spacer.
+ 5. Move scrobling 'love' button into toolbar. Use unfilled heart before loved,
+ and filled when loved.
+ 6. Better control of playqueue status bar buttons when contracting/expanding.
+ 7. For windows, when adding local files (served via internal HTTP server) add
+ the real file path as a query item.
+ 8. Use smaller text for help text in Tweaks section of preferences dialog.
+ 9. Fix playback of local non-MPD files under Windows.
+10. Stretching albums covers not working under Windows, so just remove option.
+11. Don't enable AA_EnableHighDpiScaling for windows builds, seems to
+ interfere with fractional scaling.
+12. When playing, only poll MPD every 5 seconds.
+13. When updating play seekbar from MPDStatus, only upate if more than 1
+ second from calculated position.
+14. Slightly reduce height of toolbar.
+15. Add a slight border to context view.
+16. Update suru icon - was a little too small.
+17. Don't attempt to align main menu for Windows < 10, as Qt seems to add some
+ menu animation that just looks weird when menu is moved.
+18. When searching on 'any', do a second search on 'file' and combine results.
+ Looks as if MPD does not search filenames/paths when using 'any.'
+19. Fix UTF8 file saving under Windows.
+20. Fix preference dialog size under windows.
+21. Fix enabling of add/replace play queue actions for Jamendo/Magnatune.
+22. Use JSON to encode song details when adding online tracks.
+23. Don't allow slashes, asterisks, or question marks in collection name.
+24. Don't overwrite genre with file type for Jamendo.
+25. Allow adding Jamendo/Magnatune tracks to stored playlists.
+26. Add "--collection" commandline option to control the initial collection to
+ use.
+27. Fix crash if try to expand dirble and --no-network passed to Cantata.
+28. Modify name of supplied font-awesome font to Cantata-FontAwesome, so as to
+ avoid conflicts with any system installed font.
+29. Remove custom icon theme, and just use FontAwesome.
+30. Show technical info to the left of ratings.
+31. Embed FontAwesome into Cantata.
+32. Remove "New York Times" podcast directory - not available?
+33. Fix loading of FLAC images with older TagLib.
+34. Fix saving of 'Fadeout on stop' duration.
+35. Fix covers settings from wizard not being saved.
+36. Don't report errors when listing playlists, as MPD reports error if user
+ has disabled these.
+37. Add genius.com to list of lyrics providers.
+38. Cache lyrics using 'basic' artist name - e.g. X ft. Y => X
+39. When looking for lyrics, remove "ft. X", "featuring X", etc, from song
+ title as well as artist.
+40. Fix adding streams from provider dialog.
+41. Reduce number of confirmation dialogs.
+42. Remove group warning from initial wizard.
+43. Fix saving stream settings.
+44. Fix usage of podcast cover in title widget.
+45. Fix playback of downloaded podcasts.
+46. Simplify whitespace of podcast name and episode names.
+47. Fix saving of podcast images to JPG.
+48. Remove qt5ct work-around.
+49. When saving podcasts, remove queries from filename.
+50. Limit SoundCloud results to 200 matches.
+51. Fix loading of MPD playlists the very first time Cantata is started.
+52. Add file max-age to dynamic playlist rules.
+
2.3.0
-----
1. Only disable system tray support if org.kde.StatusNotifierWatcher is not
diff -Nru cantata-2.3.0/CMakeLists.txt cantata-2.3.1/CMakeLists.txt
--- cantata-2.3.0/CMakeLists.txt 2018-04-26 16:24:23.000000000 +0000
+++ cantata-2.3.1/CMakeLists.txt 2018-05-26 15:12:37.000000000 +0000
@@ -28,7 +28,7 @@
set(CPACK_SOURCE_GENERATOR "TBZ2")
set(CPACK_PACKAGE_VERSION_MAJOR "2")
set(CPACK_PACKAGE_VERSION_MINOR "3")
-set(CPACK_PACKAGE_VERSION_PATCH "0")
+set(CPACK_PACKAGE_VERSION_PATCH "1")
set(CPACK_PACKAGE_VERSION_SPIN "") # Use ".$number" - e.g. ".1"
set(CPACK_PACKAGE_CONTACT "Craig Drummond ")
set(CANTATA_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}")
@@ -63,6 +63,11 @@
option(ENABLE_MTP "Enable MTP library (required to support MTP devices)" ON)
option(ENABLE_AVAHI "Enable automatic mpd server discovery" ${UNIX})
+# Build all apps into top-level folder, so that can run dev versions without install
+if (NOT WIN32 AND NOT APPLE)
+ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
+endif()
+
if(ENABLE_AVAHI)
find_package(Avahi)
macro_log_feature(AVAHI_FOUND "Avahi Support" "Automatic MPD-Server Detection" "https://www.avahi.org/" FALSE "" "")
@@ -312,7 +317,7 @@
widgets/actionlabel.cpp widgets/playqueueview.cpp widgets/groupedview.cpp widgets/actionitemdelegate.cpp widgets/textbrowser.cpp
widgets/volumeslider.cpp widgets/menubutton.cpp widgets/icons.cpp widgets/toolbutton.cpp widgets/wizardpage.cpp
widgets/searchwidget.cpp widgets/messageoverlay.cpp widgets/basicitemdelegate.cpp widgets/sizegrip.cpp
- widgets/sizewidget.cpp widgets/servicestatuslabel.cpp widgets/spacerwidget.cpp widgets/songdialog.cpp widgets/stretchheaderview.cpp
+ widgets/servicestatuslabel.cpp widgets/spacerwidget.cpp widgets/songdialog.cpp widgets/stretchheaderview.cpp
widgets/tableview.cpp widgets/thinsplitterhandle.cpp widgets/coverwidget.cpp widgets/ratingwidget.cpp widgets/notelabel.cpp
widgets/selectorlabel.cpp widgets/titlewidget.cpp widgets/multipagewidget.cpp widgets/singlepagewidget.cpp widgets/stackedpagewidget.cpp
widgets/mirrormenu.cpp widgets/genrecombo.cpp widgets/volumecontrol.cpp widgets/categorizedview.cpp
@@ -338,8 +343,7 @@
online/onlinesearchwidget.cpp online/podcastservice.cpp online/rssparser.cpp online/opmlparser.cpp online/podcastsearchdialog.cpp
online/podcastsettingsdialog.cpp online/podcastwidget.cpp online/onlinesearchservice.cpp
db/onlinedb.cpp
- scrobbling/scrobbler.cpp scrobbling/pausabletimer.cpp scrobbling/scrobblingsettings.cpp scrobbling/scrobblingstatus.cpp
- scrobbling/scrobblinglove.cpp
+ scrobbling/scrobbler.cpp scrobbling/pausabletimer.cpp scrobbling/scrobblingsettings.cpp scrobbling/scrobblinglove.cpp
http/httpserver.cpp)
set(CANTATA_UIS ${CANTATA_UIS}
gui/initialsettingswizard.ui gui/mainwindow.ui gui/interfacesettings.ui gui/playbacksettings.ui gui/serversettings.ui gui/coverdialog.ui
@@ -453,7 +457,7 @@
devices/devicepropertiesdialog.cpp devices/encoders.cpp devices/freespaceinfo.cpp
devices/transcodingjob.cpp devices/valueslider.cpp devices/syncdialog.cpp
devices/synccollectionwidget.cpp
- online/onlinedevice.cpp models/musiclibrarymodel.cpp)
+ models/musiclibrarymodel.cpp)
set(CANTATA_UIS ${CANTATA_UIS} devices/actiondialog.ui devices/devicepropertieswidget.ui
devices/synccollectionwidget.ui)
@@ -511,6 +515,12 @@
set(CANTATA_SRCS ${CANTATA_SRCS} gui/shortcutssettingspage.cpp gui/mediakeys.cpp)
+if (WIN32 OR APPLE)
+ set(CANTATA_RCS ${CANTATA_RCS} cantata_icon.qrc)
+else()
+ add_subdirectory(icons)
+endif()
+
QT5_ADD_RESOURCES(CANTATA_RC_SRCS ${CANTATA_RCS})
QT5_WRAP_UI(CANTATA_UI_HDRS ${CANTATA_UIS})
@@ -570,18 +580,8 @@
if (WIN32)
target_link_libraries(cantata qxt)
- install(FILES tags/tag_fixes.xml context/lyrics_providers.xml context/weblinks.xml online/podcast_directories.xml scrobbling/scrobblers.xml
- DESTINATION ${CMAKE_INSTALL_PREFIX}/config/)
-elseif (APPLE)
- install(FILES tags/tag_fixes.xml context/lyrics_providers.xml context/weblinks.xml online/podcast_directories.xml scrobbling/scrobblers.xml
- DESTINATION ${MACOSX_BUNDLE_RESOURCES}/config/)
-else ()
- install(FILES tags/tag_fixes.xml context/lyrics_providers.xml context/weblinks.xml online/podcast_directories.xml scrobbling/scrobblers.xml
- DESTINATION ${SHARE_INSTALL_PREFIX}/${CMAKE_PROJECT_NAME}/config/)
- install(FILES mpd-interface/mpd.conf.template DESTINATION ${SHARE_INSTALL_PREFIX}/${CMAKE_PROJECT_NAME}/mpd)
endif (WIN32)
-add_subdirectory(icons)
add_subdirectory(translations)
add_subdirectory(support)
add_subdirectory(3rdparty/qtiocompressor)
diff -Nru cantata-2.3.0/config.h.cmake cantata-2.3.1/config.h.cmake
--- cantata-2.3.0/config.h.cmake 2018-02-07 19:17:59.000000000 +0000
+++ cantata-2.3.1/config.h.cmake 2018-05-16 21:34:44.000000000 +0000
@@ -54,7 +54,6 @@
#define CANTATA_REV_URL "@PROJECT_REV_URL@"
#define CANTATA_URL "@PROJECT_URL@"
-#define CANTATA_SYS_CONFIG_DIR Utils::systemDir(QLatin1String("config"))
#define CANTATA_SYS_ICONS_DIR Utils::systemDir(QLatin1String("icons"))
#define CANTATA_SYS_MPD_DIR Utils::systemDir(QLatin1String("mpd"))
#define CANTATA_SYS_TRANS_DIR Utils::systemDir(QLatin1String("translations"))
diff -Nru cantata-2.3.0/context/albumview.cpp cantata-2.3.1/context/albumview.cpp
--- cantata-2.3.0/context/albumview.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/context/albumview.cpp 2018-05-05 10:54:54.000000000 +0000
@@ -66,11 +66,15 @@
, detailsReceived(0)
{
engine=ContextEngine::create(this);
- refreshAction = ActionCollection::get()->createAction("refreshalbum", tr("Refresh Album Information"), Icons::self()->refreshIcon);
+ #ifndef Q_OS_WIN
+ // Full width covers not working under windows. Issue #1252
fullWidthCoverAction = new Action(tr("Full Width Cover"), this);
fullWidthCoverAction->setCheckable(true);
- connect(refreshAction, SIGNAL(triggered()), this, SLOT(refresh()));
connect(fullWidthCoverAction, SIGNAL(toggled(bool)), this, SLOT(setScaleImage(bool)));
+ fullWidthCoverAction->setChecked(Configuration(metaObject()->className()).get("fullWidthCover", false));
+ #endif
+ refreshAction = ActionCollection::get()->createAction("refreshalbum", tr("Refresh Album Information"), Icons::self()->refreshIcon);
+ connect(refreshAction, SIGNAL(triggered()), this, SLOT(refresh()));
connect(engine, SIGNAL(searchResult(QString,QString)), this, SLOT(searchResponse(QString,QString)));
connect(Covers::self(), SIGNAL(cover(Song,QImage,QString)), SLOT(coverRetrieved(Song,QImage,QString)));
connect(Covers::self(), SIGNAL(coverUpdated(Song,QImage,QString)), SLOT(coverUpdated(Song,QImage,QString)));
@@ -87,12 +91,13 @@
connect(timer, SIGNAL(timeout()), this, SLOT(clearCache()));
timer->start((int)((ArtistView::constCacheAge/2.0)*1000*24*60*60));
}
- fullWidthCoverAction->setChecked(Configuration(metaObject()->className()).get("fullWidthCover", false));
}
AlbumView::~AlbumView()
{
+ #ifndef Q_OS_WIN
Configuration(metaObject()->className()).set("fullWidthCover", fullWidthCoverAction->isChecked());
+ #endif
}
void AlbumView::showContextMenu(const QPoint &pos)
@@ -104,7 +109,9 @@
} else {
menu->addAction(refreshAction);
}
+ #ifndef Q_OS_WIN
menu->addAction(fullWidthCoverAction);
+ #endif
menu->exec(text->mapToGlobal(pos));
delete menu;
}
diff -Nru cantata-2.3.0/context/albumview.h cantata-2.3.1/context/albumview.h
--- cantata-2.3.0/context/albumview.h 2018-02-14 17:39:41.000000000 +0000
+++ cantata-2.3.1/context/albumview.h 2018-04-30 21:23:02.000000000 +0000
@@ -70,7 +70,9 @@
private:
QString currentArtist;
Action *refreshAction;
+ #ifndef Q_OS_WIN
Action *fullWidthCoverAction;
+ #endif
ContextEngine *engine;
int detailsReceived;
QString pic;
diff -Nru cantata-2.3.0/context/artistview.cpp cantata-2.3.1/context/artistview.cpp
--- cantata-2.3.0/context/artistview.cpp 2018-03-14 19:01:02.000000000 +0000
+++ cantata-2.3.1/context/artistview.cpp 2018-05-16 21:34:22.000000000 +0000
@@ -287,6 +287,10 @@
QFile f(cacheFileName(reply->property(constNameKey).toString(), QString(), true, true));
if (f.open(QIODevice::WriteOnly|QIODevice::Text)) {
QTextStream stream(&f);
+ #ifdef Q_OS_WIN
+ stream.setCodec("UTF-8");
+ stream.setGenerateByteOrderMark(true);
+ #endif
for (const QString &artist: artists) {
stream << artist << endl;
}
@@ -320,7 +324,7 @@
}
if (webLinks.isEmpty()) {
- QFile file(CANTATA_SYS_CONFIG_DIR+"weblinks.xml");
+ QFile file(":weblinks.xml");
if (file.open(QIODevice::ReadOnly)) {
QXmlStreamReader reader(&file);
while (!reader.atEnd()) {
diff -Nru cantata-2.3.0/context/contextwidget.cpp cantata-2.3.1/context/contextwidget.cpp
--- cantata-2.3.0/context/contextwidget.cpp 2018-03-25 10:37:14.000000000 +0000
+++ cantata-2.3.1/context/contextwidget.cpp 2018-05-01 21:26:45.000000000 +0000
@@ -517,6 +517,18 @@
if (darkBackground) {
p.fillRect(r, palette().background().color());
+ } else {
+ QColor col = palette().windowText().color();
+ col.setAlphaF(0.15);
+ p.setPen(col);
+ p.drawLine(r.topLeft(), r.topRight());
+ if (parentWidget() && parentWidget()->parentWidget() && 0==qstrcmp(parentWidget()->parentWidget()->metaObject()->className(), "QStackedWidget")) {
+ if (Qt::LeftToRight==layoutDirection()) {
+ p.drawLine(r.topLeft()+QPoint(0, 1), r.bottomLeft());
+ } else {
+ p.drawLine(r.topRight()+QPoint(0, 1), r.bottomRight());
+ }
+ }
}
if (backdropType) {
if (!oldBackdrop.isNull()) {
diff -Nru cantata-2.3.0/context/lyricsdialog.cpp cantata-2.3.1/context/lyricsdialog.cpp
--- cantata-2.3.0/context/lyricsdialog.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/context/lyricsdialog.cpp 2018-05-24 18:01:51.000000000 +0000
@@ -23,6 +23,7 @@
#include
#include
+#include
#include "support/icon.h"
#include "lyricsdialog.h"
@@ -46,7 +47,7 @@
icn->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
int iconSize=Icon::dlgIconSize();
icn->setFixedSize(iconSize, iconSize);
- icn->setPixmap(Icon("dialog-information").pixmap(iconSize, iconSize));
+ icn->setPixmap(style()->standardIcon(QStyle::SP_MessageBoxInformation).pixmap(iconSize, iconSize));
mainLayout->setMargin(0);
layout->setMargin(0);
mainLayout->addWidget(icn, 0, 0, 1, 1);
diff -Nru cantata-2.3.0/context/lyrics_providers.xml cantata-2.3.1/context/lyrics_providers.xml
--- cantata-2.3.0/context/lyrics_providers.xml 2018-02-15 18:10:11.000000000 +0000
+++ cantata-2.3.1/context/lyrics_providers.xml 2018-05-20 18:56:09.000000000 +0000
@@ -99,6 +99,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -Nru cantata-2.3.0/context/songview.cpp cantata-2.3.1/context/songview.cpp
--- cantata-2.3.0/context/songview.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/context/songview.cpp 2018-05-20 12:34:54.000000000 +0000
@@ -62,26 +62,26 @@
static QString infoCacheFileName(const Song &song, const QString &lang, bool createDir)
{
- QString dir=Utils::cacheDir(SongView::constCacheDir+Covers::encodeName(song.artist)+Utils::constDirSep, createDir);
+ QString dir=Utils::cacheDir(SongView::constCacheDir+Covers::encodeName(song.basicArtist())+Utils::constDirSep, createDir);
if (dir.isEmpty()) {
return QString();
}
- return dir+Covers::encodeName(song.title)+"."+lang+SongView::constInfoExt;
+ return dir+Covers::encodeName(song.basicTitle())+"."+lang+SongView::constInfoExt;
}
static QString lyricsCacheFileName(const Song &song, bool createDir=false)
{
- QString dir=Utils::cacheDir(SongView::constLyricsDir+Covers::encodeName(song.artist)+Utils::constDirSep, createDir);
+ QString dir=Utils::cacheDir(SongView::constLyricsDir+Covers::encodeName(song.basicArtist())+Utils::constDirSep, createDir);
if (dir.isEmpty()) {
return QString();
}
- return dir+Covers::encodeName(song.title)+SongView::constExtension;
+ return dir+Covers::encodeName(song.basicTitle())+SongView::constExtension;
}
#if !defined Q_OS_WIN && !defined Q_OS_MAC
static QString lyricsOtherFileName(const Song &song)
{
- return QDir::homePath()+"/.lyrics/"+Covers::encodeName(song.artist)+" - "+Covers::encodeName(song.title)+".txt";
+ return QDir::homePath()+"/.lyrics/"+Covers::encodeName(song.basicArtist())+" - "+Covers::encodeName(song.basicTitle())+".txt";
}
#endif
@@ -361,30 +361,40 @@
job->setProperty("file", currentSong.file);
connect(job, SIGNAL(finished()), this, SLOT(downloadFinished()));
return;
- } else {
- #ifdef TAGLIB_FOUND
- QString tagLyrics=Tags::readLyrics(songFile);
+ }
+ }
- if (!tagLyrics.isEmpty()) {
- text->setText(fixNewLines(tagLyrics));
- setMode(Mode_Display);
-// controls->setVisible(false);
- return;
- }
- #endif
- // Stop here if we found lyrics in the cache dir.
- if (setLyricsFromFile(mpdLyrics)) {
- lyricsFile=mpdLyrics;
- setMode(Mode_Display);
- return;
- }
- // Try .txt extension
- mpdLyrics=Utils::changeExtension(mpdLyrics, ".txt");
- if (setLyricsFromFile(mpdLyrics)) {
- lyricsFile=mpdLyrics;
- setMode(Mode_Display);
- return;
- }
+ loadLyricsFromFile();
+}
+
+void SongView::loadLyricsFromFile()
+{
+ if (currentSong.isCantataStream() || (!MPDConnection::self()->getDetails().dir.isEmpty() && !currentSong.file.isEmpty() && !currentSong.isNonMPD())) {
+ QString songFile=currentSong.filePath(MPDConnection::self()->getDetails().dir);
+ QString mpdLyrics=mpdLyricsFilePath(currentSong);
+
+ #ifdef TAGLIB_FOUND
+ QString tagLyrics=Tags::readLyrics(songFile);
+
+ if (!tagLyrics.isEmpty()) {
+ text->setText(fixNewLines(tagLyrics));
+ setMode(Mode_Display);
+ // controls->setVisible(false);
+ return;
+ }
+ #endif
+ // Stop here if we found lyrics in the cache dir.
+ if (setLyricsFromFile(mpdLyrics)) {
+ lyricsFile=mpdLyrics;
+ setMode(Mode_Display);
+ return;
+ }
+ // Try .txt extension
+ mpdLyrics=Utils::changeExtension(mpdLyrics, ".txt");
+ if (setLyricsFromFile(mpdLyrics)) {
+ lyricsFile=mpdLyrics;
+ setMode(Mode_Display);
+ return;
}
}
@@ -646,7 +656,7 @@
void SongView::searchForInfo()
{
cancelInfoJobAction->setEnabled(true);
- engine->search(QStringList() << currentSong.artist << currentSong.title, ContextEngine::Track);
+ engine->search(QStringList() << currentSong.basicArtist() << currentSong.basicTitle(), ContextEngine::Track);
showSpinner(false);
}
@@ -780,7 +790,7 @@
}
}
}
- getLyrics();
+ loadLyricsFromFile();
}
void SongView::lyricsReady(int id, QString lyrics)
@@ -817,7 +827,12 @@
QFile f(fileName);
if (f.open(QIODevice::WriteOnly)) {
- QTextStream(&f) << text->toPlainText();
+ QTextStream stream(&f);
+ #ifdef Q_OS_WIN
+ stream.setCodec("UTF-8");
+ stream.setGenerateByteOrderMark(true);
+ #endif
+ stream << text->toPlainText();
f.close();
lyricsFile=fileName;
return true;
@@ -882,7 +897,6 @@
if (f.exists() && f.open(QIODevice::ReadOnly)) {
// Read the file using a QTextStream so we get automatic UTF8 detection.
QTextStream inputStream(&f);
-
text->setText(fixNewLines(inputStream.readAll()));
cancelJobAction->setEnabled(false);
hideSpinner();
diff -Nru cantata-2.3.0/context/songview.h cantata-2.3.1/context/songview.h
--- cantata-2.3.0/context/songview.h 2018-02-14 22:24:06.000000000 +0000
+++ cantata-2.3.1/context/songview.h 2018-05-03 18:32:19.000000000 +0000
@@ -87,6 +87,7 @@
private:
void loadLyrics();
+ void loadLyricsFromFile();
void loadInfo();
void loadMetadata();
void searchForInfo();
diff -Nru cantata-2.3.0/context/ultimatelyrics.cpp cantata-2.3.1/context/ultimatelyrics.cpp
--- cantata-2.3.0/context/ultimatelyrics.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/context/ultimatelyrics.cpp 2018-05-16 21:37:43.000000000 +0000
@@ -150,31 +150,36 @@
return;
}
- QStringList dirs=QStringList() << Utils::dataDir() << CANTATA_SYS_CONFIG_DIR;
+ QStringList files;
+ QString userDir=Utils::dataDir();
- QSet providerNames;
- for (const QString &d: dirs) {
- if (d.isEmpty()) {
- continue;
- }
- QFileInfoList files=QDir(d).entryInfoList(QStringList() << QLatin1String("lyrics_*.xml"), QDir::NoDotAndDotDot|QDir::Files);
+ if (!userDir.isEmpty()) {
+ QFileInfoList files=QDir(userDir).entryInfoList(QStringList() << QLatin1String("lyrics_*.xml"), QDir::NoDotAndDotDot|QDir::Files);
for (const QFileInfo &f: files) {
- QFile file(f.absoluteFilePath());
- if (file.open(QIODevice::ReadOnly)) {
- QXmlStreamReader reader(&file);
- while (!reader.atEnd()) {
- reader.readNext();
-
- if (QLatin1String("provider")==reader.name()) {
- QString name=reader.attributes().value("name").toString();
-
- if (!providerNames.contains(name)) {
- UltimateLyricsProvider *provider = parseProvider(&reader);
- if (provider) {
- providers << provider;
- connect(provider, SIGNAL(lyricsReady(int,QString)), this, SIGNAL(lyricsReady(int,QString)));
- providerNames.insert(name);
- }
+ files.append(f.absoluteFilePath());
+ }
+ }
+
+ files.append(":lyrics_providers.xml");
+
+ QSet providerNames;
+
+ for (const auto &f: files) {
+ QFile file(f);
+ if (file.open(QIODevice::ReadOnly)) {
+ QXmlStreamReader reader(&file);
+ while (!reader.atEnd()) {
+ reader.readNext();
+
+ if (QLatin1String("provider")==reader.name()) {
+ QString name=reader.attributes().value("name").toString();
+
+ if (!providerNames.contains(name)) {
+ UltimateLyricsProvider *provider = parseProvider(&reader);
+ if (provider) {
+ providers << provider;
+ connect(provider, SIGNAL(lyricsReady(int,QString)), this, SIGNAL(lyricsReady(int,QString)));
+ providerNames.insert(name);
}
}
}
diff -Nru cantata-2.3.0/context/ultimatelyricsprovider.cpp cantata-2.3.1/context/ultimatelyricsprovider.cpp
--- cantata-2.3.0/context/ultimatelyricsprovider.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/context/ultimatelyricsprovider.cpp 2018-05-20 12:39:43.000000000 +0000
@@ -78,7 +78,7 @@
str.replace(constArtistArg, artistFixed);
str.replace(constArtistFirstCharArg, firstChar(artistFixed));
str.replace(constAlbumArg, song.album);
- str.replace(constTitleArg, song.title);
+ str.replace(constTitleArg, song.basicTitle());
str.replace(constYearArg, QString::number(song.year));
str.replace(constTrackNoArg, QString::number(song.track));
}
@@ -216,6 +216,7 @@
}
QString artistFixed=metadata.basicArtist();
+ QString titleFixed=metadata.basicTitle();
QString urlText(url);
if (QLatin1String("lyrics.wikia.com")==name) {
@@ -223,7 +224,7 @@
QUrlQuery query;
query.addQueryItem(QLatin1String("artist"), artistFixed);
- query.addQueryItem(QLatin1String("song"), metadata.title);
+ query.addQueryItem(QLatin1String("song"), titleFixed);
query.addQueryItem(QLatin1String("func"), QLatin1String("getSong"));
query.addQueryItem(QLatin1String("fmt"), QLatin1String("xml"));
url.setQuery(query);
@@ -246,9 +247,9 @@
doUrlReplace(constAlbumArg, metadata.album, urlText);
doUrlReplace(constAlbumLowerArg, metadata.album.toLower(), urlText);
doUrlReplace(constAlbumLowerNoSpaceArg, noSpace(metadata.album.toLower()), urlText);
- doUrlReplace(constTitleArg, metadata.title, urlText);
- doUrlReplace(constTitleLowerArg, metadata.title.toLower(), urlText);
- doUrlReplace(constTitleCaseArg, titleCase(metadata.title), urlText);
+ doUrlReplace(constTitleArg, titleFixed, urlText);
+ doUrlReplace(constTitleLowerArg, titleFixed.toLower(), urlText);
+ doUrlReplace(constTitleCaseArg, titleCase(titleFixed), urlText);
doUrlReplace(constYearArg, QString::number(metadata.year), urlText);
doUrlReplace(constTrackNoArg, QString::number(metadata.track), urlText);
}
diff -Nru cantata-2.3.0/debian/changelog cantata-2.3.1/debian/changelog
--- cantata-2.3.0/debian/changelog 2018-04-27 14:22:20.000000000 +0000
+++ cantata-2.3.1/debian/changelog 2018-06-06 08:07:49.000000000 +0000
@@ -1,4 +1,4 @@
-cantata (2.3.0-0build1~ubuntu16.04) xenial; urgency=low
+cantata (2.3.1-0build1~ubuntu16.04) xenial; urgency=low
* New upstream release.
* Use the packaged font-awesome rather than a local copy.
diff -Nru cantata-2.3.0/debian/patches/series cantata-2.3.1/debian/patches/series
--- cantata-2.3.0/debian/patches/series 2018-04-27 14:31:51.000000000 +0000
+++ cantata-2.3.1/debian/patches/series 2018-06-06 07:26:30.000000000 +0000
@@ -1,2 +1 @@
-font-awesome.patch
ebur128-location.patch
diff -Nru cantata-2.3.0/debian/rules cantata-2.3.1/debian/rules
--- cantata-2.3.0/debian/rules 2017-09-30 06:05:39.000000000 +0000
+++ cantata-2.3.1/debian/rules 2018-06-06 07:56:20.000000000 +0000
@@ -16,7 +16,6 @@
override_dh_auto_install:
dh_auto_install
- rm $(CURDIR)/debian/cantata/usr/share/cantata/icons/cantata/LICENSE
override_dh_installexamples:
dh_installexamples
diff -Nru cantata-2.3.0/devices/actiondialog.cpp cantata-2.3.1/devices/actiondialog.cpp
--- cantata-2.3.0/devices/actiondialog.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/devices/actiondialog.cpp 2018-05-24 18:11:34.000000000 +0000
@@ -47,6 +47,7 @@
#endif
#include
#include
+#include
#ifdef QT_QTDBUS_FOUND
#include
#endif
@@ -87,8 +88,8 @@
QWidget *mainWidet = new QWidget(this);
setupUi(mainWidet);
setMainWidget(mainWidet);
- errorIcon->setPixmap(QIcon::fromTheme("dialog-error").pixmap(64, 64));
- skipIcon->setPixmap(QIcon::fromTheme("dialog-warning").pixmap(64, 64));
+ errorIcon->setPixmap(style()->standardIcon(QStyle::SP_MessageBoxCritical).pixmap(64, 64));
+ skipIcon->setPixmap(style()->standardIcon(QStyle::SP_MessageBoxWarning).pixmap(64, 64));
configureSourceButton->setIcon(Icons::self()->configureIcon);
configureDestButton->setIcon(Icons::self()->configureIcon);
connect(configureSourceButton, SIGNAL(clicked()), SLOT(configureSource()));
diff -Nru cantata-2.3.0/devices/audiocddevice.cpp cantata-2.3.1/devices/audiocddevice.cpp
--- cantata-2.3.0/devices/audiocddevice.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/devices/audiocddevice.cpp 2018-05-23 18:55:59.000000000 +0000
@@ -36,6 +36,7 @@
#include "mpd-interface/mpdconnection.h"
#include "gui/covers.h"
#include "gui/settings.h"
+#include "widgets/icons.h"
#include
#include
#include
@@ -88,7 +89,7 @@
, lookupInProcess(false)
, autoPlay(false)
{
- icn=Icon("media-optical");
+ icn=Icons::self()->albumMonoIcon;
drive=dev.parent().as();
Solid::Block *block=dev.as();
if (block) {
diff -Nru cantata-2.3.0/devices/device.cpp cantata-2.3.1/devices/device.cpp
--- cantata-2.3.0/devices/device.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/devices/device.cpp 2018-05-24 18:05:14.000000000 +0000
@@ -47,6 +47,7 @@
#include "models/musiclibraryitemalbum.h"
#include "models/musiclibraryitemsong.h"
#include "models/musiclibrarymodel.h"
+#include "widgets/icons.h"
#include "solid-lite/portablemediaplayer.h"
#include "solid-lite/storageaccess.h"
#include "solid-lite/storagedrive.h"
@@ -268,9 +269,9 @@
int index=song.file.lastIndexOf('.');
if (index>0) {
- temp=new QTemporaryFile(QDir::tempPath()+"/cantata_XXXXXX"+song.file.mid(index));
+ temp=new QTemporaryFile("cantata_XXXXXX"+song.file.mid(index));
} else {
- temp=new QTemporaryFile(QDir::tempPath()+"/cantata_XXXXXX");
+ temp=new QTemporaryFile("cantata_XXXXXX");
}
temp->setAutoRemove(false);
@@ -311,7 +312,7 @@
, transcoding(false)
{
m_model=m;
- icn=Icon(solidDev.isValid() ? solidDev.icon() : QLatin1String("inode-directory"));
+ icn=Icons::self()->folderListIcon;
m_itemData[0]=m_itemData[0].toUpper();
}
@@ -325,7 +326,7 @@
, transcoding(false)
{
m_model=m;
- icn=Icon(solidDev.isValid() ? solidDev.icon() : QLatin1String("inode-directory"));
+ icn=solidDev.isValid() ? Icon::get(solidDev.icon()) : Icons::self()->folderListIcon;
}
void Device::saveCache()
diff -Nru cantata-2.3.0/devices/device.h cantata-2.3.1/devices/device.h
--- cantata-2.3.0/devices/device.h 2018-01-09 19:22:33.000000000 +0000
+++ cantata-2.3.1/devices/device.h 2018-05-24 17:53:48.000000000 +0000
@@ -108,7 +108,7 @@
~Device() override { }
- Icon icon() const override { return icn; }
+ QIcon icon() const override { return icn; }
Song fixPath(const Song &orig, bool fullPath) const override;
virtual QString coverFile() const { return QString(); }
virtual bool isConnected() const=0;
@@ -186,7 +186,7 @@
bool needToFixVa;
bool jobAbortRequested;
bool transcoding;
- Icon icn;
+ QIcon icn;
};
#endif
diff -Nru cantata-2.3.0/devices/mtpdevice.cpp cantata-2.3.1/devices/mtpdevice.cpp
--- cantata-2.3.0/devices/mtpdevice.cpp 2018-04-02 10:18:48.000000000 +0000
+++ cantata-2.3.1/devices/mtpdevice.cpp 2018-05-24 17:03:17.000000000 +0000
@@ -40,6 +40,7 @@
#include "filejob.h"
#include "support/configuration.h"
#include "support/thread.h"
+#include "support/monoicon.h"
#include
#include
#include
@@ -753,9 +754,9 @@
int index=name.lastIndexOf('.');
if (index>0) {
- temp=new QTemporaryFile(QDir::tempPath()+"/cantata_XXXXXX"+name.mid(index));
+ temp=new QTemporaryFile("cantata_XXXXXX"+name.mid(index));
} else {
- temp=new QTemporaryFile(QDir::tempPath()+"/cantata_XXXXXX");
+ temp=new QTemporaryFile("cantata_XXXXXX");
}
img.save(temp);
temp->close();
@@ -1211,7 +1212,7 @@
DBUG << "setName" << opts.name;
setData(opts.name);
}
- icn=Icon("multimedia-player");
+ icn=MonoIcon::icon(FontAwesome::mobilephone, Utils::monoIconColor());
}
MtpDevice::~MtpDevice()
@@ -1338,7 +1339,7 @@
if (transcoding) {
deleteTemp();
- tempFile=new QTemporaryFile(QDir::tempPath()+"/cantata_XXXXXX."+encoder.extension);
+ tempFile=new QTemporaryFile("cantata_XXXXXX."+encoder.extension);
tempFile->setAutoRemove(false);
if (!tempFile->open()) {
diff -Nru cantata-2.3.0/devices/remotefsdevice.cpp cantata-2.3.1/devices/remotefsdevice.cpp
--- cantata-2.3.0/devices/remotefsdevice.cpp 2018-04-02 14:33:00.000000000 +0000
+++ cantata-2.3.1/devices/remotefsdevice.cpp 2018-05-23 19:34:59.000000000 +0000
@@ -28,6 +28,7 @@
#include "actiondialog.h"
#include "support/inputdialog.h"
#include "support/utils.h"
+#include "support/monoicon.h"
#include "http/httpserver.h"
#include "support/configuration.h"
#include "mountpoints.h"
@@ -215,11 +216,11 @@
// details.path=Utils::fixPath(details.path);
load();
mount();
- icn=details.isLocalFile()
- ? Icon("inode-directory")
- : constSshfsProtocol==details.url.scheme()
- ? Icon(QStringList() << "folder-network" << "utilities-terminal")
- : Icon(QStringList() << "folder-samba" << "network-server");
+ icn=MonoIcon::icon(details.isLocalFile()
+ ? FontAwesome::foldero
+ : constSshfsProtocol==details.url.scheme()
+ ? FontAwesome::linux_os
+ : FontAwesome::windows, Utils::monoIconColor());
}
RemoteFsDevice::RemoteFsDevice(MusicLibraryModel *m, const Details &d)
@@ -233,7 +234,11 @@
{
// details.path=Utils::fixPath(details.path);
setup();
- icn=Icon(details.isLocalFile() ? "inode-directory" : (constSshfsProtocol==details.url.scheme() ? "utilities-terminal" : "network-server"));
+ icn=MonoIcon::icon(details.isLocalFile()
+ ? FontAwesome::foldero
+ : constSshfsProtocol==details.url.scheme()
+ ? FontAwesome::linux_os
+ : FontAwesome::windows, Utils::monoIconColor());
}
RemoteFsDevice::~RemoteFsDevice() {
diff -Nru cantata-2.3.0/devices/synccollectionwidget.h cantata-2.3.1/devices/synccollectionwidget.h
--- cantata-2.3.0/devices/synccollectionwidget.h 2018-01-09 19:22:33.000000000 +0000
+++ cantata-2.3.1/devices/synccollectionwidget.h 2018-05-24 18:04:59.000000000 +0000
@@ -32,7 +32,6 @@
class QTimer;
class Action;
-class Icon;
class SyncCollectionWidget : public QWidget, Ui::SyncCollectionWidget
{
diff -Nru cantata-2.3.0/devices/umsdevice.cpp cantata-2.3.1/devices/umsdevice.cpp
--- cantata-2.3.0/devices/umsdevice.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/devices/umsdevice.cpp 2018-05-23 18:57:53.000000000 +0000
@@ -23,6 +23,7 @@
#include "umsdevice.h"
#include "support/utils.h"
+#include "support/monoicon.h"
#include "devicepropertiesdialog.h"
#include "devicepropertieswidget.h"
#include "actiondialog.h"
@@ -56,8 +57,7 @@
defaultName=data()+details;
setData(defaultName);
setup();
- icn=Icon(QStringList() << "drive-removable-media-usb-pendrive" << "drive-removable-media-usb"
- << "multimedia-player");
+ icn=MonoIcon::icon(FontAwesome::usb, Utils::monoIconColor());
}
UmsDevice::~UmsDevice()
diff -Nru cantata-2.3.0/gui/apikeys.cpp cantata-2.3.1/gui/apikeys.cpp
--- cantata-2.3.0/gui/apikeys.cpp 2018-04-01 19:12:17.000000000 +0000
+++ cantata-2.3.1/gui/apikeys.cpp 2018-05-11 16:35:54.000000000 +0000
@@ -132,6 +132,7 @@
}
return true;
}
+ return false;
}
bool ApiKeys::isLimitReached(const QNetworkReply *job, Service srv)
@@ -139,6 +140,9 @@
if (isLimitReached(srv)) {
return true;
}
+ if (!job) {
+ return false;
+ }
bool reached = false;
switch (srv) {
diff -Nru cantata-2.3.0/gui/apikeyssettings.cpp cantata-2.3.1/gui/apikeyssettings.cpp
--- cantata-2.3.0/gui/apikeyssettings.cpp 2018-03-17 11:40:31.000000000 +0000
+++ cantata-2.3.1/gui/apikeyssettings.cpp 2018-05-09 19:37:05.000000000 +0000
@@ -77,6 +77,9 @@
"with all Cantata users) has reached its monthly usage limit. To work-around this, you can register with a "
"service yourself, and configure Cantata to use your personal API key. This key may be entered below. For any "
"blank values below, Cantata will use its default key."), this);
+ QFont f(Utils::smallFont(label->font()));
+ f.setItalic(true);
+ label->setFont(f);
label->setWordWrap(true);
layout->addWidget(label);
layout->addItem(new QSpacerItem(spacing, spacing, QSizePolicy::Fixed, QSizePolicy::Fixed));
diff -Nru cantata-2.3.0/gui/application.cpp cantata-2.3.1/gui/application.cpp
--- cantata-2.3.0/gui/application.cpp 2018-01-01 10:09:03.000000000 +0000
+++ cantata-2.3.1/gui/application.cpp 2018-06-01 16:26:03.000000000 +0000
@@ -26,6 +26,8 @@
#include "settings.h"
#include "support/proxystyle.h"
#include "models/mpdlibrarymodel.h"
+#include "models/playlistsmodel.h"
+#include "models/streamsmodel.h"
#include "support/utils.h"
#include "mpd-interface/mpdstats.h"
#include "mpd-interface/mpdstatus.h"
@@ -33,9 +35,12 @@
#include "tags/taghelperiface.h"
#include "scrobbling/scrobbler.h"
#include "support/fancytabwidget.h"
+#include "support/combobox.h"
#include "widgets/itemview.h"
#include "widgets/groupedview.h"
#include "widgets/actionitemdelegate.h"
+#include "widgets/toolbutton.h"
+#include "widgets/sizegrip.h"
#include "http/httpserver.h"
#include "config.h"
@@ -75,6 +80,8 @@
#endif
Scrobbler::self();
MpdLibraryModel::self();
+ PlaylistsModel::self();
+ StreamsModel::self();
// Ensure this is started before any MPD connection
HttpServer::self();
@@ -88,3 +95,37 @@
GroupedView::setup();
ActionItemDelegate::setup();
}
+
+void Application::fixSize(QWidget *widget)
+{
+ static int fixedHeight = -1;
+ if (-1 == fixedHeight) {
+ ComboBox c(widget);
+ ToolButton b(widget);
+ SizeGrip g(widget);
+ c.ensurePolished();
+ b.ensurePolished();
+ g.ensurePolished();
+ fixedHeight=qMax(24, qMax(c.sizeHint().height(), qMax(b.sizeHint().height(), g.sizeHint().height())));
+ if (fixedHeight%2) {
+ fixedHeight--;
+ }
+ }
+
+ QToolButton *tb=qobject_cast(widget);
+ if (tb) {
+ tb->setFixedSize(fixedHeight, fixedHeight);
+ } else {
+ #ifdef Q_OS_MAC
+ // TODO: Why is this +(2*focus) required for macOS? If its not used, library page's statusbar is larger
+ // than the rest - due to genre combo?
+ widget->setFixedHeight(fixedHeight+(2*widget->style()->pixelMetric(QStyle::PM_FocusFrameHMargin)));
+ #else
+ if (0==qstrcmp("QWidget", widget->metaObject()->className())) {
+ widget->setFixedHeight(fixedHeight+Utils::scaleForDpi(4));
+ } else {
+ widget->setFixedHeight(fixedHeight);
+ }
+ #endif
+ }
+}
diff -Nru cantata-2.3.0/gui/application_haiku.h cantata-2.3.1/gui/application_haiku.h
--- cantata-2.3.0/gui/application_haiku.h 2018-01-01 10:09:04.000000000 +0000
+++ cantata-2.3.1/gui/application_haiku.h 2018-05-26 15:12:37.000000000 +0000
@@ -30,6 +30,7 @@
{
public:
static void init();
+ static void fixSize(QWidget *widget);
Application(int &argc, char **argv);
virtual ~Application() { };
diff -Nru cantata-2.3.0/gui/application_mac.cpp cantata-2.3.1/gui/application_mac.cpp
--- cantata-2.3.0/gui/application_mac.cpp 2018-01-01 10:09:03.000000000 +0000
+++ cantata-2.3.1/gui/application_mac.cpp 2018-05-14 16:24:12.000000000 +0000
@@ -25,21 +25,12 @@
#include "support/utils.h"
#include "config.h"
#include
-#include
#include
Application::Application(int &argc, char **argv)
: SingleApplication(argc, argv)
{
setAttribute(Qt::AA_DontShowIconsInMenus, true);
- // Setup icon path...
- QStringList paths=QIcon::themeSearchPaths();
- QString path=Utils::systemDir("icons");
- if (!paths.contains(path)) {
- QIcon::setThemeSearchPaths(QStringList() << path << paths);
- }
-
- QIcon::setThemeName(QLatin1String("cantata"));
// Set DYLD_LIBRARY_PATH so that Qt finds our openSSL libs
QDir dir(argv[0]);
diff -Nru cantata-2.3.0/gui/application_mac.h cantata-2.3.1/gui/application_mac.h
--- cantata-2.3.0/gui/application_mac.h 2018-01-01 10:09:04.000000000 +0000
+++ cantata-2.3.1/gui/application_mac.h 2018-05-26 15:12:37.000000000 +0000
@@ -30,6 +30,7 @@
{
public:
static void init();
+ static void fixSize(QWidget *widget);
Application(int &argc, char **argv);
virtual ~Application() { };
};
diff -Nru cantata-2.3.0/gui/application_qt.cpp cantata-2.3.1/gui/application_qt.cpp
--- cantata-2.3.0/gui/application_qt.cpp 2018-03-10 07:59:20.000000000 +0000
+++ cantata-2.3.1/gui/application_qt.cpp 2018-05-14 16:24:48.000000000 +0000
@@ -26,16 +26,6 @@
#include
#include
#include
-#include
-
-static void setupIconTheme(Application *app)
-{
- QIcon::setThemeSearchPaths(QStringList() << CANTATA_SYS_ICONS_DIR << QIcon::themeSearchPaths());
- QIcon::setThemeName(QLatin1String("cantata"));
- if (Utils::KDE!=Utils::currentDe()) {
- app->setAttribute(Qt::AA_DontShowIconsInMenus, true);
- }
-}
Application::Application(int &argc, char **argv)
: QApplication(argc, argv)
@@ -48,7 +38,9 @@
bool Application::start()
{
if (QDBusConnection::sessionBus().registerService(CANTATA_REV_URL)) {
- setupIconTheme(this);
+ if (Utils::KDE!=Utils::currentDe()) {
+ setAttribute(Qt::AA_DontShowIconsInMenus, true);
+ }
return true;
}
loadFiles();
diff -Nru cantata-2.3.0/gui/application_qt.h cantata-2.3.1/gui/application_qt.h
--- cantata-2.3.0/gui/application_qt.h 2018-01-09 19:22:33.000000000 +0000
+++ cantata-2.3.1/gui/application_qt.h 2018-05-26 15:12:37.000000000 +0000
@@ -29,6 +29,7 @@
{
public:
static void init();
+ static void fixSize(QWidget *widget);
Application(int &argc, char **argv);
~Application() override { }
diff -Nru cantata-2.3.0/gui/application_win.cpp cantata-2.3.1/gui/application_win.cpp
--- cantata-2.3.0/gui/application_win.cpp 2018-01-01 10:09:03.000000000 +0000
+++ cantata-2.3.1/gui/application_win.cpp 2018-05-14 16:24:53.000000000 +0000
@@ -23,14 +23,12 @@
#include "application_win.h"
#include "config.h"
-#include
#include
Application::Application(int &argc, char **argv)
: SingleApplication(argc, argv)
{
installNativeEventFilter(this);
- QIcon::setThemeName(QLatin1String("cantata"));
setAttribute(Qt::AA_DontShowIconsInMenus, true);
}
diff -Nru cantata-2.3.0/gui/application_win.h cantata-2.3.1/gui/application_win.h
--- cantata-2.3.0/gui/application_win.h 2018-01-01 10:09:04.000000000 +0000
+++ cantata-2.3.1/gui/application_win.h 2018-05-26 15:12:37.000000000 +0000
@@ -31,6 +31,7 @@
{
public:
static void init();
+ static void fixSize(QWidget *widget);
Application(int &argc, char **argv);
virtual ~Application() { }
bool nativeEventFilter(const QByteArray &, void *message, long *result);
diff -Nru cantata-2.3.0/gui/cachesettings.cpp cantata-2.3.1/gui/cachesettings.cpp
--- cantata-2.3.0/gui/cachesettings.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/gui/cachesettings.cpp 2018-05-09 19:36:25.000000000 +0000
@@ -250,6 +250,9 @@
int col=0;
QLabel *label=new QLabel(tr("Cantata caches various pieces of information (covers, lyrics, etc). Below is a summary of Cantata's "
"current cache usage."), this);
+ QFont f(Utils::smallFont(label->font()));
+ f.setItalic(true);
+ label->setFont(f);
label->setWordWrap(true);
layout->addWidget(label, row++, col, 1, 2);
layout->addItem(new QSpacerItem(spacing, spacing, QSizePolicy::Fixed, QSizePolicy::Fixed), row++, 0);
diff -Nru cantata-2.3.0/gui/coverdialog.cpp cantata-2.3.1/gui/coverdialog.cpp
--- cantata-2.3.0/gui/coverdialog.cpp 2018-03-14 18:59:36.000000000 +0000
+++ cantata-2.3.1/gui/coverdialog.cpp 2018-05-24 17:55:11.000000000 +0000
@@ -546,7 +546,7 @@
QTemporaryFile *temp=nullptr;
if (isLarge || (reply->property(constThumbProperty).toString()==reply->property(constLargeProperty).toString())) {
- temp=new QTemporaryFile(QDir::tempPath()+"/cantata_XXXXXX."+(format ? QString(QLatin1String(format)).toLower() : "png"));
+ temp=new QTemporaryFile("cantata_XXXXXX."+(format ? QString(QLatin1String(format)).toLower() : "png"));
if (temp->open()) {
if (!format) {
@@ -824,8 +824,8 @@
{
if (!menu) {
menu=new QMenu(list);
- showAction=menu->addAction(Icon("zoom-original"), tr("Display"));
- removeAction=menu->addAction(Icon("list-remove"), tr("Remove"));
+ showAction=menu->addAction(tr("Display"));
+ removeAction=menu->addAction(tr("Remove"));
connect(showAction, SIGNAL(triggered()), SLOT(showImage()));
connect(removeAction, SIGNAL(triggered()), SLOT(removeImages()));
}
diff -Nru cantata-2.3.0/gui/covers.cpp cantata-2.3.1/gui/covers.cpp
--- cantata-2.3.0/gui/covers.cpp 2018-04-25 15:34:41.000000000 +0000
+++ cantata-2.3.1/gui/covers.cpp 2018-05-26 18:22:51.000000000 +0000
@@ -206,6 +206,17 @@
static Covers::Image serviceImage(const Song &s)
{
Covers::Image img;
+
+ if (s.hasExtraField(Song::OnlineImageCacheName)) {
+ img.fileName=s.extraField(Song::OnlineImageCacheName);
+ if (!img.fileName.isEmpty()) {
+ img.img=loadImage(img.fileName);
+ if (!img.img.isNull()) {
+ DBUG_CLASS("Covers") << s.onlineService() << img.fileName;
+ return img;
+ }
+ }
+ }
img.fileName=OnlineService::iconPath(s.onlineService());
if (!img.fileName.isEmpty()) {
img.img=loadImage(img.fileName);
@@ -408,15 +419,20 @@
static bool initialised=false;
if (!initialised) {
initialised=true;
- QStringList dirs=QStringList() << Utils::dataDir() << CANTATA_SYS_CONFIG_DIR;
- for (const QString &dir: dirs) {
- if (dir.isEmpty()) {
- continue;
- }
- QFile f(dir+QLatin1String("/tag_fixes.xml"));
- if (f.open(QIODevice::ReadOnly)) {
- QXmlStreamReader doc(&f);
+ QStringList files;
+ QString userDir=Utils::dataDir();
+
+ if (!userDir.isEmpty()) {
+ files.append(Utils::fixPath(userDir)+QLatin1String("tag_fixes.xml"));
+ }
+
+ files.append(":tag_fixes.xml");
+
+ for (const auto &f: files) {
+ QFile file(f);
+ if (file.open(QIODevice::ReadOnly)) {
+ QXmlStreamReader doc(&file);
while (!doc.atEnd()) {
doc.readNext();
if (doc.isStartElement() && QLatin1String("artist")==doc.name()) {
@@ -876,10 +892,16 @@
fileName=cacheName.isEmpty()
? Utils::cacheDir(id.toLower(), true)+Covers::encodeName(song.album.isEmpty() ? song.albumArtist() : (song.albumArtist()+" - "+song.album))+(png ? ".png" : ".jpg")
: cacheName;
- QFile f(fileName);
- if (f.open(QIODevice::WriteOnly)) {
+ if (png && !cacheName.isEmpty()) {
+ QImage img=QImage::fromData(data, Covers::imageFormat(data));
+ img.save(fileName, "JPG");
DBUG << "Saved image to" << fileName;
- f.write(data);
+ } else {
+ QFile f(fileName);
+ if (f.open(QIODevice::WriteOnly)) {
+ DBUG << "Saved image to" << fileName;
+ f.write(data);
+ }
}
}
emit cover(job.song, img, fileName);
@@ -1229,7 +1251,7 @@
key+=QString::number(size);
QPixmap *pix=cache.object(key);
if (!pix) {
- const Icon &icn=song.isArtistImageRequest() || song.isComposerImageRequest()
+ const QIcon &icn=song.isArtistImageRequest() || song.isComposerImageRequest()
? Icons::self()->artistIcon
: podcast
? Icons::self()->podcastIcon
diff -Nru cantata-2.3.0/gui/currentcover.cpp cantata-2.3.1/gui/currentcover.cpp
--- cantata-2.3.0/gui/currentcover.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/gui/currentcover.cpp 2018-05-24 17:55:11.000000000 +0000
@@ -65,7 +65,7 @@
void CurrentCover::initIconThemes()
{
if (iconThemes.isEmpty()) {
- themes(Icon::currentTheme(), iconThemes);
+ themes(QIcon::themeName(), iconThemes);
}
}
diff -Nru cantata-2.3.0/gui/customactionssettings.cpp cantata-2.3.1/gui/customactionssettings.cpp
--- cantata-2.3.0/gui/customactionssettings.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/gui/customactionssettings.cpp 2018-05-09 19:36:45.000000000 +0000
@@ -86,6 +86,9 @@
layout->setMargin(0);
QLabel *label=new QLabel(tr("To have Cantata call external commands (e.g. to edit tags with another application), add an entry for the command below. When at least one command "
"command is defined, a 'Custom Actions' entry will be added to the context menus in the Library, Folders, and Playlists views."), this);
+ QFont f(Utils::smallFont(label->font()));
+ f.setItalic(true);
+ label->setFont(f);
label->setWordWrap(true);
layout->addWidget(label, 0, 0, 1, 2);
tree=new QTreeWidget(this);
diff -Nru cantata-2.3.0/gui/initialsettingswizard.cpp cantata-2.3.1/gui/initialsettingswizard.cpp
--- cantata-2.3.0/gui/initialsettingswizard.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/gui/initialsettingswizard.cpp 2018-05-24 16:58:23.000000000 +0000
@@ -26,6 +26,7 @@
#include "settings.h"
#include "support/utils.h"
#include "support/icon.h"
+#include "support/monoicon.h"
#include "widgets/icons.h"
#include "models/mpdlibrarymodel.h"
#ifdef ENABLE_SIMPLE_MPD_SUPPORT
@@ -64,19 +65,10 @@
port->setValue(det.port);
password->setText(det.password);
dir->setText(det.dir);
- #if defined Q_OS_WIN || defined Q_OS_MAC
- bool showGroupWarning=false;
- #else
- bool showGroupWarning=0==Utils::getGroupId();
- #endif
- groupWarningLabel->setVisible(showGroupWarning);
- groupWarningIcon->setVisible(showGroupWarning);
- int iconSize=Icon::dlgIconSize();
- groupWarningIcon->setPixmap(Icon("dialog-warning").pixmap(iconSize, iconSize));
introPage->setBackground(Icons::self()->appIcon);
- connectionPage->setBackground(Icons::self()->audioFileIcon);
- coversPage->setBackground(Icons::self()->albumIconLarge);
- finishedPage->setBackground(Icon("dialog-ok"));
+ connectionPage->setBackground(Icons::self()->audioListIcon);
+ coversPage->setBackground(Icons::self()->albumMonoIcon);
+ finishedPage->setBackground(MonoIcon::icon(FontAwesome::check, Utils::monoIconColor()));
fetchCovers->setChecked(Settings::self()->fetchCovers());
storeCoversInMpdDir->setChecked(Settings::self()->storeCoversInMpdDir());
@@ -236,7 +228,8 @@
void InitialSettingsWizard::accept()
{
Settings::self()->saveConnectionDetails(getDetails());
-
+ Settings::self()->saveFetchCovers(fetchCovers->isChecked());
+ Settings::self()->saveStoreCoversInMpdDir(storeCoversInMpdDir->isChecked());
#ifdef ENABLE_SIMPLE_MPD_SUPPORT
if (basic->isChecked()) {
Settings::self()->saveCurrentConnection(MPDUser::constName);
diff -Nru cantata-2.3.0/gui/initialsettingswizard.ui cantata-2.3.1/gui/initialsettingswizard.ui
--- cantata-2.3.0/gui/initialsettingswizard.ui 2018-02-15 20:29:36.000000000 +0000
+++ cantata-2.3.1/gui/initialsettingswizard.ui 2018-05-24 16:56:37.000000000 +0000
@@ -794,29 +794,7 @@
- -
-
-
- -
-
-
-
- 0
- 0
-
-
-
- <b>Warning:</b> You are not currently a member of the 'users' group. Cantata will function better (saving of album covers, lyrics, etc. with the correct permissions) if you (or your administrator) add yourself to this group. If you do add yourself you will need to logout and back in for this to take effect.
-
-
- true
-
-
- Qt::NoTextInteraction
-
-
-
- -
+
-
Qt::Vertical
diff -Nru cantata-2.3.0/gui/interfacesettings.cpp cantata-2.3.1/gui/interfacesettings.cpp
--- cantata-2.3.0/gui/interfacesettings.cpp 2018-04-01 18:49:18.000000000 +0000
+++ cantata-2.3.1/gui/interfacesettings.cpp 2018-04-30 17:11:04.000000000 +0000
@@ -223,7 +223,13 @@
coverNameNoteLabel->setText(tr("If no setting is specified for 'Filename', then Cantata will use a default of "
"
cover
. This filename is used when downloading covers."));
#endif
- setMinimumSize(750, 650);
+
+ QFont f = Utils::smallFont(ignorePrefixesLabel->font());
+ f.setItalic(true);
+ ignorePrefixesLabel->setFont(f);
+ composerGenresLabel->setFont(f);
+ singleTracksFoldersLabel->setFont(f);
+ setMinimumSize(Utils::scaleForDpi(720), Utils::scaleForDpi(620));
}
void InterfaceSettings::load()
diff -Nru cantata-2.3.0/gui/interfacesettings.ui cantata-2.3.1/gui/interfacesettings.ui
--- cantata-2.3.0/gui/interfacesettings.ui 2018-04-01 18:49:18.000000000 +0000
+++ cantata-2.3.1/gui/interfacesettings.ui 2018-05-05 16:15:42.000000000 +0000
@@ -6,8 +6,8 @@
0
0
- 1719
- 435
+ 600
+ 500
@@ -506,7 +506,7 @@
-
-
+
Enter a (comma separated) list of prefixes to ignore when sorting artist and albums. e.g. if set to 'The' then 'The Beatles' would be sorted by 'Beatles'
@@ -532,7 +532,7 @@
-
-
+
By default, Cantata uses the 'Album Artist' tag (or 'Artist' tag if a song has no 'Album Artist') to group songs and albums. For certain genres, e.g 'Classical', it may be preferable to use the 'Composer' tag (if set) to perform this grouping. Please enter a (comma separated) list of the genres with which you would like Cantata to use the 'Composer' tag.
@@ -558,7 +558,7 @@
-
-
+
If you have a lot of artists in your collection that only contain a single track, then it can be cumbersome for each of these to have their own entry in the list of artists. As a work-around for this, if you place these tracks into a separate folder, and enter this folder name below, then Cantata will group these under an album named 'Single Tracks' with an album artist of 'Various Artists'. You may enter a comma separated list of folder names (without leading or trailing path separators) below.
@@ -621,7 +621,7 @@
16
- 264
+ 16
diff -Nru cantata-2.3.0/gui/localfolderpage.cpp cantata-2.3.1/gui/localfolderpage.cpp
--- cantata-2.3.0/gui/localfolderpage.cpp 2018-04-08 10:15:13.000000000 +0000
+++ cantata-2.3.1/gui/localfolderpage.cpp 2018-05-23 19:37:17.000000000 +0000
@@ -28,6 +28,7 @@
#include "widgets/menubutton.h"
#include "support/monoicon.h"
#include "support/configuration.h"
+#include "support/utils.h"
#ifdef TAGLIB_FOUND
#include "tags/tags.h"
#endif
@@ -37,10 +38,11 @@
: SinglePageWidget(p)
, isHomeFolder(isHome)
{
- model = isHome ? new LocalBrowseModel(QLatin1String("localbrowsehome"), tr("Home"), tr("Browse files in your home folder"), ":home.svg", this)
- : new LocalBrowseModel(QLatin1String("localbrowseroot"), tr("Root"), tr("Browse files on your computer"), ":hdd.svg", this);
+ QColor col = Utils::monoIconColor();
+ model = isHome ? new LocalBrowseModel(QLatin1String("localbrowsehome"), tr("Home"), tr("Browse files in your home folder"), MonoIcon::icon(FontAwesome::home, col), this)
+ : new LocalBrowseModel(QLatin1String("localbrowseroot"), tr("Root"), tr("Browse files on your computer"), MonoIcon::icon(FontAwesome::hddo, col), this);
proxy = new FileSystemProxyModel(model);
- browseAction = new Action(MonoIcon::icon(FontAwesome::folderopen, Utils::monoIconColor()), tr("Open In File Manager"), this);
+ browseAction = new Action(MonoIcon::icon(FontAwesome::folderopen, col), tr("Open In File Manager"), this);
connect(view, SIGNAL(itemsSelected(bool)), this, SLOT(controlActions()));
connect(view, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(itemDoubleClicked(const QModelIndex &)));
connect(view, SIGNAL(headerClicked(int)), SLOT(headerClicked(int)));
diff -Nru cantata-2.3.0/gui/localfolderpage.h cantata-2.3.1/gui/localfolderpage.h
--- cantata-2.3.0/gui/localfolderpage.h 2018-02-08 16:48:09.000000000 +0000
+++ cantata-2.3.1/gui/localfolderpage.h 2018-05-24 17:50:59.000000000 +0000
@@ -39,7 +39,7 @@
QString name() const { return model->name(); }
QString title() const { return model->title(); }
QString descr() const { return model->descr(); }
- const Icon & icon() const { return model->icon(); }
+ const QIcon & icon() const { return model->icon(); }
QList selectedSongs(bool allowPlaylists=false) const override;
private:
diff -Nru cantata-2.3.0/gui/main.cpp cantata-2.3.1/gui/main.cpp
--- cantata-2.3.0/gui/main.cpp 2018-04-24 21:42:30.000000000 +0000
+++ cantata-2.3.1/gui/main.cpp 2018-05-17 16:29:40.000000000 +0000
@@ -348,9 +348,10 @@
QCoreApplication::setOrganizationName(ORGANIZATION_NAME);
QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
- #if QT_VERSION >= 0x050600 && defined Q_OS_WIN
- QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
- #endif
+ // Dont enable AA_EnableHighDpiScaling - messes up fractional scaling? Issue #1257
+ //#if QT_VERSION >= 0x050600 && defined Q_OS_WIN
+ //QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
+ //#endif
Application app(argc, argv);
app.setApplicationVersion(PACKAGE_VERSION_STRING);
@@ -362,9 +363,11 @@
QCommandLineOption debugOption(QStringList() << "d" << "debug", QObject::tr("Comma-separated list of debug areas - possible values:\n")+debugAreas(), "debug", "");
QCommandLineOption debugToFileOption(QStringList() << "f" << "debug-to-file", QObject::tr("Log debug messages to %1").arg(Utils::cacheDir(QString(), true)+"cantata.log"), "", "false");
QCommandLineOption noNetworkOption(QStringList() << "n" << "no-network", QObject::tr("Disable network access"), "", "false");
+ QCommandLineOption collectionOption(QStringList() << "c" << "collection", "Collection name", "collection", ""); // TODO: 2.4 tr
cmdLineParser.addOption(debugOption);
cmdLineParser.addOption(debugToFileOption);
cmdLineParser.addOption(noNetworkOption);
+ cmdLineParser.addOption(collectionOption);
cmdLineParser.process(app);
if (!app.start()) {
@@ -404,7 +407,8 @@
#else
loadTranslation("qt", QLibraryInfo::location(QLibraryInfo::TranslationsPath), lang);
#endif
- loadTranslation("cantata", CANTATA_SYS_TRANS_DIR, lang);
+ QString local = Utils::fixPath(QCoreApplication::applicationDirPath())+"translations";
+ loadTranslation("cantata", QDir(local).exists() ? local : CANTATA_SYS_TRANS_DIR, lang);
Application::init();
@@ -413,6 +417,17 @@
if (QDialog::Rejected==wz.exec()) {
return 0;
}
+ } else if (cmdLineParser.isSet(collectionOption)) {
+ QString col = cmdLineParser.value(collectionOption);
+ if (!col.isEmpty() && col!=Settings::self()->currentConnection()) {
+ auto collections = Settings::self()->allConnections();
+ for (const auto &c: collections) {
+ if (c.name==col) {
+ Settings::self()->saveCurrentConnection(col);
+ break;
+ }
+ }
+ }
}
MainWindow mw;
#if defined Q_OS_WIN || defined Q_OS_MAC
diff -Nru cantata-2.3.0/gui/mainwindow.cpp cantata-2.3.1/gui/mainwindow.cpp
--- cantata-2.3.0/gui/mainwindow.cpp 2018-04-26 16:22:47.000000000 +0000
+++ cantata-2.3.1/gui/mainwindow.cpp 2018-05-27 16:50:05.000000000 +0000
@@ -25,6 +25,7 @@
*/
#include "mainwindow.h"
+#include "application.h"
#include "support/thread.h"
#include "trayitem.h"
#include "support/messagebox.h"
@@ -140,6 +141,7 @@
, lastState(MPDState_Inactive)
, lastSongId(-1)
, autoScrollPlayQueue(true)
+ , singlePane(false)
, currentPage(nullptr)
#ifdef QT_QTDBUS_FOUND
, mpris(nullptr)
@@ -162,31 +164,9 @@
stopTrackButton=nullptr;
coverWidget=nullptr;
tabWidget=nullptr;
-
- #if defined Q_OS_MAC || defined Q_OS_WIN
- init();
- #else
- if ("qt5ct"==qgetenv("QT_QPA_PLATFORMTHEME")) {
- // Work-aroud Qt5Ct colour scheme issues. Qt5Ct applies its palette after Cantata's main window
- // is shown. Issue 944
- // TODO: The real fix would be for Cantata to properly repect colour scheme changes
- show();
- resize(0, 0);
- QTimer::singleShot(5, this, SLOT(init()));
- }
- else {
- init();
- }
- #endif
-}
-
-void MainWindow::init()
-{
- #if !defined Q_OS_MAC && !defined Q_OS_WIN
- // Work-aroud Qt5Ct incorrectly setting icon theme
- QIcon::setThemeSearchPaths(QStringList() << CANTATA_SYS_ICONS_DIR << QIcon::themeSearchPaths());
- QIcon::setThemeName(QLatin1String("cantata"));
- #endif
+ savePlayQueueButton=nullptr;
+ centerPlayQueueButton=nullptr;
+ midSpacer=nullptr;
QPoint p=pos();
ActionCollection::setMainWidget(this);
@@ -207,7 +187,7 @@
Song::setUseOriginalYear(Settings::self()->useOriginalYear());
int hSpace=Utils::layoutSpacing(this);
- int vSpace=fontMetrics().height()<14 ? hSpace/2 : 0;
+ int vSpace=Utils::scaleForDpi(2);
toolbarLayout->setContentsMargins(hSpace, vSpace, hSpace, vSpace);
toolbar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
setWindowTitle("Cantata");
@@ -222,6 +202,14 @@
topToolBar->addWidget(toolbar);
topToolBar->setMovable(false);
topToolBar->setContextMenuPolicy(Qt::PreventContextMenu);
+
+ topToolBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ topToolBar->setContentsMargins(0, 0, 0, 0);
+ QLayout *l=topToolBar->layout();
+ if (l) {
+ l->setMargin(0);
+ l->setSpacing(0);
+ }
topToolBar->ensurePolished();
toolbar=topToolBar;
#elif !defined Q_OS_WIN
@@ -235,10 +223,15 @@
topToolBar->setContextMenuPolicy(Qt::PreventContextMenu);
topToolBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
topToolBar->setContentsMargins(0, 0, 0, 0);
+ QLayout *l=topToolBar->layout();
+ if (l) {
+ l->setMargin(0);
+ l->setSpacing(0);
+ }
topToolBar->ensurePolished();
toolbar=topToolBar;
} else {
- toolbar->setFixedHeight(qMax(54, (int)(fontMetrics().height()*3.5)+(toolbarLayout->spacing()*3)+(vSpace*2)));
+ toolbar->setFixedHeight(qMax(54, (int)(fontMetrics().height()*3.25)+(toolbarLayout->spacing()*3)+(vSpace*2)));
}
#endif
@@ -351,7 +344,7 @@
locateMenu->addAction(locateTrackAction);
locateAction->setMenu(locateMenu);
- playNextAction = ActionCollection::get()->createAction("playnext", tr("Play next"));
+ playNextAction = ActionCollection::get()->createAction("playnext", tr("Play Next"));
#ifdef TAGLIB_FOUND
editPlayQueueTagsAction = ActionCollection::get()->createAction("editpqtags", Utils::strippedText(StdActions::self()->editTagsAction->text()), StdActions::self()->editTagsAction->icon());
editPlayQueueTagsAction->setSettingsText(tr("Edit Track Information (Play Queue)"));
@@ -525,6 +518,13 @@
playPauseTrackButton->setIconSize(QSize(playPauseIconSize, playPauseIconSize));
playPauseTrackButton->setFixedSize(QSize(playPauseIconSize+6, playPauseIconSize+6));
+ QList pqWidgets = QList() << stopDynamicButton << dynamicLabel << playQueueStatsLabel << fullScreenLabel
+ << repeatButton << singleButton << randomButton << consumeButton << midSpacer
+ << centerPlayQueueButton << savePlayQueueButton << clearPlayQueueButton << sizeGrip;
+ for (const auto &item: pqWidgets) {
+ Application::fixSize(item);
+ }
+
if (fullScreenAction->isEnabled()) {
fullScreenAction->setChecked(Settings::self()->showFullScreen());
}
@@ -584,7 +584,7 @@
#ifdef Q_OS_MAC
bool showMenubar = true;
#else
- bool showMenubar = Utils::Gnome!=Utils::currentDe() && Utils::Ubuntu_Gnome!=Utils::currentDe();
+ bool showMenubar = Utils::Gnome!=Utils::currentDe();
#endif
if (showMenubar) {
#ifdef Q_OS_MAC
@@ -912,12 +912,12 @@
updateActionToolTips();
CustomActions::self()->setMainWindow(this);
- if (Utils::Gnome!=Utils::currentDe() && Settings::self()->startHidden()) {
+ if (Utils::useSystemTray() && Settings::self()->startHidden()) {
hide();
} else {
show();
}
- controlPlayQueueButtons();
+ QTimer::singleShot(0, this, SLOT(controlPlayQueueButtons()));
}
MainWindow::~MainWindow()
@@ -958,7 +958,7 @@
StreamsModel::self()->save();
nowPlaying->saveConfig();
Settings::self()->saveForceSingleClick(TreeView::getForceSingleClick());
- if (Utils::Gnome!=Utils::currentDe()) {
+ if (Utils::useSystemTray()) {
Settings::StartupState startupState=Settings::self()->startupState();
Settings::self()->saveStartHidden(trayItem->isActive() && Settings::self()->minimiseOnClose() &&
((isHidden() && Settings::SS_ShowMainWindow!=startupState) || (Settings::SS_HideMainWindow==startupState)));
@@ -1098,15 +1098,16 @@
}
}
-#if defined Q_OS_WIN
void MainWindow::showEvent(QShowEvent *event)
{
+ #if defined Q_OS_WIN
if (!thumbnailTooolbar) {
thumbnailTooolbar=new ThumbnailToolBar(this);
}
+ #endif
QMainWindow::showEvent(event);
+ controlView();
}
-#endif
void MainWindow::closeEvent(QCloseEvent *event)
{
@@ -1376,11 +1377,11 @@
if (!switchedOn.isEmpty() && switchedOff.isEmpty()) {
QStringList names=switchedOn.toList();
qSort(names);
- trayItem->showMessage(tr("Outputs"), tr("Enabled: %1").arg(names.join(QLatin1String(", "))), Icons::self()->speakerIcon.pixmap(64, 64).toImage());
+ trayItem->showMessage(tr("Outputs"), tr("Enabled: %1").arg(names.join(QLatin1String(", "))));
} else if (!switchedOff.isEmpty() && switchedOn.isEmpty()) {
QStringList names=switchedOff.toList();
qSort(names);
- trayItem->showMessage(tr("Outputs"), tr("Disabled: %1").arg(names.join(QLatin1String(", "))), Icons::self()->speakerIcon.pixmap(64, 64).toImage());
+ trayItem->showMessage(tr("Outputs"), tr("Disabled: %1").arg(names.join(QLatin1String(", "))));
} else if (!switchedOn.isEmpty() && !switchedOff.isEmpty()) {
QStringList on=switchedOn.toList();
qSort(on);
@@ -1388,7 +1389,7 @@
qSort(off);
trayItem->showMessage(tr("Outputs"),
tr("Enabled: %1").arg(on.join(QLatin1String(", ")))+QLatin1Char('\n')+
- tr("Disabled: %1").arg(off.join(QLatin1String(", "))), Icons::self()->speakerIcon.pixmap(64, 64).toImage());
+ tr("Disabled: %1").arg(off.join(QLatin1String(", "))));
}
}
setProperty(constMpdEnabledOuptuts, QStringList() << enabledMpd.toList());
@@ -2619,11 +2620,11 @@
void MainWindow::controlView(bool forceUpdate)
{
if (!stopTrackButton || !coverWidget || !tabWidget) {
+ controlPlayQueueButtons();
return;
}
static int lastWidth=-1;
- static bool collapsed=false;
if (forceUpdate || -1==lastWidth || qAbs(lastWidth-width())>20) {
bool stopEnabled = stopTrackButton->property(constUserSettingProp).toBool();
@@ -2649,18 +2650,17 @@
if (responsiveSidebar || forceUpdate) {
if (!responsiveSidebar || width()>Utils::scaleForDpi(450)) {
- if (forceUpdate || collapsed) {
+ if (forceUpdate || singlePane) {
int index=tabWidget->currentIndex();
if (forceUpdate || tabWidget->style()!=tabWidgetStyle) {
tabWidget->setStyle(tabWidgetStyle);
}
tabWidget->setHiddenPages(tabWidgetPages);
tabWidget->setCurrentIndex(index);
- controlPlayQueueButtons();
}
- collapsed=false;
+ singlePane=false;
} else if (responsiveSidebar) {
- if (forceUpdate || !collapsed) {
+ if (forceUpdate || !singlePane) {
int index=tabWidget->currentIndex();
int smallStyle=FancyTabWidget::Small|FancyTabWidget::Top|FancyTabWidget::IconOnly;
if (forceUpdate || tabWidget->style()!=smallStyle) {
@@ -2681,20 +2681,23 @@
}
tabWidget->setCurrentIndex(index);
- controlPlayQueueButtons();
}
- collapsed=true;
+ singlePane=true;
}
}
}
+ controlPlayQueueButtons();
}
void MainWindow::controlPlayQueueButtons()
{
- savePlayQueueButton->setVisible(playQueueWidget->width()>Utils::scaleForDpi(410));
- centerPlayQueueButton->setVisible(playQueueWidget->width()>(Utils::scaleForDpi(410)+centerPlayQueueButton->width()));
- leftSpacer->setVisible(centerPlayQueueButton->isVisible() && (loveTrack->isVisible() || scrobblingStatus->isVisible()));
- midSpacer->setVisible(centerPlayQueueButton->isVisible());
+ if (!savePlayQueueButton || !centerPlayQueueButton || !midSpacer) {
+ return;
+ }
+
+ savePlayQueueButton->setVisible(singlePane || playQueueWidget->width()>Utils::scaleForDpi(320));
+ centerPlayQueueButton->setVisible(singlePane || playQueueWidget->width()>(Utils::scaleForDpi(320)+centerPlayQueueButton->width()));
+ midSpacer->setVisible(singlePane || centerPlayQueueButton->isVisible());
}
void MainWindow::expandOrCollapse(bool saveCurrentSize)
diff -Nru cantata-2.3.0/gui/mainwindow.h cantata-2.3.1/gui/mainwindow.h
--- cantata-2.3.0/gui/mainwindow.h 2018-03-24 15:36:24.000000000 +0000
+++ cantata-2.3.1/gui/mainwindow.h 2018-05-27 16:50:15.000000000 +0000
@@ -116,9 +116,7 @@
protected:
void keyPressEvent(QKeyEvent *event) override;
- #if defined Q_OS_WIN
- void showEvent(QShowEvent *event);
- #endif
+ void showEvent(QShowEvent *event) override;
void closeEvent(QCloseEvent *event) override;
void resizeEvent(QResizeEvent *event) override;
@@ -267,7 +265,6 @@
private Q_SLOTS:
void controlPlayQueueButtons();
- void init();
void toggleContext();
void initMpris();
void toggleMenubar();
@@ -278,6 +275,7 @@
qint32 lastSongId;
PlayQueueProxyModel playQueueProxyModel;
bool autoScrollPlayQueue;
+ bool singlePane;
Action *prefAction;
Action *refreshDbAction;
Action *doDbRefreshAction;
diff -Nru cantata-2.3.0/gui/mainwindow.ui cantata-2.3.1/gui/mainwindow.ui
--- cantata-2.3.0/gui/mainwindow.ui 2018-03-23 19:49:52.000000000 +0000
+++ cantata-2.3.1/gui/mainwindow.ui 2018-05-26 15:12:37.000000000 +0000
@@ -159,7 +159,7 @@
-
-
+
1
@@ -206,15 +206,6 @@
-
-
-
- -
-
-
- -
-
-
- -
true
@@ -261,9 +252,6 @@
-
-
-
- -
@@ -336,11 +324,6 @@
- SizeWidget
- QWidget
-
-
-
SizeGrip
QWidget
@@ -356,16 +339,6 @@
- ScrobblingStatus
- QToolButton
- scrobbling/scrobblingstatus.h
-
-
- ScrobblingLove
- QToolButton
- scrobbling/scrobblinglove.h
-
-
UrlLabel
QLabel
diff -Nru cantata-2.3.0/gui/mpdbrowsepage.h cantata-2.3.1/gui/mpdbrowsepage.h
--- cantata-2.3.0/gui/mpdbrowsepage.h 2018-02-07 21:59:25.000000000 +0000
+++ cantata-2.3.1/gui/mpdbrowsepage.h 2018-05-24 17:50:58.000000000 +0000
@@ -43,7 +43,7 @@
QString name() const { return model.name(); }
QString title() const { return model.title(); }
QString descr() const { return model.descr(); }
- const Icon & icon() const { return model.icon(); }
+ const QIcon & icon() const { return model.icon(); }
QStringList selectedFiles(bool allowPlaylists=false) const override;
QList selectedSongs(bool allowPlaylists=false) const override;
#ifdef ENABLE_DEVICES_SUPPORT
diff -Nru cantata-2.3.0/gui/playbacksettings.cpp cantata-2.3.1/gui/playbacksettings.cpp
--- cantata-2.3.0/gui/playbacksettings.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/gui/playbacksettings.cpp 2018-05-19 07:20:31.000000000 +0000
@@ -90,6 +90,7 @@
void PlaybackSettings::save()
{
Settings::self()->saveStopOnExit(stopOnExit->isChecked());
+ Settings::self()->saveStopFadeDuration(stopFadeDuration->value());
#if (defined Q_OS_LINUX && defined QT_QTDBUS_FOUND) || (defined Q_OS_MAC && defined IOKIT_FOUND)
Settings::self()->saveInhibitSuspend(inhibitSuspend->isChecked());
#endif
@@ -160,7 +161,7 @@
crossfadingLabel->setEnabled(c);
replayGainLabel->setEnabled(rgSupported);
replayGain->setEnabled(rgSupported);
- messageIcon->setPixmap(Icon(c ? "dialog-information" : "dialog-warning").pixmap(messageIcon->minimumSize()));
+ messageIcon->setPixmap(style()->standardIcon(c ? QStyle::SP_MessageBoxInformation : QStyle::SP_MessageBoxWarning).pixmap(messageIcon->minimumSize()));
if (c) {
messageLabel->setText(tr("Connected to %1
The entries below apply to the currently connected MPD collection.")
.arg(MPDConnection::self()->getDetails().description()));
diff -Nru cantata-2.3.0/gui/preferencesdialog.cpp cantata-2.3.1/gui/preferencesdialog.cpp
--- cantata-2.3.0/gui/preferencesdialog.cpp 2018-03-14 17:33:10.000000000 +0000
+++ cantata-2.3.1/gui/preferencesdialog.cpp 2018-05-16 05:14:53.000000000 +0000
@@ -41,6 +41,7 @@
#include "shortcutssettingspage.h"
#include "scrobbling/scrobblingsettings.h"
#include "apikeyssettings.h"
+#include "support/monoicon.h"
#include
#include
@@ -65,34 +66,32 @@
apiKeys = new ApiKeysSettings(this);
server->load();
playback->load();
- //cover->load();
interface->load();
context->load();
scrobbling->load();
custom->load();
- addPage(QLatin1String("collection"), server, tr("Collection"), Icon("audio-x-generic"), tr("Collection Settings"));
- addPage(QLatin1String("playback"), playback, tr("Playback"), Icons::self()->speakerIcon, tr("Playback Settings"));
- //addPage(QLatin1String("cover"), files, tr("Covers"), Icons::self()->filesIcon, tr("Album Cover Settings"));
- addPage(QLatin1String("interface"), interface, tr("Interface"), Icon("preferences-other"), tr("Interface Settings"));
- addPage(QLatin1String("info"), context, tr("Info"), Icons::self()->contextIcon, tr("Info View Settings"));
- addPage(QLatin1String("scrobbling"), scrobbling, tr("Scrobbling"), Icons::self()->lastFmIcon, tr("Scrobbling Settings"));
+ QColor iconColor = Utils::clampColor(palette().text().color());
+ addPage(QLatin1String("collection"), server, tr("Collection"), MonoIcon::icon(FontAwesome::music, iconColor), tr("Collection Settings"));
+ addPage(QLatin1String("playback"), playback, tr("Playback"), MonoIcon::icon(FontAwesome::volumeup, iconColor), tr("Playback Settings"));
+ addPage(QLatin1String("interface"), interface, tr("Interface"), MonoIcon::icon(FontAwesome::sliders, iconColor), tr("Interface Settings"));
+ addPage(QLatin1String("info"), context, tr("Info"), MonoIcon::icon(FontAwesome::infocircle, iconColor), tr("Info View Settings"));
+ addPage(QLatin1String("scrobbling"), scrobbling, tr("Scrobbling"), MonoIcon::icon(FontAwesome::lastfm, iconColor), tr("Scrobbling Settings"));
#if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
audiocd = new AudioCdSettings(0);
audiocd->load();
- addPage(QLatin1String("cd"), audiocd, tr("Audio CD"), Icons::self()->albumIcon(32), tr("Audio CD Settings"));
+ addPage(QLatin1String("cd"), audiocd, tr("Audio CD"), Icons::self()->albumMonoIcon, tr("Audio CD Settings"));
#endif
#ifdef ENABLE_PROXY_CONFIG
proxy = new ProxySettings(0);
proxy->load();
- addPage(QLatin1String("proxy"), proxy, tr("Proxy"), Icon("preferences-system-network"), tr("Proxy Settings"));
+ addPage(QLatin1String("proxy"), proxy, tr("Proxy"), MonoIcon::icon(FontAwesome::globe, iconColor), tr("Proxy Settings"));
#endif
shortcuts = new ShortcutsSettingsPage(nullptr);
- addPage(QLatin1String("shortcuts"), shortcuts, tr("Shortcuts"), Icon(QStringList() << "preferences-desktop-keyboard" << "keyboard"),
- tr("Keyboard Shortcut Settings"));
+ addPage(QLatin1String("shortcuts"), shortcuts, tr("Shortcuts"), MonoIcon::icon(FontAwesome::keyboardo, iconColor), tr("Keyboard Shortcut Settings"));
shortcuts->load();
- addPage(QLatin1String("cache"), cache, tr("Cache"), Icon(QStringList() << "folder-temp" << "folder"), tr("Cached Items"));
- addPage(QLatin1String("custom"), custom, tr("Custom Actions"), Icon(QStringList() << "fork" << "gtk-execute"), tr("Custom Actions"));
- addPage(QLatin1String("apikeys"), apiKeys, tr("Service Keys"), Icon("key"), tr("Service API Keys"));
+ addPage(QLatin1String("cache"), cache, tr("Cache"), MonoIcon::icon(FontAwesome::foldero, iconColor), tr("Cached Items"));
+ addPage(QLatin1String("custom"), custom, tr("Custom Actions"), MonoIcon::icon(FontAwesome::rocket, iconColor), tr("Custom Actions"));
+ addPage(QLatin1String("apikeys"), apiKeys, tr("Service Keys"), MonoIcon::icon(FontAwesome::key, iconColor), tr("Service API Keys"));
#ifdef Q_OS_MAC
setCaption(tr("Cantata Preferences"));
setMinimumWidth(800);
diff -Nru cantata-2.3.0/gui/serversettings.cpp cantata-2.3.1/gui/serversettings.cpp
--- cantata-2.3.0/gui/serversettings.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/gui/serversettings.cpp 2018-05-30 21:04:41.000000000 +0000
@@ -46,9 +46,6 @@
w->deleteLater(); \
w=0;
-
-
-#ifdef ENABLE_SIMPLE_MPD_SUPPORT
class CollectionNameValidator : public QValidator
{
public:
@@ -57,10 +54,17 @@
State validate(QString &input, int &) const override
{
- return input.startsWith(MPDUser::constName) ? Invalid : Acceptable;
+ #ifdef ENABLE_SIMPLE_MPD_SUPPORT
+ if (input.startsWith(MPDUser::constName)) {
+ return Invalid;
+ }
+ #endif
+ if (-1!=input.indexOf("/") || -1!=input.indexOf("\\") || -1!=input.indexOf("*") || -1!=input.indexOf("?")) {
+ return Invalid;
+ }
+ return Acceptable;
}
};
-#endif
ServerSettings::ServerSettings(QWidget *p)
: QWidget(p)
@@ -94,9 +98,7 @@
hostLabel->setText(tr("Host:"));
#endif
- #ifdef ENABLE_SIMPLE_MPD_SUPPORT
name->setValidator(new CollectionNameValidator(this));
- #endif
#ifndef ENABLE_HTTP_STREAM_PLAYBACK
REMOVE(streamUrlLabel)
REMOVE(streamUrl)
@@ -281,8 +283,7 @@
details.port=6600;
details.hostname=QLatin1String("localhost");
details.dir=QLatin1String("/var/lib/mpd/music/");
- // disable local streaming by default
- details.allowLocalStreaming=false;
+ details.allowLocalStreaming=true;
details.autoUpdate=false;
combo->addItem(details.name);
#ifdef ENABLE_SIMPLE_MPD_SUPPORT
@@ -421,9 +422,9 @@
details.streamUrl=streamUrl->text().trimmed();
#endif
#ifdef ENABLE_HTTP_SERVER
- details.allowLocalStreaming=allowLocalStreaming->checkState() == Qt::Checked;
+ details.allowLocalStreaming=allowLocalStreaming->isChecked();
#endif
- details.autoUpdate=autoUpdate->checkState() == Qt::Checked;
+ details.autoUpdate=autoUpdate->isChecked();
}
#ifdef ENABLE_SIMPLE_MPD_SUPPORT
else {
diff -Nru cantata-2.3.0/gui/trayitem.cpp cantata-2.3.1/gui/trayitem.cpp
--- cantata-2.3.0/gui/trayitem.cpp 2018-04-07 14:21:44.000000000 +0000
+++ cantata-2.3.1/gui/trayitem.cpp 2018-05-23 18:23:28.000000000 +0000
@@ -162,8 +162,10 @@
trayItemMenu->addSeparator();
trayItemMenu->addAction(copyAction(mw->quitAction));
trayItem->setContextMenu(trayItemMenu);
- QIcon icon=QIcon::fromTheme(QIcon::hasThemeIcon("cantata-panel") ? "cantata-panel" : "cantata");
- #if !defined Q_OS_MAC && !defined Q_OS_WIN
+ #if defined Q_OS_MAC || defined Q_OS_WIN
+ QIcon icon=QIcon::fromTheme("cantata");
+ #else
+ QIcon icon=QIcon::fromTheme(Utils::Gnome==Utils::currentDe() ? "cantata-symbolic" : "cantata");
// Bug: 660 If installed to non-standard folder, QIcon::fromTheme does not seem to find icon. Therefore
// add icon files here...
if (icon.isNull()) {
diff -Nru cantata-2.3.0/gui/trayitem.h cantata-2.3.1/gui/trayitem.h
--- cantata-2.3.0/gui/trayitem.h 2018-01-09 19:22:33.000000000 +0000
+++ cantata-2.3.1/gui/trayitem.h 2018-05-14 16:36:05.000000000 +0000
@@ -45,7 +45,7 @@
TrayItem(MainWindow *p);
~TrayItem() override { }
- void showMessage(const QString &title, const QString &text, const QImage &img);
+ void showMessage(const QString &title, const QString &text, const QImage &img=QImage());
void setup();
#ifdef Q_OS_MAC
bool isActive() const { return false; }
diff -Nru cantata-2.3.0/http/httpserver.cpp cantata-2.3.1/http/httpserver.cpp
--- cantata-2.3.0/http/httpserver.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/http/httpserver.cpp 2018-05-28 21:00:45.000000000 +0000
@@ -74,7 +74,7 @@
bool HttpServer::isAlive() const
{
// started on demand, but only start if allowed
- return Settings::self()->connectionDetails().allowLocalStreaming;
+ return MPDConnection::self()->getDetails().allowLocalStreaming;
}
bool HttpServer::start()
@@ -169,7 +169,13 @@
url.setScheme("http");
url.setHost(currentIfaceIp);
url.setPort(socket->serverPort());
+ #ifdef Q_OS_WIN
+ // Use a query item, as s.file might have a driver specifier
+ query.addQueryItem("file", s.file);
+ url.setPath("/"+Utils::getFile(s.file));
+ #else
url.setPath(s.file);
+ #endif
if (!s.album.isEmpty()) {
query.addQueryItem("album", s.album);
}
@@ -285,11 +291,12 @@
if (q.hasQueryItem("onlineservice")) {
s.setIsFromOnlineService(q.queryItemValue("onlineservice"));
}
- s.file=url.path();
- s.type=Song::CantataStream;
#ifdef Q_OS_WIN
- s.file=fixWindowsPath(s.file);
+ s.file=fixWindowsPath(q.queryItemValue("file"));
+ #else
+ s.file=url.path();
#endif
+ s.type=Song::CantataStream;
#if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
if (s.file.startsWith(Song::constCddaProtocol)) {
s.type=Song::Cdda;
diff -Nru cantata-2.3.0/icons/CMakeLists.txt cantata-2.3.1/icons/CMakeLists.txt
--- cantata-2.3.0/icons/CMakeLists.txt 2018-04-10 17:41:46.000000000 +0000
+++ cantata-2.3.1/icons/CMakeLists.txt 2018-05-22 08:46:05.000000000 +0000
@@ -1,62 +1,39 @@
-if (NOT HAIKU)
- if (NOT WIN32 AND NOT APPLE)
- macro (update_iconcache ICON_THEME)
- # Update mtime of hicolor icon theme dir.
- # We don't always have touch command (e.g. on Windows), so instead create
- # and delete a temporary file in the theme dir.
- install(CODE "
- set(DESTDIR_VALUE \"\$ENV{DESTDIR}\")
- if (NOT DESTDIR_VALUE)
- file(WRITE \"${CMAKE_INSTALL_PREFIX}/share/icons/${ICON_THEME}/temp.txt\" \"update\")
- file(REMOVE \"${CMAKE_INSTALL_PREFIX}/share/icons/${ICON_THEME}/temp.txt\")
- endif (NOT DESTDIR_VALUE)
- ")
- endmacro (update_iconcache)
- endif (NOT WIN32 AND NOT APPLE)
-
- if (WIN32 OR APPLE)
- install(FILES cantata.svg DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/svg)
- foreach (SIZE 16 22 32 48 64 128 256 512)
- install(FILES cantata${SIZE}.png DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/${SIZE} RENAME cantata.png)
- endforeach()
- else (WIN32 OR APPLE)
- install(FILES cantata.svg DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/scalable/apps)
- install(FILES cantata-symbolic.svg DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/scalable/apps)
- foreach (SIZE 16 22 24 32 48 64 128 256 512)
- install(FILES cantata${SIZE}.png DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/${SIZE}x${SIZE}/apps RENAME cantata.png)
- endforeach()
- endif (WIN32 OR APPLE)
-
- if (NOT WIN32 AND NOT APPLE)
- update_iconcache(hicolor)
-
- if (EXISTS /etc/lsb-release)
- file(READ "/etc/lsb-release" LSB_RELEASE_CONTENTS)
- string(REGEX MATCH "DISTRIB_ID=Ubuntu" IS_UBUNTU ${LSB_RELEASE_CONTENTS})
- if (IS_UBUNTU)
- set(INSTALL_UBUNTU_ICONS_DEFAULT ON)
- else(IS_UBUNTU)
- set(INSTALL_UBUNTU_ICONS_DEFAULT OFF)
- endif(IS_UBUNTU)
- else(EXISTS /etc/lsb-release)
- set(INSTALL_UBUNTU_ICONS_DEFAULT OFF)
- endif(EXISTS /etc/lsb-release)
- option(INSTALL_UBUNTU_ICONS "Install the Ubuntu themed monochrome panel icons" ${INSTALL_UBUNTU_ICONS_DEFAULT})
-
- if (INSTALL_UBUNTU_ICONS)
- install(FILES trayicon-mono-dark.svg DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/ubuntu-mono-light/apps/22 RENAME cantata-panel.svg)
- install(FILES trayicon-mono-light.svg DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/ubuntu-mono-dark/apps/22 RENAME cantata-panel.svg)
- update_iconcache(ubuntu-mono-light)
- update_iconcache(ubuntu-mono-dark)
- add_subdirectory(suru)
- update_iconcache(Suru)
- endif (INSTALL_UBUNTU_ICONS)
-
- endif (NOT WIN32 AND NOT APPLE)
-
- add_subdirectory(theme)
+if (NOT HAIKU AND NOT WIN32 AND NOT APPLE)
+ macro (update_iconcache ICON_THEME)
+ # Update mtime of hicolor icon theme dir.
+ # We don't always have touch command (e.g. on Windows), so instead create
+ # and delete a temporary file in the theme dir.
+ install(CODE "
+ set(DESTDIR_VALUE \"\$ENV{DESTDIR}\")
+ if (NOT DESTDIR_VALUE)
+ file(WRITE \"${CMAKE_INSTALL_PREFIX}/share/icons/${ICON_THEME}/temp.txt\" \"update\")
+ file(REMOVE \"${CMAKE_INSTALL_PREFIX}/share/icons/${ICON_THEME}/temp.txt\")
+ endif (NOT DESTDIR_VALUE)
+ ")
+ endmacro (update_iconcache)
- #if (APPLE)
- # install(FILES trayicon-mono-dark.svg DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/scalable/apps RENAME cantata-panel.svg)
- #endif (APPLE)
-endif (NOT HAIKU)
+ install(FILES cantata.svg DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/scalable/apps)
+ install(FILES cantata-symbolic.svg DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/symbolic/apps)
+ foreach (SIZE 16 22 24 32 48 64 128 256 512)
+ install(FILES cantata${SIZE}.png DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/${SIZE}x${SIZE}/apps RENAME cantata.png)
+ endforeach()
+ update_iconcache(hicolor)
+
+ if (EXISTS /etc/lsb-release)
+ file(READ "/etc/lsb-release" LSB_RELEASE_CONTENTS)
+ string(REGEX MATCH "DISTRIB_ID=Ubuntu" IS_UBUNTU ${LSB_RELEASE_CONTENTS})
+ if (IS_UBUNTU)
+ set(INSTALL_UBUNTU_ICONS_DEFAULT ON)
+ else(IS_UBUNTU)
+ set(INSTALL_UBUNTU_ICONS_DEFAULT OFF)
+ endif(IS_UBUNTU)
+ else(EXISTS /etc/lsb-release)
+ set(INSTALL_UBUNTU_ICONS_DEFAULT OFF)
+ endif(EXISTS /etc/lsb-release)
+ option(INSTALL_UBUNTU_ICONS "Install the Ubuntu Suru icons" ${INSTALL_UBUNTU_ICONS_DEFAULT})
+
+ if (INSTALL_UBUNTU_ICONS)
+ add_subdirectory(suru)
+ update_iconcache(Suru)
+ endif ()
+endif ()
diff -Nru cantata-2.3.0/icons/dice.svg cantata-2.3.1/icons/dice.svg
--- cantata-2.3.0/icons/dice.svg 2017-07-03 19:12:24.000000000 +0000
+++ cantata-2.3.1/icons/dice.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/gradcap.svg cantata-2.3.1/icons/gradcap.svg
--- cantata-2.3.0/icons/gradcap.svg 2017-08-18 17:54:50.000000000 +0000
+++ cantata-2.3.1/icons/gradcap.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,13 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/hdd.svg cantata-2.3.1/icons/hdd.svg
--- cantata-2.3.0/icons/hdd.svg 2018-02-07 21:59:25.000000000 +0000
+++ cantata-2.3.1/icons/hdd.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,26 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/home.svg cantata-2.3.1/icons/home.svg
--- cantata-2.3.0/icons/home.svg 2018-02-07 21:59:25.000000000 +0000
+++ cantata-2.3.1/icons/home.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,19 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/mpd.svg cantata-2.3.1/icons/mpd.svg
--- cantata-2.3.0/icons/mpd.svg 2018-02-07 21:59:25.000000000 +0000
+++ cantata-2.3.1/icons/mpd.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,42 +0,0 @@
-
-
-
diff -Nru cantata-2.3.0/icons/playlist.svg cantata-2.3.1/icons/playlist.svg
--- cantata-2.3.0/icons/playlist.svg 2017-07-03 21:40:35.000000000 +0000
+++ cantata-2.3.1/icons/playlist.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/radio.svg cantata-2.3.1/icons/radio.svg
--- cantata-2.3.0/icons/radio.svg 2017-07-03 21:50:35.000000000 +0000
+++ cantata-2.3.1/icons/radio.svg 2018-05-23 18:52:06.000000000 +0000
@@ -1,5 +1,5 @@
Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-16x16@2x.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-16x16@2x.png differ
Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-16x16.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-16x16.png differ
Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-24x24@2x.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-24x24@2x.png differ
Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-24x24.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-24x24.png differ
Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-256x256@2x.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-256x256@2x.png differ
Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-256x256.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-256x256.png differ
Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-32x32@2x.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-32x32@2x.png differ
Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-32x32.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-32x32.png differ
Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-48x48@2x.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-48x48@2x.png differ
Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-48x48.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-48x48.png differ
diff -Nru cantata-2.3.0/icons/suru/cantata.svg cantata-2.3.1/icons/suru/cantata.svg
--- cantata-2.3.0/icons/suru/cantata.svg 2018-04-10 17:31:08.000000000 +0000
+++ cantata-2.3.1/icons/suru/cantata.svg 2018-05-03 16:01:25.000000000 +0000
@@ -16,7 +16,7 @@
height="300"
id="svg11300"
sodipodi:version="0.32"
- inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="cantata.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.0"
@@ -33,21 +33,21 @@
borderopacity="0.25490196"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
- inkscape:zoom="1.69"
- inkscape:cx="326.30783"
- inkscape:cy="69.493302"
- inkscape:current-layer="layer2"
+ inkscape:zoom="4.64"
+ inkscape:cx="303.34484"
+ inkscape:cy="139.38382"
+ inkscape:current-layer="layer6"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:showpageshadow="false"
- inkscape:window-width="1853"
- inkscape:window-height="1015"
- inkscape:window-x="67"
+ inkscape:window-width="1850"
+ inkscape:window-height="1053"
+ inkscape:window-x="70"
inkscape:window-y="27"
width="400px"
height="300px"
- inkscape:snap-nodes="false"
+ inkscape:snap-nodes="true"
inkscape:snap-bbox="true"
gridtolerance="10000"
inkscape:object-nodes="true"
@@ -55,15 +55,14 @@
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-maximized="1"
- inkscape:bbox-paths="false"
- inkscape:snap-bbox-midpoints="false"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox-midpoints="true"
inkscape:snap-global="true"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:snap-smooth-nodes="true"
inkscape:pagecheckerboard="false"
- showborder="false"
- inkscape:bbox-nodes="true">
+ showborder="false">
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+ id="feGaussianBlur955" />
apps
cantata
+ x="146.48828"
+ y="-8.2548828"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18px;line-height:1.25;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans Bold'">cantata
-
+ style="display:inline">
+
+
+ style="opacity:1;fill:url(#linearGradient975);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ style="opacity:1;fill:#d3d3d3;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+
+
+
+
+
+ transform="matrix(1.6795267,0,0,1.6795267,-216.66948,-49.22028)">
+ transform="matrix(0.31019247,0,0,0.31019247,219.92569,52.357051)">
+ transform="matrix(0.19999191,0,0,0.19999191,255.35237,125.75238)">
+ transform="matrix(0.48357041,0,0,0.46726211,180.20486,92.128333)">
-
-
diff -Nru cantata-2.3.0/icons/suru/CMakeLists.txt cantata-2.3.1/icons/suru/CMakeLists.txt
--- cantata-2.3.0/icons/suru/CMakeLists.txt 2018-04-10 17:46:21.000000000 +0000
+++ cantata-2.3.1/icons/suru/CMakeLists.txt 2018-05-23 21:57:58.000000000 +0000
@@ -1,6 +1,6 @@
set(CANTATA_SURU_ICON_INSTALL_PREFIX ${SHARE_INSTALL_PREFIX}/icons/Suru)
-
install(FILES ../cantata-symbolic.svg DESTINATION ${CANTATA_SURU_ICON_INSTALL_PREFIX}/scalable/apps)
+
foreach (SIZE 16 24 32 48 256)
foreach (DPI "" @2x)
install(FILES cantata-${SIZE}x${SIZE}${DPI}.png DESTINATION ${CANTATA_SURU_ICON_INSTALL_PREFIX}/${SIZE}x${SIZE}${DPI}/apps RENAME cantata.png)
diff -Nru cantata-2.3.0/icons/theme/AUTHORS cantata-2.3.1/icons/theme/AUTHORS
--- cantata-2.3.0/icons/theme/AUTHORS 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/AUTHORS 1970-01-01 00:00:00.000000000 +0000
@@ -1,13 +0,0 @@
-svg64/dialog-*.svg are from breeze
-
---------------------------------------------------------------------
-
-playlist.svg and dynamic-playlist.svg are created using papirus
-mimetype background
-
------------------------- ICON THEME PAPIRUS ------------------------
-SOURCES:
-Sam Hewitt - author icon theme Paper (https://github.com/snwh/paper-icon-theme)
-
-CUSTOMIZER:
-Alexey Varfolomeev - Papirus Pack KDE (https://github.com/varlesh/papirus-pack-kde)
diff -Nru cantata-2.3.0/icons/theme/CMakeLists.txt cantata-2.3.1/icons/theme/CMakeLists.txt
--- cantata-2.3.0/icons/theme/CMakeLists.txt 2018-03-13 19:52:17.000000000 +0000
+++ cantata-2.3.1/icons/theme/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
@@ -1,45 +0,0 @@
-set(ICON_FILES
-svg/audio-x-generic.svg
-svg/information.svg
-svg/folder-temp.svg
-svg/fork.svg
-svg/inode-directory.svg
-svg/network-server-database.svg
-svg/preferences-desktop-keyboard.svg
-svg/preferences-other.svg
-svg/speaker.svg
-svg/key.svg
-svg64/dialog-error.svg
-svg64/dialog-information.svg
-svg64/dialog-question.svg
-svg64/dialog-warning.svg
-)
-
-if (ENABLE_PROXY_CONFIG)
- set(ICON_FILES svg/preferences-system-network.svg ${ICON_FILES})
-endif (ENABLE_PROXY_CONFIG)
-
-if (ENABLE_DEVICES_SUPPORT)
- set(ICON_FILES svg/drive-removable-media-usb-pendrive.svg svg/multimedia-player.svg ${ICON_FILES})
- if (ENABLE_REMOTE_DEVICES)
- set(ICON_FILES svg/folder-network.svg svg/folder-samba.svg ${ICON_FILES})
- endif (ENABLE_REMOTE_DEVICES)
-endif (ENABLE_DEVICES_SUPPORT)
-
-if (WIN32 OR APPLE)
- set(CANTATA_ICON_THEME_PATH ${CANTATA_ICON_INSTALL_PREFIX})
-else (WIN32 OR APPLE)
- set(CANTATA_ICON_THEME_PATH ${SHARE_INSTALL_PREFIX}/${CMAKE_PROJECT_NAME}/icons/cantata)
-endif (WIN32 OR APPLE)
-
-foreach(ICON ${ICON_FILES})
- get_filename_component(ICON_PATH ${ICON} PATH)
- install(FILES ${ICON} DESTINATION ${CANTATA_ICON_THEME_PATH}/${ICON_PATH})
-endforeach(ICON ${ICON_FILES})
-install(FILES AUTHORS index.theme LICENSE DESTINATION ${CANTATA_ICON_THEME_PATH})
-
-install(FILES ../cantata128.png DESTINATION ${CANTATA_ICON_THEME_PATH}/128 RENAME cantata.png)
-if (NOT WIN32 AND NOT APPLE)
- install(FILES ../cantata.svg DESTINATION ${CANTATA_ICON_THEME_PATH}/svg)
-endif (NOT WIN32 AND NOT APPLE)
-
diff -Nru cantata-2.3.0/icons/theme/index.theme cantata-2.3.1/icons/theme/index.theme
--- cantata-2.3.0/icons/theme/index.theme 2018-02-13 22:10:53.000000000 +0000
+++ cantata-2.3.1/icons/theme/index.theme 1970-01-01 00:00:00.000000000 +0000
@@ -1,23 +0,0 @@
-[Icon Theme]
-Name=Cantata
-Comment=Icons taken from Papirus theme.
-Inherits=breeze,oxygen,hicolor
-Directories=svg,svg64,128
-
-[128]
-Context=Applications
-Size=128
-Type=Fixed
-
-[svg]
-Size=48
-MinSize=8
-MaxSize=512
-Type=Scalable
-
-[svg64]
-Size=64
-MinSize=8
-MaxSize=512
-Type=Scalable
-
diff -Nru cantata-2.3.0/icons/theme/LICENSE cantata-2.3.1/icons/theme/LICENSE
--- cantata-2.3.0/icons/theme/LICENSE 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/LICENSE 1970-01-01 00:00:00.000000000 +0000
@@ -1,425 +0,0 @@
-Creative Commons Attribution-ShareAlike 4.0 International
-
-=======================================================================
-
-Creative Commons Corporation ("Creative Commons") is not a law firm and
-does not provide legal services or legal advice. Distribution of
-Creative Commons public licenses does not create a lawyer-client or
-other relationship. Creative Commons makes its licenses and related
-information available on an "as-is" basis. Creative Commons gives no
-warranties regarding its licenses, any material licensed under their
-terms and conditions, or any related information. Creative Commons
-disclaims all liability for damages resulting from their use to the
-fullest extent possible.
-
-Using Creative Commons Public Licenses
-
-Creative Commons public licenses provide a standard set of terms and
-conditions that creators and other rights holders may use to share
-original works of authorship and other material subject to copyright
-and certain other rights specified in the public license below. The
-following considerations are for informational purposes only, are not
-exhaustive, and do not form part of our licenses.
-
- Considerations for licensors: Our public licenses are
- intended for use by those authorized to give the public
- permission to use material in ways otherwise restricted by
- copyright and certain other rights. Our licenses are
- irrevocable. Licensors should read and understand the terms
- and conditions of the license they choose before applying it.
- Licensors should also secure all rights necessary before
- applying our licenses so that the public can reuse the
- material as expected. Licensors should clearly mark any
- material not subject to the license. This includes other CC-
- licensed material, or material used under an exception or
- limitation to copyright. More considerations for licensors:
- wiki.creativecommons.org/Considerations_for_licensors
-
- Considerations for the public: By using one of our public
- licenses, a licensor grants the public permission to use the
- licensed material under specified terms and conditions. If
- the licensor's permission is not necessary for any reason--for
- example, because of any applicable exception or limitation to
- copyright--then that use is not regulated by the license. Our
- licenses grant only permissions under copyright and certain
- other rights that a licensor has authority to grant. Use of
- the licensed material may still be restricted for other
- reasons, including because others have copyright or other
- rights in the material. A licensor may make special requests,
- such as asking that all changes be marked or described.
- Although not required by our licenses, you are encouraged to
- respect those requests where reasonable. More_considerations
- for the public:
- wiki.creativecommons.org/Considerations_for_licensees
-
-=======================================================================
-
-Creative Commons Attribution-ShareAlike 4.0 International Public
-License
-
-By exercising the Licensed Rights (defined below), You accept and agree
-to be bound by the terms and conditions of this Creative Commons
-Attribution-ShareAlike 4.0 International Public License ("Public
-License"). To the extent this Public License may be interpreted as a
-contract, You are granted the Licensed Rights in consideration of Your
-acceptance of these terms and conditions, and the Licensor grants You
-such rights in consideration of benefits the Licensor receives from
-making the Licensed Paper available under these terms and
-conditions.
-
-
-Section 1 -- Definitions.
-
- a. Adapted Paper means material subject to Copyright and Similar
- Rights that is derived from or based upon the Licensed Paper
- and in which the Licensed Paper is translated, altered,
- arranged, transformed, or otherwise modified in a manner requiring
- permission under the Copyright and Similar Rights held by the
- Licensor. For purposes of this Public License, where the Licensed
- Paper is a musical work, performance, or sound recording,
- Adapted Paper is always produced where the Licensed Paper is
- synched in timed relation with a moving image.
-
- b. Adapter's License means the license You apply to Your Copyright
- and Similar Rights in Your contributions to Adapted Paper in
- accordance with the terms and conditions of this Public License.
-
- c. BY-SA Compatible License means a license listed at
- creativecommons.org/compatiblelicenses, approved by Creative
- Commons as essentially the equivalent of this Public License.
-
- d. Copyright and Similar Rights means copyright and/or similar rights
- closely related to copyright including, without limitation,
- performance, broadcast, sound recording, and Sui Generis Database
- Rights, without regard to how the rights are labeled or
- categorized. For purposes of this Public License, the rights
- specified in Section 2(b)(1)-(2) are not Copyright and Similar
- Rights.
-
- e. Effective Technological Measures means those measures that, in the
- absence of proper authority, may not be circumvented under laws
- fulfilling obligations under Article 11 of the WIPO Copyright
- Treaty adopted on December 20, 1996, and/or similar international
- agreements.
-
- f. Exceptions and Limitations means fair use, fair dealing, and/or
- any other exception or limitation to Copyright and Similar Rights
- that applies to Your use of the Licensed Paper.
-
- g. License Elements means the license attributes listed in the name
- of a Creative Commons Public License. The License Elements of this
- Public License are Attribution and ShareAlike.
-
- h. Licensed Paper means the artistic or literary work, database,
- or other material to which the Licensor applied this Public
- License.
-
- i. Licensed Rights means the rights granted to You subject to the
- terms and conditions of this Public License, which are limited to
- all Copyright and Similar Rights that apply to Your use of the
- Licensed Paper and that the Licensor has authority to license.
-
- j. Licensor means the individual(s) or entity(ies) granting rights
- under this Public License.
-
- k. Share means to provide material to the public by any means or
- process that requires permission under the Licensed Rights, such
- as reproduction, public display, public performance, distribution,
- dissemination, communication, or importation, and to make material
- available to the public including in ways that members of the
- public may access the material from a place and at a time
- individually chosen by them.
-
- l. Sui Generis Database Rights means rights other than copyright
- resulting from Directive 96/9/EC of the European Parliament and of
- the Council of 11 March 1996 on the legal protection of databases,
- as amended and/or succeeded, as well as other essentially
- equivalent rights anywhere in the world.
-
- m. You means the individual or entity exercising the Licensed Rights
- under this Public License. Your has a corresponding meaning.
-
-
-Section 2 -- Scope.
-
- a. License grant.
-
- 1. Subject to the terms and conditions of this Public License,
- the Licensor hereby grants You a worldwide, royalty-free,
- non-sublicensable, non-exclusive, irrevocable license to
- exercise the Licensed Rights in the Licensed Paper to:
-
- a. reproduce and Share the Licensed Paper, in whole or
- in part; and
-
- b. produce, reproduce, and Share Adapted Paper.
-
- 2. Exceptions and Limitations. For the avoidance of doubt, where
- Exceptions and Limitations apply to Your use, this Public
- License does not apply, and You do not need to comply with
- its terms and conditions.
-
- 3. Term. The term of this Public License is specified in Section
- 6(a).
-
- 4. Media and formats; technical modifications allowed. The
- Licensor authorizes You to exercise the Licensed Rights in
- all media and formats whether now known or hereafter created,
- and to make technical modifications necessary to do so. The
- Licensor waives and/or agrees not to assert any right or
- authority to forbid You from making technical modifications
- necessary to exercise the Licensed Rights, including
- technical modifications necessary to circumvent Effective
- Technological Measures. For purposes of this Public License,
- simply making modifications authorized by this Section 2(a)
- (4) never produces Adapted Paper.
-
- 5. Downstream recipients.
-
- a. Offer from the Licensor -- Licensed Paper. Every
- recipient of the Licensed Paper automatically
- receives an offer from the Licensor to exercise the
- Licensed Rights under the terms and conditions of this
- Public License.
-
- b. Additional offer from the Licensor -- Adapted Paper.
- Every recipient of Adapted Paper from You
- automatically receives an offer from the Licensor to
- exercise the Licensed Rights in the Adapted Paper
- under the conditions of the Adapter's License You apply.
-
- c. No downstream restrictions. You may not offer or impose
- any additional or different terms or conditions on, or
- apply any Effective Technological Measures to, the
- Licensed Paper if doing so restricts exercise of the
- Licensed Rights by any recipient of the Licensed
- Paper.
-
- 6. No endorsement. Nothing in this Public License constitutes or
- may be construed as permission to assert or imply that You
- are, or that Your use of the Licensed Paper is, connected
- with, or sponsored, endorsed, or granted official status by,
- the Licensor or others designated to receive attribution as
- provided in Section 3(a)(1)(A)(i).
-
- b. Other rights.
-
- 1. Moral rights, such as the right of integrity, are not
- licensed under this Public License, nor are publicity,
- privacy, and/or other similar personality rights; however, to
- the extent possible, the Licensor waives and/or agrees not to
- assert any such rights held by the Licensor to the limited
- extent necessary to allow You to exercise the Licensed
- Rights, but not otherwise.
-
- 2. Patent and trademark rights are not licensed under this
- Public License.
-
- 3. To the extent possible, the Licensor waives any right to
- collect royalties from You for the exercise of the Licensed
- Rights, whether directly or through a collecting society
- under any voluntary or waivable statutory or compulsory
- licensing scheme. In all other cases the Licensor expressly
- reserves any right to collect such royalties.
-
-
-Section 3 -- License Conditions.
-
-Your exercise of the Licensed Rights is expressly made subject to the
-following conditions.
-
- a. Attribution.
-
- 1. If You Share the Licensed Paper (including in modified
- form), You must:
-
- a. retain the following if it is supplied by the Licensor
- with the Licensed Paper:
-
- i. identification of the creator(s) of the Licensed
- Paper and any others designated to receive
- attribution, in any reasonable manner requested by
- the Licensor (including by pseudonym if
- designated);
-
- ii. a copyright notice;
-
- iii. a notice that refers to this Public License;
-
- iv. a notice that refers to the disclaimer of
- warranties;
-
- v. a URI or hyperlink to the Licensed Paper to the
- extent reasonably practicable;
-
- b. indicate if You modified the Licensed Paper and
- retain an indication of any previous modifications; and
-
- c. indicate the Licensed Paper is licensed under this
- Public License, and include the text of, or the URI or
- hyperlink to, this Public License.
-
- 2. You may satisfy the conditions in Section 3(a)(1) in any
- reasonable manner based on the medium, means, and context in
- which You Share the Licensed Paper. For example, it may be
- reasonable to satisfy the conditions by providing a URI or
- hyperlink to a resource that includes the required
- information.
-
- 3. If requested by the Licensor, You must remove any of the
- information required by Section 3(a)(1)(A) to the extent
- reasonably practicable.
-
- b. ShareAlike.
-
- In addition to the conditions in Section 3(a), if You Share
- Adapted Paper You produce, the following conditions also apply.
-
- 1. The Adapter's License You apply must be a Creative Commons
- license with the same License Elements, this version or
- later, or a BY-SA Compatible License.
-
- 2. You must include the text of, or the URI or hyperlink to, the
- Adapter's License You apply. You may satisfy this condition
- in any reasonable manner based on the medium, means, and
- context in which You Share Adapted Paper.
-
- 3. You may not offer or impose any additional or different terms
- or conditions on, or apply any Effective Technological
- Measures to, Adapted Paper that restrict exercise of the
- rights granted under the Adapter's License You apply.
-
-
-Section 4 -- Sui Generis Database Rights.
-
-Where the Licensed Rights include Sui Generis Database Rights that
-apply to Your use of the Licensed Paper:
-
- a. for the avoidance of doubt, Section 2(a)(1) grants You the right
- to extract, reuse, reproduce, and Share all or a substantial
- portion of the contents of the database;
-
- b. if You include all or a substantial portion of the database
- contents in a database in which You have Sui Generis Database
- Rights, then the database in which You have Sui Generis Database
- Rights (but not its individual contents) is Adapted Paper,
-
- including for purposes of Section 3(b); and
- c. You must comply with the conditions in Section 3(a) if You Share
- all or a substantial portion of the contents of the database.
-
-For the avoidance of doubt, this Section 4 supplements and does not
-replace Your obligations under this Public License where the Licensed
-Rights include other Copyright and Similar Rights.
-
-
-Section 5 -- Disclaimer of Warranties and Limitation of Liability.
-
- a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
- EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
- AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
- ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
- IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
- WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
- PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
- ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
- KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
- ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
-
- b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
- TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
- NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
- INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
- COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
- USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
- ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
- DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
- IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
-
- c. The disclaimer of warranties and limitation of liability provided
- above shall be interpreted in a manner that, to the extent
- possible, most closely approximates an absolute disclaimer and
- waiver of all liability.
-
-
-Section 6 -- Term and Termination.
-
- a. This Public License applies for the term of the Copyright and
- Similar Rights licensed here. However, if You fail to comply with
- this Public License, then Your rights under this Public License
- terminate automatically.
-
- b. Where Your right to use the Licensed Paper has terminated under
- Section 6(a), it reinstates:
-
- 1. automatically as of the date the violation is cured, provided
- it is cured within 30 days of Your discovery of the
- violation; or
-
- 2. upon express reinstatement by the Licensor.
-
- For the avoidance of doubt, this Section 6(b) does not affect any
- right the Licensor may have to seek remedies for Your violations
- of this Public License.
-
- c. For the avoidance of doubt, the Licensor may also offer the
- Licensed Paper under separate terms or conditions or stop
- distributing the Licensed Paper at any time; however, doing so
- will not terminate this Public License.
-
- d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
- License.
-
-
-Section 7 -- Other Terms and Conditions.
-
- a. The Licensor shall not be bound by any additional or different
- terms or conditions communicated by You unless expressly agreed.
-
- b. Any arrangements, understandings, or agreements regarding the
- Licensed Paper not stated herein are separate from and
- independent of the terms and conditions of this Public License.
-
-
-Section 8 -- Interpretation.
-
- a. For the avoidance of doubt, this Public License does not, and
- shall not be interpreted to, reduce, limit, restrict, or impose
- conditions on any use of the Licensed Paper that could lawfully
- be made without permission under this Public License.
-
- b. To the extent possible, if any provision of this Public License is
- deemed unenforceable, it shall be automatically reformed to the
- minimum extent necessary to make it enforceable. If the provision
- cannot be reformed, it shall be severed from this Public License
- without affecting the enforceability of the remaining terms and
- conditions.
-
- c. No term or condition of this Public License will be waived and no
- failure to comply consented to unless expressly agreed to by the
- Licensor.
-
- d. Nothing in this Public License constitutes or may be interpreted
- as a limitation upon, or waiver of, any privileges and immunities
- that apply to the Licensor or You, including from the legal
- processes of any jurisdiction or authority.
-
-
-=======================================================================
-
-Creative Commons is not a party to its public licenses.
-Notwithstanding, Creative Commons may elect to apply one of its public
-licenses to material it publishes and in those instances will be
-considered the "Licensor." Except for the limited purpose of indicating
-that material is shared under a Creative Commons public license or as
-otherwise permitted by the Creative Commons policies published at
-creativecommons.org/policies, Creative Commons does not authorize the
-use of the trademark "Creative Commons" or any other trademark or logo
-of Creative Commons without its prior written consent including,
-without limitation, in connection with any unauthorized modifications
-to any of its public licenses or any other arrangements,
-understandings, or agreements concerning use of licensed material. For
-the avoidance of doubt, this paragraph does not form part of the public
-licenses.
-
-Creative Commons may be contacted at creativecommons.org.
\ No newline at end of file
diff -Nru cantata-2.3.0/icons/theme/svg/audio-x-generic.svg cantata-2.3.1/icons/theme/svg/audio-x-generic.svg
--- cantata-2.3.0/icons/theme/svg/audio-x-generic.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg/audio-x-generic.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,9 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg/drive-removable-media-usb-pendrive.svg cantata-2.3.1/icons/theme/svg/drive-removable-media-usb-pendrive.svg
--- cantata-2.3.0/icons/theme/svg/drive-removable-media-usb-pendrive.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg/drive-removable-media-usb-pendrive.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,10 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg/folder-network.svg cantata-2.3.1/icons/theme/svg/folder-network.svg
--- cantata-2.3.0/icons/theme/svg/folder-network.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg/folder-network.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,118 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg/folder-samba.svg cantata-2.3.1/icons/theme/svg/folder-samba.svg
--- cantata-2.3.0/icons/theme/svg/folder-samba.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg/folder-samba.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,138 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg/folder-temp.svg cantata-2.3.1/icons/theme/svg/folder-temp.svg
--- cantata-2.3.0/icons/theme/svg/folder-temp.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg/folder-temp.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,13 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg/fork.svg cantata-2.3.1/icons/theme/svg/fork.svg
--- cantata-2.3.0/icons/theme/svg/fork.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg/fork.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,18 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg/information.svg cantata-2.3.1/icons/theme/svg/information.svg
--- cantata-2.3.0/icons/theme/svg/information.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg/information.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,11 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg/inode-directory.svg cantata-2.3.1/icons/theme/svg/inode-directory.svg
--- cantata-2.3.0/icons/theme/svg/inode-directory.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg/inode-directory.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,11 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg/key.svg cantata-2.3.1/icons/theme/svg/key.svg
--- cantata-2.3.0/icons/theme/svg/key.svg 2018-03-13 19:51:19.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg/key.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,8 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg/multimedia-player.svg cantata-2.3.1/icons/theme/svg/multimedia-player.svg
--- cantata-2.3.0/icons/theme/svg/multimedia-player.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg/multimedia-player.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,29 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg/network-server-database.svg cantata-2.3.1/icons/theme/svg/network-server-database.svg
--- cantata-2.3.0/icons/theme/svg/network-server-database.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg/network-server-database.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,38 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg/preferences-desktop-keyboard.svg cantata-2.3.1/icons/theme/svg/preferences-desktop-keyboard.svg
--- cantata-2.3.0/icons/theme/svg/preferences-desktop-keyboard.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg/preferences-desktop-keyboard.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,11 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg/preferences-other.svg cantata-2.3.1/icons/theme/svg/preferences-other.svg
--- cantata-2.3.0/icons/theme/svg/preferences-other.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg/preferences-other.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,6 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg/preferences-system-network.svg cantata-2.3.1/icons/theme/svg/preferences-system-network.svg
--- cantata-2.3.0/icons/theme/svg/preferences-system-network.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg/preferences-system-network.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,25 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg/speaker.svg cantata-2.3.1/icons/theme/svg/speaker.svg
--- cantata-2.3.0/icons/theme/svg/speaker.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg/speaker.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,15 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg64/dialog-error.svg cantata-2.3.1/icons/theme/svg64/dialog-error.svg
--- cantata-2.3.0/icons/theme/svg64/dialog-error.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg64/dialog-error.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,23 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg64/dialog-information.svg cantata-2.3.1/icons/theme/svg64/dialog-information.svg
--- cantata-2.3.0/icons/theme/svg64/dialog-information.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg64/dialog-information.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,23 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg64/dialog-question.svg cantata-2.3.1/icons/theme/svg64/dialog-question.svg
--- cantata-2.3.0/icons/theme/svg64/dialog-question.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg64/dialog-question.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,23 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/theme/svg64/dialog-warning.svg cantata-2.3.1/icons/theme/svg64/dialog-warning.svg
--- cantata-2.3.0/icons/theme/svg64/dialog-warning.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/theme/svg64/dialog-warning.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,23 +0,0 @@
-
-
diff -Nru cantata-2.3.0/icons/trayicon-mono-dark.svg cantata-2.3.1/icons/trayicon-mono-dark.svg
--- cantata-2.3.0/icons/trayicon-mono-dark.svg 2015-04-25 14:47:56.000000000 +0000
+++ cantata-2.3.1/icons/trayicon-mono-dark.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,6 +0,0 @@
-
diff -Nru cantata-2.3.0/icons/trayicon-mono-light.svg cantata-2.3.1/icons/trayicon-mono-light.svg
--- cantata-2.3.0/icons/trayicon-mono-light.svg 2015-04-25 14:47:55.000000000 +0000
+++ cantata-2.3.1/icons/trayicon-mono-light.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,6 +0,0 @@
-
diff -Nru cantata-2.3.0/icons/view-media-artist.svg cantata-2.3.1/icons/view-media-artist.svg
--- cantata-2.3.0/icons/view-media-artist.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/view-media-artist.svg 2018-05-16 05:15:50.000000000 +0000
@@ -1,18 +1,3 @@
diff -Nru cantata-2.3.0/icons/view-media-genre.svg cantata-2.3.1/icons/view-media-genre.svg
--- cantata-2.3.0/icons/view-media-genre.svg 2016-10-16 13:47:02.000000000 +0000
+++ cantata-2.3.1/icons/view-media-genre.svg 2018-05-11 16:34:28.000000000 +0000
@@ -1,6 +1,2 @@
-
+
diff -Nru cantata-2.3.0/INSTALL cantata-2.3.1/INSTALL
--- cantata-2.3.0/INSTALL 2017-12-28 11:25:09.000000000 +0000
+++ cantata-2.3.1/INSTALL 2018-05-21 16:19:31.000000000 +0000
@@ -62,7 +62,7 @@
Default: ON
-DINSTALL_UBUNTU_ICONS=
- Install monochrome system tray icons for Ubuntu.
+ Install Suru icons for Ubuntu.
-DCANTATA_HELPERS_LIB_DIR=
For 64 bit builds, this may be used to control the lib sub-dir
diff -Nru cantata-2.3.0/models/browsemodel.cpp cantata-2.3.1/models/browsemodel.cpp
--- cantata-2.3.0/models/browsemodel.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/models/browsemodel.cpp 2018-05-23 19:39:27.000000000 +0000
@@ -28,6 +28,8 @@
#include "gui/settings.h"
#include "mpd-interface/mpdconnection.h"
#include "mpd-interface/mpdstats.h"
+#include "support/monoicon.h"
+#include "support/utils.h"
#include
void BrowseModel::FolderItem::add(Item *i)
@@ -59,7 +61,7 @@
, enabled(false)
, dbVersion(0)
{
- icn.addFile(":mpd.svg");
+ icn=MonoIcon::icon(FontAwesome::server, Utils::monoIconColor());
connect(this, SIGNAL(listFolder(QString)), MPDConnection::self(), SLOT(listFolder(QString)));
folderIndex.insert(root->getPath(), root);
}
diff -Nru cantata-2.3.0/models/browsemodel.h cantata-2.3.1/models/browsemodel.h
--- cantata-2.3.0/models/browsemodel.h 2018-02-07 21:59:25.000000000 +0000
+++ cantata-2.3.1/models/browsemodel.h 2018-05-24 17:49:38.000000000 +0000
@@ -113,7 +113,7 @@
QString name() const;
QString title() const;
QString descr() const;
- const Icon & icon() const { return icn; }
+ const QIcon & icon() const { return icn; }
void clear();
void load();
bool isEnabled() const { return enabled; }
@@ -142,7 +142,7 @@
Item * toItem(const QModelIndex &index) const { return index.isValid() ? static_cast- (index.internalPointer()) : root; }
private:
- Icon icn;
+ QIcon icn;
FolderItem *root;
QMap folderIndex;
bool enabled;
diff -Nru cantata-2.3.0/models/localbrowsemodel.cpp cantata-2.3.1/models/localbrowsemodel.cpp
--- cantata-2.3.0/models/localbrowsemodel.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/models/localbrowsemodel.cpp 2018-05-23 19:40:01.000000000 +0000
@@ -63,13 +63,13 @@
return l.fileName().toLower().localeAwareCompare(r.fileName().toLower())<0;
}
-LocalBrowseModel::LocalBrowseModel(const QString &name, const QString &title, const QString &descr, const QString &icon, QObject *p)
+LocalBrowseModel::LocalBrowseModel(const QString &name, const QString &title, const QString &descr, const QIcon &icon, QObject *p)
: QFileSystemModel(p)
, pathName(name)
, pathTitle(title)
, pathDescr(descr)
+ , icn(icon)
{
- icn.addFile(icon);
setFilter(QDir::Files|QDir::Dirs|QDir::NoDotAndDotDot|QDir::Drives);
}
diff -Nru cantata-2.3.0/models/localbrowsemodel.h cantata-2.3.1/models/localbrowsemodel.h
--- cantata-2.3.0/models/localbrowsemodel.h 2018-02-07 21:59:25.000000000 +0000
+++ cantata-2.3.1/models/localbrowsemodel.h 2018-05-24 17:50:59.000000000 +0000
@@ -33,20 +33,20 @@
Q_OBJECT
public:
- LocalBrowseModel(const QString &name, const QString &title, const QString &descr, const QString &icon, QObject *p);
+ LocalBrowseModel(const QString &name, const QString &title, const QString &descr, const QIcon &icon, QObject *p);
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QString name() const { return pathName; }
QString title() const { return pathTitle; }
QString descr() const { return pathDescr; }
- const Icon & icon() const { return icn; }
+ const QIcon & icon() const { return icn; }
private:
QString pathName;
QString pathTitle;
QString pathDescr;
- Icon icn;
+ QIcon icn;
};
class FileSystemProxyModel : public QSortFilterProxyModel
diff -Nru cantata-2.3.0/models/musiclibraryitemroot.h cantata-2.3.1/models/musiclibraryitemroot.h
--- cantata-2.3.0/models/musiclibraryitemroot.h 2018-01-09 19:22:33.000000000 +0000
+++ cantata-2.3.1/models/musiclibraryitemroot.h 2018-05-24 17:55:11.000000000 +0000
@@ -69,7 +69,7 @@
}
~MusicLibraryItemRoot() override { }
- virtual Icon icon() const { return Icon(); }
+ virtual QIcon icon() const { return QIcon(); }
virtual QImage image() const { return QImage(); }
virtual Song fixPath(const Song &orig, bool) const { return orig; }
virtual const QString & id() const { return m_itemData; }
diff -Nru cantata-2.3.0/models/playlistsmodel.cpp cantata-2.3.1/models/playlistsmodel.cpp
--- cantata-2.3.0/models/playlistsmodel.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/models/playlistsmodel.cpp 2018-05-23 19:48:17.000000000 +0000
@@ -74,7 +74,7 @@
, itemMenu(nullptr)
, dropAdjust(0)
{
- icn.addFile(":playlist.svg");
+ icn=Icons::self()->playlistListIcon;
connect(MPDConnection::self(), SIGNAL(stateChanged(bool)), SLOT(mpdConnectionStateChanged(bool)));
connect(MPDConnection::self(), SIGNAL(playlistsRetrieved(const QList &)), this, SLOT(setPlaylists(const QList &)));
connect(MPDConnection::self(), SIGNAL(playlistInfoRetrieved(const QString &, const QList &)), this, SLOT(playlistInfoRetrieved(const QString &, const QList &)));
@@ -345,7 +345,7 @@
? pl->visibleName()
: pl->visibleName()+"\n"+tr("%n Tracks (%1)", "", pl->songs.count()).arg(Utils::formatTime(pl->totalTime()));
case Qt::DecorationRole:
- return multiCol ? QVariant() : (pl->isSmartPlaylist ? Icons::self()->dynamicListIcon : Icons::self()->playlistListIcon);
+ return multiCol ? QVariant() : (pl->isSmartPlaylist ? Icons::self()->smartPlaylistIcon : Icons::self()->playlistListIcon);
case Cantata::Role_SubText:
if (!pl->loaded) {
pl->loaded=true;
diff -Nru cantata-2.3.0/models/playlistsmodel.h cantata-2.3.1/models/playlistsmodel.h
--- cantata-2.3.0/models/playlistsmodel.h 2018-02-01 19:06:17.000000000 +0000
+++ cantata-2.3.1/models/playlistsmodel.h 2018-05-24 17:53:49.000000000 +0000
@@ -104,7 +104,7 @@
QString name() const;
QString title() const;
QString descr() const;
- const Icon & icon() const { return icn; }
+ const QIcon & icon() const { return icn; }
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override { Q_UNUSED(parent) return COL_COUNT; }
bool canFetchMore(const QModelIndex &index) const override;
@@ -163,7 +163,7 @@
quint32 allocateKey();
private:
- Icon icn;
+ QIcon icn;
bool multiCol;
QList items;
QSet usedKeys;
diff -Nru cantata-2.3.0/models/streamsearchmodel.cpp cantata-2.3.1/models/streamsearchmodel.cpp
--- cantata-2.3.0/models/streamsearchmodel.cpp 2018-03-14 22:01:34.000000000 +0000
+++ cantata-2.3.1/models/streamsearchmodel.cpp 2018-06-01 16:30:16.000000000 +0000
@@ -28,6 +28,8 @@
#include "network/networkaccessmanager.h"
#include "gui/stdactions.h"
#include "gui/settings.h"
+#include "support/monoicon.h"
+#include "support/utils.h"
#include
#include
#include
@@ -36,21 +38,15 @@
#include
#include
-static QIcon getIcon(const QString &name)
-{
- QIcon icon;
- icon.addFile(":"+name);
- return icon.isNull() ? Icons::self()->streamCategoryIcon : icon;
-}
-
StreamSearchModel::StreamSearchModel(QObject *parent)
: ActionModel(parent)
, root(new StreamsModel::CategoryItem(QString(), "root"))
{
// ORDER *MUST* MATCH Category ENUM!!!!!
- root->children.append(new StreamsModel::CategoryItem("http://opml.radiotime.com/Search.ashx", tr("TuneIn"), root, getIcon("tunein")));
- root->children.append(new StreamsModel::CategoryItem(QLatin1String("http://")+StreamsModel::constShoutCastHost+QLatin1String("/legacy/genrelist"), tr("ShoutCast"), root, getIcon("shoutcast")));
- root->children.append(new StreamsModel::CategoryItem(QLatin1String("http://")+StreamsModel::constDirbleHost+QLatin1String("/v2/search/"), tr("Dirble"), root, getIcon("dirble")));
+ root->children.append(new StreamsModel::CategoryItem("http://opml.radiotime.com/Search.ashx", tr("TuneIn"), root, MonoIcon::icon(":tunein.svg", Utils::monoIconColor())));
+ root->children.append(new StreamsModel::CategoryItem(QLatin1String("http://")+StreamsModel::constShoutCastHost+QLatin1String("/legacy/genrelist"), tr("ShoutCast"), root, MonoIcon::icon(":shoutcast.svg", Utils::monoIconColor())));
+ root->children.append(new StreamsModel::CategoryItem(QLatin1String("http://")+StreamsModel::constDirbleHost+QLatin1String("/v2/search/"), tr("Dirble"), root, MonoIcon::icon(":station.svg", Utils::monoIconColor())));
+ icon = MonoIcon::icon(FontAwesome::search, Utils::monoIconColor());
}
StreamSearchModel::~StreamSearchModel()
@@ -112,7 +108,7 @@
case Cantata::Role_SubText:
return tr("Search for radio streams");
case Qt::DecorationRole:
- return Icon("edit-find");
+ return icon;
}
return QVariant();
}
@@ -257,28 +253,6 @@
currentSearch=QString();
}
-static int getParam(const QString &key, QString &query)
-{
- int index=query.indexOf(" "+key+"=");
- int val=0;
- if (-1!=index) {
- int endPos=query.indexOf(" ", index+3);
- int end=endPos;
- if (-1==end) {
- end=query.length()-1;
- }
- int start=index+key.length()+2;
- val=query.mid(start, (end+1)-start).toInt();
- if (endPos>start) {
- query=query.left(index)+query.mid(endPos);
- query=query.trimmed();
- } else {
- query=query.left(index);
- }
- }
- return val;
-}
-
void StreamSearchModel::search(const QString &searchTerm, bool stationsOnly)
{
if (searchTerm==currentSearch) {
@@ -305,18 +279,9 @@
}
case ShoutCast: {
searchUrl=QUrl(item->url);
- QString search=searchTerm;
- int limit=getParam("limit", search);
- int bitrate=getParam("br", search);
- if (0==bitrate) {
- bitrate=getParam("bitrate", search);
- }
ApiKeys::self()->addKey(query, ApiKeys::ShoutCast);
- query.addQueryItem("search", search);
- query.addQueryItem("limit", QString::number(limit<1 ? 100 : limit));
- if (bitrate>=32 && bitrate<=512) {
- query.addQueryItem("br", QString::number(bitrate));
- }
+ query.addQueryItem("search", searchTerm);
+ query.addQueryItem("limit", QString::number(200));
break;
}
case Dirble:
diff -Nru cantata-2.3.0/models/streamsearchmodel.h cantata-2.3.1/models/streamsearchmodel.h
--- cantata-2.3.0/models/streamsearchmodel.h 2018-01-09 19:22:33.000000000 +0000
+++ cantata-2.3.1/models/streamsearchmodel.h 2018-05-23 19:55:48.000000000 +0000
@@ -87,6 +87,7 @@
QMap jobs;
StreamsModel::CategoryItem *root;
QString currentSearch;
+ QIcon icon;
};
#endif
diff -Nru cantata-2.3.0/models/streamsmodel.cpp cantata-2.3.1/models/streamsmodel.cpp
--- cantata-2.3.0/models/streamsmodel.cpp 2018-03-14 22:03:56.000000000 +0000
+++ cantata-2.3.1/models/streamsmodel.cpp 2018-05-24 18:03:36.000000000 +0000
@@ -27,6 +27,7 @@
#include "widgets/icons.h"
#include "network/networkaccessmanager.h"
#include "support/utils.h"
+#include "support/monoicon.h"
#include "gui/settings.h"
#include "playqueuemodel.h"
#include "roles.h"
@@ -35,7 +36,6 @@
#include "support/actioncollection.h"
#include "digitallyimported.h"
#include "qtiocompressor/qtiocompressor.h"
-#include "support/utils.h"
#include "config.h"
#include "support/globalstatic.h"
#include
@@ -88,25 +88,18 @@
static const QLatin1String constBookmarksDir=QLatin1String("bookmarks");
-static QIcon getIcon(const QString &name)
-{
- QIcon icon;
- icon.addFile(":"+name);
- return icon.isNull() ? Icons::self()->streamCategoryIcon : icon;
-}
-
-static Icon getExternalIcon(const QString &path, QStringList files=QStringList() << StreamsModel::constSvgIcon << StreamsModel::constPngIcon)
+static QIcon getExternalIcon(const QString &path, QStringList files=QStringList() << StreamsModel::constSvgIcon << StreamsModel::constPngIcon)
{
for (const QString &file: files) {
QString iconFile=path+Utils::constDirSep+file;
if (QFile::exists(iconFile)) {
- Icon icon;
+ QIcon icon;
icon.addFile(iconFile);
return icon;
}
}
- return Icon();
+ return QIcon();
}
static QString categoryCacheName(const QString &name, bool createDir=false)
@@ -231,11 +224,7 @@
StreamsModel::CategoryItem * StreamsModel::CategoryItem::createBookmarksCategory()
{
- Icon icon=Icon("bookmarks");
- if (icon.isNull()) {
- icon=Icon("user-bookmarks");
- }
- CategoryItem *bookmarkCat = new CategoryItem(QString(), tr("Bookmarks"), this, icon);
+ CategoryItem *bookmarkCat = new CategoryItem(QString(), tr("Bookmarks"), this, MonoIcon::icon(FontAwesome::bookmark, Utils::monoIconColor()));
bookmarkCat->state=CategoryItem::Fetched;
bookmarkCat->isBookmarks=true;
return bookmarkCat;
@@ -498,18 +487,19 @@
: ActionModel(parent)
, root(new CategoryItem(QString(), "root"))
{
- icn.addFile(":radio.svg");
- tuneIn=new CategoryItem(constRadioTimeUrl+QLatin1String("?locale=")+QLocale::system().name(), tr("TuneIn"), root, getIcon("tunein"), QString(), "tunein");
+ QColor col = Utils::monoIconColor();
+ icn=MonoIcon::icon(":radio.svg", col);
+ tuneIn=new CategoryItem(constRadioTimeUrl+QLatin1String("?locale=")+QLocale::system().name(), tr("TuneIn"), root, MonoIcon::icon(":tunein.svg", col), QString(), "tunein");
tuneIn->supportsBookmarks=true;
root->children.append(tuneIn);
- root->children.append(new IceCastCategoryItem(constIceCastUrl, tr("IceCast"), root, getIcon("icecast"), "icecast"));
- shoutCast=new ShoutCastCategoryItem(constShoutCastUrl, tr("ShoutCast"), root, getIcon("shoutcast"));
+ root->children.append(new IceCastCategoryItem(constIceCastUrl, tr("IceCast"), root, MonoIcon::icon(FontAwesome::cube, col), "icecast"));
+ shoutCast=new ShoutCastCategoryItem(constShoutCastUrl, tr("ShoutCast"), root, MonoIcon::icon(":shoutcast.svg", col));
shoutCast->configName="shoutcast";
root->children.append(shoutCast);
- dirble=new DirbleCategoryItem(constDirbleUrl, tr("Dirble"), root, getIcon("dirble"));
+ dirble=new DirbleCategoryItem(constDirbleUrl, tr("Dirble"), root, MonoIcon::icon(":station.svg", col));
dirble->configName="dirble";
root->children.append(dirble);
- favourites=new FavouritesCategoryItem(constFavouritesUrl, tr("Favorites"), root, getIcon("favourites"));
+ favourites=new FavouritesCategoryItem(constFavouritesUrl, tr("Favorites"), root, MonoIcon::icon(FontAwesome::heart, MonoIcon::constRed));
root->children.append(favourites);
loadInstalledProviders();
addBookmarkAction = new Action(Icons::self()->addBookmarkIcon, tr("Bookmark Category"), this);
@@ -1753,7 +1743,7 @@
}
}
-StreamsModel::CategoryItem * StreamsModel::addInstalledProvider(const QString &name, const Icon &icon, const QString &streamsFileName, bool replace)
+StreamsModel::CategoryItem * StreamsModel::addInstalledProvider(const QString &name, const QIcon &icon, const QString &streamsFileName, bool replace)
{
CategoryItem *cat=nullptr;
if (streamsFileName.endsWith(constSettingsFile)) {
diff -Nru cantata-2.3.0/models/streamsmodel.h cantata-2.3.1/models/streamsmodel.h
--- cantata-2.3.0/models/streamsmodel.h 2018-03-14 22:00:51.000000000 +0000
+++ cantata-2.3.1/models/streamsmodel.h 2018-05-24 17:55:11.000000000 +0000
@@ -218,7 +218,7 @@
QString name() const;
QString title() const;
QString descr() const;
- const Icon & icon() const { return icn; }
+ const QIcon & icon() const { return icn; }
QModelIndex index(int, int, const QModelIndex & = QModelIndex()) const override;
QModelIndex parent(const QModelIndex &) const override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
@@ -263,7 +263,7 @@
void save();
QList getCategories() const;
void setHiddenCategories(const QSet &cats);
- CategoryItem * addInstalledProvider(const QString &name, const Icon &icon, const QString &streamsFileName, bool replace);
+ CategoryItem * addInstalledProvider(const QString &name, const QIcon &icon, const QString &streamsFileName, bool replace);
void removeInstalledProvider(const QString &key);
QModelIndex categoryIndex(const CategoryItem *cat) const;
@@ -324,7 +324,7 @@
Action *configureDiAction;
Action *reloadAction;
QList
- hiddenCategories;
- Icon icn;
+ QIcon icn;
};
#endif
diff -Nru cantata-2.3.0/mpd-interface/mpdconnection.cpp cantata-2.3.1/mpd-interface/mpdconnection.cpp
--- cantata-2.3.0/mpd-interface/mpdconnection.cpp 2018-03-07 19:04:41.000000000 +0000
+++ cantata-2.3.1/mpd-interface/mpdconnection.cpp 2018-05-29 06:17:56.000000000 +0000
@@ -195,7 +195,7 @@
MPDConnectionDetails::MPDConnectionDetails()
: port(6600)
, dirReadable(false)
- , allowLocalStreaming(false)
+ , allowLocalStreaming(true)
, autoUpdate(false)
{
}
@@ -220,6 +220,23 @@
}
}
+MPDConnectionDetails & MPDConnectionDetails::operator=(const MPDConnectionDetails &o)
+{
+ name=o.name;
+ hostname=o.hostname;
+ port=o.port;
+ password=o.password;
+ dir=o.dir;
+ dirReadable=o.dirReadable;
+ #ifdef ENABLE_HTTP_STREAM_PLAYBACK
+ streamUrl=o.streamUrl;
+ #endif
+ replayGain=o.replayGain;
+ allowLocalStreaming=o.allowLocalStreaming;
+ autoUpdate=o.autoUpdate;
+ return *this;
+}
+
void MPDConnectionDetails::setDirReadable()
{
dirReadable=Utils::isDirReadable(dir);
@@ -1656,7 +1673,9 @@
void MPDConnection::listPlaylists()
{
- Response response=sendCommand("listplaylists");
+ // Don't report errors here. If user has disabled playlists, then MPD will report an error
+ // Issues #1090 #1284
+ Response response=sendCommand("listplaylists", false);
if (response.ok) {
QList playlists=MPDParseUtils::parsePlaylists(response.data);
playlists.removeAll((Playlist(constStreamsPlayListName)));
@@ -1838,6 +1857,26 @@
Response response=sendCommand(cmd);
if (response.ok) {
songs=MPDParseUtils::parseSongs(response.data, MPDParseUtils::Loc_Search);
+
+ if (QLatin1String("any")==field) {
+ // When searching on 'any' MPD ignores filename/paths! So, do another
+ // search on these, and combine results.
+ response=sendCommand("search file "+encodeName(value));
+ if (response.ok) {
+ QList otherSongs=MPDParseUtils::parseSongs(response.data, MPDParseUtils::Loc_Search);
+ if (!otherSongs.isEmpty()) {
+ QSet fileNames;
+ for (const auto &s: songs) {
+ fileNames.insert(s.file);
+ }
+ for (const auto &s: otherSongs) {
+ if (!fileNames.contains(s.file)) {
+ songs.append(s);
+ }
+ }
+ }
+ }
+ }
qSort(songs);
}
}
diff -Nru cantata-2.3.0/mpd-interface/mpdconnection.h cantata-2.3.1/mpd-interface/mpdconnection.h
--- cantata-2.3.0/mpd-interface/mpdconnection.h 2018-02-15 19:29:59.000000000 +0000
+++ cantata-2.3.1/mpd-interface/mpdconnection.h 2018-05-29 06:18:05.000000000 +0000
@@ -141,10 +141,12 @@
struct MPDConnectionDetails {
MPDConnectionDetails();
+ MPDConnectionDetails(const MPDConnectionDetails &o) { *this=o; }
QString getName() const;
QString description() const;
bool isLocal() const { return hostname.startsWith('/'); }
bool isEmpty() const { return hostname.isEmpty() || (!isLocal() && 0==port); }
+ MPDConnectionDetails & operator=(const MPDConnectionDetails &o);
bool operator==(const MPDConnectionDetails &o) const { return hostname==o.hostname && isLocal()==o.isLocal() && (isLocal() || port==o.port) && password==o.password; }
bool operator!=(const MPDConnectionDetails &o) const { return !(*this==o); }
bool operator<(const MPDConnectionDetails &o) const { return name.localeAwareCompare(o.name)<0; }
diff -Nru cantata-2.3.0/mpd-interface/mpdparseutils.cpp cantata-2.3.1/mpd-interface/mpdparseutils.cpp
--- cantata-2.3.0/mpd-interface/mpdparseutils.cpp 2018-04-25 21:04:06.000000000 +0000
+++ cantata-2.3.1/mpd-interface/mpdparseutils.cpp 2018-05-16 22:05:20.000000000 +0000
@@ -743,7 +743,18 @@
}
}
if (Loc_Browse==loc) {
- qSort(songs);
+ QList sngs;
+ QList playlists;
+ for (const auto &s: songs) {
+ if (Song::Playlist==s.type) {
+ playlists.append(s);
+ } else {
+ sngs.append(s);
+ }
+ }
+ qSort(playlists);
+ songs=sngs;
+ songs+=playlists;
}
songList+=songs;
}
diff -Nru cantata-2.3.0/mpd-interface/mpduser.cpp cantata-2.3.1/mpd-interface/mpduser.cpp
--- cantata-2.3.0/mpd-interface/mpduser.cpp 2018-02-15 19:42:19.000000000 +0000
+++ cantata-2.3.1/mpd-interface/mpduser.cpp 2018-05-28 21:03:07.000000000 +0000
@@ -79,6 +79,7 @@
mpdExe=Utils::findExe("mpd");
#endif
det.name=constName;
+ det.allowLocalStreaming=true;
}
bool MPDUser::isSupported()
@@ -254,7 +255,7 @@
QString playlists;
if (create && !QFile::exists(cfgName)) {
// Conf file does not exist, so we need to create one...
- QFile cfgTemplate(CANTATA_SYS_MPD_DIR+constConfigFile+".template");
+ QFile cfgTemplate(":"+constConfigFile+".template");
if (cfgTemplate.open(QIODevice::ReadOnly|QIODevice::Text)) {
QFile cfgFile(cfgName);
diff -Nru cantata-2.3.0/mpd-interface/song.cpp cantata-2.3.1/mpd-interface/song.cpp
--- cantata-2.3.0/mpd-interface/song.cpp 2018-02-25 21:52:52.000000000 +0000
+++ cantata-2.3.1/mpd-interface/song.cpp 2018-05-20 12:37:51.000000000 +0000
@@ -36,6 +36,8 @@
#include
#include
#include
+#include
+#include
//static const quint8 constOnlineDiscId=0xEE;
@@ -384,9 +386,11 @@
};
static QHash storeMap;
+static QMutex storeMapMutex;
void Song::clearKeyStore(int location)
{
+ QMutexLocker locker(&storeMapMutex);
storeMap.remove(location);
}
@@ -449,9 +453,11 @@
return 0;
}
- KeyStore &store=storeMap[location];
QString songKey(albumKey());
+ QMutexLocker locker(&storeMapMutex);
+ KeyStore &store=storeMap[location];
QHash::ConstIterator it=store.keys.find(songKey);
+
if (it!=store.keys.end()) {
key=it.value();
} else {
@@ -747,24 +753,34 @@
return albumArtist()+QLatin1Char(':')+albumId()+QLatin1Char(':')+QString::number(disc);
}
-QString Song::basicArtist() const
+static QString basic(const QString &str)
{
- if (!albumartist.isEmpty() && (artist.isEmpty() || albumartist==artist || (albumartist.length()
-
+
-
+
-
+
diff -Nru cantata-2.3.0/online/icons/cbc.svg cantata-2.3.1/online/icons/cbc.svg
--- cantata-2.3.0/online/icons/cbc.svg 2015-04-25 14:47:56.000000000 +0000
+++ cantata-2.3.1/online/icons/cbc.svg 2018-05-23 18:37:42.000000000 +0000
@@ -1 +1 @@
-
+
diff -Nru cantata-2.3.0/online/icons/CMakeLists.txt cantata-2.3.1/online/icons/CMakeLists.txt
--- cantata-2.3.0/online/icons/CMakeLists.txt 2017-04-09 16:23:42.000000000 +0000
+++ cantata-2.3.1/online/icons/CMakeLists.txt 2018-05-17 16:28:05.000000000 +0000
@@ -1,4 +1,4 @@
-set(CANTATA_INSTALL_ONLINE_ICONS bbc.svg cbc.svg npr.svg podcasts.png soundcloud.png)
+set(CANTATA_INSTALL_ONLINE_ICONS podcasts.png soundcloud.png)
if (WIN32)
install(FILES ${CANTATA_INSTALL_ONLINE_ICONS} DESTINATION ${CMAKE_INSTALL_PREFIX}/icons/)
diff -Nru cantata-2.3.0/online/icons/gpodder.svg cantata-2.3.1/online/icons/gpodder.svg
--- cantata-2.3.0/online/icons/gpodder.svg 2015-04-25 14:47:55.000000000 +0000
+++ cantata-2.3.1/online/icons/gpodder.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,42 +0,0 @@
-
diff -Nru cantata-2.3.0/online/icons/itunes.svg cantata-2.3.1/online/icons/itunes.svg
--- cantata-2.3.0/online/icons/itunes.svg 2015-04-25 14:47:56.000000000 +0000
+++ cantata-2.3.1/online/icons/itunes.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,59 +0,0 @@
-
diff -Nru cantata-2.3.0/online/icons/jamendo.svg cantata-2.3.1/online/icons/jamendo.svg
--- cantata-2.3.0/online/icons/jamendo.svg 2015-04-25 14:47:56.000000000 +0000
+++ cantata-2.3.1/online/icons/jamendo.svg 1970-01-01 00:00:00.000000000 +0000
@@ -1,29 +0,0 @@
-
diff -Nru cantata-2.3.0/online/icons/magnatune.svg cantata-2.3.1/online/icons/magnatune.svg
--- cantata-2.3.0/online/icons/magnatune.svg 2015-04-25 14:47:56.000000000 +0000
+++ cantata-2.3.1/online/icons/magnatune.svg 2018-05-23 18:52:13.000000000 +0000
@@ -1,5 +1,5 @@