mirror of
https://github.com/YACReader/yacreader
synced 2026-04-12 15:49:53 -04:00
Use only the qt6 versions of the qml implementations
This commit is contained in:
@ -314,11 +314,7 @@ HEADERS += grid_comics_view.h \
|
|||||||
SOURCES += grid_comics_view.cpp \
|
SOURCES += grid_comics_view.cpp \
|
||||||
comics_view_transition.cpp
|
comics_view_transition.cpp
|
||||||
|
|
||||||
greaterThan(QT_MAJOR_VERSION, 5) {
|
RESOURCES += qml.qrc
|
||||||
RESOURCES += qml6.qrc
|
|
||||||
} else {
|
|
||||||
RESOURCES += qml.qrc
|
|
||||||
}
|
|
||||||
win32:RESOURCES += qml_win.qrc
|
win32:RESOURCES += qml_win.qrc
|
||||||
unix:!macx:RESOURCES += qml_win.qrc
|
unix:!macx:RESOURCES += qml_win.qrc
|
||||||
macx:RESOURCES += qml_osx.qrc
|
macx:RESOURCES += qml_osx.qrc
|
||||||
|
|||||||
@ -2,12 +2,15 @@
|
|||||||
<qresource prefix="/">
|
<qresource prefix="/">
|
||||||
<file>qml/GridComicsView.qml</file>
|
<file>qml/GridComicsView.qml</file>
|
||||||
<file>qml/FolderContentView.qml</file>
|
<file>qml/FolderContentView.qml</file>
|
||||||
|
<file>qml/FlowView.qml</file>
|
||||||
|
<file>qml/InfoTick.qml</file>
|
||||||
|
<file>qml/InfoFavorites.qml</file>
|
||||||
|
<file>qml/InfoRating.qml</file>
|
||||||
|
<file>qml/InfoComicsView.qml</file>
|
||||||
<file>qml/tick.png</file>
|
<file>qml/tick.png</file>
|
||||||
<file>qml/reading.png</file>
|
<file>qml/reading.png</file>
|
||||||
<file>qml/star_menu.png</file>
|
<file>qml/star_menu.png</file>
|
||||||
<file>qml/star_menu@2x.png</file>
|
<file>qml/star_menu@2x.png</file>
|
||||||
<file>qml/InfoComicsView.qml</file>
|
|
||||||
<file>qml/FlowView.qml</file>
|
|
||||||
<file>qml/info-indicator.png</file>
|
<file>qml/info-indicator.png</file>
|
||||||
<file>qml/info-shadow.png</file>
|
<file>qml/info-shadow.png</file>
|
||||||
<file>qml/info-indicator-light.png</file>
|
<file>qml/info-indicator-light.png</file>
|
||||||
@ -20,9 +23,6 @@
|
|||||||
<file>qml/info-rating.svg</file>
|
<file>qml/info-rating.svg</file>
|
||||||
<file>qml/info-tag.svg</file>
|
<file>qml/info-tag.svg</file>
|
||||||
<file>qml/info-tick.svg</file>
|
<file>qml/info-tick.svg</file>
|
||||||
<file>qml/InfoTick.qml</file>
|
|
||||||
<file>qml/InfoFavorites.qml</file>
|
|
||||||
<file>qml/InfoRating.qml</file>
|
|
||||||
<file>qml/prerendered_cover_shadow.png</file>
|
<file>qml/prerendered_cover_shadow.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
import QtQuick 2.15
|
import QtQuick
|
||||||
import QtQuick.Controls 2.15
|
|
||||||
|
|
||||||
import QtGraphicalEffects 1.0
|
import QtQuick.Controls
|
||||||
|
|
||||||
|
import QtQuick.Effects
|
||||||
|
|
||||||
import com.yacreader.ComicModel 1.0
|
import com.yacreader.ComicModel 1.0
|
||||||
|
|
||||||
@ -38,14 +39,16 @@ Rectangle {
|
|||||||
mipmap: true
|
mipmap: true
|
||||||
asynchronous : true
|
asynchronous : true
|
||||||
cache: false //TODO clear cache only when it is needed
|
cache: false //TODO clear cache only when it is needed
|
||||||
opacity: 0
|
layer.enabled: true
|
||||||
visible: false
|
visible: false
|
||||||
}
|
}
|
||||||
|
|
||||||
FastBlur {
|
MultiEffect {
|
||||||
anchors.fill: backgroundImg
|
anchors.fill: backgroundImg
|
||||||
source: backgroundImg
|
source: backgroundImg
|
||||||
radius: backgroundBlurRadius
|
blurEnabled: true
|
||||||
|
blur: 1.0
|
||||||
|
blurMax: 64
|
||||||
opacity: backgroundBlurOpacity
|
opacity: backgroundBlurOpacity
|
||||||
visible: backgroundBlurVisible
|
visible: backgroundBlurVisible
|
||||||
}
|
}
|
||||||
@ -112,26 +115,32 @@ Rectangle {
|
|||||||
|
|
||||||
color:"transparent"
|
color:"transparent"
|
||||||
|
|
||||||
|
scale: mouseArea.containsMouse ? 1.025 : 1
|
||||||
|
|
||||||
|
Behavior on scale {
|
||||||
|
NumberAnimation { duration: 90 }
|
||||||
|
}
|
||||||
|
|
||||||
BusyIndicator {
|
BusyIndicator {
|
||||||
scale: 0.5
|
scale: 0.5
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
running: coverElement.status === Image.Loading
|
running: coverElement.status === Image.Loading
|
||||||
}
|
}
|
||||||
|
|
||||||
BorderImage {
|
BorderImage {
|
||||||
anchors {
|
anchors {
|
||||||
top: coverElement.top
|
top: coverElement.top
|
||||||
left: coverElement.left
|
left: coverElement.left
|
||||||
right: coverElement.right
|
right: coverElement.right
|
||||||
bottom: coverElement.bottom
|
bottom: coverElement.bottom
|
||||||
margins: -6
|
margins: -6
|
||||||
|
}
|
||||||
|
border { left: 10; top: 10; right: 10; bottom: 10 }
|
||||||
|
horizontalTileMode: BorderImage.Stretch
|
||||||
|
verticalTileMode: BorderImage.Stretch
|
||||||
|
source: "prerendered_cover_shadow.png"
|
||||||
|
visible: showDropShadow
|
||||||
}
|
}
|
||||||
border { left: 10; top: 10; right: 10; bottom: 10 }
|
|
||||||
horizontalTileMode: BorderImage.Stretch
|
|
||||||
verticalTileMode: BorderImage.Stretch
|
|
||||||
source: "prerendered_cover_shadow.png"
|
|
||||||
visible: showDropShadow
|
|
||||||
}
|
|
||||||
|
|
||||||
Image {
|
Image {
|
||||||
id: coverElement
|
id: coverElement
|
||||||
@ -144,6 +153,7 @@ Rectangle {
|
|||||||
cache: false
|
cache: false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//mark
|
//mark
|
||||||
Image {
|
Image {
|
||||||
id: mark
|
id: mark
|
||||||
|
|||||||
@ -1,227 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
|
|
||||||
import QtQuick.Controls
|
|
||||||
|
|
||||||
import QtQuick.Effects
|
|
||||||
|
|
||||||
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
|
|
||||||
layer.enabled: true
|
|
||||||
visible: false
|
|
||||||
}
|
|
||||||
|
|
||||||
MultiEffect {
|
|
||||||
anchors.fill: backgroundImg
|
|
||||||
source: backgroundImg
|
|
||||||
blurEnabled: true
|
|
||||||
blur: 1.0
|
|
||||||
blurMax: 64
|
|
||||||
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"
|
|
||||||
|
|
||||||
scale: mouseArea.containsMouse ? 1.025 : 1
|
|
||||||
|
|
||||||
Behavior on scale {
|
|
||||||
NumberAnimation { duration: 90 }
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,15 +1,17 @@
|
|||||||
import QtQuick 2.15
|
import QtQuick
|
||||||
|
|
||||||
import QtQuick.Controls 2.15
|
import QtQuick.Controls
|
||||||
import QtQuick.Layouts 1.12
|
import QtQuick.Layouts
|
||||||
|
|
||||||
import QtGraphicalEffects 1.0
|
import QtQuick.Effects
|
||||||
|
|
||||||
import com.yacreader.ComicModel 1.0
|
import com.yacreader.ComicModel 1.0
|
||||||
|
|
||||||
import com.yacreader.ComicInfo 1.0
|
import com.yacreader.ComicInfo 1.0
|
||||||
import com.yacreader.ComicDB 1.0
|
import com.yacreader.ComicDB 1.0
|
||||||
|
|
||||||
|
import QtQuick.Controls.Basic
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
id: main
|
id: main
|
||||||
|
|
||||||
@ -117,18 +119,31 @@ Rectangle {
|
|||||||
mipmap: true
|
mipmap: true
|
||||||
asynchronous : true
|
asynchronous : true
|
||||||
cache: true
|
cache: true
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: coverMask
|
||||||
|
anchors.fill: parent
|
||||||
layer.enabled: true
|
layer.enabled: true
|
||||||
layer.effect: OpacityMask {
|
layer.smooth: true
|
||||||
|
visible: false
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
cached: true
|
radius: 10
|
||||||
maskSource: Rectangle {
|
color: "black"
|
||||||
width: coverElement.width
|
|
||||||
height: coverElement.height
|
|
||||||
radius: 10
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MultiEffect {
|
||||||
|
source: coverImage
|
||||||
|
anchors.fill: coverImage
|
||||||
|
maskEnabled: true
|
||||||
|
maskSource: coverMask
|
||||||
|
maskThresholdMin: 0.5
|
||||||
|
maskSpreadAtMin: 1.0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//is new
|
//is new
|
||||||
@ -403,6 +418,14 @@ Rectangle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onOriginYChanged: {
|
||||||
|
console.log(" origin changed ", grid.originY)
|
||||||
|
}
|
||||||
|
|
||||||
|
onContentYChanged: {
|
||||||
|
console.log(" content y changed ", grid.contentY)
|
||||||
|
}
|
||||||
|
|
||||||
ScrollBar.vertical: ScrollBar {
|
ScrollBar.vertical: ScrollBar {
|
||||||
visible: grid.contentHeight > grid.height
|
visible: grid.contentHeight > grid.height
|
||||||
|
|
||||||
|
|||||||
@ -1,490 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
|
|
||||||
import QtQuick.Controls
|
|
||||||
import QtQuick.Layouts
|
|
||||||
|
|
||||||
import QtQuick.Effects
|
|
||||||
|
|
||||||
import com.yacreader.ComicModel 1.0
|
|
||||||
|
|
||||||
import com.yacreader.ComicInfo 1.0
|
|
||||||
import com.yacreader.ComicDB 1.0
|
|
||||||
|
|
||||||
import QtQuick.Controls.Basic
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: main
|
|
||||||
|
|
||||||
property int continuReadingHeight: 430;
|
|
||||||
property int topContentMargin: 20;
|
|
||||||
|
|
||||||
color: backgroundColor
|
|
||||||
anchors.margins: 0
|
|
||||||
|
|
||||||
Component {
|
|
||||||
id: appDelegate
|
|
||||||
Rectangle
|
|
||||||
{
|
|
||||||
id: cell
|
|
||||||
width: grid.cellWidth
|
|
||||||
height: grid.cellHeight
|
|
||||||
color: "#00000000"
|
|
||||||
|
|
||||||
scale: mouseArea.containsMouse ? 1.025 : 1
|
|
||||||
|
|
||||||
Behavior on scale {
|
|
||||||
NumberAnimation { duration: 90 }
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: realCell
|
|
||||||
|
|
||||||
property int position : 0
|
|
||||||
|
|
||||||
width: itemWidth
|
|
||||||
height: itemHeight
|
|
||||||
|
|
||||||
color: "transparent"
|
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
id: mouseArea
|
|
||||||
|
|
||||||
anchors.fill: parent
|
|
||||||
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
|
||||||
|
|
||||||
hoverEnabled: true
|
|
||||||
|
|
||||||
onDoubleClicked: {
|
|
||||||
openHelper.openFolder(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
onPressed: mouse => {
|
|
||||||
var ci = grid.currentIndex; //save current index
|
|
||||||
|
|
||||||
mouse.accepted = true;
|
|
||||||
|
|
||||||
if(mouse.button === Qt.RightButton) // context menu is requested
|
|
||||||
{
|
|
||||||
var coordinates = main.mapFromItem(realCell,mouseX,mouseY)
|
|
||||||
contextMenuHelper.requestedFolderContextMenu(Qt.point(coordinates.x,coordinates.y), index);
|
|
||||||
mouse.accepted = false;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**/
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
transform: Rotation { origin.x: coverWidth / 2; origin.y: coverHeight / 2; angle: -4}
|
|
||||||
width: coverElement.width
|
|
||||||
height: coverElement.height
|
|
||||||
radius: 10
|
|
||||||
anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0}
|
|
||||||
color: "#20000000"
|
|
||||||
border {
|
|
||||||
color: "#20FFFFFF"
|
|
||||||
width: 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
transform: Rotation { origin.x: coverWidth / 2; origin.y: coverHeight / 2; angle: 3}
|
|
||||||
width: coverElement.width
|
|
||||||
height: coverElement.height
|
|
||||||
radius: 10
|
|
||||||
anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0}
|
|
||||||
color: "#88000000"
|
|
||||||
border {
|
|
||||||
color: "#20FFFFFF"
|
|
||||||
width: 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
width: coverWidth
|
|
||||||
height: coverHeight
|
|
||||||
anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0}
|
|
||||||
id: coverElement
|
|
||||||
|
|
||||||
Image {
|
|
||||||
id: coverImage
|
|
||||||
anchors.fill: parent
|
|
||||||
source: cover_path
|
|
||||||
fillMode: Image.PreserveAspectCrop
|
|
||||||
smooth: true
|
|
||||||
mipmap: true
|
|
||||||
asynchronous : true
|
|
||||||
cache: true
|
|
||||||
visible: false
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: coverMask
|
|
||||||
anchors.fill: parent
|
|
||||||
layer.enabled: true
|
|
||||||
layer.smooth: true
|
|
||||||
visible: false
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors.fill: parent
|
|
||||||
radius: 10
|
|
||||||
color: "black"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MultiEffect {
|
|
||||||
source: coverImage
|
|
||||||
anchors.fill: coverImage
|
|
||||||
maskEnabled: true
|
|
||||||
maskSource: coverMask
|
|
||||||
maskThresholdMin: 0.5
|
|
||||||
maskSpreadAtMin: 1.0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//is new
|
|
||||||
Rectangle {
|
|
||||||
width: 10
|
|
||||||
height: 10
|
|
||||||
radius: 5
|
|
||||||
anchors { left: coverElement.left; top: coverElement.top; topMargin: 10; leftMargin: 10; }
|
|
||||||
color: "#FFFFCC00"
|
|
||||||
visible: (((new Date() / 1000) - added) < recent_range || ((new Date() / 1000) - updated) < recent_range) && show_recent
|
|
||||||
}
|
|
||||||
|
|
||||||
//border
|
|
||||||
Rectangle {
|
|
||||||
width: coverElement.width
|
|
||||||
height: coverElement.height
|
|
||||||
radius: 10
|
|
||||||
anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0}
|
|
||||||
color: "transparent"
|
|
||||||
border {
|
|
||||||
color: "#20FFFFFF"
|
|
||||||
width: 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//folder name
|
|
||||||
Text {
|
|
||||||
id : titleText
|
|
||||||
anchors { top: coverElement.bottom; left: realCell.left; leftMargin: 4; rightMargin: 4; topMargin: 10; }
|
|
||||||
width: itemWidth - 8
|
|
||||||
maximumLineCount: 2
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
text: name
|
|
||||||
elide: Text.ElideRight
|
|
||||||
color: titleColor
|
|
||||||
font.letterSpacing: fontSpacing
|
|
||||||
font.pointSize: fontSize
|
|
||||||
font.family: fontFamily
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: scrollView
|
|
||||||
objectName: "topScrollView"
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.margins: 0
|
|
||||||
children: grid
|
|
||||||
|
|
||||||
color: "transparent"
|
|
||||||
|
|
||||||
function scrollToOrigin() {
|
|
||||||
grid.contentY = grid.originY
|
|
||||||
grid.contentX = grid.originX
|
|
||||||
}
|
|
||||||
|
|
||||||
property Component continueReadingView: Component {
|
|
||||||
id: continueReadingView
|
|
||||||
Rectangle {
|
|
||||||
id: continueReadingTopView
|
|
||||||
color: "#00000000"
|
|
||||||
|
|
||||||
height: list.count > 0 && showContinueReading ? main.continuReadingHeight : main.topContentMargin
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
color: continueReadingBackgroundColor
|
|
||||||
|
|
||||||
id: continueReadingBackground
|
|
||||||
|
|
||||||
width: main.width
|
|
||||||
height: main.continuReadingHeight - main.topContentMargin
|
|
||||||
|
|
||||||
visible: list.count > 0 && showContinueReading
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: continueReadingText
|
|
||||||
text: qsTr("Continue Reading...")
|
|
||||||
color: continueReadingColor
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.topMargin: 15
|
|
||||||
anchors.bottomMargin: 20
|
|
||||||
anchors.leftMargin: 25
|
|
||||||
anchors.rightMargin: 0
|
|
||||||
font.pointSize: 18
|
|
||||||
font.weight: Font.DemiBold
|
|
||||||
}
|
|
||||||
|
|
||||||
ListView {
|
|
||||||
id: list
|
|
||||||
objectName: "list"
|
|
||||||
anchors { top: continueReadingText.bottom; left: parent.left; right: parent.right; bottom: parent.bottom; }
|
|
||||||
|
|
||||||
property int previousIndex;
|
|
||||||
property int verticalPadding: 20
|
|
||||||
|
|
||||||
orientation: Qt.Horizontal
|
|
||||||
pixelAligned: true
|
|
||||||
|
|
||||||
model: comicsList
|
|
||||||
|
|
||||||
spacing: 20
|
|
||||||
anchors.topMargin: 15
|
|
||||||
anchors.bottomMargin: 20
|
|
||||||
anchors.leftMargin: 25
|
|
||||||
anchors.rightMargin: 20
|
|
||||||
|
|
||||||
WheelHandler {
|
|
||||||
onWheel: event => {
|
|
||||||
if (list.contentWidth <= list.width) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var newValue = Math.min(list.contentWidth - list.width - anchors.leftMargin, (Math.max(list.originX , list.contentX - event.angleDelta.y)));
|
|
||||||
list.contentX = newValue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delegate: Component {
|
|
||||||
|
|
||||||
//cover
|
|
||||||
Rectangle {
|
|
||||||
width: Math.floor((list.height - (list.verticalPadding * 2)) * 0.65);
|
|
||||||
height: list.height - (list.verticalPadding * 2);
|
|
||||||
|
|
||||||
color:"transparent"
|
|
||||||
|
|
||||||
scale: mouseArea.containsMouse ? 1.025 : 1
|
|
||||||
|
|
||||||
Behavior on scale {
|
|
||||||
NumberAnimation { duration: 90 }
|
|
||||||
}
|
|
||||||
|
|
||||||
Image {
|
|
||||||
id: coverElement
|
|
||||||
anchors.fill: parent
|
|
||||||
source: cover_path
|
|
||||||
fillMode: Image.PreserveAspectCrop
|
|
||||||
smooth: true
|
|
||||||
mipmap: true
|
|
||||||
asynchronous : true
|
|
||||||
cache: true
|
|
||||||
}
|
|
||||||
|
|
||||||
//title
|
|
||||||
Text {
|
|
||||||
id : comicTitleText
|
|
||||||
anchors { top: coverElement.bottom; left: coverElement.left; right: coverElement.right; leftMargin: 4; rightMargin: 4; topMargin: 4; }
|
|
||||||
width: itemWidth - 8
|
|
||||||
maximumLineCount: 2
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
text: readable_title
|
|
||||||
elide: Text.ElideRight
|
|
||||||
color: titleColor
|
|
||||||
font.letterSpacing: fontSpacing
|
|
||||||
font.pointSize: fontSize
|
|
||||||
font.family: fontFamily
|
|
||||||
}
|
|
||||||
|
|
||||||
//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;
|
|
||||||
openHelper.openComicFromContinueReadingList(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
onReleased: mouse => {
|
|
||||||
list.currentIndex = index;
|
|
||||||
|
|
||||||
if(mouse.button === Qt.RightButton) // context menu is requested
|
|
||||||
{
|
|
||||||
var coordinates = main.mapFromItem(coverElement,mouseX,mouseY)
|
|
||||||
contextMenuHelper.requestedContinueReadingComicContextMenu(Qt.point(coordinates.x,coordinates.y), index);
|
|
||||||
}
|
|
||||||
|
|
||||||
mouse.accepted = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
focus: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GridView {
|
|
||||||
id:grid
|
|
||||||
objectName: "grid"
|
|
||||||
anchors.fill: parent
|
|
||||||
cellHeight: cellCustomHeight
|
|
||||||
header: continueReadingView
|
|
||||||
focus: true
|
|
||||||
model: foldersList
|
|
||||||
delegate: appDelegate
|
|
||||||
anchors.topMargin: 0
|
|
||||||
anchors.bottomMargin: 10
|
|
||||||
anchors.leftMargin: 0
|
|
||||||
anchors.rightMargin: 0
|
|
||||||
pixelAligned: true
|
|
||||||
highlightFollowsCurrentItem: true
|
|
||||||
|
|
||||||
currentIndex: 0
|
|
||||||
cacheBuffer: 0
|
|
||||||
|
|
||||||
interactive: true
|
|
||||||
|
|
||||||
move: Transition {
|
|
||||||
NumberAnimation { properties: "x,y"; duration: 250 }
|
|
||||||
}
|
|
||||||
|
|
||||||
moveDisplaced: Transition {
|
|
||||||
NumberAnimation { properties: "x,y"; duration: 250 }
|
|
||||||
}
|
|
||||||
|
|
||||||
remove: Transition {
|
|
||||||
ParallelAnimation {
|
|
||||||
NumberAnimation { property: "opacity"; to: 0; duration: 250 }
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
removeDisplaced: Transition {
|
|
||||||
NumberAnimation { properties: "x,y"; duration: 250 }
|
|
||||||
}
|
|
||||||
|
|
||||||
displaced: Transition {
|
|
||||||
NumberAnimation { properties: "x,y"; duration: 250 }
|
|
||||||
}
|
|
||||||
|
|
||||||
function numCellsPerRow() {
|
|
||||||
return Math.floor(width / cellCustomWidth);
|
|
||||||
}
|
|
||||||
|
|
||||||
onWidthChanged: {
|
|
||||||
calculateCellWidths(cellCustomWidth);
|
|
||||||
}
|
|
||||||
|
|
||||||
function calculateCellWidths(cWidth) {
|
|
||||||
var wholeCells = Math.floor(width / cWidth);
|
|
||||||
var rest = width - (cWidth * wholeCells)
|
|
||||||
|
|
||||||
grid.cellWidth = cWidth + Math.floor(rest / wholeCells);
|
|
||||||
}
|
|
||||||
|
|
||||||
WheelHandler {
|
|
||||||
onWheel: event => {
|
|
||||||
if (grid.contentHeight <= grid.height) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var newValue = Math.min((grid.contentHeight - grid.height + grid.originY), (Math.max(grid.originY , grid.contentY - event.angleDelta.y)));
|
|
||||||
grid.contentY = newValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onOriginYChanged: {
|
|
||||||
console.log(" origin changed ", grid.originY)
|
|
||||||
}
|
|
||||||
|
|
||||||
onContentYChanged: {
|
|
||||||
console.log(" content y changed ", grid.contentY)
|
|
||||||
}
|
|
||||||
|
|
||||||
ScrollBar.vertical: ScrollBar {
|
|
||||||
visible: grid.contentHeight > grid.height
|
|
||||||
|
|
||||||
contentItem: Item {
|
|
||||||
implicitWidth: 12
|
|
||||||
implicitHeight: 26
|
|
||||||
Rectangle {
|
|
||||||
color: "#88424242"
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.topMargin: 6
|
|
||||||
anchors.leftMargin: 3
|
|
||||||
anchors.rightMargin: 2
|
|
||||||
anchors.bottomMargin: 6
|
|
||||||
border.color: "#AA313131"
|
|
||||||
border.width: 1
|
|
||||||
radius: 3.5
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DropArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
onEntered: drag => {
|
|
||||||
if(drag.hasUrls)
|
|
||||||
{
|
|
||||||
if(dropManager.canDropUrls(drag.urls, drag.action))
|
|
||||||
{
|
|
||||||
drag.accepted = true;
|
|
||||||
}else
|
|
||||||
drag.accepted = false;
|
|
||||||
}
|
|
||||||
else if (dropManager.canDropFormats(drag.formats)) {
|
|
||||||
drag.accepted = true;
|
|
||||||
} else
|
|
||||||
drag.accepted = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
onDropped: drop => {
|
|
||||||
if(drop.hasUrls && dropManager.canDropUrls(drop.urls, drop.action))
|
|
||||||
{
|
|
||||||
dropManager.droppedFiles(drop.urls, drop.action);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
if (dropManager.canDropFormats(drop.formats))
|
|
||||||
{
|
|
||||||
var destItem = grid.itemAt(drop.x,drop.y + grid.contentY);
|
|
||||||
var destLocalX = grid.mapToItem(destItem,drop.x,drop.y + grid.contentY).x
|
|
||||||
var realIndex = grid.indexAt(drop.x,drop.y + grid.contentY);
|
|
||||||
|
|
||||||
if(realIndex === -1)
|
|
||||||
realIndex = grid.count - 1;
|
|
||||||
|
|
||||||
var destIndex = destLocalX < (grid.cellWidth / 2) ? realIndex : realIndex + 1;
|
|
||||||
dropManager.droppedComicsForResortingAt("", destIndex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,15 +1,17 @@
|
|||||||
import QtQuick 2.15
|
import QtQuick
|
||||||
|
|
||||||
import QtQuick.Controls 2.15
|
import QtQuick.Controls
|
||||||
import QtQuick.Layouts 1.12
|
import QtQuick.Layouts
|
||||||
|
|
||||||
import QtGraphicalEffects 1.0
|
import QtQuick.Effects
|
||||||
|
|
||||||
import com.yacreader.ComicModel 1.0
|
import com.yacreader.ComicModel 1.0
|
||||||
|
|
||||||
import com.yacreader.ComicInfo 1.0
|
import com.yacreader.ComicInfo 1.0
|
||||||
import com.yacreader.ComicDB 1.0
|
import com.yacreader.ComicDB 1.0
|
||||||
|
|
||||||
|
import QtQuick.Controls.Basic
|
||||||
|
|
||||||
SplitView {
|
SplitView {
|
||||||
orientation: Qt.Horizontal
|
orientation: Qt.Horizontal
|
||||||
handle: Rectangle {
|
handle: Rectangle {
|
||||||
@ -31,14 +33,16 @@ SplitView {
|
|||||||
mipmap: true
|
mipmap: true
|
||||||
asynchronous : true
|
asynchronous : true
|
||||||
cache: false //TODO clear cache only when it is needed
|
cache: false //TODO clear cache only when it is needed
|
||||||
opacity: 0
|
layer.enabled: true
|
||||||
visible: false
|
visible: false
|
||||||
}
|
}
|
||||||
|
|
||||||
FastBlur {
|
MultiEffect {
|
||||||
anchors.fill: backgroundImg
|
anchors.fill: backgroundImg
|
||||||
source: backgroundImg
|
source: backgroundImg
|
||||||
radius: backgroundBlurRadius
|
blurEnabled: true
|
||||||
|
blur: 1.0
|
||||||
|
blurMax: 64
|
||||||
opacity: backgroundBlurOpacity
|
opacity: backgroundBlurOpacity
|
||||||
visible: backgroundBlurVisible
|
visible: backgroundBlurVisible
|
||||||
}
|
}
|
||||||
@ -377,30 +381,38 @@ SplitView {
|
|||||||
comicsSelectionHelper.clear();
|
comicsSelectionHelper.clear();
|
||||||
comicsSelectionHelper.selectIndex(index);
|
comicsSelectionHelper.selectIndex(index);
|
||||||
grid.currentIndex = index;
|
grid.currentIndex = index;
|
||||||
ratingConextMenu.popup();
|
ratingLoader.active = true;
|
||||||
}
|
ratingLoader.item.popup();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Menu {
|
Loader {
|
||||||
background: Rectangle {
|
id: ratingLoader
|
||||||
implicitWidth: 42
|
active: false
|
||||||
implicitHeight: 100
|
sourceComponent: ratingConextMenuComponent
|
||||||
//border.color: "#222"
|
}
|
||||||
//color: "#444"
|
|
||||||
}
|
|
||||||
|
|
||||||
id: ratingConextMenu
|
Component {
|
||||||
|
id: ratingConextMenuComponent
|
||||||
|
Menu {
|
||||||
|
background: Rectangle {
|
||||||
|
implicitWidth: 42
|
||||||
|
implicitHeight: 100
|
||||||
|
}
|
||||||
|
|
||||||
Action { text: "1"; enabled: true; onTriggered: comicRatingHelper.rate(index,1) }
|
id: ratingConextMenu
|
||||||
Action { text: "2"; enabled: true; onTriggered: comicRatingHelper.rate(index,2) }
|
|
||||||
Action { text: "3"; enabled: true; onTriggered: comicRatingHelper.rate(index,3) }
|
|
||||||
Action { text: "4"; enabled: true; onTriggered: comicRatingHelper.rate(index,4) }
|
|
||||||
Action { text: "5"; enabled: true; onTriggered: comicRatingHelper.rate(index,5) }
|
|
||||||
|
|
||||||
delegate: MenuItem {
|
Action { text: "1"; enabled: true; onTriggered: comicRatingHelper.rate(index,1) }
|
||||||
implicitHeight: 30
|
Action { text: "2"; enabled: true; onTriggered: comicRatingHelper.rate(index,2) }
|
||||||
}
|
Action { text: "3"; enabled: true; onTriggered: comicRatingHelper.rate(index,3) }
|
||||||
}
|
Action { text: "4"; enabled: true; onTriggered: comicRatingHelper.rate(index,4) }
|
||||||
|
Action { text: "5"; enabled: true; onTriggered: comicRatingHelper.rate(index,5) }
|
||||||
|
|
||||||
|
delegate: MenuItem {
|
||||||
|
implicitHeight: 30
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//comic rating
|
//comic rating
|
||||||
@ -462,17 +474,16 @@ SplitView {
|
|||||||
mipmap: true
|
mipmap: true
|
||||||
asynchronous : true
|
asynchronous : true
|
||||||
cache: false //TODO clear cache only when it is needed
|
cache: false //TODO clear cache only when it is needed
|
||||||
}
|
|
||||||
|
|
||||||
DropShadow {
|
layer.enabled: showDropShadow
|
||||||
anchors.fill: currentCoverElement
|
layer.effect: MultiEffect {
|
||||||
horizontalOffset: 0
|
shadowEnabled: true
|
||||||
verticalOffset: 0
|
shadowColor: "#FF000000"
|
||||||
radius: 8.0
|
shadowBlur: 1.0
|
||||||
samples: 17
|
blurMax: 8
|
||||||
color: "#FF000000"
|
shadowHorizontalOffset: 0
|
||||||
source: currentCoverElement
|
shadowVerticalOffset: 0
|
||||||
visible: showDropShadow;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ColumnLayout
|
ColumnLayout
|
||||||
@ -503,7 +514,8 @@ SplitView {
|
|||||||
font.pixelSize: 21
|
font.pixelSize: 21
|
||||||
wrapMode: Text.WordWrap
|
wrapMode: Text.WordWrap
|
||||||
|
|
||||||
text: currentComic ? currentComic.getTitleIncludingNumber() : "" }
|
text: currentComic?.getTitleIncludingNumber() ?? ""
|
||||||
|
}
|
||||||
|
|
||||||
Flow {
|
Flow {
|
||||||
spacing: 0
|
spacing: 0
|
||||||
@ -615,6 +627,7 @@ SplitView {
|
|||||||
|
|
||||||
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
|
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
|
||||||
|
|
||||||
|
contentWidth: -1
|
||||||
contentItem: currentComicInfoSinopsis
|
contentItem: currentComicInfoSinopsis
|
||||||
|
|
||||||
id: synopsisScroller
|
id: synopsisScroller
|
||||||
@ -645,6 +658,7 @@ SplitView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
|
containmentMask: null
|
||||||
text: "Read"
|
text: "Read"
|
||||||
id: readButton
|
id: readButton
|
||||||
x: currentCoverElement.anchors.rightMargin + currentCoverElement.paintedWidth + currentCoverElement.anchors.rightMargin
|
x: currentCoverElement.anchors.rightMargin + currentCoverElement.paintedWidth + currentCoverElement.anchors.rightMargin
|
||||||
@ -671,18 +685,16 @@ SplitView {
|
|||||||
color: "white"
|
color: "white"
|
||||||
text: readButton.text
|
text: readButton.text
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
layer.enabled: showDropShadow && !readButton.pressed
|
||||||
DropShadow {
|
layer.effect: MultiEffect {
|
||||||
anchors.fill: readButton
|
shadowEnabled: true
|
||||||
horizontalOffset: 0
|
shadowColor: "#AA000000"
|
||||||
verticalOffset: 0
|
shadowBlur: 1.0
|
||||||
radius: 8.0
|
blurMax: 8
|
||||||
samples: 17
|
shadowHorizontalOffset: 0
|
||||||
color: "#AA000000"
|
shadowVerticalOffset: 0
|
||||||
source: readButton
|
}
|
||||||
visible: showDropShadow && !readButton.pressed
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,924 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
|
|
||||||
import QtQuick.Controls
|
|
||||||
import QtQuick.Layouts
|
|
||||||
|
|
||||||
import QtQuick.Effects
|
|
||||||
|
|
||||||
import com.yacreader.ComicModel 1.0
|
|
||||||
|
|
||||||
import com.yacreader.ComicInfo 1.0
|
|
||||||
import com.yacreader.ComicDB 1.0
|
|
||||||
|
|
||||||
import QtQuick.Controls.Basic
|
|
||||||
|
|
||||||
SplitView {
|
|
||||||
orientation: Qt.Horizontal
|
|
||||||
handle: Rectangle {
|
|
||||||
border.width : 0
|
|
||||||
implicitWidth: 10
|
|
||||||
color: info_container.color
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: main
|
|
||||||
clip: true
|
|
||||||
|
|
||||||
Image {
|
|
||||||
id: backgroundImg
|
|
||||||
anchors.fill: parent
|
|
||||||
source: backgroundImage
|
|
||||||
fillMode: Image.PreserveAspectCrop
|
|
||||||
smooth: true
|
|
||||||
mipmap: true
|
|
||||||
asynchronous : true
|
|
||||||
cache: false //TODO clear cache only when it is needed
|
|
||||||
layer.enabled: true
|
|
||||||
visible: false
|
|
||||||
}
|
|
||||||
|
|
||||||
MultiEffect {
|
|
||||||
anchors.fill: backgroundImg
|
|
||||||
source: backgroundImg
|
|
||||||
blurEnabled: true
|
|
||||||
blur: 1.0
|
|
||||||
blurMax: 64
|
|
||||||
opacity: backgroundBlurOpacity
|
|
||||||
visible: backgroundBlurVisible
|
|
||||||
}
|
|
||||||
|
|
||||||
color: backgroundColor
|
|
||||||
width: parent.width - (info_container.visible ? info_container.width : 0)
|
|
||||||
SplitView.fillWidth: true
|
|
||||||
SplitView.minimumWidth: coverWidth + 100
|
|
||||||
height: parent.height
|
|
||||||
anchors.margins: 0
|
|
||||||
|
|
||||||
Component {
|
|
||||||
id: appDelegate
|
|
||||||
Rectangle
|
|
||||||
{
|
|
||||||
id: cell
|
|
||||||
width: grid.cellWidth
|
|
||||||
height: grid.cellHeight
|
|
||||||
color: "#00000000"
|
|
||||||
|
|
||||||
scale: mouseArea.containsMouse ? 1.025 : 1
|
|
||||||
|
|
||||||
Behavior on scale {
|
|
||||||
NumberAnimation { duration: 90 }
|
|
||||||
}
|
|
||||||
|
|
||||||
BorderImage {
|
|
||||||
anchors {
|
|
||||||
top: realCell.top
|
|
||||||
left: realCell.left
|
|
||||||
right: realCell.right
|
|
||||||
bottom: realCell.bottom
|
|
||||||
margins: -10
|
|
||||||
}
|
|
||||||
border { left: 10; top: 10; right: 10; bottom: 10 }
|
|
||||||
horizontalTileMode: BorderImage.Stretch
|
|
||||||
verticalTileMode: BorderImage.Stretch
|
|
||||||
source: "prerendered_cover_shadow.png"
|
|
||||||
visible: showDropShadow
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: realCell
|
|
||||||
|
|
||||||
property int position : 0
|
|
||||||
property bool dragging: false;
|
|
||||||
Drag.active: mouseArea.drag.active
|
|
||||||
Drag.hotSpot.x: 32
|
|
||||||
Drag.hotSpot.y: 32
|
|
||||||
Drag.dragType: Drag.Automatic
|
|
||||||
//Drag.mimeData: { "x": 1 }
|
|
||||||
Drag.proposedAction: Qt.CopyAction
|
|
||||||
Drag.onActiveChanged: {
|
|
||||||
if(!dragging)
|
|
||||||
{
|
|
||||||
dragManager.startDrag();
|
|
||||||
dragging = true;
|
|
||||||
}else
|
|
||||||
dragging = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
width: itemWidth
|
|
||||||
height: itemHeight
|
|
||||||
|
|
||||||
color: ((dummyValue || !dummyValue) && comicsSelectionHelper.isSelectedIndex(index))?selectedColor:cellColor;
|
|
||||||
//border.color: ((dummyValue || !dummyValue) && comicsSelectionHelper.isSelectedIndex(index))?selectedBorderColor:borderColor;
|
|
||||||
//border.width: ?1:0;
|
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
|
||||||
|
|
||||||
Rectangle
|
|
||||||
{
|
|
||||||
id: mouseOverBorder
|
|
||||||
|
|
||||||
property bool commonBorder : false
|
|
||||||
|
|
||||||
property int lBorderwidth : 2
|
|
||||||
property int rBorderwidth : 2
|
|
||||||
property int tBorderwidth : 2
|
|
||||||
property int bBorderwidth : 2
|
|
||||||
|
|
||||||
property int commonBorderWidth : 1
|
|
||||||
|
|
||||||
z : -1
|
|
||||||
|
|
||||||
color: "#00000000"
|
|
||||||
|
|
||||||
anchors
|
|
||||||
{
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
top: parent.top
|
|
||||||
bottom: parent.bottom
|
|
||||||
|
|
||||||
topMargin : commonBorder ? -commonBorderWidth : -tBorderwidth
|
|
||||||
bottomMargin : commonBorder ? -commonBorderWidth : -bBorderwidth
|
|
||||||
leftMargin : commonBorder ? -commonBorderWidth : -lBorderwidth
|
|
||||||
rightMargin : commonBorder ? -commonBorderWidth : -rBorderwidth
|
|
||||||
}
|
|
||||||
|
|
||||||
border.color: selectedBorderColor
|
|
||||||
border.width: 3
|
|
||||||
|
|
||||||
opacity: (dummyValue || !dummyValue) && comicsSelectionHelper.isSelectedIndex(index) ? 1 : 0
|
|
||||||
|
|
||||||
Behavior on opacity {
|
|
||||||
NumberAnimation { duration: 300 }
|
|
||||||
}
|
|
||||||
|
|
||||||
radius : 2
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
id: mouseArea
|
|
||||||
drag.target: realCell
|
|
||||||
|
|
||||||
drag.minimumX: 0
|
|
||||||
drag.maximumX: 0
|
|
||||||
drag.minimumY: 0
|
|
||||||
drag.maximumY: 0
|
|
||||||
|
|
||||||
anchors.fill: parent
|
|
||||||
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
|
||||||
|
|
||||||
hoverEnabled: true
|
|
||||||
|
|
||||||
onDoubleClicked: {
|
|
||||||
comicsSelectionHelper.clear();
|
|
||||||
|
|
||||||
comicsSelectionHelper.selectIndex(index);
|
|
||||||
grid.currentIndex = index;
|
|
||||||
currentIndexHelper.selectedItem(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
function selectAll(from,to)
|
|
||||||
{
|
|
||||||
for(var i = from;i<=to;i++)
|
|
||||||
{
|
|
||||||
comicsSelectionHelper.selectIndex(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onPressed: mouse => {
|
|
||||||
var ci = grid.currentIndex; //save current index
|
|
||||||
|
|
||||||
/*if(mouse.button != Qt.RightButton && !(mouse.modifiers & Qt.ControlModifier || mouse.modifiers & Qt.ShiftModifier))
|
|
||||||
{
|
|
||||||
if(!comicsSelectionHelper.isSelectedIndex(index))
|
|
||||||
comicsSelectionHelper.clear();
|
|
||||||
}*/
|
|
||||||
|
|
||||||
if(mouse.modifiers & Qt.ShiftModifier)
|
|
||||||
if(index < ci)
|
|
||||||
{
|
|
||||||
selectAll(index,ci);
|
|
||||||
grid.currentIndex = index;
|
|
||||||
}
|
|
||||||
else if (index > ci)
|
|
||||||
{
|
|
||||||
selectAll(ci,index);
|
|
||||||
grid.currentIndex = index;
|
|
||||||
}
|
|
||||||
|
|
||||||
mouse.accepted = true;
|
|
||||||
|
|
||||||
if(mouse.button === Qt.RightButton) // context menu is requested
|
|
||||||
{
|
|
||||||
if(!comicsSelectionHelper.isSelectedIndex(index)) //the context menu is requested outside the current selection, the selection will be
|
|
||||||
{
|
|
||||||
currentIndexHelper.setCurrentIndex(index)
|
|
||||||
grid.currentIndex = index;
|
|
||||||
}
|
|
||||||
|
|
||||||
var coordinates = main.mapFromItem(realCell,mouseX,mouseY)
|
|
||||||
contextMenuHelper.requestedContextMenu(Qt.point(coordinates.x,coordinates.y));
|
|
||||||
mouse.accepted = false;
|
|
||||||
|
|
||||||
} else //left button
|
|
||||||
{
|
|
||||||
|
|
||||||
if(mouse.modifiers & Qt.ControlModifier)
|
|
||||||
{
|
|
||||||
if(comicsSelectionHelper.isSelectedIndex(index))
|
|
||||||
{
|
|
||||||
if(comicsSelectionHelper.numItemsSelected()>1)
|
|
||||||
{
|
|
||||||
comicsSelectionHelper.deselectIndex(index);
|
|
||||||
if(grid.currentIndex === index)
|
|
||||||
grid.currentIndex = comicsSelectionHelper.lastSelectedIndex();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
comicsSelectionHelper.selectIndex(index);
|
|
||||||
grid.currentIndex = index;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(mouse.button !== Qt.RightButton && !(mouse.modifiers & Qt.ControlModifier || mouse.modifiers & Qt.ShiftModifier)) //just left button click
|
|
||||||
{
|
|
||||||
if(comicsSelectionHelper.isSelectedIndex(index)) //the context menu is requested outside the current selection, the selection will be
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
currentIndexHelper.setCurrentIndex(index)
|
|
||||||
}
|
|
||||||
|
|
||||||
grid.currentIndex = index;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
onReleased: mouse => {
|
|
||||||
if(mouse.button === Qt.LeftButton && !(mouse.modifiers & Qt.ControlModifier || mouse.modifiers & Qt.ShiftModifier))
|
|
||||||
{
|
|
||||||
if(comicsSelectionHelper.isSelectedIndex(index))
|
|
||||||
{
|
|
||||||
currentIndexHelper.setCurrentIndex(index)
|
|
||||||
grid.currentIndex = index;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**/
|
|
||||||
|
|
||||||
//cover
|
|
||||||
Image {
|
|
||||||
id: coverElement
|
|
||||||
width: coverWidth
|
|
||||||
height: coverHeight
|
|
||||||
anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0}
|
|
||||||
source: cover_path
|
|
||||||
fillMode: Image.PreserveAspectCrop
|
|
||||||
smooth: true
|
|
||||||
mipmap: true
|
|
||||||
asynchronous : true
|
|
||||||
cache: false //TODO clear cache only when it is needed
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//is new
|
|
||||||
Rectangle {
|
|
||||||
width: 10
|
|
||||||
height: 10
|
|
||||||
radius: 5
|
|
||||||
anchors { left: coverElement.left; top: coverElement.top; topMargin: 5; leftMargin: 5; }
|
|
||||||
color: "#FFFFCC00"
|
|
||||||
visible: (((new Date() / 1000) - added_date) < recent_range) && show_recent
|
|
||||||
}
|
|
||||||
|
|
||||||
//border
|
|
||||||
Rectangle {
|
|
||||||
width: coverElement.width
|
|
||||||
height: coverElement.height
|
|
||||||
anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0}
|
|
||||||
color: "transparent"
|
|
||||||
border {
|
|
||||||
color: "#20FFFFFF"
|
|
||||||
width: 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//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
|
|
||||||
}
|
|
||||||
|
|
||||||
//title
|
|
||||||
Text {
|
|
||||||
id : titleText
|
|
||||||
anchors { top: coverElement.bottom; left: realCell.left; leftMargin: 4; rightMargin: 4; topMargin: 4; }
|
|
||||||
width: itemWidth - 8
|
|
||||||
maximumLineCount: 2
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
text: title
|
|
||||||
elide: Text.ElideRight
|
|
||||||
color: titleColor
|
|
||||||
clip: true
|
|
||||||
font.letterSpacing: fontSpacing
|
|
||||||
font.pointSize: fontSize
|
|
||||||
font.family: fontFamily
|
|
||||||
}
|
|
||||||
|
|
||||||
//number
|
|
||||||
Text {
|
|
||||||
anchors {bottom: realCell.bottom; left: realCell.left; margins: 4}
|
|
||||||
text: number?"<b>#</b>"+number:""
|
|
||||||
color: textColor
|
|
||||||
font.letterSpacing: fontSpacing
|
|
||||||
font.pointSize: fontSize
|
|
||||||
font.family: fontFamily
|
|
||||||
}
|
|
||||||
|
|
||||||
//page icon
|
|
||||||
Image {
|
|
||||||
id: pageImage
|
|
||||||
anchors {bottom: realCell.bottom; right: realCell.right; bottomMargin: 5; rightMargin: 4; leftMargin: 4}
|
|
||||||
source: "page.png"
|
|
||||||
width: 8
|
|
||||||
height: 10
|
|
||||||
}
|
|
||||||
|
|
||||||
//numPages
|
|
||||||
Text {
|
|
||||||
id: pages
|
|
||||||
anchors {bottom: realCell.bottom; right: pageImage.left; margins: 4}
|
|
||||||
text: has_been_opened?current_page+"/"+num_pages:num_pages
|
|
||||||
color: textColor
|
|
||||||
font.letterSpacing: fontSpacing
|
|
||||||
font.pointSize: fontSize
|
|
||||||
font.family: fontFamily
|
|
||||||
}
|
|
||||||
|
|
||||||
//rating icon
|
|
||||||
Image {
|
|
||||||
id: ratingImage
|
|
||||||
anchors {bottom: realCell.bottom; right: pageImage.left; bottomMargin: 5; rightMargin: Math.floor(pages.width)+12}
|
|
||||||
source: "star.png"
|
|
||||||
width: 13
|
|
||||||
height: 11
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
onPressed: {
|
|
||||||
console.log("rating");
|
|
||||||
comicsSelectionHelper.clear();
|
|
||||||
comicsSelectionHelper.selectIndex(index);
|
|
||||||
grid.currentIndex = index;
|
|
||||||
ratingLoader.active = true;
|
|
||||||
ratingLoader.item.popup();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Loader {
|
|
||||||
id: ratingLoader
|
|
||||||
active: false
|
|
||||||
sourceComponent: ratingConextMenuComponent
|
|
||||||
}
|
|
||||||
|
|
||||||
Component {
|
|
||||||
id: ratingConextMenuComponent
|
|
||||||
Menu {
|
|
||||||
background: Rectangle {
|
|
||||||
implicitWidth: 42
|
|
||||||
implicitHeight: 100
|
|
||||||
}
|
|
||||||
|
|
||||||
id: ratingConextMenu
|
|
||||||
|
|
||||||
Action { text: "1"; enabled: true; onTriggered: comicRatingHelper.rate(index,1) }
|
|
||||||
Action { text: "2"; enabled: true; onTriggered: comicRatingHelper.rate(index,2) }
|
|
||||||
Action { text: "3"; enabled: true; onTriggered: comicRatingHelper.rate(index,3) }
|
|
||||||
Action { text: "4"; enabled: true; onTriggered: comicRatingHelper.rate(index,4) }
|
|
||||||
Action { text: "5"; enabled: true; onTriggered: comicRatingHelper.rate(index,5) }
|
|
||||||
|
|
||||||
delegate: MenuItem {
|
|
||||||
implicitHeight: 30
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//comic rating
|
|
||||||
Text {
|
|
||||||
id: comicRating
|
|
||||||
anchors {bottom: realCell.bottom; right: ratingImage.left; margins: 4}
|
|
||||||
text: rating>0?rating:"-"
|
|
||||||
color: textColor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: scrollView
|
|
||||||
objectName: "topScrollView"
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.margins: 0
|
|
||||||
children: grid
|
|
||||||
|
|
||||||
color: "transparent"
|
|
||||||
|
|
||||||
function scrollToOrigin() {
|
|
||||||
grid.contentY = grid.originY
|
|
||||||
grid.contentX = grid.originX
|
|
||||||
}
|
|
||||||
|
|
||||||
property Component currentComicView: Component {
|
|
||||||
id: currentComicView
|
|
||||||
Rectangle {
|
|
||||||
id: currentComicViewTopView
|
|
||||||
color: "#00000000"
|
|
||||||
|
|
||||||
height: showCurrentComic ? 270 : 20
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
color: currentComicBackgroundColor
|
|
||||||
|
|
||||||
id: currentComicVisualView
|
|
||||||
|
|
||||||
width: main.width
|
|
||||||
height: 250
|
|
||||||
|
|
||||||
visible: showCurrentComic
|
|
||||||
|
|
||||||
//cover
|
|
||||||
Image {
|
|
||||||
id: currentCoverElement
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
anchors.leftMargin: 15
|
|
||||||
anchors.topMargin: 15
|
|
||||||
anchors.bottomMargin: 15
|
|
||||||
anchors.rightMargin: 15
|
|
||||||
horizontalAlignment: Image.AlignLeft
|
|
||||||
anchors {horizontalCenter: parent.horizontalCenter; top: parent.top; topMargin: 0}
|
|
||||||
source: comicsList.getCoverUrlPathForComicHash(currentComicInfo.hash.toString())
|
|
||||||
fillMode: Image.PreserveAspectFit
|
|
||||||
smooth: true
|
|
||||||
mipmap: true
|
|
||||||
asynchronous : true
|
|
||||||
cache: false //TODO clear cache only when it is needed
|
|
||||||
|
|
||||||
layer.enabled: showDropShadow
|
|
||||||
layer.effect: MultiEffect {
|
|
||||||
shadowEnabled: true
|
|
||||||
shadowColor: "#FF000000"
|
|
||||||
shadowBlur: 1.0
|
|
||||||
blurMax: 8
|
|
||||||
shadowHorizontalOffset: 0
|
|
||||||
shadowVerticalOffset: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ColumnLayout
|
|
||||||
{
|
|
||||||
id: currentComicInfoView
|
|
||||||
|
|
||||||
x: currentCoverElement.anchors.rightMargin + currentCoverElement.paintedWidth + currentCoverElement.anchors.rightMargin
|
|
||||||
//y: currentCoverElement.anchors.topMargin
|
|
||||||
|
|
||||||
anchors.top: currentCoverElement.top
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.left: readButton.left
|
|
||||||
|
|
||||||
spacing: 9
|
|
||||||
|
|
||||||
Text {
|
|
||||||
Layout.topMargin: 7
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.rightMargin: 20
|
|
||||||
|
|
||||||
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
|
|
||||||
|
|
||||||
id: currentComicInfoTitleView
|
|
||||||
|
|
||||||
color: infoTitleColor
|
|
||||||
font.family: "Arial"
|
|
||||||
font.bold: true
|
|
||||||
font.pixelSize: 21
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
|
|
||||||
text: currentComic?.getTitleIncludingNumber() ?? ""
|
|
||||||
}
|
|
||||||
|
|
||||||
Flow {
|
|
||||||
spacing: 0
|
|
||||||
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.fillHeight: false
|
|
||||||
|
|
||||||
id: currentComicDetailsFlowView
|
|
||||||
property font infoFont: Qt.font({
|
|
||||||
family: "Arial",
|
|
||||||
pixelSize: 14
|
|
||||||
});
|
|
||||||
property string infoFlowTextColor: infoTextColor
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: currentComicInfoVolume
|
|
||||||
color: currentComicDetailsFlowView.infoFlowTextColor
|
|
||||||
font: currentComicDetailsFlowView.infoFont
|
|
||||||
text: currentComicInfo.volume ? currentComicInfo.volume : ""
|
|
||||||
rightPadding: 20
|
|
||||||
visible: currentComicInfo.volume ? true : false
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: currentComicInfoNumbering
|
|
||||||
color: currentComicDetailsFlowView.infoFlowTextColor
|
|
||||||
font: currentComicDetailsFlowView.infoFont
|
|
||||||
text: currentComicInfo.number + "/" + currentComicInfo.count
|
|
||||||
rightPadding: 20
|
|
||||||
visible : currentComicInfo.number ? true : false
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: currentComicInfoArc
|
|
||||||
color: currentComicDetailsFlowView.infoFlowTextColor
|
|
||||||
font: currentComicDetailsFlowView.infoFont
|
|
||||||
text: currentComicInfo.getStoryArcInfoString()
|
|
||||||
rightPadding: 20
|
|
||||||
visible : currentComicInfo.getStoryArcInfoString().length > 0
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: currentComicInfoAlternate
|
|
||||||
color: currentComicDetailsFlowView.infoFlowTextColor
|
|
||||||
font: currentComicDetailsFlowView.infoFont
|
|
||||||
text: currentComicInfo.getAlternateSeriesString()
|
|
||||||
rightPadding: 20
|
|
||||||
visible : currentComicInfo.getStoryArcInfoString().length > 0
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: currentComicInfoSeriesGroup
|
|
||||||
color: currentComicDetailsFlowView.infoFlowTextColor
|
|
||||||
font: currentComicDetailsFlowView.infoFont
|
|
||||||
text: currentComicInfo.seriesGroup ? currentComicInfo.seriesGroup : ""
|
|
||||||
rightPadding: 20
|
|
||||||
visible: currentComicInfo.seriesGroup ? true : false
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: currentComicInfoGenre
|
|
||||||
color: currentComicDetailsFlowView.infoFlowTextColor
|
|
||||||
font: currentComicDetailsFlowView.infoFont
|
|
||||||
text: currentComicInfo.genere ? currentComicInfo.genere : ""
|
|
||||||
rightPadding: 20
|
|
||||||
visible: currentComicInfo.genere ? true : false
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: currentComicInfoDate
|
|
||||||
color: currentComicDetailsFlowView.infoFlowTextColor
|
|
||||||
font: currentComicDetailsFlowView.infoFont
|
|
||||||
text: currentComicInfo.date ? currentComicInfo.date : ""
|
|
||||||
rightPadding: 20
|
|
||||||
visible: currentComicInfo.date ? true : false
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: currentComicInfoPages
|
|
||||||
color: currentComicDetailsFlowView.infoFlowTextColor
|
|
||||||
font: currentComicDetailsFlowView.infoFont
|
|
||||||
text: (currentComicInfo.numPages ? currentComicInfo.numPages : "") + " pages"
|
|
||||||
rightPadding: 20
|
|
||||||
visible: currentComicInfo.numPages ? true : false
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: currentComicInfoShowInComicVine
|
|
||||||
font: currentComicDetailsFlowView.infoFont
|
|
||||||
color: "#ffcc00"
|
|
||||||
text: "Show in Comic Vine"
|
|
||||||
visible: currentComicInfo.comicVineID ? true : false
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
onClicked: {
|
|
||||||
Qt.openUrlExternally("http://www.comicvine.com/comic/4000-%1/".arg(comicInfo.comicVineID));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ScrollView {
|
|
||||||
Layout.topMargin: 6
|
|
||||||
Layout.rightMargin: 30
|
|
||||||
Layout.bottomMargin: 5
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.maximumHeight: (currentComicVisualView.height * 0.32)
|
|
||||||
Layout.maximumWidth: 960
|
|
||||||
|
|
||||||
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
|
|
||||||
|
|
||||||
contentWidth: -1
|
|
||||||
contentItem: currentComicInfoSinopsis
|
|
||||||
|
|
||||||
id: synopsisScroller
|
|
||||||
|
|
||||||
clip: true
|
|
||||||
|
|
||||||
Text {
|
|
||||||
Layout.maximumWidth: 960
|
|
||||||
|
|
||||||
width: synopsisScroller.width
|
|
||||||
|
|
||||||
id: currentComicInfoSinopsis
|
|
||||||
color: infoTitleColor
|
|
||||||
font.family: "Arial"
|
|
||||||
font.pixelSize: 14
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
|
|
||||||
text: '<html><head><style>
|
|
||||||
a {
|
|
||||||
color: #FFCB00;
|
|
||||||
text-decoration:none;
|
|
||||||
}
|
|
||||||
</style></head><body>' + currentComicInfo.synopsis ?? "" + '</body></html>'
|
|
||||||
visible: currentComicInfo.synopsis ?? false
|
|
||||||
textFormat: Text.RichText
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
containmentMask: null
|
|
||||||
text: "Read"
|
|
||||||
id: readButton
|
|
||||||
x: currentCoverElement.anchors.rightMargin + currentCoverElement.paintedWidth + currentCoverElement.anchors.rightMargin
|
|
||||||
anchors.bottom: currentCoverElement.bottom
|
|
||||||
anchors.bottomMargin: 15
|
|
||||||
|
|
||||||
onClicked: comicOpener.triggerOpenCurrentComic()
|
|
||||||
background: Rectangle {
|
|
||||||
implicitWidth: 100
|
|
||||||
implicitHeight: 30
|
|
||||||
border.width: readButton.activeFocus ? 2 : 1
|
|
||||||
border.color: "#FFCC00"
|
|
||||||
radius: height / 2
|
|
||||||
color: "#FFCC00"
|
|
||||||
}
|
|
||||||
|
|
||||||
contentItem: Text {
|
|
||||||
renderType: Text.NativeRendering
|
|
||||||
verticalAlignment: Text.AlignVCenter
|
|
||||||
horizontalAlignment: Text.AlignHCenter
|
|
||||||
font.family: "Arial"
|
|
||||||
font.pointSize: 12
|
|
||||||
font.bold: true
|
|
||||||
color: "white"
|
|
||||||
text: readButton.text
|
|
||||||
}
|
|
||||||
|
|
||||||
layer.enabled: showDropShadow && !readButton.pressed
|
|
||||||
layer.effect: MultiEffect {
|
|
||||||
shadowEnabled: true
|
|
||||||
shadowColor: "#AA000000"
|
|
||||||
shadowBlur: 1.0
|
|
||||||
blurMax: 8
|
|
||||||
shadowHorizontalOffset: 0
|
|
||||||
shadowVerticalOffset: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GridView {
|
|
||||||
id:grid
|
|
||||||
objectName: "grid"
|
|
||||||
anchors.fill: parent
|
|
||||||
cellHeight: cellCustomHeight
|
|
||||||
header: currentComicView
|
|
||||||
focus: true
|
|
||||||
model: comicsList
|
|
||||||
delegate: appDelegate
|
|
||||||
anchors.topMargin: 0
|
|
||||||
anchors.bottomMargin: 10
|
|
||||||
anchors.leftMargin: 0
|
|
||||||
anchors.rightMargin: 0
|
|
||||||
pixelAligned: true
|
|
||||||
highlightFollowsCurrentItem: true
|
|
||||||
|
|
||||||
currentIndex: 0
|
|
||||||
cacheBuffer: 0
|
|
||||||
|
|
||||||
interactive: true
|
|
||||||
|
|
||||||
move: Transition {
|
|
||||||
NumberAnimation { properties: "x,y"; duration: 250 }
|
|
||||||
}
|
|
||||||
|
|
||||||
moveDisplaced: Transition {
|
|
||||||
NumberAnimation { properties: "x,y"; duration: 250 }
|
|
||||||
}
|
|
||||||
|
|
||||||
remove: Transition {
|
|
||||||
ParallelAnimation {
|
|
||||||
NumberAnimation { property: "opacity"; to: 0; duration: 250 }
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
removeDisplaced: Transition {
|
|
||||||
NumberAnimation { properties: "x,y"; duration: 250 }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
displaced: Transition {
|
|
||||||
NumberAnimation { properties: "x,y"; duration: 250 }
|
|
||||||
}
|
|
||||||
|
|
||||||
function numCellsPerRow() {
|
|
||||||
return Math.floor(width / cellCustomWidth);
|
|
||||||
}
|
|
||||||
|
|
||||||
onWidthChanged: {
|
|
||||||
calculateCellWidths(cellCustomWidth);
|
|
||||||
}
|
|
||||||
|
|
||||||
function calculateCellWidths(cWidth) {
|
|
||||||
var wholeCells = Math.floor(width / cWidth);
|
|
||||||
var rest = width - (cWidth * wholeCells)
|
|
||||||
|
|
||||||
grid.cellWidth = cWidth + Math.floor(rest / wholeCells);
|
|
||||||
}
|
|
||||||
|
|
||||||
WheelHandler {
|
|
||||||
onWheel: {
|
|
||||||
if (grid.contentHeight <= grid.height) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var newValue = Math.min((grid.contentHeight - grid.height + grid.originY), (Math.max(grid.originY , grid.contentY - event.angleDelta.y)));
|
|
||||||
grid.contentY = newValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ScrollBar.vertical: ScrollBar {
|
|
||||||
visible: grid.contentHeight > grid.height
|
|
||||||
|
|
||||||
contentItem: Item {
|
|
||||||
implicitWidth: 12
|
|
||||||
implicitHeight: 26
|
|
||||||
Rectangle {
|
|
||||||
color: "#88424242"
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.topMargin: 6
|
|
||||||
anchors.leftMargin: 3
|
|
||||||
anchors.rightMargin: 2
|
|
||||||
anchors.bottomMargin: 6
|
|
||||||
border.color: "#AA313131"
|
|
||||||
border.width: 1
|
|
||||||
radius: 3.5
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Keys.onPressed: {
|
|
||||||
if (event.modifiers & Qt.ControlModifier || event.modifiers & Qt.ShiftModifier) {
|
|
||||||
event.accepted = true
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var numCells = grid.numCellsPerRow();
|
|
||||||
var ci = 0;
|
|
||||||
if (event.key === Qt.Key_Right) {
|
|
||||||
ci = Math.min(grid.currentIndex+1,grid.count - 1);
|
|
||||||
}
|
|
||||||
else if (event.key === Qt.Key_Left) {
|
|
||||||
ci = Math.max(0,grid.currentIndex-1);
|
|
||||||
}
|
|
||||||
else if (event.key === Qt.Key_Up) {
|
|
||||||
ci = Math.max(0,grid.currentIndex-numCells);
|
|
||||||
}
|
|
||||||
else if (event.key === Qt.Key_Down) {
|
|
||||||
ci = Math.min(grid.currentIndex+numCells,grid.count - 1);
|
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
event.accepted = true;
|
|
||||||
grid.currentIndex = -1
|
|
||||||
comicsSelectionHelper.clear();
|
|
||||||
currentIndexHelper.setCurrentIndex(ci);
|
|
||||||
grid.currentIndex = ci;
|
|
||||||
}
|
|
||||||
|
|
||||||
DropArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
onEntered: drag => {
|
|
||||||
if(drag.hasUrls)
|
|
||||||
{
|
|
||||||
if(dropManager.canDropUrls(drag.urls, drag.action))
|
|
||||||
{
|
|
||||||
drag.accepted = true;
|
|
||||||
}else
|
|
||||||
drag.accepted = false;
|
|
||||||
}
|
|
||||||
else if (dropManager.canDropFormats(drag.formats)) {
|
|
||||||
drag.accepted = true;
|
|
||||||
} else
|
|
||||||
drag.accepted = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
onDropped: drop => {
|
|
||||||
if(drop.hasUrls && dropManager.canDropUrls(drop.urls, drop.action))
|
|
||||||
{
|
|
||||||
dropManager.droppedFiles(drop.urls, drop.action);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
if (dropManager.canDropFormats(drop.formats))
|
|
||||||
{
|
|
||||||
var destItem = grid.itemAt(drop.x,drop.y + grid.contentY);
|
|
||||||
var destLocalX = grid.mapToItem(destItem,drop.x,drop.y + grid.contentY).x
|
|
||||||
var realIndex = grid.indexAt(drop.x,drop.y + grid.contentY);
|
|
||||||
|
|
||||||
if(realIndex === -1)
|
|
||||||
realIndex = grid.count - 1;
|
|
||||||
|
|
||||||
var destIndex = destLocalX < (grid.cellWidth / 2) ? realIndex : realIndex + 1;
|
|
||||||
dropManager.droppedComicsForResortingAt("", destIndex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: info_container
|
|
||||||
objectName: "infoContainer"
|
|
||||||
SplitView.preferredWidth: 350
|
|
||||||
SplitView.minimumWidth: 350
|
|
||||||
SplitView.maximumWidth: 960
|
|
||||||
height: parent.height
|
|
||||||
|
|
||||||
color: infoBackgroundColor
|
|
||||||
|
|
||||||
visible: showInfo
|
|
||||||
|
|
||||||
Flickable{
|
|
||||||
id: infoFlickable
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.margins: 0
|
|
||||||
|
|
||||||
contentWidth: infoView.width
|
|
||||||
contentHeight: infoView.height
|
|
||||||
|
|
||||||
ComicInfoView {
|
|
||||||
id: infoView
|
|
||||||
width: info_container.width
|
|
||||||
}
|
|
||||||
|
|
||||||
WheelHandler {
|
|
||||||
onWheel: {
|
|
||||||
if (infoFlickable.contentHeight <= infoFlickable.height) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var newValue = Math.min((infoFlickable.contentHeight - infoFlickable.height), (Math.max(infoFlickable.originY , infoFlickable.contentY - event.angleDelta.y)));
|
|
||||||
infoFlickable.contentY = newValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ScrollBar.vertical: ScrollBar {
|
|
||||||
visible: infoFlickable.contentHeight > infoFlickable.height
|
|
||||||
|
|
||||||
contentItem: Item {
|
|
||||||
implicitWidth: 12
|
|
||||||
implicitHeight: 26
|
|
||||||
Rectangle {
|
|
||||||
color: "#424246"
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.topMargin: 6
|
|
||||||
anchors.leftMargin: 5
|
|
||||||
anchors.rightMargin: 4
|
|
||||||
anchors.bottomMargin: 6
|
|
||||||
radius: 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,9 +1,11 @@
|
|||||||
import QtQuick 2.15
|
import QtQuick
|
||||||
|
|
||||||
import QtQuick.Controls 2.15
|
import QtQuick.Controls
|
||||||
|
|
||||||
import com.yacreader.ComicModel 1.0
|
import com.yacreader.ComicModel 1.0
|
||||||
|
|
||||||
|
import QtQuick.Controls.Basic
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
id: main
|
id: main
|
||||||
|
|
||||||
|
|||||||
@ -1,131 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
|
|
||||||
import QtQuick.Controls
|
|
||||||
|
|
||||||
import com.yacreader.ComicModel 1.0
|
|
||||||
|
|
||||||
import QtQuick.Controls.Basic
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: main
|
|
||||||
|
|
||||||
color: infoBackgroundColor
|
|
||||||
|
|
||||||
//width: parent.width
|
|
||||||
//height: parent.height
|
|
||||||
anchors.margins: 0
|
|
||||||
|
|
||||||
FlowView {
|
|
||||||
id: flow
|
|
||||||
objectName: "flow"
|
|
||||||
height: 256 //TODO dynamic size?
|
|
||||||
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
|
|
||||||
additionalBottomSpace: indicator.height
|
|
||||||
}
|
|
||||||
|
|
||||||
Image {
|
|
||||||
id: top_shadow
|
|
||||||
source: topShadow
|
|
||||||
width: parent.width
|
|
||||||
fillMode: Image.TileHorizontally
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: indicator_container
|
|
||||||
width: parent.width
|
|
||||||
y: 250
|
|
||||||
|
|
||||||
Image {
|
|
||||||
id: indicator
|
|
||||||
source: infoIndicator
|
|
||||||
}
|
|
||||||
|
|
||||||
Image {
|
|
||||||
id: bottom_shadow
|
|
||||||
x: indicator.width
|
|
||||||
width: parent.width - indicator.width
|
|
||||||
source: infoShadow
|
|
||||||
fillMode: Image.TileHorizontally
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: info_container
|
|
||||||
width: parent.width
|
|
||||||
y: flow.height + flow.additionalBottomSpace - 6
|
|
||||||
height: parent.height - y
|
|
||||||
|
|
||||||
clip: true
|
|
||||||
|
|
||||||
color: infoBackgroundColor
|
|
||||||
|
|
||||||
Flickable{
|
|
||||||
id: infoFlickable
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.margins: 0
|
|
||||||
|
|
||||||
contentWidth: infoView.width
|
|
||||||
contentHeight: infoView.height
|
|
||||||
|
|
||||||
ComicInfoView {
|
|
||||||
id: infoView
|
|
||||||
width: info_container.width - 14
|
|
||||||
}
|
|
||||||
|
|
||||||
WheelHandler {
|
|
||||||
onWheel: {
|
|
||||||
if (infoFlickable.contentHeight <= infoFlickable.height) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var newValue = Math.min((infoFlickable.contentHeight - infoFlickable.height), (Math.max(infoFlickable.originY , infoFlickable.contentY - event.angleDelta.y)));
|
|
||||||
infoFlickable.contentY = newValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ScrollBar.vertical: ScrollBar {
|
|
||||||
visible: infoFlickable.contentHeight > infoFlickable.height
|
|
||||||
|
|
||||||
contentItem: Item {
|
|
||||||
implicitWidth: 12
|
|
||||||
implicitHeight: 26
|
|
||||||
Rectangle {
|
|
||||||
color: "#424246"
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.topMargin: 6
|
|
||||||
anchors.leftMargin: 5
|
|
||||||
anchors.rightMargin: 4
|
|
||||||
anchors.bottomMargin: 6
|
|
||||||
radius: 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DropArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
onEntered: {
|
|
||||||
if(drag.hasUrls)
|
|
||||||
{
|
|
||||||
if(dropManager.canDropUrls(drag.urls, drag.action))
|
|
||||||
{
|
|
||||||
drag.accepted = true;
|
|
||||||
}else
|
|
||||||
drag.accepted = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onDropped: {
|
|
||||||
if(drop.hasUrls && dropManager.canDropUrls(drop.urls, drop.action))
|
|
||||||
{
|
|
||||||
dropManager.droppedFiles(drop.urls, drop.action);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
import QtQuick 2.15
|
import QtQuick
|
||||||
|
|
||||||
import QtGraphicalEffects 1.0
|
import QtQuick.Controls.impl
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
width: 20
|
width: 20
|
||||||
@ -17,15 +17,10 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Image {
|
ColorImage {
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
id: favorites_button_compact
|
id: favorites_button_compact
|
||||||
source: "info-favorites.svg"
|
source: "info-favorites.svg"
|
||||||
}
|
|
||||||
|
|
||||||
ColorOverlay {
|
|
||||||
anchors.fill: favorites_button_compact
|
|
||||||
source: favorites_button_compact
|
|
||||||
color: active ? favCheckedColor : favUncheckedColor
|
color: active ? favCheckedColor : favUncheckedColor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,27 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
|
|
||||||
import QtQuick.Controls.impl
|
|
||||||
|
|
||||||
Item {
|
|
||||||
width: 20
|
|
||||||
height: 20
|
|
||||||
|
|
||||||
property bool active
|
|
||||||
|
|
||||||
signal activeChangedByUser(bool active)
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: favorites_button_compact
|
|
||||||
onClicked: {
|
|
||||||
activeChangedByUser(!active);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ColorImage {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
id: favorites_button_compact
|
|
||||||
source: "info-favorites.svg"
|
|
||||||
color: active ? favCheckedColor : favUncheckedColor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
import QtQuick 2.15
|
import QtQuick
|
||||||
|
|
||||||
import QtGraphicalEffects 1.0
|
import QtQuick.Controls.impl
|
||||||
|
|
||||||
Row {
|
Row {
|
||||||
spacing: 0
|
spacing: 0
|
||||||
@ -16,14 +16,9 @@ Row {
|
|||||||
width: 25
|
width: 25
|
||||||
height: 20
|
height: 20
|
||||||
|
|
||||||
Image {
|
ColorImage {
|
||||||
id: star
|
id: star
|
||||||
source: "info-rating.svg"
|
source: "info-rating.svg"
|
||||||
}
|
|
||||||
|
|
||||||
ColorOverlay {
|
|
||||||
anchors.fill: star
|
|
||||||
source: star
|
|
||||||
color: index < (mouseIndex > 0 ? mouseIndex : rating) ? ratingSelectedColor : ratingUnselectedColor
|
color: index < (mouseIndex > 0 ? mouseIndex : rating) ? ratingSelectedColor : ratingUnselectedColor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,43 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
|
|
||||||
import QtQuick.Controls.impl
|
|
||||||
|
|
||||||
Row {
|
|
||||||
spacing: 0
|
|
||||||
property int rating : 0
|
|
||||||
property int mouseIndex : 0
|
|
||||||
|
|
||||||
signal ratingChangedByUser(int rating)
|
|
||||||
|
|
||||||
Repeater {
|
|
||||||
id: rating_compact
|
|
||||||
model: 5
|
|
||||||
Item {
|
|
||||||
width: 25
|
|
||||||
height: 20
|
|
||||||
|
|
||||||
ColorImage {
|
|
||||||
id: star
|
|
||||||
source: "info-rating.svg"
|
|
||||||
color: index < (mouseIndex > 0 ? mouseIndex : rating) ? ratingSelectedColor : ratingUnselectedColor
|
|
||||||
}
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
hoverEnabled: true
|
|
||||||
|
|
||||||
onPositionChanged: {
|
|
||||||
mouseIndex = index + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
onClicked: {
|
|
||||||
ratingChangedByUser(mouseIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
onExited: {
|
|
||||||
mouseIndex = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
import QtQuick 2.15
|
import QtQuick
|
||||||
|
|
||||||
import QtGraphicalEffects 1.0
|
import QtQuick.Controls.impl
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
|
|
||||||
@ -15,14 +15,9 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Image {
|
ColorImage {
|
||||||
id: read_compact
|
id: read_compact
|
||||||
source: "info-tick.svg"
|
source: "info-tick.svg"
|
||||||
}
|
|
||||||
|
|
||||||
ColorOverlay {
|
|
||||||
anchors.fill: read_compact
|
|
||||||
source: read_compact
|
|
||||||
color: read ? readTickCheckedColor : readTickUncheckedColor
|
color: read ? readTickCheckedColor : readTickUncheckedColor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,23 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
|
|
||||||
import QtQuick.Controls.impl
|
|
||||||
|
|
||||||
Item {
|
|
||||||
|
|
||||||
property bool read
|
|
||||||
|
|
||||||
signal readChangedByUser(bool read)
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: read_compact
|
|
||||||
onClicked: {
|
|
||||||
readChangedByUser(!read);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ColorImage {
|
|
||||||
id: read_compact
|
|
||||||
source: "info-tick.svg"
|
|
||||||
color: read ? readTickCheckedColor : readTickUncheckedColor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,28 +0,0 @@
|
|||||||
<RCC>
|
|
||||||
<qresource prefix="/">
|
|
||||||
<file alias="qml/GridComicsView.qml">qml/GridComicsView6.qml</file>
|
|
||||||
<file alias="qml/FolderContentView.qml">qml/FolderContentView6.qml</file>
|
|
||||||
<file alias="qml/FlowView.qml">qml/FlowView6.qml</file>
|
|
||||||
<file alias="qml/InfoTick.qml">qml/InfoTick6.qml</file>
|
|
||||||
<file alias="qml/InfoFavorites.qml">qml/InfoFavorites6.qml</file>
|
|
||||||
<file alias="qml/InfoRating.qml">qml/InfoRating6.qml</file>
|
|
||||||
<file alias="qml/InfoComicsView.qml">qml/InfoComicsView6.qml</file>
|
|
||||||
<file>qml/tick.png</file>
|
|
||||||
<file>qml/reading.png</file>
|
|
||||||
<file>qml/star_menu.png</file>
|
|
||||||
<file>qml/star_menu@2x.png</file>
|
|
||||||
<file>qml/info-indicator.png</file>
|
|
||||||
<file>qml/info-shadow.png</file>
|
|
||||||
<file>qml/info-indicator-light.png</file>
|
|
||||||
<file>qml/info-shadow-light.png</file>
|
|
||||||
<file>qml/info-indicator-light@2x.png</file>
|
|
||||||
<file>qml/info-shadow-light@2x.png</file>
|
|
||||||
<file>qml/info-top-shadow.png</file>
|
|
||||||
<file>qml/ComicInfoView.qml</file>
|
|
||||||
<file>qml/info-favorites.svg</file>
|
|
||||||
<file>qml/info-rating.svg</file>
|
|
||||||
<file>qml/info-tag.svg</file>
|
|
||||||
<file>qml/info-tick.svg</file>
|
|
||||||
<file>qml/prerendered_cover_shadow.png</file>
|
|
||||||
</qresource>
|
|
||||||
</RCC>
|
|
||||||
Reference in New Issue
Block a user