main.qml Example File

texteditor/qml/main.qml
 /****************************************************************************
 **
 ** Copyright (C) 2016 The Qt Company Ltd.
 ** Contact: https://www.qt.io/licensing/
 **
 ** This file is part of the examples of the Qt Toolkit.
 **
 ** $QT_BEGIN_LICENSE:BSD$
 ** Commercial License Usage
 ** Licensees holding valid commercial Qt licenses may use this file in
 ** accordance with the commercial license agreement provided with the
 ** Software or, alternatively, in accordance with the terms contained in
 ** a written agreement between you and The Qt Company. For licensing terms
 ** and conditions see https://www.qt.io/terms-conditions. For further
 ** information use the contact form at https://www.qt.io/contact-us.
 **
 ** BSD License Usage
 ** Alternatively, you may use this file under the terms of the BSD license
 ** as follows:
 **
 ** "Redistribution and use in source and binary forms, with or without
 ** modification, are permitted provided that the following conditions are
 ** met:
 **   * Redistributions of source code must retain the above copyright
 **     notice, this list of conditions and the following disclaimer.
 **   * Redistributions in binary form must reproduce the above copyright
 **     notice, this list of conditions and the following disclaimer in
 **     the documentation and/or other materials provided with the
 **     distribution.
 **   * Neither the name of The Qt Company Ltd nor the names of its
 **     contributors may be used to endorse or promote products derived
 **     from this software without specific prior written permission.
 **
 **
 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
 **
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/

 import QtQuick 2.2
 import QtQuick.Controls 1.2
 import QtQuick.Layouts 1.0
 import QtQuick.Dialogs 1.1
 import QtQuick.Window 2.1
 import org.qtproject.example 1.0

 ApplicationWindow {
     visible: true
     width: 640
     height: 480
     minimumWidth: 400
     minimumHeight: 300

     title: document.documentTitle + " - Text Editor Example"

     MessageDialog {
         id: aboutBox
         title: "About Text"
         text: "This is a basic text editor \nwritten with Qt Quick Controls"
         icon: StandardIcon.Information
     }

     Action {
         id: cutAction
         text: "Cut"
         shortcut: "ctrl+x"
         iconSource: "images/editcut.png"
         iconName: "edit-cut"
         onTriggered: textArea.cut()
     }

     Action {
         id: copyAction
         text: "Copy"
         shortcut: "Ctrl+C"
         iconSource: "images/editcopy.png"
         iconName: "edit-copy"
         onTriggered: textArea.copy()
     }

     Action {
         id: pasteAction
         text: "Paste"
         shortcut: "ctrl+v"
         iconSource: "images/editpaste.png"
         iconName: "edit-paste"
         onTriggered: textArea.paste()
     }

     Action {
         id: alignLeftAction
         text: "&Left"
         iconSource: "images/textleft.png"
         iconName: "format-justify-left"
         shortcut: "ctrl+l"
         onTriggered: document.alignment = Qt.AlignLeft
         checkable: true
         checked: document.alignment == Qt.AlignLeft
     }
     Action {
         id: alignCenterAction
         text: "C&enter"
         iconSource: "images/textcenter.png"
         iconName: "format-justify-center"
         onTriggered: document.alignment = Qt.AlignHCenter
         checkable: true
         checked: document.alignment == Qt.AlignHCenter
     }
     Action {
         id: alignRightAction
         text: "&Right"
         iconSource: "images/textright.png"
         iconName: "format-justify-right"
         onTriggered: document.alignment = Qt.AlignRight
         checkable: true
         checked: document.alignment == Qt.AlignRight
     }
     Action {
         id: alignJustifyAction
         text: "&Justify"
         iconSource: "images/textjustify.png"
         iconName: "format-justify-fill"
         onTriggered: document.alignment = Qt.AlignJustify
         checkable: true
         checked: document.alignment == Qt.AlignJustify
     }

     Action {
         id: boldAction
         text: "&Bold"
         iconSource: "images/textbold.png"
         iconName: "format-text-bold"
         onTriggered: document.bold = !document.bold
         checkable: true
         checked: document.bold
     }

     Action {
         id: italicAction
         text: "&Italic"
         iconSource: "images/textitalic.png"
         iconName: "format-text-italic"
         onTriggered: document.italic = !document.italic
         checkable: true
         checked: document.italic
     }
     Action {
         id: underlineAction
         text: "&Underline"
         iconSource: "images/textunder.png"
         iconName: "format-text-underline"
         onTriggered: document.underline = !document.underline
         checkable: true
         checked: document.underline
     }

     FileDialog {
         id: fileDialog
         nameFilters: ["Text files (*.txt)", "HTML files (*.html, *.htm)"]
         onAccepted: {
             if (fileDialog.selectExisting)
                 document.fileUrl = fileUrl
             else
                 document.saveAs(fileUrl, selectedNameFilter)
         }
     }

     ColorDialog {
         id: colorDialog
         color: "black"
     }

     Action {
         id: fileOpenAction
         iconSource: "images/fileopen.png"
         iconName: "document-open"
         text: "Open"
         onTriggered: {
             fileDialog.selectExisting = true
             fileDialog.open()
         }
     }

     Action {
         id: fileSaveAsAction
         iconSource: "images/filesave.png"
         iconName: "document-save"
         text: "Save As…"
         onTriggered: {
             fileDialog.selectExisting = false
             fileDialog.open()
         }
     }

     menuBar: MenuBar {
         Menu {
             title: "&File"
             MenuItem { action: fileOpenAction }
             MenuItem { action: fileSaveAsAction }
             MenuItem { text: "Quit"; onTriggered: Qt.quit() }
         }
         Menu {
             title: "&Edit"
             MenuItem { action: copyAction }
             MenuItem { action: cutAction }
             MenuItem { action: pasteAction }
         }
         Menu {
             title: "F&ormat"
             MenuItem { action: boldAction }
             MenuItem { action: italicAction }
             MenuItem { action: underlineAction }
             MenuSeparator {}
             MenuItem { action: alignLeftAction }
             MenuItem { action: alignCenterAction }
             MenuItem { action: alignRightAction }
             MenuItem { action: alignJustifyAction }
             MenuSeparator {}
             MenuItem {
                 text: "&Color ..."
                 onTriggered: {
                     colorDialog.color = document.textColor
                     colorDialog.open()
                 }
             }
         }
         Menu {
             title: "&Help"
             MenuItem { text: "About..." ; onTriggered: aboutBox.open() }
         }
     }

     toolBar: ToolBar {
         id: mainToolBar
         width: parent.width
         RowLayout {
             anchors.fill: parent
             spacing: 0
             ToolButton { action: fileOpenAction }

             ToolBarSeparator {}

             ToolButton { action: copyAction }
             ToolButton { action: cutAction }
             ToolButton { action: pasteAction }

             ToolBarSeparator {}

             ToolButton { action: boldAction }
             ToolButton { action: italicAction }
             ToolButton { action: underlineAction }

             ToolBarSeparator {}

             ToolButton { action: alignLeftAction }
             ToolButton { action: alignCenterAction }
             ToolButton { action: alignRightAction }
             ToolButton { action: alignJustifyAction }

             ToolBarSeparator {}

             ToolButton {
                 id: colorButton
                 property var color : document.textColor
                 Rectangle {
                     id: colorRect
                     anchors.fill: parent
                     anchors.margins: 8
                     color: Qt.darker(document.textColor, colorButton.pressed ? 1.4 : 1)
                     border.width: 1
                     border.color: Qt.darker(colorRect.color, 2)
                 }
                 onClicked: {
                     colorDialog.color = document.textColor
                     colorDialog.open()
                 }
             }
             Item { Layout.fillWidth: true }
         }
     }

     ToolBar {
         id: secondaryToolBar
         width: parent.width

         RowLayout {
             anchors.fill: parent
             ComboBox {
                 id: fontFamilyComboBox
                 implicitWidth: 150
                 model: Qt.fontFamilies()
                 property bool special : false
                 onActivated: {
                     if (special == false || index != 0) {
                         document.fontFamily = textAt(index)
                     }
                 }
             }
             SpinBox {
                 id: fontSizeSpinBox
                 activeFocusOnPress: false
                 implicitWidth: 50
                 value: 0
                 property bool valueGuard: true
                 onValueChanged: if (valueGuard) document.fontSize = value
             }
             Item { Layout.fillWidth: true }
         }
     }

     TextArea {
         Accessible.name: "document"
         id: textArea
         frameVisible: false
         width: parent.width
         anchors.top: secondaryToolBar.bottom
         anchors.bottom: parent.bottom
         baseUrl: "qrc:/"
         text: document.text
         textFormat: Qt.RichText
         Component.onCompleted: forceActiveFocus()
     }

     MessageDialog {
         id: errorDialog
     }

     DocumentHandler {
         id: document
         target: textArea
         cursorPosition: textArea.cursorPosition
         selectionStart: textArea.selectionStart
         selectionEnd: textArea.selectionEnd
         textColor: colorDialog.color
         Component.onCompleted: document.fileUrl = "qrc:/example.html"
         onFontSizeChanged: {
             fontSizeSpinBox.valueGuard = false
             fontSizeSpinBox.value = document.fontSize
             fontSizeSpinBox.valueGuard = true
         }
         onFontFamilyChanged: {
             var index = Qt.fontFamilies().indexOf(document.fontFamily)
             if (index == -1) {
                 fontFamilyComboBox.currentIndex = 0
                 fontFamilyComboBox.special = true
             } else {
                 fontFamilyComboBox.currentIndex = index
                 fontFamilyComboBox.special = false
             }
         }
         onError: {
             errorDialog.text = message
             errorDialog.visible = true
         }
     }
 }