forked from openkylin/kylin-photo-viewer
143 lines
6.0 KiB
QML
143 lines
6.0 KiB
QML
![]() |
import QtQuick 2.12
|
|||
|
import QtQuick.Controls 2.12
|
|||
|
import "./part"
|
|||
|
Rectangle {
|
|||
|
id: coverflow
|
|||
|
anchors.fill: parent
|
|||
|
property ListModel imagemodel
|
|||
|
property int itemCount: variables.imagelist.length >= 5? 5 : variables.imagelist.length != 0 ? variables.imagelist.length : 1
|
|||
|
property int itemMargin: 40 //item间距
|
|||
|
property int itemDistance: coverflow.width + itemMargin //item+间距
|
|||
|
color: "transparent"
|
|||
|
signal changeImageFromView(var path,var changeWay) //切图
|
|||
|
property int backItem: -1 //前一个item的index
|
|||
|
property bool stopMove: true //控制pathvie能否滑动
|
|||
|
property string moveWay: "default"
|
|||
|
|
|||
|
|
|||
|
PathView {
|
|||
|
anchors.fill: parent
|
|||
|
objectName: "pathWid"
|
|||
|
id: pathView
|
|||
|
model: imagemodel
|
|||
|
movementDirection: moveWay == "default"? PathView.Shortest : moveWay == "back" ? PathView.Negative : PathView.Positive
|
|||
|
flickDeceleration:1000//轻弹减速的速率
|
|||
|
snapMode: PathView.SnapOneItem
|
|||
|
interactive: !stopMove ? false : itemCount <= 1 || variables.navigatorState ? false : true
|
|||
|
delegate: Item {
|
|||
|
id: delegateItem
|
|||
|
width: coverflow.width
|
|||
|
height: coverflow.height
|
|||
|
clip: true
|
|||
|
//主要的图片区域
|
|||
|
MainImageArea {
|
|||
|
objectName: "imageItem"
|
|||
|
id: imageArea
|
|||
|
x: 0
|
|||
|
y: 0
|
|||
|
width: mainWindow.width
|
|||
|
height: mainWindow.height
|
|||
|
imageUrl: url
|
|||
|
imageType: type
|
|||
|
itemIndex: index
|
|||
|
}
|
|||
|
}
|
|||
|
path: variables.imagelist.length >= 5? coverFlowPath : variables.imagelist.length == 4 ? coverFlowPathFourth : variables.imagelist.length == 3 ? coverFlowPathThird :variables.imagelist.length >= 2 ? coverFlowPathSecond : coverFlowPathFirst
|
|||
|
pathItemCount: itemCount
|
|||
|
highlightRangeMode: PathView.StrictlyEnforceRange
|
|||
|
preferredHighlightBegin: 0.5
|
|||
|
preferredHighlightEnd: 0.5
|
|||
|
|
|||
|
onMovementEnded: {
|
|||
|
//切图
|
|||
|
if (variables.imagelist.length - 1 >= pathView.currentIndex) {
|
|||
|
if (backItem != pathView.currentIndex) {
|
|||
|
if (pathView.currentIndex - backItem > 0) {
|
|||
|
if (backItem == 0 && pathView.currentIndex == pathView.count - 1) {
|
|||
|
changeImageFromView(variables.imagelist[pathView.currentIndex],false)
|
|||
|
} else {
|
|||
|
changeImageFromView(variables.imagelist[pathView.currentIndex],true)
|
|||
|
}
|
|||
|
} else if (pathView.currentIndex - backItem < 0) {
|
|||
|
if (pathView.currentIndex == 0 && backItem == pathView.count - 1) {
|
|||
|
changeImageFromView(variables.imagelist[pathView.currentIndex],true)
|
|||
|
} else {
|
|||
|
changeImageFromView(variables.imagelist[pathView.currentIndex],false)
|
|||
|
}
|
|||
|
}
|
|||
|
backItem = pathView.currentIndex
|
|||
|
}
|
|||
|
} else {
|
|||
|
console.log("切换图片失败,当前view和图片列表不匹配")
|
|||
|
}
|
|||
|
//将动图的显示进行重置-用以规避动图的显示过程可以被看到的问题
|
|||
|
for (var i = 0; i < pathView.count; i++) {
|
|||
|
if (i !== pathView.currentIndex) {
|
|||
|
if (variables.imageListEveryAddType[i]) {
|
|||
|
if (model.get(i).url !== "qrc:/res/res/loadgif.gif") {
|
|||
|
model.setProperty(i,"url","qrc:/res/res/loadgif.gif")
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Component.onCompleted: {
|
|||
|
backItem = pathView.currentIndex
|
|||
|
}
|
|||
|
}
|
|||
|
//item的行进路线-pathLine
|
|||
|
Path {
|
|||
|
id:coverFlowPath
|
|||
|
startX: -2*itemDistance - itemMargin / 2
|
|||
|
startY: coverflow.height / 2
|
|||
|
PathLine {x:-itemDistance - itemMargin / 2; y:coverflow.height / 2 }
|
|||
|
PathLine {x:-itemMargin / 2; y:coverflow.height / 2 }
|
|||
|
PathLine {x:-itemMargin / 2 + itemDistance; y:coverflow.height / 2 }
|
|||
|
PathLine {x:-itemMargin / 2 + 2 * itemDistance; y:coverflow.height / 2 }
|
|||
|
PathLine {x:-itemMargin / 2 + 3 * itemDistance; y:coverflow.height / 2 }
|
|||
|
}
|
|||
|
|
|||
|
Path{
|
|||
|
id: coverFlowPathFourth
|
|||
|
startX: -itemDistance / 2 - itemMargin / 2 - itemDistance
|
|||
|
startY: coverflow.height / 2
|
|||
|
PathLine { x: -itemDistance / 2 - itemMargin / 2 +itemDistance- itemDistance ; y:coverflow.height / 2 }
|
|||
|
PathLine { x: -itemDistance / 2 - itemMargin / 2 + 2*itemDistance- itemDistance ; y:coverflow.height / 2 }
|
|||
|
PathLine { x: -itemDistance / 2 - itemMargin / 2 + 3*itemDistance- itemDistance; y:coverflow.height / 2 }
|
|||
|
PathLine { x: -itemDistance / 2 - itemMargin / 2 + 4*itemDistance- itemDistance ; y:coverflow.height / 2 }
|
|||
|
}
|
|||
|
|
|||
|
Path{
|
|||
|
id: coverFlowPathThird
|
|||
|
startX: -itemDistance - itemMargin / 2
|
|||
|
startY: coverflow.height / 2
|
|||
|
PathLine { x: -itemMargin / 2; y:coverflow.height / 2 }
|
|||
|
PathLine { x: -itemMargin / 2 + itemDistance; y:coverflow.height / 2 }
|
|||
|
PathLine { x: -itemMargin / 2 + 2 * itemDistance; y:coverflow.height / 2 }
|
|||
|
|
|||
|
}
|
|||
|
Path{
|
|||
|
id: coverFlowPathSecond
|
|||
|
startX: -itemDistance / 2 - itemMargin / 2
|
|||
|
startY: coverflow.height / 2
|
|||
|
PathLine { x: -itemDistance / 2 - itemMargin / 2 +itemDistance ; y:coverflow.height / 2 }
|
|||
|
PathLine { x: -itemDistance / 2 - itemMargin / 2 + 2*itemDistance; y:coverflow.height / 2 }
|
|||
|
}
|
|||
|
Path{
|
|||
|
id: coverFlowPathFirst
|
|||
|
startX: 0
|
|||
|
startY: coverflow.height/2
|
|||
|
PathLine { x: coverflow.width; y:coverflow.height / 2 }
|
|||
|
}
|
|||
|
//通知pathview更换图片
|
|||
|
function noticeChangeIndex(changeIndex) {
|
|||
|
if (pathView.currentIndex === changeIndex) {
|
|||
|
return
|
|||
|
}
|
|||
|
pathView.currentIndex = changeIndex
|
|||
|
backItem = pathView.currentIndex
|
|||
|
}
|
|||
|
|
|||
|
}
|