conduit r1405 - in trunk: . conduit/modules/FlickrModule conduit/modules/GoogleModule



Author: jstowers
Date: Thu Apr  3 21:17:24 2008
New Revision: 1405
URL: http://svn.gnome.org/viewvc/conduit?rev=1405&view=rev

Log:
2008-04-04  John Stowers  <john stowers gmail com>

	* conduit/modules/FlickrModule/FlickrModule.py: Refactor the photoset
	code to be more readable and consistent with GoogleModule.
	
	* conduit/modules/GoogleModule/GoogleModule.py:
	* conduit/modules/GoogleModule/picasa-config.glade: User gtk.ComboBoxEntry
	for the album entry and refactor the album code to close match
	FlickrModule (i.e. no explicit album creation, it happens automatically
	when you put a photo into a non existant album).



Modified:
   trunk/ChangeLog
   trunk/conduit/modules/FlickrModule/FlickrModule.py
   trunk/conduit/modules/GoogleModule/GoogleModule.py
   trunk/conduit/modules/GoogleModule/picasa-config.glade

Modified: trunk/conduit/modules/FlickrModule/FlickrModule.py
==============================================================================
--- trunk/conduit/modules/FlickrModule/FlickrModule.py	(original)
+++ trunk/conduit/modules/FlickrModule/FlickrModule.py	Thu Apr  3 21:17:24 2008
@@ -125,30 +125,20 @@
         # get the id
         photoId = ret.photoid[0].elementText
 
-        # check if phtotoset exists, create it otherwise add photo to it
+        # check if phtotoset exists, if not create it
         if not self.photoSetId:
-            # create one with created photoID if not
-            ret = self.fapi.photosets_create(
-                                        title=self.photoSetName,
-                                        primary_photo_id=photoId)
-
-            if self.fapi.getRspErrorCode(ret) != 0:
-                raise Exceptions.SyncronizeError("Flickr failed to create photoset: %s" % self.fapi.getPrintableError(ret))
-
-            self.photoSetId = ret.photoset[0]['id']
-        else:
-            # add photo to photoset
+            self.photoSetId = self._create_photoset(photoId)
+        # add the photo to the photoset
+        if self.photoSetId:
             ret = self.fapi.photosets_addPhoto(
-                                            photoset_id = self.photoSetId,
-                                            photo_id = photoId)
-
+                                photoset_id = self.photoSetId,
+                                photo_id = photoId)
             if self.fapi.getRspErrorCode(ret) != 0:
-                raise Exceptions.SyncronizeError("Flickr failed to add photo to set: %s" % self.fapi.getPrintableError(ret))
+                log.warn("Flickr failed to add photo to set: %s" % self.fapi.getPrintableError(ret))
 
         #return the photoID
         return Rid(uid=photoId)
 
-    
     def _get_photo_size (self):
         return self.imageSize
 
@@ -163,53 +153,64 @@
             self.fapi = MyFlickrAPI(FlickrTwoWay.API_KEY, FlickrTwoWay.SHARED_SECRET, self.username)
             self.token = self.fapi.login()
             self.logged_in = True
+            
+    def _create_photoset(self, primaryPhotoId):
+        #create one with created photoID if not
+        ret = self.fapi.photosets_create(
+                                title=self.photoSetName,
+                                primary_photo_id=primaryPhotoId)
 
+        photoSetId = None
+        if self.fapi.getRspErrorCode(ret) != 0:
+            log.warn("Flickr failed to create photoset: %s" % self.fapi.getPrintableError(ret))
+        else:
+            photoSetId = ret.photoset[0]['id']
+        return photoSetId
+                
+    def _get_photoset(self):
+        for name, photoSetId in self._get_photosets():
+            if name == self.photoSetName:
+                log.debug("Found album %s" % self.photoSetName)
+                self.photoSetId = photoSetId
+                
     def _get_photosets(self):
         ret = self.fapi.photosets_getList()  
         if self.fapi.getRspErrorCode(ret) != 0:
-            raise Exceptions.RefreshError("Flickr Refresh Error: %s" % self.fapi.getPrintableError(ret))
+            log.warn("Flickr Refresh Error: %s" % self.fapi.getPrintableError(ret))
+            return []
 
-        if not hasattr(ret.photosets[0], 'photoset'):
-            return None
+        photosets = []
+        if hasattr(ret.photosets[0], 'photoset'):
+            for pset in ret.photosets[0].photoset:
+                photosets.append(
+                            (pset.title[0].elementText, #photoset name
+                            pset['id']))                #photoset id
+
+        return photosets
+        
+    def _get_photos(self):
+        if not self.photoSetId:
+            return []
 
-        return ret
+        photoList = []
+        ret = self.fapi.photosets_getPhotos(photoset_id=self.photoSetId)
+        if self.fapi.getRspErrorCode(ret) != 0:
+            log.warn("Flickr failed to get photos: %s" % self.fapi.getPrintableError(ret))
+        else:            
+            for photo in ret.photoset[0].photo:
+                photoList.append(photo['id'])
+        return photoList
         
     # DataProvider methods
     def refresh(self):
         Image.ImageTwoWay.refresh(self)
-        #login
         self._login()
-            
-        # try to get the photoSetId
-        ret = self._get_photosets()
-        if not ret:
-            return
-
-        # look up the photo set
-        for set in ret.photosets[0].photoset:
-            if set.title[0].elementText == self.photoSetName:
-                self.photoSetId = set['id']      
-
+        self._get_photoset()            
         used,tot,percent = self._get_user_quota()
         log.debug("Used %2.1f%% of monthly badwidth quota (%skb/%skb)" % (percent,used,tot))
 
     def get_all(self):
-        # return  photos list is filled, raise error if not
-        if not self.photoSetId:
-            return []
-
-        ret = self.fapi.photosets_getPhotos(photoset_id=self.photoSetId)
-
-        if self.fapi.getRspErrorCode (ret) != 0:
-            raise Exceptions.SyncronizeError("Flickr failed to get photos: %s" % self.fapi.getPrintableError(ret))
-
-        photoList = []
-
-        for photo in ret.photoset[0].photo:
-            photoList.append(photo['id'])
-
-        return photoList
-
+        return self._get_photos()
 
     def get (self, LUID):
         # get photo info
@@ -261,49 +262,44 @@
         """
         import gobject
         import gtk
-        tree = Utils.dataprovider_glade_get_widget(
-                        __file__, 
-                        "config.glade", 
-                        "FlickrTwoWayConfigDialog")
-
-
-        def load_click(button, tree):
-            username_entry = tree.get_widget("username")
-
-            self._set_username(username_entry.get_text())
+        def load_click(button, window, usernameEntry, photosetCombo):
+            #set Window cursor to loading
+            #FIXME: Doest do anything because this call blocks the mainloop
+            #anyway
+            window.window.set_cursor(
+                            gtk.gdk.Cursor(gtk.gdk.WATCH))
+            self._set_username(usernameEntry.get_text())
             self._login()
-            build_photoset_model(photoset_combo)
+            if self.logged_in:
+                build_photoset_model(photosetCombo)
+            window.window.set_cursor(None)
 
         def username_changed(entry, load_button):
             load_button.set_sensitive (len(entry.get_text()) > 0)
 
-        def build_photoset_model(photoset_combo):
+        def build_photoset_model(photosetCombo):
             self.photoset_store.clear()
             photoset_count = 0
-
-            # get albums
-            ret = self._get_photosets()            
-            if not ret:
-                return
-
-            # populate combo
             photoset_iter = None
-            for set in ret.photosets[0].photoset:
-                title = set.title[0].elementText
-                iter = self.photoset_store.append((title,))
-                if title == self.photoSetName:
+            for name, photoSetId in self._get_photosets():       
+                iter = self.photoset_store.append((name,))
+                if name == self.photoSetName:
                     photoset_iter = iter
-                photoset_count = photoset_count + 1
+                photoset_count += 1
 
             if photoset_iter:
-                photoset_combo.set_active_iter(photoset_iter)
+                photosetCombo.set_active_iter(photoset_iter)
             elif self.photoSetName:
-                photoset_combo.child.set_text(self.photoSetName)
+                photosetCombo.child.set_text(self.photoSetName)
             elif photoset_count:
-                photoset_combo.set_active(0)
+                photosetCombo.set_active(0)
  
         #get a whole bunch of widgets
-        photoset_combo = tree.get_widget("photoset_combo")
+        tree = Utils.dataprovider_glade_get_widget(
+                        __file__, 
+                        "config.glade", 
+                        "FlickrTwoWayConfigDialog")
+        photosetCombo = tree.get_widget("photoset_combo")
         publicCb = tree.get_widget("public_check")
         username = tree.get_widget("username")
         load_button = tree.get_widget('load_button')
@@ -312,44 +308,41 @@
         resizecombobox = tree.get_widget("resizecombobox")
         self._resize_combobox_build(resizecombobox, self.imageSize)
 
-        # signals
-        load_button.connect('clicked', load_click, tree)
+        #signals
+        load_button.connect('clicked', load_click, window, username, photosetCombo)
         username.connect('changed', username_changed, load_button)
         
         #preload the widgets
         publicCb.set_active(self.showPublic)
         username.set_text(self.username)
 
-        # setup photoset combo
+        #setup photoset combo
         self.photoset_store = gtk.ListStore (gobject.TYPE_STRING)
-        photoset_combo.set_model (self.photoset_store)
+        photosetCombo.set_model(self.photoset_store)
         cell = gtk.CellRendererText()
-        photoset_combo.pack_start(cell, True)
-        photoset_combo.set_text_column(0)
-
-        # if we're logged in, load the full list by default
-        if self.logged_in:
-            build_photoset_model(photoset_combo)
-        # simply set the text, user can load photosets on request            
-        else:
-            photoset_combo.child.set_text(self.photoSetName)            
+        photosetCombo.pack_start(cell, True)
+        photosetCombo.set_text_column(0)
 
+        #disable photoset lookup if no username entered
+        enabled = len(self.username) > 0
+        load_button.set_sensitive(enabled)
+        
         # run dialog 
         dlg = tree.get_widget("FlickrTwoWayConfigDialog")
         response = Utils.run_dialog(dlg, window)
 
         if response == True:
-            # get the values from the widgets
-            self.photoSetName = photoset_combo.child.get_text()
-            self.showPublic = publicCb.get_active()
+            #get the values from the widgets
             self._set_username(username.get_text())
+            self.photoSetName = photosetCombo.get_active_text()
+            self.showPublic = publicCb.get_active()
             self.imageSize = self._resize_combobox_get_active(resizecombobox)
         dlg.destroy()    
 
         del self.photoset_store
        
     def is_configured (self, isSource, isTwoWay):
-        return len (self.username) > 0
+        return len(self.username) > 0 and len(self.photoSetName) > 0
         
     def get_configuration(self):
         return {

Modified: trunk/conduit/modules/GoogleModule/GoogleModule.py
==============================================================================
--- trunk/conduit/modules/GoogleModule/GoogleModule.py	(original)
+++ trunk/conduit/modules/GoogleModule/GoogleModule.py	Thu Apr  3 21:17:24 2008
@@ -533,11 +533,11 @@
     def __init__(self, *args):
         GoogleBase.__init__(self)
         Image.ImageTwoWay.__init__(self)
-        self.album = ""
+        self.albumName = ""
         self.imageSize = "None"
         self.pws = gdata.photos.service.PhotosService()
         self.galbum = None
-        self.gphoto_dict = None
+        self.gphoto_dict = {}
 
     def _get_raw_photo_url(self, photoInfo):
         return photoInfo.GetMediaURL()
@@ -553,11 +553,13 @@
         
     def _upload_photo (self, uploadInfo):
         try:
-            gphoto = self.pws.InsertPhotoSimple (self.galbum, uploadInfo.name, '', uploadInfo.url)
-
+            gphoto = self.pws.InsertPhotoSimple(
+                                self.galbum,
+                                uploadInfo.name,
+                                '',
+                                uploadInfo.url)
             for tag in uploadInfo.tags:
                 self.pws.InsertTag(gphoto, str(tag))
-
             return Rid(uid=gphoto.gphoto_id.text)
         except Exception, e:
             raise Exceptions.SyncronizeError("Picasa Upload Error.")
@@ -566,22 +568,23 @@
         self.pws.ClientLogin(self.username, self.password)
 
     def _get_album(self):
-        configured_album = None
-
-        albums = self.pws.GetUserFeed().entry
-        for album in albums:
-            if album.title.text != self.album:
-                continue
-            log.debug("Found album %s" % self.album)
-            configured_album = album
-            break
-
-        if not configured_album:
-            log.debug("Creating new album %s." % self.album)
-            configured_album = self._create_album(self.album)
-
-        self.galbum = configured_album
-
+        for name,album in self._get_albums():
+            if name == self.albumName:
+                log.debug("Found album %s" % self.albumName)
+                self.galbum = album
+                return
+
+        log.debug("Creating new album %s." % self.albumName)
+        self.galbum = self._create_album(self.albumName)
+
+    def _get_albums(self):
+        albums = []
+        for album in self.pws.GetUserFeed().entry:
+            albums.append(
+                    (album.title.text,  #album name
+                    album))             #album
+        return albums
+        
     def _get_photos(self):
         self.gphoto_dict = {}
         for photo in self.pws.GetFeed(self.galbum.GetPhotosUri()).entry:
@@ -603,9 +606,9 @@
         Image.ImageTwoWay.refresh(self)
         self._login()
         self._get_album()
-        self._get_photos()
 
     def get_all (self):
+        self._get_photos()
         return self.gphoto_dict.keys()
         
     def get (self, LUID):
@@ -634,163 +637,89 @@
         """
         Configures the PicasaTwoWay
         """
+        import gobject
         import gtk
-        self.album_count = 0
-        def __login (button, widget):
-            """
-            Logs in and tries to populate other controls and set their
-            sensitivity correctly
-            """
-            username, password = __get_username_password_widgets(widget)
-
-            self._set_username(username.get_text())
-            self._set_password(password.get_text())
+        def login_click(button, window, usernameEntry, passwordEntry, album_combo):
+            #set Window cursor to loading
+            #FIXME: Doest do anything because this call blocks the mainloop
+            #anyway
+            window.window.set_cursor(
+                            gtk.gdk.Cursor(gtk.gdk.WATCH))
+            self._set_username(usernameEntry.get_text())
+            self._set_password(passwordEntry.get_text())
             self._login()
-
-            album_combo, ok_button = __get_album_combo_ok_widgets(widget)
-
             if self.loggedIn:
-                __build_album_combo(album_combo)
-
-            enabled = self.loggedIn and self.album_count > 0
-            ok_button.set_sensitive(enabled)
-            album_combo.set_sensitive(enabled)
-
-        def __new_album(button, config_widget):
-            """
-            Pops up a dialog to create a new album.  
-            config_widget is the parent window
-            """
-            # get new album dialog
-            widget = Utils.dataprovider_glade_get_widget(
-                            __file__, 
-                            "picasa-config.glade", 
-                            "AlbumDialog")
-
-            dlg = widget.get_widget("AlbumDialog")
-            name_entry = widget.get_widget("name_entry")
-
-            # run the dialog
-            config_dialog = config_widget.get_widget("PicasaTwoWayConfigDialog")
-            response = Utils.run_dialog (dlg, config_dialog)
-            # get new name
-            new_album_name = name_entry.get_text().strip()
-
-            # create new one, if it doesn't exist yet
-            if response and new_album_name:
-                if not new_album_name in (album.title.text for album in self.pws.GetUserFeed().entry):
-                    # create the album
-                    self._create_album (new_album_name) 
-                    # set album to newly created one
-                    self.album = new_album_name
-                    # get some widgets
-                    album_combo, ok_button = __get_album_combo_ok_widgets(config_widget)
-                    # refresh the combo
-                    __build_album_combo(album_combo)
-                    # refresh buttons
-                    enabled = self.loggedIn and self.album_count > 0
-                    album_combo.set_sensitive(enabled)
-                    ok_button.set_sensitive(enabled)
-
-            dlg.destroy()
-
-        def __build_album_combo(album_combo):
-            """
-            Populates the given album combo with the list of albums
-            """
-            # clear the store
-            self.album_store.clear ()
-            self.album_count = 0
-            # keep configured one
+                build_album_model(album_combo)
+                #album_combo.set_sensitive(True)
+            window.window.set_cursor(None)
+
+        def username_password_changed(sender, username, password, login_button):
+            login_button.set_sensitive(
+                            len(username.get_text()) > 0 and len(password.get_text()) > 0)
+
+        def build_album_model(album_combo):
+            self.album_store.clear()
+            album_count = 0
             album_iter = None
-            # loop through user feed
-            for album in self.pws.GetUserFeed().entry:
-                title = album.title.text
-                # append to store
-                iter = self.album_store.append ((title,))
-                if title == self.album:
+            for name, album in self._get_albums():       
+                iter = self.album_store.append((name,))
+                if name == self.albumName:
                     album_iter = iter
-                self.album_count = self.album_count + 1
+                album_count += 1
 
-            # did we find an iter?
             if album_iter:
                 album_combo.set_active_iter(album_iter)
-            # activate first one
-            elif self.album_count > 0:
+            elif self.albumName:
+                album_combo.child.set_text(self.albumName)
+            elif album_count:
                 album_combo.set_active(0)
-
-        def __get_username_password_widgets(widget):
-            username = widget.get_widget('username')
-            password = widget.get_widget('password')
-            return username, password                
-
-        def __get_album_combo_ok_widgets(widget):
-            album_combo = widget.get_widget('album_combo')
-            ok_button = widget.get_widget('ok_button')
-            return album_combo, ok_button
-
-        # put cursor in waiting mode
-        watch = gtk.gdk.Cursor(gtk.gdk.WATCH)
-        window.window.set_cursor(watch)
-
-        # try loggin in if not done yet
-        if not self.loggedIn:
-            self._login()
-           
-        # get widget and dialog 
-        widget = Utils.dataprovider_glade_get_widget(
+        
+        #get widget and dialog 
+        tree = Utils.dataprovider_glade_get_widget(
                         __file__, 
                         "picasa-config.glade", 
                         "PicasaTwoWayConfigDialog")
-        dlg = widget.get_widget("PicasaTwoWayConfigDialog")
 
         #get a whole bunch of widgets
-        username, password = __get_username_password_widgets(widget)
-        album_combo, ok_button = __get_album_combo_ok_widgets(widget)
-        login_button = widget.get_widget("login_button")
-        new_album_button = widget.get_widget("new_album")
-        resizecombobox = widget.get_widget("combobox1")
-
-        # connect to signals
-        login_button.connect('clicked', __login, widget)
-        new_album_button.connect('clicked', __new_album, widget)
-
-        # setup album combo
-        self.album_store = gtk.ListStore (gobject.TYPE_STRING)
-        album_combo.set_model (self.album_store)
-        cell = gtk.CellRendererText()
-        album_combo.pack_start(cell, True)
-        album_combo.add_attribute(cell, 'text', 0)
+        username = tree.get_widget('username')
+        password = tree.get_widget('password')
+        album_combo = tree.get_widget('album_combobox')
+        login_button = tree.get_widget("login_button")
 
-        # disable if not logged in
-        enabled = self.loggedIn and self.album_count > 0
-        ok_button.set_sensitive(self.loggedIn)
-        album_combo.set_sensitive(self.loggedIn)
-        new_album_button.set_sensitive(self.loggedIn)
-
-        # build album list if we're logged in
-        if self.loggedIn:
-            __build_album_combo(album_combo)
+        resizecombobox = tree.get_widget("resize_combobox")
+        self._resize_combobox_build(resizecombobox, self.imageSize)
 
-        # Stop watch cursor
-        window.window.set_cursor(None)            
+        #connect to signals
+        login_button.connect('clicked', login_click, window, username, password, album_combo)
+        username.connect('changed', username_password_changed, username, password, login_button)
+        password.connect('changed', username_password_changed, username, password, login_button)
         
         #preload the widgets        
         username.set_text(self.username)
         password.set_text(self.password)
 
-        self._resize_combobox_build(resizecombobox, self.imageSize)
-       
+        #setup album combo
+        self.album_store = gtk.ListStore(gobject.TYPE_STRING)
+        album_combo.set_model (self.album_store)
+        cell = gtk.CellRendererText()
+        album_combo.pack_start(cell, True)
+        album_combo.set_text_column(0)
+        
+        #disable album lookup if no username entered
+        enabled = len(self.username) > 0
+        login_button.set_sensitive(enabled)
+        #album_combo.set_sensitive(enabled)
+
         # Now run the dialog 
+        dlg = tree.get_widget("PicasaTwoWayConfigDialog")
         response = Utils.run_dialog (dlg, window)
         if response == True:
             self._set_username(username.get_text())
             self._set_password(password.get_text())
-            self.album = album_combo.get_active_text()
+            self.albumName = album_combo.get_active_text()
             self.imageSize = self._resize_combobox_get_active(resizecombobox)
 
         # cleanup
-        del self.album_count
         del self.album_store
         dlg.destroy()    
         
@@ -798,18 +727,18 @@
         conf = GoogleBase.get_configuration(self)
         conf.update({
             "imageSize" :   self.imageSize,
-            "album"     :   self.album})
+            "album"     :   self.albumName})
         return conf
         
     def set_configuration(self, config):
         GoogleBase.set_configuration(self, config)
         self.imageSize = config.get("imageSize","None")
-        self.album = config.get("album","")
+        self.albumName = config.get("album","")
 
     def is_configured (self, isSource, isTwoWay):
         if not GoogleBase.is_configured(self, isSource, isTwoWay):
             return False
-        if len(self.album) < 1:
+        if len(self.albumName) < 1:
             return False
         return True
 

Modified: trunk/conduit/modules/GoogleModule/picasa-config.glade
==============================================================================
--- trunk/conduit/modules/GoogleModule/picasa-config.glade	(original)
+++ trunk/conduit/modules/GoogleModule/picasa-config.glade	Thu Apr  3 21:17:24 2008
@@ -1,465 +1,195 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd";>
-
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
+<!--*- mode: xml -*-->
 <glade-interface>
-
-<widget class="GtkDialog" id="PicasaTwoWayConfigDialog">
-  <property name="visible">True</property>
-  <property name="title" translatable="yes">Picasa</property>
-  <property name="type">GTK_WINDOW_TOPLEVEL</property>
-  <property name="window_position">GTK_WIN_POS_NONE</property>
-  <property name="modal">False</property>
-  <property name="default_width">250</property>
-  <property name="default_height">350</property>
-  <property name="resizable">False</property>
-  <property name="destroy_with_parent">False</property>
-  <property name="decorated">True</property>
-  <property name="skip_taskbar_hint">False</property>
-  <property name="skip_pager_hint">False</property>
-  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
-  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-  <property name="focus_on_map">True</property>
-  <property name="urgency_hint">False</property>
-  <property name="has_separator">True</property>
-
-  <child internal-child="vbox">
-    <widget class="GtkVBox" id="vbox30">
-      <property name="visible">True</property>
-      <property name="homogeneous">False</property>
-      <property name="spacing">5</property>
-
-      <child internal-child="action_area">
-	<widget class="GtkHButtonBox" id="hbuttonbox12">
-	  <property name="visible">True</property>
-	  <property name="layout_style">GTK_BUTTONBOX_END</property>
-
-	  <child>
-	    <widget class="GtkButton" id="button32">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-cancel</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-6</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="ok_button">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-ok</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-5</property>
-	    </widget>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">True</property>
-	  <property name="pack_type">GTK_PACK_END</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkLabel" id="label74">
-	  <property name="visible">True</property>
-	  <property name="label" translatable="yes">&lt;b&gt;Account Details&lt;/b&gt;</property>
-	  <property name="use_underline">False</property>
-	  <property name="use_markup">True</property>
-	  <property name="justify">GTK_JUSTIFY_LEFT</property>
-	  <property name="wrap">False</property>
-	  <property name="selectable">False</property>
-	  <property name="xalign">0.5</property>
-	  <property name="yalign">0.5</property>
-	  <property name="xpad">0</property>
-	  <property name="ypad">0</property>
-	  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-	  <property name="width_chars">-1</property>
-	  <property name="single_line_mode">False</property>
-	  <property name="angle">0</property>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">False</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkLabel" id="label75">
-	  <property name="visible">True</property>
-	  <property name="label" translatable="yes">Username:</property>
-	  <property name="use_underline">False</property>
-	  <property name="use_markup">False</property>
-	  <property name="justify">GTK_JUSTIFY_LEFT</property>
-	  <property name="wrap">False</property>
-	  <property name="selectable">False</property>
-	  <property name="xalign">0</property>
-	  <property name="yalign">0.5</property>
-	  <property name="xpad">0</property>
-	  <property name="ypad">0</property>
-	  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-	  <property name="width_chars">-1</property>
-	  <property name="single_line_mode">False</property>
-	  <property name="angle">0</property>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">False</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkEntry" id="username">
-	  <property name="visible">True</property>
-	  <property name="can_focus">True</property>
-	  <property name="editable">True</property>
-	  <property name="visibility">True</property>
-	  <property name="max_length">0</property>
-	  <property name="text" translatable="yes"></property>
-	  <property name="has_frame">True</property>
-	  <property name="invisible_char">â</property>
-	  <property name="activates_default">False</property>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">False</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkLabel" id="label76">
-	  <property name="visible">True</property>
-	  <property name="label" translatable="yes">Password:</property>
-	  <property name="use_underline">False</property>
-	  <property name="use_markup">False</property>
-	  <property name="justify">GTK_JUSTIFY_LEFT</property>
-	  <property name="wrap">False</property>
-	  <property name="selectable">False</property>
-	  <property name="xalign">0</property>
-	  <property name="yalign">0.5</property>
-	  <property name="xpad">0</property>
-	  <property name="ypad">0</property>
-	  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-	  <property name="width_chars">-1</property>
-	  <property name="single_line_mode">False</property>
-	  <property name="angle">0</property>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">False</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkEntry" id="password">
-	  <property name="visible">True</property>
-	  <property name="can_focus">True</property>
-	  <property name="editable">True</property>
-	  <property name="visibility">True</property>
-	  <property name="max_length">0</property>
-	  <property name="text" translatable="yes"></property>
-	  <property name="has_frame">True</property>
-	  <property name="invisible_char">â</property>
-	  <property name="activates_default">False</property>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">False</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkButton" id="login_button">
-	  <property name="visible">True</property>
-	  <property name="can_focus">True</property>
-	  <property name="label" translatable="yes">Login</property>
-	  <property name="use_underline">True</property>
-	  <property name="relief">GTK_RELIEF_NORMAL</property>
-	  <property name="focus_on_click">True</property>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">False</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkHSeparator" id="hseparator1">
-	  <property name="visible">True</property>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">False</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkLabel" id="label78">
-	  <property name="visible">True</property>
-	  <property name="label" translatable="yes">&lt;b&gt;Saved Photo Settings&lt;/b&gt;</property>
-	  <property name="use_underline">False</property>
-	  <property name="use_markup">True</property>
-	  <property name="justify">GTK_JUSTIFY_LEFT</property>
-	  <property name="wrap">False</property>
-	  <property name="selectable">False</property>
-	  <property name="xalign">0.5</property>
-	  <property name="yalign">0.5</property>
-	  <property name="xpad">0</property>
-	  <property name="ypad">0</property>
-	  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-	  <property name="width_chars">-1</property>
-	  <property name="single_line_mode">False</property>
-	  <property name="angle">0</property>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">False</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkLabel" id="label77">
-	  <property name="visible">True</property>
-	  <property name="label" translatable="yes">Album:</property>
-	  <property name="use_underline">False</property>
-	  <property name="use_markup">False</property>
-	  <property name="justify">GTK_JUSTIFY_LEFT</property>
-	  <property name="wrap">False</property>
-	  <property name="selectable">False</property>
-	  <property name="xalign">0</property>
-	  <property name="yalign">0.5</property>
-	  <property name="xpad">0</property>
-	  <property name="ypad">0</property>
-	  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-	  <property name="width_chars">-1</property>
-	  <property name="single_line_mode">False</property>
-	  <property name="angle">0</property>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">False</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkHBox" id="hbox2">
-	  <property name="visible">True</property>
-	  <property name="homogeneous">False</property>
-	  <property name="spacing">0</property>
-
-	  <child>
-	    <widget class="GtkComboBox" id="album_combo">
-	      <property name="visible">True</property>
-	      <property name="add_tearoffs">False</property>
-	      <property name="focus_on_click">True</property>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">True</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="new_album">
-	      <property name="visible">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label" translatable="yes">New</property>
-	      <property name="use_underline">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">False</property>
-	      <property name="fill">False</property>
-	    </packing>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">False</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkLabel" id="label1">
-	  <property name="visible">True</property>
-	  <property name="label" translatable="yes">Resize Photos:</property>
-	  <property name="use_underline">False</property>
-	  <property name="use_markup">False</property>
-	  <property name="justify">GTK_JUSTIFY_LEFT</property>
-	  <property name="wrap">False</property>
-	  <property name="selectable">False</property>
-	  <property name="xalign">0</property>
-	  <property name="yalign">0.5</property>
-	  <property name="xpad">0</property>
-	  <property name="ypad">0</property>
-	  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-	  <property name="width_chars">-1</property>
-	  <property name="single_line_mode">False</property>
-	  <property name="angle">0</property>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">False</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkComboBox" id="combobox1">
-	  <property name="visible">True</property>
-	  <property name="add_tearoffs">False</property>
-	  <property name="focus_on_click">True</property>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">True</property>
-	  <property name="fill">True</property>
-	</packing>
-      </child>
-    </widget>
-  </child>
-</widget>
-
-<widget class="GtkDialog" id="AlbumDialog">
-  <property name="visible">True</property>
-  <property name="title" translatable="yes">New Album</property>
-  <property name="type">GTK_WINDOW_TOPLEVEL</property>
-  <property name="window_position">GTK_WIN_POS_NONE</property>
-  <property name="modal">False</property>
-  <property name="resizable">True</property>
-  <property name="destroy_with_parent">False</property>
-  <property name="decorated">True</property>
-  <property name="skip_taskbar_hint">False</property>
-  <property name="skip_pager_hint">False</property>
-  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
-  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-  <property name="focus_on_map">True</property>
-  <property name="urgency_hint">False</property>
-  <property name="has_separator">True</property>
-
-  <child internal-child="vbox">
-    <widget class="GtkVBox" id="dialog-vbox1">
-      <property name="visible">True</property>
-      <property name="homogeneous">False</property>
-      <property name="spacing">0</property>
-
-      <child internal-child="action_area">
-	<widget class="GtkHButtonBox" id="dialog-action_area1">
-	  <property name="visible">True</property>
-	  <property name="layout_style">GTK_BUTTONBOX_END</property>
-
-	  <child>
-	    <widget class="GtkButton" id="cancelbutton1">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-cancel</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-6</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="okbutton1">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-ok</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-5</property>
-	    </widget>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">True</property>
-	  <property name="pack_type">GTK_PACK_END</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkHBox" id="hbox1">
-	  <property name="visible">True</property>
-	  <property name="homogeneous">False</property>
-	  <property name="spacing">0</property>
-
-	  <child>
-	    <widget class="GtkLabel" id="label79">
-	      <property name="visible">True</property>
-	      <property name="label" translatable="yes">Name: </property>
-	      <property name="use_underline">False</property>
-	      <property name="use_markup">False</property>
-	      <property name="justify">GTK_JUSTIFY_LEFT</property>
-	      <property name="wrap">False</property>
-	      <property name="selectable">False</property>
-	      <property name="xalign">0.5</property>
-	      <property name="yalign">0.5</property>
-	      <property name="xpad">0</property>
-	      <property name="ypad">0</property>
-	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-	      <property name="width_chars">-1</property>
-	      <property name="single_line_mode">False</property>
-	      <property name="angle">0</property>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">False</property>
-	      <property name="fill">False</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkEntry" id="name_entry">
-	      <property name="visible">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="editable">True</property>
-	      <property name="visibility">True</property>
-	      <property name="max_length">0</property>
-	      <property name="text" translatable="yes"></property>
-	      <property name="has_frame">True</property>
-	      <property name="invisible_char">â</property>
-	      <property name="activates_default">False</property>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">True</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">True</property>
-	  <property name="fill">True</property>
-	</packing>
-      </child>
-    </widget>
-  </child>
-</widget>
-
+  <widget class="GtkDialog" id="PicasaTwoWayConfigDialog">
+    <property name="visible">True</property>
+    <property name="title" translatable="yes">Picasa</property>
+    <property name="resizable">False</property>
+    <property name="default_width">250</property>
+    <property name="default_height">350</property>
+    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+    <child internal-child="vbox">
+      <widget class="GtkVBox" id="vbox30">
+        <property name="visible">True</property>
+        <property name="spacing">5</property>
+        <child>
+          <widget class="GtkLabel" id="label74">
+            <property name="visible">True</property>
+            <property name="label" translatable="yes">&lt;b&gt;Account Details&lt;/b&gt;</property>
+            <property name="use_markup">True</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkLabel" id="label75">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">Username:</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkEntry" id="username">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">4</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkLabel" id="label76">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">Password:</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">5</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkEntry" id="password">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="visibility">False</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">6</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkButton" id="login_button">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="label" translatable="yes">Login</property>
+            <property name="use_underline">True</property>
+            <property name="response_id">0</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">7</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkHSeparator" id="hseparator1">
+            <property name="visible">True</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">8</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkLabel" id="label78">
+            <property name="visible">True</property>
+            <property name="label" translatable="yes">&lt;b&gt;Saved Photo Settings&lt;/b&gt;</property>
+            <property name="use_markup">True</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">9</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkLabel" id="label77">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">Album:</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">10</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkComboBoxEntry" id="album_combobox">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <child internal-child="entry">
+              <widget class="GtkEntry" id="album_combo_entry">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+              </widget>
+            </child>
+          </widget>
+          <packing>
+            <property name="position">11</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkLabel" id="label1">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">Resize Photos:</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">12</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkComboBox" id="resize_combobox">
+            <property name="visible">True</property>
+          </widget>
+          <packing>
+            <property name="position">13</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <widget class="GtkHButtonBox" id="hbuttonbox12">
+            <property name="visible">True</property>
+            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <child>
+              <widget class="GtkButton" id="button32">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="label">gtk-cancel</property>
+                <property name="use_stock">True</property>
+                <property name="response_id">-6</property>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkButton" id="ok_button">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="label">gtk-ok</property>
+                <property name="use_stock">True</property>
+                <property name="response_id">-5</property>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">GTK_PACK_END</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
 </glade-interface>



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]