Use only the qt6 versions of the qml implementations

This commit is contained in:
luisangelsm
2026-02-13 12:37:33 +01:00
parent 87b215cfb0
commit 3ff93a570e
17 changed files with 143 additions and 2008 deletions

View File

@ -1,7 +1,8 @@
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick
import QtGraphicalEffects 1.0
import QtQuick.Controls
import QtQuick.Effects
import com.yacreader.ComicModel 1.0
@ -38,14 +39,16 @@ Rectangle {
mipmap: true
asynchronous : true
cache: false //TODO clear cache only when it is needed
opacity: 0
layer.enabled: true
visible: false
}
FastBlur {
MultiEffect {
anchors.fill: backgroundImg
source: backgroundImg
radius: backgroundBlurRadius
blurEnabled: true
blur: 1.0
blurMax: 64
opacity: backgroundBlurOpacity
visible: backgroundBlurVisible
}
@ -112,26 +115,32 @@ Rectangle {
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
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
}
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
@ -144,6 +153,7 @@ Rectangle {
cache: false
}
//mark
Image {
id: mark

View File

@ -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;
}
}
}

View File

@ -1,15 +1,17 @@
import QtQuick 2.15
import QtQuick
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.12
import QtQuick.Controls
import QtQuick.Layouts
import QtGraphicalEffects 1.0
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
@ -117,18 +119,31 @@ Rectangle {
mipmap: true
asynchronous : true
cache: true
visible: false
}
Item {
id: coverMask
anchors.fill: parent
layer.enabled: true
layer.effect: OpacityMask {
layer.smooth: true
visible: false
Rectangle {
anchors.fill: parent
cached: true
maskSource: Rectangle {
width: coverElement.width
height: coverElement.height
radius: 10
}
radius: 10
color: "black"
}
}
MultiEffect {
source: coverImage
anchors.fill: coverImage
maskEnabled: true
maskSource: coverMask
maskThresholdMin: 0.5
maskSpreadAtMin: 1.0
}
}
//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 {
visible: grid.contentHeight > grid.height

View File

@ -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);
}
}
}
}
}
}
}

View File

@ -1,15 +1,17 @@
import QtQuick 2.15
import QtQuick
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.12
import QtQuick.Controls
import QtQuick.Layouts
import QtGraphicalEffects 1.0
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 {
@ -31,14 +33,16 @@ SplitView {
mipmap: true
asynchronous : true
cache: false //TODO clear cache only when it is needed
opacity: 0
layer.enabled: true
visible: false
}
FastBlur {
MultiEffect {
anchors.fill: backgroundImg
source: backgroundImg
radius: backgroundBlurRadius
blurEnabled: true
blur: 1.0
blurMax: 64
opacity: backgroundBlurOpacity
visible: backgroundBlurVisible
}
@ -377,30 +381,38 @@ SplitView {
comicsSelectionHelper.clear();
comicsSelectionHelper.selectIndex(index);
grid.currentIndex = index;
ratingConextMenu.popup();
}
}
ratingLoader.active = true;
ratingLoader.item.popup();
}
}
Menu {
background: Rectangle {
implicitWidth: 42
implicitHeight: 100
//border.color: "#222"
//color: "#444"
}
Loader {
id: ratingLoader
active: false
sourceComponent: ratingConextMenuComponent
}
id: ratingConextMenu
Component {
id: ratingConextMenuComponent
Menu {
background: Rectangle {
implicitWidth: 42
implicitHeight: 100
}
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) }
id: ratingConextMenu
delegate: MenuItem {
implicitHeight: 30
}
}
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
@ -462,17 +474,16 @@ SplitView {
mipmap: true
asynchronous : true
cache: false //TODO clear cache only when it is needed
}
DropShadow {
anchors.fill: currentCoverElement
horizontalOffset: 0
verticalOffset: 0
radius: 8.0
samples: 17
color: "#FF000000"
source: currentCoverElement
visible: showDropShadow;
layer.enabled: showDropShadow
layer.effect: MultiEffect {
shadowEnabled: true
shadowColor: "#FF000000"
shadowBlur: 1.0
blurMax: 8
shadowHorizontalOffset: 0
shadowVerticalOffset: 0
}
}
ColumnLayout
@ -503,7 +514,8 @@ SplitView {
font.pixelSize: 21
wrapMode: Text.WordWrap
text: currentComic ? currentComic.getTitleIncludingNumber() : "" }
text: currentComic?.getTitleIncludingNumber() ?? ""
}
Flow {
spacing: 0
@ -615,6 +627,7 @@ SplitView {
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
contentWidth: -1
contentItem: currentComicInfoSinopsis
id: synopsisScroller
@ -645,6 +658,7 @@ SplitView {
}
Button {
containmentMask: null
text: "Read"
id: readButton
x: currentCoverElement.anchors.rightMargin + currentCoverElement.paintedWidth + currentCoverElement.anchors.rightMargin
@ -671,18 +685,16 @@ SplitView {
color: "white"
text: readButton.text
}
}
DropShadow {
anchors.fill: readButton
horizontalOffset: 0
verticalOffset: 0
radius: 8.0
samples: 17
color: "#AA000000"
source: readButton
visible: showDropShadow && !readButton.pressed
layer.enabled: showDropShadow && !readButton.pressed
layer.effect: MultiEffect {
shadowEnabled: true
shadowColor: "#AA000000"
shadowBlur: 1.0
blurMax: 8
shadowHorizontalOffset: 0
shadowVerticalOffset: 0
}
}
}
}

View File

@ -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
}
}
}
}
}
}

View File

@ -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 QtQuick.Controls.Basic
Rectangle {
id: main

View File

@ -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);
}
}
}
}

View File

@ -1,6 +1,6 @@
import QtQuick 2.15
import QtQuick
import QtGraphicalEffects 1.0
import QtQuick.Controls.impl
Item {
width: 20
@ -17,15 +17,10 @@ Item {
}
}
Image {
ColorImage {
anchors.centerIn: parent
id: favorites_button_compact
source: "info-favorites.svg"
}
ColorOverlay {
anchors.fill: favorites_button_compact
source: favorites_button_compact
color: active ? favCheckedColor : favUncheckedColor
}
}

View File

@ -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
}
}

View File

@ -1,6 +1,6 @@
import QtQuick 2.15
import QtQuick
import QtGraphicalEffects 1.0
import QtQuick.Controls.impl
Row {
spacing: 0
@ -16,14 +16,9 @@ Row {
width: 25
height: 20
Image {
ColorImage {
id: star
source: "info-rating.svg"
}
ColorOverlay {
anchors.fill: star
source: star
color: index < (mouseIndex > 0 ? mouseIndex : rating) ? ratingSelectedColor : ratingUnselectedColor
}

View File

@ -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;
}
}
}
}
}

View File

@ -1,6 +1,6 @@
import QtQuick 2.15
import QtQuick
import QtGraphicalEffects 1.0
import QtQuick.Controls.impl
Item {
@ -15,14 +15,9 @@ Item {
}
}
Image {
ColorImage {
id: read_compact
source: "info-tick.svg"
}
ColorOverlay {
anchors.fill: read_compact
source: read_compact
color: read ? readTickCheckedColor : readTickUncheckedColor
}
}

View File

@ -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
}
}