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)