class WorkingDirectory(QToolBar, PluginMixin): """ Working directory changer widget """ ID = 'workingdir' # allowed_areas = Qt.TopDockWidgetArea | Qt.BottomDockWidgetArea # location = Qt.TopDockWidgetArea LOG_PATH = get_conf_path('.workingdir') def __init__(self, parent, workdir=None): QToolBar.__init__(self, parent) PluginMixin.__init__(self, parent) self.setWindowTitle(self.get_widget_title()) # Toolbar title self.setObjectName(self.get_widget_title()) # Used to save Window state self.addWidget( QLabel(self.tr("Working directory:")+" ") ) # Previous dir action self.history = [] self.histindex = None self.previous_action = create_action(self, "previous", None, get_icon('previous.png'), self.tr('Back'), triggered=self.previous_directory) self.addAction(self.previous_action) # Next dir action self.history = [] self.histindex = None self.next_action = create_action(self, "next", None, get_icon('next.png'), self.tr('Next'), triggered=self.next_directory) self.addAction(self.next_action) # Enable/disable previous/next actions self.connect(self, SIGNAL("set_previous_enabled(bool)"), self.previous_action.setEnabled) self.connect(self, SIGNAL("set_next_enabled(bool)"), self.next_action.setEnabled) # Path combo box adjust = CONF.get('shell', 'working_dir_adjusttocontents', False) self.pathedit = PathComboBox(self, adjust_to_contents=adjust) self.pathedit.setToolTip(self.tr("Working directory")) self.connect(self.pathedit, SIGNAL("open_dir(QString)"), self.pathedit_activated) self.pathedit.setMaxCount(CONF.get('shell', 'working_dir_history')) wdhistory = self.load_wdhistory( workdir ) if workdir is None: if wdhistory: workdir = wdhistory[0] else: workdir = "." self.chdir(workdir) self.pathedit.addItems( wdhistory ) self.refresh() self.addWidget(self.pathedit) # Browse action browse_action = create_action(self, "browse", None, get_std_icon('DirOpenIcon'), self.tr('Browse a working directory'), triggered=self.select_directory) self.addAction(browse_action) # Parent dir action parent_action = create_action(self, "parent", None, get_icon('up.png'), self.tr('Change to parent directory'), triggered=self.parent_directory) self.addAction(parent_action) def get_widget_title(self): """Return widget title""" return self.tr('Working directory') def set_actions(self): """Setup actions""" return (None, None) def closing(self, cancelable=False): """Perform actions before parent main window is closed""" return True def load_wdhistory(self, workdir=None): """Load history from a text file in user home directory""" if osp.isfile(self.LOG_PATH): wdhistory, _ = encoding.readlines(self.LOG_PATH) wdhistory = [name for name in wdhistory if os.path.isdir(name)] else: if workdir is None: workdir = os.getcwdu() wdhistory = [ workdir ] return wdhistory def save_wdhistory(self): """Save history to a text file in user home directory""" text = [ unicode( self.pathedit.itemText(index) ) \ for index in range(self.pathedit.count()) ] encoding.writelines(text, self.LOG_PATH) def refresh(self): """Refresh widget""" curdir = os.getcwdu() index = self.pathedit.findText(curdir) while index!=-1: self.pathedit.removeItem(index) index = self.pathedit.findText(curdir) self.pathedit.insertItem(0, curdir) self.pathedit.setCurrentIndex(0) self.save_wdhistory() self.emit(SIGNAL("set_previous_enabled(bool)"), self.histindex is not None and self.histindex > 0) self.emit(SIGNAL("set_next_enabled(bool)"), self.histindex is not None and \ self.histindex < len(self.history)-1) def select_directory(self): """Select directory""" self.emit(SIGNAL('redirect_stdio(bool)'), False) directory = QFileDialog.getExistingDirectory(self.main, self.tr("Select directory"), os.getcwdu()) if not directory.isEmpty(): self.chdir(directory) self.emit(SIGNAL('redirect_stdio(bool)'), True) def previous_directory(self): """Back to previous directory""" self.histindex -= 1 self.chdir(browsing_history=True) def next_directory(self): """Return to next directory""" self.histindex += 1 self.chdir(browsing_history=True) def parent_directory(self): """Change working directory to parent directory""" self.chdir(os.path.join(os.getcwdu(), os.path.pardir)) def chdir(self, directory=None, browsing_history=False): """Set directory as working directory""" # Working directory history management if browsing_history: directory = self.history[self.histindex] else: if self.histindex is None: self.history = [] else: self.history = self.history[:self.histindex+1] self.history.append( osp.abspath((unicode(directory))) ) self.histindex = len(self.history)-1 # Changing working directory os.chdir( unicode(directory) ) self.refresh() if not isinstance(self.sender(), Explorer): # Explorer is not the sender: let's refresh it self.emit(SIGNAL("refresh_explorer()")) self.emit(SIGNAL("refresh_findinfiles()")) def pathedit_activated(self, directory): """Path combo box activated""" if self.main is not None: # Give focus to interactive shell self.main.console.shell.setFocus() self.chdir(directory)
class WorkingDirectory(QToolBar, SpyderPluginMixin): """ Working directory changer widget """ CONF_SECTION = 'workingdir' CONFIGWIDGET_CLASS = WorkingDirectoryConfigPage LOG_PATH = get_conf_path(CONF_SECTION) sig_option_changed = Signal(str, object) set_previous_enabled = Signal(bool) set_next_enabled = Signal(bool) redirect_stdio = Signal(bool) set_explorer_cwd = Signal(str) refresh_findinfiles = Signal() set_current_console_wd = Signal(str) def __init__(self, parent, workdir=None, **kwds): if PYQT5: super(WorkingDirectory, self).__init__(parent, **kwds) else: QToolBar.__init__(self, parent) SpyderPluginMixin.__init__(self, parent) # Initialize plugin self.initialize_plugin() self.setWindowTitle(self.get_plugin_title()) # Toolbar title self.setObjectName( self.get_plugin_title()) # Used to save Window state # Previous dir action self.history = [] self.histindex = None self.previous_action = create_action(self, "previous", None, ima.icon('previous'), _('Back'), triggered=self.previous_directory) self.addAction(self.previous_action) # Next dir action self.history = [] self.histindex = None self.next_action = create_action(self, "next", None, ima.icon('next'), _('Next'), triggered=self.next_directory) self.addAction(self.next_action) # Enable/disable previous/next actions self.set_previous_enabled.connect(self.previous_action.setEnabled) self.set_next_enabled.connect(self.next_action.setEnabled) # Path combo box adjust = self.get_option('working_dir_adjusttocontents') self.pathedit = PathComboBox(self, adjust_to_contents=adjust) self.pathedit.setToolTip( _("This is the working directory for newly\n" "opened consoles (Python/IPython consoles and\n" "terminals), for the file explorer, for the\n" "find in files plugin and for new files\n" "created in the editor")) self.pathedit.open_dir.connect(self.chdir) self.pathedit.setMaxCount(self.get_option('working_dir_history')) wdhistory = self.load_wdhistory(workdir) if workdir is None: if self.get_option('startup/use_last_directory'): if wdhistory: workdir = wdhistory[0] else: workdir = "." else: workdir = self.get_option('startup/fixed_directory', ".") if not osp.isdir(workdir): workdir = "." self.chdir(workdir) self.pathedit.addItems(wdhistory) self.refresh_plugin() self.addWidget(self.pathedit) # Browse action browse_action = create_action(self, "browse", None, ima.icon('DirOpenIcon'), _('Browse a working directory'), triggered=self.select_directory) self.addAction(browse_action) # Set current console working directory action setwd_action = create_action(self, icon=ima.icon('set_workdir'), text=_("Set as current console's " "working directory"), triggered=self.set_as_current_console_wd) self.addAction(setwd_action) # Parent dir action parent_action = create_action(self, "parent", None, ima.icon('up'), _('Change to parent directory'), triggered=self.parent_directory) self.addAction(parent_action) #------ SpyderPluginWidget API --------------------------------------------- def get_plugin_title(self): """Return widget title""" return _('Global working directory') def get_plugin_icon(self): """Return widget icon""" return ima.icon('DirOpenIcon') def get_plugin_actions(self): """Setup actions""" return (None, None) def register_plugin(self): """Register plugin in Spyder's main window""" self.redirect_stdio.connect(self.main.redirect_internalshell_stdio) self.main.console.shell.refresh.connect(self.refresh_plugin) iconsize = 24 self.setIconSize(QSize(iconsize, iconsize)) self.main.addToolBar(self) def refresh_plugin(self): """Refresh widget""" curdir = getcwd() self.pathedit.add_text(curdir) self.save_wdhistory() self.set_previous_enabled.emit(self.histindex is not None and self.histindex > 0) self.set_next_enabled.emit(self.histindex is not None and \ self.histindex < len(self.history)-1) def apply_plugin_settings(self, options): """Apply configuration file's plugin settings""" pass def closing_plugin(self, cancelable=False): """Perform actions before parent main window is closed""" return True #------ Public API --------------------------------------------------------- def load_wdhistory(self, workdir=None): """Load history from a text file in user home directory""" if osp.isfile(self.LOG_PATH): wdhistory, _ = encoding.readlines(self.LOG_PATH) wdhistory = [name for name in wdhistory if os.path.isdir(name)] else: if workdir is None: workdir = getcwd() wdhistory = [workdir] return wdhistory def save_wdhistory(self): """Save history to a text file in user home directory""" text = [ to_text_string( self.pathedit.itemText(index) ) \ for index in range(self.pathedit.count()) ] encoding.writelines(text, self.LOG_PATH) @Slot() def select_directory(self): """Select directory""" self.redirect_stdio.emit(False) directory = getexistingdirectory(self.main, _("Select directory"), getcwd()) if directory: self.chdir(directory) self.redirect_stdio.emit(True) @Slot() def previous_directory(self): """Back to previous directory""" self.histindex -= 1 self.chdir(browsing_history=True) @Slot() def next_directory(self): """Return to next directory""" self.histindex += 1 self.chdir(browsing_history=True) @Slot() def parent_directory(self): """Change working directory to parent directory""" self.chdir(os.path.join(getcwd(), os.path.pardir)) def chdir(self, directory=None, browsing_history=False, refresh_explorer=True): """Set directory as working directory""" # Working directory history management if directory is not None: directory = osp.abspath(to_text_string(directory)) if browsing_history: directory = self.history[self.histindex] elif directory in self.history: self.histindex = self.history.index(directory) else: if self.histindex is None: self.history = [] else: self.history = self.history[:self.histindex + 1] self.history.append(directory) self.histindex = len(self.history) - 1 # Changing working directory os.chdir(to_text_string(directory)) self.refresh_plugin() if refresh_explorer: self.set_explorer_cwd.emit(directory) self.refresh_findinfiles.emit() @Slot() def set_as_current_console_wd(self): """Set as current console working directory""" self.set_current_console_wd.emit(getcwd())
class WorkingDirectory(QToolBar, SpyderPluginMixin): """ Working directory changer widget """ CONF_SECTION = 'workingdir' CONFIGWIDGET_CLASS = WorkingDirectoryConfigPage LOG_PATH = get_conf_path(CONF_SECTION) sig_option_changed = Signal(str, object) def __init__(self, parent, workdir=None): QToolBar.__init__(self, parent) SpyderPluginMixin.__init__(self, parent) # Initialize plugin self.initialize_plugin() self.setWindowTitle(self.get_plugin_title()) # Toolbar title self.setObjectName(self.get_plugin_title()) # Used to save Window state # Previous dir action self.history = [] self.histindex = None self.previous_action = create_action(self, "previous", None, get_icon('previous.png'), _('Back'), triggered=self.previous_directory) self.addAction(self.previous_action) # Next dir action self.history = [] self.histindex = None self.next_action = create_action(self, "next", None, get_icon('next.png'), _('Next'), triggered=self.next_directory) self.addAction(self.next_action) # Enable/disable previous/next actions self.connect(self, SIGNAL("set_previous_enabled(bool)"), self.previous_action.setEnabled) self.connect(self, SIGNAL("set_next_enabled(bool)"), self.next_action.setEnabled) # Path combo box adjust = self.get_option('working_dir_adjusttocontents') self.pathedit = PathComboBox(self, adjust_to_contents=adjust) self.pathedit.setToolTip(_("This is the working directory for newly\n" "opened consoles (Python/IPython consoles and\n" "terminals), for the file explorer, for the\n" "find in files plugin and for new files\n" "created in the editor")) self.connect(self.pathedit, SIGNAL("open_dir(QString)"), self.chdir) self.pathedit.setMaxCount(self.get_option('working_dir_history')) wdhistory = self.load_wdhistory( workdir ) if workdir is None: if self.get_option('startup/use_last_directory'): if wdhistory: workdir = wdhistory[0] else: workdir = "." else: workdir = self.get_option('startup/fixed_directory', ".") if not osp.isdir(workdir): workdir = "." self.chdir(workdir) self.pathedit.addItems( wdhistory ) self.refresh_plugin() self.addWidget(self.pathedit) # Browse action browse_action = create_action(self, "browse", None, get_std_icon('DirOpenIcon'), _('Browse a working directory'), triggered=self.select_directory) self.addAction(browse_action) # Set current console working directory action setwd_action = create_action(self, icon=get_icon('set_workdir.png'), text=_("Set as current console's " "working directory"), triggered=self.set_as_current_console_wd) self.addAction(setwd_action) # Parent dir action parent_action = create_action(self, "parent", None, get_icon('up.png'), _('Change to parent directory'), triggered=self.parent_directory) self.addAction(parent_action) #------ SpyderPluginWidget API --------------------------------------------- def get_plugin_title(self): """Return widget title""" return _('Global working directory') def get_plugin_icon(self): """Return widget icon""" return get_std_icon('DirOpenIcon') def get_plugin_actions(self): """Setup actions""" return (None, None) def register_plugin(self): """Register plugin in Spyder's main window""" self.connect(self, SIGNAL('redirect_stdio(bool)'), self.main.redirect_internalshell_stdio) self.connect(self.main.console.shell, SIGNAL("refresh()"), self.refresh_plugin) self.main.addToolBar(self) def refresh_plugin(self): """Refresh widget""" curdir = getcwd() self.pathedit.add_text(curdir) self.save_wdhistory() self.emit(SIGNAL("set_previous_enabled(bool)"), self.histindex is not None and self.histindex > 0) self.emit(SIGNAL("set_next_enabled(bool)"), self.histindex is not None and \ self.histindex < len(self.history)-1) def apply_plugin_settings(self, options): """Apply configuration file's plugin settings""" pass def closing_plugin(self, cancelable=False): """Perform actions before parent main window is closed""" return True #------ Public API --------------------------------------------------------- def load_wdhistory(self, workdir=None): """Load history from a text file in user home directory""" if osp.isfile(self.LOG_PATH): wdhistory, _ = encoding.readlines(self.LOG_PATH) wdhistory = [name for name in wdhistory if os.path.isdir(name)] else: if workdir is None: workdir = getcwd() wdhistory = [ workdir ] return wdhistory def save_wdhistory(self): """Save history to a text file in user home directory""" text = [ to_text_string( self.pathedit.itemText(index) ) \ for index in range(self.pathedit.count()) ] encoding.writelines(text, self.LOG_PATH) def select_directory(self): """Select directory""" self.emit(SIGNAL('redirect_stdio(bool)'), False) directory = getexistingdirectory(self.main, _("Select directory"), getcwd()) if directory: self.chdir(directory) self.emit(SIGNAL('redirect_stdio(bool)'), True) def previous_directory(self): """Back to previous directory""" self.histindex -= 1 self.chdir(browsing_history=True) def next_directory(self): """Return to next directory""" self.histindex += 1 self.chdir(browsing_history=True) def parent_directory(self): """Change working directory to parent directory""" self.chdir(os.path.join(getcwd(), os.path.pardir)) def chdir(self, directory=None, browsing_history=False, refresh_explorer=True): """Set directory as working directory""" # Working directory history management if directory is not None: directory = osp.abspath(to_text_string(directory)) if browsing_history: directory = self.history[self.histindex] elif directory in self.history: self.histindex = self.history.index(directory) else: if self.histindex is None: self.history = [] else: self.history = self.history[:self.histindex+1] self.history.append(directory) self.histindex = len(self.history)-1 # Changing working directory os.chdir( to_text_string(directory) ) self.refresh_plugin() if refresh_explorer: self.emit(SIGNAL("set_explorer_cwd(QString)"), directory) self.emit(SIGNAL("refresh_findinfiles()")) def set_as_current_console_wd(self): """Set as current console working directory""" self.emit(SIGNAL("set_current_console_wd(QString)"), getcwd())
class WorkingDirectory(QToolBar, PluginMixin): """ Working directory changer widget """ ID = 'workingdir' # allowed_areas = Qt.TopDockWidgetArea | Qt.BottomDockWidgetArea # location = Qt.TopDockWidgetArea LOG_PATH = get_conf_path('.workingdir') def __init__(self, parent, workdir=None): QToolBar.__init__(self, parent) PluginMixin.__init__(self, parent) self.setWindowTitle(self.get_widget_title()) # Toolbar title self.setObjectName( self.get_widget_title()) # Used to save Window state self.addWidget(QLabel(self.tr("Working directory:") + " ")) # Previous dir action self.history = [] self.histindex = None self.previous_action = create_action(self, "previous", None, get_icon('previous.png'), self.tr('Back'), triggered=self.previous_directory) self.addAction(self.previous_action) # Next dir action self.history = [] self.histindex = None self.next_action = create_action(self, "next", None, get_icon('next.png'), self.tr('Next'), triggered=self.next_directory) self.addAction(self.next_action) # Enable/disable previous/next actions self.connect(self, SIGNAL("set_previous_enabled(bool)"), self.previous_action.setEnabled) self.connect(self, SIGNAL("set_next_enabled(bool)"), self.next_action.setEnabled) # Path combo box adjust = CONF.get('shell', 'working_dir_adjusttocontents', False) self.pathedit = PathComboBox(self, adjust_to_contents=adjust) self.pathedit.setToolTip(self.tr("Working directory")) self.connect(self.pathedit, SIGNAL("open_dir(QString)"), self.pathedit_activated) self.pathedit.setMaxCount(CONF.get('shell', 'working_dir_history')) wdhistory = self.load_wdhistory(workdir) if workdir is None: if wdhistory: workdir = wdhistory[0] else: workdir = "." self.chdir(workdir) self.pathedit.addItems(wdhistory) self.refresh() self.addWidget(self.pathedit) # Browse action browse_action = create_action(self, "browse", None, get_std_icon('DirOpenIcon'), self.tr('Browse a working directory'), triggered=self.select_directory) self.addAction(browse_action) # Parent dir action parent_action = create_action(self, "parent", None, get_icon('up.png'), self.tr('Change to parent directory'), triggered=self.parent_directory) self.addAction(parent_action) def get_widget_title(self): """Return widget title""" return self.tr('Working directory') def set_actions(self): """Setup actions""" return (None, None) def closing(self, cancelable=False): """Perform actions before parent main window is closed""" return True def load_wdhistory(self, workdir=None): """Load history from a text file in user home directory""" if osp.isfile(self.LOG_PATH): wdhistory, _ = encoding.readlines(self.LOG_PATH) wdhistory = [name for name in wdhistory if os.path.isdir(name)] else: if workdir is None: workdir = os.getcwdu() wdhistory = [workdir] return wdhistory def save_wdhistory(self): """Save history to a text file in user home directory""" text = [ unicode( self.pathedit.itemText(index) ) \ for index in range(self.pathedit.count()) ] encoding.writelines(text, self.LOG_PATH) def refresh(self): """Refresh widget""" curdir = os.getcwdu() index = self.pathedit.findText(curdir) while index != -1: self.pathedit.removeItem(index) index = self.pathedit.findText(curdir) self.pathedit.insertItem(0, curdir) self.pathedit.setCurrentIndex(0) self.save_wdhistory() self.emit(SIGNAL("set_previous_enabled(bool)"), self.histindex is not None and self.histindex > 0) self.emit(SIGNAL("set_next_enabled(bool)"), self.histindex is not None and \ self.histindex < len(self.history)-1) def select_directory(self): """Select directory""" self.emit(SIGNAL('redirect_stdio(bool)'), False) directory = QFileDialog.getExistingDirectory( self.main, self.tr("Select directory"), os.getcwdu()) if not directory.isEmpty(): self.chdir(directory) self.emit(SIGNAL('redirect_stdio(bool)'), True) def previous_directory(self): """Back to previous directory""" self.histindex -= 1 self.chdir(browsing_history=True) def next_directory(self): """Return to next directory""" self.histindex += 1 self.chdir(browsing_history=True) def parent_directory(self): """Change working directory to parent directory""" self.chdir(os.path.join(os.getcwdu(), os.path.pardir)) def chdir(self, directory=None, browsing_history=False): """Set directory as working directory""" # Working directory history management if browsing_history: directory = self.history[self.histindex] else: if self.histindex is None: self.history = [] else: self.history = self.history[:self.histindex + 1] self.history.append(osp.abspath((unicode(directory)))) self.histindex = len(self.history) - 1 # Changing working directory os.chdir(unicode(directory)) self.refresh() if not isinstance(self.sender(), Explorer): # Explorer is not the sender: let's refresh it self.emit(SIGNAL("refresh_explorer()")) self.emit(SIGNAL("refresh_findinfiles()")) def pathedit_activated(self, directory): """Path combo box activated""" if self.main is not None: # Give focus to interactive shell self.main.console.shell.setFocus() self.chdir(directory)