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 }