class Explorer(QTreeView): def __init__(self, parent=None): QTreeView.__init__(self) self.header().setHidden(True) self.setAnimated(True) # Modelo self.model = QFileSystemModel(self) path = QDir.toNativeSeparators(QDir.homePath()) self.model.setRootPath(path) self.setModel(self.model) self.model.setNameFilters(["*.c", "*.h", "*.s"]) self.setRootIndex(QModelIndex(self.model.index(path))) self.model.setNameFilterDisables(False) # Se ocultan algunas columnas self.hideColumn(1) self.hideColumn(2) self.hideColumn(3) # Conexion self.doubleClicked.connect(self._open_file) Edis.load_lateral("explorer", self) def _open_file(self, i): if not self.model.isDir(i): indice = self.model.index(i.row(), 0, i.parent()) archivo = self.model.filePath(indice) principal = Edis.get_component("principal") principal.open_file(archivo)
class Explorador(custom_dock.CustomDock): def __init__(self, parent=None): custom_dock.CustomDock.__init__(self) self.explorador = QTreeView() self.setWidget(self.explorador) self.explorador.header().setHidden(True) self.explorador.setAnimated(True) # Modelo self.modelo = QFileSystemModel(self.explorador) path = QDir.toNativeSeparators(QDir.homePath()) self.modelo.setRootPath(path) self.explorador.setModel(self.modelo) self.modelo.setNameFilters(["*.c", "*.h", "*.s"]) self.explorador.setRootIndex(QModelIndex(self.modelo.index(path))) self.modelo.setNameFilterDisables(False) # Se ocultan algunas columnas self.explorador.hideColumn(1) self.explorador.hideColumn(2) self.explorador.hideColumn(3) # Conexion self.explorador.doubleClicked.connect(self._abrir_archivo) EDIS.cargar_lateral("explorador", self) def _abrir_archivo(self, i): if not self.modelo.isDir(i): indice = self.modelo.index(i.row(), 0, i.parent()) archivo = self.modelo.filePath(indice) principal = EDIS.componente("principal") principal.abrir_archivo(archivo)
class OrLogsListView(QListView): def __init__(self, parent=None): super(OrLogsListView, self).__init__(parent) self.model = QFileSystemModel() self.model.sort(3, Qt.DescendingOrder) self.model.setFilter(QDir.Files) self.setModel(self.model) def mouseDoubleClickEvent(self, event): """method override""" QListView.mouseDoubleClickEvent(self, event) self.clicked() def getSelectedPath(self): """Return selected filename""" index = self.currentIndex() if index: return os.path.normpath(self.model.filePath(index)) def clicked(self): fname = self.getSelectedPath() if fname: self.open(fname) def open(self, fname): QDesktopServices.openUrl(QUrl('file:///' + fname)) def setup(self, wdir='.'): os.makedirs(wdir, exist_ok=True) self.model.setRootPath(wdir) self.setRootIndex(self.model.index(wdir))
class DataWidget(ui_datawidget.Ui_widget, WidgetBase): def __init__(self, parent=None): super(DataWidget, self).__init__(parent) self.setupUi(self) self.model = QFileSystemModel() self.settings = None allfilters = [] filters = re.findall( r"\((.*?)\)", QgsProviderRegistry.instance().fileVectorFilters())[1:] for filter in filters: allfilters = allfilters + filter.split(" ") filters += re.findall( r"\((.*?)\)", QgsProviderRegistry.instance().fileRasterFilters())[1:] for filter in filters: allfilters = allfilters + filter.split(" ") self.model.setNameFilters(allfilters) self.model.setNameFilterDisables(False) self.listDataList.setModel(self.model) self.btnAddData.pressed.connect(self.open_data_folder) for col in range(self.model.columnCount())[1:]: self.listDataList.hideColumn(col) self.service = None def open_data_folder(self): """ Open the data folder of the project using the OS """ path = os.path.join(self.data['data_root']) openfolder(path) def set_data(self, data): super(DataWidget, self).set_data(data) self.service = DataService(self.config) root = data['data_root'] if not os.path.exists(root): os.mkdir(root) self.model.setRootPath(root) self.listDataList.setRootIndex(self.model.index(root)) self.refresh() def write_config(self): self.logger.info("Data write config") DataService(self.config).update_date_to_latest() super(DataWidget, self).write_config() def refresh(self): self.lastSaveLabel.setText("Last save date: {}".format( self.service.last_save_date))
def load_tree(self, project): """Load the tree view on the right based on the project selected.""" qfsm = QFileSystemModel() qfsm.setRootPath(project['path']) load_index = qfsm.index(qfsm.rootPath()) # qfsm.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot) # qfsm.setNameFilterDisables(False) # pext = ["*{0}".format(x) for x in project['extensions']] # qfsm.setNameFilters(pext) self._tree.setModel(qfsm) self._tree.setRootIndex(load_index) t_header = self._tree.header()
def paintEvent(self, event): self.splitter = QSplitter() model = QFileSystemModel() model.setRootPath(QDir.rootPath()) # model.setRootPath(idahome) # using ida home instead views = [] for ViewType in (QColumnView, QTreeView): view = ViewType(self.splitter) view.setModel(model) view.setRootIndex(model.index(idahome)) view.setDragEnabled(True) view.setAcceptDrops(True) view.setDragDropMode(QtGui.QAbstractItemView.InternalMove) # splitter.show() # Create layout layout = QtGui.QVBoxLayout(self) # layout.addWidget(self.comboList) layout.addWidget(self.splitter)
def load_tree(self, project): """Load the tree view on the right based on the project selected.""" qfsm = QFileSystemModel() qfsm.setRootPath(project.path) load_index = qfsm.index(qfsm.rootPath()) qfsm.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot) qfsm.setNameFilterDisables(False) pext = ["*{0}".format(x) for x in project.extensions] qfsm.setNameFilters(pext) self._tree.setModel(qfsm) self._tree.setRootIndex(load_index) t_header = self._tree.header() t_header.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel) t_header.setResizeMode(0, QHeaderView.Stretch) t_header.setStretchLastSection(False) t_header.setClickable(True) self._tree.hideColumn(1) # Size self._tree.hideColumn(2) # Type self._tree.hideColumn(3) # Modification date
def __init__(self, root, parent=None): super(MFileTree, self).__init__(parent) self.setStyleSheet("color:rgb(189, 195, 199);") # model = QFileSystemModel() # model.setRootPath(QDir.rootPath()) # view = QTreeView(parent) # self.show() #app = QApplication(sys.argv) # Splitter to show 2 views in same widget easily. splitter = QSplitter() # The model. model = QFileSystemModel() # You can setRootPath to any path. model.setRootPath(root) # List of views. self.views = [] #self.view = QTreeView(self) # self.itemPressed.connect(self.itemClicked) self.setModel(model) self.setRootIndex(model.index(root)) self.header().setStyleSheet("background:rgb(70, 80, 88);") # for ViewType in (QColumnView, QTreeView): # # Create the view in the splitter. # view = ViewType(splitter) # # Set the model of the view. # view.setModel(model) # # Set the root index of the view as the user's home directory. # view.setRootIndex(model.index(QDir.homePath())) # # Show the splitter. # splitter.show() self.layout = QtGui.QHBoxLayout() # self.layout.addWidget(self) self.setLayout(self.layout) # Maximize the splitter. splitter.setWindowState(Qt.WindowMaximized)
class DirView(QTreeView): """Base file/directory tree view""" def __init__(self, parent=None): super(DirView, self).__init__(parent) self.name_filters = None self.parent_widget = parent self.valid_types = None self.show_all = None self.menu = None self.common_actions = None self.__expanded_state = None self._to_be_loaded = None self.fsmodel = None self.setup_fs_model() self._scrollbar_positions = None # ---- Model def setup_fs_model(self): """Setup filesystem model""" filters = QDir.AllDirs | QDir.Files | QDir.Drives | QDir.NoDotAndDotDot self.fsmodel = QFileSystemModel(self) self.fsmodel.setFilter(filters) self.fsmodel.setNameFilterDisables(False) def install_model(self): """Install filesystem model""" self.setModel(self.fsmodel) def setup_view(self): """Setup view""" self.install_model() self.connect(self.fsmodel, SIGNAL("directoryLoaded(QString)"), lambda: self.resizeColumnToContents(0)) self.setAnimated(False) self.setSortingEnabled(True) self.sortByColumn(0, Qt.AscendingOrder) def set_name_filters(self, name_filters): """Set name filters""" self.name_filters = name_filters self.fsmodel.setNameFilters(name_filters) def set_show_all(self, state): """Toggle 'show all files' state""" if state: self.fsmodel.setNameFilters([]) else: self.fsmodel.setNameFilters(self.name_filters) def get_filename(self, index): """Return filename associated with *index*""" if index: return osp.normpath(unicode(self.fsmodel.filePath(index))) def get_index(self, filename): """Return index associated with filename""" return self.fsmodel.index(filename) def get_selected_filenames(self): """Return selected filenames""" if self.selectionMode() == self.ExtendedSelection: return [self.get_filename(idx) for idx in self.selectedIndexes()] else: return [self.get_filename(self.currentIndex())] def get_dirname(self, index): """Return dirname associated with *index*""" fname = self.get_filename(index) if fname: if osp.isdir(fname): return fname else: return osp.dirname(fname) # ---- Tree view widget def setup(self, name_filters=["*.py", "*.pyw"], valid_types=(".py", ".pyw"), show_all=False): """Setup tree widget""" self.setup_view() self.set_name_filters(name_filters) self.valid_types = valid_types self.show_all = show_all # Setup context menu self.menu = QMenu(self) self.common_actions = self.setup_common_actions() # ---- Context menu def setup_common_actions(self): """Setup context menu common actions""" # Filters filters_action = create_action( self, _("Edit filename filters..."), None, get_icon("filter.png"), triggered=self.edit_filter ) # Show all files all_action = create_action(self, _("Show all files"), toggled=self.toggle_all) all_action.setChecked(self.show_all) self.toggle_all(self.show_all) return [filters_action, all_action] def edit_filter(self): """Edit name filters""" filters, valid = QInputDialog.getText( self, _("Edit filename filters"), _("Name filters:"), QLineEdit.Normal, ", ".join(self.name_filters) ) if valid: filters = [f.strip() for f in unicode(filters).split(",")] self.parent_widget.sig_option_changed.emit("name_filters", filters) self.set_name_filters(filters) def toggle_all(self, checked): """Toggle all files mode""" self.parent_widget.sig_option_changed.emit("show_all", checked) self.show_all = checked self.set_show_all(checked) def create_file_new_actions(self, fnames): """Return actions for submenu 'New...'""" if not fnames: return [] new_file_act = create_action( self, _("File..."), icon="filenew.png", triggered=lambda: self.new_file(fnames[-1]) ) new_module_act = create_action( self, _("Module..."), icon="py.png", triggered=lambda: self.new_module(fnames[-1]) ) new_folder_act = create_action( self, _("Folder..."), icon="folder_new.png", triggered=lambda: self.new_folder(fnames[-1]) ) new_package_act = create_action( self, _("Package..."), icon=get_icon("package_collapsed.png"), triggered=lambda: self.new_package(fnames[-1]), ) return [new_file_act, new_folder_act, None, new_module_act, new_package_act] def create_file_import_actions(self, fnames): """Return actions for submenu 'Import...'""" return [] def create_file_manage_actions(self, fnames): """Return file management actions""" only_files = all([osp.isfile(_fn) for _fn in fnames]) only_modules = all([osp.splitext(_fn)[1] in (".py", ".pyw", ".ipy") for _fn in fnames]) only_valid = all([osp.splitext(_fn)[1] in self.valid_types for _fn in fnames]) run_action = create_action(self, _("Run"), icon="run_small.png", triggered=self.run) edit_action = create_action(self, _("Edit"), icon="edit.png", triggered=self.clicked) move_action = create_action(self, _("Move..."), icon="move.png", triggered=self.move) delete_action = create_action(self, _("Delete..."), icon="delete.png", triggered=self.delete) rename_action = create_action(self, _("Rename..."), icon="rename.png", triggered=self.rename) open_action = create_action(self, _("Open"), triggered=self.open) actions = [] if only_modules: actions.append(run_action) if only_valid and only_files: actions.append(edit_action) else: actions.append(open_action) actions += [delete_action, rename_action] basedir = fixpath(osp.dirname(fnames[0])) if all([fixpath(osp.dirname(_fn)) == basedir for _fn in fnames]): actions.append(move_action) actions += [None] # VCS support is quite limited for now, so we are enabling the VCS # related actions only when a single file/folder is selected: dirname = fnames[0] if osp.isdir(fnames[0]) else osp.dirname(fnames[0]) if len(fnames) == 1 and vcs.is_vcs_repository(dirname): vcs_ci = create_action( self, _("Commit"), icon="vcs_commit.png", triggered=lambda fnames=[dirname]: self.vcs_command(fnames, tool="commit"), ) vcs_log = create_action( self, _("Browse repository"), icon="vcs_browse.png", triggered=lambda fnames=[dirname]: self.vcs_command(fnames, tool="browse"), ) actions += [None, vcs_ci, vcs_log] return actions def create_folder_manage_actions(self, fnames): """Return folder management actions""" actions = [] if os.name == "nt": _title = _("Open command prompt here") else: _title = _("Open terminal here") action = create_action( self, _title, icon="cmdprompt.png", triggered=lambda fnames=fnames: self.open_terminal(fnames) ) actions.append(action) _title = _("Open Python interpreter here") action = create_action( self, _title, icon="python.png", triggered=lambda fnames=fnames: self.open_interpreter(fnames) ) actions.append(action) return actions def create_context_menu_actions(self): """Create context menu actions""" actions = [] fnames = self.get_selected_filenames() new_actions = self.create_file_new_actions(fnames) if len(new_actions) > 1: # Creating a submenu only if there is more than one entry new_act_menu = QMenu(_("New"), self) add_actions(new_act_menu, new_actions) actions.append(new_act_menu) else: actions += new_actions import_actions = self.create_file_import_actions(fnames) if len(import_actions) > 1: # Creating a submenu only if there is more than one entry import_act_menu = QMenu(_("Import"), self) add_actions(import_act_menu, import_actions) actions.append(import_act_menu) else: actions += import_actions if actions: actions.append(None) if fnames: actions += self.create_file_manage_actions(fnames) if actions: actions.append(None) if fnames and all([osp.isdir(_fn) for _fn in fnames]): actions += self.create_folder_manage_actions(fnames) if actions: actions.append(None) actions += self.common_actions return actions def update_menu(self): """Update context menu""" self.menu.clear() add_actions(self.menu, self.create_context_menu_actions()) # ---- Events def viewportEvent(self, event): """Reimplement Qt method""" # Prevent Qt from crashing or showing warnings like: # "QSortFilterProxyModel: index from wrong model passed to # mapFromSource", probably due to the fact that the file system model # is being built. See Issue 1250. # # This workaround was inspired by the following KDE bug: # https://bugs.kde.org/show_bug.cgi?id=172198 # # Apparently, this is a bug from Qt itself. self.executeDelayedItemsLayout() return QTreeView.viewportEvent(self, event) def contextMenuEvent(self, event): """Override Qt method""" self.update_menu() self.menu.popup(event.globalPos()) def keyPressEvent(self, event): """Reimplement Qt method""" if event.key() in (Qt.Key_Enter, Qt.Key_Return): self.clicked() elif event.key() == Qt.Key_F2: self.rename() elif event.key() == Qt.Key_Delete: self.delete() else: QTreeView.keyPressEvent(self, event) def mouseDoubleClickEvent(self, event): """Reimplement Qt method""" QTreeView.mouseDoubleClickEvent(self, event) self.clicked() def clicked(self): """Selected item was double-clicked or enter/return was pressed""" fnames = self.get_selected_filenames() for fname in fnames: if osp.isdir(fname): self.directory_clicked(fname) else: self.open([fname]) def directory_clicked(self, dirname): """Directory was just clicked""" pass # ---- Drag def dragEnterEvent(self, event): """Drag and Drop - Enter event""" event.setAccepted(event.mimeData().hasFormat("text/plain")) def dragMoveEvent(self, event): """Drag and Drop - Move event""" if event.mimeData().hasFormat("text/plain"): event.setDropAction(Qt.MoveAction) event.accept() else: event.ignore() def startDrag(self, dropActions): """Reimplement Qt Method - handle drag event""" data = QMimeData() data.setUrls([QUrl(fname) for fname in self.get_selected_filenames()]) drag = QDrag(self) drag.setMimeData(data) drag.exec_() # ---- File/Directory actions def open(self, fnames=None): """Open files with the appropriate application""" if fnames is None: fnames = self.get_selected_filenames() for fname in fnames: ext = osp.splitext(fname)[1] if osp.isfile(fname) and ext in self.valid_types: self.parent_widget.sig_open_file.emit(fname) else: self.open_outside_spyder([fname]) def open_outside_spyder(self, fnames): """Open file outside Spyder with the appropriate application If this does not work, opening unknown file in Spyder, as text file""" for path in sorted(fnames): path = file_uri(path) ok = programs.start_file(path) if not ok: self.parent_widget.emit(SIGNAL("edit(QString)"), path) def open_terminal(self, fnames): """Open terminal""" for path in sorted(fnames): self.parent_widget.emit(SIGNAL("open_terminal(QString)"), path) def open_interpreter(self, fnames): """Open interpreter""" for path in sorted(fnames): self.parent_widget.emit(SIGNAL("open_interpreter(QString)"), path) def run(self, fnames=None): """Run Python scripts""" if fnames is None: fnames = self.get_selected_filenames() for fname in fnames: self.parent_widget.emit(SIGNAL("run(QString)"), fname) def remove_tree(self, dirname): """Remove whole directory tree Reimplemented in project explorer widget""" shutil.rmtree(dirname, onerror=misc.onerror) def delete_file(self, fname, multiple, yes_to_all): """Delete file""" if multiple: buttons = QMessageBox.Yes | QMessageBox.YesAll | QMessageBox.No | QMessageBox.Cancel else: buttons = QMessageBox.Yes | QMessageBox.No if yes_to_all is None: answer = QMessageBox.warning( self, _("Delete"), _("Do you really want " "to delete <b>%s</b>?") % osp.basename(fname), buttons ) if answer == QMessageBox.No: return yes_to_all elif answer == QMessageBox.Cancel: return False elif answer == QMessageBox.YesAll: yes_to_all = True try: if osp.isfile(fname): misc.remove_file(fname) self.parent_widget.emit(SIGNAL("removed(QString)"), fname) else: self.remove_tree(fname) self.parent_widget.emit(SIGNAL("removed_tree(QString)"), fname) return yes_to_all except EnvironmentError, error: action_str = _("delete") QMessageBox.critical( self, _("Project Explorer"), _("<b>Unable to %s <i>%s</i></b>" "<br><br>Error message:<br>%s") % (action_str, fname, unicode(error)), ) return False
class DirView(QTreeView): """Base file/directory tree view""" def __init__(self, parent=None): super(DirView, self).__init__(parent) self.name_filters = None self.parent_widget = parent self.valid_types = None self.show_all = None self.menu = None self.common_actions = None self.__expanded_state = None self._to_be_loaded = None self.fsmodel = None self.setup_fs_model() self._scrollbar_positions = None #---- Model def setup_fs_model(self): """Setup filesystem model""" filters = QDir.AllDirs | QDir.Files | QDir.Drives | QDir.NoDotAndDotDot self.fsmodel = QFileSystemModel(self) self.fsmodel.setFilter(filters) self.fsmodel.setNameFilterDisables(False) def install_model(self): """Install filesystem model""" self.setModel(self.fsmodel) def setup_view(self): """Setup view""" self.install_model() self.connect(self.fsmodel, SIGNAL('directoryLoaded(QString)'), lambda: self.resizeColumnToContents(0)) self.setAnimated(False) self.setSortingEnabled(True) self.sortByColumn(0, Qt.AscendingOrder) def set_name_filters(self, name_filters): """Set name filters""" self.name_filters = name_filters self.fsmodel.setNameFilters(name_filters) def set_show_all(self, state): """Toggle 'show all files' state""" if state: self.fsmodel.setNameFilters([]) else: self.fsmodel.setNameFilters(self.name_filters) def get_filename(self, index): """Return filename associated with *index*""" if index: return osp.normpath(unicode(self.fsmodel.filePath(index))) def get_index(self, filename): """Return index associated with filename""" return self.fsmodel.index(filename) def get_selected_filenames(self): """Return selected filenames""" if self.selectionMode() == self.ExtendedSelection: return [self.get_filename(idx) for idx in self.selectedIndexes()] else: return [self.get_filename(self.currentIndex())] def get_dirname(self, index): """Return dirname associated with *index*""" fname = self.get_filename(index) if fname: if osp.isdir(fname): return fname else: return osp.dirname(fname) #---- Tree view widget def setup(self, name_filters=['*.py', '*.pyw'], valid_types=('.py', '.pyw'), show_all=False): """Setup tree widget""" self.setup_view() self.set_name_filters(name_filters) self.valid_types = valid_types self.show_all = show_all # Setup context menu self.menu = QMenu(self) self.common_actions = self.setup_common_actions() #---- Context menu def setup_common_actions(self): """Setup context menu common actions""" # Filters filters_action = create_action(self, _("Edit filename filters..."), None, get_icon('filter.png'), triggered=self.edit_filter) # Show all files all_action = create_action(self, _("Show all files"), toggled=self.toggle_all) all_action.setChecked(self.show_all) self.toggle_all(self.show_all) return [filters_action, all_action] def edit_filter(self): """Edit name filters""" filters, valid = QInputDialog.getText(self, _('Edit filename filters'), _('Name filters:'), QLineEdit.Normal, ", ".join(self.name_filters)) if valid: filters = [f.strip() for f in unicode(filters).split(',')] self.parent_widget.sig_option_changed.emit('name_filters', filters) self.set_name_filters(filters) def toggle_all(self, checked): """Toggle all files mode""" self.parent_widget.sig_option_changed.emit('show_all', checked) self.show_all = checked self.set_show_all(checked) def create_file_new_actions(self, fnames): """Return actions for submenu 'New...'""" if not fnames: return [] new_file_act = create_action( self, _("File..."), icon='filenew.png', triggered=lambda: self.new_file(fnames[-1])) new_module_act = create_action( self, _("Module..."), icon='py.png', triggered=lambda: self.new_module(fnames[-1])) new_folder_act = create_action( self, _("Folder..."), icon='folder_new.png', triggered=lambda: self.new_folder(fnames[-1])) new_package_act = create_action( self, _("Package..."), icon=get_icon('package_collapsed.png'), triggered=lambda: self.new_package(fnames[-1])) return [ new_file_act, new_folder_act, None, new_module_act, new_package_act ] def create_file_import_actions(self, fnames): """Return actions for submenu 'Import...'""" return [] def create_file_manage_actions(self, fnames): """Return file management actions""" only_files = all([osp.isfile(_fn) for _fn in fnames]) only_modules = all([ osp.splitext(_fn)[1] in ('.py', '.pyw', '.ipy') for _fn in fnames ]) only_valid = all( [osp.splitext(_fn)[1] in self.valid_types for _fn in fnames]) run_action = create_action(self, _("Run"), icon="run_small.png", triggered=self.run) edit_action = create_action(self, _("Edit"), icon="edit.png", triggered=self.clicked) move_action = create_action(self, _("Move..."), icon="move.png", triggered=self.move) delete_action = create_action(self, _("Delete..."), icon="delete.png", triggered=self.delete) rename_action = create_action(self, _("Rename..."), icon="rename.png", triggered=self.rename) open_action = create_action(self, _("Open"), triggered=self.open) actions = [] if only_modules: actions.append(run_action) if only_valid and only_files: actions.append(edit_action) else: actions.append(open_action) actions += [delete_action, rename_action] basedir = fixpath(osp.dirname(fnames[0])) if all([fixpath(osp.dirname(_fn)) == basedir for _fn in fnames]): actions.append(move_action) actions += [None] # VCS support is quite limited for now, so we are enabling the VCS # related actions only when a single file/folder is selected: dirname = fnames[0] if osp.isdir(fnames[0]) else osp.dirname(fnames[0]) if len(fnames) == 1 and vcs.is_vcs_repository(dirname): vcs_ci = create_action(self, _("Commit"), icon="vcs_commit.png", triggered=lambda fnames=[dirname]: self. vcs_command(fnames, tool='commit')) vcs_log = create_action(self, _("Browse repository"), icon="vcs_browse.png", triggered=lambda fnames=[dirname]: self. vcs_command(fnames, tool='browse')) actions += [None, vcs_ci, vcs_log] return actions def create_folder_manage_actions(self, fnames): """Return folder management actions""" actions = [] if os.name == 'nt': _title = _("Open command prompt here") else: _title = _("Open terminal here") action = create_action( self, _title, icon="cmdprompt.png", triggered=lambda fnames=fnames: self.open_terminal(fnames)) actions.append(action) _title = _("Open Python interpreter here") action = create_action( self, _title, icon="python.png", triggered=lambda fnames=fnames: self.open_interpreter(fnames)) actions.append(action) return actions def create_context_menu_actions(self): """Create context menu actions""" actions = [] fnames = self.get_selected_filenames() new_actions = self.create_file_new_actions(fnames) if len(new_actions) > 1: # Creating a submenu only if there is more than one entry new_act_menu = QMenu(_('New'), self) add_actions(new_act_menu, new_actions) actions.append(new_act_menu) else: actions += new_actions import_actions = self.create_file_import_actions(fnames) if len(import_actions) > 1: # Creating a submenu only if there is more than one entry import_act_menu = QMenu(_('Import'), self) add_actions(import_act_menu, import_actions) actions.append(import_act_menu) else: actions += import_actions if actions: actions.append(None) if fnames: actions += self.create_file_manage_actions(fnames) if actions: actions.append(None) if fnames and all([osp.isdir(_fn) for _fn in fnames]): actions += self.create_folder_manage_actions(fnames) if actions: actions.append(None) actions += self.common_actions return actions def update_menu(self): """Update context menu""" self.menu.clear() add_actions(self.menu, self.create_context_menu_actions()) #---- Events def viewportEvent(self, event): """Reimplement Qt method""" # Prevent Qt from crashing or showing warnings like: # "QSortFilterProxyModel: index from wrong model passed to # mapFromSource", probably due to the fact that the file system model # is being built. See Issue 1250. # # This workaround was inspired by the following KDE bug: # https://bugs.kde.org/show_bug.cgi?id=172198 # # Apparently, this is a bug from Qt itself. self.executeDelayedItemsLayout() return QTreeView.viewportEvent(self, event) def contextMenuEvent(self, event): """Override Qt method""" self.update_menu() self.menu.popup(event.globalPos()) def keyPressEvent(self, event): """Reimplement Qt method""" if event.key() in (Qt.Key_Enter, Qt.Key_Return): self.clicked() elif event.key() == Qt.Key_F2: self.rename() elif event.key() == Qt.Key_Delete: self.delete() else: QTreeView.keyPressEvent(self, event) def mouseDoubleClickEvent(self, event): """Reimplement Qt method""" QTreeView.mouseDoubleClickEvent(self, event) self.clicked() def clicked(self): """Selected item was double-clicked or enter/return was pressed""" fnames = self.get_selected_filenames() for fname in fnames: if osp.isdir(fname): self.directory_clicked(fname) else: self.open([fname]) def directory_clicked(self, dirname): """Directory was just clicked""" pass #---- Drag def dragEnterEvent(self, event): """Drag and Drop - Enter event""" event.setAccepted(event.mimeData().hasFormat("text/plain")) def dragMoveEvent(self, event): """Drag and Drop - Move event""" if (event.mimeData().hasFormat("text/plain")): event.setDropAction(Qt.MoveAction) event.accept() else: event.ignore() def startDrag(self, dropActions): """Reimplement Qt Method - handle drag event""" data = QMimeData() data.setUrls([QUrl(fname) for fname in self.get_selected_filenames()]) drag = QDrag(self) drag.setMimeData(data) drag.exec_() #---- File/Directory actions def open(self, fnames=None): """Open files with the appropriate application""" if fnames is None: fnames = self.get_selected_filenames() for fname in fnames: ext = osp.splitext(fname)[1] if osp.isfile(fname) and ext in self.valid_types: self.parent_widget.sig_open_file.emit(fname) else: self.open_outside_spyder([fname]) def open_outside_spyder(self, fnames): """Open file outside Spyder with the appropriate application If this does not work, opening unknown file in Spyder, as text file""" for path in sorted(fnames): path = file_uri(path) ok = programs.start_file(path) if not ok: self.parent_widget.emit(SIGNAL("edit(QString)"), path) def open_terminal(self, fnames): """Open terminal""" for path in sorted(fnames): self.parent_widget.emit(SIGNAL("open_terminal(QString)"), path) def open_interpreter(self, fnames): """Open interpreter""" for path in sorted(fnames): self.parent_widget.emit(SIGNAL("open_interpreter(QString)"), path) def run(self, fnames=None): """Run Python scripts""" if fnames is None: fnames = self.get_selected_filenames() for fname in fnames: self.parent_widget.emit(SIGNAL("run(QString)"), fname) def remove_tree(self, dirname): """Remove whole directory tree Reimplemented in project explorer widget""" shutil.rmtree(dirname, onerror=misc.onerror) def delete_file(self, fname, multiple, yes_to_all): """Delete file""" if multiple: buttons = QMessageBox.Yes|QMessageBox.YesAll| \ QMessageBox.No|QMessageBox.Cancel else: buttons = QMessageBox.Yes | QMessageBox.No if yes_to_all is None: answer = QMessageBox.warning( self, _("Delete"), _("Do you really want " "to delete <b>%s</b>?") % osp.basename(fname), buttons) if answer == QMessageBox.No: return yes_to_all elif answer == QMessageBox.Cancel: return False elif answer == QMessageBox.YesAll: yes_to_all = True try: if osp.isfile(fname): misc.remove_file(fname) self.parent_widget.emit(SIGNAL("removed(QString)"), fname) else: self.remove_tree(fname) self.parent_widget.emit(SIGNAL("removed_tree(QString)"), fname) return yes_to_all except EnvironmentError, error: action_str = _('delete') QMessageBox.critical( self, _("Project Explorer"), _("<b>Unable to %s <i>%s</i></b>" "<br><br>Error message:<br>%s") % (action_str, fname, unicode(error))) return False
@software: PyCharm @time : 17-1-5 下午5:19 """ from PyQt4.QtGui import QApplication,QTreeView,QFileSystemModel, QListView from PyQt4.QtCore import QDir import sys if __name__ == '__main__': app = QApplication(sys.argv) # 1. 创建 模型 model */ model = QFileSystemModel() # 创建文件系统模型 model.setRootPath(QDir.currentPath()) # 指定要监视的目录 # 2. 创建 视图 view */ tree = QTreeView() # 创建树型视图 tree.setModel(model) # 为视图指定模型 tree.setRootIndex(model.index(QDir.currentPath() ))# 指定根索引 listw = QListView() # 创建列表视图 listw.setModel(model) # 为视图指定模型 listw.setRootIndex(model.index(QDir.currentPath()))# 指定根索引 tree.setWindowTitle("QTreeView") tree.show() listw.setWindowTitle("QListView") listw.show() app.exec_()
class DirectoryWidget(RWidget): def __init__(self, parent, base="."): RWidget.__init__(self, parent) self.base = base self.model = QFileSystemModel() self.model.setRootPath(QDir.rootPath()) self.proxyModel = FileSystemProxyModel() self.proxyModel.setDynamicSortFilter(True) self.proxyModel.setFilterKeyColumn(0) self.proxyModel.setSourceModel(self.model) self.listView = QListView(self) self.listView.setModel(self.proxyModel) index = self.model.index(QDir.currentPath()) self.listView.setRootIndex(self.proxyModel.mapFromSource(index)) self.listView.setContextMenuPolicy(Qt.CustomContextMenu) self.lineEdit = QLineEdit(self) filterLineEdit = QLineEdit() filterLabel = QLabel("Filter:") self.connect(filterLineEdit, SIGNAL("textChanged(QString)"), self.proxyModel.setFilterWildcard) self.actions = [] self.upAction = QAction("&Up", self) self.upAction.setStatusTip("Move to parent directory") self.upAction.setToolTip("Move to parent directory") self.upAction.setIcon(QIcon(":go-up")) self.upAction.setEnabled(True) self.actions.append(self.upAction) self.newAction = QAction("&New Directory", self) self.newAction.setStatusTip("Create new directory") self.newAction.setToolTip("Create new directory") self.newAction.setIcon(QIcon(":folder-new")) self.newAction.setEnabled(True) self.actions.append(self.newAction) self.synchAction = QAction("&Synch", self) self.synchAction.setStatusTip("Synch with current working directory") self.synchAction.setToolTip("Synch with current working directory") self.synchAction.setIcon(QIcon(":view-refresh")) self.synchAction.setEnabled(True) self.actions.append(self.synchAction) self.rmAction = QAction("&Delete", self) self.rmAction.setStatusTip("Delete selected item") self.rmAction.setToolTip("delete selected item") self.rmAction.setIcon(QIcon(":edit-delete")) self.rmAction.setEnabled(True) self.actions.append(self.rmAction) self.openAction = QAction("&Open", self) self.openAction.setStatusTip("Open selected R script") self.openAction.setToolTip("Open selected R script") self.openAction.setIcon(QIcon(":document-open")) self.openAction.setEnabled(True) self.actions.append(self.openAction) self.loadAction = QAction("&Load", self) self.loadAction.setStatusTip("Load selected R data") self.loadAction.setToolTip("Load selected R data") self.loadAction.setIcon(QIcon(":document-open")) self.loadAction.setEnabled(True) self.actions.append(self.loadAction) self.setAction = QAction("Set as ¤t", self) self.setAction.setStatusTip("Set folder as R working directory") self.setAction.setToolTip("Set folder as R working directory") self.setAction.setIcon(QIcon(":folder-home")) self.setAction.setEnabled(True) self.actions.append(self.setAction) self.loadExternal = QAction("Open &Externally", self) self.loadExternal.setStatusTip("Load file in external application") self.loadExternal.setToolTip("Load file in external application") self.loadExternal.setIcon(QIcon(":folder-system")) self.loadExternal.setEnabled(True) self.actions.append(self.loadExternal) self.rootChanged() hiddenAction = QAction("Toggle hidden files", self) hiddenAction.setStatusTip("Show/hide hidden files and folders") hiddenAction.setToolTip("Show/hide hidden files and folders") hiddenAction.setIcon(QIcon(":stock_keyring")) hiddenAction.setCheckable(True) self.connect(self.newAction, SIGNAL("triggered()"), self.newFolder) self.connect(self.upAction, SIGNAL("triggered()"), self.upFolder) self.connect(self.synchAction, SIGNAL("triggered()"), self.synchFolder) self.connect(self.rmAction, SIGNAL("triggered()"), self.rmItem) self.connect(self.openAction, SIGNAL("triggered()"), self.openItem) self.connect(self.loadAction, SIGNAL("triggered()"), self.loadItem) self.connect(self.loadExternal, SIGNAL("triggered()"), self.externalItem) self.connect(self.setAction, SIGNAL("triggered()"), self.setFolder) self.connect(hiddenAction, SIGNAL("toggled(bool)"), self.toggleHidden) self.connect(self.listView, SIGNAL("activated(QModelIndex)"), self.cdFolder) self.connect(self.listView, SIGNAL("customContextMenuRequested(QPoint)"), self.customContext) self.connect(self.lineEdit, SIGNAL("returnPressed()"), self.gotoFolder) upButton = QToolButton() upButton.setDefaultAction(self.upAction) upButton.setAutoRaise(True) newButton = QToolButton() newButton.setDefaultAction(self.newAction) newButton.setAutoRaise(True) synchButton = QToolButton() synchButton.setDefaultAction(self.synchAction) synchButton.setAutoRaise(True) setButton = QToolButton() setButton.setDefaultAction(self.setAction) setButton.setAutoRaise(True) hiddenButton = QToolButton() hiddenButton.setDefaultAction(hiddenAction) hiddenButton.setAutoRaise(True) hbox = QHBoxLayout() hbox.addWidget(upButton) hbox.addWidget(synchButton) hbox.addWidget(newButton) hbox.addWidget(setButton) hbox.addWidget(hiddenButton) vbox = QVBoxLayout(self) vbox.addLayout(hbox) vbox.addWidget(self.lineEdit) vbox.addWidget(self.listView) vbox.addWidget(filterLabel) vbox.addWidget(filterLineEdit) def toggleHidden(self, toggled): base = QDir.AllDirs|QDir.AllEntries|QDir.NoDotAndDotDot if toggled: self.model.setFilter(base|QDir.Hidden) else: self.model.setFilter(base) def gotoFolder(self): text = self.lineEdit.text() self.listView.setRootIndex(self.proxyModel.mapFromSource(self.model.index(text, 0))) def rootChanged(self): index1 = self.listView.rootIndex() index2 = self.proxyModel.mapToSource(index1) self.lineEdit.setText(self.model.filePath(index2)) self.listView.setCurrentIndex(index1) def customContext(self, pos): index = self.listView.indexAt(pos) index = self.proxyModel.mapToSource(index) if not index.isValid(): self.rmAction.setEnabled(False) self.openAction.setEnabled(False) self.loadAction.setEnabled(False) elif not self.model.isDir(index): info = self.model.fileInfo(index) suffix = info.suffix() if suffix in ("Rd","Rdata","RData"): self.loadAction.setEnabled(True) self.openAction.setEnabled(False) self.loadExternal.setEnabled(False) elif suffix in ("txt","csv","R","r"): self.openAction.setEnabled(True) self.loadAction.setEnabled(False) self.loadExternal.setEnabled(True) else: self.loadAction.setEnabled(False) self.openAction.setEnabled(False) self.loadExternal.setEnabled(True) menu = QMenu(self) for action in self.actions: menu.addAction(action) menu.exec_(self.listView.mapToGlobal(pos)) def openItem(self): index = self.listView.currentIndex() index = self.proxyModel.mapToSource(index) self.emit(SIGNAL("openFileRequest(QString)"), self.model.filePath(index)) def loadItem(self): index = self.listView.currentIndex() index = self.proxyModel.mapToSource(index) self.emit(SIGNAL("loadFileRequest(QString)"), self.model.filePath(index)) def externalItem(self): index = self.listView.currentIndex() index = self.proxyModel.mapToSource(index) QDesktopServices.openUrl(QUrl(self.model.filePath(index))) def newFolder(self): text, ok = QInputDialog.getText(self, "New Folder", "Folder name:", QLineEdit.Normal, "new_folder") if ok: index = self.listView.rootIndex() index = self.proxyModel.mapToSource(index) self.model.mkdir(index, text) def setFolder(self): index = self.listView.currentIndex() index = self.proxyModel.mapToSource(index) commands = "setwd('%s')" % self.model.filePath(index) self.emitCommands(commands) def rmItem(self): index = self.listView.currentIndex() if index == self.listView.rootIndex(): return yes = QMessageBox.question(self, "manageR Warning", "Are you sure you want to delete '%s'?" % self.model.fileName(index), QMessageBox.Yes|QMessageBox.Cancel) if not yes == QMessageBox.Yes: return index = self.proxyModel.mapToSource(index) if self.model.isDir(index): result = self.model.rmdir(index) else: result = self.model.remove(index) if not result: QMessageBox.warning(self, "manageR Error", "Unable to delete %s!" % self.model.fileName(index)) def upFolder(self): index = self.listView.rootIndex() index = self.proxyModel.parent(index) self.listView.setRootIndex(index) self.rootChanged() def cdFolder(self): indexes = self.listView.selectedIndexes() if len(indexes) < 1: return index = indexes[0] if self.model.isDir(self.proxyModel.mapToSource(index)): self.listView.setRootIndex(index) self.rootChanged() self.listView.clearSelection() def synchFolder(self): text = robjects.r.getwd()[0] index = self.model.index(text, 0) index = self.proxyModel.mapFromSource(index) self.listView.setRootIndex(index) self.rootChanged()
class AbstractPathCompleter(AbstractCompleter): """Base class for PathCompleter and GlobCompleter """ # global object. Reused by all completers _fsModel = QFileSystemModel() _ERROR = 'error' _HEADER = 'currentDir' _STATUS = 'status' _DIRECTORY = 'directory' _FILE = 'file' def __init__(self, text): self._originalText = text self._dirs = [] self._files = [] self._error = None self._status = None """hlamer: my first approach is making self._model static member of class. But, sometimes it returns incorrect icons. I really can't understand when and why. When it is private member of instance, it seems it works """ self._model = None # can't construct in the construtor, must be constructed in GUI thread @staticmethod def _filterHidden(paths): """Remove hidden and ignored files from the list """ return [path for path in paths \ if not os.path.basename(path).startswith('.') and \ not core.fileFilter().regExp().match(path)] def _classifyRowIndex(self, row): """Get list item type and index by it's row """ if self._error: assert row == 0 return (self._ERROR, 0) if row == 0: return (self._HEADER, 0) row -= 1 if self._status: if row == 0: return (self._STATUS, 0) row -= 1 if row in range(len(self._dirs)): return (self._DIRECTORY, row) row -= len(self._dirs) if row in range(len(self._files)): return (self._FILE, row) assert False def _formatHeader(self, text): """Format current directory for show it in the list of completions """ return '<font style="background-color: %s; color: %s">%s</font>' % \ (QApplication.instance().palette().color(QPalette.Window).name(), QApplication.instance().palette().color(QPalette.WindowText).name(), htmlEscape(text)) def rowCount(self): """Row count in the list of completions """ if self._error: return 1 else: count = 1 # current directory if self._status: count += 1 count += len(self._dirs) count += len(self._files) return count def _iconForPath(self, path): """Get icon for file or directory path. Uses QFileSystemModel """ if self._model is None: self._model = QFileSystemModel() index = self._model.index(path) return self._model.data(index, Qt.DecorationRole) def text(self, row, column): """Item text in the list of completions """ rowType, index = self._classifyRowIndex(row) if rowType == self._ERROR: return '<font color=red>%s</font>' % htmlEscape(self._error) elif rowType == self._HEADER: return self._formatHeader(self._headerText()) elif rowType == self._STATUS: return '<i>%s</i>' % htmlEscape(self._status) elif rowType == self._DIRECTORY: return self._formatPath(self._dirs[index], True) elif rowType == self._FILE: return self._formatPath(self._files[index], False) def icon(self, row, column): """Item icon in the list of completions """ rowType, index = self._classifyRowIndex(row) if rowType == self._ERROR: return QApplication.instance().style().standardIcon( QStyle.SP_MessageBoxCritical) elif rowType == self._HEADER: return None elif rowType == self._STATUS: return None elif rowType == self._DIRECTORY: return self._iconForPath(self._dirs[index]) elif rowType == self._FILE: return self._iconForPath(self._files[index]) def getFullText(self, row): """User clicked a row. Get inline completion for this row """ row -= 1 # skip current directory path = None if row in range(len(self._dirs)): return self._dirs[row] + '/' else: row -= len(self._dirs) # skip dirs if row in range(len(self._files)): return self._files[row] return None
views = [] # for ViewType in (QColumnView, QTreeView): # for ViewType in (QTreeView): # Create the view in the splitter. view = TreeView(splitter) view.setSelectionMode(QAbstractItemView.ExtendedSelection) # Set the model of the view. view.setModel(model) view.hideColumn(1) view.hideColumn(2) view.hideColumn(3) view.setColumnWidth(30, 1) view.setRootIndex(model.index(QDir.currentPath(), 0)) # Set the root index of the view as the user's home directory. # view.setRoot Index(model.index(QDir.homePath())) view.setAnimated(True) # view.doubleClicked().connect(buttonClicked) colors = ["r", "g", "b", "y", "w"] pgwin = pg.PlotWidget(splitter) p1 = pgwin.getPlotItem() p1.showGrid(True, True) p1.setLogMode(False, True) p1.addLegend(offset=(400, 30)) # pgwin.setConfigOptions(antialias=True)
http://doc.qt.nokia.com/latest/model-view-programming.html. """ import sys from PyQt4.QtGui import (QApplication, QColumnView, QFileSystemModel, QSplitter, QTreeView) from PyQt4.QtCore import QDir, Qt if __name__ == '__main__': app = QApplication(sys.argv) # Splitter to show 2 views in same widget easily. splitter = QSplitter() # The model. model = QFileSystemModel() # You can setRootPath to any path. model.setRootPath(QDir.rootPath()) # List of views. views = [] for ViewType in (QColumnView, QTreeView): # Create the view in the splitter. view = ViewType(splitter) # Set the model of the view. view.setModel(model) # Set the root index of the view as the user's home directory. view.setRootIndex(model.index(QDir.homePath())) # Show the splitter. splitter.show() # Maximize the splitter. splitter.setWindowState(Qt.WindowMaximized) # Start the main loop. sys.exit(app.exec_())
def __init__(self, parent=None, viewtype=None): """ viewtype option specifies the file browser type of view ('tree' and 'table' are accepted, 'tree' is the default) :type viewtype: str """ super(MainWindow, self).__init__(parent) # # MODEL (is the default PyQt QFileSystemModel) # model = QFileSystemModel() model.setRootPath(QDir.currentPath()) # needed to fetch files model.setReadOnly(False) # # VIEW # # Select the view QWidget based on command prompt parameter # (table and tree view supported as far as now) if viewtype == 'table': view = TableView(self) elif viewtype == 'tree': view = TreeView(self) else: raise ValueError(u"'{}' view is not recognized. 'tree' or 'table' expected.".format(viewtype)) # passed self to use MainWindow's methods (see signal's TODO) logging.info(u'{}View'.format(viewtype.capitalize())) view.setModel(model) # If you set the root of the tree to the current path # you start much more quickly than leaving the default, that cause # detection of all drives on Windows (slow) if last_visited_directory: startpath = last_visited_directory else: startpath = QDir.currentPath() self.curpath = startpath view.setRootIndex(model.index(startpath)) # A generic 'view' attribute name is used. Don't care about the view # is a TreeView or a TableView or... self.view = view self.setCentralWidget(self.view) # STATUS BAR status = self.statusBar() status.setSizeGripEnabled(False) status.showMessage(tr('SB', "Ready"), 2000) self.status_bar = status # TODO: add message to the log wintitle = u'{} {}'.format(__title__, __date__.replace(u'-', u'.')) self.setWindowTitle(wintitle) # Selection behavior: SelectRows # (important if the view is a QTableView) self.view.setSelectionBehavior(view.SelectRows) # Set extended selection mode (ExtendedSelection is a standard) self.view.setSelectionMode(QTreeView.ExtendedSelection) # Enable the context menu self.view.setContextMenuPolicy(Qt.CustomContextMenu) self.connect(self.view, SIGNAL('customContextMenuRequested(const QPoint&)'), self.on_context_menu) # Double click on the view self.view.doubleClicked.connect(self.doubleclick) # Selection changed self.connect(self.view, SIGNAL('sel_changed(PyQt_PyObject)'), self.selChanged) # Creating window to show the textual content of files self.text_window = QTextEdit() # hidden for now (no method show() called) self.addOns = [] # let's populate self.addOns list with dynamically created AddOn instances of scripts for script in py_addons: modulename = path.splitext(path.split(script)[-1])[0] exec 'from scripts import {}'.format(modulename) try: exec 'self.addOns.append({}.AddOn(self))'.format(modulename) except BaseException as err: message = u'Error on script {}: {}'.format(err, modulename) print(message, args) self.status_bar.showMessage(message) logging.error(message) else: print(u"Loaded add-on '{}'".format(modulename))
class AbstractPathCompleter(AbstractCompleter): """Base class for PathCompleter and GlobCompleter """ # global object. Reused by all completers _fsModel = QFileSystemModel() _ERROR = 'error' _HEADER = 'currentDir' _STATUS = 'status' _DIRECTORY = 'directory' _FILE = 'file' def __init__(self, text): self._originalText = text self._dirs = [] self._files = [] self._error = None self._status = None """hlamer: my first approach is making self._model static member of class. But, sometimes it returns incorrect icons. I really can't understand when and why. When it is private member of instance, it seems it works """ self._model = None # can't construct in the construtor, must be constructed in GUI thread @staticmethod def _filterHidden(paths): """Remove hidden and ignored files from the list """ return [path for path in paths \ if not os.path.basename(path).startswith('.') and \ not core.fileFilter().regExp().match(path)] def _classifyRowIndex(self, row): """Get list item type and index by it's row """ if self._error: assert row == 0 return (self._ERROR, 0) if row == 0: return (self._HEADER, 0) row -= 1 if self._status: if row == 0: return (self._STATUS, 0) row -= 1 if row in range(len(self._dirs)): return (self._DIRECTORY, row) row -= len(self._dirs) if row in range(len(self._files)): return (self._FILE, row) assert False def _formatHeader(self, text): """Format current directory for show it in the list of completions """ return '<font style="background-color: %s; color: %s">%s</font>' % \ (QApplication.instance().palette().color(QPalette.Window).name(), QApplication.instance().palette().color(QPalette.WindowText).name(), htmlEscape(text)) def rowCount(self): """Row count in the list of completions """ if self._error: return 1 else: count = 1 # current directory if self._status: count += 1 count += len(self._dirs) count += len(self._files) return count def _iconForPath(self, path): """Get icon for file or directory path. Uses QFileSystemModel """ if self._model is None: self._model = QFileSystemModel() index = self._model.index(path) return self._model.data(index, Qt.DecorationRole) def text(self, row, column): """Item text in the list of completions """ rowType, index = self._classifyRowIndex(row) if rowType == self._ERROR: return '<font color=red>%s</font>' % htmlEscape(self._error) elif rowType == self._HEADER: return self._formatHeader(self._headerText()) elif rowType == self._STATUS: return '<i>%s</i>' % htmlEscape(self._status) elif rowType == self._DIRECTORY: return self._formatPath(self._dirs[index], True) elif rowType == self._FILE: return self._formatPath(self._files[index], False) def icon(self, row, column): """Item icon in the list of completions """ rowType, index = self._classifyRowIndex(row) if rowType == self._ERROR: return QApplication.instance().style().standardIcon(QStyle.SP_MessageBoxCritical) elif rowType == self._HEADER: return None elif rowType == self._STATUS: return None elif rowType == self._DIRECTORY: return self._iconForPath(self._dirs[index]) elif rowType == self._FILE: return self._iconForPath(self._files[index]) def getFullText(self, row): """User clicked a row. Get inline completion for this row """ row -= 1 # skip current directory path = None if row in range(len(self._dirs)): return self._dirs[row] + '/' else: row -= len(self._dirs) # skip dirs if row in range(len(self._files)): return self._files[row] return None
import sys from PyQt4.QtGui import (QApplication, QColumnView, QFileSystemModel, QSplitter, QTreeView) from PyQt4.QtCore import QDir, Qt if __name__ == '__main__': app = QApplication(sys.argv) # Splitter to show 2 views in same widget easily. splitter = QSplitter() # The model. model = QFileSystemModel() # You can setRootPath to any path. model.setRootPath(QDir.rootPath()) # List of views. views = [] for ViewType in (QColumnView, QTreeView): # Create the view in the splitter. view = ViewType(splitter) # Set the model of the view. view.setModel(model) # Set the root index of the view as the user's home directory. view.setRootIndex(model.index(QDir.homePath())) # Show the splitter. splitter.show() # Maximize the splitter. splitter.setWindowState(Qt.WindowMaximized) # Start the main loop. sys.exit(app.exec_())
class SourceFileTreeWidget(QWidget): """ Config window""" def __init__(self, parent): super(SourceFileTreeWidget, self).__init__(parent) self.ui = Ui_SourceFileTreeWidget() self.ui.setupUi(self) self.file_model = QFileSystemModel() #self.file_model.setFilter(QDir.AllEntries | QDir.NoDot) self.set_filter() self.ui.tree.setModel(self.file_model) self.ui.tree.resizeColumnToContents(0) self.ui.custom_root.setText(QDir.currentPath()) self.set_root() header = self.ui.tree.header() header.setResizeMode(QHeaderView.ResizeToContents) #header.setStretchLastSection(True) #header.setSortIndicator(0, Qt.AscendingOrder) #header.setSortIndicatorShown(True) #header.setClickable(True) self.connect(self.ui.tree, QtCore.SIGNAL('doubleClicked(QModelIndex)'), self.open_file) self.connect(self.ui.ok_filter, QtCore.SIGNAL('clicked()'), self.set_filter) self.connect(self.ui.custom_filter, QtCore.SIGNAL('returnPressed()'), self.set_filter) self.connect(self.ui.ok_root, QtCore.SIGNAL('clicked()'), self.set_root) self.connect(self.ui.custom_root, QtCore.SIGNAL('returnPressed()'), self.set_root) self.open_file_signal = None def set_open_file_signal(self, signal): """ callback to signal file opening """ self.open_file_signal = signal def set_root(self, root=None, use_common_prefix=True): """ set the root path of the widget """ curr = str(self.ui.custom_root.text()) if not root: use_common_prefix = False # input text box will override it. root = self.ui.custom_root.text() else: self.ui.custom_root.setText(root) idx = self.file_model.index(root) self.ui.tree.setExpanded(idx, True) if use_common_prefix and curr == os.path.commonprefix([root, curr]): return idx = self.file_model.setRootPath(root) if not idx.isValid(): logging.warn('Invalid path') return self.ui.tree.setRootIndex(idx) self.ui.tree.setExpanded(idx, True) def set_filter(self): """ set filter by extension """ filters = str(self.ui.custom_filter.text()).split(';') self.file_model.setNameFilters(filters) self.file_model.setNameFilterDisables(False) def open_file(self, idx): """ emit file opening signal """ if self.file_model.isDir(idx): return fullpath = self.file_model.filePath(idx) if self.open_file_signal: self.open_file_signal.emit(str(fullpath), 0) def set_file_selected(self, tab_idx): """ slot to associate the file in active tab """ filename = self.sender().tabToolTip(tab_idx) idx = self.file_model.index(filename) if idx.isValid(): self.ui.tree.selectionModel().select(idx, QItemSelectionModel.ClearAndSelect)
class ExampleApp(QtGui.QMainWindow, main_form.Ui_MainWindow): def __init__(self): super(self.__class__, self).__init__() self.setupUi( self) # This is defined in design.py file automatically # self.listWidget_Xoutput_files.addItem("deneme") cleaner_files_path = os.path.join(str(QDir.currentPath()), "cleaner_files") if not os.path.exists(cleaner_files_path): os.mkdir(cleaner_files_path) self.model = QFileSystemModel() self.model.setRootPath(cleaner_files_path) self.model.setNameFilters(QStringList(["Xoutput-n_analyses-*.txt" ])) self.model.setNameFilterDisables(False) self.model.setFilter(QDir.Dirs | QDir.Files) self.treeView_Xoutput_files.setModel(self.model) self.treeView_Xoutput_files.setRootIndex( self.model.index(cleaner_files_path)) self.treeView_Xoutput_files.setColumnWidth(0, 500) self.treeView_Xoutput_files.selectionModel( ).selectionChanged.connect(self.load_and_view_file_contents) self.rules_dict = {} self.special_button_for_level_01.setDisabled(True) def load_and_view_file_contents(self, current, previous): print current.indexes() model_index = current.indexes()[0] filename = self.model.data(model_index).toString() import re m = re.match(r"Xoutput-n_analyses-([0-9]+)", filename) if m: n_analyzes = int(m.group(1)) else: n_analyzes = -1 if n_analyzes == 1: self.special_button_for_level_01.setDisabled(False) self.special_button_for_level_01.clicked.connect( self.add_all_level_01_to_rule_dict) else: self.special_button_for_level_01.setDisabled(True) with codecs.open(filename, "r", encoding="utf8") as f: lines = f.readlines() # print lines self.listWidget_selected_file_contents.clear() self.listWidget_selected_file_contents.addItems( QStringList(lines)) self.listWidget_selected_file_contents.selectionModel( ).selectionChanged.connect( self.load_and_view_samples_from_train_and_dev) self.load_and_view_rule_file_contents(n_analyzes) def load_and_view_rule_file_contents(self, n_analyzes): # load rules file self.rules_dict = {} rules_filename = "Xoutput-n_analyses-%02d.txt.rules" % n_analyzes try: with codecs.open(rules_filename, "r") as rules_f: self.output_file_load_status.setText("%s loaded." % rules_filename) self.output_file_load_status.setStyleSheet( "QLabel { color : green; }") rules = [] line = rules_f.readline().strip() while line: rules.append(line.split(" ")) self.rules_dict[int( line.split(" ")[0])] = line.split(" ") line = rules_f.readline().strip() self.update_tableWidgetxxxx( self.tableWidget_output_file_contents, sorted(self.rules_dict.items(), key=lambda x: x[0]), len(self.rules_dict.keys()), 1 + 1 + n_analyzes + 1) # id + golden + FST analyzes + selected except IOError as e: # print "File not found" self.output_file_load_status.setText("File not found") self.output_file_load_status.setStyleSheet( "QLabel { color : red; }") self.update_tableWidgetxxxx( self.tableWidget_output_file_contents, [], 0, 1) # id + golden + FST analyzes + selected def update_tableWidgetxxxx(self, table_widget, rules, row_count, col_count): table_widget.clear() table_widget.setColumnCount(col_count) table_widget.setRowCount(row_count) if rules: for row in range(table_widget.rowCount()): row_items = rules[row] print row_items item = self.listWidget_selected_file_contents.item( int(row_items[0]) - 1) # type: QListWidgetItem item.setBackgroundColor(QtGui.QColor(255, 0, 0, 127)) for column in range(table_widget.columnCount()): if column < len(row_items[1]): table_widget.setItem( row, column, QTableWidgetItem( row_items[1][column].decode("utf8"))) # self.tableWidget_samples_from_train_and_dev.resizeColumnToContents() for column in range(table_widget.columnCount()): table_widget.resizeColumnToContents(column) def update_corrected_morph_analysis(self, current, previous): model_index = current.indexes()[0] self.textEdit_2.setPlainText( self.listWidget_selected_row.model().data( model_index).toString()) def add_all_level_01_to_rule_dict(self): self.rules_dict = {} for idx in range(self.listWidget_selected_file_contents.count()): row_items = unicode( self.listWidget_selected_file_contents.item( idx).text()).strip().split(" ") rules_item = [ x.encode("utf8") for x in [row_items[0], row_items[4], row_items[-1], row_items[-1]] ] self.rules_dict[int(row_items[0])] = rules_item self.update_tableWidgetxxxx( self.tableWidget_output_file_contents, sorted(self.rules_dict.items(), key=lambda x: x[0]), len(self.rules_dict.keys()), 1 + 1 + 1 + 1) # id + golden + FST analyzes + selected def add_to_the_rule_dict(self, state): n_analyzes, entry_id = [ int(x) for x in self.label_8.text().split(" ") ] other_analyzes = [ self.listWidget_selected_row.item(i) for i in range(self.listWidget_selected_row.count()) ] # type: list[QListWidgetItem] rules_item = [unicode(x).encode("utf8") for x in [entry_id, self.textEdit_golden_morph_analysis.toPlainText()] + \ [x.text() for x in other_analyzes] + \ [self.textEdit_2.toPlainText()]] self.rules_dict[entry_id] = rules_item self.update_tableWidgetxxxx( self.tableWidget_output_file_contents, sorted(self.rules_dict.items(), key=lambda x: x[0]), len(self.rules_dict.keys()), 1 + 1 + n_analyzes + 1) # id + golden + FST analyzes + selected def load_and_view_samples_from_train_and_dev(self, current, previous): print current.indexes() model_index = current.indexes()[0] morph_analyzes = unicode( self.listWidget_selected_file_contents.model().data( model_index).toString()).strip().split(" ") # print morph_analyzes golden_morph_analysis = morph_analyzes[4] target = golden_morph_analysis[1:] other_morph_analyzes = morph_analyzes[5:] n_analyzes = len(other_morph_analyzes) self.label_3.setText("selected row id: %d" % int(morph_analyzes[0])) self.label_8.setText("%d %d" % (int(n_analyzes), int(morph_analyzes[0]))) self.listWidget_selected_row.clear() self.listWidget_selected_row.addItems( QStringList(other_morph_analyzes)) self.textEdit_golden_morph_analysis.setPlainText( golden_morph_analysis) # self.addRuleToTheListButton.clicked.connect( # partial(self.save_to_file, n_analyzes=n_analyzes, entry_id=int(morph_analyzes[0]))) # from functools import partial self.addRuleToTheListButton.clicked.connect( self.add_to_the_rule_dict) if len(other_morph_analyzes) == 1: self.textEdit_2.setPlainText(other_morph_analyzes[0]) self.listWidget_selected_row.selectionModel( ).selectionChanged.connect(self.update_corrected_morph_analysis) print type(target) print target print target.encode("utf8") # target = target.replace("?", "\?") lines = subprocess.check_output( ("grep -F -m 50 %s ./dataset/errors.gungor.ner.train_and_dev" % target).split(" "), shell=False) # print lines lines = [x.decode("utf8") for x in lines.split("\n")] print type(lines[0]) print len(lines) self.tableWidget_samples_from_train_and_dev.clear() self.tableWidget_samples_from_train_and_dev.setColumnCount( n_analyzes + 1) self.tableWidget_samples_from_train_and_dev.setRowCount( len(lines) - 1) for row in range( self.tableWidget_samples_from_train_and_dev.rowCount()): row_items = lines[row].split(" ")[2:] for column in range( self.tableWidget_samples_from_train_and_dev. columnCount()): if column < len(row_items): self.tableWidget_samples_from_train_and_dev.setItem( row, column, QTableWidgetItem(row_items[column])) # self.tableWidget_samples_from_train_and_dev.resizeColumnToContents() for column in range( self.tableWidget_samples_from_train_and_dev.columnCount()): self.tableWidget_samples_from_train_and_dev.resizeColumnToContents( column) self.sort_and_save_button.clicked.connect(self.sort_and_save) def sort_and_save(self): indexes = self.treeView_Xoutput_files.selectedIndexes() model_index = indexes[0] filename = self.model.data(model_index).toString() with open(filename + ".rules", "w") as f: for row in range( self.tableWidget_output_file_contents.rowCount()): row_content = [] for column in range(self.tableWidget_output_file_contents. columnCount()): cell_content = self.tableWidget_output_file_contents.item( row, column).text() # type: QString if cell_content: row_content.append( unicode(cell_content).encode("utf8")) if row != 0: f.write("\n") f.write(" ".join(row_content))
class mainInitial(QtGui.QMainWindow): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.ui = Ui_MainWindow() #treeview UI self.ui.setupUi(self) self.showMaximized() self.home=os.getcwd() self.fileSystemModel = QFileSystemModel() #self.home=self.home + "/connections" #print (self.home) self.fillGrid2(self.home) #self.ui.treeWidget.isSortingEnabled() #self.ui.treeWidget.setSortingEnabled(True) self.ui.treeView.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.connect(self.ui.treeView, QtCore.SIGNAL("customContextMenuRequested(const QPoint &)"), self.onclick) #self.connect(self.ui.treeView.selectionModel(), # SIGNAL("customContextMenuRequested(pressed)"), self.onclick) # def eventFilter(self, obj, event): # if event.type() in (QtCore.QEvent.MouseButtonPress, QtCore.QEvent.MouseButtonDblClick): # if event.button() == QtCore.Qt.LeftButton: # print "left" # return True # elif event.button() == QtCore.Qt.RightButton: # print "Right" # return True # return super(mainInitial, self).eventFilter(obj, event) # # #self.button2.clicked.connect(self.on_button_clicked) # # #self.button1.installEventFilter(self) @QtCore.pyqtSlot(QtCore.QModelIndex) def onclick(self,selected): index=self.ui.treeView.indexAt(selected) #getSelected= self.ui.treeView.selectedItems() print (index) fileinfo = QtCore.QFileInfo(self.fileSystemModel.fileInfo(index) ) print (fileinfo) path = self.fileSystemModel.filePath(index) #pathABS =self.fileSystemModel.rootPath(index) print path #print pathABS if self.fileSystemModel.isDir(index): print ("es directorio") else: print ("es archivo") menu=QtGui.QMenu(self) action_1=menu.addAction("crear coneccion") action_1.triggered.connect(self.action1) action_2=menu.addAction("borrar coneccion") action_3=menu.addAction("Modificar coneccion") action_4=menu.addAction("Crear Carpeta") menu.exec_(QtGui.QCursor.pos()) #menu1=self.menu.addAction(u'algo') #menu1.triggered.connect(self.M1clear) #print ("determinar si esta vacio, es archivo o carpeta derecho") def action1(self, index): print "accion lanzada action_1" #self.fileSystemModel.mkdir() #print (self.ui.treeView.indexAt(index)) def fillGrid2(self,home): print (QDir.currentPath()) self.fileSystemModel.setRootPath(QDir.currentPath()) self.ui.treeView.setModel(self.fileSystemModel) self.ui.treeView.setRootIndex(self.fileSystemModel.index(QDir.currentPath())) self.ui.treeView.hideColumn(1) self.ui.treeView.hideColumn(2) self.ui.treeView.hideColumn(3)