# -*- coding: utf-8 -*-
#
# Copyright © Spyder Project Contributors
# Licensed under the terms of the MIT License
# (see spyder/__init__.py for details)
"""Project Explorer"""
# pylint: disable=C0103
# Standard library imports
from __future__ import print_function
import os.path as osp
# Third party imports
from qtpy.QtCore import Qt, Signal
from qtpy.QtWidgets import QHBoxLayout, QLabel, QVBoxLayout, QWidget
# Local imports
from spyder.api.widgets.main_widget import PluginMainWidget
from spyder.api.translations import get_translation
from spyder.plugins.explorer.api import DirViewActions
from spyder.plugins.projects.widgets.projectexplorer import (
ProjectExplorerTreeWidget)
_ = get_translation('spyder')
class ProjectExplorerOptionsMenuSections:
Main = 'main'
class ProjectExplorerWidget(PluginMainWidget):
"""Project Explorer"""
sig_open_file_requested = Signal(str)
"""
This signal is emitted when a file is requested to be opened.
Parameters
----------
directory: str
The path to the requested file.
"""
def __init__(self, name, plugin, parent=None):
super().__init__(name, plugin=plugin, parent=parent)
self.name_filters = self.get_conf('name_filters')
self.show_hscrollbar = self.get_conf('show_hscrollbar')
self.treewidget = ProjectExplorerTreeWidget(self, self.show_hscrollbar)
self.treewidget.setup()
self.treewidget.setup_view()
self.treewidget.hide()
self.treewidget.sig_open_file_requested.connect(
self.sig_open_file_requested)
self.emptywidget = ProjectExplorerTreeWidget(self)
layout = QVBoxLayout()
layout.addWidget(self.emptywidget)
layout.addWidget(self.treewidget)
self.setLayout(layout)
self.setMinimumWidth(200)
def setup(self):
"""Setup the widget."""
menu = self.get_options_menu()
hidden_action = self.get_action(DirViewActions.ToggleHiddenFiles)
single_click_action = self.get_action(DirViewActions.ToggleSingleClick)
for action in [hidden_action, single_click_action]:
self.add_item_to_menu(
action,
menu=menu,
section=ProjectExplorerOptionsMenuSections.Main)
def update_actions(self):
pass
def get_title(self):
return _("Project")
def set_project_dir(self, directory):
"""Set the project directory"""
if directory is not None:
self.treewidget.set_root_path(osp.dirname(directory))
self.treewidget.set_folder_names([osp.basename(directory)])
self.treewidget.setup_project_view()
try:
self.treewidget.setExpanded(self.treewidget.get_index(directory),
True)
except TypeError:
pass
def clear(self):
"""Show an empty view"""
self.treewidget.hide()
self.emptywidget.show()
def setup_project(self, directory):
"""Setup project"""
self.emptywidget.hide()
self.treewidget.show()
# Setup the directory shown by the tree
self.set_project_dir(directory)
# =============================================================================
# Tests
# =============================================================================
class ProjectExplorerTest(QWidget):
def __init__(self, directory=None):
QWidget.__init__(self)
self.CONF_SECTION = 'project_explorer'
vlayout = QVBoxLayout()
self.setLayout(vlayout)
self.explorer = ProjectExplorerWidget(None, self, self)
if directory is not None:
self.directory = directory
else:
self.directory = osp.dirname(osp.abspath(__file__))
self.explorer.setup_project(self.directory)
vlayout.addWidget(self.explorer)
hlayout1 = QHBoxLayout()
vlayout.addLayout(hlayout1)
label = QLabel("Open file:")
label.setAlignment(Qt.AlignRight)
hlayout1.addWidget(label)
self.label1 = QLabel()
hlayout1.addWidget(self.label1)
self.explorer.sig_open_file_requested.connect(self.label1.setText)
hlayout3 = QHBoxLayout()
vlayout.addLayout(hlayout3)
label = QLabel("Option changed:")
label.setAlignment(Qt.AlignRight)
hlayout3.addWidget(label)
self.label3 = QLabel()
hlayout3.addWidget(self.label3)
def test():
from spyder.utils.qthelpers import qapplication
app = qapplication()
test = ProjectExplorerTest()
test.resize(250, 480)
test.show()
app.exec_()
if __name__ == "__main__":
test()