Beispiel #1
0
    def _setup_filesystem_treeview(self):
        self.view = FileSystemTreeView(self._widget)
        self.view.setMinimumWidth(200)
        self._last_ignore_patterns = ';'.join(utils.get_ignored_patterns())
        self.view.add_ignore_patterns(self.get_ignored_patterns())
        self.view.file_created.connect(self._on_file_created)
        self.view.files_deleted.connect(self._on_files_deleted)
        self.view.files_renamed.connect(self._on_files_renamed)
        self.main_window.document_saved.connect(self._on_file_saved)
        self.view.set_icon_provider(FileIconProvider())
        context_menu = FileSystemContextMenu()
        self.view.set_context_menu(context_menu)
        self.templates_menu = context_menu.menu_new.addSeparator()
        self.templates_menu = context_menu.menu_new.addMenu(_('Templates'))
        self.templates_menu.menuAction().setIcon(
            QtGui.QIcon.fromTheme('folder-templates'))
        self._update_templates_menu()

        self.view.activated.connect(self._on_file_activated)

        self.action_mark_as_ignored = QtWidgets.QAction(
            _('Mark as ignored'), self.view)
        self.action_mark_as_ignored.triggered.connect(self._on_mark_as_ignored)
        self.action_mark_as_ignored.setIcon(
            QtGui.QIcon.fromTheme('emblem-unreadable'))
        self.view.context_menu.insertAction(
            self.view.context_menu.action_show_in_explorer,
            self.action_mark_as_ignored)
        self.view.context_menu.insertSeparator(
            self.view.context_menu.action_show_in_explorer)

        self.action_show_in_terminal = QtWidgets.QAction(
            QtGui.QIcon.fromTheme('utilities-terminal'), _('Open in terminal'),
            self.view)
        self.action_show_in_terminal.triggered.connect(
            self._on_show_in_terminal_triggered)
        self.view.context_menu.addAction(self.action_show_in_terminal)

        self.action_open_in_browser = QtWidgets.QAction(
            QtGui.QIcon.fromTheme('applications-internet'),
            _('Open in web browser'), self.view)
        self.action_open_in_browser.triggered.connect(
            self._on_action_open_in_browser_triggered)
        self.view.context_menu.addAction(self.action_open_in_browser)

        insert_pt = self.view.context_menu.menu_new.menuAction()

        action = QtWidgets.QAction(_('Execute file'), self.main_window)
        action.setToolTip(_('Run executable'))
        action.setIcon(api.special_icons.run_icon())
        action.triggered.connect(self._execute_file)
        self.action_exec_file = action
        self.view.context_menu.insertAction(insert_pt, action)
        action = QtWidgets.QAction(self.main_window)
        action.setSeparator(True)
        self.view.context_menu.insertAction(insert_pt, action)

        self.view.about_to_show_context_menu.connect(
            self._on_about_to_show_context_menu)
def test_fs_treeview():
    tv = FileSystemTreeView()
    tv.set_context_menu(FileSystemContextMenu())
    tv.set_root_path(__file__)
    tv.show()
    QTest.qWait(500)
    tv.close()
    del tv
"""
This example show you how to use the FileSystemTreeView (we show the
content of test_dir).
"""
import logging
import os
import sys
from pyqode.core.widgets import FileSystemTreeView, FileSystemContextMenu
from pyqode.qt import QtWidgets


logging.basicConfig(level=logging.DEBUG)


if __name__ == '__main__':
    def _on_tv_activated(index):
        print(tv.filePath(index))
        print(tv.fileInfo(index))

    app = QtWidgets.QApplication(sys.argv)
    tv = FileSystemTreeView()
    tv.set_context_menu(FileSystemContextMenu())
    tv.activated.connect(_on_tv_activated)
    path = os.path.join(os.getcwd(), 'test_dir')
    print('watching: %s' % path)
    tv.set_root_path(path)
    tv.show()
    app.exec_()
def test_fs_treeview():
    tv = FileSystemTreeView()
    tv.set_context_menu(FileSystemContextMenu())
    tv.set_root_path(__file__)
    tv.show()
    QTest.qWait(2000)
Beispiel #5
0
"""
This example show you how to use the FileSystemTreeView (we show the
content of test_dir).
"""
import logging
import os
import sys
from pyqode.core.widgets import FileSystemTreeView, FileSystemContextMenu
from pyqode.qt import QtWidgets

logging.basicConfig(level=logging.DEBUG)

if __name__ == '__main__':

    def _on_tv_activated(index):
        print(tv.filePath(index))
        print(tv.fileInfo(index))

    app = QtWidgets.QApplication(sys.argv)
    tv = FileSystemTreeView()
    tv.set_context_menu(FileSystemContextMenu())
    tv.activated.connect(_on_tv_activated)
    path = os.path.join(os.getcwd(), 'test_dir')
    print('watching: %s' % path)
    tv.set_root_path(path)
    tv.show()
    app.exec_()
Beispiel #6
0
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1366, 768)
        MainWindow.setMinimumSize(QtCore.QSize(0, 0))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/ide-icons/rc/silex-192x192.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setSpacing(0)
        self.gridLayout.setObjectName("gridLayout")
        self.stackedWidget = QtWidgets.QStackedWidget(self.centralwidget)
        self.stackedWidget.setObjectName("stackedWidget")
        self.pageHome = QtWidgets.QWidget()
        self.pageHome.setObjectName("pageHome")
        self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.pageHome)
        self.verticalLayout_5.setObjectName("verticalLayout_5")
        self.widgetHome = QtWidgets.QWidget(self.pageHome)
        self.widgetHome.setObjectName("widgetHome")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widgetHome)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        spacerItem = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout_2.addItem(spacerItem)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setContentsMargins(0, -1, 0, -1)
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem1)
        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.label_3 = QtWidgets.QLabel(self.widgetHome)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label_3.sizePolicy().hasHeightForWidth())
        self.label_3.setSizePolicy(sizePolicy)
        self.label_3.setMinimumSize(QtCore.QSize(0, 0))
        self.label_3.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.label_3.setWordWrap(True)
        self.label_3.setObjectName("label_3")
        self.verticalLayout_3.addWidget(self.label_3)
        self.horizontalLayout_3.addLayout(self.verticalLayout_3)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem2)
        self.verticalLayout_2.addLayout(self.horizontalLayout_3)
        self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_8.setContentsMargins(-1, 0, -1, 0)
        self.horizontalLayout_8.setObjectName("horizontalLayout_8")
        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_8.addItem(spacerItem3)
        self.btNewFile = QtWidgets.QPushButton(self.widgetHome)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.btNewFile.sizePolicy().hasHeightForWidth())
        self.btNewFile.setSizePolicy(sizePolicy)
        self.btNewFile.setMinimumSize(QtCore.QSize(200, 0))
        self.btNewFile.setObjectName("btNewFile")
        self.horizontalLayout_8.addWidget(self.btNewFile)
        self.btOpenFile = QtWidgets.QPushButton(self.widgetHome)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.btOpenFile.sizePolicy().hasHeightForWidth())
        self.btOpenFile.setSizePolicy(sizePolicy)
        self.btOpenFile.setMinimumSize(QtCore.QSize(200, 0))
        self.btOpenFile.setStyleSheet("")
        self.btOpenFile.setObjectName("btOpenFile")
        self.horizontalLayout_8.addWidget(self.btOpenFile)
        spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_8.addItem(spacerItem4)
        self.verticalLayout_2.addLayout(self.horizontalLayout_8)
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setContentsMargins(0, -1, -1, -1)
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_5.addItem(spacerItem5)
        self.frameRecents = QtWidgets.QFrame(self.widgetHome)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.frameRecents.sizePolicy().hasHeightForWidth())
        self.frameRecents.setSizePolicy(sizePolicy)
        self.frameRecents.setMinimumSize(QtCore.QSize(406, 0))
        self.frameRecents.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.frameRecents.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frameRecents.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frameRecents.setObjectName("frameRecents")
        self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.frameRecents)
        self.verticalLayout_4.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_4.setSpacing(0)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.labelRecents = QtWidgets.QLabel(self.frameRecents)
        self.labelRecents.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.labelRecents.setObjectName("labelRecents")
        self.verticalLayout_4.addWidget(self.labelRecents)
        self.listWidgetRecents = RecentFilesListWidget(self.frameRecents)
        self.listWidgetRecents.setMinimumSize(QtCore.QSize(400, 0))
        self.listWidgetRecents.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.listWidgetRecents.setObjectName("listWidgetRecents")
        self.verticalLayout_4.addWidget(self.listWidgetRecents)
        self.horizontalLayout_5.addWidget(self.frameRecents)
        spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_5.addItem(spacerItem6)
        self.verticalLayout_2.addLayout(self.horizontalLayout_5)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setContentsMargins(-1, 0, -1, -1)
        self.horizontalLayout.setObjectName("horizontalLayout")
        spacerItem7 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem7)
        self.verticalLayout_7 = QtWidgets.QVBoxLayout()
        self.verticalLayout_7.setContentsMargins(0, -1, -1, -1)
        self.verticalLayout_7.setObjectName("verticalLayout_7")
        self.btPreferences = QtWidgets.QPushButton(self.widgetHome)
        self.btPreferences.setMinimumSize(QtCore.QSize(200, 0))
        self.btPreferences.setObjectName("btPreferences")
        self.verticalLayout_7.addWidget(self.btPreferences)
        self.btAbout = QtWidgets.QPushButton(self.widgetHome)
        self.btAbout.setMinimumSize(QtCore.QSize(200, 0))
        self.btAbout.setObjectName("btAbout")
        self.verticalLayout_7.addWidget(self.btAbout)
        self.horizontalLayout.addLayout(self.verticalLayout_7)
        spacerItem8 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem8)
        self.verticalLayout_2.addLayout(self.horizontalLayout)
        spacerItem9 = QtWidgets.QSpacerItem(20, 1, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout_2.addItem(spacerItem9)
        self.verticalLayout_5.addWidget(self.widgetHome)
        self.stackedWidget.addWidget(self.pageHome)
        self.page_2 = QtWidgets.QWidget()
        self.page_2.setObjectName("page_2")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.page_2)
        self.gridLayout_2.setContentsMargins(3, 3, 3, 3)
        self.gridLayout_2.setHorizontalSpacing(3)
        self.gridLayout_2.setVerticalSpacing(0)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.tabWidgetEditors = TabWidget(self.page_2)
        self.tabWidgetEditors.setOrientation(QtCore.Qt.Horizontal)
        self.tabWidgetEditors.setObjectName("tabWidgetEditors")
        self.gridLayout_2.addWidget(self.tabWidgetEditors, 0, 0, 1, 1)
        self.stackedWidget.addWidget(self.page_2)
        self.gridLayout.addWidget(self.stackedWidget, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.toolBarFile = QtWidgets.QToolBar(MainWindow)
        self.toolBarFile.setObjectName("toolBarFile")
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBarFile)
        self.toolBarCOBOL = QtWidgets.QToolBar(MainWindow)
        self.toolBarCOBOL.setObjectName("toolBarCOBOL")
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBarCOBOL)
        self.dockWidgetLogs = QtWidgets.QDockWidget(MainWindow)
        self.dockWidgetLogs.setObjectName("dockWidgetLogs")
        self.dockWidgetContents = QtWidgets.QWidget()
        self.dockWidgetContents.setObjectName("dockWidgetContents")
        self.gridLayout_3 = QtWidgets.QGridLayout(self.dockWidgetContents)
        self.gridLayout_3.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_3.setSpacing(0)
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.tabWidgetLogs = QtWidgets.QTabWidget(self.dockWidgetContents)
        self.tabWidgetLogs.setObjectName("tabWidgetLogs")
        self.tabCompiler = QtWidgets.QWidget()
        self.tabCompiler.setObjectName("tabCompiler")
        self.gridLayout_6 = QtWidgets.QGridLayout(self.tabCompiler)
        self.gridLayout_6.setObjectName("gridLayout_6")
        self.textEditCompilerOutput = QtWidgets.QTextEdit(self.tabCompiler)
        self.textEditCompilerOutput.setReadOnly(True)
        self.textEditCompilerOutput.setObjectName("textEditCompilerOutput")
        self.gridLayout_6.addWidget(self.textEditCompilerOutput, 0, 0, 1, 1)
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap(":/ide-icons/rc/silex-32x32.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.tabWidgetLogs.addTab(self.tabCompiler, icon1, "")
        self.tabCompiler1 = QtWidgets.QWidget()
        self.tabCompiler1.setObjectName("tabCompiler1")
        self.gridLayout_4 = QtWidgets.QGridLayout(self.tabCompiler1)
        self.gridLayout_4.setContentsMargins(6, 6, 6, 6)
        self.gridLayout_4.setObjectName("gridLayout_4")
        self.errorsTable = ErrorsTable(self.tabCompiler1)
        self.errorsTable.setMinimumSize(QtCore.QSize(0, 0))
        self.errorsTable.setObjectName("errorsTable")
        self.errorsTable.setColumnCount(5)
        self.errorsTable.setRowCount(0)
        self.gridLayout_4.addWidget(self.errorsTable, 0, 0, 1, 1)
        icon = QtGui.QIcon.fromTheme("emblem-important")
        self.tabWidgetLogs.addTab(self.tabCompiler1, icon, "")
        self.tabProgramOutput = QtWidgets.QWidget()
        self.tabProgramOutput.setObjectName("tabProgramOutput")
        self.gridLayout_5 = QtWidgets.QGridLayout(self.tabProgramOutput)
        self.gridLayout_5.setContentsMargins(6, 6, 6, 6)
        self.gridLayout_5.setSpacing(6)
        self.gridLayout_5.setObjectName("gridLayout_5")
        self.consoleOutput = MyOutputWindow(self.tabProgramOutput)
        self.consoleOutput.setObjectName("consoleOutput")
        self.gridLayout_5.addWidget(self.consoleOutput, 0, 0, 1, 1)
        icon = QtGui.QIcon.fromTheme("media-playback-start")
        self.tabWidgetLogs.addTab(self.tabProgramOutput, icon, "")
        self.gridLayout_3.addWidget(self.tabWidgetLogs, 1, 0, 1, 1)
        self.dockWidgetLogs.setWidget(self.dockWidgetContents)
        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(8), self.dockWidgetLogs)
        self.menuBar = QtWidgets.QMenuBar(MainWindow)
        self.menuBar.setGeometry(QtCore.QRect(0, 0, 1366, 21))
        self.menuBar.setObjectName("menuBar")
        self.menuFile = QtWidgets.QMenu(self.menuBar)
        self.menuFile.setObjectName("menuFile")
        self.menuEdit = QtWidgets.QMenu(self.menuBar)
        self.menuEdit.setObjectName("menuEdit")
        self.mnuActiveEditor = QtWidgets.QMenu(self.menuEdit)
        icon = QtGui.QIcon.fromTheme("accessories-text-editor")
        self.mnuActiveEditor.setIcon(icon)
        self.mnuActiveEditor.setObjectName("mnuActiveEditor")
        self.menuView = QtWidgets.QMenu(self.menuBar)
        self.menuView.setObjectName("menuView")
        self.menuWindows = QtWidgets.QMenu(self.menuView)
        icon = QtGui.QIcon.fromTheme("window")
        self.menuWindows.setIcon(icon)
        self.menuWindows.setObjectName("menuWindows")
        self.menuCobol = QtWidgets.QMenu(self.menuBar)
        self.menuCobol.setObjectName("menuCobol")
        self.menuProgramType = QtWidgets.QMenu(self.menuCobol)
        self.menuProgramType.setObjectName("menuProgramType")
        self.menu = QtWidgets.QMenu(self.menuBar)
        self.menu.setObjectName("menu")
        MainWindow.setMenuBar(self.menuBar)
        self.dockWidgetNavPanel = QtWidgets.QDockWidget(MainWindow)
        self.dockWidgetNavPanel.setMinimumSize(QtCore.QSize(102, 168))
        self.dockWidgetNavPanel.setFeatures(QtWidgets.QDockWidget.AllDockWidgetFeatures)
        self.dockWidgetNavPanel.setObjectName("dockWidgetNavPanel")
        self.dockWidgetContents_2 = QtWidgets.QWidget()
        self.dockWidgetContents_2.setObjectName("dockWidgetContents_2")
        self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.dockWidgetContents_2)
        self.verticalLayout_6.setContentsMargins(3, 3, 3, 3)
        self.verticalLayout_6.setSpacing(3)
        self.verticalLayout_6.setObjectName("verticalLayout_6")
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setContentsMargins(-1, 0, -1, -1)
        self.horizontalLayout_4.setSpacing(0)
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        spacerItem10 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_4.addItem(spacerItem10)
        self.btNavLock = QtWidgets.QToolButton(self.dockWidgetContents_2)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.btNavLock.sizePolicy().hasHeightForWidth())
        self.btNavLock.setSizePolicy(sizePolicy)
        self.btNavLock.setText("")
        icon = QtGui.QIcon.fromTheme("system-lock-screen")
        self.btNavLock.setIcon(icon)
        self.btNavLock.setIconSize(QtCore.QSize(16, 16))
        self.btNavLock.setCheckable(True)
        self.btNavLock.setChecked(False)
        self.btNavLock.setObjectName("btNavLock")
        self.horizontalLayout_4.addWidget(self.btNavLock)
        self.verticalLayout_6.addLayout(self.horizontalLayout_4)
        self.twNavigation = OutlineTreeWidget(self.dockWidgetContents_2)
        self.twNavigation.setObjectName("twNavigation")
        self.twNavigation.headerItem().setText(0, "1")
        self.twNavigation.header().setVisible(False)
        self.verticalLayout_6.addWidget(self.twNavigation)
        self.dockWidgetNavPanel.setWidget(self.dockWidgetContents_2)
        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.dockWidgetNavPanel)
        self.dockWidgetOffsets = QtWidgets.QDockWidget(MainWindow)
        self.dockWidgetOffsets.setMinimumSize(QtCore.QSize(310, 114))
        self.dockWidgetOffsets.setObjectName("dockWidgetOffsets")
        self.dockWidgetContents_3 = QtWidgets.QWidget()
        self.dockWidgetContents_3.setObjectName("dockWidgetContents_3")
        self.gridLayout_8 = QtWidgets.QGridLayout(self.dockWidgetContents_3)
        self.gridLayout_8.setContentsMargins(3, 3, 3, 3)
        self.gridLayout_8.setSpacing(3)
        self.gridLayout_8.setObjectName("gridLayout_8")
        self.tableWidgetOffsets = PicOffsetsTable(self.dockWidgetContents_3)
        self.tableWidgetOffsets.setMinimumSize(QtCore.QSize(300, 0))
        self.tableWidgetOffsets.setDragDropOverwriteMode(False)
        self.tableWidgetOffsets.setShowGrid(True)
        self.tableWidgetOffsets.setObjectName("tableWidgetOffsets")
        self.tableWidgetOffsets.setColumnCount(4)
        self.tableWidgetOffsets.setRowCount(0)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidgetOffsets.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidgetOffsets.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidgetOffsets.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidgetOffsets.setHorizontalHeaderItem(3, item)
        self.tableWidgetOffsets.horizontalHeader().setDefaultSectionSize(50)
        self.tableWidgetOffsets.horizontalHeader().setSortIndicatorShown(True)
        self.tableWidgetOffsets.horizontalHeader().setStretchLastSection(True)
        self.tableWidgetOffsets.verticalHeader().setVisible(False)
        self.gridLayout_8.addWidget(self.tableWidgetOffsets, 0, 0, 1, 1)
        self.dockWidgetOffsets.setWidget(self.dockWidgetContents_3)
        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.dockWidgetOffsets)
        self.dockWidgetFileSystem = QtWidgets.QDockWidget(MainWindow)
        self.dockWidgetFileSystem.setMinimumSize(QtCore.QSize(96, 151))
        self.dockWidgetFileSystem.setObjectName("dockWidgetFileSystem")
        self.dockWidgetContents_4 = QtWidgets.QWidget()
        self.dockWidgetContents_4.setObjectName("dockWidgetContents_4")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.dockWidgetContents_4)
        self.verticalLayout.setContentsMargins(3, 3, 3, 3)
        self.verticalLayout.setSpacing(3)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setContentsMargins(-1, 0, -1, -1)
        self.horizontalLayout_2.setSpacing(6)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        spacerItem11 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem11)
        self.bt_fs_up = QtWidgets.QToolButton(self.dockWidgetContents_4)
        icon = QtGui.QIcon.fromTheme("go-up")
        self.bt_fs_up.setIcon(icon)
        self.bt_fs_up.setObjectName("bt_fs_up")
        self.horizontalLayout_2.addWidget(self.bt_fs_up)
        self.btFSLock = QtWidgets.QToolButton(self.dockWidgetContents_4)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.btFSLock.sizePolicy().hasHeightForWidth())
        self.btFSLock.setSizePolicy(sizePolicy)
        self.btFSLock.setText("")
        icon = QtGui.QIcon.fromTheme("system-lock-screen")
        self.btFSLock.setIcon(icon)
        self.btFSLock.setIconSize(QtCore.QSize(16, 16))
        self.btFSLock.setCheckable(True)
        self.btFSLock.setChecked(False)
        self.btFSLock.setObjectName("btFSLock")
        self.horizontalLayout_2.addWidget(self.btFSLock)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.tvFileSystem = FileSystemTreeView(self.dockWidgetContents_4)
        self.tvFileSystem.setObjectName("tvFileSystem")
        self.verticalLayout.addWidget(self.tvFileSystem)
        self.dockWidgetFileSystem.setWidget(self.dockWidgetContents_4)
        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.dockWidgetFileSystem)
        self.actionQuit = QtWidgets.QAction(MainWindow)
        self.actionQuit.setIconVisibleInMenu(True)
        self.actionQuit.setObjectName("actionQuit")
        self.actionRun = QtWidgets.QAction(MainWindow)
        self.actionRun.setIconVisibleInMenu(True)
        self.actionRun.setObjectName("actionRun")
        self.actionAbout = QtWidgets.QAction(MainWindow)
        self.actionAbout.setIconVisibleInMenu(True)
        self.actionAbout.setObjectName("actionAbout")
        self.actionSave = QtWidgets.QAction(MainWindow)
        self.actionSave.setIconVisibleInMenu(True)
        self.actionSave.setObjectName("actionSave")
        self.actionSaveAs = QtWidgets.QAction(MainWindow)
        self.actionSaveAs.setIconVisibleInMenu(True)
        self.actionSaveAs.setObjectName("actionSaveAs")
        self.actionFullscreen = QtWidgets.QAction(MainWindow)
        self.actionFullscreen.setCheckable(True)
        self.actionFullscreen.setIconVisibleInMenu(True)
        self.actionFullscreen.setObjectName("actionFullscreen")
        self.actionNew = QtWidgets.QAction(MainWindow)
        self.actionNew.setIconVisibleInMenu(True)
        self.actionNew.setObjectName("actionNew")
        self.actionOpen = QtWidgets.QAction(MainWindow)
        self.actionOpen.setIconVisibleInMenu(True)
        self.actionOpen.setObjectName("actionOpen")
        self.actionClear = QtWidgets.QAction(MainWindow)
        self.actionClear.setIconVisibleInMenu(True)
        self.actionClear.setObjectName("actionClear")
        self.actionPreferences = QtWidgets.QAction(MainWindow)
        self.actionPreferences.setIconVisibleInMenu(True)
        self.actionPreferences.setObjectName("actionPreferences")
        self.actionHelp = QtWidgets.QAction(MainWindow)
        self.actionHelp.setIconVisibleInMenu(True)
        self.actionHelp.setObjectName("actionHelp")
        self.actionProgram = QtWidgets.QAction(MainWindow)
        self.actionProgram.setCheckable(True)
        self.actionProgram.setChecked(True)
        self.actionProgram.setObjectName("actionProgram")
        self.actionSubprogram = QtWidgets.QAction(MainWindow)
        self.actionSubprogram.setCheckable(True)
        self.actionSubprogram.setObjectName("actionSubprogram")
        self.actionCompile = QtWidgets.QAction(MainWindow)
        self.actionCompile.setIconVisibleInMenu(True)
        self.actionCompile.setObjectName("actionCompile")
        self.actionCancel = QtWidgets.QAction(MainWindow)
        self.actionCancel.setObjectName("actionCancel")
        self.actionReport_a_bug = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("tools-report-bug")
        self.actionReport_a_bug.setIcon(icon)
        self.actionReport_a_bug.setObjectName("actionReport_a_bug")
        self.actionRestore_factory_defaults = QtWidgets.QAction(MainWindow)
        self.actionRestore_factory_defaults.setObjectName("actionRestore_factory_defaults")
        self.actionExport_preferences = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("document-export")
        self.actionExport_preferences.setIcon(icon)
        self.actionExport_preferences.setObjectName("actionExport_preferences")
        self.actionImport_preferences = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("document-import")
        self.actionImport_preferences.setIcon(icon)
        self.actionImport_preferences.setObjectName("actionImport_preferences")
        self.actionClean = QtWidgets.QAction(MainWindow)
        self.actionClean.setObjectName("actionClean")
        self.actionRebuild = QtWidgets.QAction(MainWindow)
        self.actionRebuild.setObjectName("actionRebuild")
        self.actionEnableLinter = QtWidgets.QAction(MainWindow)
        self.actionEnableLinter.setCheckable(True)
        self.actionEnableLinter.setChecked(True)
        icon = QtGui.QIcon.fromTheme("dialog-error")
        self.actionEnableLinter.setIcon(icon)
        self.actionEnableLinter.setObjectName("actionEnableLinter")
        self.dockWidgetNavPanel.raise_()
        self.toolBarFile.addAction(self.actionNew)
        self.toolBarFile.addAction(self.actionOpen)
        self.toolBarFile.addSeparator()
        self.toolBarFile.addAction(self.actionSave)
        self.toolBarFile.addAction(self.actionSaveAs)
        self.toolBarCOBOL.addAction(self.actionClean)
        self.toolBarCOBOL.addAction(self.actionRebuild)
        self.toolBarCOBOL.addAction(self.actionRun)
        self.menuFile.addAction(self.actionNew)
        self.menuFile.addAction(self.actionOpen)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionSave)
        self.menuFile.addAction(self.actionSaveAs)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionImport_preferences)
        self.menuFile.addAction(self.actionExport_preferences)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionQuit)
        self.mnuActiveEditor.addSeparator()
        self.menuEdit.addAction(self.mnuActiveEditor.menuAction())
        self.menuEdit.addSeparator()
        self.menuEdit.addAction(self.actionPreferences)
        self.menuView.addAction(self.menuWindows.menuAction())
        self.menuView.addSeparator()
        self.menuView.addAction(self.actionFullscreen)
        self.menuProgramType.addAction(self.actionProgram)
        self.menuProgramType.addAction(self.actionSubprogram)
        self.menuCobol.addAction(self.menuProgramType.menuAction())
        self.menuCobol.addSeparator()
        self.menuCobol.addAction(self.actionCompile)
        self.menuCobol.addAction(self.actionClean)
        self.menuCobol.addAction(self.actionRebuild)
        self.menuCobol.addAction(self.actionRun)
        self.menuCobol.addSeparator()
        self.menuCobol.addAction(self.actionCancel)
        self.menu.addAction(self.actionHelp)
        self.menu.addAction(self.actionAbout)
        self.menu.addSeparator()
        self.menu.addAction(self.actionReport_a_bug)
        self.menu.addSeparator()
        self.menu.addAction(self.actionRestore_factory_defaults)
        self.menuBar.addAction(self.menuFile.menuAction())
        self.menuBar.addAction(self.menuEdit.menuAction())
        self.menuBar.addAction(self.menuView.menuAction())
        self.menuBar.addAction(self.menuCobol.menuAction())
        self.menuBar.addAction(self.menu.menuAction())

        self.retranslateUi(MainWindow)
        self.stackedWidget.setCurrentIndex(1)
        self.tabWidgetLogs.setCurrentIndex(2)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
Beispiel #7
0
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1366, 768)
        MainWindow.setMinimumSize(QtCore.QSize(0, 0))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/ide-icons/rc/silex-192x192.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setSpacing(0)
        self.gridLayout.setObjectName("gridLayout")
        self.stackedWidget = QtWidgets.QStackedWidget(self.centralwidget)
        self.stackedWidget.setObjectName("stackedWidget")
        self.pageHome = QtWidgets.QWidget()
        self.pageHome.setObjectName("pageHome")
        self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.pageHome)
        self.verticalLayout_5.setObjectName("verticalLayout_5")
        self.widgetHome = QtWidgets.QWidget(self.pageHome)
        self.widgetHome.setObjectName("widgetHome")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widgetHome)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        spacerItem = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout_2.addItem(spacerItem)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setContentsMargins(0, -1, 0, -1)
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem1)
        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.label_3 = QtWidgets.QLabel(self.widgetHome)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label_3.sizePolicy().hasHeightForWidth())
        self.label_3.setSizePolicy(sizePolicy)
        self.label_3.setMinimumSize(QtCore.QSize(0, 0))
        self.label_3.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.label_3.setWordWrap(True)
        self.label_3.setObjectName("label_3")
        self.verticalLayout_3.addWidget(self.label_3)
        self.horizontalLayout_3.addLayout(self.verticalLayout_3)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem2)
        self.verticalLayout_2.addLayout(self.horizontalLayout_3)
        self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_8.setContentsMargins(-1, 0, -1, 0)
        self.horizontalLayout_8.setObjectName("horizontalLayout_8")
        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_8.addItem(spacerItem3)
        self.btNewFile = QtWidgets.QPushButton(self.widgetHome)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.btNewFile.sizePolicy().hasHeightForWidth())
        self.btNewFile.setSizePolicy(sizePolicy)
        self.btNewFile.setMinimumSize(QtCore.QSize(200, 0))
        self.btNewFile.setObjectName("btNewFile")
        self.horizontalLayout_8.addWidget(self.btNewFile)
        self.btOpenFile = QtWidgets.QPushButton(self.widgetHome)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.btOpenFile.sizePolicy().hasHeightForWidth())
        self.btOpenFile.setSizePolicy(sizePolicy)
        self.btOpenFile.setMinimumSize(QtCore.QSize(200, 0))
        self.btOpenFile.setStyleSheet("")
        self.btOpenFile.setObjectName("btOpenFile")
        self.horizontalLayout_8.addWidget(self.btOpenFile)
        spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_8.addItem(spacerItem4)
        self.verticalLayout_2.addLayout(self.horizontalLayout_8)
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setContentsMargins(0, -1, -1, -1)
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_5.addItem(spacerItem5)
        self.frameRecents = QtWidgets.QFrame(self.widgetHome)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.frameRecents.sizePolicy().hasHeightForWidth())
        self.frameRecents.setSizePolicy(sizePolicy)
        self.frameRecents.setMinimumSize(QtCore.QSize(406, 0))
        self.frameRecents.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.frameRecents.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frameRecents.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frameRecents.setObjectName("frameRecents")
        self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.frameRecents)
        self.verticalLayout_4.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_4.setSpacing(0)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.labelRecents = QtWidgets.QLabel(self.frameRecents)
        self.labelRecents.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.labelRecents.setObjectName("labelRecents")
        self.verticalLayout_4.addWidget(self.labelRecents)
        self.listWidgetRecents = RecentFilesListWidget(self.frameRecents)
        self.listWidgetRecents.setMinimumSize(QtCore.QSize(400, 0))
        self.listWidgetRecents.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.listWidgetRecents.setObjectName("listWidgetRecents")
        self.verticalLayout_4.addWidget(self.listWidgetRecents)
        self.horizontalLayout_5.addWidget(self.frameRecents)
        spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_5.addItem(spacerItem6)
        self.verticalLayout_2.addLayout(self.horizontalLayout_5)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setContentsMargins(-1, 0, -1, -1)
        self.horizontalLayout.setObjectName("horizontalLayout")
        spacerItem7 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem7)
        self.verticalLayout_7 = QtWidgets.QVBoxLayout()
        self.verticalLayout_7.setContentsMargins(0, -1, -1, -1)
        self.verticalLayout_7.setObjectName("verticalLayout_7")
        self.btPreferences = QtWidgets.QPushButton(self.widgetHome)
        self.btPreferences.setMinimumSize(QtCore.QSize(200, 0))
        self.btPreferences.setObjectName("btPreferences")
        self.verticalLayout_7.addWidget(self.btPreferences)
        self.btAbout = QtWidgets.QPushButton(self.widgetHome)
        self.btAbout.setMinimumSize(QtCore.QSize(200, 0))
        self.btAbout.setObjectName("btAbout")
        self.verticalLayout_7.addWidget(self.btAbout)
        self.horizontalLayout.addLayout(self.verticalLayout_7)
        spacerItem8 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem8)
        self.verticalLayout_2.addLayout(self.horizontalLayout)
        spacerItem9 = QtWidgets.QSpacerItem(20, 1, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout_2.addItem(spacerItem9)
        self.verticalLayout_5.addWidget(self.widgetHome)
        self.stackedWidget.addWidget(self.pageHome)
        self.page_2 = QtWidgets.QWidget()
        self.page_2.setObjectName("page_2")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.page_2)
        self.gridLayout_2.setContentsMargins(3, 3, 3, 3)
        self.gridLayout_2.setHorizontalSpacing(3)
        self.gridLayout_2.setVerticalSpacing(0)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.tabWidgetEditors = TabWidget(self.page_2)
        self.tabWidgetEditors.setOrientation(QtCore.Qt.Horizontal)
        self.tabWidgetEditors.setObjectName("tabWidgetEditors")
        self.gridLayout_2.addWidget(self.tabWidgetEditors, 0, 0, 1, 1)
        self.stackedWidget.addWidget(self.page_2)
        self.gridLayout.addWidget(self.stackedWidget, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.toolBarFile = QtWidgets.QToolBar(MainWindow)
        self.toolBarFile.setObjectName("toolBarFile")
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBarFile)
        self.toolBarCOBOL = QtWidgets.QToolBar(MainWindow)
        self.toolBarCOBOL.setObjectName("toolBarCOBOL")
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBarCOBOL)
        self.dockWidgetLogs = QtWidgets.QDockWidget(MainWindow)
        self.dockWidgetLogs.setObjectName("dockWidgetLogs")
        self.dockWidgetContents = QtWidgets.QWidget()
        self.dockWidgetContents.setObjectName("dockWidgetContents")
        self.gridLayout_3 = QtWidgets.QGridLayout(self.dockWidgetContents)
        self.gridLayout_3.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_3.setSpacing(0)
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.tabWidgetLogs = QtWidgets.QTabWidget(self.dockWidgetContents)
        self.tabWidgetLogs.setObjectName("tabWidgetLogs")
        self.tabCompiler = QtWidgets.QWidget()
        self.tabCompiler.setObjectName("tabCompiler")
        self.gridLayout_6 = QtWidgets.QGridLayout(self.tabCompiler)
        self.gridLayout_6.setObjectName("gridLayout_6")
        self.textEditCompilerOutput = QtWidgets.QTextEdit(self.tabCompiler)
        self.textEditCompilerOutput.setReadOnly(True)
        self.textEditCompilerOutput.setObjectName("textEditCompilerOutput")
        self.gridLayout_6.addWidget(self.textEditCompilerOutput, 0, 0, 1, 1)
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap(":/ide-icons/rc/silex-32x32.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.tabWidgetLogs.addTab(self.tabCompiler, icon1, "")
        self.tabCompiler1 = QtWidgets.QWidget()
        self.tabCompiler1.setObjectName("tabCompiler1")
        self.gridLayout_4 = QtWidgets.QGridLayout(self.tabCompiler1)
        self.gridLayout_4.setContentsMargins(6, 6, 6, 6)
        self.gridLayout_4.setObjectName("gridLayout_4")
        self.errorsTable = ErrorsTable(self.tabCompiler1)
        self.errorsTable.setMinimumSize(QtCore.QSize(0, 0))
        self.errorsTable.setObjectName("errorsTable")
        self.errorsTable.setColumnCount(5)
        self.errorsTable.setRowCount(0)
        self.gridLayout_4.addWidget(self.errorsTable, 0, 0, 1, 1)
        icon = QtGui.QIcon.fromTheme("emblem-important")
        self.tabWidgetLogs.addTab(self.tabCompiler1, icon, "")
        self.tabProgramOutput = QtWidgets.QWidget()
        self.tabProgramOutput.setObjectName("tabProgramOutput")
        self.gridLayout_5 = QtWidgets.QGridLayout(self.tabProgramOutput)
        self.gridLayout_5.setContentsMargins(6, 6, 6, 6)
        self.gridLayout_5.setSpacing(6)
        self.gridLayout_5.setObjectName("gridLayout_5")
        self.consoleOutput = MyOutputWindow(self.tabProgramOutput)
        self.consoleOutput.setObjectName("consoleOutput")
        self.gridLayout_5.addWidget(self.consoleOutput, 0, 0, 1, 1)
        icon = QtGui.QIcon.fromTheme("media-playback-start")
        self.tabWidgetLogs.addTab(self.tabProgramOutput, icon, "")
        self.gridLayout_3.addWidget(self.tabWidgetLogs, 1, 0, 1, 1)
        self.dockWidgetLogs.setWidget(self.dockWidgetContents)
        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(8), self.dockWidgetLogs)
        self.menuBar = QtWidgets.QMenuBar(MainWindow)
        self.menuBar.setGeometry(QtCore.QRect(0, 0, 1366, 21))
        self.menuBar.setObjectName("menuBar")
        self.menuFile = QtWidgets.QMenu(self.menuBar)
        self.menuFile.setObjectName("menuFile")
        self.menuEdit = QtWidgets.QMenu(self.menuBar)
        self.menuEdit.setObjectName("menuEdit")
        self.mnuActiveEditor = QtWidgets.QMenu(self.menuEdit)
        icon = QtGui.QIcon.fromTheme("accessories-text-editor")
        self.mnuActiveEditor.setIcon(icon)
        self.mnuActiveEditor.setObjectName("mnuActiveEditor")
        self.menuView = QtWidgets.QMenu(self.menuBar)
        self.menuView.setObjectName("menuView")
        self.menuWindows = QtWidgets.QMenu(self.menuView)
        icon = QtGui.QIcon.fromTheme("window")
        self.menuWindows.setIcon(icon)
        self.menuWindows.setObjectName("menuWindows")
        self.menuCobol = QtWidgets.QMenu(self.menuBar)
        self.menuCobol.setObjectName("menuCobol")
        self.menuProgramType = QtWidgets.QMenu(self.menuCobol)
        self.menuProgramType.setObjectName("menuProgramType")
        self.menu = QtWidgets.QMenu(self.menuBar)
        self.menu.setObjectName("menu")
        MainWindow.setMenuBar(self.menuBar)
        self.dockWidgetNavPanel = QtWidgets.QDockWidget(MainWindow)
        self.dockWidgetNavPanel.setMinimumSize(QtCore.QSize(102, 168))
        self.dockWidgetNavPanel.setFeatures(QtWidgets.QDockWidget.AllDockWidgetFeatures)
        self.dockWidgetNavPanel.setObjectName("dockWidgetNavPanel")
        self.dockWidgetContents_2 = QtWidgets.QWidget()
        self.dockWidgetContents_2.setObjectName("dockWidgetContents_2")
        self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.dockWidgetContents_2)
        self.verticalLayout_6.setContentsMargins(3, 3, 3, 3)
        self.verticalLayout_6.setSpacing(3)
        self.verticalLayout_6.setObjectName("verticalLayout_6")
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setContentsMargins(-1, 0, -1, -1)
        self.horizontalLayout_4.setSpacing(0)
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        spacerItem10 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_4.addItem(spacerItem10)
        self.btNavLock = QtWidgets.QToolButton(self.dockWidgetContents_2)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.btNavLock.sizePolicy().hasHeightForWidth())
        self.btNavLock.setSizePolicy(sizePolicy)
        self.btNavLock.setText("")
        icon = QtGui.QIcon.fromTheme("system-lock-screen")
        self.btNavLock.setIcon(icon)
        self.btNavLock.setIconSize(QtCore.QSize(16, 16))
        self.btNavLock.setCheckable(True)
        self.btNavLock.setChecked(False)
        self.btNavLock.setObjectName("btNavLock")
        self.horizontalLayout_4.addWidget(self.btNavLock)
        self.verticalLayout_6.addLayout(self.horizontalLayout_4)
        self.twNavigation = OutlineTreeWidget(self.dockWidgetContents_2)
        self.twNavigation.setObjectName("twNavigation")
        self.twNavigation.headerItem().setText(0, "1")
        self.twNavigation.header().setVisible(False)
        self.verticalLayout_6.addWidget(self.twNavigation)
        self.dockWidgetNavPanel.setWidget(self.dockWidgetContents_2)
        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.dockWidgetNavPanel)
        self.dockWidgetOffsets = QtWidgets.QDockWidget(MainWindow)
        self.dockWidgetOffsets.setMinimumSize(QtCore.QSize(310, 114))
        self.dockWidgetOffsets.setObjectName("dockWidgetOffsets")
        self.dockWidgetContents_3 = QtWidgets.QWidget()
        self.dockWidgetContents_3.setObjectName("dockWidgetContents_3")
        self.gridLayout_8 = QtWidgets.QGridLayout(self.dockWidgetContents_3)
        self.gridLayout_8.setContentsMargins(3, 3, 3, 3)
        self.gridLayout_8.setSpacing(3)
        self.gridLayout_8.setObjectName("gridLayout_8")
        self.tableWidgetOffsets = PicOffsetsTable(self.dockWidgetContents_3)
        self.tableWidgetOffsets.setMinimumSize(QtCore.QSize(300, 0))
        self.tableWidgetOffsets.setDragDropOverwriteMode(False)
        self.tableWidgetOffsets.setShowGrid(True)
        self.tableWidgetOffsets.setObjectName("tableWidgetOffsets")
        self.tableWidgetOffsets.setColumnCount(4)
        self.tableWidgetOffsets.setRowCount(0)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidgetOffsets.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidgetOffsets.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidgetOffsets.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidgetOffsets.setHorizontalHeaderItem(3, item)
        self.tableWidgetOffsets.horizontalHeader().setDefaultSectionSize(50)
        self.tableWidgetOffsets.horizontalHeader().setSortIndicatorShown(True)
        self.tableWidgetOffsets.horizontalHeader().setStretchLastSection(True)
        self.tableWidgetOffsets.verticalHeader().setVisible(False)
        self.gridLayout_8.addWidget(self.tableWidgetOffsets, 0, 0, 1, 1)
        self.dockWidgetOffsets.setWidget(self.dockWidgetContents_3)
        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.dockWidgetOffsets)
        self.dockWidgetFileSystem = QtWidgets.QDockWidget(MainWindow)
        self.dockWidgetFileSystem.setMinimumSize(QtCore.QSize(96, 151))
        self.dockWidgetFileSystem.setObjectName("dockWidgetFileSystem")
        self.dockWidgetContents_4 = QtWidgets.QWidget()
        self.dockWidgetContents_4.setObjectName("dockWidgetContents_4")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.dockWidgetContents_4)
        self.verticalLayout.setContentsMargins(3, 3, 3, 3)
        self.verticalLayout.setSpacing(3)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setContentsMargins(-1, 0, -1, -1)
        self.horizontalLayout_2.setSpacing(6)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        spacerItem11 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem11)
        self.bt_fs_up = QtWidgets.QToolButton(self.dockWidgetContents_4)
        icon = QtGui.QIcon.fromTheme("go-up")
        self.bt_fs_up.setIcon(icon)
        self.bt_fs_up.setObjectName("bt_fs_up")
        self.horizontalLayout_2.addWidget(self.bt_fs_up)
        self.btFSLock = QtWidgets.QToolButton(self.dockWidgetContents_4)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.btFSLock.sizePolicy().hasHeightForWidth())
        self.btFSLock.setSizePolicy(sizePolicy)
        self.btFSLock.setText("")
        icon = QtGui.QIcon.fromTheme("system-lock-screen")
        self.btFSLock.setIcon(icon)
        self.btFSLock.setIconSize(QtCore.QSize(16, 16))
        self.btFSLock.setCheckable(True)
        self.btFSLock.setChecked(False)
        self.btFSLock.setObjectName("btFSLock")
        self.horizontalLayout_2.addWidget(self.btFSLock)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.tvFileSystem = FileSystemTreeView(self.dockWidgetContents_4)
        self.tvFileSystem.setObjectName("tvFileSystem")
        self.verticalLayout.addWidget(self.tvFileSystem)
        self.dockWidgetFileSystem.setWidget(self.dockWidgetContents_4)
        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.dockWidgetFileSystem)
        self.actionQuit = QtWidgets.QAction(MainWindow)
        self.actionQuit.setIconVisibleInMenu(True)
        self.actionQuit.setObjectName("actionQuit")
        self.actionRun = QtWidgets.QAction(MainWindow)
        self.actionRun.setIconVisibleInMenu(True)
        self.actionRun.setObjectName("actionRun")
        self.actionAbout = QtWidgets.QAction(MainWindow)
        self.actionAbout.setIconVisibleInMenu(True)
        self.actionAbout.setObjectName("actionAbout")
        self.actionSave = QtWidgets.QAction(MainWindow)
        self.actionSave.setIconVisibleInMenu(True)
        self.actionSave.setObjectName("actionSave")
        self.actionSaveAs = QtWidgets.QAction(MainWindow)
        self.actionSaveAs.setIconVisibleInMenu(True)
        self.actionSaveAs.setObjectName("actionSaveAs")
        self.actionFullscreen = QtWidgets.QAction(MainWindow)
        self.actionFullscreen.setCheckable(True)
        self.actionFullscreen.setIconVisibleInMenu(True)
        self.actionFullscreen.setObjectName("actionFullscreen")
        self.actionNew = QtWidgets.QAction(MainWindow)
        self.actionNew.setIconVisibleInMenu(True)
        self.actionNew.setObjectName("actionNew")
        self.actionOpen = QtWidgets.QAction(MainWindow)
        self.actionOpen.setIconVisibleInMenu(True)
        self.actionOpen.setObjectName("actionOpen")
        self.actionClear = QtWidgets.QAction(MainWindow)
        self.actionClear.setIconVisibleInMenu(True)
        self.actionClear.setObjectName("actionClear")
        self.actionPreferences = QtWidgets.QAction(MainWindow)
        self.actionPreferences.setIconVisibleInMenu(True)
        self.actionPreferences.setObjectName("actionPreferences")
        self.actionHelp = QtWidgets.QAction(MainWindow)
        self.actionHelp.setIconVisibleInMenu(True)
        self.actionHelp.setObjectName("actionHelp")
        self.actionProgram = QtWidgets.QAction(MainWindow)
        self.actionProgram.setCheckable(True)
        self.actionProgram.setChecked(True)
        self.actionProgram.setObjectName("actionProgram")
        self.actionSubprogram = QtWidgets.QAction(MainWindow)
        self.actionSubprogram.setCheckable(True)
        self.actionSubprogram.setObjectName("actionSubprogram")
        self.actionCompile = QtWidgets.QAction(MainWindow)
        self.actionCompile.setIconVisibleInMenu(True)
        self.actionCompile.setObjectName("actionCompile")
        self.actionCancel = QtWidgets.QAction(MainWindow)
        self.actionCancel.setObjectName("actionCancel")
        self.actionReport_a_bug = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("tools-report-bug")
        self.actionReport_a_bug.setIcon(icon)
        self.actionReport_a_bug.setObjectName("actionReport_a_bug")
        self.actionRestore_factory_defaults = QtWidgets.QAction(MainWindow)
        self.actionRestore_factory_defaults.setObjectName("actionRestore_factory_defaults")
        self.actionExport_preferences = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("document-export")
        self.actionExport_preferences.setIcon(icon)
        self.actionExport_preferences.setObjectName("actionExport_preferences")
        self.actionImport_preferences = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("document-import")
        self.actionImport_preferences.setIcon(icon)
        self.actionImport_preferences.setObjectName("actionImport_preferences")
        self.actionClean = QtWidgets.QAction(MainWindow)
        self.actionClean.setObjectName("actionClean")
        self.actionRebuild = QtWidgets.QAction(MainWindow)
        self.actionRebuild.setObjectName("actionRebuild")
        self.actionEnableLinter = QtWidgets.QAction(MainWindow)
        self.actionEnableLinter.setCheckable(True)
        self.actionEnableLinter.setChecked(True)
        icon = QtGui.QIcon.fromTheme("dialog-error")
        self.actionEnableLinter.setIcon(icon)
        self.actionEnableLinter.setObjectName("actionEnableLinter")
        self.dockWidgetNavPanel.raise_()
        self.toolBarFile.addAction(self.actionNew)
        self.toolBarFile.addAction(self.actionOpen)
        self.toolBarFile.addSeparator()
        self.toolBarFile.addAction(self.actionSave)
        self.toolBarFile.addAction(self.actionSaveAs)
        self.toolBarCOBOL.addAction(self.actionClean)
        self.toolBarCOBOL.addAction(self.actionRebuild)
        self.toolBarCOBOL.addAction(self.actionRun)
        self.menuFile.addAction(self.actionNew)
        self.menuFile.addAction(self.actionOpen)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionSave)
        self.menuFile.addAction(self.actionSaveAs)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionImport_preferences)
        self.menuFile.addAction(self.actionExport_preferences)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionQuit)
        self.mnuActiveEditor.addSeparator()
        self.menuEdit.addAction(self.mnuActiveEditor.menuAction())
        self.menuEdit.addSeparator()
        self.menuEdit.addAction(self.actionPreferences)
        self.menuView.addAction(self.menuWindows.menuAction())
        self.menuView.addSeparator()
        self.menuView.addAction(self.actionFullscreen)
        self.menuProgramType.addAction(self.actionProgram)
        self.menuProgramType.addAction(self.actionSubprogram)
        self.menuCobol.addAction(self.menuProgramType.menuAction())
        self.menuCobol.addSeparator()
        self.menuCobol.addAction(self.actionCompile)
        self.menuCobol.addAction(self.actionClean)
        self.menuCobol.addAction(self.actionRebuild)
        self.menuCobol.addAction(self.actionRun)
        self.menuCobol.addSeparator()
        self.menuCobol.addAction(self.actionCancel)
        self.menu.addAction(self.actionHelp)
        self.menu.addAction(self.actionAbout)
        self.menu.addSeparator()
        self.menu.addAction(self.actionReport_a_bug)
        self.menu.addSeparator()
        self.menu.addAction(self.actionRestore_factory_defaults)
        self.menuBar.addAction(self.menuFile.menuAction())
        self.menuBar.addAction(self.menuEdit.menuAction())
        self.menuBar.addAction(self.menuView.menuAction())
        self.menuBar.addAction(self.menuCobol.menuAction())
        self.menuBar.addAction(self.menu.menuAction())

        self.retranslateUi(MainWindow)
        self.stackedWidget.setCurrentIndex(1)
        self.tabWidgetLogs.setCurrentIndex(2)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "OpenCobolIDE"))
        self.label_3.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\"><img src=\":/ide-icons/rc/silex-192x192.png\"/></p><p align=\"center\"><span style=\" font-size:20pt;\">Welcome to OpenCobolIDE</span></p><p align=\"center\">Click on <span style=\" font-weight:600; font-style:italic;\">New </span>or <span style=\" font-weight:600; font-style:italic;\">Open </span>to get started!</p></body></html>"))
        self.btNewFile.setToolTip(_translate("MainWindow", "Create a new file"))
        self.btNewFile.setStatusTip(_translate("MainWindow", "Create a new file"))
        self.btNewFile.setText(_translate("MainWindow", "New file"))
        self.btOpenFile.setText(_translate("MainWindow", "Open file"))
        self.labelRecents.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\"><span style=\" font-weight:600; font-style:italic;\">Recent files</span></p></body></html>"))
        self.listWidgetRecents.setToolTip(_translate("MainWindow", "Recent files"))
        self.listWidgetRecents.setStatusTip(_translate("MainWindow", "Recent files"))
        self.btPreferences.setText(_translate("MainWindow", "Preferences"))
        self.btAbout.setText(_translate("MainWindow", "About"))
        self.toolBarFile.setWindowTitle(_translate("MainWindow", "File toolbar"))
        self.toolBarCOBOL.setWindowTitle(_translate("MainWindow", "COBOL toolbar"))
        self.dockWidgetLogs.setWindowTitle(_translate("MainWindow", "&Logs"))
        self.tabWidgetLogs.setTabText(self.tabWidgetLogs.indexOf(self.tabCompiler), _translate("MainWindow", "Compiler"))
        self.errorsTable.setStatusTip(_translate("MainWindow", "The list of errors found in your program"))
        self.tabWidgetLogs.setTabText(self.tabWidgetLogs.indexOf(self.tabCompiler1), _translate("MainWindow", "Issues"))
        self.tabWidgetLogs.setTabToolTip(self.tabWidgetLogs.indexOf(self.tabCompiler1), _translate("MainWindow", "Show compiler log"))
        self.consoleOutput.setToolTip(_translate("MainWindow", "Program output"))
        self.consoleOutput.setStatusTip(_translate("MainWindow", "Program output"))
        self.tabWidgetLogs.setTabText(self.tabWidgetLogs.indexOf(self.tabProgramOutput), _translate("MainWindow", "Output"))
        self.menuFile.setTitle(_translate("MainWindow", "F&ile"))
        self.menuEdit.setTitle(_translate("MainWindow", "&Edit"))
        self.mnuActiveEditor.setToolTip(_translate("MainWindow", "Active editor context menu"))
        self.mnuActiveEditor.setStatusTip(_translate("MainWindow", "Active editor context menu"))
        self.mnuActiveEditor.setTitle(_translate("MainWindow", "&Active editor"))
        self.menuView.setTitle(_translate("MainWindow", "&View"))
        self.menuWindows.setTitle(_translate("MainWindow", "&Windows"))
        self.menuCobol.setTitle(_translate("MainWindow", "&COBOL"))
        self.menuProgramType.setTitle(_translate("MainWindow", "&Program type"))
        self.menu.setTitle(_translate("MainWindow", "&?"))
        self.dockWidgetNavPanel.setWindowTitle(_translate("MainWindow", "&Navigation"))
        self.btNavLock.setToolTip(_translate("MainWindow", "<html><head/><body><p>Lock/Unlock navigation panel </p><p>If unlocked, the selected item will be syncronised with the cursor position.</p></body></html>"))
        self.twNavigation.setToolTip(_translate("MainWindow", "Show the current editor structure"))
        self.twNavigation.setStatusTip(_translate("MainWindow", "Show the current editor structure"))
        self.dockWidgetOffsets.setWindowTitle(_translate("MainWindow", "Offset calc&ulator"))
        self.tableWidgetOffsets.setToolTip(_translate("MainWindow", "Show PIC fields offsets"))
        self.tableWidgetOffsets.setStatusTip(_translate("MainWindow", "Show PIC fields offsets"))
        self.tableWidgetOffsets.setSortingEnabled(True)
        item = self.tableWidgetOffsets.horizontalHeaderItem(0)
        item.setText(_translate("MainWindow", "Level"))
        item = self.tableWidgetOffsets.horizontalHeaderItem(1)
        item.setText(_translate("MainWindow", "Name"))
        item = self.tableWidgetOffsets.horizontalHeaderItem(2)
        item.setText(_translate("MainWindow", "Offset"))
        item = self.tableWidgetOffsets.horizontalHeaderItem(3)
        item.setText(_translate("MainWindow", "PIC"))
        self.dockWidgetFileSystem.setWindowTitle(_translate("MainWindow", "File s&ystem"))
        self.bt_fs_up.setToolTip(_translate("MainWindow", "Go up"))
        self.bt_fs_up.setText(_translate("MainWindow", "..."))
        self.btFSLock.setToolTip(_translate("MainWindow", "<html><head/><body><p><span style=\" font-weight:600;\">Lock</span> current file path to prevent the view from changing when the current editor changes.</p></body></html>"))
        self.actionQuit.setText(_translate("MainWindow", "&Quit"))
        self.actionQuit.setToolTip(_translate("MainWindow", "Exit application"))
        self.actionQuit.setStatusTip(_translate("MainWindow", "Exit application"))
        self.actionQuit.setShortcut(_translate("MainWindow", "Ctrl+Q"))
        self.actionRun.setText(_translate("MainWindow", "&Run"))
        self.actionRun.setToolTip(_translate("MainWindow", "Run the current editor program"))
        self.actionRun.setStatusTip(_translate("MainWindow", "Run the current editor program"))
        self.actionRun.setShortcut(_translate("MainWindow", "F5"))
        self.actionAbout.setText(_translate("MainWindow", "&About OpenCobolIDE"))
        self.actionAbout.setToolTip(_translate("MainWindow", "About OpenCobolIDE"))
        self.actionAbout.setStatusTip(_translate("MainWindow", "About OpenCobolIDE"))
        self.actionSave.setText(_translate("MainWindow", "&Save"))
        self.actionSave.setToolTip(_translate("MainWindow", "Save the current editor"))
        self.actionSave.setStatusTip(_translate("MainWindow", "Save the current editor"))
        self.actionSave.setShortcut(_translate("MainWindow", "Ctrl+S"))
        self.actionSaveAs.setText(_translate("MainWindow", "Sa&ve as"))
        self.actionSaveAs.setToolTip(_translate("MainWindow", "Save the current editor as"))
        self.actionSaveAs.setStatusTip(_translate("MainWindow", "Save the current editor as"))
        self.actionSaveAs.setShortcut(_translate("MainWindow", "Ctrl+Shift+S"))
        self.actionFullscreen.setText(_translate("MainWindow", "&Fullscreen"))
        self.actionFullscreen.setToolTip(_translate("MainWindow", "Toggle fullscreen"))
        self.actionFullscreen.setStatusTip(_translate("MainWindow", "Toggle fullscreen"))
        self.actionFullscreen.setShortcut(_translate("MainWindow", "F11"))
        self.actionNew.setText(_translate("MainWindow", "&New"))
        self.actionNew.setToolTip(_translate("MainWindow", "New file"))
        self.actionNew.setStatusTip(_translate("MainWindow", "Create a new file"))
        self.actionNew.setShortcut(_translate("MainWindow", "Ctrl+N"))
        self.actionOpen.setText(_translate("MainWindow", "&Open"))
        self.actionOpen.setToolTip(_translate("MainWindow", "Open a file"))
        self.actionOpen.setStatusTip(_translate("MainWindow", "Open a file"))
        self.actionOpen.setShortcut(_translate("MainWindow", "Ctrl+O"))
        self.actionClear.setText(_translate("MainWindow", "Clear list"))
        self.actionClear.setToolTip(_translate("MainWindow", "Clear list of recent files"))
        self.actionPreferences.setText(_translate("MainWindow", "&Preferences"))
        self.actionPreferences.setToolTip(_translate("MainWindow", "Edit the application settings"))
        self.actionPreferences.setStatusTip(_translate("MainWindow", "Edit the application settings"))
        self.actionHelp.setText(_translate("MainWindow", "&Help"))
        self.actionHelp.setToolTip(_translate("MainWindow", "Show help content"))
        self.actionHelp.setStatusTip(_translate("MainWindow", "Show help content"))
        self.actionHelp.setShortcut(_translate("MainWindow", "F1"))
        self.actionProgram.setText(_translate("MainWindow", "&Executable"))
        self.actionProgram.setToolTip(_translate("MainWindow", "Make an executable program (*.exe)"))
        self.actionProgram.setStatusTip(_translate("MainWindow", "Make an executable program (*.exe)"))
        self.actionSubprogram.setText(_translate("MainWindow", "&Module"))
        self.actionSubprogram.setToolTip(_translate("MainWindow", "Make a module program (*.dll)"))
        self.actionSubprogram.setStatusTip(_translate("MainWindow", "Make a module program (*.dll)"))
        self.actionCompile.setText(_translate("MainWindow", "&Compile"))
        self.actionCompile.setToolTip(_translate("MainWindow", "Compile the current editor"))
        self.actionCompile.setStatusTip(_translate("MainWindow", "Compile the current editor"))
        self.actionCompile.setShortcut(_translate("MainWindow", "F8"))
        self.actionCancel.setText(_translate("MainWindow", "Ca&ncel"))
        self.actionCancel.setToolTip(_translate("MainWindow", "Cancel the current operation (compile or run)"))
        self.actionCancel.setStatusTip(_translate("MainWindow", "Cancel the current operation (compile or run)"))
        self.actionReport_a_bug.setText(_translate("MainWindow", "&Report an issue..."))
        self.actionReport_a_bug.setToolTip(_translate("MainWindow", "Create an issue (report a bug/suggest an enhancement)"))
        self.actionRestore_factory_defaults.setText(_translate("MainWindow", "Restore &factory defaults"))
        self.actionExport_preferences.setText(_translate("MainWindow", "&Export preferences"))
        self.actionImport_preferences.setText(_translate("MainWindow", "&Import preferences"))
        self.actionClean.setText(_translate("MainWindow", "C&lean"))
        self.actionClean.setShortcut(_translate("MainWindow", "Ctrl+Alt+C"))
        self.actionRebuild.setText(_translate("MainWindow", "R&ebuild"))
        self.actionRebuild.setShortcut(_translate("MainWindow", "Shift+F8"))
        self.actionEnableLinter.setText(_translate("MainWindow", "Enable linter"))
        self.actionEnableLinter.setToolTip(_translate("MainWindow", "Enable/disable linter (background check)\n"
""))
        self.actionEnableLinter.setShortcut(_translate("MainWindow", "Ctrl+Shift+L"))
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/icons/pyqode.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.tabWidget = SplittableCodeEditTabWidget(self.centralwidget)
        self.tabWidget.setOrientation(QtCore.Qt.Horizontal)
        self.tabWidget.setObjectName("tabWidget")
        self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        self.menubar.setObjectName("menubar")
        self.menuFile = QtWidgets.QMenu(self.menubar)
        self.menuFile.setObjectName("menuFile")
        self.menuEdit = QtWidgets.QMenu(self.menubar)
        self.menuEdit.setObjectName("menuEdit")
        self.menuModes = QtWidgets.QMenu(self.menubar)
        self.menuModes.setObjectName("menuModes")
        self.menuPanels = QtWidgets.QMenu(self.menubar)
        self.menuPanels.setObjectName("menuPanels")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.toolBar = QtWidgets.QToolBar(MainWindow)
        self.toolBar.setObjectName("toolBar")
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
        self.dockWidget = QtWidgets.QDockWidget(MainWindow)
        self.dockWidget.setObjectName("dockWidget")
        self.dockWidgetContents = QtWidgets.QWidget()
        self.dockWidgetContents.setObjectName("dockWidgetContents")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.dockWidgetContents)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.treeView = FileSystemTreeView(self.dockWidgetContents)
        self.treeView.setObjectName("treeView")
        self.gridLayout_2.addWidget(self.treeView, 0, 0, 1, 1)
        self.dockWidget.setWidget(self.dockWidgetContents)
        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.dockWidget)
        self.actionNew = QtWidgets.QAction(MainWindow)
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap(":/icons/document-new.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.actionNew.setIcon(icon1)
        self.actionNew.setIconVisibleInMenu(True)
        self.actionNew.setObjectName("actionNew")
        self.actionOpen = QtWidgets.QAction(MainWindow)
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap(":/icons/document-open.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.actionOpen.setIcon(icon2)
        self.actionOpen.setIconVisibleInMenu(True)
        self.actionOpen.setObjectName("actionOpen")
        self.actionSave = QtWidgets.QAction(MainWindow)
        icon3 = QtGui.QIcon()
        icon3.addPixmap(QtGui.QPixmap(":/icons/document-save.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.actionSave.setIcon(icon3)
        self.actionSave.setIconVisibleInMenu(True)
        self.actionSave.setObjectName("actionSave")
        self.actionSave_as = QtWidgets.QAction(MainWindow)
        icon4 = QtGui.QIcon()
        icon4.addPixmap(QtGui.QPixmap(":/icons/document-save-as.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.actionSave_as.setIcon(icon4)
        self.actionSave_as.setIconVisibleInMenu(True)
        self.actionSave_as.setObjectName("actionSave_as")
        self.actionClose_tab = QtWidgets.QAction(MainWindow)
        self.actionClose_tab.setIconVisibleInMenu(True)
        self.actionClose_tab.setObjectName("actionClose_tab")
        self.actionClose_other_tabs = QtWidgets.QAction(MainWindow)
        self.actionClose_other_tabs.setIconVisibleInMenu(True)
        self.actionClose_other_tabs.setObjectName("actionClose_other_tabs")
        self.actionClose_all_tabs = QtWidgets.QAction(MainWindow)
        self.actionClose_all_tabs.setIconVisibleInMenu(True)
        self.actionClose_all_tabs.setObjectName("actionClose_all_tabs")
        self.actionQuit = QtWidgets.QAction(MainWindow)
        icon5 = QtGui.QIcon()
        icon5.addPixmap(QtGui.QPixmap(":/icons/close.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.actionQuit.setIcon(icon5)
        self.actionQuit.setIconVisibleInMenu(True)
        self.actionQuit.setObjectName("actionQuit")
        self.actionAbout = QtWidgets.QAction(MainWindow)
        icon6 = QtGui.QIcon()
        icon6.addPixmap(QtGui.QPixmap(":/icons/about.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.actionAbout.setIcon(icon6)
        self.actionAbout.setIconVisibleInMenu(True)
        self.actionAbout.setObjectName("actionAbout")
        self.menuFile.addAction(self.actionNew)
        self.menuFile.addAction(self.actionOpen)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionSave)
        self.menuFile.addAction(self.actionSave_as)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionQuit)
        self.menu.addAction(self.actionAbout)
        self.menubar.addAction(self.menuFile.menuAction())
        self.menubar.addAction(self.menuEdit.menuAction())
        self.menubar.addAction(self.menuModes.menuAction())
        self.menubar.addAction(self.menuPanels.menuAction())
        self.menubar.addAction(self.menu.menuAction())
        self.toolBar.addAction(self.actionNew)
        self.toolBar.addAction(self.actionOpen)
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.actionSave)
        self.toolBar.addAction(self.actionSave_as)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
Beispiel #9
0
class ProjectExplorer(QtCore.QObject):
    """
    Displays project content in a treeview, manage the list of open projects
    and provides the list of project files to other plugins.

    This is a central plugin that all workspace should include!
    """
    project_only = True
    preferred_position = 0

    def __init__(self, window):
        super().__init__()
        self.main_window = window
        self.parser_plugins = []
        self._indexors = []
        self._locator = LocatorWidget(self.main_window)
        self._locator.activated.connect(self._on_locator_activated)
        self._locator.cancelled.connect(self._on_locator_cancelled)
        self._widget = QtWidgets.QWidget(self.main_window)
        self._job_runner = DelayJobRunner()
        self._cached_files = []
        self._running_tasks = False
        self._widget.installEventFilter(self)
        self._setup_filesystem_treeview()
        self._setup_prj_selector_widget(self.main_window)
        self._setup_dock_widget()
        self._setup_tab_bar_context_menu(self.main_window)
        self._setup_locator()
        self._setup_project_menu()
        self._load_parser_plugins()
        api.signals.connect_slot(api.signals.CURRENT_EDITOR_CHANGED,
                                 self._on_current_editor_changed)

    def activate(self):
        for p in api.project.get_projects():
            self._indexors.append(ProjectIndexor(p, self.main_window))

    def _load_parser_plugins(self):
        _logger().debug('loading symbol parser plugins')
        for entrypoint in pkg_resources.iter_entry_points(
                api.plugins.SymbolParserPlugin.ENTRYPOINT):
            _logger().debug('  - loading plugin: %s', entrypoint)
            try:
                plugin = entrypoint.load()()
            except ImportError:
                _logger().exception('failed to load plugin')
            else:
                self.parser_plugins.append(plugin)
                _logger().debug('  - plugin loaded: %s', entrypoint)
        _logger().debug('indexor plugins: %r', self.parser_plugins)

    @staticmethod
    def get_ignored_patterns():
        patterns = utils.get_ignored_patterns()
        prj_path = api.project.get_root_project()
        # project specific ignore patterns
        usd = api.project.load_user_config(prj_path)
        try:
            patterns += usd['ignored_patterns']
        except KeyError:
            _logger().debug('no ignored patterns found in user config')
        return patterns

    def _run_update_projects_model_thread(self):
        if not self._running_tasks:
            self._running_tasks += 1
            for project_dir in api.project.get_projects():
                db_path = os.path.join(project_dir, '.hackedit', 'project.db')
                api.tasks.start(
                    _('Indexing project files (%r)') % os.path.split(
                        project_dir)[1],
                    index_project_files,
                    self._on_file_list_available,
                    args=(db_path, project_dir, self.get_ignored_patterns(),
                          self.parser_plugins), cancellable=True)

    def close(self):
        # save active project in first open project
        paths = api.project.get_projects()
        data = load_user_config(paths[0])
        data['active_project'] = self._combo_projects.currentData()
        try:
            save_user_config(paths[0], data)
        except PermissionError:
            _logger().warn('failed to save user config to %r, '
                           'permission error', paths[0])
        self.main_window = None
        self._locator.window = None
        self._locator = None

    def apply_preferences(self):
        new_patterns = ';'.join(utils.get_ignored_patterns())
        if self._last_ignore_patterns != new_patterns:
            self._last_ignore_patterns = new_patterns
            self.view.clear_ignore_patterns()
            self.view.add_ignore_patterns(self.get_ignored_patterns())
            self.view.set_root_path(api.project.get_current_project())
        self.view.context_menu.update_show_in_explorer_action()
        self._tab_bar_action_show_in_explorer.setText(
            _('Show in %s') % FileSystemContextMenu.get_file_explorer_name())
        self._update_workspaces_menu()
        self.action_goto_anything.setShortcut(shortcuts.get(
            'Goto anything', _('Goto anything'), 'Ctrl+P'))
        self.action_goto_symbol.setShortcut(shortcuts.get(
            'Goto symbol', _('Goto symbol'), 'Ctrl+R'))
        self.action_goto_symbol_in_project.setShortcut(shortcuts.get(
            'Goto symbol in project', _('Goto symbol in project'),
            'Ctrl+Shift+R'))
        self.action_goto_line.setShortcut(shortcuts.get(
            'Goto line', _('Goto line'), 'Ctrl+G'))
        self._update_templates_menu()
        menu = api.window.get_menu(_('&Goto'))
        for action in menu.actions():
            action.setEnabled(settings.indexing_enabled())
        tab = api.editor.get_current_editor()
        self.action_goto_line.setEnabled(tab is not None)
        if self.main_window.app.flg_force_indexing:
            self._reindex_all_projects()
        if not settings.indexing_enabled():
            for indexor in self._indexors:
                indexor.cancel()

    def _on_file_list_available(self, status):
        self._running_tasks = False
        if status is False:
            # too much file indexed, display a warning to let the user know
            # he should ignore some unwanted directories.
            event = api.events.Event(
                _('Project directory contains too much files for indexing...'),
                _('You might want to mark the directories that contains '
                  'non-project files as ignored (<i>Project View -> Right '
                  'click on a directory -> Mark as ignored</i>)'),
                level=api.events.WARNING)
            api.events.post(event)
        self.main_window.project_files_available.emit()
        _logger().debug('project model updated')

    def _setup_tab_bar_context_menu(self, window):
        text = _('Show in %s') % FileSystemContextMenu.get_file_explorer_name()
        action = QtWidgets.QAction(text, window)
        action.setToolTip(text)
        action.setIcon(QtGui.QIcon.fromTheme('system-file-manager'))
        action.triggered.connect(self._on_show_in_explorer_triggered)
        api.window.add_tab_widget_context_menu_action(action)
        self._tab_bar_action_show_in_explorer = action

    def _setup_dock_widget(self):
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self._widget_active_projects)
        layout.addWidget(self.view)
        layout.setContentsMargins(3, 3, 3, 3)
        self._widget.setLayout(layout)
        dock = api.window.add_dock_widget(
            self._widget, _('Project'), QtGui.QIcon.fromTheme('folder'),
            QtCore.Qt.LeftDockWidgetArea)
        dock.show()

    def _setup_project_menu(self):
        menu = api.window.get_menu(_('&View'))
        self.workspaces_menu = menu.addMenu(_('Workspaces'))
        menu.addSeparator()

    def _update_workspaces_menu(self):
        if QtGui.QIcon.hasThemeIcon('preferences-system-windows'):
            icon = QtGui.QIcon.fromTheme('preferences-system-windows')
        else:
            icon = QtGui.QIcon.fromTheme('applications-interfacedesign')
        self.workspaces_menu.clear()
        ag = QtWidgets.QActionGroup(self.workspaces_menu)
        for w in WorkspaceManager().get_names():
            a = QtWidgets.QAction(w, self.workspaces_menu)
            a.setCheckable(True)
            a.setChecked(w == self.main_window.workspace['name'])
            a.setIcon(icon)
            ag.addAction(a)
            self.workspaces_menu.addAction(a)
        ag.triggered.connect(self._on_workspace_action_clicked)

    @QtCore.pyqtSlot(QtWidgets.QAction)
    def _on_workspace_action_clicked(self, action):
        prj = api.project.get_root_project()
        open_path = self.main_window.app.open_path
        api.project.save_workspace(prj, action.text().replace('&', ''))
        self.main_window.save_state(*self.main_window.get_session_info())
        window = self.main_window
        open_path(prj, force=True)
        QtCore.QTimer.singleShot(1, window.close)

    def _setup_locator(self):
        menu = api.window.get_menu(_('&Goto'))
        self.action_goto_anything = menu.addAction(_('Goto anything...'))
        self.action_goto_anything.setShortcut(shortcuts.get(
            'Goto anything', _('Goto anything'), 'Ctrl+P'))
        self.main_window.addAction(self.action_goto_anything)
        self.action_goto_anything.triggered.connect(self._goto_anything)

        menu.addSeparator()

        self.action_goto_symbol = menu.addAction(_('Goto symbol...'))
        self.action_goto_symbol.setShortcut(shortcuts.get(
            'Goto symbol', _('Goto symbol'), 'Ctrl+R'))
        self.main_window.addAction(self.action_goto_symbol)
        self.action_goto_symbol.triggered.connect(self._goto_symbol)

        self.action_goto_symbol_in_project = menu.addAction(
            _('Goto symbol in project...'))
        self.action_goto_symbol_in_project.setShortcut(shortcuts.get(
            'Goto symbol in project', _('Goto symbol in project'),
            'Ctrl+Shift+R'))
        self.main_window.addAction(self.action_goto_symbol_in_project)
        self.action_goto_symbol_in_project.triggered.connect(
            self._goto_symbol_in_project)

        self.action_goto_line = menu.addAction(_('Goto line'))
        self.action_goto_line.setShortcut(shortcuts.get(
            'Goto line', _('Goto line'), 'Ctrl+G'))
        self.main_window.addAction(self.action_goto_line)
        self.action_goto_line.triggered.connect(self._goto_line)

        menu.addSeparator()

        indexing_menu = menu.addMenu('Indexing')
        action = indexing_menu.addAction('Update project(s) index')
        action.setToolTip('Update project index database...')
        action.triggered.connect(self._reindex_all_projects)
        action = indexing_menu.addAction('Force full project(s) indexation')
        action.setToolTip('Invalidate project index and force a full '
                          'reindexation...')
        action.triggered.connect(self._force_reindex_all_projects)

    def _goto_anything(self):
        self._locator.mode = self._locator.MODE_GOTO_ANYTHING
        self._show_locator()

    def _goto_symbol(self):
        try:
            self._cached_cursor_position = TextHelper(
                api.editor.get_current_editor()).cursor_position()
        except (TypeError, AttributeError):
            pass  # no current editor or not a code edit
        else:
            self._locator.mode = self._locator.MODE_GOTO_SYMBOL
            self._show_locator()

    def _goto_symbol_in_project(self):
        self._locator.mode = self._locator.MODE_GOTO_SYMBOL_IN_PROJECT
        self._show_locator()

    def _goto_line(self):
        self._cached_cursor_position = TextHelper(
            api.editor.get_current_editor()).cursor_position()
        self._locator.mode = self._locator.MODE_GOTO_LINE
        self._show_locator()

    def _show_locator(self):
        widget = api.window.get_main_window_ui().stackedWidget
        parent_pos = widget.pos()
        parent_size = widget.size()
        w = parent_size.width() * 0.8
        self._locator.setMinimumWidth(parent_size.width() * 0.8)
        x, y = parent_pos.x(), parent_pos.y()
        pw = parent_size.width()
        x += pw / 2 - w / 2
        self._locator.move(widget.mapToGlobal(QtCore.QPoint(x, y)))
        self._locator.show()

    def _setup_prj_selector_widget(self, window):
        self._widget_active_projects = QtWidgets.QWidget(window)
        layout = QtWidgets.QHBoxLayout()
        layout.setContentsMargins(0, 0, 0, 0)
        self._combo_projects = QtWidgets.QComboBox()
        layout.addWidget(self._combo_projects)
        self.load_project_combo()
        api.signals.connect_slot(api.signals.PROJECT_ADDED,
                                 self._on_path_added)
        api.signals.connect_slot(api.signals.CURRENT_PROJECT_CHANGED,
                                 self._on_current_proj_changed)
        self._set_active_project()
        self._combo_projects.currentIndexChanged.connect(
            self._on_current_index_changed)
        bt_refresh = QtWidgets.QToolButton()
        bt_refresh.setIcon(QtGui.QIcon.fromTheme('view-refresh'))
        bt_refresh.setToolTip(
            _('Refresh project tree view...'))
        bt_refresh.clicked.connect(self._refresh)
        layout.addWidget(bt_refresh)

        bt_remove_project = QtWidgets.QToolButton()
        bt_remove_project.setIcon(QtGui.QIcon.fromTheme('list-remove'))
        bt_remove_project.setToolTip(
            _('Remove project from view'))
        bt_remove_project.clicked.connect(self._remove_current_project)
        layout.addWidget(bt_remove_project)
        self._widget_active_projects.setLayout(layout)
        self.bt_rm_proj = bt_remove_project
        if self._combo_projects.count() == 1:
            self.bt_rm_proj.hide()

    def load_project_combo(self, current_index=None):
        if current_index is None:
            current_index = self._combo_projects.currentIndex()
        project_paths = api.project.get_projects()
        with api.utils.block_signals(self._combo_projects):
            self._combo_projects.clear()
            for pth in project_paths:
                index = self._combo_projects.count()
                if os.path.ismount(pth):
                    if api.system.WINDOWS and not pth.endswith('\\'):
                        pth += '\\'
                    name = pth
                else:
                    name = os.path.split(pth)[1]
                self._combo_projects.addItem(name)
                self._combo_projects.setItemIcon(
                    index, FileIconProvider().icon(QtCore.QFileInfo(pth)))
                self._combo_projects.setItemData(index, pth)
        self._combo_projects.setCurrentIndex(current_index)

    def _setup_filesystem_treeview(self):
        self.view = FileSystemTreeView(self._widget)
        self.view.setMinimumWidth(200)
        self._last_ignore_patterns = ';'.join(utils.get_ignored_patterns())
        self.view.add_ignore_patterns(self.get_ignored_patterns())
        self.view.file_created.connect(self._on_file_created)
        self.view.files_deleted.connect(self._on_files_deleted)
        self.view.files_renamed.connect(self._on_files_renamed)
        self.main_window.document_saved.connect(self._on_file_saved)
        self.view.set_icon_provider(FileIconProvider())
        context_menu = FileSystemContextMenu()
        self.view.set_context_menu(context_menu)
        self.templates_menu = context_menu.menu_new.addSeparator()
        self.templates_menu = context_menu.menu_new.addMenu(
            _('Templates'))
        self.templates_menu.menuAction().setIcon(QtGui.QIcon.fromTheme(
            'folder-templates'))
        self._update_templates_menu()

        self.view.activated.connect(self._on_file_activated)

        self.action_mark_as_ignored = QtWidgets.QAction(
            _('Mark as ignored'), self.view)
        self.action_mark_as_ignored.triggered.connect(
            self._on_mark_as_ignored)
        self.action_mark_as_ignored.setIcon(QtGui.QIcon.fromTheme(
            'emblem-unreadable'))
        self.view.context_menu.insertAction(
            self.view.context_menu.action_show_in_explorer,
            self.action_mark_as_ignored)
        self.view.context_menu.insertSeparator(
            self.view.context_menu.action_show_in_explorer)

        self.action_show_in_terminal = QtWidgets.QAction(
            QtGui.QIcon.fromTheme('utilities-terminal'),
            _('Open in terminal'), self.view)
        self.action_show_in_terminal.triggered.connect(
            self._on_show_in_terminal_triggered)
        self.view.context_menu.addAction(self.action_show_in_terminal)

        self.action_open_in_browser = QtWidgets.QAction(
            QtGui.QIcon.fromTheme('applications-internet'),
            _('Open in web browser'), self.view)
        self.action_open_in_browser.triggered.connect(
            self._on_action_open_in_browser_triggered)
        self.view.context_menu.addAction(self.action_open_in_browser)

        insert_pt = self.view.context_menu.menu_new.menuAction()

        action = QtWidgets.QAction(_('Execute file'), self.main_window)
        action.setToolTip(_('Run executable'))
        action.setIcon(api.special_icons.run_icon())
        action.triggered.connect(self._execute_file)
        self.action_exec_file = action
        self.view.context_menu.insertAction(insert_pt, action)
        action = QtWidgets.QAction(self.main_window)
        action.setSeparator(True)
        self.view.context_menu.insertAction(insert_pt, action)

        self.view.about_to_show_context_menu.connect(
            self._on_about_to_show_context_menu)

    def _update_templates_menu(self):
        self.templates_menu.clear()
        sources = {}
        for src in templates.get_sources():
            lbl = src['label']
            icon = QtGui.QIcon.fromTheme('folder-templates')
            menu = self.templates_menu.addMenu(icon, lbl)
            sources[lbl] = menu
        for template in templates.get_templates(category='File'):
            icon = template['icon']
            lbl = template['source']['label']
            if icon.startswith(':') or os.path.exists(icon):
                icon = QtGui.QIcon(icon)
            elif icon.startswith('file.'):
                icon = FileIconProvider().icon(icon)
            else:
                icon = QtGui.QIcon.fromTheme(icon)
            a = sources[lbl].addAction(icon, template['name'])
            a.setData((lbl, template))
            a.triggered.connect(self._add_file_from_template)
        for menu in sources.values():
            menu.menuAction().setVisible(len(menu.actions()) > 0)

    def _on_mark_as_ignored(self):
        path = FileSystemHelper(self.view).get_current_path()
        prj = api.project.get_root_project()
        usd = api.project.load_user_config(prj)
        try:
            patterns = usd['ignored_patterns']
        except KeyError:
            patterns = []
        finally:
            name = os.path.split(path)[1]
            pattern = DlgIgnore.get_ignore_pattern(self.main_window, name)
            if pattern:
                patterns.append(pattern)
                usd['ignored_patterns'] = patterns
                api.project.save_user_config(prj, usd)
                self.view.clear_ignore_patterns()
                self.view.add_ignore_patterns(self.get_ignored_patterns())
                # force reload
                self.view.set_root_path(api.project.get_current_project())
                self._reindex_all_projects()

    def _on_about_to_show_context_menu(self, path):
        try:
            is_html = 'text/html' in mimetypes.guess_type(path)[0]
        except TypeError:
            is_html = False  # mimetype is None, not iterable
        self.action_open_in_browser.setVisible(is_html)
        if api.system.WINDOWS:
            is_executable = path.endswith('.exe') or path.endswith('.bat')
        else:
            is_executable = os.access(path, os.X_OK) and os.path.isfile(path)
        self.action_exec_file.setVisible(is_executable)

    def _on_action_open_in_browser_triggered(self):
        path = FileSystemHelper(self.view).get_current_path()
        if settings.use_default_browser():
            webbrowser.open_new_tab(path)
        else:
            cmd = utils.get_custom_browser_command() % path
            try:
                subprocess.Popen(cmd)
            except (OSError, subprocess.CalledProcessError):
                _logger().exception('failed to open file in browser (cmd=%s)',
                                    cmd)

    def _execute_file(self):
        path = FileSystemHelper(self.view).get_current_path()
        run_widget = api.window.get_run_widget()
        assert isinstance(run_widget, api.widgets.RunWidget)
        run_widget.run_program(path, cwd=os.path.dirname(path))

    def _on_show_in_terminal_triggered(self):
        path = FileSystemHelper(self.view).get_current_path()
        if os.path.isfile(path):
            path = os.path.dirname(path)
        cmd = utils.get_cmd_open_folder_in_terminal() % path
        try:
            if api.system.WINDOWS:
                subprocess.Popen(
                    cmd, creationflags=subprocess.CREATE_NEW_CONSOLE)
            else:
                subprocess.Popen(shlex.split(cmd, posix=False))
        except (OSError, subprocess.CalledProcessError):
            _logger().exception('failed to open directory in terminal')

    def _add_file_from_template(self):
        source, template = self.sender().data()
        path = FileSystemHelper(self.view).get_current_path()
        if os.path.isfile(path):
            path = os.path.dirname(path)
        path = common.create_new_from_template(
            source, template, path, True, self.main_window,
            self.main_window.app)
        self._on_file_created(path)

    @staticmethod
    def _on_show_in_explorer_triggered():
        path = api.window.get_tab_under_context_menu().file.path
        FileSystemContextMenu.show_in_explorer(
            path, api.window.get_main_window())

    def _on_file_activated(self, index):
        path = self.view.filePath(index)
        if path and os.path.isfile(path):
            _logger().debug('showing editor for %r', path)
            api.editor.open_file(path)

    def _on_current_editor_changed(self, tab):
        if tab is not None:
            self.view.select_path(tab.file.path)
        self.action_goto_line.setEnabled(tab is not None)
        self.action_goto_symbol.setEnabled(
            tab is not None and settings.indexing_enabled())

    def _on_current_proj_changed(self, new_path):
        if api.project.get_current_project() != new_path:
            self.main_window.current_project = new_path
            self.view.set_root_path(new_path)

    def _set_active_project(self):
        paths = api.project.get_projects()
        try:
            data = load_user_config(paths[0])
        except IndexError:
            return
        try:
            active_path = data['active_project']
            if active_path is None or not os.path.exists(active_path):
                raise KeyError('active_project')
        except KeyError:
            active_path = paths[0]
        for i in range(self._combo_projects.count()):
            if self._combo_projects.itemData(i) == active_path:
                self._combo_projects.setCurrentIndex(i)
                self.view.set_root_path(active_path)
                break
        else:
            self.view.set_root_path(active_path)
        self.main_window.current_project = active_path

    def _on_path_added(self, path):
        if os.path.isfile(path):
            return
        index = self._combo_projects.count()
        self.load_project_combo(current_index=index)
        self._on_current_index_changed(index)
        self.bt_rm_proj.setVisible(self._combo_projects.count() > 1)
        data = load_user_config(api.project.get_projects()[0])
        data['active_project'] = path
        self._indexors.append(ProjectIndexor(path, self.main_window))

    def _on_current_index_changed(self, index):
        new_path = self._combo_projects.itemData(index)
        if new_path:
            self.main_window.current_project_changed.emit(new_path)

    def _refresh(self):
        self.view.set_root_path('/')
        self.view.set_root_path(api.project.get_current_project())

    def _force_reindex_all_projects(self):
        for indexor in self._indexors:
            indexor.cancel()
        # wait a bit before removing the index database (to make sure
        # pending indexation tasks are actually canceled).
        QtCore.QTimer.singleShot(100, self._perform_full_reindexation)

    def _perform_full_reindexation(self):
        for project in api.project.get_projects():
            index.remove_project(project)
        self._reindex_all_projects()

    def _reindex_all_projects(self):
        for indexor in self._indexors:
            indexor.cancel()
        QtCore.QTimer.singleShot(100, self._perform_reindexation)

    def _perform_reindexation(self):
        for indexor in self._indexors:
            indexor.perform_indexing()

    def _remove_current_project(self):
        path = self._combo_projects.itemData(
            self._combo_projects.currentIndex())
        self._combo_projects.removeItem(self._combo_projects.currentIndex())

        self.main_window.remove_folder(path)
        initial_path = api.project.get_projects()[0]
        data = load_user_config(initial_path)
        try:
            linked_paths = data['linked_paths']
        except KeyError:
            linked_paths = []
        try:
            linked_paths.remove(path)
        except ValueError:
            _logger().warn('failed to remove linked path %r, path not in list',
                           path)
        finally:
            data['linked_paths'] = linked_paths
            save_user_config(initial_path, data)
            for indexor in self._indexors:
                if indexor.project == path:
                    self._indexors.remove(indexor)

    def _on_file_created(self, path):
        api.editor.open_file(path)
        project_path = self._combo_projects.itemData(self._combo_projects.currentIndex())

        with DbHelper() as dbh:
            try:
                dbh.create_file(path, project_id=index.get_project_ids([project_path])[0])
            except (TypeError, IndexError):
                return
            else:
                self._update_document_index(path)

    def _on_file_saved(self, path):
        self._update_document_index(path)

    def _update_document_index(self, path):
        file = index.get_file(path)
        if not file:
            return

        project = None
        for p in index.get_all_projects():
            if p.id == file.project_id:
                project = p
                break
        if not project:
            return
        test_path = 'file' + os.path.splitext(path)[1]
        plugin = get_symbol_parser(test_path, tuple(self.parser_plugins))
        if not plugin:
            return
        args = (path, file.id, project.path, project.id, plugin)
        api.tasks.start('Update file index', update_file, None, args=args)

    def _on_files_renamed(self, renamed_files):
        for old_path, new_path in renamed_files:
            old_path = os.path.normpath(os.path.normcase(old_path))
            new_path = os.path.normpath(os.path.normcase(new_path))
            self.main_window.tab_widget.rename_document(old_path, new_path)
            self.main_window.file_renamed.emit(old_path, new_path)
        api.tasks.start('Update renamed files index', rename_files, None,
                        args=(renamed_files,))

    def _on_files_deleted(self, deleted_files):
        for path in deleted_files:
            path = os.path.normpath(os.path.normcase(path))
            self.main_window.tab_widget.close_document(path)
            self.main_window.file_deleted.emit(path)
        api.tasks.start('Update renamed files index', delete_files, None,
                        args=(deleted_files,))

    @staticmethod
    def _on_locator_activated(path, line):
        if line == -1:
            line = None
        else:
            line -= 1  # 0 based
        api.editor.open_file(path, line=line)

    def _on_locator_cancelled(self):
        if self._locator.mode in [
                self._locator.MODE_GOTO_LINE, self._locator.MODE_GOTO_SYMBOL]:
            line, col = self._cached_cursor_position
            TextHelper(api.editor.get_current_editor()).goto_line(line, col)
Beispiel #10
0
    def _setup_filesystem_treeview(self):
        self.view = FileSystemTreeView(self._widget)
        self.view.setMinimumWidth(200)
        self._last_ignore_patterns = ';'.join(utils.get_ignored_patterns())
        self.view.add_ignore_patterns(self.get_ignored_patterns())
        self.view.file_created.connect(self._on_file_created)
        self.view.files_deleted.connect(self._on_files_deleted)
        self.view.files_renamed.connect(self._on_files_renamed)
        self.main_window.document_saved.connect(self._on_file_saved)
        self.view.set_icon_provider(FileIconProvider())
        context_menu = FileSystemContextMenu()
        self.view.set_context_menu(context_menu)
        self.templates_menu = context_menu.menu_new.addSeparator()
        self.templates_menu = context_menu.menu_new.addMenu(
            _('Templates'))
        self.templates_menu.menuAction().setIcon(QtGui.QIcon.fromTheme(
            'folder-templates'))
        self._update_templates_menu()

        self.view.activated.connect(self._on_file_activated)

        self.action_mark_as_ignored = QtWidgets.QAction(
            _('Mark as ignored'), self.view)
        self.action_mark_as_ignored.triggered.connect(
            self._on_mark_as_ignored)
        self.action_mark_as_ignored.setIcon(QtGui.QIcon.fromTheme(
            'emblem-unreadable'))
        self.view.context_menu.insertAction(
            self.view.context_menu.action_show_in_explorer,
            self.action_mark_as_ignored)
        self.view.context_menu.insertSeparator(
            self.view.context_menu.action_show_in_explorer)

        self.action_show_in_terminal = QtWidgets.QAction(
            QtGui.QIcon.fromTheme('utilities-terminal'),
            _('Open in terminal'), self.view)
        self.action_show_in_terminal.triggered.connect(
            self._on_show_in_terminal_triggered)
        self.view.context_menu.addAction(self.action_show_in_terminal)

        self.action_open_in_browser = QtWidgets.QAction(
            QtGui.QIcon.fromTheme('applications-internet'),
            _('Open in web browser'), self.view)
        self.action_open_in_browser.triggered.connect(
            self._on_action_open_in_browser_triggered)
        self.view.context_menu.addAction(self.action_open_in_browser)

        insert_pt = self.view.context_menu.menu_new.menuAction()

        action = QtWidgets.QAction(_('Execute file'), self.main_window)
        action.setToolTip(_('Run executable'))
        action.setIcon(api.special_icons.run_icon())
        action.triggered.connect(self._execute_file)
        self.action_exec_file = action
        self.view.context_menu.insertAction(insert_pt, action)
        action = QtWidgets.QAction(self.main_window)
        action.setSeparator(True)
        self.view.context_menu.insertAction(insert_pt, action)

        self.view.about_to_show_context_menu.connect(
            self._on_about_to_show_context_menu)
Beispiel #11
0
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(938, 638)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/icons/QIdle.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setSpacing(0)
        self.gridLayout.setObjectName("gridLayout")
        self.tabWidget = SplittableCodeEditTabWidget(self.centralwidget)
        self.tabWidget.setObjectName("tabWidget")
        self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.dockWidgetFiles = QtWidgets.QDockWidget(MainWindow)
        self.dockWidgetFiles.setObjectName("dockWidgetFiles")
        self.dockWidgetContents = QtWidgets.QWidget()
        self.dockWidgetContents.setObjectName("dockWidgetContents")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.dockWidgetContents)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.fsTree = FileSystemTreeView(self.dockWidgetContents)
        self.fsTree.setObjectName("fsTree")
        self.gridLayout_2.addWidget(self.fsTree, 0, 0, 1, 1)
        self.dockWidgetFiles.setWidget(self.dockWidgetContents)
        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.dockWidgetFiles)
        self.dockWidgetClassExplorer = QtWidgets.QDockWidget(MainWindow)
        self.dockWidgetClassExplorer.setObjectName("dockWidgetClassExplorer")
        self.dockWidgetContents_2 = QtWidgets.QWidget()
        self.dockWidgetContents_2.setObjectName("dockWidgetContents_2")
        self.gridLayout_3 = QtWidgets.QGridLayout(self.dockWidgetContents_2)
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.classExplorer = PyOutlineTreeWidget(self.dockWidgetContents_2)
        self.classExplorer.setObjectName("classExplorer")
        self.classExplorer.headerItem().setText(0, "1")
        self.classExplorer.header().setVisible(False)
        self.gridLayout_3.addWidget(self.classExplorer, 0, 0, 1, 1)
        self.dockWidgetClassExplorer.setWidget(self.dockWidgetContents_2)
        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.dockWidgetClassExplorer)
        self.dockWidgetProgramOutput = QtWidgets.QDockWidget(MainWindow)
        self.dockWidgetProgramOutput.setObjectName("dockWidgetProgramOutput")
        self.dockWidgetContents_3 = QtWidgets.QWidget()
        self.dockWidgetContents_3.setObjectName("dockWidgetContents_3")
        self.gridLayout_4 = QtWidgets.QGridLayout(self.dockWidgetContents_3)
        self.gridLayout_4.setObjectName("gridLayout_4")
        self.textEditPgmOutput = PyInteractiveConsole(self.dockWidgetContents_3)
        self.textEditPgmOutput.setObjectName("textEditPgmOutput")
        self.gridLayout_4.addWidget(self.textEditPgmOutput, 0, 0, 1, 1)
        self.dockWidgetProgramOutput.setWidget(self.dockWidgetContents_3)
        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(8), self.dockWidgetProgramOutput)
        self.dockWidgetPyConsole = QtWidgets.QDockWidget(MainWindow)
        self.dockWidgetPyConsole.setObjectName("dockWidgetPyConsole")
        self.dockWidgetContents_4 = QtWidgets.QWidget()
        self.dockWidgetContents_4.setObjectName("dockWidgetContents_4")
        self.gridLayout_5 = QtWidgets.QGridLayout(self.dockWidgetContents_4)
        self.gridLayout_5.setObjectName("gridLayout_5")
        self.pyconsole = IPythonConsole(self.dockWidgetContents_4)
        self.pyconsole.setObjectName("pyconsole")
        self.gridLayout_5.addWidget(self.pyconsole, 0, 0, 1, 1)
        self.dockWidgetPyConsole.setWidget(self.dockWidgetContents_4)
        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(8), self.dockWidgetPyConsole)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 938, 34))
        self.menubar.setObjectName("menubar")
        self.menuFile = QtWidgets.QMenu(self.menubar)
        self.menuFile.setObjectName("menuFile")
        self.menuRecents = QtWidgets.QMenu(self.menuFile)
        self.menuRecents.setObjectName("menuRecents")
        self.menuRun = QtWidgets.QMenu(self.menubar)
        self.menuRun.setObjectName("menuRun")
        self.menuOptions = QtWidgets.QMenu(self.menubar)
        self.menuOptions.setObjectName("menuOptions")
        self.menuWindows = QtWidgets.QMenu(self.menubar)
        self.menuWindows.setObjectName("menuWindows")
        self.menuTools = QtWidgets.QMenu(self.menuWindows)
        self.menuTools.setObjectName("menuTools")
        self.menuHelp = QtWidgets.QMenu(self.menubar)
        self.menuHelp.setObjectName("menuHelp")
        self.menuEdit = QtWidgets.QMenu(self.menubar)
        self.menuEdit.setObjectName("menuEdit")
        MainWindow.setMenuBar(self.menubar)
        self.toolBarSave = QtWidgets.QToolBar(MainWindow)
        self.toolBarSave.setObjectName("toolBarSave")
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBarSave)
        self.toolBarRun = QtWidgets.QToolBar(MainWindow)
        self.toolBarRun.setObjectName("toolBarRun")
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBarRun)
        self.actionOpen_file = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("document-open")
        self.actionOpen_file.setIcon(icon)
        self.actionOpen_file.setObjectName("actionOpen_file")
        self.actionOpen_directory = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("folder-open")
        self.actionOpen_directory.setIcon(icon)
        self.actionOpen_directory.setObjectName("actionOpen_directory")
        self.actionSave = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("document-save")
        self.actionSave.setIcon(icon)
        self.actionSave.setObjectName("actionSave")
        self.actionSave_as = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("document-save-as")
        self.actionSave_as.setIcon(icon)
        self.actionSave_as.setObjectName("actionSave_as")
        self.actionClose = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("window-close")
        self.actionClose.setIcon(icon)
        self.actionClose.setObjectName("actionClose")
        self.actionQuit = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("exit")
        self.actionQuit.setIcon(icon)
        self.actionQuit.setObjectName("actionQuit")
        self.actionRun = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("media-playback-start")
        self.actionRun.setIcon(icon)
        self.actionRun.setObjectName("actionRun")
        self.actionConfigureRun = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("system-run")
        self.actionConfigureRun.setIcon(icon)
        self.actionConfigureRun.setObjectName("actionConfigureRun")
        self.actionConfigure_IDLE = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("preferences-system")
        self.actionConfigure_IDLE.setIcon(icon)
        self.actionConfigure_IDLE.setObjectName("actionConfigure_IDLE")
        self.actionZoom_height = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("zoom-fit-best")
        self.actionZoom_height.setIcon(icon)
        self.actionZoom_height.setObjectName("actionZoom_height")
        self.actionAbout_QIdle = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("help-about")
        self.actionAbout_QIdle.setIcon(icon)
        self.actionAbout_QIdle.setObjectName("actionAbout_QIdle")
        self.actionHelp_content = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("help-contents")
        self.actionHelp_content.setIcon(icon)
        self.actionHelp_content.setObjectName("actionHelp_content")
        self.actionPython_docs = QtWidgets.QAction(MainWindow)
        self.actionPython_docs.setObjectName("actionPython_docs")
        self.actionNew_file = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("document-new")
        self.actionNew_file.setIcon(icon)
        self.actionNew_file.setObjectName("actionNew_file")
        self.actionNew_project = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("folder-new")
        self.actionNew_project.setIcon(icon)
        self.actionNew_project.setObjectName("actionNew_project")
        self.menuFile.addAction(self.actionNew_file)
        self.menuFile.addAction(self.actionOpen_file)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionNew_project)
        self.menuFile.addAction(self.actionOpen_directory)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.menuRecents.menuAction())
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionSave)
        self.menuFile.addAction(self.actionSave_as)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionClose)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionQuit)
        self.menuRun.addAction(self.actionRun)
        self.menuRun.addAction(self.actionConfigureRun)
        self.menuOptions.addAction(self.actionConfigure_IDLE)
        self.menuWindows.addAction(self.actionZoom_height)
        self.menuWindows.addSeparator()
        self.menuWindows.addAction(self.menuTools.menuAction())
        self.menuWindows.addSeparator()
        self.menuHelp.addAction(self.actionAbout_QIdle)
        self.menuHelp.addSeparator()
        self.menuHelp.addAction(self.actionHelp_content)
        self.menuHelp.addAction(self.actionPython_docs)
        self.menubar.addAction(self.menuFile.menuAction())
        self.menubar.addAction(self.menuEdit.menuAction())
        self.menubar.addAction(self.menuRun.menuAction())
        self.menubar.addAction(self.menuOptions.menuAction())
        self.menubar.addAction(self.menuWindows.menuAction())
        self.menubar.addAction(self.menuHelp.menuAction())
        self.toolBarSave.addAction(self.actionSave)
        self.toolBarSave.addAction(self.actionSave_as)
        self.toolBarRun.addAction(self.actionRun)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
Beispiel #12
0
class ProjectExplorer(QtCore.QObject):
    """
    Displays project content in a treeview, manage the list of open projects
    and provides the list of project files to other plugins.

    This is a central plugin that all workspace should include!
    """
    project_only = True
    preferred_position = 0

    def __init__(self, window):
        super().__init__()
        self.main_window = window
        self.parser_plugins = []
        self._indexors = []
        self._locator = LocatorWidget(self.main_window)
        self._locator.activated.connect(self._on_locator_activated)
        self._locator.cancelled.connect(self._on_locator_cancelled)
        self._widget = QtWidgets.QWidget(self.main_window)
        self._job_runner = DelayJobRunner()
        self._cached_files = []
        self._running_tasks = False
        self._widget.installEventFilter(self)
        self._setup_filesystem_treeview()
        self._setup_prj_selector_widget(self.main_window)
        self._setup_dock_widget()
        self._setup_tab_bar_context_menu(self.main_window)
        self._setup_locator()
        self._setup_project_menu()
        self._load_parser_plugins()
        api.signals.connect_slot(api.signals.CURRENT_EDITOR_CHANGED,
                                 self._on_current_editor_changed)

    def activate(self):
        for p in api.project.get_projects():
            self._indexors.append(ProjectIndexor(p, self.main_window))

    def _load_parser_plugins(self):
        _logger().debug('loading symbol parser plugins')
        for entrypoint in pkg_resources.iter_entry_points(
                api.plugins.SymbolParserPlugin.ENTRYPOINT):
            _logger().debug('  - loading plugin: %s', entrypoint)
            try:
                plugin = entrypoint.load()()
            except ImportError:
                _logger().exception('failed to load plugin')
            else:
                self.parser_plugins.append(plugin)
                _logger().debug('  - plugin loaded: %s', entrypoint)
        _logger().debug('indexor plugins: %r', self.parser_plugins)

    @staticmethod
    def get_ignored_patterns():
        patterns = utils.get_ignored_patterns()
        prj_path = api.project.get_root_project()
        # project specific ignore patterns
        usd = api.project.load_user_config(prj_path)
        try:
            patterns += usd['ignored_patterns']
        except KeyError:
            _logger().debug('no ignored patterns found in user config')
        return patterns

    def _run_update_projects_model_thread(self):
        if not self._running_tasks:
            self._running_tasks += 1
            for project_dir in api.project.get_projects():
                db_path = os.path.join(project_dir, '.hackedit', 'project.db')
                api.tasks.start(_('Indexing project files (%r)') %
                                os.path.split(project_dir)[1],
                                index_project_files,
                                self._on_file_list_available,
                                args=(db_path, project_dir,
                                      self.get_ignored_patterns(),
                                      self.parser_plugins),
                                cancellable=True)

    def close(self):
        # save active project in first open project
        paths = api.project.get_projects()
        data = load_user_config(paths[0])
        data['active_project'] = self._combo_projects.currentData()
        try:
            save_user_config(paths[0], data)
        except PermissionError:
            _logger().warn(
                'failed to save user config to %r, '
                'permission error', paths[0])
        self.main_window = None
        self._locator.window = None
        self._locator = None

    def apply_preferences(self):
        new_patterns = ';'.join(utils.get_ignored_patterns())
        if self._last_ignore_patterns != new_patterns:
            self._last_ignore_patterns = new_patterns
            self.view.clear_ignore_patterns()
            self.view.add_ignore_patterns(self.get_ignored_patterns())
            self.view.set_root_path(api.project.get_current_project())
        self.view.context_menu.update_show_in_explorer_action()
        self._tab_bar_action_show_in_explorer.setText(
            _('Show in %s') % FileSystemContextMenu.get_file_explorer_name())
        self._update_workspaces_menu()
        self.action_goto_file.setShortcut(
            shortcuts.get('Goto file', _('Goto file'), 'Ctrl+T'))
        self.action_goto_symbol.setShortcut(
            shortcuts.get('Goto symbol', _('Goto symbol'), 'Ctrl+R'))
        self.action_goto_symbol_in_project.setShortcut(
            shortcuts.get('Goto symbol in project',
                          _('Goto symbol in project'), 'Ctrl+Shift+R'))
        self.action_goto_line.setShortcut(
            shortcuts.get('Goto line', _('Goto line'), 'Ctrl+G'))
        self._update_templates_menu()
        menu = api.window.get_menu(_('&Goto'))
        for action in menu.actions():
            action.setEnabled(settings.indexing_enabled())
        tab = api.editor.get_current_editor()
        self.action_goto_line.setEnabled(tab is not None)
        if self.main_window.app.flg_force_indexing:
            self._reindex_all_projects()
        if not settings.indexing_enabled():
            for indexor in self._indexors:
                indexor.cancel()

    def _on_file_list_available(self, status):
        self._running_tasks = False
        if status is False:
            # too much file indexed, display a warning to let the user know
            # he should ignore some unwanted directories.
            event = api.events.Event(
                _('Project directory contains too much files for indexing...'),
                _('You might want to mark the directories that contains '
                  'non-project files as ignored (<i>Project View -> Right '
                  'click on a directory -> Mark as ignored</i>)'),
                level=api.events.WARNING)
            api.events.post(event)
        self.main_window.project_files_available.emit()
        _logger().debug('project model updated')

    def _setup_tab_bar_context_menu(self, window):
        text = _('Show in %s') % FileSystemContextMenu.get_file_explorer_name()
        action = QtWidgets.QAction(text, window)
        action.setToolTip(text)
        action.setIcon(QtGui.QIcon.fromTheme('system-file-manager'))
        action.triggered.connect(self._on_show_in_explorer_triggered)
        api.window.add_tab_widget_context_menu_action(action)
        self._tab_bar_action_show_in_explorer = action

    def _setup_dock_widget(self):
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self._widget_active_projects)
        layout.addWidget(self.view)
        layout.setContentsMargins(3, 3, 3, 3)
        self._widget.setLayout(layout)
        dock = api.window.add_dock_widget(self._widget, _('Project'),
                                          QtGui.QIcon.fromTheme('folder'),
                                          QtCore.Qt.LeftDockWidgetArea)
        dock.show()

    def _setup_project_menu(self):
        menu = api.window.get_menu(_('&View'))
        self.workspaces_menu = menu.addMenu(_('Workspaces'))
        menu.addSeparator()

    def _update_workspaces_menu(self):
        if QtGui.QIcon.hasThemeIcon('preferences-system-windows'):
            icon = QtGui.QIcon.fromTheme('preferences-system-windows')
        else:
            icon = QtGui.QIcon.fromTheme('applications-interfacedesign')
        self.workspaces_menu.clear()
        ag = QtWidgets.QActionGroup(self.workspaces_menu)
        for w in WorkspaceManager().get_names():
            a = QtWidgets.QAction(w, self.workspaces_menu)
            a.setCheckable(True)
            a.setChecked(w == self.main_window.workspace['name'])
            a.setIcon(icon)
            ag.addAction(a)
            self.workspaces_menu.addAction(a)
        ag.triggered.connect(self._on_workspace_action_clicked)

    def _on_workspace_action_clicked(self, action):
        prj = api.project.get_root_project()
        open_path = self.main_window.app.open_path
        api.project.save_workspace(prj, action.text().replace('&', ''))
        self.main_window.save_state(*self.main_window.get_session_info())
        window = self.main_window
        open_path(prj, force=True)
        QtCore.QTimer.singleShot(1, window.close)

    def _setup_locator(self):
        menu = api.window.get_menu(_('&Goto'))
        self.action_goto_file = menu.addAction(_('Goto file...'))
        self.action_goto_file.setShortcut(
            shortcuts.get('Goto file', _('Goto file'), 'Ctrl+T'))
        self.main_window.addAction(self.action_goto_file)
        self.action_goto_file.triggered.connect(self._goto_anything)

        menu.addSeparator()

        self.action_goto_symbol = menu.addAction(_('Goto symbol...'))
        self.action_goto_symbol.setShortcut(
            shortcuts.get('Goto symbol', _('Goto symbol'), 'Ctrl+R'))
        self.main_window.addAction(self.action_goto_symbol)
        self.action_goto_symbol.triggered.connect(self._goto_symbol)

        self.action_goto_symbol_in_project = menu.addAction(
            _('Goto symbol in project...'))
        self.action_goto_symbol_in_project.setShortcut(
            shortcuts.get('Goto symbol in project',
                          _('Goto symbol in project'), 'Ctrl+Shift+R'))
        self.main_window.addAction(self.action_goto_symbol_in_project)
        self.action_goto_symbol_in_project.triggered.connect(
            self._goto_symbol_in_project)

        self.action_goto_line = menu.addAction(_('Goto line'))
        self.action_goto_line.setShortcut(
            shortcuts.get('Goto line', _('Goto line'), 'Ctrl+G'))
        self.main_window.addAction(self.action_goto_line)
        self.action_goto_line.triggered.connect(self._goto_line)

        menu.addSeparator()

        indexing_menu = menu.addMenu('Indexing')
        action = indexing_menu.addAction('Update project(s) index')
        action.setToolTip('Update project index database...')
        action.triggered.connect(self._reindex_all_projects)
        action = indexing_menu.addAction('Force full project(s) indexation')
        action.setToolTip('Invalidate project index and force a full '
                          'reindexation...')
        action.triggered.connect(self._force_reindex_all_projects)

    def _goto_anything(self):
        self._locator.mode = self._locator.MODE_GOTO_FILE
        self._show_locator()

    def _goto_symbol(self):
        try:
            self._cached_cursor_position = TextHelper(
                api.editor.get_current_editor()).cursor_position()
        except (TypeError, AttributeError):
            pass  # no current editor or not a code edit
        else:
            self._locator.mode = self._locator.MODE_GOTO_SYMBOL
            self._show_locator()

    def _goto_symbol_in_project(self):
        self._locator.mode = self._locator.MODE_GOTO_SYMBOL_IN_PROJECT
        self._show_locator()

    def _goto_line(self):
        self._cached_cursor_position = TextHelper(
            api.editor.get_current_editor()).cursor_position()
        self._locator.mode = self._locator.MODE_GOTO_LINE
        self._show_locator()

    def _show_locator(self):
        widget = api.window.get_main_window_ui().stackedWidget
        parent_pos = widget.pos()
        parent_size = widget.size()
        w = parent_size.width() * 0.8
        self._locator.setMinimumWidth(parent_size.width() * 0.8)
        x, y = parent_pos.x(), parent_pos.y()
        pw = parent_size.width()
        x += pw / 2 - w / 2
        self._locator.move(widget.mapToGlobal(QtCore.QPoint(x, y)))
        self._locator.show()

    def _setup_prj_selector_widget(self, window):
        self._widget_active_projects = QtWidgets.QWidget(window)
        layout = QtWidgets.QHBoxLayout()
        layout.setContentsMargins(0, 0, 0, 0)
        self._combo_projects = QtWidgets.QComboBox()
        layout.addWidget(self._combo_projects)
        self.load_project_combo()
        api.signals.connect_slot(api.signals.PROJECT_ADDED,
                                 self._on_path_added)
        api.signals.connect_slot(api.signals.CURRENT_PROJECT_CHANGED,
                                 self._on_current_proj_changed)
        self._set_active_project()
        self._combo_projects.currentIndexChanged.connect(
            self._on_current_index_changed)
        bt_refresh = QtWidgets.QToolButton()
        bt_refresh.setIcon(QtGui.QIcon.fromTheme('view-refresh'))
        bt_refresh.setToolTip(_('Refresh project tree view...'))
        bt_refresh.clicked.connect(self._refresh)
        layout.addWidget(bt_refresh)

        bt_remove_project = QtWidgets.QToolButton()
        bt_remove_project.setIcon(QtGui.QIcon.fromTheme('list-remove'))
        bt_remove_project.setToolTip(_('Remove project from view'))
        bt_remove_project.clicked.connect(self._remove_current_project)
        layout.addWidget(bt_remove_project)
        self._widget_active_projects.setLayout(layout)
        self.bt_rm_proj = bt_remove_project
        if self._combo_projects.count() == 1:
            self.bt_rm_proj.hide()

    def load_project_combo(self, current_index=None):
        if current_index is None:
            current_index = self._combo_projects.currentIndex()
        project_paths = api.project.get_projects()
        with api.utils.block_signals(self._combo_projects):
            self._combo_projects.clear()
            for pth in project_paths:
                index = self._combo_projects.count()
                if os.path.ismount(pth):
                    if api.system.WINDOWS and not pth.endswith('\\'):
                        pth += '\\'
                    name = pth
                else:
                    name = os.path.split(pth)[1]
                self._combo_projects.addItem(name)
                self._combo_projects.setItemIcon(
                    index,
                    FileIconProvider().icon(QtCore.QFileInfo(pth)))
                self._combo_projects.setItemData(index, pth)
        self._combo_projects.setCurrentIndex(current_index)

    def _setup_filesystem_treeview(self):
        self.view = FileSystemTreeView(self._widget)
        self.view.setMinimumWidth(200)
        self._last_ignore_patterns = ';'.join(utils.get_ignored_patterns())
        self.view.add_ignore_patterns(self.get_ignored_patterns())
        self.view.file_created.connect(self._on_file_created)
        self.view.files_deleted.connect(self._on_files_deleted)
        self.view.files_renamed.connect(self._on_files_renamed)
        self.main_window.document_saved.connect(self._on_file_saved)
        self.view.set_icon_provider(FileIconProvider())
        context_menu = FileSystemContextMenu()
        self.view.set_context_menu(context_menu)
        self.templates_menu = context_menu.menu_new.addSeparator()
        self.templates_menu = context_menu.menu_new.addMenu(_('Templates'))
        self.templates_menu.menuAction().setIcon(
            QtGui.QIcon.fromTheme('folder-templates'))
        self._update_templates_menu()

        self.view.activated.connect(self._on_file_activated)

        self.action_mark_as_ignored = QtWidgets.QAction(
            _('Mark as ignored'), self.view)
        self.action_mark_as_ignored.triggered.connect(self._on_mark_as_ignored)
        self.action_mark_as_ignored.setIcon(
            QtGui.QIcon.fromTheme('emblem-unreadable'))
        self.view.context_menu.insertAction(
            self.view.context_menu.action_show_in_explorer,
            self.action_mark_as_ignored)
        self.view.context_menu.insertSeparator(
            self.view.context_menu.action_show_in_explorer)

        self.action_show_in_terminal = QtWidgets.QAction(
            QtGui.QIcon.fromTheme('utilities-terminal'), _('Open in terminal'),
            self.view)
        self.action_show_in_terminal.triggered.connect(
            self._on_show_in_terminal_triggered)
        self.view.context_menu.addAction(self.action_show_in_terminal)

        self.action_open_in_browser = QtWidgets.QAction(
            QtGui.QIcon.fromTheme('applications-internet'),
            _('Open in web browser'), self.view)
        self.action_open_in_browser.triggered.connect(
            self._on_action_open_in_browser_triggered)
        self.view.context_menu.addAction(self.action_open_in_browser)

        insert_pt = self.view.context_menu.menu_new.menuAction()

        action = QtWidgets.QAction(_('Execute file'), self.main_window)
        action.setToolTip(_('Run executable'))
        action.setIcon(api.special_icons.run_icon())
        action.triggered.connect(self._execute_file)
        self.action_exec_file = action
        self.view.context_menu.insertAction(insert_pt, action)
        action = QtWidgets.QAction(self.main_window)
        action.setSeparator(True)
        self.view.context_menu.insertAction(insert_pt, action)

        self.view.about_to_show_context_menu.connect(
            self._on_about_to_show_context_menu)

    def _update_templates_menu(self):
        self.templates_menu.clear()
        sources = {}
        for src in templates.get_sources():
            lbl = src['label']
            icon = QtGui.QIcon.fromTheme('folder-templates')
            menu = self.templates_menu.addMenu(icon, lbl)
            sources[lbl] = menu
        for template in templates.get_templates(category='File'):
            icon = template['icon']
            lbl = template['source']['label']
            if icon.startswith(':') or os.path.exists(icon):
                icon = QtGui.QIcon(icon)
            elif icon.startswith('file.'):
                icon = FileIconProvider().icon(icon)
            else:
                icon = QtGui.QIcon.fromTheme(icon)
            a = sources[lbl].addAction(icon, template['name'])
            a.setData((lbl, template))
            a.triggered.connect(self._add_file_from_template)
        for menu in sources.values():
            menu.menuAction().setVisible(len(menu.actions()) > 0)

    def _on_mark_as_ignored(self):
        path = FileSystemHelper(self.view).get_current_path()
        prj = api.project.get_root_project()
        usd = api.project.load_user_config(prj)
        try:
            patterns = usd['ignored_patterns']
        except KeyError:
            patterns = []
        finally:
            name = os.path.split(path)[1]
            pattern = DlgIgnore.get_ignore_pattern(self.main_window, name)
            if pattern:
                patterns.append(pattern)
                usd['ignored_patterns'] = patterns
                api.project.save_user_config(prj, usd)
                self.view.clear_ignore_patterns()
                self.view.add_ignore_patterns(self.get_ignored_patterns())
                # force reload
                self.view.set_root_path(api.project.get_current_project())
                self._reindex_all_projects()

    def _on_about_to_show_context_menu(self, path):
        try:
            is_html = 'text/html' in mimetypes.guess_type(path)[0]
        except TypeError:
            is_html = False  # mimetype is None, not iterable
        self.action_open_in_browser.setVisible(is_html)
        if api.system.WINDOWS:
            is_executable = path.endswith('.exe') or path.endswith('.bat')
        else:
            is_executable = os.access(path, os.X_OK) and os.path.isfile(path)
        self.action_exec_file.setVisible(is_executable)

    def _on_action_open_in_browser_triggered(self):
        path = FileSystemHelper(self.view).get_current_path()
        if settings.use_default_browser():
            webbrowser.open_new_tab(path)
        else:
            cmd = utils.get_custom_browser_command() % path
            try:
                subprocess.Popen(cmd)
            except (OSError, subprocess.CalledProcessError):
                _logger().exception('failed to open file in browser (cmd=%s)',
                                    cmd)

    def _execute_file(self):
        path = FileSystemHelper(self.view).get_current_path()
        run_widget = api.window.get_run_widget()
        assert isinstance(run_widget, api.widgets.RunWidget)
        run_widget.run_program(path, cwd=os.path.dirname(path))

    def _on_show_in_terminal_triggered(self):
        path = FileSystemHelper(self.view).get_current_path()
        if os.path.isfile(path):
            path = os.path.dirname(path)
        cmd = utils.get_cmd_open_folder_in_terminal() % path
        try:
            if api.system.WINDOWS:
                subprocess.Popen(cmd,
                                 creationflags=subprocess.CREATE_NEW_CONSOLE)
            else:
                subprocess.Popen(shlex.split(cmd, posix=False))
        except (OSError, subprocess.CalledProcessError):
            _logger().exception('failed to open directory in terminal')

    def _add_file_from_template(self):
        source, template = self.sender().data()
        path = FileSystemHelper(self.view).get_current_path()
        if os.path.isfile(path):
            path = os.path.dirname(path)
        path = common.create_new_from_template(source, template, path, True,
                                               self.main_window,
                                               self.main_window.app)
        self._on_file_created(path)

    @staticmethod
    def _on_show_in_explorer_triggered():
        path = api.window.get_tab_under_context_menu().file.path
        FileSystemContextMenu.show_in_explorer(path,
                                               api.window.get_main_window())

    def _on_file_activated(self, index):
        path = self.view.filePath(index)
        if path and os.path.isfile(path):
            _logger().debug('showing editor for %r', path)
            api.editor.open_file(path)

    def _on_current_editor_changed(self, tab):
        if tab is not None:
            self.view.select_path(tab.file.path)
        self.action_goto_line.setEnabled(tab is not None)
        self.action_goto_symbol.setEnabled(tab is not None
                                           and settings.indexing_enabled())

    def _on_current_proj_changed(self, new_path):
        if api.project.get_current_project() != new_path:
            self.main_window.current_project = new_path
            self.view.set_root_path(new_path)

    def _set_active_project(self):
        paths = api.project.get_projects()
        try:
            data = load_user_config(paths[0])
        except IndexError:
            return
        try:
            active_path = data['active_project']
            if active_path is None or not os.path.exists(active_path):
                raise KeyError('active_project')
        except KeyError:
            active_path = paths[0]
        for i in range(self._combo_projects.count()):
            if self._combo_projects.itemData(i) == active_path:
                self._combo_projects.setCurrentIndex(i)
                self.view.set_root_path(active_path)
                break
        else:
            self.view.set_root_path(active_path)
        self.main_window.current_project = active_path

    def _on_path_added(self, path):
        if os.path.isfile(path):
            return
        index = self._combo_projects.count()
        self.load_project_combo(current_index=index)
        self._on_current_index_changed(index)
        self.bt_rm_proj.setVisible(self._combo_projects.count() > 1)
        data = load_user_config(api.project.get_projects()[0])
        data['active_project'] = path
        self._indexors.append(ProjectIndexor(path, self.main_window))

    def _on_current_index_changed(self, index):
        new_path = self._combo_projects.itemData(index)
        if new_path:
            self.main_window.current_project_changed.emit(new_path)

    def _refresh(self):
        self.view.set_root_path('/')
        self.view.set_root_path(api.project.get_current_project())

    def _force_reindex_all_projects(self):
        for indexor in self._indexors:
            indexor.cancel()
        # wait a bit before removing the index database (to make sure
        # pending indexation tasks are actually canceled).
        QtCore.QTimer.singleShot(100, self._perform_full_reindexation)

    def _perform_full_reindexation(self):
        for project in api.project.get_projects():
            index.remove_project(project)
        self._reindex_all_projects()

    def _reindex_all_projects(self):
        for indexor in self._indexors:
            indexor.cancel()
        QtCore.QTimer.singleShot(100, self._perform_reindexation)

    def _perform_reindexation(self):
        for indexor in self._indexors:
            indexor.perform_indexing()

    def _remove_current_project(self):
        path = self._combo_projects.itemData(
            self._combo_projects.currentIndex())
        self._combo_projects.removeItem(self._combo_projects.currentIndex())

        self.main_window.remove_folder(path)
        initial_path = api.project.get_projects()[0]
        data = load_user_config(initial_path)
        try:
            linked_paths = data['linked_paths']
        except KeyError:
            linked_paths = []
        try:
            linked_paths.remove(path)
        except ValueError:
            _logger().warn('failed to remove linked path %r, path not in list',
                           path)
        finally:
            data['linked_paths'] = linked_paths
            save_user_config(initial_path, data)
            for indexor in self._indexors:
                if indexor.project == path:
                    self._indexors.remove(indexor)

    def _on_file_created(self, path):
        api.editor.open_file(path)
        project_path = self._combo_projects.itemData(
            self._combo_projects.currentIndex())

        with DbHelper() as dbh:
            try:
                dbh.create_file(path,
                                project_id=index.get_project_ids(
                                    [project_path])[0])
            except (TypeError, IndexError):
                return
            else:
                self._update_document_index(path)

    def _on_file_saved(self, path):
        self._update_document_index(path)

    def _update_document_index(self, path):
        file = index.get_file(path)
        if not file:
            return

        project = None
        for p in index.get_all_projects():
            if p.id == file.project_id:
                project = p
                break
        if not project:
            return
        test_path = 'file' + os.path.splitext(path)[1]
        plugin = get_symbol_parser(test_path, tuple(self.parser_plugins))
        if not plugin:
            return
        args = (path, file.id, project.path, project.id, plugin)
        api.tasks.start('Update file index', update_file, None, args=args)

    def _on_files_renamed(self, renamed_files):
        for old_path, new_path in renamed_files:
            old_path = os.path.normpath(os.path.normcase(old_path))
            new_path = os.path.normpath(os.path.normcase(new_path))
            self.main_window.tab_widget.rename_document(old_path, new_path)
            self.main_window.file_renamed.emit(old_path, new_path)
        api.tasks.start('Update renamed files index',
                        rename_files,
                        None,
                        args=(renamed_files, ))

    def _on_files_deleted(self, deleted_files):
        for path in deleted_files:
            path = os.path.normpath(os.path.normcase(path))
            self.main_window.tab_widget.close_document(path)
            self.main_window.file_deleted.emit(path)
        api.tasks.start('Update renamed files index',
                        delete_files,
                        None,
                        args=(deleted_files, ))

    @staticmethod
    def _on_locator_activated(path, line):
        if line == -1:
            line = None
        else:
            line -= 1  # 0 based
        api.editor.open_file(path, line=line)

    def _on_locator_cancelled(self):
        if self._locator.mode in [
                self._locator.MODE_GOTO_LINE, self._locator.MODE_GOTO_SYMBOL
        ]:
            line, col = self._cached_cursor_position
            TextHelper(api.editor.get_current_editor()).goto_line(line, col)
Beispiel #13
0
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/icons/pyqode.png"), QtGui.QIcon.Normal,
                       QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.tabWidget = SplittableCodeEditTabWidget(self.centralwidget)
        self.tabWidget.setOrientation(QtCore.Qt.Horizontal)
        self.tabWidget.setObjectName("tabWidget")
        self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        self.menubar.setObjectName("menubar")
        self.menuFile = QtWidgets.QMenu(self.menubar)
        self.menuFile.setObjectName("menuFile")
        self.menuEdit = QtWidgets.QMenu(self.menubar)
        self.menuEdit.setObjectName("menuEdit")
        self.menuModes = QtWidgets.QMenu(self.menubar)
        self.menuModes.setObjectName("menuModes")
        self.menuPanels = QtWidgets.QMenu(self.menubar)
        self.menuPanels.setObjectName("menuPanels")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.toolBar = QtWidgets.QToolBar(MainWindow)
        self.toolBar.setObjectName("toolBar")
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
        self.dockWidget = QtWidgets.QDockWidget(MainWindow)
        self.dockWidget.setObjectName("dockWidget")
        self.dockWidgetContents = QtWidgets.QWidget()
        self.dockWidgetContents.setObjectName("dockWidgetContents")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.dockWidgetContents)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.treeView = FileSystemTreeView(self.dockWidgetContents)
        self.treeView.setObjectName("treeView")
        self.gridLayout_2.addWidget(self.treeView, 0, 0, 1, 1)
        self.dockWidget.setWidget(self.dockWidgetContents)
        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.dockWidget)
        self.actionNew = QtWidgets.QAction(MainWindow)
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap(":/icons/document-new.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.actionNew.setIcon(icon1)
        self.actionNew.setIconVisibleInMenu(True)
        self.actionNew.setObjectName("actionNew")
        self.actionOpen = QtWidgets.QAction(MainWindow)
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap(":/icons/document-open.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.actionOpen.setIcon(icon2)
        self.actionOpen.setIconVisibleInMenu(True)
        self.actionOpen.setObjectName("actionOpen")
        self.actionSave = QtWidgets.QAction(MainWindow)
        icon3 = QtGui.QIcon()
        icon3.addPixmap(QtGui.QPixmap(":/icons/document-save.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.actionSave.setIcon(icon3)
        self.actionSave.setIconVisibleInMenu(True)
        self.actionSave.setObjectName("actionSave")
        self.actionSave_as = QtWidgets.QAction(MainWindow)
        icon4 = QtGui.QIcon()
        icon4.addPixmap(QtGui.QPixmap(":/icons/document-save-as.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.actionSave_as.setIcon(icon4)
        self.actionSave_as.setIconVisibleInMenu(True)
        self.actionSave_as.setObjectName("actionSave_as")
        self.actionClose_tab = QtWidgets.QAction(MainWindow)
        self.actionClose_tab.setIconVisibleInMenu(True)
        self.actionClose_tab.setObjectName("actionClose_tab")
        self.actionClose_other_tabs = QtWidgets.QAction(MainWindow)
        self.actionClose_other_tabs.setIconVisibleInMenu(True)
        self.actionClose_other_tabs.setObjectName("actionClose_other_tabs")
        self.actionClose_all_tabs = QtWidgets.QAction(MainWindow)
        self.actionClose_all_tabs.setIconVisibleInMenu(True)
        self.actionClose_all_tabs.setObjectName("actionClose_all_tabs")
        self.actionQuit = QtWidgets.QAction(MainWindow)
        icon5 = QtGui.QIcon()
        icon5.addPixmap(QtGui.QPixmap(":/icons/close.png"), QtGui.QIcon.Normal,
                        QtGui.QIcon.Off)
        self.actionQuit.setIcon(icon5)
        self.actionQuit.setIconVisibleInMenu(True)
        self.actionQuit.setObjectName("actionQuit")
        self.actionAbout = QtWidgets.QAction(MainWindow)
        icon6 = QtGui.QIcon()
        icon6.addPixmap(QtGui.QPixmap(":/icons/about.png"), QtGui.QIcon.Normal,
                        QtGui.QIcon.Off)
        self.actionAbout.setIcon(icon6)
        self.actionAbout.setIconVisibleInMenu(True)
        self.actionAbout.setObjectName("actionAbout")
        self.menuFile.addAction(self.actionNew)
        self.menuFile.addAction(self.actionOpen)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionSave)
        self.menuFile.addAction(self.actionSave_as)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionQuit)
        self.menu.addAction(self.actionAbout)
        self.menubar.addAction(self.menuFile.menuAction())
        self.menubar.addAction(self.menuEdit.menuAction())
        self.menubar.addAction(self.menuModes.menuAction())
        self.menubar.addAction(self.menuPanels.menuAction())
        self.menubar.addAction(self.menu.menuAction())
        self.toolBar.addAction(self.actionNew)
        self.toolBar.addAction(self.actionOpen)
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.actionSave)
        self.toolBar.addAction(self.actionSave_as)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)