class AlbumsTab(Tab): '''Tab to show album listings''' def __init__(self, albums, move_to_new_screen_callback, name="albums", tab_title=_("Albums")): Tab.__init__(self, name, tab_title, move_to_new_screen_callback) # Start the loading animation while the menu is loading self.throbber = LoadingAnimation(0.6, 0.1) self.throbber.show() self.add(self.throbber) if len(albums) < 4: x_percent = 0.2928 visible_rows = 1 visible_cols = 3 elif len(albums) < 13: x_percent = 0.1464 visible_rows = 2 visible_cols = 6 else: x_percent = 0.1098 visible_rows = 3 visible_cols = 8 # Create albums menu self.menu = ImageMenu(0.07, 0.16, x_percent, self.y_for_x(x_percent)) self.menu.visible_rows = visible_rows self.menu.visible_cols = visible_cols self.menu.items_per_col = self.menu.visible_rows self.add(self.menu) albums_list = [[album.album_art_url, album] for album in albums] self.menu.async_add_albums(albums_list) self.li = ListIndicator(0.77, 0.8, 0.18, 0.045, ListIndicator.HORIZONTAL) self.li.set_maximum(len(albums)) self.li.show() self.add(self.li) # Create album information (displays current menuitem information) self.album_title = Label(0.045, "title", 0.22, 0.79, "") self.album_title.set_ellipsize(pango.ELLIPSIZE_END) self.album_title.set_line_wrap(False) self.album_title.width = 0.366 self.add(self.album_title) self.album_artist = Label(0.037, "subtitle", 0.22, 0.86, "") self.album_artist.set_ellipsize(pango.ELLIPSIZE_END) self.album_artist.set_line_wrap(False) self.album_artist.width = 0.366 self.add(self.album_artist) self.album_tracks = Label(0.037, "subtitle", 0.22, 0.91, "") self.add(self.album_tracks) self.connect('activated', self._on_activated) self.connect('deactivated', self._on_deactivated) self.menu.connect("moved", self._update_album_info) self.menu.connect("selected", self._handle_select) self.menu.connect("activated", self._on_activated) self.menu.connect("filled", self._on_menu_filled) def can_activate(self): '''Albums tab will always be created from an existing artist with at least one album.''' return True def _update_album_info(self, event=None): '''Update the album information labels.''' if self.active: album = self.menu.selected_userdata self.album_title.set_text(album.title) self.album_artist.set_text(album.artist) self.album_tracks.set_text(_("%(total)s tracks") % \ {'total': len(album.tracks)}) self.li.show() self.li.set_current(self.menu.selected_index + 1) else: self.album_title.set_text("") self.album_artist.set_text("") self.album_tracks.set_text("") self.li.hide() def _handle_up(self): '''Handle the up user event.''' if self.menu.on_top: return True # Move control back to tab bar else: self.menu.up() return False def _handle_down(self): '''Handle the down user event.''' self.menu.down() return False def _handle_left(self): '''Handle the left user event.''' self.menu.left() return False def _handle_right(self): '''Handle the right user event.''' self.menu.right() return False def _handle_select(self, event=None): '''Handle the select user event.''' album = self.menu.selected_userdata kwargs = { 'album' : album } self.callback("album", kwargs) return False def _on_activated(self, event=None): '''Tab activated.''' if self.tab_group is not None: self.tab_group.active = False self.menu.active = True self.active = True self._update_album_info() return False def _on_deactivated(self, event=None): '''Tab deactivated.''' self.active = False self.menu.active = False self._update_album_info() return False def _on_menu_filled(self, event=None): '''Handles filled event.''' self.throbber.hide()
class Photographs(Screen): '''Screen displays a grid of selectable photograph thumbnails.''' def __init__(self, move_to_new_screen_callback, title, images): Screen.__init__(self, 'Photographs', move_to_new_screen_callback) self.images = images # Screen Title (Displayed at the bottom left corner) screen_title = Label(0.13, "screentitle", 0, 0.87, title) self.add(screen_title) # Image Title (over album list) self.image_title = Label(0.04167, "title", 0.0586, 0.7943, " ") self.image_title.set_ellipsize(pango.ELLIPSIZE_END) self.add(self.image_title) self.image_desc = Label(0.04167, "subtitle", 0.0586, 0.9115, " ") self.image_desc.set_line_wrap(True) self.image_desc.set_ellipsize(pango.ELLIPSIZE_END) self.add(self.image_desc) # Display throbber animation while loading photographs self.throbber = LoadingAnimation(0.9, 0.9) self.throbber.show() self.add(self.throbber) # List indicator self.li = None self._create_list_indicator() # Create photomenu self.menu = ImageMenu(0.03, 0.08, 0.12, self.y_for_x(0.12)) self.menu.items_per_col = 3 self.menu.visible_rows = 3 self.menu.visible_cols = 8 self.menu.active = True self.add(self.menu) photos = self.images photos_list = [[Texture(photo.get_thumbnail_url()), photo] \ for photo in photos] self.menu.async_add(photos_list) self.menu.connect("selected", self._handle_select) self.menu.connect('moved', self._update_image_info) self.menu.connect("filled", self._on_menu_filled) def _update_image_info(self, event=None): """Update image information box.""" image = self.images[self.menu.selected_index] name = image.get_title() desc = image.get_description() self.image_title.set_text(name) self.image_title.set_size(0.366, 0.04167) self.image_desc.set_text(desc) self.image_desc.set_size(0.366, 0.0911) self.li.set_current(self.menu.selected_index + 1) def _create_list_indicator(self): '''Create list indicator for albums list.''' self.li = ListIndicator(0.77, 0.8, 0.18, 0.045, ListIndicator.HORIZONTAL) self.li.set_maximum(len(self.images)) self.add(self.li) def _handle_up(self): '''Handle UserEvent.NAVIGATE_UP.''' self.menu.up() def _handle_down(self): '''Handle UserEvent.NAVIGATE_DOWN.''' self.menu.down() def _handle_left(self): '''Handle UserEvent.NAVIGATE_LEFT.''' self.menu.left() def _handle_right(self): '''Handle UserEvent.NAVIGATE_RIGHT.''' self.menu.right() def _handle_select(self, event=None): '''Handle UserEvent.NAVIGATE_SELECT.''' index = self.menu.selected_index kwargs = {'current_photo_index': index, 'images': self.images} self.callback("photo", kwargs) def _on_menu_filled(self, event=None): '''Handles filled event.''' self.throbber.hide()
class AlbumsTab(Tab): '''Tab to show album listings''' def __init__(self, albums, move_to_new_screen_callback, name="albums", tab_title=_("Albums")): Tab.__init__(self, name, tab_title, move_to_new_screen_callback) # Start the loading animation while the menu is loading self.throbber = LoadingAnimation(0.6, 0.1) self.throbber.show() self.add(self.throbber) if len(albums) < 4: x_percent = 0.2928 visible_rows = 1 visible_cols = 3 elif len(albums) < 13: x_percent = 0.1464 visible_rows = 2 visible_cols = 6 else: x_percent = 0.1098 visible_rows = 3 visible_cols = 8 # Create albums menu self.menu = ImageMenu(0.07, 0.16, x_percent, self.y_for_x(x_percent)) self.menu.visible_rows = visible_rows self.menu.visible_cols = visible_cols self.menu.items_per_col = self.menu.visible_rows self.add(self.menu) albums_list = [[album.album_art_url, album] for album in albums] self.menu.async_add_albums(albums_list) self.li = ListIndicator(0.77, 0.8, 0.18, 0.045, ListIndicator.HORIZONTAL) self.li.set_maximum(len(albums)) self.li.show() self.add(self.li) # Create album information (displays current menuitem information) self.album_title = Label(0.045, "title", 0.22, 0.79, "") self.album_title.set_ellipsize(pango.ELLIPSIZE_END) self.album_title.set_line_wrap(False) self.album_title.width = 0.366 self.add(self.album_title) self.album_artist = Label(0.037, "subtitle", 0.22, 0.86, "") self.album_artist.set_ellipsize(pango.ELLIPSIZE_END) self.album_artist.set_line_wrap(False) self.album_artist.width = 0.366 self.add(self.album_artist) self.album_tracks = Label(0.037, "subtitle", 0.22, 0.91, "") self.add(self.album_tracks) self.connect('activated', self._on_activated) self.connect('deactivated', self._on_deactivated) self.menu.connect("moved", self._update_album_info) self.menu.connect("selected", self._handle_select) self.menu.connect("activated", self._on_activated) self.menu.connect("filled", self._on_menu_filled) def can_activate(self): '''Albums tab will always be created from an existing artist with at least one album.''' return True def _update_album_info(self, event=None): '''Update the album information labels.''' if self.active: album = self.menu.selected_userdata self.album_title.set_text(album.title) self.album_artist.set_text(album.artist) self.album_tracks.set_text(_("%(total)s tracks") % \ {'total': len(album.tracks)}) self.li.show() self.li.set_current(self.menu.selected_index + 1) else: self.album_title.set_text("") self.album_artist.set_text("") self.album_tracks.set_text("") self.li.hide() def _handle_up(self): '''Handle the up user event.''' if self.menu.on_top: return True # Move control back to tab bar else: self.menu.up() return False def _handle_down(self): '''Handle the down user event.''' self.menu.down() return False def _handle_left(self): '''Handle the left user event.''' self.menu.left() return False def _handle_right(self): '''Handle the right user event.''' self.menu.right() return False def _handle_select(self, event=None): '''Handle the select user event.''' album = self.menu.selected_userdata kwargs = {'album': album} self.callback("album", kwargs) return False def _on_activated(self, event=None): '''Tab activated.''' if self.tab_group is not None: self.tab_group.active = False self.menu.active = True self.active = True self._update_album_info() return False def _on_deactivated(self, event=None): '''Tab deactivated.''' self.active = False self.menu.active = False self._update_album_info() return False def _on_menu_filled(self, event=None): '''Handles filled event.''' self.throbber.hide()
class Photographs(Screen): '''Screen displays a grid of selectable photograph thumbnails.''' def __init__(self, move_to_new_screen_callback, title, images): Screen.__init__(self, 'Photographs', move_to_new_screen_callback) self.images = images # Screen Title (Displayed at the bottom left corner) screen_title = Label(0.13, "screentitle", 0, 0.87, title) self.add(screen_title) # Image Title (over album list) self.image_title = Label(0.04167, "title", 0.0586, 0.7943, " ") self.image_title.set_ellipsize(pango.ELLIPSIZE_END) self.add(self.image_title) self.image_desc = Label(0.04167, "subtitle", 0.0586, 0.9115, " ") self.image_desc.set_line_wrap(True) self.image_desc.set_ellipsize(pango.ELLIPSIZE_END) self.add(self.image_desc) # Display throbber animation while loading photographs self.throbber = LoadingAnimation(0.9, 0.9) self.throbber.show() self.add(self.throbber) # List indicator self.li = None self._create_list_indicator() # Create photomenu self.menu = ImageMenu(0.03, 0.08, 0.12, self.y_for_x(0.12)) self.menu.items_per_col = 3 self.menu.visible_rows = 3 self.menu.visible_cols = 8 self.menu.active = True self.add(self.menu) photos = self.images photos_list = [[Texture(photo.get_thumbnail_url()), photo] \ for photo in photos] self.menu.async_add(photos_list) self.menu.connect("selected", self._handle_select) self.menu.connect('moved', self._update_image_info) self.menu.connect("filled", self._on_menu_filled) def _update_image_info(self, event=None): """Update image information box.""" image = self.images[self.menu.selected_index] name = image.get_title() desc = image.get_description() self.image_title.set_text(name) self.image_title.set_size(0.366, 0.04167) self.image_desc.set_text(desc) self.image_desc.set_size(0.366, 0.0911) self.li.set_current(self.menu.selected_index + 1) def _create_list_indicator(self): '''Create list indicator for albums list.''' self.li = ListIndicator(0.77, 0.8, 0.18, 0.045, ListIndicator.HORIZONTAL) self.li.set_maximum(len(self.images)) self.add(self.li) def _handle_up(self): '''Handle UserEvent.NAVIGATE_UP.''' self.menu.up() def _handle_down(self): '''Handle UserEvent.NAVIGATE_DOWN.''' self.menu.down() def _handle_left(self): '''Handle UserEvent.NAVIGATE_LEFT.''' self.menu.left() def _handle_right(self): '''Handle UserEvent.NAVIGATE_RIGHT.''' self.menu.right() def _handle_select(self, event=None): '''Handle UserEvent.NAVIGATE_SELECT.''' index = self.menu.selected_index kwargs = {'current_photo_index' : index, 'images' : self.images} self.callback("photo", kwargs) def _on_menu_filled(self, event=None): '''Handles filled event.''' self.throbber.hide()