Skip to content

Instantly share code, notes, and snippets.

@max107
Created April 28, 2015 15:53
Show Gist options
  • Save max107/a08065b79374f7f426d5 to your computer and use it in GitHub Desktop.
Save max107/a08065b79374f7f426d5 to your computer and use it in GitHub Desktop.
Modified files
# -*- 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))
# -*- 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