Warning, /maui/pix/src/widgets/views/Viewer/PixViewer.qml is written in an unsupported language. File is not indexed.
0001 // Copyright 2018-2020 Camilo Higuita <milo.h@aol.com> 0002 // Copyright 2018-2020 Nitrux Latinoamericana S.C. 0003 // 0004 // SPDX-License-Identifier: GPL-3.0-or-later 0005 0006 import QtQuick 2.13 0007 0008 import QtQuick.Controls 2.13 0009 import QtQuick.Layouts 1.3 0010 import QtQuick.Window 2.13 0011 0012 import org.mauikit.controls 1.3 as Maui 0013 import org.mauikit.filebrowsing 1.3 as FB 0014 import org.mauikit.imagetools 1.3 as IT 0015 import org.kde.kquickimageeditor 1.0 as KQuickImageEditor 0016 0017 import org.maui.pix 1.0 as Pix 0018 0019 import "../../../view_models" 0020 0021 StackView 0022 { 0023 id: control 0024 0025 readonly property alias viewer : viewer 0026 readonly property alias holder : holder 0027 readonly property alias tagBar : tagBar 0028 readonly property alias roll : galleryRoll 0029 readonly property bool editing : control.currentItem.objectName === "imageEditor" 0030 0031 property alias model : viewer.model 0032 0033 property bool currentPicFav: false 0034 property var currentPic : ({}) 0035 property int currentPicIndex : 0 0036 property bool doodle : false 0037 0038 property alias showCSDControls: _viewer.showCSDControls 0039 0040 PixMenu 0041 { 0042 id: _picMenu 0043 index: control.currentPicIndex 0044 model: viewer.model 0045 } 0046 0047 Component 0048 { 0049 id: _editorComponent 0050 0051 IT.ImageEditor 0052 { 0053 objectName: "imageEditor" 0054 url: control.currentPic.url 0055 onGoBackTriggered: control.pop() 0056 0057 headBar.farLeftContent: ToolButton 0058 { 0059 icon.name: "go-previous" 0060 onClicked: 0061 { 0062 control.pop() 0063 } 0064 } 0065 0066 headBar.rightContent: Maui.ToolButtonMenu 0067 { 0068 icon.name: "document-save" 0069 0070 MenuItem 0071 { 0072 text: i18n("Save as") 0073 icon.name: "document-save-as" 0074 onTriggered: 0075 { 0076 dialogLoader.sourceComponent= fmDialogComponent 0077 dialog.mode = dialog.modes.SAVE 0078 dialog.settings.onlyDirs= false 0079 dialog.singleSelection = true 0080 dialog.callback = function(paths) 0081 { 0082 console.log("Save edit to", paths) 0083 editor.saveAs(paths[0]) 0084 }; 0085 dialog.open() 0086 } 0087 } 0088 0089 MenuItem 0090 { 0091 text: i18n("Save") 0092 icon.name: "document-save" 0093 onTriggered: editor.save() 0094 } 0095 } 0096 } 0097 } 0098 0099 initialItem: Maui.Page 0100 { 0101 id: _viewer 0102 0103 padding: 0 0104 title: currentPic.title 0105 showTitle: root.isWide 0106 altHeader: Maui.Handy.isMobile 0107 0108 headBar.visible: true 0109 0110 onGoBackTriggered: _stackView.pop() 0111 0112 headBar.farLeftContent: [ 0113 ToolButton 0114 { 0115 icon.name: "go-previous" 0116 text: i18n("Gallery") 0117 display: ToolButton.TextBesideIcon 0118 onClicked: toggleViewer() 0119 }, 0120 0121 Maui.ToolActions 0122 { 0123 visible: !holder.visible && (!Maui.Handy.isMobile && !Maui.Handy.isTouch && Maui.Platform.hasKeyboard) && control.model.count > 1 //only show footbar control for desktop mode 0124 0125 expanded: true 0126 autoExclusive: false 0127 checkable: false 0128 display: ToolButton.IconOnly 0129 0130 Action 0131 { 0132 text: i18n("Previous") 0133 icon.name: "go-previous" 0134 onTriggered: previous() 0135 } 0136 0137 Action 0138 { 0139 icon.name: "go-next" 0140 onTriggered: next() 0141 } 0142 } 0143 ] 0144 0145 headBar.rightContent: [ 0146 ToolButton 0147 { 0148 icon.name: "love" 0149 checked: control.currentPicFav 0150 onClicked: 0151 { 0152 if(control.currentPicFav) 0153 tagBar.list.removeFromUrls("fav") 0154 else 0155 tagBar.list.insertToUrls("fav") 0156 0157 control.currentPicFav = !control.currentPicFav 0158 } 0159 }, 0160 0161 ToolButton 0162 { 0163 icon.name: "document-share" 0164 onClicked: 0165 { 0166 Maui.Platform.shareFiles([control.currentPic.url]) 0167 } 0168 }, 0169 0170 ToolButton 0171 { 0172 icon.name: "draw-freehand" 0173 onClicked: 0174 { 0175 control.push(_editorComponent) 0176 } 0177 }, 0178 0179 ToolButton 0180 { 0181 visible: Maui.Handy.isLinux 0182 icon.name: "format-text-bold" 0183 onClicked: 0184 { 0185 var component = Qt.createComponent("qrc:/widgets/views/Viewer/OCRPage.qml") 0186 if (component.status == Component.Ready) 0187 var object = component.createObject() 0188 else 0189 component.statusChanged.connect(finishCreation); 0190 0191 control.push(object) 0192 } 0193 0194 }, 0195 0196 ToolButton 0197 { 0198 icon.name: "view-fullscreen" 0199 onClicked: toogleFullscreen() 0200 checked: fullScreen 0201 } 0202 ] 0203 0204 Maui.Holder 0205 { 0206 id: holder 0207 visible: viewer.count === 0 /*|| viewer.currentItem.status !== Image.Ready*/ 0208 anchors.fill: parent 0209 emoji: "qrc:/assets/add-image.svg" 0210 isMask: true 0211 title : i18n("No Pics!") 0212 body: i18n("Open an image from your collection") 0213 } 0214 0215 ColumnLayout 0216 { 0217 height: parent.height 0218 width: parent.width 0219 spacing: 0 0220 0221 Viewer 0222 { 0223 id: viewer 0224 visible: !holder.visible 0225 Layout.fillHeight: true 0226 Layout.fillWidth: true 0227 0228 Rectangle 0229 { 0230 id: galleryRollBg 0231 width: parent.width 0232 anchors.bottom: parent.bottom 0233 height: Math.min(100, Math.max(parent.height * 0.12, 60)) 0234 visible: viewerSettings.previewBarVisible && galleryRoll.rollList.count > 1 && opacity> 0 0235 color: Qt.rgba(Maui.Theme.backgroundColor.r, Maui.Theme.backgroundColor.g, Maui.Theme.backgroundColor.b, 0.7) 0236 0237 Behavior on opacity 0238 { 0239 NumberAnimation 0240 { 0241 duration: Maui.Style.units.longDuration 0242 easing.type: Easing.InOutQuad 0243 } 0244 } 0245 0246 GalleryRoll 0247 { 0248 id: galleryRoll 0249 height: parent.height -Maui.Style.space.small 0250 width: parent.width 0251 anchors.centerIn: parent 0252 model: control.model 0253 onPicClicked: (index) => view(index) 0254 } 0255 } 0256 } 0257 0258 FB.TagsBar 0259 { 0260 id: tagBar 0261 visible: !holder.visible && viewerSettings.tagBarVisible && !fullScreen 0262 Layout.fillWidth: true 0263 allowEditMode: true 0264 list.urls: [currentPic.url] 0265 list.strict: false 0266 0267 onAddClicked: 0268 { 0269 dialogLoader.sourceComponent = tagsDialogComponent 0270 dialog.composerList.urls = [currentPic.url] 0271 dialog.open() 0272 } 0273 0274 onTagRemovedClicked: (index) => list.removeFromUrls(index) 0275 onTagsEdited: (tags) => list.updateToUrls(tags) 0276 0277 Connections 0278 { 0279 target: dialog 0280 ignoreUnknownSignals: true 0281 enabled: dialogLoader.sourceComponent === tagsDialogComponent 0282 function onTagsReady() 0283 { 0284 tagBar.list.refresh() 0285 } 0286 } 0287 } 0288 } 0289 } 0290 0291 function next() 0292 { 0293 var index = control.currentPicIndex 0294 0295 if(index < control.viewer.count-1) 0296 index++ 0297 else 0298 index= 0 0299 0300 view(index) 0301 } 0302 0303 function previous() 0304 { 0305 var index = control.currentPicIndex 0306 0307 if(index > 0) 0308 index-- 0309 else 0310 index = control.viewer.count-1 0311 0312 view(index) 0313 } 0314 0315 function view(index) 0316 { 0317 if(control.viewer.count > 0 && index >= 0 && index < control.viewer.count) 0318 { 0319 control.currentPicIndex = index 0320 control.currentPic = control.model.get(control.currentPicIndex) 0321 0322 control.currentPicFav = FB.Tagging.isFav(control.currentPic.url) 0323 root.title = control.currentPic.title 0324 control.roll.position(control.currentPicIndex) 0325 } 0326 } 0327 } 0328 0329