Example #1
0
class Editor(QMainWindow):
    def __init__(self, fileName=None, parent=None):
        super(Editor, self).__init__(parent)
        
        self.setWindowIcon(QIcon(':/images/logo.png'))
        self.setToolButtonStyle(Qt.ToolButtonFollowStyle)
        
        self.textEdit = QTextEdit(self)
        self.commands = Actions(parent=self)
        
        # Setup Menu and Toolbar
        self.setupFileActions()
        self.setupEditActions()
        self.setupFormatActions()
        self.setupI18nActions()
        self.setupHelpActions()
        self.setupNavDock()
        
        self.commands.init()
        
        self.setCentralWidget(self.textEdit)
        self.setWindowModified(self.textEdit.document().isModified())

        QApplication.clipboard().dataChanged.connect(
                self.commands.clipboardDataChanged)
        
        i18n = QSettings()
        if i18n.value("lang").toString() == "zh_CN":
            self.actionChinese.setChecked(True)
        else:
            self.actionEnglish.setChecked(True)

        if fileName is None:
            fileName = ':/example.html'

        if not self.commands.load(fileName):
            self.commands.fileNew()

    def setupFileActions(self):
        tb = QToolBar(self)
        tb.setWindowTitle(self.tr("File Actions"))
        self.addToolBar(tb)
        tb.setIconSize(QSize(48, 48))

        menu = QMenu(self.tr("&File"), self)
        self.menuBar().addMenu(menu)

        self.actionNew = QAction(
                QIcon.fromTheme('document-new',
                        QIcon(':/images/document-new.png')),
                self.tr("&New"), self, priority=QAction.LowPriority,
                shortcut=QKeySequence.New, triggered=self.commands.fileNew)
        tb.addAction(self.actionNew)
        menu.addAction(self.actionNew)

        self.actionOpen = QAction(
                QIcon.fromTheme('document-open',
                        QIcon(':/images/document-open.png')),
                self.tr("&Open..."), self, shortcut=QKeySequence.Open,
                triggered=self.commands.fileOpen)
        tb.addAction(self.actionOpen)
        menu.addAction(self.actionOpen)
        menu.addSeparator()

        self.actionSave = QAction(
                QIcon.fromTheme('document-save',
                        QIcon(':/images/document-save.png')),
                self.tr("&Save"), self, shortcut=QKeySequence.Save,
                triggered=self.commands.fileSave, enabled=self.textEdit.document().isModified())
        tb.addAction(self.actionSave)
        menu.addAction(self.actionSave)

        self.actionSaveAs = QAction(
                QIcon.fromTheme('document-save-as',
                        QIcon(':/images/document-save-as.png')),
                self.tr("Save &As..."), self,
                priority=QAction.LowPriority,
                shortcut=Qt.CTRL + Qt.SHIFT + Qt.Key_S,
                triggered=self.commands.fileSaveAs)
        tb.addAction(self.actionSaveAs)
        menu.addAction(self.actionSaveAs)
        menu.addSeparator()
 
        self.actionPrintPdf = QAction(
                QIcon(':/images/gnome-mime-application-pdf.png'),
                self.tr("&Export PDF..."), self, priority=QAction.LowPriority,
                shortcut=Qt.CTRL + Qt.Key_D,
                triggered=self.commands.filePrintPdf)
        tb.addAction(self.actionPrintPdf)
        menu.addAction(self.actionPrintPdf)
        menu.addSeparator()

        self.actionQuit = QAction(self.tr("&Quit"), self,
                shortcut=QKeySequence.Quit, triggered=self.close)
        menu.addAction(self.actionQuit)

    def setupEditActions(self):
        tb = QToolBar(self)
        tb.setWindowTitle(self.tr("Edit Actions"))
        self.addToolBar(tb)
        tb.setIconSize(QSize(48, 48))

        menu = QMenu(self.tr("&Edit"), self)
        self.menuBar().addMenu(menu)

        self.actionUndo = QAction(
                QIcon.fromTheme('edit-undo',
                        QIcon(':/images/edit-undo.png')),
                self.tr("&Undo"), self, shortcut=QKeySequence.Undo, 
                triggered=self.textEdit.undo, 
                enabled=self.textEdit.document().isUndoAvailable())
        tb.addAction(self.actionUndo)
        menu.addAction(self.actionUndo)

        self.actionRedo = QAction(
                QIcon.fromTheme('edit-redo',
                        QIcon(':/images/edit-redo.png')),
                self.tr("&Redo"), self, priority=QAction.LowPriority,
                shortcut=QKeySequence.Redo, triggered=self.textEdit.redo, 
                enabled=self.textEdit.document().isRedoAvailable())
        tb.addAction(self.actionRedo)
        tb.addSeparator()
        menu.addAction(self.actionRedo)
        menu.addSeparator()

        self.actionCut = QAction(
                QIcon.fromTheme('edit-cut',
                        QIcon(':/images/edit-cut.png')),
                self.tr("Cu&t"), self, priority=QAction.LowPriority,
                shortcut=QKeySequence.Cut, triggered=self.textEdit.cut, 
                enabled=False)
        tb.addAction(self.actionCut)
        menu.addAction(self.actionCut)

        self.actionCopy = QAction(
                QIcon.fromTheme('edit-copy',
                        QIcon(':/images/edit-copy.png')),
                self.tr("&Copy"), self, priority=QAction.LowPriority,
                shortcut=QKeySequence.Copy, triggered=self.textEdit.copy, 
                enabled=False)
        tb.addAction(self.actionCopy)
        menu.addAction(self.actionCopy)

        self.actionPaste = QAction(
                QIcon.fromTheme('edit-paste',
                        QIcon(':/images/edit-paste.png')),
                self.tr("&Paste"), self, priority=QAction.LowPriority,
                shortcut=QKeySequence.Paste, triggered=self.textEdit.paste, 
                enabled=(len(QApplication.clipboard().text()) != 0))
        tb.addAction(self.actionPaste)
        tb.addSeparator()
        menu.addAction(self.actionPaste)
        menu.addSeparator()
        
        self.actionInsertImage = QAction(
                QIcon.fromTheme('insert-image',
                        QIcon(':/images/insert-image.png')),
                self.tr("&Insert Image"), self, priority=QAction.LowPriority,
                shortcut=Qt.CTRL + Qt.Key_I,
                triggered=self.commands.insertImage)
        tb.addAction(self.actionInsertImage)
        menu.addAction(self.actionInsertImage)

    def setupFormatActions(self):
        tb = QToolBar(self)
        tb.setWindowTitle(self.tr("Format Actions"))
        self.addToolBarBreak(Qt.TopToolBarArea)
        self.addToolBar(tb)
        tb.setIconSize(QSize(48, 48))

        menu = QMenu(self.tr("F&ormat"), self)
        self.menuBar().addMenu(menu)

        self.actionTextBold = QAction(
                QIcon.fromTheme('format-text-bold',
                        QIcon(':/images/format-text-bold.png')),
                self.tr("&Bold"), self, priority=QAction.LowPriority,
                shortcut=Qt.CTRL + Qt.Key_B,
                triggered=self.commands.textBold, checkable=True)
        bold = QFont()
        bold.setBold(True)
        self.actionTextBold.setFont(bold)
        tb.addAction(self.actionTextBold)
        menu.addAction(self.actionTextBold)

        self.actionTextItalic = QAction(
                QIcon.fromTheme('format-text-italic',
                        QIcon(':/images/format-text-italic.png')),
                self.tr("&Italic"), self, priority=QAction.LowPriority,
                shortcut=Qt.CTRL + Qt.Key_I,
                triggered=self.commands.textItalic, checkable=True)
        italic = QFont()
        italic.setItalic(True)
        self.actionTextItalic.setFont(italic)
        tb.addAction(self.actionTextItalic)
        menu.addAction(self.actionTextItalic)

        self.actionTextUnderline = QAction(
                QIcon.fromTheme('format-text-underline',
                        QIcon(':/images/format-text-underline.png')),
                self.tr("&Underline"), self, priority=QAction.LowPriority,
                shortcut=Qt.CTRL + Qt.Key_U,
                triggered=self.commands.textUnderline, checkable=True)
        underline = QFont()
        underline.setUnderline(True)
        self.actionTextUnderline.setFont(underline)
        tb.addAction(self.actionTextUnderline)
        menu.addAction(self.actionTextUnderline)

        menu.addSeparator()
        tb.addSeparator()

        grp = QActionGroup(self, triggered=self.commands.textAlign)

        self.actionAlignLeft = QAction(
                QIcon.fromTheme('format-justify-left',
                        QIcon(':/images/format-justify-left.png')),
                self.tr("&Left"), grp)
        self.actionAlignCenter = QAction(
                QIcon.fromTheme('format-justify-center',
                        QIcon(':/images/format-justify-center.png')),
                self.tr("C&enter"), grp)
        self.actionAlignRight = QAction(
                QIcon.fromTheme('format-justify-right',
                        QIcon(':/images/format-justify-right.png')),
                self.tr("&Right"), grp)
        self.actionAlignJustify = QAction(
                QIcon.fromTheme('format-justify-fill',
                        QIcon(':/images/format-justify-fill.png')),
                self.tr("&Justify"), grp)

        self.actionAlignLeft.setShortcut(Qt.CTRL + Qt.Key_L)
        self.actionAlignLeft.setCheckable(True)
        self.actionAlignLeft.setPriority(QAction.LowPriority)

        self.actionAlignCenter.setShortcut(Qt.CTRL + Qt.Key_E)
        self.actionAlignCenter.setCheckable(True)
        self.actionAlignCenter.setPriority(QAction.LowPriority)

        self.actionAlignRight.setShortcut(Qt.CTRL + Qt.Key_R)
        self.actionAlignRight.setCheckable(True)
        self.actionAlignRight.setPriority(QAction.LowPriority)

        self.actionAlignJustify.setShortcut(Qt.CTRL + Qt.Key_J)
        self.actionAlignJustify.setCheckable(True)
        self.actionAlignJustify.setPriority(QAction.LowPriority)

        tb.addActions(grp.actions())
        tb.addSeparator()
        menu.addActions(grp.actions())
        menu.addSeparator()

        pix = QPixmap(32, 32)
        pix.fill(Qt.black)
        self.actionTextColor = QAction(QIcon(pix), self.tr("&Color..."),
                self, triggered=self.commands.textColor)
        tb.addAction(self.actionTextColor)
        menu.addAction(self.actionTextColor)

        tb = QToolBar(self)
        tb.setAllowedAreas(
                Qt.TopToolBarArea | Qt.BottomToolBarArea)
        tb.setWindowTitle(self.tr("Font & Paragraph Actions"))
        self.addToolBarBreak(Qt.TopToolBarArea)
        self.addToolBar(tb)

        comboStyle = QComboBox(tb)
        tb.addWidget(comboStyle)
        comboStyle.addItem(self.tr("Normal Text"))
        comboStyle.addItem(self.tr("Title 1"))
        comboStyle.addItem(self.tr("Title 2"))
        comboStyle.addItem(self.tr("Title 3"))
        comboStyle.activated.connect(self.commands.textStyle)

        self.comboFont = QFontComboBox(tb)
        tb.addWidget(self.comboFont)
        self.comboFont.activated[str].connect(self.commands.textFamily)

        self.comboSize = QComboBox(tb)
        self.comboSize.setObjectName("comboSize")
        tb.addWidget(self.comboSize)
        self.comboSize.setEditable(True)

        db = QFontDatabase()
        for size in db.standardSizes():
            self.comboSize.addItem("%s" % (size))

        self.comboSize.activated[str].connect(self.commands.textSize)
        self.comboSize.setCurrentIndex(
                self.comboSize.findText(
                        "%s" % (QApplication.font().pointSize())))

    def setupHelpActions(self):
        helpMenu = QMenu(self.tr("Help"), self)
        self.menuBar().addMenu(helpMenu)
        helpMenu.addAction(self.tr("About"), self.commands.about)
        helpMenu.addAction(self.tr("About &Qt"), qApp.aboutQt)
    
    def setupI18nActions(self):
        
        menu = QMenu(self.tr("&Language"), self)
        self.menuBar().addMenu(menu)
        
        grp = QActionGroup(self, triggered=self.commands.language)
        
        self.actionEnglish = QAction(
                QIcon.fromTheme('flag-us',
                        QIcon(':/images/flag-us.png')),
                self.tr("&English"), grp)
        self.actionChinese = QAction(
                QIcon.fromTheme('flag-cn',
                        QIcon(':/images/flag-cn.png')),
                self.tr("&Chinese"), grp)
        self.actionEnglish.setCheckable(True)
        self.actionEnglish.setPriority(QAction.LowPriority)
        self.actionChinese.setCheckable(True)
        self.actionChinese.setPriority(QAction.LowPriority)
        
        menu.addActions(grp.actions())
        
    def setupNavDock(self):
        navDockWidget = QDockWidget(self.tr("Navigation"), self)
        navDockWidget.setObjectName("LogDockWidget")
        navDockWidget.setAllowedAreas(Qt.LeftDockWidgetArea|
                                      Qt.RightDockWidgetArea)
        
        self.printer = QPrinter(QPrinter.ScreenResolution)
        self.navWidget = QPrintPreviewWidget(self.printer)
        self.navWidget.paintRequested.connect(self.commands.printPreview)
        
        navDockWidget.setWidget(self.navWidget)
        self.addDockWidget(Qt.RightDockWidgetArea, navDockWidget)