220 linhas
7.6 KiB
Python
220 linhas
7.6 KiB
Python
# -*- Mode: python; coding: utf-8; tab-width: 4; indent-tabs-mode: nil; -*-
|
|
#
|
|
# Copyright (C) 2012 - fossfreedom
|
|
# Copyright (C) 2012 - Agustin Carrasco
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2, or (at your option)
|
|
# any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
# define plugin
|
|
from gi.repository import Gtk
|
|
from gi.repository import RB
|
|
from gi.repository import GObject
|
|
from gi.repository import GLib
|
|
|
|
from coverart_rb3compat import Menu
|
|
from coverart_external_plugins import CreateExternalPluginMenu
|
|
from coverart_entryview import CoverArtEntryView
|
|
from coverart_rb3compat import ActionGroup
|
|
from coverart_rb3compat import ApplicationShell
|
|
from coverart_browser_prefs import CoverLocale
|
|
from coverart_widgets import PressButton
|
|
from coverart_utils import create_button_image
|
|
|
|
import rb
|
|
|
|
|
|
class CoverArtPlayEntryView(CoverArtEntryView):
|
|
__hash__ = GObject.__hash__
|
|
|
|
def __init__(self, shell, source):
|
|
'''
|
|
Initializes the entryview.
|
|
'''
|
|
super(CoverArtPlayEntryView, self).__init__(shell, source)
|
|
|
|
def define_menu(self):
|
|
popup = Menu(self.plugin, self.shell)
|
|
popup.load_from_file('N/A',
|
|
'ui/coverart_play_pop_rb3.ui')
|
|
signals = {
|
|
'remove_from_playlist_menu_item': self.remove_from_playlist_menu_item_callback
|
|
}
|
|
|
|
popup.connect_signals(signals)
|
|
popup.connect('pre-popup', self.pre_popup_menu_callback)
|
|
self.popup = popup
|
|
|
|
def pre_popup_menu_callback(self, *args):
|
|
'''
|
|
Callback when the popup menu is about to be displayed
|
|
'''
|
|
|
|
if not self.external_plugins:
|
|
self.external_plugins = \
|
|
CreateExternalPluginMenu("playlist_entry_view", 1, self.popup)
|
|
self.external_plugins.create_menu('play_popup_menu')
|
|
|
|
def remove_from_playlist_menu_item_callback(self, *args):
|
|
print("remove_from_playlist_menu_item_callback")
|
|
entries = self.get_selected_entries()
|
|
for entry in entries:
|
|
print(entry)
|
|
self.source.source_query_model.remove_entry(entry)
|
|
|
|
def do_show_popup(self, over_entry):
|
|
if over_entry:
|
|
print("CoverArtBrowser DEBUG - do_show_popup()")
|
|
|
|
self.popup.popup(self.source,
|
|
'play_popup_menu', 0, Gtk.get_current_event_time())
|
|
|
|
return over_entry
|
|
|
|
def play_track_menu_item_callback(self, *args):
|
|
print("CoverArtBrowser DEBUG - play_track_menu_item_callback()")
|
|
|
|
selected = self.get_selected_entries()
|
|
entry = selected[0]
|
|
|
|
# Start the music
|
|
player = self.shell.props.shell_player
|
|
player.play_entry(entry, self.source)
|
|
|
|
print("CoverArtBrowser DEBUG - play_track_menu_item_callback()")
|
|
|
|
|
|
class CoverArtPlaySource(RB.Source):
|
|
'''
|
|
Source utilized by the plugin to show all it's ui.
|
|
'''
|
|
|
|
def __init__(self, **kwargs):
|
|
'''
|
|
Initializes the source.
|
|
'''
|
|
super(CoverArtPlaySource, self).__init__()
|
|
self.external_plugins = None
|
|
self.hasActivated = False
|
|
|
|
def initialise(self, plugin, shell, source):
|
|
self.plugin = plugin
|
|
self.shell = shell
|
|
self.source = source
|
|
player = self.shell.props.shell_player
|
|
player.set_playing_source(self)
|
|
player.set_selected_source(self)
|
|
|
|
def do_selected(self):
|
|
'''
|
|
Called by Rhythmbox when the source is selected. It makes sure to
|
|
create the ui the first time the source is shown.
|
|
'''
|
|
print("CoverArtBrowser DEBUG - do_selected")
|
|
|
|
# first time of activation -> add graphical stuff
|
|
if not self.hasActivated:
|
|
self.do_impl_activate()
|
|
|
|
# indicate that the source was activated before
|
|
self.hasActivated = True
|
|
|
|
print("CoverArtBrowser DEBUG - end do_selected")
|
|
|
|
def connect_library_signals(self):
|
|
pass
|
|
|
|
def do_impl_activate(self):
|
|
'''
|
|
Called by do_selected the first time the source is activated.
|
|
It creates all the source ui and connects the necessary signals for it
|
|
correct behavior.
|
|
'''
|
|
print('do_impl_activate')
|
|
self.hasActivated = True
|
|
|
|
self.entryview = CoverArtPlayEntryView(self.shell, self.source)
|
|
self.entryview.props.hexpand = True
|
|
self.entryview.props.vexpand = True
|
|
grid = Gtk.Grid()
|
|
grid.attach(self.entryview, 0, 1, 3, 1)
|
|
|
|
self.entryview.set_model(self.source.source_query_model)
|
|
|
|
# enable sorting on the entryview
|
|
# entryview.set_columns_clickable(True)
|
|
self.shell.props.library_source.get_entry_view().set_columns_clickable(
|
|
True)
|
|
|
|
cl = CoverLocale()
|
|
cl.switch_locale(cl.Locale.LOCALE_DOMAIN)
|
|
location = rb.find_plugin_file(self.plugin, 'ui/playsource-toolbar.ui')
|
|
ui = Gtk.Builder()
|
|
ui.set_translation_domain(cl.Locale.RB)
|
|
ui.add_from_file(location)
|
|
toolbar_menu = ui.get_object('playsource-toolbar')
|
|
app = self.shell.props.application
|
|
app.link_shared_menus(toolbar_menu)
|
|
self.toolbar = RB.ButtonBar.new(toolbar_menu, toolbar_menu)
|
|
self.toolbar.props.hexpand_set = False
|
|
grid.attach(self.toolbar, 1, 0, 1, 1)
|
|
|
|
self.coverartbutton = PressButton()
|
|
self.coverartbutton.props.halign = Gtk.Align.START
|
|
self.coverartbutton.set_image(create_button_image(self.plugin, "covermgr_std.png"))
|
|
self.coverartbutton.connect('clicked', self.coverartbutton_callback)
|
|
grid.attach(self.coverartbutton, 0, 0, 1, 1)
|
|
|
|
grid.show_all()
|
|
self.pack_start(grid, True, True, 0)
|
|
|
|
appshell = ApplicationShell(self.shell)
|
|
action_group = ActionGroup(self.shell, 'PlaySourceActions')
|
|
action_group.add_action(func=self.clear_playsource,
|
|
action_name='playsource-clear', action_state=ActionGroup.STANDARD,
|
|
action_type='app')
|
|
action_group.add_action(func=self.shuffle_playsource,
|
|
action_name='playsource-shuffle', action_state=ActionGroup.STANDARD,
|
|
action_type='app')
|
|
appshell.insert_action_group(action_group)
|
|
|
|
# if the alternative-toolbar is loaded then lets connect to the toolbar-visibility signal
|
|
# to control our sources toolbar visibility
|
|
|
|
if hasattr(self.plugin.shell, 'alternative_toolbar'):
|
|
self.plugin.shell.alternative_toolbar.connect('toolbar-visibility', self._visibility)
|
|
|
|
def _visibility(self, altplugin, value):
|
|
if value:
|
|
self.toolbar.show()
|
|
self.coverartbutton.show()
|
|
else:
|
|
self.toolbar.hide()
|
|
self.coverartbutton.hide()
|
|
|
|
|
|
def coverartbutton_callback(self, *args):
|
|
GLib.idle_add( self.source.shell.props.display_page_tree.select, self.source)
|
|
|
|
|
|
def clear_playsource(self, *args):
|
|
for row in self.entryview.props.model:
|
|
self.entryview.props.model.remove_entry(row[0])
|
|
|
|
def shuffle_playsource(self, *args):
|
|
self.entryview.props.model.shuffle_entries()
|
|
|
|
|
|
GObject.type_register(CoverArtPlayEntryView)
|