# -*- coding: utf-8 -*- # # Copyright © Spyder Project Contributors # Licensed under the terms of the MIT License # (see spyder/__init__.py for details) """Explorer widget utilities.""" # Standard library imports import os import os.path as osp import re import subprocess import sys # Third-party imports from qtpy.QtCore import QFileInfo, Slot from qtpy.QtWidgets import QFileIconProvider, QMessageBox # Local imports from spyder.api.translations import get_translation from spyder.py3compat import str_lower from spyder.utils import encoding from spyder.utils.icon_manager import ima _ = get_translation('spyder') def open_file_in_external_explorer(filename): if sys.platform == "darwin": subprocess.call(["open", "-R", filename]) elif os.name == 'nt': subprocess.call(["explorer", "/select,", filename]) else: filename = os.path.dirname(filename) subprocess.call(["xdg-open", filename]) def show_in_external_file_explorer(fnames=None): """Show files in external file explorer Args: fnames (list): Names of files to show. """ if not isinstance(fnames, (tuple, list)): fnames = [fnames] for fname in fnames: open_file_in_external_explorer(fname) def fixpath(path): """Normalize path fixing case, making absolute and removing symlinks""" norm = osp.normcase if os.name == 'nt' else osp.normpath return norm(osp.abspath(osp.realpath(path))) def create_script(fname): """Create a new Python script""" text = os.linesep.join(["# -*- coding: utf-8 -*-", "", ""]) try: encoding.write(str(text), fname, 'utf-8') except EnvironmentError as error: QMessageBox.critical(_("Save Error"), _("Unable to save file '%s'" "

Error message:
%s" ) % (osp.basename(fname), str(error))) def listdir(path, include=r'.', exclude=r'\.pyc$|^\.', folders_only=False): """List files and directories""" namelist = [] dirlist = [str(osp.pardir)] for item in os.listdir(str(path)): if re.search(exclude, item): continue if osp.isdir(osp.join(path, item)): dirlist.append(item) elif folders_only: continue elif re.search(include, item): namelist.append(item) return sorted(dirlist, key=str_lower) + sorted(namelist, key=str_lower) def has_subdirectories(path, include, exclude): """Return True if path has subdirectories""" try: # > 1 because of '..' return len(listdir(path, include, exclude, folders_only=True)) > 1 except (IOError, OSError): return False class IconProvider(QFileIconProvider): """Project tree widget icon provider""" def __init__(self, treeview): super(IconProvider, self).__init__() self.treeview = treeview @Slot(int) @Slot(QFileInfo) def icon(self, icontype_or_qfileinfo): """Reimplement Qt method""" if isinstance(icontype_or_qfileinfo, QFileIconProvider.IconType): return super(IconProvider, self).icon(icontype_or_qfileinfo) else: qfileinfo = icontype_or_qfileinfo fname = osp.normpath(str(qfileinfo.absoluteFilePath())) if osp.isfile(fname) or osp.isdir(fname): icon = ima.get_icon_by_extension_or_type(fname, scale_factor=1.0) else: icon = ima.icon('binary') return icon