photosurface.qml Example File
demos/photosurface/photosurface.qml
import QtQuick 2.0
import QtQuick.Dialogs 1.0
import QtQuick.Window 2.1
import Qt.labs.folderlistmodel 1.0
Window {
id: root
visible: true
width: 1024; height: 600
color: "black"
property int highestZ: 0
property real defaultSize: 200
FileDialog {
id: fileDialog
title: "Choose a folder with some images"
selectFolder: true
onAccepted: folderModel.folder = fileUrl + "/"
}
Repeater {
model: FolderListModel {
id: folderModel
objectName: "folderModel"
showDirs: false
nameFilters: ["*.png", "*.jpg", "*.gif"]
}
Rectangle {
id: photoFrame
width: image.width * image.scale + 20
height: image.height * image.scale + 20
border.color: "black"
border.width: 2
smooth: true
antialiasing: true
x: Math.random() * root.width - defaultSize
y: Math.random() * root.height - defaultSize
rotation: Math.random() * 13 - 6
Image {
id: image
anchors.centerIn: parent
fillMode: Image.PreserveAspectFit
source: folderModel.folder + fileName
scale: defaultSize / Math.max(sourceSize.width, sourceSize.height)
antialiasing: true
}
PinchArea {
anchors.fill: parent
pinch.target: photoFrame
pinch.minimumRotation: -360
pinch.maximumRotation: 360
pinch.minimumScale: 0.1
pinch.maximumScale: 10
onPinchFinished: photoFrame.border.color = "black";
MouseArea {
id: dragArea
hoverEnabled: true
anchors.fill: parent
drag.target: photoFrame
onPressed: photoFrame.z = ++root.highestZ;
onEntered: photoFrame.border.color = "red";
onExited: photoFrame.border.color = "black";
onWheel: {
if (wheel.modifiers & Qt.ControlModifier) {
photoFrame.rotation += wheel.angleDelta.y / 120 * 5;
if (Math.abs(photoFrame.rotation) < 4)
photoFrame.rotation = 0;
} else {
photoFrame.rotation += wheel.angleDelta.x / 120;
if (Math.abs(photoFrame.rotation) < 0.6)
photoFrame.rotation = 0;
var scaleBefore = image.scale;
image.scale += image.scale * wheel.angleDelta.y / 120 / 10;
photoFrame.x -= image.width * (image.scale - scaleBefore) / 2.0;
photoFrame.y -= image.height * (image.scale - scaleBefore) / 2.0;
}
}
}
}
}
}
Image {
anchors.top: parent.top
anchors.left: parent.left
anchors.margins: 10
source: "resources/folder.png"
MouseArea {
anchors.fill: parent
anchors.margins: -10
onClicked: fileDialog.open()
}
}
Text {
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
anchors.margins: 10
color: "darkgrey"
wrapMode: Text.WordWrap
font.pointSize: 8
text: "On a touchscreen: use two fingers to zoom and rotate, one finger to drag\n" +
"With a mouse: drag normally, use the vertical wheel to zoom, horizontal wheel to rotate, or hold Ctrl while using the vertical wheel to rotate"
}
Component.onCompleted: fileDialog.open()
}