def get_children(self, node): fsm = self.project.fs_manager if isinstance(node, Folder): return node.children if isinstance(node, SearchResult): objects = self.project.object_manager.iter_all_objects(node.sql) return [fsm.get_node_by_uuid(obj.uuid) for obj in objects] if fs_util.is_filter(node): objects = self.project.object_manager.iter_all_objects(node.data) return [fsm.get_node_by_uuid(obj.uuid) for obj in objects] # # l = {} # # g = {time} # # noinspection PyBroadException # try: # func = self.get_chooser_from_filter_str(filter_str) # except: # traceback.print_exc() # log.error('invalid filter str in %s: %s', node.uuid, filter_str) # return [] # # # func = l.get('choose') # if func: # objects = self.project.object_manager.iter_all_objects(func) # return [fsm.get_node_by_uuid(obj.uuid) for obj in objects] # # return [] raise Exception("invalid node to get children: %s" % node)
def edit_filter(self, node): assert fs_util.is_filter(node) from filter_editor import FilterEditorDialog dlg = FilterEditorDialog(self.explorer) dlg.set_value(node.data) if wx.ID_OK == dlg.ShowModal(): filter_str = dlg.get_value() try: self.project.fs_manager.save_file(node.uuid, filter_str) except Exception, e: log.alert(e, 'Failed to save filter')
def set_path(self, fs_node): """ Args: fs_node: Folder, or a filter """ if not isinstance(fs_node, Folder) and not fs_util.is_filter(fs_node): return tree_item_id = self._get_tree_item_id_by_fs_node(fs_node) assert tree_item_id if not self.IsSelected(tree_item_id): self._skip_open = True self.SelectItem(tree_item_id) self._skip_open = False
def _on_fs_modify(self, evt): fs_node = evt.fs_node tree_item_id = self._get_tree_item_id_by_fs_node(fs_node) if not tree_item_id: return # update label # todo: is_container? if isinstance(fs_node, Folder) or fs_util.is_filter(fs_node): old = self.GetItemText(tree_item_id) if old != fs_node.name: self.Delete(tree_item_id) parent_tree_item_id = self._get_tree_item_id_by_fs_node(fs_node.parent) if parent_tree_item_id: self._add_child(parent_tree_item_id, fs_node)
def _on_fs_modify(self, evt): fs_node = evt.fs_node tree_item_id = self._get_tree_item_id_by_fs_node(fs_node) if not tree_item_id: return # update label # todo: is_container? if isinstance(fs_node, Folder) or fs_util.is_filter(fs_node): old = self.GetItemText(tree_item_id) if old != fs_node.name: self.Delete(tree_item_id) parent_tree_item_id = self._get_tree_item_id_by_fs_node( fs_node.parent) if parent_tree_item_id: self._add_child(parent_tree_item_id, fs_node)
def is_container(self, node): if self.project.fs_manager.is_recycled(node): return False return isinstance(node, (Folder, SearchResult)) or fs_util.is_filter(node)
def _add_menu_open(self, menu, nodes): u"""Returns True if any menu added, False if no menu added""" if not self.can_open(nodes): return False # Get nodes which are objects obj_nodes = filter(fs_util.is_object, nodes) if not obj_nodes and len(nodes) == 1: if self.is_container( nodes[0]): # all nodes in this filter or folder obj_nodes = filter( fs_util.is_object, self.project.fs_manager.walk(nodes[0], False)) menus = 0 if obj_nodes: # Get Objects objects = map(self.project.get_object_by_fsfile, obj_nodes) # Clazz or each object clazzes = [obj.clazz for obj in objects] # count of each Clazz. {Clazz: count} counts = collections.Counter(clazzes) if len(counts) == 1: # Only 1 clazz clazz = clazzes[0] # Can open single editor if len(objects) == 1: label = "&Edit %s" % clazz.name item = menu.Append(wx.NewId(), label) self._bind_menu(menu, self.do_edit, item.GetId(), objects[0]) # Multiple editor is valid even 1 object here label = u'&Batch Edit %s(%s)' % (clazz.name, len(objects)) item = menu.Append(wx.NewId(), label) self._bind_menu(menu, self.do_edit, item.GetId(), objects) else: # More than 1 clazz, use a sub menu clazz_count = counts.items() clazz_count.sort(key=lambda x: x[0].name.lower()) if counts.values().count( 1): # At lease 1 clazz has only 1 object submenu = wx.Menu() for clazz, count in clazz_count: if count == 1: item = submenu.Append(wx.NewId(), u'%s' % clazz.name) objects_ = [ obj for obj in objects if obj.clazz == clazz ] assert len(objects_) == 1 self._bind_menu(menu, self.do_edit, item.GetId(), objects_[0]) menu.AppendSubMenu(submenu, u"&Edit") submenu = wx.Menu() for clazz, count in clazz_count: item = submenu.Append(wx.NewId(), u'%s(%s)' % (clazz.name, count)) self._bind_menu( menu, self.do_edit, item.GetId(), [obj for obj in objects if obj.clazz == clazz]) menu.AppendSubMenu(submenu, u"&Batch Edit") menus = 1 # filter & folder if len(nodes) == 1: node = nodes[0] if self.is_container(node): item = menu.Append(wx.NewId(), u'&Open') self._bind_menu(menu, self.open, item.GetId(), node) menus += 1 if fs_util.is_filter(node): item = menu.Append(wx.NewId(), u'&Edit') self._bind_menu(menu, self.edit_filter, item.GetId(), node) menus += 1 return menus > 0