migrate toolbar of library panel

This commit is contained in:
coderkun 2016-06-05 12:42:39 +02:00
commit 6b75674031
2 changed files with 256 additions and 174 deletions

View file

@ -9,6 +9,150 @@
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkPopover" id="library-toolbar-popover">
<property name="can_focus">False</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkScale" id="library-toolbar-scale">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">library-scale-adjustment</property>
<property name="round_digits">0</property>
<property name="draw_value">False</property>
<property name="has_origin">False</property>
<signal name="button-release-event" handler="on_library-toolbar-scale_button_release_event" swapped="no"/>
<signal name="change-value" handler="on_library-toolbar-scale_change_value" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="library-toolbar-update">
<property name="label">gtk-refresh</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="relief">none</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_library-toolbar-update_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox" id="library-toolbar-sort">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkSeparator">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Sort</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="library-toolbar-sort-artist">
<property name="label" translatable="yes">sort by artist</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
<property name="group">library-toolbar-sort-year</property>
<signal name="toggled" handler="on_library-toolbar-sort-toggled" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="library-toolbar-sort-title">
<property name="label" translatable="yes">sort by title</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
<property name="group">library-toolbar-sort-year</property>
<signal name="toggled" handler="on_library-toolbar-sort-toggled" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="library-toolbar-sort-year">
<property name="label" translatable="yes">sort by year</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_library-toolbar-sort-toggled" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="library-toolbar-sort-order">
<property name="label">gtk-sort-descending</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_stock">True</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_library-toolbar-sort-order_toggled" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">5</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkAdjustment" id="server-port-adjustment">
<property name="lower">1024</property>
<property name="upper">9999</property>
@ -331,9 +475,6 @@
<property name="position">1</property>
</packing>
</child>
<child>
<placeholder/>
</child>
<child>
<object class="GtkScrolledWindow" id="playlist-panel">
<property name="visible">True</property>
@ -361,7 +502,7 @@
<packing>
<property name="name">playlist</property>
<property name="title" translatable="yes">Playlist</property>
<property name="position">3</property>
<property name="position">2</property>
</packing>
</child>
<child>
@ -369,6 +510,30 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkSearchBar" id="library-filter-bar">
<property name="visible">True</property>
<property name="app_paintable">True</property>
<property name="can_focus">False</property>
<signal name="notify" handler="on_library-filter-bar_notify" swapped="no"/>
<child>
<object class="GtkSearchEntry" id="library-filter">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="primary_icon_name">edit-find-symbolic</property>
<property name="primary_icon_activatable">False</property>
<property name="primary_icon_sensitive">False</property>
<property name="placeholder_text" translatable="yes">search library</property>
<signal name="search-changed" handler="on_library-filter_search_changed" swapped="no"/>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkRevealer" id="library-progress-revealer">
<property name="visible">True</property>
@ -382,125 +547,6 @@
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHeaderBar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">0</property>
<child>
<object class="GtkToolbar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkToolButton" id="library-update">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="icon_name">view-refresh</property>
<signal name="clicked" handler="on_library-update_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<style>
<class name="no-bg"/>
</style>
</object>
</child>
<child type="title">
<object class="GtkSearchEntry" id="library-filter">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="primary_icon_name">edit-find-symbolic</property>
<property name="primary_icon_activatable">False</property>
<property name="primary_icon_sensitive">False</property>
<property name="placeholder_text" translatable="yes">search library</property>
<signal name="search-changed" handler="on_library-filter_search_changed" swapped="no"/>
</object>
</child>
<child>
<object class="GtkToolbar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkToolItem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkScale" id="library-grid-scale">
<property name="width_request">100</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">library-scale-adjustment</property>
<property name="lower_stepper_sensitivity">off</property>
<property name="upper_stepper_sensitivity">off</property>
<property name="restrict_to_fill_level">False</property>
<property name="fill_level">0</property>
<property name="digits">0</property>
<property name="draw_value">False</property>
<signal name="button-release-event" handler="on_library-grid-scale_button_release_event" swapped="no"/>
<signal name="change-value" handler="on_library-grid-scale_change_value" swapped="no"/>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkComboBox" id="library-sort">
<property name="visible">True</property>
<property name="can_focus">False</property>
<signal name="changed" handler="on_library-sort_changed" swapped="no"/>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToggleToolButton" id="library-sort-order">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="icon_name">view-sort-descending</property>
<property name="active">True</property>
<signal name="clicked" handler="on_library-sort-order_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<style>
<class name="no-bg"/>
</style>
</object>
<packing>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
<style>
<class name="no-bg"/>
<class name="no-border"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
@ -542,7 +588,7 @@
<packing>
<property name="name">library</property>
<property name="title" translatable="yes">Library</property>
<property name="position">4</property>
<property name="position">3</property>
</packing>
</child>
</object>
@ -726,6 +772,7 @@
<object class="GtkToolbar" id="server-toolbar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<style>
<class name="no-bg"/>
</style>
@ -739,6 +786,7 @@
<object class="GtkToolbar" id="cover-toolbar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<style>
<class name="no-bg"/>
</style>
@ -753,6 +801,7 @@
<object class="GtkToolbar" id="playlist-toolbar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<property name="show_arrow">False</property>
<child>
<object class="GtkToolButton" id="playlist-toolbar-clear">
@ -781,17 +830,45 @@
<object class="GtkToolbar" id="library-toolbar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<property name="show_arrow">False</property>
<child>
<object class="GtkToolButton" id="library-toolbar-update">
<object class="GtkToggleToolButton" id="library-toolbar-search">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-refresh</property>
<property name="icon_name">edit-find-symbolic</property>
<signal name="toggled" handler="on_library-toolbar-search_toggled" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="relief">none</property>
<property name="popover">library-toolbar-popover</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">open-menu-symbolic</property>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">False</property>
</packing>
</child>
<style>

View file

@ -1094,29 +1094,22 @@ class LibraryPanel(mcg.Base):
# Widgets
self._panel = builder.get_object('library-panel')
self._toolbar = builder.get_object('library-toolbar')
# Filter/search bar
self._filter_bar = builder.get_object('library-filter-bar')
self._filter_entry = builder.get_object('library-filter')
# Progress Bar
self._progress_revealer = builder.get_object('library-progress-revealer')
self._progress_bar = builder.get_object('library-progress')
# Toolbar
# Filter entry
self._filter_entry = builder.get_object('library-filter')
# Grid scale
self._grid_scale = builder.get_object('library-grid-scale')
# Toolbar menu
self._toolbar_search_bar = builder.get_object('library-toolbar-search')
self._toolbar_sort_buttons = {
mcg.MCGAlbum.SORT_BY_ARTIST: builder.get_object('library-toolbar-sort-artist'),
mcg.MCGAlbum.SORT_BY_TITLE: builder.get_object('library-toolbar-sort-title'),
mcg.MCGAlbum.SORT_BY_YEAR: builder.get_object('library-toolbar-sort-year')
}
self._toolbar_sort_order_button = builder.get_object('library-toolbar-sort-order')
self._grid_scale = builder.get_object('library-toolbar-scale')
self._grid_scale.set_value(self._item_size)
# Sort menu
library_sort_store = Gtk.ListStore(str, str)
library_sort_store.append([mcg.MCGAlbum.SORT_BY_ARTIST, "sort by artist"])
library_sort_store.append([mcg.MCGAlbum.SORT_BY_TITLE, "sort by title"])
library_sort_store.append([mcg.MCGAlbum.SORT_BY_YEAR, "sort by year"])
self._library_sort_combo = builder.get_object('library-sort')
self._library_sort_combo.set_model(library_sort_store)
renderer_text = Gtk.CellRendererText()
self._library_sort_combo.pack_start(renderer_text, True)
self._library_sort_combo.add_attribute(renderer_text, "text", 1)
self._library_sort_combo.set_id_column(0)
self._library_sort_combo.set_active_id(self._sort_order)
# Sort type
self._library_sort_type_button = builder.get_object('library-sort-order')
# Library Grid: Model
self._library_grid_model = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str)
self._library_grid_model.set_sort_func(2, self.compare_albums, self._sort_order)
@ -1141,31 +1134,20 @@ class LibraryPanel(mcg.Base):
def get_signal_handlers(self):
return {
'on_library-update_clicked': self.on_update_clicked,
'on_library-grid-scale_change_value': self.on_grid_scale_change,
'on_library-grid-scale_button_release_event': self.on_grid_scale_changed,
'on_library-sort_changed': self.on_library_sort_combo_changed,
'on_library-sort-order_clicked': self.on_library_sort_type_button_activated,
'on_library-toolbar-search_toggled': self.on_search_toggled,
'on_library-toolbar-scale_change_value': self.on_grid_scale_change,
'on_library-toolbar-scale_button_release_event': self.on_grid_scale_changed,
'on_library-toolbar-update_clicked': self.on_update_clicked,
'on_library-toolbar-sort-toggled': self.on_sort_toggled,
'on_library-toolbar-sort-order_toggled': self.on_sort_order_toggled,
'on_library-filter-bar_notify': self.on_filter_bar_notify,
'on_library-filter_search_changed': self.on_filter_entry_changed,
'on_library-iconview_item_activated': self.on_library_grid_clicked
}
def on_update_clicked(self, widget):
self._callback(self.SIGNAL_UPDATE)
def on_filter_visible(self, model, iter, data):
hash = model.get_value(iter, 2)
if not hash in self._albums.keys():
return
album = self._albums[hash]
return album.filter(self._filter_string)
def on_filter_entry_changed(self, widget):
self._filter_string = self._filter_entry.get_text()
GObject.idle_add(self._library_grid_filter.refilter)
def on_search_toggled(self, widget):
self._filter_bar.set_search_mode(widget.get_active())
def on_grid_scale_change(self, widget, scroll, value):
@ -1186,31 +1168,50 @@ class LibraryPanel(mcg.Base):
self._redraw()
def on_library_sort_combo_changed(self, combo):
sort_order = combo.get_active_id()
self._sort_order = sort_order
self._library_grid_model.set_sort_func(2, self.compare_albums, sort_order)
self._callback(LibraryPanel.SIGNAL_SORT_ORDER_CHANGED, sort_order)
def on_update_clicked(self, widget):
self._callback(self.SIGNAL_UPDATE)
def on_library_sort_type_button_activated(self, button):
def on_sort_toggled(self, widget):
if widget.get_active():
sort = [key for key, value in self._toolbar_sort_buttons.items() if value is widget][0]
self._change_sort(sort)
def on_sort_order_toggled(self, button):
if button.get_active():
sort_type = Gtk.SortType.DESCENDING
button.set_stock_id(Gtk.STOCK_SORT_DESCENDING)
else:
sort_type = Gtk.SortType.ASCENDING
button.set_stock_id(Gtk.STOCK_SORT_ASCENDING)
self._sort_type = sort_type
self._library_grid_model.set_sort_column_id(2, sort_type)
self._callback(LibraryPanel.SIGNAL_SORT_TYPE_CHANGED, sort_type)
def on_filter_bar_notify(self, widget, value):
if self._toolbar_search_bar.get_active() is not self._filter_bar.get_search_mode():
self._toolbar_search_bar.set_active(self._filter_bar.get_search_mode())
def on_filter_entry_changed(self, widget):
self._filter_string = self._filter_entry.get_text()
GObject.idle_add(self._library_grid_filter.refilter)
def on_library_grid_clicked(self, widget, path):
path = self._library_grid_filter.convert_path_to_child_path(path)
iter = self._library_grid_model.get_iter(path)
self._callback(LibraryPanel.SIGNAL_PLAY, self._library_grid_model.get_value(iter, 2))
def on_filter_visible(self, model, iter, data):
hash = model.get_value(iter, 2)
if not hash in self._albums.keys():
return
album = self._albums[hash]
return album.filter(self._filter_string)
def set_item_size(self, item_size):
if self._item_size != item_size:
self._item_size = item_size
@ -1222,11 +1223,12 @@ class LibraryPanel(mcg.Base):
return self._item_size
def set_sort_order(self, sort_order):
if self._sort_order != sort_order:
result = self._library_sort_combo.set_active_id(sort_order)
if self._sort_order != sort_order:
self._sort_order = sort_order
def set_sort_order(self, sort):
if self._sort_order != sort:
button = self._toolbar_sort_buttons[sort]
if button and not button.get_active():
button.set_active(True)
self._sort_order = sort
self._library_grid_model.set_sort_func(2, self.compare_albums, self._sort_order)
@ -1238,15 +1240,12 @@ class LibraryPanel(mcg.Base):
if self._sort_type != sort_type:
if sort_type:
sort_type_gtk = Gtk.SortType.DESCENDING
stock_id = Gtk.STOCK_SORT_DESCENDING
self._library_sort_type_button.set_active(True)
self._toolbar_sort_order_button.set_active(True)
else:
sort_type_gtk = Gtk.SortType.ASCENDING
self._library_sort_type_button.set_active(False)
stock_id = Gtk.STOCK_SORT_ASCENDING
self._toolbar_sort_order_button.set_active(False)
if self._sort_type != sort_type_gtk:
self._sort_type = sort_type_gtk
self._library_sort_type_button.set_stock_id(stock_id)
self._library_grid_model.set_sort_column_id(2, sort_type)
@ -1273,6 +1272,12 @@ class LibraryPanel(mcg.Base):
self._library_stop.set()
def _change_sort(self, sort):
self._sort_order = sort
self._library_grid_model.set_sort_func(2, self.compare_albums, sort)
self._callback(LibraryPanel.SIGNAL_SORT_ORDER_CHANGED, sort)
def _set_albums(self, host, albums, size):
self._library_lock.acquire()
self._library_stop.clear()