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 }