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
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()
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