mirror of
https://github.com/YACReader/yacreader
synced 2025-05-25 18:00:46 -04:00
218 lines
6.2 KiB
QML
218 lines
6.2 KiB
QML
import QtQuick 2.15
|
|
import QtQuick.Controls 2.15
|
|
|
|
import QtGraphicalEffects 1.0
|
|
|
|
import com.yacreader.ComicModel 1.0
|
|
|
|
Rectangle {
|
|
id: mainFlowContainer
|
|
|
|
property url backgroundImageURL;
|
|
|
|
property real backgroundBlurRadius : 100; //85;
|
|
property real backgroundBlurOpacity : 0.25; //0.35;
|
|
property bool backgroundBlurVisible : true;
|
|
|
|
property real additionalBottomSpace : 0;
|
|
|
|
property real verticalPadding: 12
|
|
|
|
property real itemsSpacing: 17
|
|
|
|
signal currentCoverChanged(int index)
|
|
|
|
Rectangle {
|
|
id: background
|
|
color: "#2A2A2A"
|
|
anchors.fill: backgroundImg
|
|
}
|
|
|
|
Image {
|
|
id: backgroundImg
|
|
width: parent.width
|
|
height: parent.height + additionalBottomSpace
|
|
source: backgroundImage
|
|
fillMode: Image.PreserveAspectCrop
|
|
smooth: true
|
|
mipmap: true
|
|
asynchronous : true
|
|
cache: false //TODO clear cache only when it is needed
|
|
opacity: 0
|
|
visible: false
|
|
}
|
|
|
|
FastBlur {
|
|
anchors.fill: backgroundImg
|
|
source: backgroundImg
|
|
radius: backgroundBlurRadius
|
|
opacity: backgroundBlurOpacity
|
|
visible: backgroundBlurVisible
|
|
}
|
|
|
|
anchors.margins: 0
|
|
|
|
MouseArea {
|
|
anchors.fill : list
|
|
onWheel: wheel => {
|
|
|
|
if(list.moving)
|
|
return;
|
|
|
|
var ci
|
|
if(wheel.angleDelta.y < 0) {
|
|
ci = Math.min(list.currentIndex+1, list.count - 1);
|
|
}
|
|
else if(wheel.angleDelta.y > 0) {
|
|
ci = Math.max(0,list.currentIndex-1);
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
list.currentIndex = ci;
|
|
}
|
|
}
|
|
|
|
ListView {
|
|
id: list
|
|
objectName: "list"
|
|
anchors.fill: parent
|
|
|
|
property int previousIndex;
|
|
|
|
orientation: Qt.Horizontal
|
|
pixelAligned: true
|
|
|
|
model: comicsList
|
|
|
|
spacing: itemsSpacing
|
|
anchors.leftMargin: Math.floor(verticalPadding * 1.1)
|
|
|
|
snapMode: ListView.SnapToItem
|
|
|
|
highlightFollowsCurrentItem: true
|
|
highlightRangeMode: ListView.StrictlyEnforceRange
|
|
preferredHighlightEnd: 50
|
|
|
|
highlightMoveDuration: 250
|
|
|
|
onCurrentIndexChanged: currentIndex => {
|
|
if (list.currentIndex !== -1) {
|
|
mainFlowContainer.currentCoverChanged(list.currentIndex);
|
|
}
|
|
}
|
|
|
|
delegate: Component {
|
|
|
|
//cover
|
|
Rectangle {
|
|
width: Math.floor((list.height - (verticalPadding * 2)) * 0.65);
|
|
height: list.height - (verticalPadding * 2);
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
|
|
color:"transparent"
|
|
|
|
BusyIndicator {
|
|
scale: 0.5
|
|
anchors.centerIn: parent
|
|
running: coverElement.status === Image.Loading
|
|
}
|
|
|
|
BorderImage {
|
|
anchors {
|
|
top: coverElement.top
|
|
left: coverElement.left
|
|
right: coverElement.right
|
|
bottom: coverElement.bottom
|
|
margins: -6
|
|
}
|
|
border { left: 10; top: 10; right: 10; bottom: 10 }
|
|
horizontalTileMode: BorderImage.Stretch
|
|
verticalTileMode: BorderImage.Stretch
|
|
source: "prerendered_cover_shadow.png"
|
|
visible: showDropShadow
|
|
}
|
|
|
|
Image {
|
|
id: coverElement
|
|
anchors.fill: parent
|
|
source: cover_path
|
|
fillMode: Image.PreserveAspectCrop
|
|
smooth: true
|
|
mipmap: true
|
|
asynchronous : true
|
|
cache: false
|
|
}
|
|
|
|
//mark
|
|
Image {
|
|
id: mark
|
|
width: 23
|
|
height: 23
|
|
source: read_column&&show_marks?"tick.png":has_been_opened&&show_marks?"reading.png":""
|
|
anchors {right: coverElement.right; top: coverElement.top; topMargin: 9; rightMargin: 9}
|
|
asynchronous : true
|
|
}
|
|
|
|
//border
|
|
Rectangle {
|
|
width: coverElement.width
|
|
height: coverElement.height
|
|
anchors.centerIn: coverElement
|
|
color: "transparent"
|
|
border {
|
|
color: "#30FFFFFF"
|
|
width: 1
|
|
}
|
|
}
|
|
|
|
MouseArea {
|
|
id: mouseArea
|
|
anchors.fill: parent
|
|
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
|
|
|
hoverEnabled: true
|
|
|
|
onDoubleClicked: {
|
|
list.currentIndex = index;
|
|
currentIndexHelper.selectedItem(index);
|
|
}
|
|
|
|
onReleased: mouse => {
|
|
list.currentIndex = index;
|
|
|
|
if(mouse.button === Qt.RightButton) // context menu is requested
|
|
{
|
|
var coordinates = mainFlowContainer.mapFromItem(coverElement,mouseX,mouseY)
|
|
contextMenuHelper.requestedContextMenu(Qt.point(coordinates.x,coordinates.y));
|
|
}
|
|
|
|
mouse.accepted = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
focus: true
|
|
Keys.onPressed: event => {
|
|
|
|
if (event.modifiers & Qt.ControlModifier || event.modifiers & Qt.ShiftModifier)
|
|
return;
|
|
var ci
|
|
if (event.key === Qt.Key_Right || event.key === Qt.Key_Down) {
|
|
ci = Math.min(list.currentIndex+1, list.count - 1);
|
|
}
|
|
else if (event.key === Qt.Key_Left || event.key === Qt.Key_Up) {
|
|
ci = Math.max(0,list.currentIndex-1);
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
list.currentIndex = ci;
|
|
|
|
event.accepted = true;
|
|
}
|
|
|
|
}
|
|
}
|