Using browse panel in edit_metadata
authorIvan Frade <ivan.frade@gmail.com>
Mon, 7 Sep 2009 22:17:57 +0000 (01:17 +0300)
committerIvan Frade <ivan.frade@gmail.com>
Mon, 7 Sep 2009 22:17:57 +0000 (01:17 +0300)
src/browse_panel.py
src/edit_panel.py
src/edit_panel_tm.py
src/mussorgsky.py

index 57b39c0..521dd1c 100755 (executable)
@@ -5,10 +5,9 @@ from edit_panel_tm import MussorgskyEditPanel
 from utils import escape_html, Set
 
 class MussorgskyBrowsePanel (hildon.StackableWindow):
-#class MussorgskyBrowsePanel (gtk.Window):
+
     def __init__ (self, songs_list):
         hildon.StackableWindow.__init__ (self)
-        #gtk.Window.__init__ (self)
         self.set_title ("Browse collection")
         self.set_border_width (12)
         self.__create_view ()
@@ -18,18 +17,25 @@ class MussorgskyBrowsePanel (hildon.StackableWindow):
         self.albums_set = Set ()
 
         # (uri, "Music", artist, title, album, mimetype) + "string"
-        self.full_model = gtk.ListStore (str, str, str, str, str, str, str)
+        full_model = gtk.ListStore (str, str, str, str, str, str, str)
         for (uri, category, artist, title, album, mime) in songs_list:
             text = "<b>%s</b>\n<small>%s</small>" % (escape_html (title),
                                                      escape_html (artist) + " / " + escape_html (album))
-            self.full_model.append ((uri, category, artist, title, album, mime, text))
+            full_model.append ((uri, category, artist, title, album, mime, text))
             self.artist_set.insert (artist)
             self.albums_set.insert (album)
             
-        self.filtered_model = self.full_model.filter_new ()
-        self.treeview.set_model (self.full_model)
+        self.filtered_model = full_model.filter_new ()
+        self.treeview.set_model (self.filtered_model)
+        self.treeview.set_fixed_height_mode (True)
+        print self.filtered_model
+        self.filtered_model.connect ("row_changed", self.row_changed_cb)
         self.kpid = self.connect ("key-press-event", self.key_pressed_cb)
 
+    def row_changed_cb (self, model, path, it):
+        print "In", self.__class__,"row-changed: ", model, path
+
+
     def __create_view (self):
         vbox = gtk.VBox (homogeneous=False)
         
@@ -39,18 +45,14 @@ class MussorgskyBrowsePanel (hildon.StackableWindow):
         desc_column = gtk.TreeViewColumn ("Song", gtk.CellRendererText (), markup=6)
         desc_column.set_expand (True)
         self.treeview.append_column (desc_column)
-        self.treeview.set_enable_search (True)
-        self.treeview.set_search_column (6)
-        self.treeview.set_search_equal_func (self.entry_equals)
 
         pannable_area = hildon.PannableArea ()
-        #pannable_area = gtk.ScrolledWindow ()
         pannable_area.add (self.treeview)
         
         vbox.pack_start (pannable_area, expand=True)
         
         self.search_hbox = gtk.HBox ()
-        self.search_entry = gtk.Entry ()
+        self.search_entry = hildon.Entry (gtk.HILDON_SIZE_FINGER_HEIGHT)
         self.search_hbox.pack_start (self.search_entry, expand=True)
         
         self.search_close = gtk.Button (stock=gtk.STOCK_CLOSE)
@@ -68,7 +70,7 @@ class MussorgskyBrowsePanel (hildon.StackableWindow):
         print "Search"
         self.filtered_model.set_visible_func (self.entry_equals, widget)
         self.filtered_model.refilter ()
-        self.treeview.set_model (self.filtered_model)
+        #self.treeview.set_model (self.filtered_model)
 
     def close_search_cb (self, widget):
         assert not self.search_box_visible
@@ -90,7 +92,6 @@ class MussorgskyBrowsePanel (hildon.StackableWindow):
             self.search_entry.grab_focus ()
             self.search_entry.connect ("changed", self.search_type)
             self.disconnect (self.kpid)
-            
     
     def entry_equals (self, model, it, user_data):
         t = user_data.get_text ()
@@ -100,10 +101,16 @@ class MussorgskyBrowsePanel (hildon.StackableWindow):
         edit_view = MussorgskyEditPanel ()
         edit_view.set_artist_alternatives (self.artist_set.as_list ())
         edit_view.set_album_alternatives (self.albums_set.as_list ())
-        
-        edit_view.set_model (treeview.get_model(), treeview.get_model ().get_iter (path))
+        edit_view.set_model (self.treeview.get_model (), self.treeview.get_model ().get_iter (path))
         edit_view.show_all ()
+        edit_view.connect ("destroy", self.after_edit)
 
+    def after_edit (self, widget):
+        while (gtk.events_pending()):
+            gtk.main_iteration()
+        self.treeview.queue_draw ()
+        while (gtk.events_pending()):
+            gtk.main_iteration()
 
 if __name__ == "__main__":
 
@@ -120,7 +127,7 @@ if __name__ == "__main__":
               "Artist%d" % i,
               "Title <%d>" % i,
               "album <%d>" % i,
-              "audio/mp3") for i in range (0, 100)]
+              "audio/mpeg") for i in range (0, 100)]
 
     window = MussorgskyBrowsePanel (songs)
     window.connect ("destroy", gtk.main_quit )
index 3de1d5b..f1af8f8 100755 (executable)
@@ -15,7 +15,7 @@ MIME_KEY = 5
 
 class MussorgskyEditPanel (hildon.StackableWindow):
 
-    def __init__ (self, songs_list=None, albums_list=None, artists_list=None):
+    def __init__ (self):
         hildon.StackableWindow.__init__ (self)
         self.set_border_width (12)
         self.song_counter = 0
@@ -24,18 +24,45 @@ class MussorgskyEditPanel (hildon.StackableWindow):
         self.artist_change_handler = -1
         self.writer = MutagenBackend ()
         self.player = MediaPlayer ()
-        self.albums_list = [a [0] for a in albums_list]
-        self.artists_list = [a [0] for a in artists_list]
         self.__create_view ()
-        if (songs_list):
-            self.set_songs_list (songs_list)
-        self.update_title ()
         self.banner = None
+        self.data_loaded = False
+        self.connect ("destroy", self.clean_banner)
 
+    def clean_banner (self):
+        if (self.banner and self.banner.get_property ("visible")):
+            self.banner.destroy ()
 
     def update_title (self):
         self.set_title ("Edit (%d/%d)" % (self.song_counter+1, len (self.songs_list)))
 
+    def set_data (self, songs_list, albums_list=None, artists_list=None):
+        """
+        Assumes albums and artists lists already sorted
+        """
+        assert not self.data_loaded
+        self.albums_list = []
+        album_selector = hildon.TouchSelectorEntry (text=True)
+        if (albums_list):
+            for a in albums_list:
+                self.albums_list.insert (0, a [0])
+                album_selector.append_text (a[0])
+        self.albums_list.reverse ()
+        self.album_button.set_selector (album_selector)
+
+        # Prepare artists
+        self.artists_list = []
+        artist_selector = hildon.TouchSelectorEntry (text=True)
+        if (artists_list):
+            for a in artists_list:
+                self.artists_list.insert (0,a [0])
+                artist_selector.append_text (a[0])
+        self.artists_list.reverse ()
+        self.artist_button.set_selector (artist_selector)
+        
+        self.set_songs_list (songs_list)
+        self.update_title ()
+        self.data_loaded = True
         
     def set_songs_list (self, songs_list):
         if (songs_list and len (songs_list) > 0):
@@ -160,24 +187,18 @@ class MussorgskyEditPanel (hildon.StackableWindow):
         table.attach (self.title_entry, 1, 2, 0, 1)
 
         # Artist row
-        artist_selector = hildon.TouchSelectorEntry (text=True)
-        for a in self.artists_list:
-            artist_selector.append_text (a)
         self.artist_button = hildon.PickerButton (hildon.BUTTON_STYLE_NORMAL,
                                                   hildon.BUTTON_ARRANGEMENT_HORIZONTAL)
         self.artist_button.set_title ("Artist: ")
-        self.artist_button.set_selector (artist_selector)
+        # Set data will set the selector
         table.attach (self.artist_button, 0, 2, 1, 2)
 
 
         # Album row
-        album_selector = hildon.TouchSelectorEntry (text=True)
-        for a in self.albums_list:
-            album_selector.append_text (a)
         self.album_button = hildon.PickerButton (hildon.BUTTON_STYLE_NORMAL,
                                                  hildon.BUTTON_ARRANGEMENT_HORIZONTAL)
         self.album_button.set_title ("Album: ")
-        self.album_button.set_selector (album_selector)
+        # set_data will set the selector
         table.attach (self.album_button, 0, 2, 2, 3) 
         
 
index 201035b..7646f72 100644 (file)
@@ -25,7 +25,18 @@ class MussorgskyEditPanel (hildon.StackableWindow):
         self.player = MediaPlayer ()
         self.__create_view ()
         self.data_loaded = False
+        self.artist_list = None
+        self.albums_list = None
+        self.connect ("delete-event", self.close_function)
 
+    def close_function (self, widget, event):
+        if (not self.data_loaded):
+            return
+        
+        if self.__is_view_dirty ():
+            self.save_metadata ()
+
+        
     def update_title (self):
         self.set_title ("Edit (%d/%d)" % (self.model.get_path (self.current)[0] + 1,
                                           len (self.model)))
@@ -36,15 +47,31 @@ class MussorgskyEditPanel (hildon.StackableWindow):
         return self.model.get (self.current, 0, 1, 2, 3, 4, 5)
 
     def set_model (self, model, current=None):
+        try:
+            if self.artists_list or self.albums_list:
+                pass
+        except AttributeError, e:
+            print "**** Set album and artist alternatives before setting a model"
+            raise e
+        
         self.model = model
         if (current):
             self.current = current
         else:
             self.current = self.model.get_iter_first ()
+        self.data_loaded = True
+        self.set_data_in_view (self.get_current_row ())
+        self.update_title ()
 
+    def set_current (self, current):
+        """
+        Iterator to current element
+        """
+        self.current = current
         self.set_data_in_view (self.get_current_row ())
         self.update_title ()
 
+
     def set_artist_alternatives (self, alternatives):
         self.artists_list = alternatives
         artist_selector = hildon.TouchSelectorEntry (text=True)
@@ -72,11 +99,14 @@ class MussorgskyEditPanel (hildon.StackableWindow):
             print "Modified data. Save!"
             self.save_metadata ()
             
-        self.current = self.model.iter_next (self.current)
-        if (not self.current):
+        path = self.model.get_path (self.current)
+        if (path[0] == 0):
             self.destroy ()
-            
-        self.set_data_in_view (self.get_current_row ())
+        else:
+            new_path = ( path[0] -1, )
+            self.current = self.model.get_iter (new_path)
+            self.set_data_in_view (self.get_current_row ())
+            self.update_title ()
 
     def press_next_cb (self, widget):
         if (self.player.is_playing ()):
@@ -97,6 +127,7 @@ class MussorgskyEditPanel (hildon.StackableWindow):
         else:
             self.set_data_in_view (self.get_current_row ())
             self.update_title ()
+
             
     def save_metadata (self):
         # Save the data in the online model to show the appropiate data
@@ -106,10 +137,15 @@ class MussorgskyEditPanel (hildon.StackableWindow):
         # 1 - "Music"  -> doesn't change
         # 5 - mimetype -> doesn't change
         if (type (self.model) == gtk.TreeModelFilter):
+            print "Ye un filtered"
             m = self.model.get_model ()
+            c = self.model.convert_iter_to_child_iter (self.current)
         else:
+            # Very unlikely
             m = self.model
-        m.set (self.current,
+            c = self.current
+
+        m.set (c,
                2, self.artist_button.get_value (),
                3, self.title_entry.get_text (),
                4, self.album_button.get_value ())
@@ -123,13 +159,13 @@ class MussorgskyEditPanel (hildon.StackableWindow):
         except IOError, e:
             # This error in case of tracker returning unexistent files.
             # Uhm.... for instance after removing a memory card we are editing!
-            dialog = gtk.MessageDialog (self,
-                                        gtk.DIALOG_DESTROY_WITH_PARENT,
-                                        gtk.MESSAGE_ERROR,
-                                        gtk.BUTTONS_CLOSE,
-                                        "%s" % str(e));
-            dialog.run ()
-
+            pass
+            #dialog = gtk.MessageDialog (self,
+            #                            gtk.DIALOG_DESTROY_WITH_PARENT,
+            #                            gtk.MESSAGE_ERROR,
+            #                            gtk.BUTTONS_CLOSE,
+            #                            "%s" % str(e));
+            #dialog.run ()
         
 
     def __is_view_dirty (self):
@@ -148,16 +184,13 @@ class MussorgskyEditPanel (hildon.StackableWindow):
         view_vbox = gtk.VBox (homogeneous=False, spacing = 12)
 
         filename_row = gtk.HBox ()
-        filename_label = gtk.Label ("Filename:")
+        filename_label = gtk.Label ()
+        filename_label.set_markup ("<small>Filename:</small>")
         filename_row.pack_start (filename_label, expand=False, padding=12);
         self.filename_data = gtk.Label ("")
         filename_row.pack_start (self.filename_data, expand=True)
 
-        play_button = hildon.Button (hildon.BUTTON_STYLE_NORMAL, hildon.BUTTON_ARRANGEMENT_HORIZONTAL)
-        img = gtk.image_new_from_stock (gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_BUTTON)
-        play_button.set_image (img)
-        play_button.connect ("clicked", self.clicked_play)
-        filename_row.pack_start (play_button, expand=False, fill=False)
+        #filename_row.pack_start (play_button, expand=False, fill=False)
         view_vbox.pack_start (filename_row, expand=False);
 
         central_panel = gtk.HBox (spacing=12)
@@ -172,11 +205,11 @@ class MussorgskyEditPanel (hildon.StackableWindow):
         # Title row
         label_title = gtk.Label ("Title:")
         table.attach (label_title, 0, 1, 0, 1, 0)
-        self.title_entry = gtk.Entry()
+        self.title_entry = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT)
         table.attach (self.title_entry, 1, 2, 0, 1)
 
         # Artist row
-        self.artist_button = hildon.PickerButton (hildon.BUTTON_STYLE_NORMAL,
+        self.artist_button = hildon.PickerButton (gtk.HILDON_SIZE_FINGER_HEIGHT,
                                                   hildon.BUTTON_ARRANGEMENT_HORIZONTAL)
         self.artist_button.set_title ("Artist: ")
         # Set data will set the selector
@@ -184,7 +217,7 @@ class MussorgskyEditPanel (hildon.StackableWindow):
 
 
         # Album row
-        self.album_button = hildon.PickerButton (hildon.BUTTON_STYLE_NORMAL,
+        self.album_button = hildon.PickerButton (gtk.HILDON_SIZE_FINGER_HEIGHT,
                                                  hildon.BUTTON_ARRANGEMENT_HORIZONTAL)
         self.album_button.set_title ("Album: ")
         # set_data will set the selector
@@ -197,29 +230,32 @@ class MussorgskyEditPanel (hildon.StackableWindow):
         central_panel.pack_start (self.album_art, expand=False, fill=False)
         
         # Buttons row
-        button_box = gtk.HButtonBox ()
-        button_box.set_layout (gtk.BUTTONBOX_END)
+        button_box = gtk.Toolbar ()
 
-        back_button = hildon.Button (hildon.BUTTON_STYLE_NORMAL, hildon.BUTTON_ARRANGEMENT_HORIZONTAL)
-        img = gtk.image_new_from_stock (gtk.STOCK_GO_BACK, gtk.ICON_SIZE_BUTTON)
-        back_button.set_image (img)
-        back_button.connect ("clicked", self.press_back_cb)
-        button_box.pack_start (back_button, expand=True, fill=True, padding=6)
+        play_button = gtk.ToolButton (gtk.image_new_from_stock (gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_BUTTON))
+        play_button.connect ("clicked", self.clicked_play)                   
+        play_button.set_expand (True)
+        button_box.insert (play_button, -1)
         
-        next_button = hildon.Button (hildon.BUTTON_STYLE_NORMAL, hildon.BUTTON_ARRANGEMENT_HORIZONTAL)
-        img = gtk.image_new_from_stock (gtk.STOCK_GO_FORWARD, gtk.ICON_SIZE_BUTTON)
-        next_button.set_image (img)
+        separator = gtk.SeparatorToolItem ()
+        separator.set_expand (True)
+        button_box.insert  (separator, -1)
+
+        back_button = gtk.ToolButton (gtk.image_new_from_stock (gtk.STOCK_GO_BACK, gtk.ICON_SIZE_BUTTON))
+        back_button.connect ("clicked", self.press_back_cb)
+        back_button.set_expand (True)
+        button_box.insert (back_button, -1)
+
+        next_button = gtk.ToolButton (gtk.image_new_from_stock (gtk.STOCK_GO_FORWARD, gtk.ICON_SIZE_BUTTON))
         next_button.connect ("clicked", self.press_next_cb)
-        button_box.pack_start (next_button, expand=True, fill=True, padding=6)
-        
-        view_vbox.pack_start (button_box, expand=False, fill=True, padding=6)
+        next_button.set_expand (True)
+        button_box.insert (next_button, -1)
+
+        self.add_toolbar (button_box)
         
         self.add (view_vbox)
 
 
-    def go_to_cb (self, widget):
-        pass
-
     def set_data_in_view (self, song):
         """
         Place in the screen the song information.
@@ -227,7 +263,7 @@ class MussorgskyEditPanel (hildon.StackableWindow):
         """
         assert len (song) == 6
         
-        self.filename_data.set_text (song[FILE_URI])
+        self.filename_data.set_markup ("<small>" + song[FILE_URI] + "</small>")
         self.title_entry.set_text (song[TITLE_KEY])
         
 
@@ -244,12 +280,16 @@ class MussorgskyEditPanel (hildon.StackableWindow):
         except ValueError:
             print "'%s' not in artist list!?" % (song[ARTIST_KEY])
             self.artist_button.set_value ("")
+        except AttributeError:
+            print "WARNING: Use set_artist_alternatives method to set a list of artists"
             
         try:
             self.album_button.set_active (self.albums_list.index (song[ALBUM_KEY]))
         except ValueError:
             print "'%s' is not in the album list!?" % (song[ALBUM_KEY])
             self.album_button.set_value ("")
+        except AttributeError:
+            print "WARNING: Use set_album_alternatives method to set a list of artists"
 
         # Reconnect the signals!
         self.album_change_handler = self.album_button.connect ("value-changed",
@@ -290,9 +330,6 @@ class MussorgskyEditPanel (hildon.StackableWindow):
             song = self.songs_list [self.song_counter]
             self.player.play ("file://" + song[FILE_URI])
 
-    def clicked_album_art (self, widget):
-        print "implement me, please"
-
     def album_selection_cb (self, widget):
         """
         On album change, add the album the local list of albums and the selector
@@ -315,7 +352,7 @@ class MussorgskyEditPanel (hildon.StackableWindow):
             print "Inserting artist", widget.get_value ()
             widget.get_selector ().prepend_text (widget.get_value ())
             self.artists_list.insert (0, widget.get_value ())
-    
+
 # Testing porpuses
 if __name__ == "__main__":
 
@@ -329,6 +366,8 @@ if __name__ == "__main__":
         model.append (t)
 
     window = MussorgskyEditPanel ()
+    window.set_artist_alternatives (["", "Bob Dylan"])
+    window.set_album_alternatives (["", "Bring it all back home", "Album 2", "Album 9", "Album 3"])
     window.set_model (model)
     window.connect ("destroy", gtk.main_quit)
     window.show_all ()
index ec29a66..17a6ef2 100755 (executable)
@@ -2,8 +2,8 @@
 import hildon
 import gtk, gobject
 from tracker_backend import TrackerBackend
-from edit_panel import MussorgskyEditPanel
 from album_art_panel import MussorgskyAlbumArtPanel
+from browse_panel import MussorgskyBrowsePanel
 
 class MussorgskyMainWindow (hildon.StackableWindow):
 
@@ -18,8 +18,8 @@ class MussorgskyMainWindow (hildon.StackableWindow):
         self.update_values (None)
         self.show_all ()
         
-    def show_edit_panel (self, songs, albums, artists):
-        panel = MussorgskyEditPanel (songs, albums, artists)
+    def show_edit_panel (self, songs):
+        panel = MussorgskyBrowsePanel (songs)
         panel.connect ("destroy", self.back_to_main_view)
         panel.show_all ()
 
@@ -29,9 +29,7 @@ class MussorgskyMainWindow (hildon.StackableWindow):
 
     def broken_files_clicked (self, widget):
         list_songs = self.tracker.get_all_broken_songs ()
-        list_albums = self.tracker.get_list_of_known_albums ()
-        list_artists = self.tracker.get_list_of_known_artists ()
-        self.show_edit_panel (list_songs, list_albums, list_artists)
+        self.show_edit_panel (list_songs)
 
     def update_values (self, user_data):
         print "Updating labels"
@@ -45,9 +43,7 @@ class MussorgskyMainWindow (hildon.StackableWindow):
 
     def browse_clicked (self, widget):
         list_songs = self.tracker.get_all_songs ()
-        list_albums = self.tracker.get_list_of_known_albums ()
-        list_artists = self.tracker.get_list_of_known_artists ()
-        self.show_edit_panel (list_songs, list_albums, list_artists)
+        self.show_edit_panel (list_songs)
 
     def album_art_clicked (self, widget):
         album_artists = self.tracker.get_all_pairs_album_artist ()