--- wallpapoz-0.4.1-svn92_trunk/src/wallpapoz.deleteone 2010-06-13 03:08:43.000000000 +0900 +++ wallpapoz-0.4.1-svn92_trunk/src/wallpapoz 2010-06-13 17:33:06.000000000 +0900 @@ -833,6 +833,16 @@ # list to put our lowest iter in every related workspace lowest_iter_list = [] + # FIXME + # FIXME + # Currently copy_iter_list can be NoneType, e.g. when + # - Select one wallpaper in a workspace + # - and delete it + # - next choose "Edit -> "Delete Wallpaperz"" + # Well, bugish, however anyway workaround... + if not copy_iter_list: + return lowest_iter_list + # indication we have done with this workspace done_workspace = True @@ -899,8 +909,16 @@ # do the remaining job, get the lowest iter from last workspace if we have not done withlast workspace if not done_workspace: - lowest_iter_list.append( - self.store.get_iter( (parent_number_index, iter_workspace_index+1) ) ) + # Umm... the original code raises ValueError if trying to delete + # a wallpaper from a workspace, if only one wallpaper existed. + # Need further investigation, however anyway workaround... + new_iter = [] + try: + new_iter = self.store.get_iter((parent_number_index, iter_workspace_index + 1)) + except ValueError: + pass + if new_iter: + lowest_iter_list.append(new_iter) return lowest_iter_list @@ -983,6 +1001,11 @@ def cut_and_reordering_treeiter(self): lowest_iter_list = self.reordering_node_after_cut_and_paste( self.selected_iter ) + # workaround for the case that trying to remove a wallpaper from + # the workspace where only one wallpaper exists + if not lowest_iter_list: + return + # iterate to cut ( really!!! ) the iter from selected iter list for single_iter in self.selected_iter: @@ -993,6 +1016,9 @@ for single_iter in lowest_iter_list: self.order_treeiter_from_lowest_iter(single_iter) + # Finally update selection view + self.treeview_selection_changed(None) + # order treeiter in one workspace or in list mode from lowest iter ( more efficient ) def order_treeiter_from_lowest_iter(self, single_iter): # get the path @@ -1209,6 +1235,22 @@ # it display another image, and disable/enable some menu def treeview_selection_changed(self, widget): position_iter = self.get_selected_iter_of_treeview("anything") + + if not position_iter: + # Nothing is selected, unfortunately this can happen + self.main_window.get_widget("rename_workspace").set_sensitive(False) + self.rename_workspace_menu.set_sensitive(False) + self.main_window.get_widget("change_wallpaper").set_sensitive(False) + self.change_wallpaper_menu.set_sensitive(False) + self.main_window.get_widget("cut").set_sensitive(False) + self.cut_menu.set_sensitive(False) + self.main_window.get_widget("copy").set_sensitive(False) + self.copy_menu.set_sensitive(False) + self.main_window.get_widget("delete_wallpapers").set_sensitive(False) + self.delete_wallpapers_menu.set_sensitive(False) + # Nothing left + return + if type(self.store) == gtk.TreeStore: parent = self.store.iter_parent(position_iter) # parent node, enable: rename_workspace @@ -1224,8 +1266,21 @@ self.cut_menu.set_sensitive(True) self.main_window.get_widget("copy").set_sensitive(True) self.copy_menu.set_sensitive(True) - self.main_window.get_widget("delete_wallpapers").set_sensitive(True) - self.delete_wallpapers_menu.set_sensitive(True) + + # See create_configuration_file + # Check if there are at least 2 wallpapers + childiter = self.store.iter_children(parent) + childiter = self.store.iter_next(childiter) + + # Only show "Delete wallpapers" menu if there are at least 2 wallpapers + # in a workspace + if childiter: + self.main_window.get_widget("delete_wallpapers").set_sensitive(True) + self.delete_wallpapers_menu.set_sensitive(True) + else: + self.main_window.get_widget("delete_wallpapers").set_sensitive(False) + self.delete_wallpapers_menu.set_sensitive(False) + # parent node else: self.main_window.get_widget("rename_workspace").set_sensitive(True)