def setUp(self): '''Set up the test.''' EntertainerTest.setUp(self) self.menu = ImageMenu(0, 0) self.texture = Texture(os.path.join( THIS_DIR, 'data/ImageThumbnailer/test.jpg'))
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 __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)
class ImageMenuTest(EntertainerTest): """Test for entertainerlib.gui.widgets.image_menu""" def setUp(self): '''Set up the test.''' EntertainerTest.setUp(self) self.menu = ImageMenu(0, 0) self.texture = Texture(os.path.join( THIS_DIR, 'data/ImageThumbnailer/test.jpg')) def test_create(self): '''Test correct ImageMenu initialization.''' self.assertTrue(isinstance(self.menu, ImageMenu)) def test_add_item(self): '''Test the add_item method.''' items = self.menu.count self.menu.add_item(self.texture, "data") self.assertEqual(self.menu.count, items + 1)
def _create_menu(self): """ Create a view that is displayed when there is indexed TV-series in the video library. """ #Create TV-series menu menu = ImageMenu(0.06, 0.18, 0.12, 0.25) menu.items_per_col = 2 menu.visible_rows = 2 menu.visible_cols = 7 series = self.video_library.get_tv_series() series_list = [[serie.cover_art_url, serie] for serie in series] menu.async_add_videos(series_list) # Create list indicator self.list_indicator = ListIndicator(0.75, 0.76, 0.2, 0.045, ListIndicator.HORIZONTAL) self.list_indicator.set_maximum(len(series)) self.list_indicator.show() self.add(self.list_indicator) # Create information labels self.series_title = Label(0.042, "title", 0.2, 0.75, "", font_weight="bold") self.series_title.set_ellipsize(pango.ELLIPSIZE_END) self.series_title.set_line_wrap(False) self.series_title.width = 0.5 self.add(self.series_title) self.series_info = Label(0.034, "subtitle", 0.2, 0.82, "") self.add(self.series_info) return menu
def _create_menu(self): """ Create a view that is displayed when there is indexed movies in the video library. """ #Create movie menu menu = ImageMenu(0.06, 0.18, 0.12, 0.25) menu.items_per_col = 2 menu.visible_rows = 2 menu.visible_cols = 7 movies = self.video_library.get_movies() movies_list = [[movie.cover_art_url, movie] for movie in movies] menu.async_add_videos(movies_list) # Create list indicator self.list_indicator = ListIndicator(0.75, 0.76, 0.2, 0.045, ListIndicator.HORIZONTAL) self.list_indicator.set_maximum(len(movies)) self.show() self.add(self.list_indicator) # Create information labels self.movie_title = Label(0.042, "title", 0.2, 0.75, "", font_weight="bold") self.movie_title.set_ellipsize(pango.ELLIPSIZE_END) self.movie_title.set_line_wrap(False) self.movie_title.width = 0.5 self.add(self.movie_title) self.movie_info = Label(0.034, "subtitle", 0.2, 0.8, "") self.movie_info.set_ellipsize(pango.ELLIPSIZE_END) self.movie_info.set_line_wrap(False) self.movie_info.width = 0.5 self.add(self.movie_info) self.movie_plot = Label(0.025, "subtitle", 0.2, 0.85, "") self.movie_plot.width = 0.7 self.add(self.movie_plot) return menu
def _create_menu(self): """ Create a view that is displayed when there are indexed clips in the video library. """ menu = ImageMenu(0.04, 0.16, 0.23, self.y_for_x(0.23) * 0.7) menu.items_per_col = 2 menu.visible_rows = 2 menu.visible_cols = 4 clips = self.video_library.get_video_clips() clips_list = [[clip.thumbnail_url, clip] for clip in clips] menu.async_add_clips(clips_list) # Create list indicator self.list_indicator = ListIndicator(0.7, 0.8, 0.2, 0.045, ListIndicator.HORIZONTAL) self.list_indicator.set_maximum(len(clips)) self.list_indicator.show() self.add(self.list_indicator) # Create information labels self.clip_title = Label(0.042, "title", 0.15, 0.77, "", font_weight="bold") self.clip_title.set_ellipsize(pango.ELLIPSIZE_END) self.clip_title.set_line_wrap(False) self.clip_title.width = 0.5 self.add(self.clip_title) self.clip_info = Label(0.034, "subtitle", 0.15, 0.85, "") self.clip_info.set_ellipsize(pango.ELLIPSIZE_END) self.clip_info.set_line_wrap(False) self.clip_info.width = 0.5 self.add(self.clip_info) return menu
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 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 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()