Example #1
0
    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)
Example #2
0
    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')
Example #3
0
    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
Example #4
0
    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
Example #5
0
    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)
Example #6
0
    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)
Example #7
0
 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)
Example #8
0
    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