Favorites implementation #27

Merged
dorian merged 5 commits from favorites_implementation into master 2024-10-17 17:52:37 +02:00
37 changed files with 247 additions and 15 deletions
Showing only changes of commit 33a36aa055 - Show all commits

View file

@ -1,5 +1,5 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<manifest package="com.itsblue.blueROCKtest" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="0.02.1" android:versionCode="9" android:installLocation="auto"> <manifest package="com.itsblue.blueROCK" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="0.02.1" android:versionCode="11" android:installLocation="auto">
<application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="blueROCK" android:icon="@drawable/icon"> <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="blueROCK" android:icon="@drawable/icon">
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="blueROCK" android:screenOrientation="unspecified" android:launchMode="singleTop"> <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="blueROCK" android:screenOrientation="unspecified" android:launchMode="singleTop">
<intent-filter> <intent-filter>
@ -65,7 +65,7 @@
</application> </application>
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="28"/> <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28"/>
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/> <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
<!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application. <!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,36 @@
import QtQuick 2.12
import QtQuick.Controls 2.12
Item {
id: control
property var images: []
SwipeView {
id: view
clip: true
anchors.fill: parent
anchors.margins: 1
anchors.bottomMargin: indicator.height
Repeater {
model: control.images.length
delegate: Image {
source: control.images[index]
fillMode: Image.PreserveAspectFit
}
}
}
PageIndicator {
id: indicator
anchors.bottom: control.bottom
anchors.horizontalCenter: parent.horizontalCenter
count: view.count
currentIndex: view.currentIndex
}
}

View file

@ -61,7 +61,7 @@ DataListView {
} }
} }
compCats.push( {"text": qsTr("Favorites"), "data": {"sort_rank":0, "cat_id":[-1]}} ) compCats.push( {"text": qsTr("Pinned"), "data": {"sort_rank":0, "cat_id":[-1]}} )
compCats.sort(function(a, b) { compCats.sort(function(a, b) {
return a['data']['sort_rank'] - b['data']['sort_rank']; return a['data']['sort_rank'] - b['data']['sort_rank'];
@ -333,7 +333,7 @@ DataListView {
if(control.compFavorites.indexOf(compId) >= 0 && !favorite) { if(control.compFavorites.indexOf(compId) >= 0 && !favorite) {
control.compFavorites.splice( control.compFavorites.indexOf(compId), 1) control.compFavorites.splice( control.compFavorites.indexOf(compId), 1)
} }
else if(!control.compFavorites.indexOf(compId) >= 0 && favorite) { else if(control.compFavorites.indexOf(compId) < 0 && favorite) {
control.compFavorites.push(compId) control.compFavorites.push(compId)
} }
@ -400,14 +400,21 @@ DataListView {
property var cats: thisData["cats"] property var cats: thisData["cats"]
property int catId: thisData["cat_id"] === undefined ? 0:thisData["cat_id"] property int catId: thisData["cat_id"] === undefined ? 0:thisData["cat_id"]
property bool includedByFavorites: control.displayedCompCats.indexOf(-1) >= 0 && control.compFavorites.indexOf(parseInt(thisData['WetId'])) >= 0 property bool thisIsFavored: control.compFavorites.indexOf(parseInt(thisData['WetId'])) >= 0
property bool includedByFavorites: control.displayedCompCats.indexOf(-1) >= 0 && thisIsFavored
property bool includedByFilter: control.displayedCompCats.indexOf(parseInt(thisData['cat_id'])) >= 0 property bool includedByFilter: control.displayedCompCats.indexOf(parseInt(thisData['cat_id'])) >= 0
property bool thisIsVisible: includedByFavorites || includedByFilter property bool thisIsVisible: includedByFavorites || includedByFilter
function updateVisibility() {
competitionDel.includedByFilter = control.displayedCompCats.indexOf(parseInt(competitionDel.thisData['cat_id'])) >= 0
competitionDel.thisIsFavored = control.compFavorites.indexOf(parseInt(thisData['WetId'])) >= 0
competitionDel.includedByFavorites = control.displayedCompCats.indexOf(-1) >= 0 && thisIsFavored
}
width: parent.width width: parent.width
height: thisIsVisible ? compDelCol.height + 10 : 0 height: thisIsVisible ? compDelCol.height + 10 : 0
enabled: (thisData["cats"] !== undefined && thisData["cats"].length > 0) || competitionDel.thisData["homepage"] !== undefined || getCompInfoUrl(index) !== undefined enabled: ((thisData["cats"] !== undefined && thisData["cats"].length > 0) || competitionDel.thisData["homepage"] !== undefined || getCompInfoUrl(index) !== undefined) && height > 0
//visible: includedByFilter //visible: includedByFilter
opacity: 0 opacity: 0
@ -416,11 +423,11 @@ DataListView {
Connections { Connections {
target: control target: control
onDisplayedCompCatsChanged: { onDisplayedCompCatsChanged: {
competitionDel.includedByFilter = control.displayedCompCats.indexOf(parseInt(competitionDel.thisData['cat_id'])) >= 0 competitionDel.updateVisibility()
} }
onCompFavoritesChanged: { onCompFavoritesChanged: {
competitionDel.includedByFavorites = control.displayedCompCats.indexOf(-1) >= 0 && control.compFavorites.indexOf(parseInt(thisData['WetId'])) >= 0 competitionDel.updateVisibility()
} }
} }
@ -497,12 +504,30 @@ DataListView {
} }
ToolButton { ToolButton {
icon.name: competitionDel.includedByFavorites ? "bookmarkFilled":"bookmark" id: bookmarkTb
icon.name: competitionDel.thisIsFavored ? "pinFilled":"pin"
onClicked: { onClicked: {
control.editFavorites(!competitionDel.includedByFavorites, parseInt(thisData['WetId'])) control.editFavorites(!competitionDel.thisIsFavored, parseInt(thisData['WetId']))
} }
Layout.alignment: Layout.Right Layout.alignment: Layout.Right
Behavior on icon.name {
SequentialAnimation {
NumberAnimation {
property: "scale"
target: bookmarkTb
duration: 75
to: 0.8
}
NumberAnimation {
property: "scale"
target: bookmarkTb
duration: 75
to: 1
}
}
}
} }
} }

View file

@ -17,10 +17,13 @@
*/ */
import QtQuick 2.9 import QtQuick 2.9
import QtQuick.Controls 2.4 import QtQuick.Controls 2.5
import QtQuick.Layouts 1.3 import QtQuick.Layouts 1.3
import QtGraphicalEffects 1.0 import QtGraphicalEffects 1.0
import QtQuick.Controls.Material 2.3 import QtQuick.Controls.Material 2.3
import QtLocation 5.13
import QtPurchasing 1.13
import "../Components" import "../Components"
@ -734,6 +737,131 @@ DataListView {
speedFlowChartBackgroundRect.state = 'hidden' speedFlowChartBackgroundRect.state = 'hidden'
} }
} }
Rectangle {
id: speedFlowChartLockedOverlay
state: appSettings.read("speedBackendPurchase") === "1" ? "unlocked":"locked"
anchors.fill: parent
anchors.margins: -20
color: "white"
Connections {
target: speedFlowChartProduct
onPurchaseRestored: {
speedFlowChartLockedOverlay.state = appSettings.read("speedBackendPurchase") === "1" ? "unlocked":"locked"
}
onPurchaseSucceeded: {
speedFlowChartLockedOverlay.state = appSettings.read("speedBackendPurchase") === "1" ? "unlocked":"locked"
}
onPurchaseFailed: {
purchaseBt.text = qsTr("Purchase failed")
purchaseBt.enabled = false
buttonTextResetTimer.start()
}
}
Timer {
id: buttonTextResetTimer
interval: 2000
running: false
repeat: false
onTriggered: {
purchaseBt.text = (speedFlowChartProduct.status === Product.Registered
? "Buy now for " + speedFlowChartProduct.price
: qsTr("this item is currently unavailable"))
purchaseBt.enabled = true
}
}
ColumnLayout {
id: lockedLayout
anchors {
fill: parent
topMargin: parent.height * 0.05
bottomMargin: parent.height * 0.1
rightMargin: parent.width * 0.1 + 20
leftMargin: parent.width * 0.1 + 20
}
//spacing: parent.height * 0.05
Image {
id: name
Layout.alignment: Layout.Center
Layout.preferredHeight: height
Layout.preferredWidth: width
width: lockedLayout.height * 0.1
height: width
mipmap: true
source: "qrc:/icons/lock.png"
}
Text {
Layout.fillWidth: true
height: parent.height * 0.05
text: qsTr("This is a premium feature.")
font.bold: true
font.pixelSize: parent.height * 0.05
fontSizeMode: Text.Fit
minimumPixelSize: 1
horizontalAlignment: Text.AlignHCenter
}
SwipeGallery {
Layout.fillHeight: true
Layout.fillWidth: true
images: ["qrc:/screenshots/SpeedFlowchartDemo/1.png","qrc:/screenshots/SpeedFlowchartDemo/2.png","qrc:/screenshots/SpeedFlowchartDemo/3.png"]
}
Button {
id: purchaseBt
Layout.alignment: Layout.Center
enabled: speedFlowChartProduct.status === Product.Registered
text: speedFlowChartProduct.status === Product.Registered
? "Buy now for " + speedFlowChartProduct.price
: qsTr("this item is currently unavailable")
icon.name: "buy"
//display: AbstractButton.TextBesideIcon
onClicked: speedFlowChartProduct.purchase()
}
}
states: [
State {
name: "unlocked"
PropertyChanges {
target: speedFlowChartLockedOverlay
visible: false
}
},
State {
name: "locked"
PropertyChanges {
target: speedFlowChartLockedOverlay
visible: true
}
}
]
}
} }
states: [ states: [

View file

@ -20,7 +20,7 @@ import QtQuick 2.9
import QtQuick.Window 2.2 import QtQuick.Window 2.2
import QtQuick.Controls 2.4 import QtQuick.Controls 2.4
import QtQuick.Layouts 1.3 import QtQuick.Layouts 1.3
import QtPurchasing 1.0 import QtPurchasing 1.13
import com.itsblue.digitalRockRanking 1.0 import com.itsblue.digitalRockRanking 1.0
@ -568,6 +568,26 @@ Window {
} }
} }
Store {
Product {
id: speedFlowChartProduct
identifier: "speed_flowchart"
type: Product.Unlockable
onPurchaseRestored: {
appSettings.write("speedBackendPurchase", 1)
}
onPurchaseSucceeded: {
appSettings.write("speedBackendPurchase", 1)
}
onPurchaseFailed: {
appSettings.write("speedBackendPurchase", 0)
}
}
}
function landscape(){ function landscape(){
return app.height < app.width return app.height < app.width
} }

View file

@ -18,5 +18,6 @@
<file>Widgets/RankingWidget.qml</file> <file>Widgets/RankingWidget.qml</file>
<file>Pages/AthleteSearchPage.qml</file> <file>Pages/AthleteSearchPage.qml</file>
<file>Components/SpeedFlowChart.qml</file> <file>Components/SpeedFlowChart.qml</file>
<file>Components/SwipeGallery.qml</file>
</qresource> </qresource>
</RCC> </RCC>

Binary file not shown.

After

Width:  |  Height:  |  Size: 715 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 501 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 843 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 731 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 829 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 960 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 975 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 838 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 674 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 957 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 981 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 777 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

View file

@ -29,7 +29,6 @@
<file>icons/dig_rock.klein.jpg</file> <file>icons/dig_rock.klein.jpg</file>
<file>icons/dig_rock.klein.png</file> <file>icons/dig_rock.klein.png</file>
<file>icons/favicon.png</file> <file>icons/favicon.png</file>
<file>icons/json.php.json</file>
<file>icons/bluerock/20x20/calendar.png</file> <file>icons/bluerock/20x20/calendar.png</file>
<file>icons/bluerock/20x20@2/calendar.png</file> <file>icons/bluerock/20x20@2/calendar.png</file>
<file>icons/bluerock/20x20@3/calendar.png</file> <file>icons/bluerock/20x20@3/calendar.png</file>
@ -54,5 +53,29 @@
<file>icons/bluerock/20x20@3/bookmarkFilled.png</file> <file>icons/bluerock/20x20@3/bookmarkFilled.png</file>
<file>icons/bluerock/20x20@4/bookmark.png</file> <file>icons/bluerock/20x20@4/bookmark.png</file>
<file>icons/bluerock/20x20@4/bookmarkFilled.png</file> <file>icons/bluerock/20x20@4/bookmarkFilled.png</file>
<file>icons/bluerock/20x20/buy.png</file>
<file>icons/bluerock/20x20@2/buy.png</file>
<file>icons/bluerock/20x20@3/buy.png</file>
<file>icons/bluerock/20x20@4/buy.png</file>
<file>icons/lock.png</file>
<file>icons/bluerock/20x20/star.png</file>
<file>icons/bluerock/20x20/starFilled.png</file>
<file>icons/bluerock/20x20@2/star.png</file>
<file>icons/bluerock/20x20@2/starFilled.png</file>
<file>icons/bluerock/20x20@3/star.png</file>
<file>icons/bluerock/20x20@3/starFilled.png</file>
<file>icons/bluerock/20x20@4/star.png</file>
<file>icons/bluerock/20x20@4/starFilled.png</file>
<file>icons/bluerock/20x20/pin.png</file>
<file>icons/bluerock/20x20/pinFilled.png</file>
<file>icons/bluerock/20x20@2/pin.png</file>
<file>icons/bluerock/20x20@2/pinFilled.png</file>
<file>icons/bluerock/20x20@3/pin.png</file>
<file>icons/bluerock/20x20@3/pinFilled.png</file>
<file>icons/bluerock/20x20@4/pin.png</file>
<file>icons/bluerock/20x20@4/pinFilled.png</file>
<file>screenshots/SpeedFlowchartDemo/1.png</file>
<file>screenshots/SpeedFlowchartDemo/2.png</file>
<file>screenshots/SpeedFlowchartDemo/3.png</file>
</qresource> </qresource>
</RCC> </RCC>

View file

@ -43,7 +43,7 @@ QVariant ServerConn::getWidgetData(QVariantMap params){
requestUrl += iter.key() + "=" + iter.value().toString() + "&"; requestUrl += iter.key() + "=" + iter.value().toString() + "&";
} }
requestUrl = requestUrl.left(requestUrl.length() - 1); // remove last & requestUrl = requestUrl.left(requestUrl.length() - 1); // remove last '&'
qDebug() << requestUrl; qDebug() << requestUrl;