1# Copyright (c) 2014-2021 Cedric Bellegarde <cedric.bellegarde@adishatz.org> 2# This program is free software: you can redistribute it and/or modify 3# it under the terms of the GNU General Public License as published by 4# the Free Software Foundation, either version 3 of the License, or 5# (at your option) any later version. 6# This program is distributed in the hope that it will be useful, 7# but WITHOUT ANY WARRANTY; without even the implied warranty of 8# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9# GNU General Public License for more details. 10# You should have received a copy of the GNU General Public License 11# along with this program. If not, see <http://www.gnu.org/licenses/>. 12 13from gi.repository import Gtk 14 15from gettext import gettext as _ 16 17from lollypop.define import App, Type, LovedFlags 18from lollypop.objects_track import Track 19 20 21class LovedWidget(Gtk.Bin): 22 """ 23 Loved widget 24 """ 25 26 def __init__(self, object, icon_size=Gtk.IconSize.BUTTON): 27 """ 28 Init widget 29 @param object as Album/Track 30 @param icon_size as Gtk.IconSize 31 """ 32 Gtk.Bin.__init__(self) 33 self.__object = object 34 self.__icon_size = icon_size 35 self.__timeout_id = None 36 builder = Gtk.Builder() 37 builder.add_from_resource("/org/gnome/Lollypop/LovedWidget.ui") 38 builder.connect_signals(self) 39 self.__artwork = builder.get_object("artwork") 40 self.add(builder.get_object("widget")) 41 self.__set_artwork(self.__object.loved) 42 43 def set_icon_size(self, icon_size): 44 """ 45 Set widget icon size 46 @param icon_size as Gtk.IconSize 47 """ 48 self.__icon_size = icon_size 49 self.__set_artwork(self.__object.loved) 50 51####################### 52# PROTECTED # 53####################### 54 def _on_enter_notify_event(self, widget, event): 55 """ 56 Update love opacity 57 @param widget as Gtk.EventBox 58 @param event as Gdk.Event 59 """ 60 if self.__object.loved & LovedFlags.LOVED: 61 loved = LovedFlags.NONE 62 else: 63 loved = LovedFlags.LOVED 64 self.__set_artwork(loved) 65 66 def _on_leave_notify_event(self, widget, event): 67 """ 68 Update love opacity 69 @param widget as Gtk.EventBox (can be None) 70 @param event as Gdk.Event (can be None) 71 """ 72 self.__set_artwork(self.__object.loved) 73 74 def _on_button_release_event(self, widget, event): 75 """ 76 Toggle loved status 77 @param widget as Gtk.EventBox 78 @param event as Gdk.Event 79 """ 80 if self.__object.loved & LovedFlags.LOVED: 81 loved = LovedFlags.NONE 82 else: 83 loved = LovedFlags.LOVED 84 self.__object.set_loved(loved) 85 if isinstance(self.__object, Track): 86 # Clear loved playlist artwork cache 87 name = App().playlists.get_name(Type.LOVED) 88 App().art.remove_from_cache("playlist_" + name, "ROUNDED") 89 name = App().playlists.get_name(Type.SKIPPED) 90 App().art.remove_from_cache("playlist_" + name, "ROUNDED") 91 # Update state on Last.fm 92 status = True if loved & LovedFlags.LOVED else False 93 for scrobbler in App().ws_director.scrobblers: 94 scrobbler.set_loved(self.__object, status) 95 self.__set_artwork(self.__object.loved) 96 return True 97 98####################### 99# PRIVATE # 100####################### 101 def __set_artwork(self, flags): 102 """ 103 Set artwork base on object status 104 @param flags as int 105 """ 106 if flags & LovedFlags.LOVED: 107 self.set_tooltip_text(_("Like")) 108 self.__artwork.set_opacity(0.8) 109 self.__artwork.set_from_icon_name("emblem-favorite-symbolic", 110 self.__icon_size) 111 else: 112 self.set_tooltip_text(_("Allow playback")) 113 self.__artwork.set_opacity(0.2) 114 self.__artwork.set_from_icon_name("emblem-favorite-symbolic", 115 self.__icon_size) 116