Created
April 28, 2015 15:53
-
-
Save max107/a08065b79374f7f426d5 to your computer and use it in GitHub Desktop.
Modified files
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
""" | |
This module contains the main window implementation. | |
""" | |
from __future__ import print_function | |
# from future.builtins import super | |
import mimetypes | |
import os | |
from pyqode.qt import QtCore | |
from pyqode.qt import QtWidgets | |
from pyqode.core import api | |
from pyqode.core import modes | |
from pyqode.core import widgets | |
from .forms.main_window_ui import Ui_MainWindow | |
from pyqode.core.api import ColorScheme | |
from pyqode.core.widgets import FileSystemTreeView, FileSystemContextMenu, SplittableCodeEditTabWidget | |
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): | |
def __init__(self): | |
super(MainWindow, self).__init__() | |
# Load our UI (made in Qt Designer) | |
self.setupUi(self) | |
self.setup_recent_files_menu() | |
self.setup_treeview() | |
self.setup_actions() | |
self.setup_mimetypes() | |
self.setup_status_bar_widgets() | |
self.on_current_tab_changed(None) | |
self.styles_group = None | |
@QtCore.Slot(str) | |
def on_tree_view_activated(self, index): | |
path = self.tree_view.filePath(index) | |
if os.path.isfile(path): | |
self.open_file(path) | |
def setup_treeview(self): | |
self.splitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal, self) | |
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.tabWidget.dirty_changed.connect(self.actionSave.setEnabled) | |
self.tree_view = FileSystemTreeView() | |
self.tree_view.set_context_menu(FileSystemContextMenu()) | |
self.tree_view.activated.connect(self.on_tree_view_activated) | |
path = os.path.join(os.getcwd()) | |
self.tree_view.set_root_path(path) | |
# tv.show() | |
# self.gridLayout.addWidget(self.tree_view, 0, 0) | |
self.splitter.addWidget(self.tree_view) | |
self.splitter.addWidget(self.tabWidget) | |
self.splitter.setSizes([20, 180]) | |
self.gridLayout.addWidget(self.splitter, 0, 1, 1, 1) | |
def setup_status_bar_widgets(self): | |
self.lbl_filename = QtWidgets.QLabel() | |
self.lbl_encoding = QtWidgets.QLabel() | |
self.lbl_cursor_pos = QtWidgets.QLabel() | |
self.statusbar.addPermanentWidget(self.lbl_filename, 200) | |
self.statusbar.addPermanentWidget(self.lbl_encoding, 20) | |
self.statusbar.addPermanentWidget(self.lbl_cursor_pos, 20) | |
def setup_actions(self): | |
""" Connects slots to signals """ | |
self.actionOpen.triggered.connect(self.on_open) | |
self.actionNew.triggered.connect(self.on_new) | |
self.actionSave.triggered.connect(self.on_save) | |
self.actionSave_as.triggered.connect(self.on_save_as) | |
self.actionQuit.triggered.connect(QtWidgets.QApplication.instance().quit) | |
self.tabWidget.current_changed.connect( | |
self.on_current_tab_changed) | |
self.actionAbout.triggered.connect(self.on_about) | |
def setup_recent_files_menu(self): | |
""" Setup the recent files menu and manager """ | |
self.recent_files_manager = widgets.RecentFilesManager( | |
'pyQode', 'notepad') | |
self.menu_recents = widgets.MenuRecentFiles( | |
self.menuFile, title='Recents', | |
recent_files_manager=self.recent_files_manager) | |
self.menu_recents.open_requested.connect(self.open_file) | |
self.menuFile.insertMenu(self.actionSave, self.menu_recents) | |
self.menuFile.insertSeparator(self.actionSave) | |
def setup_mimetypes(self): | |
""" Setup additional mime types. """ | |
# setup some specific mimetypes | |
mimetypes.add_type('text/xml', '.ui') # qt designer forms forms | |
mimetypes.add_type('text/x-rst', '.rst') # rst docs | |
mimetypes.add_type('text/x-cython', '.pyx') # cython impl files | |
mimetypes.add_type('text/x-cython', '.pxd') # cython def files | |
mimetypes.add_type('text/x-python', '.py') | |
mimetypes.add_type('text/x-python', '.pyw') | |
mimetypes.add_type('text/x-c', '.c') | |
mimetypes.add_type('text/x-c', '.h') | |
mimetypes.add_type('text/x-c++hdr', '.hpp') | |
mimetypes.add_type('text/x-c++src', '.cpp') | |
mimetypes.add_type('text/x-c++src', '.cxx') | |
# cobol files | |
for ext in ['.cbl', '.cob', '.cpy']: | |
mimetypes.add_type('text/x-cobol', ext) | |
mimetypes.add_type('text/x-cobol', ext.upper()) | |
def setup_mnu_edit(self, editor): | |
self.menuEdit.addActions(editor.actions()) | |
self.menuEdit.addSeparator() | |
self.setup_mnu_style(editor) | |
def setup_mnu_modes(self, editor): | |
for mode in editor.modes: | |
a = QtWidgets.QAction(self.menuModes) | |
a.setText(mode.name) | |
a.setCheckable(True) | |
a.setChecked(True) | |
a.changed.connect(self.on_mode_state_changed) | |
a.mode = mode | |
self.menuModes.addAction(a) | |
def setup_mnu_panels(self, editor): | |
for panel in editor.panels: | |
a = QtWidgets.QAction(self.menuModes) | |
a.setText(panel.name) | |
a.setCheckable(True) | |
a.setChecked(True) | |
a.changed.connect(self.on_panel_state_changed) | |
a.panel = panel | |
self.menuPanels.addAction(a) | |
def setup_mnu_style(self, editor): | |
""" setup the style menu for an editor tab """ | |
menu = QtWidgets.QMenu('Styles', self.menuEdit) | |
group = QtWidgets.QActionGroup(self) | |
self.styles_group = group | |
current_style = editor.syntax_highlighter.color_scheme.name | |
group.triggered.connect(self.on_style_changed) | |
for s in sorted(modes.PYGMENTS_STYLES): | |
a = QtWidgets.QAction(menu) | |
a.setText(s) | |
a.setCheckable(True) | |
if s == current_style: | |
a.setChecked(True) | |
group.addAction(a) | |
menu.addAction(a) | |
self.menuEdit.addMenu(menu) | |
def closeEvent(self, QCloseEvent): | |
""" | |
Delegates the close event to the tabWidget to be sure we do not quit | |
the application while there are some still some unsaved tabs. | |
""" | |
self.tabWidget.closeEvent(QCloseEvent) | |
@QtCore.Slot(str) | |
def open_file(self, path): | |
""" | |
Creates a new GenericCodeEdit, opens the requested file and adds it | |
to the tab widget. | |
:param path: Path of the file to open | |
""" | |
if path: | |
editor = self.tabWidget.open_document(path) | |
editor.font_name = "Monaco" | |
editor.font_size = 13 | |
editor.cursorPositionChanged.connect( | |
self.on_cursor_pos_changed) | |
self.recent_files_manager.open_file(path) | |
self.menu_recents.update_actions() | |
@QtCore.Slot() | |
def on_new(self): | |
""" | |
Add a new empty code editor to the tab widget | |
""" | |
editor = self.tabWidget.create_new_document() | |
editor.font_name = "Monaco" | |
editor.font_size = 13 | |
editor.cursorPositionChanged.connect(self.on_cursor_pos_changed) | |
self.refresh_color_scheme() | |
@QtCore.Slot() | |
def on_open(self): | |
""" | |
Shows an open file dialog and open the file if the dialog was | |
accepted. | |
""" | |
filename, filter = QtWidgets.QFileDialog.getOpenFileName(self, 'Open') | |
if filename: | |
self.open_file(filename) | |
@QtCore.Slot() | |
def on_save(self): | |
self.tabWidget.save_current() | |
self._update_status_bar(self.tabWidget.current_widget()) | |
@QtCore.Slot() | |
def on_save_as(self): | |
""" | |
Save the current editor document as. | |
""" | |
self.tabWidget.save_current_as() | |
self._update_status_bar(self.tabWidget.current_widget()) | |
@QtCore.Slot(QtWidgets.QWidget) | |
def on_current_tab_changed(self, editor): | |
self.menuEdit.clear() | |
self.menuModes.clear() | |
self.menuPanels.clear() | |
self.menuEdit.setEnabled(editor is not None) | |
self.menuModes.setEnabled(editor is not None) | |
self.menuPanels.setEnabled(editor is not None) | |
self.actionSave.setEnabled(editor is not None) | |
self.actionSave_as.setEnabled(editor is not None) | |
self.actionClose_tab.setEnabled(editor is not None) | |
self.actionClose_all_tabs.setEnabled(editor is not None) | |
self.actionClose_other_tabs.setEnabled( | |
editor is not None and self.tabWidget.count() > 1) | |
if editor: | |
self.setup_mnu_edit(editor) | |
self.setup_mnu_modes(editor) | |
self.setup_mnu_panels(editor) | |
self._update_status_bar(editor) | |
def _update_status_bar(self, editor): | |
if editor: | |
l, c = api.TextHelper(editor).cursor_position() | |
self.lbl_cursor_pos.setText( | |
'%d:%d' % (l + 1, c + 1)) | |
self.lbl_encoding.setText(editor.file.encoding) | |
self.lbl_filename.setText(editor.file.path) | |
else: | |
self.lbl_cursor_pos.clear() | |
self.lbl_encoding.clear() | |
self.lbl_filename.clear() | |
def refresh_color_scheme(self): | |
if self.styles_group and self.styles_group.checkedAction(): | |
style = self.styles_group.checkedAction().text() | |
style = style.replace('&', '') # qt5 bug on kde? | |
else: | |
style = 'qt' | |
for editor in self.tabWidget.widgets(): | |
editor.syntax_highlighter.color_scheme = ColorScheme(style) | |
editor.modes.get(modes.CaretLineHighlighterMode).refresh() | |
@QtCore.Slot(QtWidgets.QAction) | |
def on_style_changed(self, action): | |
self.pygments_style = action.text() | |
self.refresh_color_scheme() | |
@QtCore.Slot() | |
def on_panel_state_changed(self): | |
action = self.sender() | |
action.panel.enabled = action.isChecked() | |
action.panel.setVisible(action.isChecked()) | |
@QtCore.Slot() | |
def on_mode_state_changed(self): | |
action = self.sender() | |
action.mode.enabled = action.isChecked() | |
@QtCore.Slot() | |
def on_about(self): | |
QtWidgets.QMessageBox.about( | |
self, 'pyQode notepad', | |
'This notepad application is an example of what you can do with ' | |
'pyqode.core.') | |
@QtCore.Slot() | |
def on_cursor_pos_changed(self): | |
if self.tabWidget.current_widget(): | |
editor = self.tabWidget.current_widget() | |
l, c = api.TextHelper(editor).cursor_position() | |
self.lbl_cursor_pos.setText( | |
'%d:%d' % (l + 1, c + 1)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
# Form implementation generated from reading ui file '/home/colin/dev/pyqode/core/examples/notepad/forms/main_window.ui' | |
# | |
# Created: Mon Nov 17 08:48:01 2014 | |
# by: PyQt5 UI code generator 5.3.2 | |
# | |
# WARNING! All changes made in this file will be lost! | |
from pyqode.qt import QtCore, QtGui, QtWidgets | |
class Ui_MainWindow(object): | |
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") | |
MainWindow.setCentralWidget(self.centralwidget) | |
self.menubar = QtWidgets.QMenuBar(MainWindow) | |
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 25)) | |
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.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) | |
def retranslateUi(self, MainWindow): | |
_translate = QtCore.QCoreApplication.translate | |
MainWindow.setWindowTitle(_translate("MainWindow", "notepad")) | |
self.menuFile.setTitle(_translate("MainWindow", "File")) | |
self.menuEdit.setTitle(_translate("MainWindow", "Edit")) | |
self.menuModes.setTitle(_translate("MainWindow", "Modes")) | |
self.menuPanels.setTitle(_translate("MainWindow", "Panels")) | |
self.menu.setTitle(_translate("MainWindow", "?")) | |
self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar")) | |
self.actionNew.setText(_translate("MainWindow", "New")) | |
self.actionNew.setShortcut(_translate("MainWindow", "Ctrl+N")) | |
self.actionOpen.setText(_translate("MainWindow", "Open")) | |
self.actionOpen.setShortcut(_translate("MainWindow", "Ctrl+O")) | |
self.actionSave.setText(_translate("MainWindow", "Save")) | |
self.actionSave.setShortcut(_translate("MainWindow", "Ctrl+S")) | |
self.actionSave_as.setText(_translate("MainWindow", "Save as")) | |
self.actionSave_as.setShortcut(_translate("MainWindow", "Ctrl+Shift+S")) | |
self.actionClose_tab.setText(_translate("MainWindow", "Close tab")) | |
self.actionClose_other_tabs.setText(_translate("MainWindow", "Close other tabs")) | |
self.actionClose_all_tabs.setText(_translate("MainWindow", "Close all tabs")) | |
self.actionQuit.setText(_translate("MainWindow", "Quit")) | |
self.actionQuit.setShortcut(_translate("MainWindow", "Ctrl+Q")) | |
self.actionAbout.setText(_translate("MainWindow", "About")) | |
self.actionAbout.setShortcut(_translate("MainWindow", "F1")) | |
from pyqode.core.widgets import SplittableCodeEditTabWidget | |
from . import resources_rc |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment