plugin that lets you grey out deleted songs on demand ("main menu / playlist") - available by default

also: this action will "ungrey" songs that were deleted but got restored

SIPs
This commit is contained in:
Paweł Bara 2011-03-19 10:22:55 +00:00
parent 823f798451
commit 3db00fc339
12 changed files with 86 additions and 7 deletions

View File

@ -8,3 +8,4 @@ endfunction(install_script_files)
add_subdirectory(digitallyimported-radio) add_subdirectory(digitallyimported-radio)
add_subdirectory(remove-duplicates) add_subdirectory(remove-duplicates)
add_subdirectory(invalidate-deleted)

View File

@ -0,0 +1,5 @@
install_script_files(invalidate-deleted
icon.png
invalidate_deleted.py
script.ini
)

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@ -0,0 +1,22 @@
import clementine
from PyQt4.QtCore import QObject
from PyQt4.QtCore import SIGNAL
from PyQt4.QtGui import QAction
class InvalidateDeleted(QObject):
def __init__(self):
QObject.__init__(self)
self.action = QAction("invalidate_deleted", self)
self.action.setText("Grey out deleted songs")
self.connect(self.action, SIGNAL("activated()"), self.grey_out_activated)
clementine.ui.AddAction('playlist_menu', self.action)
def grey_out_activated(self):
clementine.playlists.InvalidateDeletedSongs()
script = InvalidateDeleted()

View File

@ -0,0 +1,9 @@
[Script]
name=Deleted songs invalidator
description=This script will add a menu item for playlist's main menu which will grey out all non existent songs in all of your playlists.
author=Pawel Bara <keirangtp ( at ) gmail.com>
url=http://www.clementine-player.org
icon=icon.png
language=python
script_file=invalidate_deleted.py

View File

@ -1580,10 +1580,17 @@ void Playlist::InvalidateDeletedSongs() {
PlaylistItemPtr item = items_[row]; PlaylistItemPtr item = items_[row];
Song song = item->Metadata(); Song song = item->Metadata();
if(song.filetype() != Song::Type_Stream && !QFile::exists(song.filename())) { if(song.filetype() != Song::Type_Stream) {
// gray out the song if it's not there bool exists = QFile::exists(song.filename());
item->SetForegroundColor(kInvalidSongPriority, kInvalidSongColor);
invalidated_rows.append(row); if(!exists && !item->HasForegroundColor(kInvalidSongPriority)) {
// gray out the song if it's not there
item->SetForegroundColor(kInvalidSongPriority, kInvalidSongColor);
invalidated_rows.append(row);
} else if(exists && item->HasForegroundColor(kInvalidSongPriority)) {
item->RemoveForegroundColor(kInvalidSongPriority);
invalidated_rows.append(row);
}
} }
} }

View File

@ -95,6 +95,9 @@ QFuture<void> PlaylistItem::BackgroundReload() {
void PlaylistItem::SetBackgroundColor(short priority, const QColor& color) { void PlaylistItem::SetBackgroundColor(short priority, const QColor& color) {
background_colors_[priority] = color; background_colors_[priority] = color;
} }
bool PlaylistItem::HasBackgroundColor(short priority) const {
return background_colors_.contains(priority);
}
void PlaylistItem::RemoveBackgroundColor(short priority) { void PlaylistItem::RemoveBackgroundColor(short priority) {
background_colors_.remove(priority); background_colors_.remove(priority);
} }
@ -110,6 +113,9 @@ bool PlaylistItem::HasCurrentBackgroundColor() const {
void PlaylistItem::SetForegroundColor(short priority, const QColor& color) { void PlaylistItem::SetForegroundColor(short priority, const QColor& color) {
foreground_colors_[priority] = color; foreground_colors_[priority] = color;
} }
bool PlaylistItem::HasForegroundColor(short priority) const {
return foreground_colors_.contains(priority);
}
void PlaylistItem::RemoveForegroundColor(short priority) { void PlaylistItem::RemoveForegroundColor(short priority) {
foreground_colors_.remove(priority); foreground_colors_.remove(priority);
} }

View File

@ -116,12 +116,14 @@ class PlaylistItem : public boost::enable_shared_from_this<PlaylistItem> {
// Background colors. // Background colors.
void SetBackgroundColor(short priority, const QColor& color); void SetBackgroundColor(short priority, const QColor& color);
bool HasBackgroundColor(short priority) const;
void RemoveBackgroundColor(short priority); void RemoveBackgroundColor(short priority);
QColor GetCurrentBackgroundColor() const; QColor GetCurrentBackgroundColor() const;
bool HasCurrentBackgroundColor() const; bool HasCurrentBackgroundColor() const;
// Foreground colors. // Foreground colors.
void SetForegroundColor(short priority, const QColor& color); void SetForegroundColor(short priority, const QColor& color);
bool HasForegroundColor(short priority) const;
void RemoveForegroundColor(short priority); void RemoveForegroundColor(short priority);
QColor GetCurrentForegroundColor() const; QColor GetCurrentForegroundColor() const;
bool HasCurrentForegroundColor() const; bool HasCurrentForegroundColor() const;

View File

@ -111,6 +111,9 @@ public:
void InsertUrls (const QList<QUrl>& urls, int pos = -1, bool play_now = false, bool enqueue = false); void InsertUrls (const QList<QUrl>& urls, int pos = -1, bool play_now = false, bool enqueue = false);
void RemoveItemsWithoutUndo (const QList<int>& indicesIn); void RemoveItemsWithoutUndo (const QList<int>& indicesIn);
// Grays out and reloads all deleted songs in this playlist.
void InvalidateDeletedSongs();
void StopAfter(int row); void StopAfter(int row);
void ReloadItems(const QList<int>& rows); void ReloadItems(const QList<int>& rows);

View File

@ -199,6 +199,14 @@ Below we list all the currently taken background priorities:
If it makes sense, one functionality (one plugin) can use many background If it makes sense, one functionality (one plugin) can use many background
priorities at the same time. priorities at the same time.
%End
bool HasBackgroundColor(short priority) const;
%Docstring
HasBackgroundColor(priority) -> bool
Checks if this PlaylistItem has a background color with this priority set.
It doesn't need to be the current color, it just needs to exist in the colors
list.
%End %End
void RemoveBackgroundColor(short priority); void RemoveBackgroundColor(short priority);
@ -231,14 +239,22 @@ If it makes sense, one functionality (one plugin) can use many foreground
priorities at the same time. priorities at the same time.
%End %End
bool HasForegroundColor(short priority) const;
%Docstring
HasForegroundColor(priority) -> bool
Checks if this PlaylistItem has a foreground color with this priority set.
It doesn't need to be the current color, it just needs to exist in the colors
list.
%End
void RemoveForegroundColor(short priority); void RemoveForegroundColor(short priority);
%Docstring %Docstring
RemoveForegroundColor(priority) RemoveForegroundColor(priority)
Removes a foreground color with the given priority from this PlaylistItem's Removes a foreground color with the given priority from this PlaylistItem's
foreground. If there's no such color, this call will be ignored. foreground. If there's no such color, this call will be ignored.
@see: L{SetForegroundColor()} @see: L{SetForegroundColor()}
%End %End
~PlaylistItem(); ~PlaylistItem();
%MethodCode %MethodCode

View File

@ -85,6 +85,13 @@ Equivalent to C{playlist(active_id())}.
%Docstring %Docstring
GetAllPlaylists() -> list of L{Playlist}s GetAllPlaylists() -> list of L{Playlist}s
Returns a list containing all the playlists. Returns a list containing all the playlists.
%End
void InvalidateDeletedSongs();
%Docstring
InvalidateDeletedSongs()
Grays out and reloads all deleted songs in all playlists. Also, "ungreys"
those songs which were once deleted but now got restored somehow.
%End %End
const QItemSelection& selection(int id) const; const QItemSelection& selection(int id) const;

View File

@ -390,7 +390,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1131</width> <width>1131</width>
<height>23</height> <height>25</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menu_music"> <widget class="QMenu" name="menu_music">
@ -429,6 +429,7 @@
<addaction name="action_jump"/> <addaction name="action_jump"/>
<addaction name="action_clear_playlist"/> <addaction name="action_clear_playlist"/>
<addaction name="action_shuffle"/> <addaction name="action_shuffle"/>
<addaction name="separator"/>
</widget> </widget>
<widget class="QMenu" name="menu_help"> <widget class="QMenu" name="menu_help">
<property name="title"> <property name="title">