Esempio n. 1
0
    def setUp(self):
        quodlibet.config.init()

        self.order = None
        self.volume = 0
        self.replaygain_profiles = [None, None, None]
        self.reset_replaygain = lambda: None
        self.po = PlayOrderWidget(self, self)
Esempio n. 2
0
class TPlayOrderWidget(TestCase):

    def setUp(self):
        quodlibet.config.init()

        self.order = None
        self.volume = 0
        self.replaygain_profiles = [None, None, None]
        self.reset_replaygain = lambda: None
        self.po = PlayOrderWidget(self, self)

    def tearDown(self):
        self.po.destroy()
        # quodlibet.plugins.quit()
        quodlibet.config.quit()

    def test_initial(self):
        self.failIf(self.po.repeated)
        self.failIf(self.po.shuffled)
        self.failUnless(isinstance(self.po.order, OrderInOrder))
        self.failUnless(self.replaygain_profiles[2], ["album", "track"])

    def test_replay_gain(self):
        self.po.shuffled = True
        self.po.shuffler = OrderWeighted
        self.failUnlessEqual(self.replaygain_profiles[2], ["track"])
        self.po.shuffled = False
        self.failUnlessEqual(self.replaygain_profiles[2], ["album", "track"])

    def test_get_name(self):
        orders = [OrderShuffle, OrderWeighted]
        for order in orders:
            self.po.shuffler = order
            self.failUnlessEqual(self.po.shuffler, order)

    def test_shuffle(self):
        self.failIf(self.po.repeated)
        self.po.shuffled = True
        self.assertTrue(self.po.shuffled)
        self.assertEqual(self.po.shuffler, OrderShuffle)
        self.failUnless(isinstance(self.order, OrderShuffle))

    def test_shuffle_defaults_to_inorder(self):
        self.po.shuffler = OrderWeighted
        self.po.shuffled = False
        self.failUnlessEqual(type(self.po.order), OrderInOrder)
        self.po.shuffled = True
        self.assertEqual(self.po.shuffler, OrderWeighted)
        self.failUnlessEqual(type(self.po.order), OrderWeighted)
Esempio n. 3
0
class TPlayOrderWidget(TestCase):
    def setUp(self):
        quodlibet.config.init()

        self.order = None
        self.volume = 0
        self.replaygain_profiles = [None, None, None]
        self.reset_replaygain = lambda: None
        self.po = PlayOrderWidget(self, self)

    def tearDown(self):
        self.po.destroy()
        # quodlibet.plugins.quit()
        quodlibet.config.quit()

    def test_initial(self):
        self.failIf(self.po.repeated)
        self.failIf(self.po.shuffled)
        self.failUnless(isinstance(self.po.order, OrderInOrder))
        self.failUnless(self.replaygain_profiles[2], ["album", "track"])

    def test_replay_gain(self):
        self.po.shuffled = True
        self.po.shuffler = OrderWeighted
        self.failUnlessEqual(self.replaygain_profiles[2], ["track"])
        self.po.shuffled = False
        self.failUnlessEqual(self.replaygain_profiles[2], ["album", "track"])

    def test_get_name(self):
        orders = [OrderShuffle, OrderWeighted]
        for order in orders:
            self.po.shuffler = order
            self.failUnlessEqual(self.po.shuffler, order)

    def test_shuffle(self):
        self.failIf(self.po.repeated)
        self.po.shuffled = True
        self.assertTrue(self.po.shuffled)
        self.assertEqual(self.po.shuffler, OrderShuffle)
        self.failUnless(isinstance(self.order, OrderShuffle))

    def test_shuffle_defaults_to_inorder(self):
        self.po.shuffler = OrderWeighted
        self.po.shuffled = False
        self.failUnlessEqual(type(self.po.order), OrderInOrder)
        self.po.shuffled = True
        self.assertEqual(self.po.shuffler, OrderWeighted)
        self.failUnlessEqual(type(self.po.order), OrderWeighted)
Esempio n. 4
0
    def setUp(self):
        quodlibet.config.init()

        self.order = None
        self.volume = 0
        self.replaygain_profiles = [None, None, None]
        self.reset_replaygain = lambda: None
        self.po = PlayOrderWidget(self, self)
Esempio n. 5
0
    def __init__(self, library, player, headless=False, restore_cb=None):
        super().__init__(dialog=False)

        self.__destroyed = False
        self.__update_title(player)
        self.set_default_size(600, 480)

        main_box = Gtk.VBox()
        self.add(main_box)
        self.side_book = qltk.Notebook()

        # get the playlist up before other stuff
        self.songlist = MainSongList(library, player)
        self.songlist.connect("key-press-event", self.__songlist_key_press)
        self.songlist.connect_after('drag-data-received',
                                    self.__songlist_drag_data_recv)
        self.song_scroller = ScrolledWindow()
        self.song_scroller.set_policy(Gtk.PolicyType.AUTOMATIC,
                                      Gtk.PolicyType.AUTOMATIC)
        self.song_scroller.set_shadow_type(Gtk.ShadowType.IN)
        self.song_scroller.add(self.songlist)

        self.qexpander = QueueExpander(library, player)
        self.qexpander.set_no_show_all(True)
        self.qexpander.set_visible(config.getboolean("memory", "queue"))

        def on_queue_visible(qex, param):
            config.set("memory", "queue", str(qex.get_visible()))

        self.qexpander.connect("notify::visible", on_queue_visible)

        self.playlist = PlaylistMux(player, self.qexpander.model,
                                    self.songlist.model)

        self.__player = player
        # create main menubar, load/restore accelerator groups
        self.__library = library
        ui = self.__create_menu(player, library)
        accel_group = ui.get_accel_group()
        self.add_accel_group(accel_group)

        def scroll_and_jump(*args):
            self.__jump_to_current(True, None, True)

        keyval, mod = Gtk.accelerator_parse("<Primary><shift>J")
        accel_group.connect(keyval, mod, 0, scroll_and_jump)

        # custom accel map
        accel_fn = os.path.join(quodlibet.get_user_dir(), "accels")
        Gtk.AccelMap.load(accel_fn)
        # save right away so we fill the file with example comments of all
        # accels
        Gtk.AccelMap.save(accel_fn)

        menubar = ui.get_widget("/Menu")

        # Since https://git.gnome.org/browse/gtk+/commit/?id=b44df22895c79
        # toplevel menu items show an empty 16x16 image. While we don't
        # need image items there UIManager creates them by default.
        # Work around by removing the empty GtkImages
        for child in menubar.get_children():
            if isinstance(child, Gtk.ImageMenuItem):
                child.set_image(None)

        main_box.pack_start(menubar, False, True, 0)

        top_bar = TopBar(self, player, library)
        main_box.pack_start(top_bar, False, True, 0)
        self.top_bar = top_bar

        self.__browserbox = Align(bottom=3)
        self.__paned = paned = ConfigRHPaned("memory", "sidebar_pos", 0.25)
        paned.pack1(self.__browserbox, resize=True)
        # We'll pack2 when necessary (when the first sidebar plugin is set up)

        main_box.pack_start(paned, True, True, 0)

        play_order = PlayOrderWidget(self.songlist.model, player)
        statusbox = StatusBarBox(play_order, self.qexpander)
        self.order = play_order
        self.statusbar = statusbox.statusbar

        main_box.pack_start(Align(statusbox, border=3, top=-3), False, True, 0)

        self.songpane = SongListPaned(self.song_scroller, self.qexpander)
        self.songpane.show_all()

        try:
            orders = []
            for e in config.getstringlist('memory', 'sortby', []):
                orders.append((e[1:], int(e[0])))
        except ValueError:
            pass
        else:
            self.songlist.set_sort_orders(orders)

        self.browser = None
        self.ui = ui

        main_box.show_all()

        self._playback_error_dialog = None
        connect_destroy(player, 'song-started', self.__song_started)
        connect_destroy(player, 'paused', self.__update_paused, True)
        connect_destroy(player, 'unpaused', self.__update_paused, False)
        # make sure we redraw all error indicators before opening
        # a dialog (blocking the main loop), so connect after default handlers
        connect_after_destroy(player, 'error', self.__player_error)
        # connect after to let SongTracker update stats
        connect_after_destroy(player, "song-ended", self.__song_ended)

        # set at least the playlist. the song should be restored
        # after the browser emits the song list
        player.setup(self.playlist, None, 0)
        self.__restore_cb = restore_cb
        self.__first_browser_set = True

        restore_browser = not headless
        try:
            self._select_browser(self, config.get("memory", "browser"),
                                 library, player, restore_browser)
        except:
            config.set("memory", "browser", browsers.name(browsers.default))
            config.save()
            raise

        self.songlist.connect('popup-menu', self.__songs_popup_menu)
        self.songlist.connect('columns-changed', self.__cols_changed)
        self.songlist.connect('columns-changed', self.__hide_headers)
        self.songlist.info.connect("changed", self.__set_totals)

        lib = library.librarian
        connect_destroy(lib, 'changed', self.__song_changed, player)

        targets = [("text/uri-list", Gtk.TargetFlags.OTHER_APP, DND_URI_LIST)]
        targets = [Gtk.TargetEntry.new(*t) for t in targets]

        self.drag_dest_set(Gtk.DestDefaults.ALL, targets, Gdk.DragAction.COPY)
        self.connect('drag-data-received', self.__drag_data_received)

        if not headless:
            on_first_map(self, self.__configure_scan_dirs, library)

        if config.getboolean('library', 'refresh_on_start'):
            self.__rebuild(None, False)

        self.connect("key-press-event", self.__key_pressed, player)

        self.connect("destroy", self.__destroy)

        self.enable_window_tracking("quodlibet")