Warning, /utilities/skanpage/src/qml/MainWindow.qml is written in an unsupported language. File is not indexed.

0001 /**
0002  * SPDX-FileCopyrightText: 2015 by Kåre Särs <kare.sars@iki .fi>
0003  * SPDX-FileCopyrightText: 2021 by Alexander Stippich <a.stippich@gmx.net>
0004  *
0005  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0006  */
0007 
0008 import QtQuick
0009 import QtQuick.Controls
0010 import QtQuick.Layouts
0011 import QtQuick.Window
0012 import QtQuick.Dialogs
0013 
0014 import org.kde.kirigami as Kirigami
0015 
0016 import org.kde.skanpage
0017 
0018 ApplicationWindow {
0019     id: mainWindow
0020 
0021     visible: true
0022 
0023     title: i18nc("document title: app title", "%1 ― Skanpage", mainView.name)
0024     color: Kirigami.Theme.backgroundColor
0025 
0026     width: skanpage.stateConfiguration.width
0027     height: skanpage.stateConfiguration.height
0028     x: skanpage.stateConfiguration.x
0029     y: skanpage.stateConfiguration.y
0030 
0031     minimumWidth: mainToolBar.implicitWidth
0032     minimumHeight: 400
0033 
0034     Connections {
0035         target: Qt.application
0036 
0037         function onAboutToQuit() {
0038             skanpage.stateConfiguration.x = mainWindow.x
0039             skanpage.stateConfiguration.y = mainWindow.y
0040             skanpage.stateConfiguration.width = mainWindow.width
0041             skanpage.stateConfiguration.height = mainWindow.height
0042             skanpage.stateConfiguration.splitViewItemWidth = mainView.splitViewItemWidth
0043             skanpage.stateConfiguration.showOptions = mainView.showOptions
0044             skanpage.stateConfiguration.showAllOptions = mainView.optionsPanel.allOptionsAction.checked
0045             skanpage.stateConfiguration.shareHeight = shareWindow.height
0046             skanpage.stateConfiguration.shareWidth = shareWindow.width
0047             skanpage.stateConfiguration.exportHeight = exportWindow.height
0048             skanpage.stateConfiguration.exportWidth = exportWindow.width
0049             skanpage.stateConfiguration.settingsHeight = settingsWindow.height
0050             skanpage.stateConfiguration.settingsWidth = settingsWindow.width
0051         }
0052     }
0053 
0054     Connections {
0055         target: skanpage
0056 
0057         function onNewUserMessage(level, message) {
0058             errorMessage.text = message
0059             if (level === SkanpageUtils.ErrorMessage) {
0060                 errorMessage.type = Kirigami.MessageType.Error
0061             } else {
0062                 errorMessage.type = Kirigami.MessageType.Information
0063             }
0064             labelWidth.text = message
0065             errorMessage.visible = true
0066             hideNotificationTimer.start()
0067         }
0068 
0069         function onApplicationStateChanged(state) {
0070             if (state === Skanpage.SearchingForDevices) {
0071                 stackView.push(devicesLoading)
0072             } else if (state === Skanpage.DeviceSelection) {
0073                 stackView.replace(deviceSelection)
0074             } else if (state === Skanpage.ReadyForScan) {
0075                 while(stackView.depth > 1) {
0076                     stackView.pop()
0077                 }
0078             }
0079         }
0080     }
0081 
0082     ShortcutsAction {
0083         id: newDocAction
0084         icon.name: "edit-delete-remove"
0085         text: i18n("Discard All")
0086         shortcutsName: "New"
0087         enabled: skanpage.documentModel.count !== 0
0088         onTriggered: skanpage.documentModel.clearData()
0089     }
0090 
0091     ShortcutsAction {
0092         id: saveDocAction
0093         icon.name: "document-save"
0094         text: i18n("Save All")
0095         shortcutsName: "Save"
0096         enabled: skanpage.documentModel.count !== 0
0097         onTriggered: saveFileDialog.open()
0098     }
0099     
0100     ShortcutsAction {
0101         id: exportDocAction
0102         icon.name: "document-save"
0103         text: i18n("Export PDF")
0104         enabled: skanpage.documentModel.count !== 0
0105         onTriggered: exportWindow.show()
0106     }
0107 
0108     ShortcutsAction {
0109         id: previewAction
0110         icon.name: "document-preview"
0111         text: i18n("Preview")
0112         shortcut: "P"
0113         enabled: skanpage.applicationState === Skanpage.ReadyForScan
0114         onTriggered: {
0115             mainView.activeDocument.showPreview = true
0116             skanpage.preview()
0117         }
0118     }
0119 
0120     ShortcutsAction {
0121         id: scanAction
0122         icon.name: "document-scan"
0123         text: i18n("Scan")
0124         shortcut: "SPACE"
0125         enabled: skanpage.applicationState === Skanpage.ReadyForScan
0126         onTriggered: {
0127             mainView.activeDocument.showPreview = false
0128             skanpage.scanArea = mainView.activeDocument.getScanArea()
0129             skanpage.startScan()
0130         }
0131     }
0132 
0133     Action {
0134         id: cancelAction
0135         icon.name: "dialog-cancel"
0136         text: i18n("Cancel")
0137         shortcut: "Esc"
0138         enabled: skanpage.applicationState === Skanpage.ScanInProgress
0139         onTriggered: skanpage.cancelScan()
0140     }
0141 
0142     ShortcutsAction {
0143         id: showOptionsAction
0144         icon.name: "configure"
0145         text: i18n("Show Scanner Options")
0146         shortcut: "CTRL+O"
0147         checkable: true
0148         checked: mainView.showOptions
0149         onTriggered: mainView.showOptions = !mainView.showOptions
0150     }
0151 
0152     ShortcutsAction {
0153         id: shareAction
0154         icon.name: "document-share"
0155         text: i18n("Share")
0156         enabled: skanpage.documentModel.count !== 0
0157         onTriggered: shareWindow.show()
0158     }
0159 
0160     ShortcutsAction {
0161         id: printAction
0162         icon.name: "document-print"
0163         text: i18n("Print")
0164         shortcutsName: "Print"
0165         enabled: skanpage.documentModel.count !== 0
0166         onTriggered: skanpage.print()
0167     }
0168 
0169     Action {
0170         id: openMenuAction
0171         icon.name: "application-menu"
0172         onTriggered: {
0173             if (applicationMenu.visible) {
0174                 applicationMenu.close()
0175             } else {
0176                 applicationMenu.popup(mainWindow.width - applicationMenu.width, mainToolBar.height)
0177             }
0178         }
0179     }
0180 
0181     ShortcutsAction {
0182         id: showAboutAction
0183         icon.name: "skanpage"
0184         text: i18n("About Skanpage")
0185         onTriggered: aboutWindow.show()
0186     }
0187 
0188     ShortcutsAction {
0189         id: settingsAction
0190         icon.name: "settings-configure"
0191         text: i18n("Configure Skanpage…")
0192         shortcutsName: "Preferences"
0193         onTriggered: settingsWindow.show()
0194     }
0195 
0196     ShortcutsAction {
0197         id: shortcutSettingsAction
0198         icon.name: "configure-shortcuts"
0199         text: i18n("Configure Keyboard Shortcuts…")
0200         shortcutsName: "KeyBindings"
0201         onTriggered: skanpage.showShortcutsDialog()
0202     }
0203     
0204     ShortcutsAction {
0205         id: quitAction
0206         icon.name: "window-close"
0207         text: i18n("Quit")
0208         shortcutsName: "Quit"
0209         onTriggered: Qt.quit()
0210     }
0211 
0212     Kirigami.InlineMessage {
0213         id: errorMessage
0214         width: labelWidth.width + Kirigami.Units.iconSizes.medium + Kirigami.Units.largeSpacing * 2
0215         height: Math.max(labelWidth.height, Kirigami.Units.iconSizes.medium) + Kirigami.Units.largeSpacing
0216         z: 2
0217 
0218         anchors {
0219             top: parent.top
0220             topMargin: mainToolBar.height + Kirigami.Units.largeSpacing
0221             horizontalCenter: parent.horizontalCenter
0222         }
0223 
0224         Timer {
0225             id: hideNotificationTimer
0226             interval: 5000
0227             onTriggered: errorMessage.visible = false
0228         }
0229 
0230         TextMetrics {
0231             id: labelWidth
0232         }
0233     }
0234 
0235     ColumnLayout {
0236         id: mainLayout
0237         anchors.fill: parent
0238 
0239         spacing: 0
0240 
0241         ToolBar {
0242             id: mainToolBar
0243             Layout.fillWidth: true
0244 
0245             RowLayout {
0246                 id: toolbarRow
0247                 anchors.fill: parent
0248                 spacing: 0
0249 
0250                 Item {
0251 
0252                     implicitWidth: Math.max(children[0].implicitWidth, children[1].implicitWidth)
0253                     implicitHeight: Math.max(children[0].implicitHeight, children[1].implicitHeight)
0254 
0255                     Row {
0256                         visible: skanpage.applicationState !== Skanpage.ScanInProgress
0257 
0258                         ToolButton {
0259                             action: previewAction
0260                         }
0261 
0262                         ToolButton {
0263                             action: scanAction
0264                         }
0265                     }
0266 
0267                     ToolButton {
0268                         anchors.fill: parent
0269                         action: cancelAction
0270                         visible: skanpage.applicationState === Skanpage.ScanInProgress
0271                     }
0272                 }
0273 
0274                 ToolButton {
0275                     action: saveDocAction
0276                 }
0277       
0278                 ToolButton {
0279                     action: exportDocAction 
0280                 }
0281 
0282                 ToolButton {
0283                     action: newDocAction
0284                 }
0285 
0286                 ToolButton {
0287                     action: shareAction
0288                 }
0289 
0290                 ToolButton {
0291                     action: printAction
0292                 }
0293 
0294                 Item {
0295                     id: toolbarSpacer
0296                     Layout.fillWidth: true
0297                 }
0298 
0299                 ToolButton {
0300                     action: showOptionsAction
0301                     visible: skanpage.applicationState === Skanpage.ReadyForScan || skanpage.applicationState === Skanpage.ScanInProgress
0302                 }
0303 
0304                 ToolButton {
0305                     action: openMenuAction
0306                 }
0307             }
0308         }
0309 
0310         Menu {
0311             id: applicationMenu
0312 
0313             MenuItem {
0314                 action: settingsAction
0315             }
0316 
0317             MenuItem {
0318                 action: shortcutSettingsAction
0319             }
0320 
0321             MenuItem {
0322                 action: showAboutAction
0323             }
0324         }
0325 
0326         StackView {
0327             id: stackView
0328             
0329             Layout.fillWidth: true
0330             Layout.fillHeight: true
0331             
0332             initialItem: ContentView {
0333                 id: mainView
0334 
0335                 showOptions: skanpage.stateConfiguration.showOptions
0336                 splitViewPreferredWidth: skanpage.stateConfiguration.splitViewItemWidth
0337                 focus: true
0338 
0339                 onSaveSinglePage: {
0340                     saveFileDialog.pageNumbers.push(pageNumber)
0341                     saveFileDialog.open()
0342                 }
0343             }
0344         }
0345     }
0346 
0347     Component {
0348         id: deviceSelection
0349 
0350         DeviceSelection {
0351             focus: true
0352         }
0353     }
0354 
0355     Component {
0356         id: devicesLoading
0357 
0358         DevicesLoading {
0359 
0360         }
0361     }
0362 
0363     ShareWindow {
0364         id: shareWindow
0365 
0366         height: skanpage.stateConfiguration.shareHeight
0367         width: skanpage.stateConfiguration.shareWidth
0368 
0369         onError: {
0370             errorMessage.text = errorText
0371             errorMessage.type = Kirigami.MessageType.Error
0372             labelWidth.text = message
0373             errorMessage.visible = true
0374             hideNotificationTimer.start()
0375         }
0376     }
0377 
0378     Window {
0379         id: aboutWindow
0380 
0381         title: i18n("About Skanpage")
0382         color: Kirigami.Theme.backgroundColor
0383 
0384         flags: Qt.Dialog | Qt.CustomizeWindowHint | Qt.WindowTitleHint
0385             | Qt.WindowCloseButtonHint | Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint
0386 
0387         minimumWidth: 600
0388         minimumHeight: 500
0389 
0390         Kirigami.AboutItem {
0391             aboutData: _aboutData
0392             anchors.fill: parent
0393         }
0394 
0395         Shortcut {
0396             sequence: "Esc"
0397             onActivated: aboutWindow.close()
0398         }
0399     }
0400 
0401     FileDialog {
0402         id: saveFileDialog
0403 
0404         property var pageNumbers: []
0405 
0406         currentFolder: skanpage.configuration.defaultFolder
0407         fileMode: FileDialog.SaveFile
0408         nameFilters: skanpage.formatModel.formatFilter()
0409         selectedNameFilter.index: skanpage.configuration.defaultNameFilterIndex
0410         onAccepted: {
0411             skanpage.documentModel.save(selectedFile, pageNumbers)
0412             pageNumbers = []
0413         }
0414         onRejected: pageNumbers = []
0415     }
0416 
0417     GlobalMenu {
0418        newDocAction: newDocAction
0419        saveDocAction: saveDocAction
0420        previewAction: previewAction
0421        scanAction: scanAction
0422        cancelAction: cancelAction
0423        allOptionsAction: mainView.optionsPanel.allOptionsAction
0424        showOptionsAction: showOptionsAction
0425        printAction: printAction
0426        showAboutAction: showAboutAction
0427        reselectDevicesAction: mainView.optionsPanel.reselectDevicesAction
0428        quitAction: quitAction
0429        shareAction: shareAction
0430     }    
0431 
0432     ExportWindow {
0433         id: exportWindow
0434 
0435         height: skanpage.stateConfiguration.exportHeight
0436         width: skanpage.stateConfiguration.exportWidth
0437     }
0438 
0439     SettingsWindow {
0440         id: settingsWindow
0441         height: skanpage.stateConfiguration.settingsHeight
0442         width: skanpage.stateConfiguration.settingsWidth
0443     }
0444 
0445     Component.onCompleted: {
0446         skanpage.optionsModel.showAllOptions(skanpage.stateConfiguration.showAllOptions)
0447         if (skanpage.applicationState === Skanpage.SearchingForDevices) {
0448             stackView.push(devicesLoading)
0449         } else if (skanpage.applicationState === Skanpage.DeviceSelection) {
0450             stackView.push(deviceSelection)
0451         }
0452     }
0453 }