Exemplo n.º 1
0
 def _show_subtoolbar(self, show):
     """
         Show/hide subtoolbar
         @param show as bool
     """
     is_visible = self._subtoolbar.is_visible()
     if show and not is_visible:
         mini = MiniPlayer()
         mini.show()
         self._subtoolbar.add(mini)
         self._subtoolbar.show()
     elif not show and is_visible:
         children = self._subtoolbar.get_children()
         if children:
             children[0].destroy()
         self._subtoolbar.hide()
Exemplo n.º 2
0
 def _show_subtoolbar(self, show):
     """
         Show/hide subtoolbar
         @param show as bool
     """
     is_visible = self._subtoolbar.is_visible()
     if show and not is_visible:
         mini = MiniPlayer()
         mini.show()
         self._subtoolbar.add(mini)
         self._subtoolbar.show()
     elif not show and is_visible:
         children = self._subtoolbar.get_children()
         if children:
             children[0].destroy()
         self._subtoolbar.hide()
Exemplo n.º 3
0
 def _show_miniplayer(self, show):
     """
         Show/hide miniplayer
         @param show as bool
     """
     mini = self._main_stack.get_child_by_name("mini")
     if show:
         if mini is not None:
             if self._timeout is not None:
                 GLib.source_remove(self._timeout)
         else:
             mini = MiniPlayer()
             self._main_stack.add_named(mini, "mini")
         self._timeout = None
         mini.show()
         self._main_stack.set_visible_child_name("mini")
         self._toolbar.set_show_close_button(False)
     elif mini is not None and not show and self._timeout is None:
         self._main_stack.set_visible_child_name("main")
         self._toolbar.set_show_close_button(not Lp().settings.get_value("disable-csd"))
         self._timeout = GLib.timeout_add(1000, mini.destroy)
Exemplo n.º 4
0
 def _show_miniplayer(self, show):
     """
         Show/hide miniplayer
         @param show as bool
     """
     mini = self._main_stack.get_child_by_name('mini')
     if show:
         if mini is not None:
             if self._timeout is not None:
                 GLib.source_remove(self._timeout)
         else:
             mini = MiniPlayer()
             self._main_stack.add_named(mini, 'mini')
         self._timeout = None
         mini.show()
         self._main_stack.set_visible_child_name('mini')
         self._toolbar.set_show_close_button(False)
     elif mini is not None and not show and self._timeout is None:
         self._main_stack.set_visible_child_name('main')
         self._toolbar.set_show_close_button(
             not Lp().settings.get_value('disable-csd'))
         self._timeout = GLib.timeout_add(1000, mini.destroy)
Exemplo n.º 5
0
 def __show_miniplayer(self, show):
     """
         Show/hide miniplayer
         @param show as bool
     """
     mini = self.__main_stack.get_child_by_name("mini")
     if show:
         if mini is not None:
             if self.__timeout is not None:
                 GLib.source_remove(self.__timeout)
         else:
             from lollypop.miniplayer import MiniPlayer
             mini = MiniPlayer()
             self.__main_stack.add_named(mini, "mini")
         self.__timeout = None
         mini.show()
         self.__main_stack.set_visible_child_name("mini")
         self.__toolbar.set_show_close_button(False)
     elif mini is not None and not show and self.__timeout is None:
         self.__main_stack.set_visible_child_name("main")
         self.__toolbar.set_show_close_button(
             not Lp().settings.get_value("disable-csd") and not is_unity())
         self.__timeout = GLib.timeout_add(1000, mini.destroy)
Exemplo n.º 6
0
 def __show_miniplayer(self, show):
     """
         Show/hide miniplayer
         @param show as bool
     """
     mini = self.__main_stack.get_child_by_name('mini')
     if show:
         if mini is not None:
             if self.__timeout is not None:
                 GLib.source_remove(self.__timeout)
         else:
             from lollypop.miniplayer import MiniPlayer
             mini = MiniPlayer()
             self.__main_stack.add_named(mini, 'mini')
         self.__timeout = None
         mini.show()
         self.__main_stack.set_visible_child_name('mini')
         self.__toolbar.set_show_close_button(False)
     elif mini is not None and not show and self.__timeout is None:
         self.__main_stack.set_visible_child_name('main')
         self.__toolbar.set_show_close_button(
                             not Lp().settings.get_value('disable-csd') and
                             not is_unity())
         self.__timeout = GLib.timeout_add(1000, mini.destroy)
Exemplo n.º 7
0
class Window(Gtk.ApplicationWindow, SignalsHelper):
    """
        Main window
    """
    @signals_map
    def __init__(self):
        """
            Init window
        """
        Gtk.ApplicationWindow.__init__(self,
                                       application=App(),
                                       title="Lollypop",
                                       icon_name="org.gnome.Lollypop")
        self.__miniplayer = None
        self.__configure_timeout_id = None
        self.set_auto_startup_notification(False)
        self.connect("realize", self.__on_realize)
        # Does not work with a Gtk.Gesture in GTK3
        self.connect("button-release-event", self.__on_button_release_event)
        self.connect("window-state-event", self.__on_window_state_event)
        self.connect("configure-event", self.__on_configure_event)
        self.connect("destroy", self.__on_destroy)
        return [(App().player, "current-changed", "_on_current_changed")]

    def setup(self):
        """
            Setup window content
        """
        self.__vgrid = Gtk.Grid()
        self.__vgrid.set_orientation(Gtk.Orientation.VERTICAL)
        self.__vgrid.show()
        self.__container = Container()
        self.__container.setup()
        self.__container.show()
        self.__toolbar = Toolbar(self)
        self.__toolbar.show()
        if App().settings.get_value("disable-csd") or is_unity():
            self.__vgrid.add(self.__toolbar)
        else:
            self.set_titlebar(self.__toolbar)
            self.__toolbar.set_show_close_button(
                not App().settings.get_value("disable-csd"))
        self.__vgrid.add(self.__container)
        self.add(self.__vgrid)
        self.__container.widget.connect("notify::folded",
                                        self.__on_container_folded)

    def show_miniplayer(self, show, reveal=False):
        """
            Show/hide subtoolbar
            @param show as bool
            @param reveal as bool
        """
        def show_buttons(show):
            if show:
                self.toolbar.end.show()
                self.toolbar.playback.show()
            else:
                self.toolbar.end.hide()
                self.toolbar.playback.hide()

        def on_revealed(miniplayer, revealed):
            miniplayer.set_vexpand(revealed)
            show_buttons(not revealed)
            if revealed:
                self.__container.hide()
                emit_signal(self.__container, "can-go-back-changed", False)
            else:
                self.__container.show()
                emit_signal(self.__container, "can-go-back-changed",
                            self.__container.can_go_back)

        if show and self.__miniplayer is None:
            from lollypop.miniplayer import MiniPlayer
            self.__miniplayer = MiniPlayer()
            if App().player.current_track.id is not None:
                self.__miniplayer.show()
            self.__miniplayer.connect("revealed", on_revealed)
            self.__vgrid.add(self.__miniplayer)
            self.__miniplayer.set_vexpand(False)
        elif not show and self.__miniplayer is not None:
            if App().lookup_action("miniplayer").get_state():
                App().lookup_action("miniplayer").change_state(
                    GLib.Variant("b", False))
            else:
                self.__miniplayer.destroy()
                self.__miniplayer = None
                self.__container.show()
                show_buttons(True)
        if self.__miniplayer is not None:
            if reveal:
                self.__miniplayer.reveal(True)
            else:
                self.__miniplayer.update_artwork()

    @property
    def folded(self):
        """
            True if window is adaptive, ie widget folded
        """
        return App().window.container.widget.get_folded()

    @property
    def miniplayer(self):
        """
            @return MiniPlayer
        """
        return self.__miniplayer

    @property
    def toolbar(self):
        """
            @return Toolbar
        """
        return self.__toolbar

    @property
    def container(self):
        """
            @return Container
        """
        return self.__container

##############
# PROTECTED  #
##############

    def _on_current_changed(self, player):
        """
            Update toolbar
            @param player as Player
        """
        if App().player.current_track.id is None:
            self.set_title("Lollypop")
        else:
            artists = ", ".join(player.current_track.artists)
            self.set_title("%s - %s" % (artists, player.current_track.name))
            if self.__miniplayer is not None:
                self.__miniplayer.show()

    def _on_configure_event_timeout(self, width, height, x, y):
        """
            Setup content based on current size
            @param width as int
            @param height as int
            @param x as int
            @param y as int
        """
        self.__configure_timeout_id = None
        if App().lookup_action("miniplayer").get_state():
            return
        if not self.is_maximized():
            # Keep a minimal height
            if height < AdaptiveSize.SMALL:
                height = AdaptiveSize.SMALL
            App().settings.set_value("window-size",
                                     GLib.Variant("ai", [width, height]))
        App().settings.set_value("window-position", GLib.Variant("ai", [x, y]))

############
# PRIVATE  #
############

    def __setup_size_and_position(self):
        """
            Setup window position and size, callbacks
        """
        try:
            size = App().settings.get_value("window-size")
            pos = App().settings.get_value("window-position")
            self.resize(size[0], size[1])
            self.move(pos[0], pos[1])
            if App().settings.get_value("window-maximized"):
                self.maximize()
        except Exception as e:
            Logger.error("Window::__setup_size_and_position(): %s", e)

    def __on_realize(self, window):
        """
            Init window content
            @param window as Gtk.Window
        """
        self.__setup_size_and_position()
        if App().settings.get_value("auto-update") or App().tracks.is_empty():
            # Delayed, make python segfault on sys.exit() otherwise
            # No idea why, maybe scanner using Gstpbutils before Gstreamer
            # initialisation is finished...
            GLib.timeout_add(1000, App().scanner.update, ScanType.FULL)

    def __on_button_release_event(self, window, event):
        """
            Handle special mouse buttons
            @param window as Gtk.Window
            @param event as Gdk.EventButton
        """
        if event.button == 8:
            App().window.container.go_back()
            return True

    def __on_window_state_event(self, widget, event):
        """
            Save maximised state
        """
        if not App().lookup_action("miniplayer").get_state():
            App().settings.set_boolean(
                "window-maximized", "GDK_WINDOW_STATE_MAXIMIZED"
                in event.new_window_state.value_names)

    def __on_container_folded(self, leaflet, folded):
        """
            show/hide miniplayer
            @param leaflet as Handy.Leaflet
            @param folded as Gparam
        """
        self.show_miniplayer(App().window.folded)

    def __on_destroy(self, widget):
        """
            Remove ref cycle, just to prevent output on DEBUG_LEAK
            @param widget as Gtk.Widget
        """
        self.__toolbar = None

    def __on_configure_event(self, window, event):
        """
            Delay event
            @param window as Gtk.Window
            @param event as Gdk.EventConfigure
        """
        if self.__configure_timeout_id:
            GLib.source_remove(self.__configure_timeout_id)
        (width, height) = window.get_size()
        (x, y) = window.get_position()
        self.__configure_timeout_id = GLib.idle_add(
            self._on_configure_event_timeout,
            width,
            height,
            x,
            y,
            priority=GLib.PRIORITY_LOW)