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)
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)
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)
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)
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 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)
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)