class Window(Gtk.ApplicationWindow): def __init__(self, app): Gtk.ApplicationWindow.__init__(self, application=app, title=_("Music")) self.connect('focus-in-event', self._windows_focus_cb) settings = Gio.Settings('org.gnome.Music') self.add_action(settings.create_action('repeat')) self.set_size_request(887, 640) self._setup_view() self.proxy = Gio.DBusProxy.new_sync(Gio.bus_get_sync(Gio.BusType.SESSION, None), Gio.DBusProxyFlags.NONE, None, 'org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon/MediaKeys', 'org.gnome.SettingsDaemon.MediaKeys', None) self._grab_media_player_keys() self.proxy.connect('g-signal', self._handle_media_keys) def _grab_media_player_keys(self): self.proxy.call_sync('GrabMediaPlayerKeys', GLib.Variant('(su)', ('Music', 0)), Gio.DBusCallFlags.NONE, -1, None) def _windows_focus_cb(self, window, event): self._grab_media_player_keys() def _handle_media_keys(self, proxy, sender, signal, parameters): if signal != 'MediaPlayerKeyPressed': print('Received an unexpected signal \'%s\' from media player'.format(signal)) return response = parameters.get_child_value(1).get_string() if 'Play' in response: self.player.play_pause() elif 'Stop' in response: self.player.Stop() elif 'Next' in response: self.player.play_next() elif 'Previous' in response: self.player.play_previous() def _setup_view(self): self._box = Gtk.VBox() self.player = Player() self.selection_toolbar = SelectionToolbar() self.toolbar = Toolbar() self.views = [] self._stack = Stack( transition_type=StackTransitionType.CROSSFADE, transition_duration=100, visible=True) if Gtk.get_minor_version() > 8: self.set_titlebar(self.toolbar.header_bar) else: self._box.pack_start(self.toolbar.header_bar, False, False, 0) self.set_hide_titlebar_when_maximized(True) self._box.pack_start(self.toolbar.searchbar, False, False, 0) self._box.pack_start(self._stack, True, True, 0) self._box.pack_start(self.player.eventBox, False, False, 0) self._box.pack_start(self.selection_toolbar.eventbox, False, False, 0) self.add(self._box) count = 1 cursor = tracker.query(Query.SONGS_COUNT, None) if cursor is not None and cursor.next(None): count = cursor.get_integer(0) if count > 0: self.views.append(Views.Albums(self.toolbar, self.selection_toolbar, self.player)) self.views.append(Views.Artists(self.toolbar, self.selection_toolbar, self.player)) self.views.append(Views.Songs(self.toolbar, self.selection_toolbar, self.player)) #self.views.append(Views.Playlist(self.toolbar, self.selection_toolbar, self.player)) for i in self.views: self._stack.add_titled(i, i.title, i.title) self.toolbar.set_stack(self._stack) self.toolbar.searchbar.show() self._on_notify_model_id = self._stack.connect('notify::visible-child', self._on_notify_mode) self.connect('destroy', self._notify_mode_disconnect) self.connect('key_press_event', self._on_key_press) self.views[0].populate() #To revert to the No Music View when no songs are found else: self.views.append(Views.Empty(self.toolbar, self.player)) self._stack.add_titled(self.views[0], _("Empty"), _("Empty")) self.toolbar._search_button.connect('toggled', self._on_search_toggled) self.toolbar.set_state(ToolbarState.ALBUMS) self.toolbar.header_bar.show() self.player.eventBox.show_all() self._box.show() self.show() def _on_key_press(self, widget, event): modifiers = Gtk.accelerator_get_default_mod_mask() if (event.keyval == Gdk.KEY_f and (event.state & modifiers) == Gdk.ModifierType.CONTROL_MASK): self._show_searchbar(not self.toolbar.searchbar.get_child_revealed()) elif (event.keyval == Gdk.KEY_Escape and (event.state & modifiers) == 0): self._show_searchbar(False) def _notify_mode_disconnect(self, data=None): self._stack.disconnect(self._on_notify_model_id) def _on_notify_mode(self, stack, param): #Slide out artist list on switching to artists view if stack.get_visible_child() == self.views[1]: stack.get_visible_child().stack.set_visible_child_name('dummy') stack.get_visible_child().stack.set_visible_child_name('artists') self._show_searchbar(False) def _toggle_view(self, btn, i): self._stack.set_visible_child(self.views[i]) def _on_search_toggled(self, button, data=None): self._show_searchbar(button.get_active()) def _show_searchbar(self, show): self.toolbar.searchbar.set_reveal_child(show) self.toolbar._search_button.set_active(show) if show: self.toolbar.searchbar._search_entry.grab_focus() else: self.toolbar.searchbar._search_entry.set_text('')
class Window(Gtk.ApplicationWindow): def __init__(self, app): Gtk.ApplicationWindow.__init__(self, application=app, title=_("Music")) self.connect('focus-in-event', self._windows_focus_cb) self.settings = Gio.Settings('org.gnome.Music') self.add_action(self.settings.create_action('repeat')) self.set_size_request(887, 640) size_setting = self.settings.get_value('window-size') if isinstance(size_setting[0], int) and isinstance(size_setting[1], int): self.resize(size_setting[0], size_setting[1]) position_setting = self.settings.get_value('window-position') if len(position_setting) == 2 \ and isinstance(position_setting[0], int) \ and isinstance(position_setting[1], int): self.move(position_setting[0], position_setting[1]) if self.settings.get_value('window-maximized'): self.maximize() self.connect("window-state-event", self.on_window_state_event) self.connect("configure-event", self.on_configure_event) self._setup_view() self.proxy = Gio.DBusProxy.new_sync(Gio.bus_get_sync(Gio.BusType.SESSION, None), Gio.DBusProxyFlags.NONE, None, 'org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon/MediaKeys', 'org.gnome.SettingsDaemon.MediaKeys', None) self._grab_media_player_keys() self.proxy.connect('g-signal', self._handle_media_keys) def on_configure_event(self, widget, event): size = widget.get_size() self.settings.set_value('window-size', GLib.Variant('ai', [size[0], size[1]])) position = widget.get_position() self.settings.set_value('window-position', GLib.Variant('ai', [position[0], position[1]])) def on_window_state_event(self, widget, event): self.settings.set_boolean('window-maximized', 'GDK_WINDOW_STATE_MAXIMIZED' in event.new_window_state.value_names) def _grab_media_player_keys(self): self.proxy.call_sync('GrabMediaPlayerKeys', GLib.Variant('(su)', ('Music', 0)), Gio.DBusCallFlags.NONE, -1, None) def _windows_focus_cb(self, window, event): self._grab_media_player_keys() def _handle_media_keys(self, proxy, sender, signal, parameters): if signal != 'MediaPlayerKeyPressed': print('Received an unexpected signal \'%s\' from media player'.format(signal)) return response = parameters.get_child_value(1).get_string() if 'Play' in response: self.player.play_pause() elif 'Stop' in response: self.player.Stop() elif 'Next' in response: self.player.play_next() elif 'Previous' in response: self.player.play_previous() def _setup_view(self): self._box = Gtk.VBox() self.player = Player() self.selection_toolbar = SelectionToolbar() self.toolbar = Toolbar() self.views = [] self._stack = Stack( transition_type=StackTransitionType.CROSSFADE, transition_duration=100, visible=True) if Gtk.get_minor_version() > 8: self.set_titlebar(self.toolbar.header_bar) else: self._box.pack_start(self.toolbar.header_bar, False, False, 0) self.set_hide_titlebar_when_maximized(True) self._box.pack_start(self.toolbar.searchbar, False, False, 0) self._box.pack_start(self._stack, True, True, 0) self._box.pack_start(self.player.eventBox, False, False, 0) self._box.pack_start(self.selection_toolbar.eventbox, False, False, 0) self.add(self._box) count = 1 cursor = tracker.query(Query.SONGS_COUNT, None) if cursor is not None and cursor.next(None): count = cursor.get_integer(0) if count > 0: self.views.append(Views.Albums(self.toolbar, self.selection_toolbar, self.player)) self.views.append(Views.Artists(self.toolbar, self.selection_toolbar, self.player)) self.views.append(Views.Songs(self.toolbar, self.selection_toolbar, self.player)) #self.views.append(Views.Playlist(self.toolbar, self.selection_toolbar, self.player)) for i in self.views: self._stack.add_titled(i, i.title, i.title) self.toolbar.set_stack(self._stack) self.toolbar.searchbar.show() self._on_notify_model_id = self._stack.connect('notify::visible-child', self._on_notify_mode) self.connect('destroy', self._notify_mode_disconnect) self.connect('key_press_event', self._on_key_press) self.views[0].populate() #To revert to the No Music View when no songs are found else: self.views.append(Views.Empty(self.toolbar, self.player)) self._stack.add_titled(self.views[0], _("Empty"), _("Empty")) self.toolbar._search_button.connect('toggled', self._on_search_toggled) self.toolbar.set_state(ToolbarState.ALBUMS) self.toolbar.header_bar.show() self.player.eventBox.show_all() self._box.show() self.show() def _on_key_press(self, widget, event): modifiers = Gtk.accelerator_get_default_mod_mask() if (event.keyval == Gdk.KEY_f and (event.state & modifiers) == Gdk.ModifierType.CONTROL_MASK): self._show_searchbar(not self.toolbar.searchbar.get_child_revealed()) elif (event.keyval == Gdk.KEY_Escape and (event.state & modifiers) == 0): self._show_searchbar(False) if self.toolbar._selectionMode: self.toolbar.set_selection_mode(False) def _notify_mode_disconnect(self, data=None): self._stack.disconnect(self._on_notify_model_id) def _on_notify_mode(self, stack, param): #Slide out artist list on switching to artists view if stack.get_visible_child() == self.views[1]: stack.get_visible_child().stack.set_visible_child_name('dummy') stack.get_visible_child().stack.set_visible_child_name('artists') self._show_searchbar(False) def _toggle_view(self, btn, i): self._stack.set_visible_child(self.views[i]) def _on_search_toggled(self, button, data=None): self._show_searchbar(button.get_active()) def _show_searchbar(self, show): self.toolbar.searchbar.set_reveal_child(show) self.toolbar._search_button.set_active(show) if show: self.toolbar.searchbar._search_entry.grab_focus() else: self.toolbar.searchbar._search_entry.set_text('')
class Window(Gtk.ApplicationWindow): def __init__(self, app): Gtk.ApplicationWindow.__init__(self, application=app, title="Earthquake") self.setup_view() """ self.button = Gtk.Button(label="Play") self.button.connect("clicked", self.on_button_clicked) """ def setup_view(self): self._box = Gtk.VBox() self.toolbar = Toolbar() self.toolbar2 = Toolbar() self.views = [] self._stack = Stack( transition_type=StackTransitionType.CROSSFADE, transition_duration=100, visible=True) self.set_titlebar(self.toolbar.header_bar) self._box.pack_start(self.toolbar.searchbar, False, False, 0) self._box.pack_start(self._stack, True, True, 0) self.add(self._box) count = 1 plugins = Plugins() #self.views.append(Views.ElementView(self.toolbar, _("All"), all_plugins)) """" for cat in cats: self.views.append(Views.ElementView(self.toolbar, _(cat), plugins.get_by_cat(cat))) """ input_plugins = {} suffixes = [("Bins", "bin"), ("Decoders", "dec"), ("Demuxers", "demux"), ("Parsers", "parse"), ("Sources", "src")] for suffix in suffixes: input_plugins[suffix[0]] = plugins.get_by_suffix(suffix[1]) self.views.append(Views.ElementStackView(self.toolbar, "Input", input_plugins)) output_plugins = {} suffixes2 = [("Encoders", "enc"), ("Muxers", "mux"), ("Sinks", "sink")] for suffix in suffixes2: output_plugins[suffix[0]] = plugins.get_by_suffix(suffix[1]) self.views.append(Views.ElementStackView(self.toolbar, "Output", output_plugins)) lib_plugins = {} submodules = ["frei0r", "libav", "opengl", "effectv", "gnonlin", "rtp", "libvisual", "audiofx", "videofilter", "gaudieffects", "coreelements", "rtpmanager", "geometrictransform"] for submodule in submodules: lib_plugins[submodule] = plugins.get_by_cat(submodule) self.views.append(Views.ElementStackView(self.toolbar, "Libs", lib_plugins)) self.views.append(Views.ElementView(self.toolbar, _("Misc"), plugins.get_rest())) for i in self.views: self._stack.add_titled(i, i.title, i.title) self.toolbar.set_stack(self._stack) self.toolbar.searchbar.show() self.toolbar._search_button.connect('toggled', self._on_search_toggled) self.toolbar.set_state(ToolbarState.ALBUMS) self.toolbar.header_bar.show() self._box.show() self.show() def init_gst(self): Gst.init(None) self.pipeline = Gst.Pipeline.new("pipeline") videotestsrc = Gst.ElementFactory.make("videotestsrc", "src") glimagesink = Gst.ElementFactory.make("autovideosink", "sink") self.pipeline.add(videotestsrc) self.pipeline.add(glimagesink) Gst.Element.link(videotestsrc, glimagesink) def on_button_clicked(self, widget): if self.playing: self.pipeline.set_state(Gst.State.PAUSED) self.playing = False self.button.set_label("Play") else: self.pipeline.set_state(Gst.State.PLAYING) self.playing = True self.button.set_label("Pause") def _toggle_view(self, btn, i): self._stack.set_visible_child(self.views[i]) def _on_search_toggled(self, button, data=None): self._show_searchbar(button.get_active()) def _show_searchbar(self, show): self.toolbar.searchbar.set_reveal_child(show) self.toolbar._search_button.set_active(show) if show: self.toolbar.searchbar._search_entry.grab_focus() else: self.toolbar.searchbar._search_entry.set_text('')
class Window(Gtk.ApplicationWindow): def __init__(self, app): Gtk.ApplicationWindow.__init__(self, application=app, title=_("Music")) self.connect('focus-in-event', self._windows_focus_cb) self.settings = Gio.Settings.new('org.gnome.Music') self.add_action(self.settings.create_action('repeat')) selectAll = Gio.SimpleAction.new('selectAll', None) selectAll.connect('activate', self._on_select_all) self.add_action(selectAll) selectNone = Gio.SimpleAction.new('selectNone', None) selectNone.connect('activate', self._on_select_none) self.add_action(selectNone) self.set_size_request(200, 100) size_setting = self.settings.get_value('window-size') if isinstance(size_setting[0], int) and isinstance(size_setting[1], int): self.resize(size_setting[0], size_setting[1]) position_setting = self.settings.get_value('window-position') if len(position_setting) == 2 \ and isinstance(position_setting[0], int) \ and isinstance(position_setting[1], int): self.move(position_setting[0], position_setting[1]) if self.settings.get_value('window-maximized'): self.maximize() self.connect("window-state-event", self._on_window_state_event) self.connect("configure-event", self._on_configure_event) self._setup_view() self.proxy = Gio.DBusProxy.new_sync(Gio.bus_get_sync(Gio.BusType.SESSION, None), Gio.DBusProxyFlags.NONE, None, 'org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon/MediaKeys', 'org.gnome.SettingsDaemon.MediaKeys', None) self._grab_media_player_keys() try: self.proxy.connect('g-signal', self._handle_media_keys) except GLib.GError: # We cannot grab media keys if no settings daemon is running pass def _on_configure_event(self, widget, event): size = widget.get_size() self.settings.set_value('window-size', GLib.Variant('ai', [size[0], size[1]])) position = widget.get_position() self.settings.set_value('window-position', GLib.Variant('ai', [position[0], position[1]])) def _on_window_state_event(self, widget, event): self.settings.set_boolean('window-maximized', 'GDK_WINDOW_STATE_MAXIMIZED' in event.new_window_state.value_names) def _grab_media_player_keys(self): try: self.proxy.call_sync('GrabMediaPlayerKeys', GLib.Variant('(su)', ('Music', 0)), Gio.DBusCallFlags.NONE, -1, None) except GLib.GError: # We cannot grab media keys if no settings daemon is running pass def _windows_focus_cb(self, window, event): self._grab_media_player_keys() def _handle_media_keys(self, proxy, sender, signal, parameters): if signal != 'MediaPlayerKeyPressed': print('Received an unexpected signal \'%s\' from media player'.format(signal)) return response = parameters.get_child_value(1).get_string() if 'Play' in response: self.player.play_pause() elif 'Stop' in response: self.player.Stop() elif 'Next' in response: self.player.play_next() elif 'Previous' in response: self.player.play_previous() def _setup_view(self): self._box = Gtk.VBox() self.player = Player() self.selection_toolbar = SelectionToolbar() self.toolbar = Toolbar() self.views = [] self._stack = Stack( transition_type=StackTransitionType.CROSSFADE, transition_duration=100, visible=True) if Gtk.get_minor_version() > 8: self.set_titlebar(self.toolbar.header_bar) else: self._box.pack_start(self.toolbar.header_bar, False, False, 0) self.set_hide_titlebar_when_maximized(True) self._box.pack_start(self.toolbar.searchbar, False, False, 0) self._box.pack_start(self._stack, True, True, 0) self._box.pack_start(self.player.eventBox, False, False, 0) self._box.pack_start(self.selection_toolbar.eventbox, False, False, 0) self.add(self._box) count = 1 cursor = tracker.query(Query.SONGS_COUNT, None) if cursor is not None and cursor.next(None): count = cursor.get_integer(0) if count > 0: self.views.append(Views.Albums(self.toolbar, self.selection_toolbar, self.player)) self.views.append(Views.Artists(self.toolbar, self.selection_toolbar, self.player)) self.views.append(Views.Songs(self.toolbar, self.selection_toolbar, self.player)) self.views.append(Views.Playlist(self.toolbar, self.selection_toolbar, self.player)) for i in self.views: self._stack.add_titled(i, i.title, i.title) self.toolbar.set_stack(self._stack) self.toolbar.searchbar.show() self._on_notify_model_id = self._stack.connect('notify::visible-child', self._on_notify_mode) self.connect('destroy', self._notify_mode_disconnect) self.connect('key_press_event', self._on_key_press) self.views[0].populate() #To revert to the No Music View when no songs are found else: self.views.append(Views.Empty(self.toolbar, self.player)) self._stack.add_titled(self.views[0], _("Empty"), _("Empty")) self.toolbar._search_button.set_sensitive(False) self.toolbar._select_button.set_sensitive(False) self.toolbar._search_button.connect('toggled', self._on_search_toggled) self.toolbar.connect('selection-mode-changed', self._on_selection_mode_changed) self.selection_toolbar._add_to_playlist_button.connect( 'clicked', self._on_add_to_playlist_button_clicked) self.selection_toolbar._remove_from_playlist_button.connect( 'clicked', self._on_remove_from_playlist_button_clicked) self.toolbar.set_state(ToolbarState.ALBUMS) self.toolbar.header_bar.show() self.player.eventBox.show_all() self._box.show() self.show() def _on_select_all(self, action, param): if self.toolbar._state != ToolbarState.SINGLE: model = self._stack.get_visible_child()._model else: model = self._stack.get_visible_child()._albumWidget.model _iter = model.get_iter_first() count = 0 while _iter is not None: model.set(_iter, [6], [True]) _iter = model.iter_next(_iter) count = count + 1 if count > 0: self.toolbar._selection_menu_label.set_text( ngettext(_("Selected %d item"), _("Selected %d items"), count) % count) self.selection_toolbar._add_to_playlist_button.set_sensitive(True) self.selection_toolbar._remove_from_playlist_button.set_sensitive(True) elif count == 0: self.toolbar._selection_menu_label.set_text(_("Click on items to select them")) def _on_select_none(self, action, param): if self.toolbar._state != ToolbarState.SINGLE: model = self._stack.get_visible_child()._model else: model = self._stack.get_visible_child()._albumWidget.model _iter = model.get_iter_first() self.selection_toolbar._add_to_playlist_button.set_sensitive(False) self.selection_toolbar._remove_from_playlist_button.set_sensitive(False) while _iter is not None: model.set(_iter, [6], [False]) _iter = model.iter_next(_iter) self.toolbar._selection_menu_label.set_text(_("Click on items to select them")) def _on_key_press(self, widget, event): modifiers = Gtk.accelerator_get_default_mod_mask() if (event.keyval == Gdk.KEY_f and (event.state & modifiers) == Gdk.ModifierType.CONTROL_MASK): self.toolbar.searchbar.toggle_bar() elif (event.keyval == Gdk.KEY_Escape and (event.state & modifiers) == 0): self.toolbar.searchbar.show_bar(False) if self.toolbar._selectionMode: self.toolbar.set_selection_mode(False) elif (event.state & modifiers) == 0 and \ event.keyval in range(33, 126) and \ not self.toolbar.searchbar.get_reveal_child(): self.toolbar.searchbar.show_bar(True) def _notify_mode_disconnect(self, data=None): self._stack.disconnect(self._on_notify_model_id) def _on_notify_mode(self, stack, param): #Slide out artist list on switching to artists view if stack.get_visible_child() == self.views[1] or \ stack.get_visible_child() == self.views[3]: stack.get_visible_child().stack.set_visible_child_name('dummy') stack.get_visible_child().stack.set_visible_child_name('sidebar') self.toolbar.searchbar.show_bar(False) def _toggle_view(self, btn, i): self._stack.set_visible_child(self.views[i]) def _on_search_toggled(self, button, data=None): self.toolbar.searchbar.show_bar(button.get_active()) def _on_selection_mode_changed(self, widget, data=None): if self.toolbar._selectionMode: in_playlist = self._stack.get_visible_child() == self.views[3] self.selection_toolbar._add_to_playlist_button.set_visible(not in_playlist) self.selection_toolbar._remove_from_playlist_button.set_visible(in_playlist) def _on_add_to_playlist_button_clicked(self, widget): if self._stack.get_visible_child() == self.views[3]: return def callback(selected_uris): if len(selected_uris) < 1: return add_to_playlist = Widgets.PlaylistDialog(self) if add_to_playlist.dialog_box.run() == Gtk.ResponseType.ACCEPT: playlist.add_to_playlist( add_to_playlist.get_selected(), selected_uris) self.toolbar.set_selection_mode(False) add_to_playlist.dialog_box.destroy() self._stack.get_visible_child().get_selected_track_uris(callback) def _on_remove_from_playlist_button_clicked(self, widget): if self._stack.get_visible_child() != self.views[3]: return def callback(selected_uris): if len(selected_uris) < 1: return playlist.remove_from_playlist( self.views[3].current_playlist, selected_uris) self.toolbar.set_selection_mode(False) self._stack.get_visible_child().get_selected_track_uris(callback)