Changed ComboBox by a Label for editing categories
author"German Poo-Caaman~o <gpoo@gnome.org>"
Thu, 04 Jan 2007 01:05:39 -0300
changeset 25 df6f67f71534
parent 24 8cd7a897349e
child 26 c7a07408dd62
Changed ComboBox by a Label for editing categories
blogic/BlogEngine.py
blogic/BlogMovableType.py
blogic/app.py
blogic/blog_gconf.py
dialogs/blogic.glade
--- a/blogic/BlogEngine.py	Wed Jan 03 21:45:33 2007 -0300
+++ b/blogic/BlogEngine.py	Thu Jan 04 01:05:39 2007 -0300
@@ -29,7 +29,7 @@
 		if engine == 'mt':
 			engine = 'MovableType'
 
-		print engine
+		print "BlogEngine::%s" % engine
 		protocol = self._get_backend(engine)
 		self.backend = protocol.Blog(url, user, passwd)
 
--- a/blogic/BlogMovableType.py	Wed Jan 03 21:45:33 2007 -0300
+++ b/blogic/BlogMovableType.py	Thu Jan 04 01:05:39 2007 -0300
@@ -49,13 +49,13 @@
 		return content
 
 	def _fill_category(self, cat_id):
-		# Create the struct with the category information, then pass that to a list.
+		# Create the struct with the category information, then 
+		# return it as a list.
 		category_list = []
-		category = {}
-		category['categoryId'] = cat_id
-		category['isPrimary'] = xmlrpclib.True
-		category_list.append(category)
-		
+		for id, is_primary in cat_id.items():
+			category_list += [ { 'categoryId': id, 
+			                     'isPrimary': is_primary 
+			                   } ]
 		return category_list
 
 	def post_new(self, blog_id, cat_id, publish, data):
@@ -101,8 +101,14 @@
 						self.user, self.passwd)
 
 	def get_category_list(self, blog_id):
-		return self.rpc_server.mt.getCategoryList(blog_id, 
+		data = self.rpc_server.mt.getCategoryList(blog_id, 
 						self.user, self.passwd)
+		categories = {}
+		for cat in data:
+			id = cat['categoryId']
+			name = cat['categoryName']
+			categories[id] = name
+		return categories
 
 	def get_post(self, post_id):
 		try:
@@ -116,18 +122,17 @@
 		return post
 
 	def get_categories_for_post(self, post_id):
-		primary = ""
-		categories = []
+		categories = {}
 		try:
 			result = self.rpc_server.mt.getPostCategories(post_id, 
 			                      self.user, self.passwd)
+			categories = {}
 			for item in result:
-				if item['isPrimary'] == xmlrpclib.True:
-					primary = item['categoryId']
-				categories += [ item['categoryId'] ]
+				id = item['categoryId']
+				categories[id] = item['isPrimary']
 		except:
 			raise
-		return (primary, categories)
+		return categories
 
 	def get_last_entries(self, blog_id, n):
 		"""Retrieve last 'n' entries from the server"""
--- a/blogic/app.py	Wed Jan 03 21:45:33 2007 -0300
+++ b/blogic/app.py	Thu Jan 04 01:05:39 2007 -0300
@@ -46,8 +46,9 @@
 import BlogEngine
 from BlogBase import BlogData
 
-def print_debug(msg):
-	print msg
+class Category:
+	primary = {}
+	secondary = {}
 
 class Blogic(BlogSettings):
 	default_ui = {
@@ -91,7 +92,12 @@
 	def __init__(self):
 		self.blogs = {}
 		self.categories = {}
+		self.category = Category()
+		self.category_sync = False
+		self.categories_primary = {}
+		self.categories_secondary = {}
 		self.filename = None
+		self.blog_name = None
 		
 		BlogSettings.__init__(self, 'blogic')
 
@@ -116,11 +122,7 @@
 		self.allow_comments = self.gxml.get_widget('allow_comments_menu')
 
 		# Categories of Blogs
-		self.categories_combo = self.gxml.get_widget('categories')
 		self.label_categories = self.gxml.get_widget('label_categories')
-		model = gtk.ListStore(str, str)
-		self.categories_combo.set_model(model)
-		self.categories_combo.set_text_column(0)
 
 		# Editor
 		self.editor = Editor()
@@ -224,7 +226,7 @@
 		return False
 
 	def on_preferences_activate(self, widget, user_data=None):
-		print_debug("on preferences activate")
+		pass
 
 	def on_about_activate(self, widget, user_data=None):
 		ui_file = environ.find_resource('glade', 'blogic.glade')
@@ -413,8 +415,6 @@
 		blog = self.blog_get_data(blog_name)
 		self.system = blog["system"]
 
-		print "get_blog::blog_id:", blog["blog_id"]
-
 		self.blog_engine = BlogEngine.Blog(blog["system"], 
 			                             blog["url"], 
 			                             blog["blog_id"], 
@@ -426,86 +426,72 @@
 	
 		return True
 	
-	### FIXME: It shouldn't use neither categoryName or categoryId.
-	### both of them should be abstracted.
-	def on_blogs_changed(self, widget, user_data=None):
-		"""Update the categories associated to a specific blog"""
-		blog_id = self.blog_engine.get_blog_id()
-		model = self.categories_combo.get_model()
-		model.clear()
-
-		if len(self.categories) <= 0:
-			self.categories = self.get_categories()
-
-		if not self.categories.has_key(blog_id):
-			print_debug("%s doesn't have categories" % (blog_id))
-			return
+	def get_categories_id(self):
+		"""Get the category's id selected in the ComboBoxEntry"""
+		result = {}
+		for id in self.categories_secondary.keys():
+			result[id] = False
+		for id in self.categories_primary.keys():
+			result[id] = True
 
-		categories = self.categories[blog_id]
-
-		for item in categories:
-			model.append([item['categoryName'], item['categoryId']])
-
-		model.set_sort_column_id(0, gtk.SORT_ASCENDING)
-		self.categories_combo.set_active(0)
-
-	def get_category_id(self):
-		"""Get the category's id selected in the ComboBoxEntry"""
-		model = self.categories_combo.get_model()
-		active = self.categories_combo.get_active()
-		if active != -1:
-			return model[active][1]
-		else:
-			return "0"
+		return result
 
 	def get_categories(self, blog_name):
 		"""Get all categories from an account and Update the 
 		categories associated to a specific blog"""
-	#	categories = {}
-	#	for id in self.blogs.keys():
-	#		categories[id] = self.blog_engine.get_category_list(id)
-	#	return categories
-		print "get_categories::blog_name:", blog_name
 		self.categories = self.blog_get_categories(blog_name)
 
-		model = self.categories_combo.get_model()
-		model.clear()
-
-		#if not self.categories.has_key(blog_name):
-		#	print_debug("%s doesn't have categories" % (blog_name))
-		#	return
-
-		for id in self.categories.keys():
-			model.append([self.categories[id], id])
-
-		model.set_sort_column_id(0, gtk.SORT_ASCENDING)
-		self.categories_combo.set_active(0)
-
 	def on_button_categories_clicked(self, *args):
 		blog_id = self.blog_engine.get_blog_id()
-		print "on_button_categories_clicked::blog_id", blog_id
-		category_list = self.blog_engine.get_category_list(blog_id)
 		categories = []
-		for cat in category_list:
-			categories += [ (cat['categoryId'], 
-			                 False, False, 
-			                 cat['categoryName']) ]
+		if not self.category_sync:
+			category_list = self.blog_engine.get_category_list(blog_id)
+			self.blog_set_categories(self.blog_name, category_list)
+			self.category_sync = True
 
-		dialog = CategoryDialog(data=categories)
+			for id, name in category_list.items():
+			#	categories += [ (id, False, False, name) ]
+			#for id, name in self.categories.items():
+				is_primary = self.categories_primary.has_key(id)
+				is_secondary = self.categories_secondary.has_key(id)
+				categories += [ (id, is_primary, is_secondary, name) ]
+		else:
+			for id, name in self.categories.items():
+				is_primary = self.categories_primary.has_key(id)
+				is_secondary = self.categories_secondary.has_key(id)
+				categories += [ (id, is_primary, is_secondary, name) ]
+
+		dialog = CategoryDialog(categories)
 		dialog.set_default_size(300,250)
 		dialog.show_all()
 		result = dialog.run()
 
 		if result == gtk.RESPONSE_OK:
 			primary, secondary = dialog.get_categories_choosen()
-
-			text = '<b>%s</b>' % ('; ').join(primary.values())
-			text += ', %s' % ('; ').join(secondary.values())
-			self.label_categories.set_text(text)
-			self.label_categories.set_use_markup(True)
+			self.categories_primary = primary
+			self.categories_secondary = secondary
+			self.update_label_categories(primary, secondary)
 
 		dialog.hide()
 
+	def update_label_categories(self, primary, secondary):
+		bold = []
+		for id in primary.keys():
+			if self.categories.has_key(id):
+				bold += [ self.categories[id] ]
+		text = '<b>%s</b>' % ('; ').join(bold)
+
+		normal = []
+		for id in secondary.keys():
+			if self.categories.has_key(id):
+				normal += [ self.categories[id] ]
+
+		if normal:
+			text += '; %s' % ('; ').join(normal)
+
+		self.label_categories.set_text(text)
+		self.label_categories.set_use_markup(True)
+
 	def on_post_activate(self, widget, user_data=None):
 		self.post(True)
 
@@ -521,7 +507,7 @@
 		data.text = self.editor.get_body().encode("utf-8")
 		
 		blog_id = self.blog_engine.get_blog_id()
-		category_id = self.get_category_id()
+		categories = self.get_categories_id()
 
 		data.keywords = self.keywords.get_text()
 		data.trackback = self.trackback.get_text()
@@ -533,7 +519,7 @@
 		# If the message is new, post_id is -1, else has the post_id.
 		self.statusbar.push(1, _("Posting the message..."))
 		if self.post_id == -1:
-			self.post_id = self.blog_engine.post_new(category_id, 
+			self.post_id = self.blog_engine.post_new(categories, 
 			                                         publish, data)
 			if self.post_id == -1:
 				text = _("An error has ocurred to post the message.")
@@ -541,7 +527,7 @@
 				text = _("The message has been successfully posted")
 				self.editor.set_modified(False)
 		else:
-			result = self.blog_engine.post_edit(category_id,
+			result = self.blog_engine.post_edit(categories,
 			                                    self.post_id, publish, 
 			                                    data)
 			if result == 1:
@@ -568,19 +554,8 @@
 		window.show_all()
 
 	def on_history_post_selected(self, widget, post):
-		for i in post.categories:
-			print_debug(i)
+		# FIXME: Update to the code of category
 
-		"""Select the right category according to the post's category"""
-		model = self.categories_combo.get_model()
-		n = 0
-		for row in model:
-			if row[1] == post.primary_category:
-				self.categories_combo.set_active(n)
-				break
-			n += 1
-		
-		print "Title", post.title
 		self.editor.set_title(post.title)
 		self.editor.set_body(post.text)
 		
@@ -625,21 +600,19 @@
 		if (len(post_id.get_text()) > 0):
 			post = self.blog_engine.get_post(post_id.get_text())
 
-		(post.primary_category, post.categories) = \
-		     self.blog_engine.get_categories_for_post(post.post_id)
-
-		for i in post.categories:
-			print_debug(i)
+		categories = self.blog_engine.get_categories_for_post(post.post_id)
 
-		"""Select the right category according to the post's category"""
-		model = self.categories_combo.get_model()
-		n = 0
-		for row in model:
-			if row[1] == post.primary_category:
-				self.categories_combo.set_active(n)
-				break
-			n += 1
-		
+		self.categories_primary = {}
+		self.categories_secondary = {}
+		for id, is_primary in categories.items():
+			if is_primary:
+				self.categories_primary[id] = True
+			else:
+				self.categories_secondary[id] = False
+
+		self.update_label_categories(self.categories_primary,
+		                             self.categories_secondary)
+
 		self.editor.set_title(post.title)
 		self.editor.set_body(post.text)
 		
@@ -759,8 +732,6 @@
 			gnome.url_show(url)
 
 	def on_url_url_changed(self, widget, user_data=None):
-		#print_debug(widget)
-		#print_debug(user_data)
 		pass
 
 	def on_insert_image_activate(self, widget, user_data=None):
@@ -821,14 +792,13 @@
 
 		self.is_spell_active = not self.is_spell_active
 
-	def on_blog_list_activate(self, widget, data=None):
-		print_debug("widget: %s, %s, %s" % (widget.active , \
-		            widget.get_name(), data))
+	def on_blog_list_activate(self, widget, blog_name=None):
 		if widget.get_active():
-			self.gconf["last_blog"] = data
-			if (self.get_blog(data)):
-				self.set_title(data)
-				self.get_categories(data)
+			self.gconf["last_blog"] = blog_name
+			if (self.get_blog(blog_name)):
+				self.set_title(blog_name)
+				self.get_categories(blog_name)
+				self.blog_name = blog_name
 			else:
 				self.set_title()
 
--- a/blogic/blog_gconf.py	Wed Jan 03 21:45:33 2007 -0300
+++ b/blogic/blog_gconf.py	Thu Jan 04 01:05:39 2007 -0300
@@ -214,8 +214,6 @@
 			category_id += [id]
 			category_name += [name]
 
-		print category_id, category_name
-
 		self.gconf["category_id"] = category_id
 		self.gconf["category_name"] = category_name
 
--- a/dialogs/blogic.glade	Wed Jan 03 21:45:33 2007 -0300
+++ b/dialogs/blogic.glade	Thu Jan 04 01:05:39 2007 -0300
@@ -1000,14 +1000,14 @@
 	      <property name="border_width">6</property>
 	      <property name="visible">True</property>
 	      <property name="homogeneous">False</property>
-	      <property name="spacing">0</property>
+	      <property name="spacing">6</property>
 
 	      <child>
 		<widget class="GtkVBox" id="vbox_entry">
 		  <property name="border_width">6</property>
 		  <property name="visible">True</property>
 		  <property name="homogeneous">False</property>
-		  <property name="spacing">6</property>
+		  <property name="spacing">0</property>
 
 		  <child>
 		    <widget class="GtkHBox" id="hbox_entry">
@@ -1060,73 +1060,45 @@
 		  </child>
 
 		  <child>
-		    <widget class="GtkVBox" id="vbox48">
-		      <property name="border_width">6</property>
+		    <widget class="GtkHBox" id="hbox_title">
 		      <property name="visible">True</property>
 		      <property name="homogeneous">False</property>
 		      <property name="spacing">6</property>
 
 		      <child>
-			<widget class="GtkHBox" id="hbox_title">
+			<widget class="GtkButton" id="button_categories">
 			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">6</property>
-
-			  <child>
-			    <widget class="GtkButton" id="button_categories">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">_Category:</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NONE</property>
-			      <property name="focus_on_click">True</property>
-			      <signal name="clicked" handler="on_button_categories_clicked" last_modification_time="Wed, 03 Jan 2007 18:55:42 GMT"/>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">_Category:</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NONE</property>
+			  <property name="focus_on_click">True</property>
+			  <signal name="clicked" handler="on_button_categories_clicked" last_modification_time="Wed, 03 Jan 2007 18:55:42 GMT"/>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
 
-			  <child>
-			    <widget class="GtkLabel" id="label_categories">
-			      <property name="visible">True</property>
-			      <property name="label" translatable="yes">...</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</property>
-			      <property name="yalign">0.5</property>
-			      <property name="xpad">0</property>
-			      <property name="ypad">0</property>
-			      <property name="ellipsize">PANGO_ELLIPSIZE_END</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">True</property>
-			      <property name="fill">True</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkComboBoxEntry" id="categories">
-			      <property name="visible">True</property>
-			      <property name="add_tearoffs">False</property>
-			      <property name="has_frame">True</property>
-			      <property name="focus_on_click">True</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">True</property>
-			    </packing>
-			  </child>
+		      <child>
+			<widget class="GtkLabel" id="label_categories">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">...</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</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_END</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>