Esempio n. 1
0
def create_rating_slider(cache):
    """Create a readily configured rating slider, with an appropiate size.
    """
    star_slider = StarSlider(stars=5)

    # This is a bit of a hack:
    def _set_rating():
        star_slider.stars = cache.rating

    GLib.idle_add(_set_rating)

    star_slider.set_size_request(17 * star_slider.width_multiplier(), 10)
    return star_slider
Esempio n. 2
0
    def __init__(self):
        Gtk.HBox.__init__(self)
        self.set_margin_right(5)
        self.set_margin_bottom(5)

        # Add button:
        self._add_button = Gtk.Button()
        self._add_button.set_image(
            Gtk.Image.new_from_stock('gtk-execute', Gtk.IconSize.MENU)
        )
        self._add_button.connect('clicked', self._on_add_button_clicked)
        self._spin_button = Gtk.SpinButton.new_with_range(1, 1000, 1)
        self._spin_button.connect(
            'value-changed',
            self._on_spin_button_changed
        )
        self._spin_button.set_value(SESSION.data.recom_count or 1)

        self._sieve_check = Gtk.ToggleButton()
        self._sieve_check.set_image(Gtk.Image.new_from_icon_name(
            'gtk-strikethrough', Gtk.IconSize.BUTTON
        ))
        self._sieve_check.set_active(SESSION.sieving)
        self._sieve_check.connect(
            'toggled',
            lambda btn: setattr(SESSION, 'sieving', btn.get_active())
        )

        self._attrs_entry = Gtk.Entry()
        self._attrs_entry.set_placeholder_text('<Enter Attribute Search>')
        self._attrs_entry.connect('activate', self._on_add_button_clicked)
        self._attrs_entry.connect('changed', self._on_entry_changed)

        self._percent_button = Gtk.ScaleButton()
        self._percent_button.set_adjustment(
            Gtk.Adjustment(SESSION.data.listen_threshold, 0.0, 1.0, 0.01)
        )
        self._percent_button.set_icons(['gtk-cdrom'])
        self._percent_button.set_relief(Gtk.ReliefStyle.NORMAL)
        self._percent_button.connect(
            'value-changed',
            self._on_listen_threshold_changed
        )

        rbox = Gtk.HBox()
        lbox = Gtk.HBox()

        lbox.pack_start(self._attrs_entry, True, False, 0)
        lbox.pack_start(self._spin_button, True, False, 0)
        rbox.pack_start(self._sieve_check, True, False, 0)
        rbox.pack_start(self._percent_button, True, False, 0)
        rbox.pack_start(self._add_button, True, False, 0)

        style_context = lbox.get_style_context()
        style_context.add_class(Gtk.STYLE_CLASS_LINKED)

        style_context = rbox.get_style_context()
        style_context.add_class(Gtk.STYLE_CLASS_LINKED)

        alignment = Gtk.Alignment()
        alignment.set(0.5, 0.5, 0, 0)
        alignment.add(rbox)

        self._star_slider = StarSlider()
        self._star_slider.set_size_request(
            self._star_slider.width_multiplier() * 20,
            20
        )
        self._star_slider.connect('percent-change', self._on_stars_changed)
        g.client.signal_add('client-event', self._on_client_event)

        slide_alignment = Gtk.Alignment()
        slide_alignment.set(0.5, 0.5, 0, 0)
        slide_alignment.add(self._star_slider)

        self.pack_start(slide_alignment, True, True, 8)
        self.pack_start(lbox, True, True, 5)
        self.pack_start(alignment, True, True, 5)
        self.show_all()
Esempio n. 3
0
class RecomControl(Gtk.HBox):
    def __init__(self):
        Gtk.HBox.__init__(self)
        self.set_margin_right(5)
        self.set_margin_bottom(5)

        # Add button:
        self._add_button = Gtk.Button()
        self._add_button.set_image(
            Gtk.Image.new_from_stock('gtk-execute', Gtk.IconSize.MENU)
        )
        self._add_button.connect('clicked', self._on_add_button_clicked)
        self._spin_button = Gtk.SpinButton.new_with_range(1, 1000, 1)
        self._spin_button.connect(
            'value-changed',
            self._on_spin_button_changed
        )
        self._spin_button.set_value(SESSION.data.recom_count or 1)

        self._sieve_check = Gtk.ToggleButton()
        self._sieve_check.set_image(Gtk.Image.new_from_icon_name(
            'gtk-strikethrough', Gtk.IconSize.BUTTON
        ))
        self._sieve_check.set_active(SESSION.sieving)
        self._sieve_check.connect(
            'toggled',
            lambda btn: setattr(SESSION, 'sieving', btn.get_active())
        )

        self._attrs_entry = Gtk.Entry()
        self._attrs_entry.set_placeholder_text('<Enter Attribute Search>')
        self._attrs_entry.connect('activate', self._on_add_button_clicked)
        self._attrs_entry.connect('changed', self._on_entry_changed)

        self._percent_button = Gtk.ScaleButton()
        self._percent_button.set_adjustment(
            Gtk.Adjustment(SESSION.data.listen_threshold, 0.0, 1.0, 0.01)
        )
        self._percent_button.set_icons(['gtk-cdrom'])
        self._percent_button.set_relief(Gtk.ReliefStyle.NORMAL)
        self._percent_button.connect(
            'value-changed',
            self._on_listen_threshold_changed
        )

        rbox = Gtk.HBox()
        lbox = Gtk.HBox()

        lbox.pack_start(self._attrs_entry, True, False, 0)
        lbox.pack_start(self._spin_button, True, False, 0)
        rbox.pack_start(self._sieve_check, True, False, 0)
        rbox.pack_start(self._percent_button, True, False, 0)
        rbox.pack_start(self._add_button, True, False, 0)

        style_context = lbox.get_style_context()
        style_context.add_class(Gtk.STYLE_CLASS_LINKED)

        style_context = rbox.get_style_context()
        style_context.add_class(Gtk.STYLE_CLASS_LINKED)

        alignment = Gtk.Alignment()
        alignment.set(0.5, 0.5, 0, 0)
        alignment.add(rbox)

        self._star_slider = StarSlider()
        self._star_slider.set_size_request(
            self._star_slider.width_multiplier() * 20,
            20
        )
        self._star_slider.connect('percent-change', self._on_stars_changed)
        g.client.signal_add('client-event', self._on_client_event)

        slide_alignment = Gtk.Alignment()
        slide_alignment.set(0.5, 0.5, 0, 0)
        slide_alignment.add(self._star_slider)

        self.pack_start(slide_alignment, True, True, 8)
        self.pack_start(lbox, True, True, 5)
        self.pack_start(alignment, True, True, 5)
        self.show_all()

    def _on_entry_changed(self, entry):
        query_dict = parse_attribute_search(entry.get_text())
        if query_dict:
            SESSION.data.attribute_search_query = query_dict
        else:
            SESSION.data.attribute_search_query = None

    def _on_add_button_clicked(self, button):
        if SESSION.data.attribute_search_query is not None:
            iterator = SESSION.recommend_from_attributes(
                SESSION.data.attribute_search_query,
                SESSION.data.recom_count
            )
        else:
            iterator = SESSION.recommend_from_heuristic(
                SESSION.data.recom_count
            )

        process_recommendation(iterator)

    def _on_client_event(self, client, event):
        if event & Idle.PLAYER:
            with g.client.lock_currentsong() as song:
                if song is None:
                    return

                current_song_uri = song.uri

            munin_song = SESSION.mapping[:current_song_uri]
            rating = SESSION[munin_song]['rating']
            if rating is None:
                self._star_slider.stars = 0
            else:
                self._star_slider.stars = rating[0]

    def _on_spin_button_changed(self, spin_button):
        SESSION.data.recom_count = self._spin_button.get_value_as_int()

    def _on_listen_threshold_changed(self, button, value):
        SESSION.data.listen_threshold = value

    def _on_stars_changed(self, slider):
        with g.client.lock_currentsong() as song:
            if song is None:
                INFO_BAR.message(
                    'There is no current song to rate.',
                    Gtk.MessageType.INFO
                )
                return

            current_song_uri = song.uri

        munin_song = SESSION[SESSION.mapping[:current_song_uri]]
        with SESSION.fix_graph():
            with timeit('modify'):
                SESSION[SESSION.modify(
                    munin_song, {'rating': slider.stars}
                )]

        SESSION.data.plot_needs_redraw = True