def _rebuild_file_list_forget_index(self):
     if self.no_update_file_list:
         return
     title = "Unknown list"
     mime_types = None
     index = self.combo.currentIndex()
     if index == self.CODE_INDEX:
         mime_types = ["text/lua"]
         title = l("projwin_filelist_code_list_title")
     if index == self.ALL_INDEX:
         title = l("projwin_filelist_all_list_title")
     self.file_list_model = ProjectFileTreeModel(self.project,
         title, mime_types)
     self.file_list.setModel(self.file_list_model)
     selection_model = self.file_list.selectionModel()
     self.file_list.doubleClicked.connect(\
         self._file_list_open_file)
     self._change_index_to(0)
     return
class ProjectFileListWidget(QDockWidget):
    PROJECT_INDEX = 0
    CODE_INDEX = 1
    OBJECTS_INDEX = 3
    RESOURCES_INDEX = 4
    SCENES_INDEX = 2
    ALL_INDEX = 5
    def __init__(self, parent, project, on_file_open=None,
            on_visibility_change=None):
        self.no_update_file_list = True
        self.project = project
        self.on_file_open = on_file_open
        
        super(ProjectFileListWidget, self).__init__("BLAH", parent, 0)
       
        if on_visibility_change:
            self.visibilityChanged.connect(lambda: on_visibility_change())

        self.layout = QVBoxLayout()
        self.layout.setContentsMargins(0, 0, 0, 0)

        self.setWindowTitle(l("projwin_filelist_title"))
        
        self.box = QWidget()
        self.layout.addWidget(self.box)
        
        self.layout_inner = QVBoxLayout()
        self.box.setLayout(self.layout_inner)
        self.combo = QComboBox()
        self.combo.addItem("test")
        self.combo.currentIndexChanged.connect(\
            self._rebuild_file_list_forget_index)
        self.layout_inner.addWidget(self.combo)

        self.file_list = QTreeView(self)
        self.file_list.setMinimumSize(250, 20)
        self.layout_inner.addWidget(self.file_list)

        mainwidget = QWidget()
        mainwidget.setLayout(self.layout)
        self.setWidget(mainwidget)

        self.rebuild_combo_contents()

        self.no_update_file_list = False
        self._rebuild_file_list_forget_index()
        
    def get_category(self):
        """ Get the category that is currently in use for viewing
            the selected file:
               "project", "code", "objects", "resources", "scenes", "all"
        """
        index = self.combo.currentIndex()
        if index == self.PROJECT_INDEX:
            return "project"
        elif index == self.CODE_INDEX:
            return "code"
        elif index == self.OBJECTS_INDEX:
            return "objects"
        elif index == self.RESOURCES_INDEX:
            return "resources"
        elif index == self.SCENES_INDEX:
            return "scenes"
        elif index == self.ALL_INDEX:
            return "all"
        else:
            raise RuntimeError("unknown internal category - internal error")

    def _file_list_open_file(self, index):
        # rate limiting: for some reason, this seems to fire way too often:
        if hasattr(self, "last_double_click"):
            if (datetime.datetime.now() - self.last_double_click).total_seconds()\
                    < 0.2:
                # skip, bogus multi-fired event
                return
        self.last_double_click = datetime.datetime.now()
        
        # open up selected item:
        item = self.file_list_model.itemFromIndex(index)
        if not item is None:
            filename = self.file_list_model.filenameFromItem(item)
            if not self.on_file_open is None:
                self.on_file_open(self, filename)
        return True
    
    def _get_index(self):
        current_model_index = self.file_list.currentIndex()
        assert(not current_model_index is None)
        return current_model_index.row()
         
    def _change_index_to(self, index):
        self.file_list.setCurrentIndex(self.file_list_model.\
            index(index, 0))
        
    def _rebuild_file_list_forget_index(self):
        if self.no_update_file_list:
            return
        title = "Unknown list"
        mime_types = None
        index = self.combo.currentIndex()
        if index == self.CODE_INDEX:
            mime_types = ["text/lua"]
            title = l("projwin_filelist_code_list_title")
        if index == self.ALL_INDEX:
            title = l("projwin_filelist_all_list_title")
        self.file_list_model = ProjectFileTreeModel(self.project,
            title, mime_types)
        self.file_list.setModel(self.file_list_model)
        selection_model = self.file_list.selectionModel()
        self.file_list.doubleClicked.connect(\
            self._file_list_open_file)
        self._change_index_to(0)
        return

    def rebuild_file_list(self):
        """ This rebuilds the file list entirely, but attempts to keep the
            current file selected. If that is not possible, none will be
            selected.
            Call this when a file was removed or added to the project (or
            renamed).
        """
        oldindex = self._get_index()
        assert(not oldindex is None)
        if oldindex < 0:
            self._change_index_to(-1)
        oldfilename = self.file_list_model.filenameFromItem(
            self.file_list_model.itemFromIndex(self.file_list.currentIndex()))
        self._rebuild_file_list_forget_index()
        i = 0
        while i < self.file_list_model.fileEntryListCount():
            if self.file_list_model.filenameFromItem(
                    self.file_list_model.itemFromIndex(\
                    self.file_list_model.index(i, 0)))\
                    == oldfilename:
                self._change_index_to(i)
                return
            i = i + 1
        # ok old index wasn't found. change to any index:
        self._change_index_to(-1)
                
    def update_file_list(self):
        """ This doesn't check for new or removed files, but it checks for
            files being changed or no longer changed (dirty flag).
        """
        self.file_list_model.updateDirty()
        return
    
    def update_language(self):
        self.setWindowTitle(l("projwin_filelist_title"))
        self.no_update_file_list = True
        self.rebuild_combo_contents()
        self.no_update_file_list = False
        self.rebuild_file_list()

    def rebuild_combo_contents(self):
        index = self.combo.currentIndex()
        if index < 0 or self.combo.count() <= 1:
            index = 1
        while self.combo.count() > 0:
            self.combo.removeItem(0)
        self.combo.addItem(l("projwin_filelist_project"))
        self.combo.addItem(l("projwin_filelist_code"))
        self.combo.addItem(l("projwin_filelist_scenes"))
        self.combo.addItem(l("projwin_filelist_objects"))
        self.combo.addItem(l("projwin_filelist_resources"))
        self.combo.addItem(l("projwin_filelist_all"))
        self.combo.setCurrentIndex(index)