From f2005e37296fcf9ce4de20e285ac575b9e10e989 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 5 Oct 2024 10:06:42 +0000 Subject: [PATCH 01/14] Translate app/i18n/input_en.ts in sl 100% translated source file: 'app/i18n/input_en.ts' on 'sl'. --- app/i18n/input_sl.ts | 52 ++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/app/i18n/input_sl.ts b/app/i18n/input_sl.ts index 980815380..c406d3d90 100644 --- a/app/i18n/input_sl.ts +++ b/app/i18n/input_sl.ts @@ -353,8 +353,8 @@ V projekt ne bo dodano. MMAboutPage - About Mergin Maps - O Mergin Maps + About + O programu @@ -389,8 +389,8 @@ V projekt ne bo dodano. - It is better to work together, join the workspace and explore Mergin Maps! - Bolje je delati skupaj, pridruži se delovnemu prostoru in začni raziskovati Mergin Maps! + Join the workspace and explore together! + Pridruži se delovnemu prostoru in raziščimo skupaj! @@ -422,8 +422,8 @@ V projekt ne bo dodano. - I accept the Mergin Maps %1Terms and Conditions%3 and %2Privacy Policy%3 - Sprejemam Mergin Maps %1Pogoje uporabe%3 in %2Politiko zasebnosti%3 + I accept the %1Terms and Conditions%3 and %2Privacy Policy%3 + Sprejemam %1pravila in pogoje%3 ter %2politiko zasebnosti%3 @@ -583,8 +583,8 @@ V projekt ne bo dodano. - This action will delete your Mergin Maps account. If you are a workspace owner, you need to transfer the ownership to somebody else or close the workspace. - To dejanje bo izbrisalo tvoj Mergin Maps račun . Če si lastnik delovnega prostora, moraš lastništvo prenesti na nekoga drugega ali zapreti delovni prostor. + This action will delete your account. If you are a workspace owner, you need to transfer the ownership to somebody else or close the workspace. + To dejanje bo izbrisalo tvoj račun . Če si lastnik delovnega prostora, moraš lastništvo prenesti na nekoga drugega ali zapreti delovni prostor. @@ -659,8 +659,8 @@ V projekt ne bo dodano. - Tip from Mergin Maps - Nasvet od Mergin Maps + A tip from us + Nasvet od nas @@ -1427,8 +1427,8 @@ V projekt ne bo dodano. - You need to be signed in to your Mergin Maps account in order to synchronise the project. - Za sinhronizacijo projekta moraš biti prijavljen v svoj Mergin Maps račun. + You need to be signed in to your account in order to synchronise the project. + Za sinhronizacijo projekta moraš biti prijavljen v svoj račun. @@ -1524,8 +1524,8 @@ V projekt ne bo dodano. - This function is not available on iOS. Your hardware vendor may provide a custom app that connects to the receiver and sets position. Mergin Maps will still think it is the internal GPS of your phone/tablet. - Ta funkcija ni na voljo za iOS. Vaš prodajalec strojne opreme lahko zagotovi posebno aplikacijo, ki se poveže s sprejemnikom in nastavi lokacijo. Mergin Maps bo še vedno upošteval, da je to notranji GPS vašega telefona/tablice. + This function is not available on iOS. Your hardware vendor may provide a custom app that connects to the receiver and sets position. The app will still think it is the internal GPS of your phone/tablet. + Ta funkcija ni na voljo za iOS. Vaš prodajalec strojne opreme lahko zagotovi posebno aplikacijo, ki se poveže s sprejemnikom in nastavi lokacijo. Aplikacija bo še vedno upoštevala, da je to notranji GPS vašega telefona/tablice. @@ -1547,13 +1547,13 @@ V projekt ne bo dodano. - Mergin Maps can track your position on this project. - Mergin Maps lahko v tem projektu sledi tvojemu položaju. + Track your routes even with your screen off. Your records are stored in a separate layer. Finalised tracks are synced like any other feature. + Sledi tvojim potem tudi ob izklopljenem zaslonu. Poti so shranjene v ločenem sloju. Končane poti se sinhronizirajo enako kot drugi podatki. - Track your routes even with your screen off. Your records are stored in a separate layer. Finalised tracks are synced like any other feature. - Sledi tvojim potem tudi ob izklopljenem zaslonu. Poti so shranjene v ločenem sloju. Končane poti se sinhronizirajo enako kot drugi podatki. + The app can track your position on this project. + Aplikacija lahko v tem projektu sledi tvojemu položaju. @@ -1695,8 +1695,8 @@ V projekt ne bo dodano. - Click here to visit Mergin Maps dashboard - Klikni tukaj za Mergin Maps nadzorno ploščo + Click here to access the dashboard + Klikni tukaj za dostop do nadzorne plošče @@ -1769,8 +1769,8 @@ V projekt ne bo dodano. - Get started with Mergin Maps - Začni delo z Mergin Maps + Let's get started + Začnimo! @@ -2327,12 +2327,12 @@ V projekt ne bo dodano. Stop streaming mode - Stop streaming mode + Ustavi sledenje Start streaming mode - Start streaming mode + Začni sledenje @@ -2398,8 +2398,8 @@ V projekt ne bo dodano. - We've been busy making Mergin Maps even better! This update brings a fresh look and improved navigation, making it faster to find what you need. Take a look around! - We've been busy making Mergin Maps even better! This update brings a fresh look and improved navigation, making it faster to find what you need. Take a look around! + We've been busy making the app even better! This update brings a fresh look and improved navigation, making it faster to find what you need. Take a look around! + Zelo smo se potrudili, da bi aplikacijo še izboljšali! Ta posodobitev prinaša svež videz in izboljšano navigacijo, zaradi česar boš hitreje našeš, kar potrebuješ. Razišči naokrog! From fd9335c73061ae31186c695af421f21e8f4e3089 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 5 Oct 2024 10:06:43 +0000 Subject: [PATCH 02/14] Translate app/i18n/input_en.ts in sl_SI 100% translated source file: 'app/i18n/input_en.ts' on 'sl_SI'. --- app/i18n/input_sl_SI.ts | 48 ++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/app/i18n/input_sl_SI.ts b/app/i18n/input_sl_SI.ts index 855d2c0b2..835b58300 100644 --- a/app/i18n/input_sl_SI.ts +++ b/app/i18n/input_sl_SI.ts @@ -353,8 +353,8 @@ V projekt ne bo dodano. MMAboutPage - About Mergin Maps - O Mergin Maps + About + O programu @@ -389,8 +389,8 @@ V projekt ne bo dodano. - It is better to work together, join the workspace and explore Mergin Maps! - Bolje je delati skupaj, pridruži se delovnemu prostoru in začni raziskovati Mergin Maps! + Join the workspace and explore together! + Pridruži se delovnemu prostoru in raziščimo skupaj! @@ -422,8 +422,8 @@ V projekt ne bo dodano. - I accept the Mergin Maps %1Terms and Conditions%3 and %2Privacy Policy%3 - Sprejemam Mergin Maps %1Pogoje uporabe%3 in %2Politiko zasebnosti%3 + I accept the %1Terms and Conditions%3 and %2Privacy Policy%3 + Sprejemam %1pravila in pogoje%3 ter %2politiko zasebnosti%3 @@ -583,8 +583,8 @@ V projekt ne bo dodano. - This action will delete your Mergin Maps account. If you are a workspace owner, you need to transfer the ownership to somebody else or close the workspace. - To dejanje bo izbrisalo tvoj Mergin Maps račun . Če si lastnik delovnega prostora, moraš lastništvo prenesti na nekoga drugega ali zapreti delovni prostor. + This action will delete your account. If you are a workspace owner, you need to transfer the ownership to somebody else or close the workspace. + To dejanje bo izbrisalo tvoj račun . Če si lastnik delovnega prostora, moraš lastništvo prenesti na nekoga drugega ali zapreti delovni prostor. @@ -659,8 +659,8 @@ V projekt ne bo dodano. - Tip from Mergin Maps - Nasvet od Mergin Maps + A tip from us + Nasvet od nas @@ -1427,8 +1427,8 @@ V projekt ne bo dodano. - You need to be signed in to your Mergin Maps account in order to synchronise the project. - Za sinhronizacijo projekta moraš biti prijavljen v svoj Mergin Maps račun. + You need to be signed in to your account in order to synchronise the project. + Za sinhronizacijo projekta moraš biti prijavljen v svoj račun. @@ -1524,8 +1524,8 @@ V projekt ne bo dodano. - This function is not available on iOS. Your hardware vendor may provide a custom app that connects to the receiver and sets position. Mergin Maps will still think it is the internal GPS of your phone/tablet. - Ta funkcija ni na voljo za iOS. Vaš prodajalec strojne opreme lahko zagotovi posebno aplikacijo, ki se poveže s sprejemnikom in nastavi lokacijo. Mergin Maps bo še vedno upošteval, da je to notranji GPS vašega telefona/tablice. + This function is not available on iOS. Your hardware vendor may provide a custom app that connects to the receiver and sets position. The app will still think it is the internal GPS of your phone/tablet. + Ta funkcija ni na voljo za iOS. Vaš prodajalec strojne opreme lahko zagotovi posebno aplikacijo, ki se poveže s sprejemnikom in nastavi lokacijo. Aplikacija bo še vedno upoštevala, da je to notranji GPS vašega telefona/tablice. @@ -1547,13 +1547,13 @@ V projekt ne bo dodano. - Mergin Maps can track your position on this project. - Mergin Maps lahko v tem projektu sledi tvojemu položaju. + Track your routes even with your screen off. Your records are stored in a separate layer. Finalised tracks are synced like any other feature. + Snema tvoje poti tudi ob izklopljenem zaslonu. Posnete poti so shranjene v ločenem sloju. Končane poti se sinhronizirajo enako kot drugi podatki. - Track your routes even with your screen off. Your records are stored in a separate layer. Finalised tracks are synced like any other feature. - Snema tvoje poti tudi ob izklopljenem zaslonu. Posnete poti so shranjene v ločenem sloju. Končane poti se sinhronizirajo enako kot drugi podatki. + The app can track your position on this project. + Aplikacija lahko v tem projektu sledi tvojemu položaju. @@ -1695,8 +1695,8 @@ V projekt ne bo dodano. - Click here to visit Mergin Maps dashboard - Klikni tukaj za Mergin Maps nadzorno ploščo + Click here to access the dashboard + Klikni tukaj za dostop do nadzorne plošče @@ -1769,8 +1769,8 @@ V projekt ne bo dodano. - Get started with Mergin Maps - Začni delo z Mergin Maps + Let's get started + Začnimo! @@ -2398,8 +2398,8 @@ V projekt ne bo dodano. - We've been busy making Mergin Maps even better! This update brings a fresh look and improved navigation, making it faster to find what you need. Take a look around! - We've been busy making Mergin Maps even better! This update brings a fresh look and improved navigation, making it faster to find what you need. Take a look around! + We've been busy making the app even better! This update brings a fresh look and improved navigation, making it faster to find what you need. Take a look around! + Zelo smo se potrudili, da bi aplikacijo še izboljšali! Ta posodobitev prinaša svež videz in izboljšano navigacijo, zaradi česar boš hitreje našeš, kar potrebuješ. Razišči naokrog! From f5771fda0ec8e3a2d67340921b53167a2b2877c1 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 6 Oct 2024 09:05:39 +0000 Subject: [PATCH 03/14] Translate app/i18n/input_en.ts in sl 100% translated source file: 'app/i18n/input_en.ts' on 'sl'. --- app/i18n/input_sl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/i18n/input_sl.ts b/app/i18n/input_sl.ts index c406d3d90..36bcf2b08 100644 --- a/app/i18n/input_sl.ts +++ b/app/i18n/input_sl.ts @@ -1200,7 +1200,7 @@ V projekt ne bo dodano. (no-entries) - (no-entries) + (ni-zapisov) From b1de39fd7855beee71307db675505875207b11bc Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 6 Oct 2024 09:06:01 +0000 Subject: [PATCH 04/14] Translate app/i18n/input_en.ts in sl 100% translated source file: 'app/i18n/input_en.ts' on 'sl'. --- app/i18n/input_sl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/i18n/input_sl.ts b/app/i18n/input_sl.ts index 36bcf2b08..6a7813f45 100644 --- a/app/i18n/input_sl.ts +++ b/app/i18n/input_sl.ts @@ -1286,7 +1286,7 @@ V projekt ne bo dodano. streaming - streaming + sledenje From 52cd1ce48d1bcd16c600494b29f93935910f509c Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 6 Oct 2024 09:06:55 +0000 Subject: [PATCH 05/14] Translate app/i18n/input_en.ts in sl 100% translated source file: 'app/i18n/input_en.ts' on 'sl'. --- app/i18n/input_sl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/i18n/input_sl.ts b/app/i18n/input_sl.ts index 6a7813f45..36bcf2b08 100644 --- a/app/i18n/input_sl.ts +++ b/app/i18n/input_sl.ts @@ -1286,7 +1286,7 @@ V projekt ne bo dodano. streaming - sledenje + streaming From ae67fcbe30286149b81ead600c900a4d20a12dd8 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 6 Oct 2024 09:07:51 +0000 Subject: [PATCH 06/14] Translate app/i18n/input_en.ts in sl 100% translated source file: 'app/i18n/input_en.ts' on 'sl'. --- app/i18n/input_sl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/i18n/input_sl.ts b/app/i18n/input_sl.ts index 36bcf2b08..6a7813f45 100644 --- a/app/i18n/input_sl.ts +++ b/app/i18n/input_sl.ts @@ -1286,7 +1286,7 @@ V projekt ne bo dodano. streaming - streaming + sledenje From b2eff70209e4b7ad6809201d81127cb9e16f8648 Mon Sep 17 00:00:00 2001 From: Vitor Vieira <155513369+VitorVieiraZ@users.noreply.github.com> Date: Tue, 8 Oct 2024 09:09:18 -0300 Subject: [PATCH 07/14] Fix inconsistent UI/UX for read-only non-spatial layers (#3635) * wip - enhancing ui/ux * adding layerIsReadOnly condition to add feature button to be visible * using current layer property --- app/qml/layers/MMFeaturesListPage.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/qml/layers/MMFeaturesListPage.qml b/app/qml/layers/MMFeaturesListPage.qml index 41c5012c8..13042e795 100644 --- a/app/qml/layers/MMFeaturesListPage.qml +++ b/app/qml/layers/MMFeaturesListPage.qml @@ -21,6 +21,7 @@ MMComponents.MMPage { property var selectedLayer: null property bool hasToolbar: false + property bool layerIsReadOnly: selectedLayer?.readOnly ?? false signal featureClicked( var featurePair ) signal addFeatureClicked( var toLayer ) @@ -91,7 +92,7 @@ MMComponents.MMPage { anchors.bottom: parent.bottom anchors.bottomMargin: root.hasToolbar ? __style.margin20 : ( __style.safeAreaBottom + __style.margin8 ) - visible: __inputUtils.isNoGeometryLayer( root.selectedLayer ) + visible: __inputUtils.isNoGeometryLayer( root.selectedLayer ) && !root.layerIsReadOnly text: qsTr("Add feature") From d5fe9127876ac6b7f21f03eda1c71d459e690df4 Mon Sep 17 00:00:00 2001 From: VitorVieiraZ Date: Wed, 9 Oct 2024 15:54:33 -0300 Subject: [PATCH 08/14] foreground services permissions handling --- .../uk/co/lutraconsulting/PositionTrackingService.java | 10 ++++++++-- cmake_templates/AndroidManifest.xml.in | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/android/src/uk/co/lutraconsulting/PositionTrackingService.java b/app/android/src/uk/co/lutraconsulting/PositionTrackingService.java index 3d384e0a4..edbeffbfb 100644 --- a/app/android/src/uk/co/lutraconsulting/PositionTrackingService.java +++ b/app/android/src/uk/co/lutraconsulting/PositionTrackingService.java @@ -16,6 +16,7 @@ import android.content.Intent; import android.app.PendingIntent; import android.content.pm.PackageManager; +import android.content.pm.ServiceInfo; import android.app.Notification; import android.app.NotificationChannel; @@ -65,7 +66,7 @@ public void onCreate() { File file = new File( getFilesDir(), "tracking_updates.txt" ); sendStatusUpdateMessage( "Tracking file path:" + file.getAbsolutePath() ); - + try { // Open the FileOutputStream in append mode positionUpdatesStream = new FileOutputStream(file, true); @@ -166,7 +167,12 @@ public int onStartCommand( Intent intent, int flags, int startId ) { Notification notification = notificationBuilder.build(); - startForeground( SERVICE_ID, notification ); + if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE ) { // Android >= 14 + startForeground( SERVICE_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION ); + } + else { + startForeground( SERVICE_ID, notification ); + } sendStatusUpdateMessage( "Position tracking: Started the foreground service!" ); diff --git a/cmake_templates/AndroidManifest.xml.in b/cmake_templates/AndroidManifest.xml.in index 729a9c1b1..07fd864ee 100644 --- a/cmake_templates/AndroidManifest.xml.in +++ b/cmake_templates/AndroidManifest.xml.in @@ -17,6 +17,7 @@ + From bce63127f0fa91bc34199d4caf28a838dc31efaa Mon Sep 17 00:00:00 2001 From: VitorVieiraZ Date: Wed, 9 Oct 2024 15:57:37 -0300 Subject: [PATCH 09/14] register receiver parameters update --- .../PositionTrackingBroadcastMiddleware.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/android/src/uk/co/lutraconsulting/PositionTrackingBroadcastMiddleware.java b/app/android/src/uk/co/lutraconsulting/PositionTrackingBroadcastMiddleware.java index 1040bb519..fe2874827 100644 --- a/app/android/src/uk/co/lutraconsulting/PositionTrackingBroadcastMiddleware.java +++ b/app/android/src/uk/co/lutraconsulting/PositionTrackingBroadcastMiddleware.java @@ -46,7 +46,12 @@ public void registerBroadcastReceiver( Context context ) { intentFilter.addAction( TRACKING_ALIVE_STATUS_ACTION ); // Set this as the receiver of POSITION_UPDATE and STATUS_MESSAGE intent actions - context.registerReceiver( serviceMessageReceiver, intentFilter ); + if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE ) { // Android >= 14 + context.( serviceMessageReceiver, intentFilter, Context.RECEIVER_EXPORTED ); + } + else { + context.registerReceiver( serviceMessageReceiver, intentFilter ); + } } public void unregisterBroadcastReceiver( Context context ) { From 8446cd63e49a1b694ca7e6c13333a3d57f2f8ac7 Mon Sep 17 00:00:00 2001 From: VitorVieiraZ Date: Wed, 9 Oct 2024 16:01:35 -0300 Subject: [PATCH 10/14] small fix for registerReceiver --- .../co/lutraconsulting/PositionTrackingBroadcastMiddleware.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/android/src/uk/co/lutraconsulting/PositionTrackingBroadcastMiddleware.java b/app/android/src/uk/co/lutraconsulting/PositionTrackingBroadcastMiddleware.java index fe2874827..c0335b9d5 100644 --- a/app/android/src/uk/co/lutraconsulting/PositionTrackingBroadcastMiddleware.java +++ b/app/android/src/uk/co/lutraconsulting/PositionTrackingBroadcastMiddleware.java @@ -47,7 +47,7 @@ public void registerBroadcastReceiver( Context context ) { // Set this as the receiver of POSITION_UPDATE and STATUS_MESSAGE intent actions if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE ) { // Android >= 14 - context.( serviceMessageReceiver, intentFilter, Context.RECEIVER_EXPORTED ); + context.registerReceiver( serviceMessageReceiver, intentFilter, Context.RECEIVER_EXPORTED ); } else { context.registerReceiver( serviceMessageReceiver, intentFilter ); From 12a59cf987e045eef2fc825bb059b228bcc2ff9d Mon Sep 17 00:00:00 2001 From: VitorVieiraZ Date: Wed, 9 Oct 2024 16:21:40 -0300 Subject: [PATCH 11/14] fixing UPSIDE_DOWN_CAKE for Build library --- .../lutraconsulting/PositionTrackingBroadcastMiddleware.java | 3 ++- .../src/uk/co/lutraconsulting/PositionTrackingService.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/android/src/uk/co/lutraconsulting/PositionTrackingBroadcastMiddleware.java b/app/android/src/uk/co/lutraconsulting/PositionTrackingBroadcastMiddleware.java index c0335b9d5..5bf89a93a 100644 --- a/app/android/src/uk/co/lutraconsulting/PositionTrackingBroadcastMiddleware.java +++ b/app/android/src/uk/co/lutraconsulting/PositionTrackingBroadcastMiddleware.java @@ -10,6 +10,7 @@ package uk.co.lutraconsulting; import android.util.Log; +import android.os.Build; import android.content.Intent; import android.content.Context; @@ -46,7 +47,7 @@ public void registerBroadcastReceiver( Context context ) { intentFilter.addAction( TRACKING_ALIVE_STATUS_ACTION ); // Set this as the receiver of POSITION_UPDATE and STATUS_MESSAGE intent actions - if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE ) { // Android >= 14 + if ( Build.VERSION.SDK_INT >= 34 ) { // Android 14 ( Upside Down Cake ) context.registerReceiver( serviceMessageReceiver, intentFilter, Context.RECEIVER_EXPORTED ); } else { diff --git a/app/android/src/uk/co/lutraconsulting/PositionTrackingService.java b/app/android/src/uk/co/lutraconsulting/PositionTrackingService.java index edbeffbfb..dc38a3cb8 100644 --- a/app/android/src/uk/co/lutraconsulting/PositionTrackingService.java +++ b/app/android/src/uk/co/lutraconsulting/PositionTrackingService.java @@ -167,7 +167,7 @@ public int onStartCommand( Intent intent, int flags, int startId ) { Notification notification = notificationBuilder.build(); - if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE ) { // Android >= 14 + if ( Build.VERSION.SDK_INT >= 34) { // Android 14 ( Upside Down Cake ) startForeground( SERVICE_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION ); } else { From d830c0e5c3ae13ff76189bb171b0ae96cefd1877 Mon Sep 17 00:00:00 2001 From: Stefanos Natsis Date: Wed, 9 Oct 2024 23:58:34 +0300 Subject: [PATCH 12/14] Optimize feature model sorting (#3638) --- app/CMakeLists.txt | 2 - app/featuresmodel.cpp | 42 ++--- app/featuresmodel.h | 22 +-- app/featuresproxymodel.cpp | 48 ------ app/featuresproxymodel.h | 47 ------ app/main.cpp | 2 - .../editors/MMFormValueRelationEditor.qml | 12 +- app/qml/layers/MMFeaturesListPage.qml | 11 +- app/test/testmodels.cpp | 158 +++++++++--------- app/test/testmodels.h | 4 +- app/valuerelationfeaturesmodel.cpp | 12 +- app/valuerelationfeaturesmodel.h | 1 - 12 files changed, 115 insertions(+), 246 deletions(-) delete mode 100644 app/featuresproxymodel.cpp delete mode 100644 app/featuresproxymodel.h diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index f371e92eb..b96c77c27 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -52,7 +52,6 @@ set(MM_SRCS compass.cpp featurelayerpair.cpp featuresmodel.cpp - featuresproxymodel.cpp fieldsmodel.cpp guidelinecontroller.cpp identifykit.cpp @@ -136,7 +135,6 @@ set(MM_HDRS enumhelper.h featurelayerpair.h featuresmodel.h - featuresproxymodel.h fieldsmodel.h guidelinecontroller.h identifykit.h diff --git a/app/featuresmodel.cpp b/app/featuresmodel.cpp index 07a70552b..7cc386424 100644 --- a/app/featuresmodel.cpp +++ b/app/featuresmodel.cpp @@ -141,7 +141,6 @@ QVariant FeaturesModel::data( const QModelIndex &index, int role ) const case LayerName: return pair.layer() ? pair.layer()->name() : QString(); case LayerIcon: return pair.layer() ? InputUtils::loadIconFromLayer( pair.layer() ) : QString(); case Qt::DisplayRole: return featureTitle( pair ); - case SortValue: return sortValue( pair ); } return QVariant(); @@ -178,15 +177,6 @@ QVariant FeaturesModel::featureTitle( const FeatureLayerPair &featurePair ) cons return title; } -QVariant FeaturesModel::sortValue( const FeatureLayerPair &featurePair ) const -{ - QgsExpressionContext context( QgsExpressionContextUtils::globalProjectLayerScopes( featurePair.layer() ) ); - context.setFeature( featurePair.feature() ); - QgsExpression expr( mSortExpression ); - QVariant result = expr.evaluate( &context ); - return result; -} - QString FeaturesModel::searchResultPair( const FeatureLayerPair &pair ) const { if ( mSearchExpression.isEmpty() ) @@ -261,6 +251,20 @@ void FeaturesModel::setupFeatureRequest( QgsFeatureRequest &request ) request.setFilterExpression( buildSearchExpression() ); } + if ( mUseAttributeTableSortOrder && mLayer && !mLayer->attributeTableConfig().sortExpression().isEmpty() ) + { + // get a context with global, project and layer scopes + // QGIS docs are not very clear, but this context is also used for evaluation of the request's 'order by' expressions too + QgsExpressionContext context = mLayer->createExpressionContext(); + request.setExpressionContext( context ); + request.setOrderBy( QgsFeatureRequest::OrderBy( + { + QgsFeatureRequest::OrderByClause( + mLayer->attributeTableConfig().sortExpression(), + mLayer->attributeTableConfig().sortOrder() == Qt::AscendingOrder ) + } ) ); + } + request.setLimit( FEATURES_LIMIT ); } @@ -290,7 +294,6 @@ QHash FeaturesModel::roleNames() const roleNames[SearchResult] = QStringLiteral( "SearchResult" ).toLatin1(); roleNames[LayerName] = QStringLiteral( "LayerName" ).toLatin1(); roleNames[LayerIcon] = QStringLiteral( "LayerIcon" ).toLatin1(); - roleNames[SortValue] = QStringLiteral( "SortValue" ).toLatin1(); return roleNames; } @@ -363,7 +366,6 @@ void FeaturesModel::setLayer( QgsVectorLayer *newLayer ) } mLayer = newLayer; - setupSorting(); emit layerChanged( mLayer ); if ( mLayer ) @@ -384,19 +386,3 @@ QgsVectorLayer *FeaturesModel::layer() const { return mLayer; } - -void FeaturesModel::setupSorting() -{ - mSortExpression = mLayer ? mLayer->attributeTableConfig().sortExpression() : QString(); - mSortOrder = mLayer ? mLayer->attributeTableConfig().sortOrder() : Qt::AscendingOrder; -} - -bool FeaturesModel::sortingEnabled() const -{ - return !mSortExpression.isEmpty(); -} - -Qt::SortOrder FeaturesModel::sortOrder() const -{ - return mSortOrder; -} diff --git a/app/featuresmodel.h b/app/featuresmodel.h index 32af6cb56..1a7ddaad8 100644 --- a/app/featuresmodel.h +++ b/app/featuresmodel.h @@ -52,6 +52,9 @@ class FeaturesModel : public QAbstractListModel // Name of the property is intentionally `count` so that it matches ListModel's count property Q_PROPERTY( int count READ count NOTIFY countChanged ) + // Returns if the model should be sorted according to the layer's attribute table configuration sort order + Q_PROPERTY( bool useAttributeTableSortOrder MEMBER mUseAttributeTableSortOrder ) + public: enum ModelRoles @@ -64,7 +67,6 @@ class FeaturesModel : public QAbstractListModel SearchResult, // pair of attribute and its value by which the feature was found, empty if search expression is empty LayerName, LayerIcon, - SortValue, }; Q_ENUM( ModelRoles ); @@ -118,15 +120,6 @@ class FeaturesModel : public QAbstractListModel int layerFeaturesCount() const; - //! Populates the sort expression and sort order for the model - virtual void setupSorting(); - - //! Returns true if there is a sort expression set for the model - bool sortingEnabled() const; - - //! Returns the order in witch the model should be sorted - Qt::SortOrder sortOrder() const; - signals: void featuresLimitChanged( int featuresLimit ); @@ -149,9 +142,6 @@ class FeaturesModel : public QAbstractListModel virtual QVariant featureTitle( const FeatureLayerPair &featurePair ) const; - QString mSortExpression; - Qt::SortOrder mSortOrder = Qt::AscendingOrder; - private slots: void onFutureFinished(); @@ -164,9 +154,6 @@ class FeaturesModel : public QAbstractListModel //! Returns found attribute and its value from search expression for feature QString searchResultPair( const FeatureLayerPair &feat ) const; - //! Evaluates the sort expression and returns the value used for this feature when sorting the model - QVariant sortValue( const FeatureLayerPair &featurePair ) const; - const int FEATURES_LIMIT = 10000; //!< Number of maximum features loaded from layer FeatureLayerPairs mFeatures; @@ -176,6 +163,9 @@ class FeaturesModel : public QAbstractListModel QAtomicInt mNextSearchId = 0; QFutureWatcher mSearchResultWatcher; bool mFetchingResults = false; + bool mUseAttributeTableSortOrder = false; + + friend class TestModels; }; #endif // FEATURESMODEL_H diff --git a/app/featuresproxymodel.cpp b/app/featuresproxymodel.cpp deleted file mode 100644 index a91664e7a..000000000 --- a/app/featuresproxymodel.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "featuresproxymodel.h" - -FeaturesProxyModel::FeaturesProxyModel( QObject *parent ) : QSortFilterProxyModel( parent ) -{ - setSortRole( FeaturesModel::SortValue ); - setSortCaseSensitivity( Qt::CaseInsensitive ); -} - -void FeaturesProxyModel::updateSorting() -{ - // don't sort if there is no sort expression for the layer - if ( mModel->sortingEnabled() ) - { - sort( 0, mModel->sortOrder() ); - } - else - { - invalidate(); - } -} - -FeaturesModel *FeaturesProxyModel::featuresSourceModel() const -{ - return mModel; -} - -void FeaturesProxyModel::setFeaturesSourceModel( FeaturesModel *sourceModel ) -{ - if ( mModel == sourceModel ) - return; - - if ( mModel ) - disconnect( mModel, nullptr, this, nullptr ); - - mModel = sourceModel; - setSourceModel( mModel ); - mModel->setupSorting(); - connect( mModel, &FeaturesModel::fetchingResultsChanged, this, [ = ]( bool pending ) { if ( !pending ) updateSorting(); } ); -} diff --git a/app/featuresproxymodel.h b/app/featuresproxymodel.h deleted file mode 100644 index 3f3d537ef..000000000 --- a/app/featuresproxymodel.h +++ /dev/null @@ -1,47 +0,0 @@ -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef FEATURESPROXYMODEL_H -#define FEATURESPROXYMODEL_H - -#include -#include - -#include "featuresmodel.h" - -/** - * \brief The FeaturesProxyModel class used as a proxy sort model for the \see FeaturesModel class. - * - * FeaturesProxyModel is a QML type with required property of FeatureSourceModel. Without source model, this model does nothing (is not initialized). - * After setting source model, this model starts sorting if sortingEnabled() returns true for the source model. - */ -class FeaturesProxyModel : public QSortFilterProxyModel -{ - Q_OBJECT - - Q_PROPERTY( FeaturesModel *featuresSourceModel READ featuresSourceModel WRITE setFeaturesSourceModel ) - - public: - explicit FeaturesProxyModel( QObject *parent = nullptr ); - ~FeaturesProxyModel() override {}; - - FeaturesModel *featuresSourceModel() const; - - public slots: - void setFeaturesSourceModel( FeaturesModel *sourceModel ); - - private: - void updateSorting(); - - FeaturesModel *mModel = nullptr; // not owned by this, needs to be set in order to proxy model to work - - friend class TestModels; -}; - -#endif // FEATURESPROXYMODEL_H diff --git a/app/main.cpp b/app/main.cpp index 2fcd9b137..d0c35cd24 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -91,7 +91,6 @@ #include "position/positionkit.h" #include "scalebarkit.h" #include "featuresmodel.h" -#include "featuresproxymodel.h" #include "relationfeaturesmodel.h" #include "relationreferencefeaturesmodel.h" #include "fieldvalidator.h" @@ -327,7 +326,6 @@ void initDeclarative() qmlRegisterType< MapThemesModel >( "mm", 1, 0, "MapThemesModel" ); qmlRegisterType< GuidelineController >( "mm", 1, 0, "GuidelineController" ); qmlRegisterType< FeaturesModel >( "mm", 1, 0, "FeaturesModel" ); - qmlRegisterType< FeaturesProxyModel >( "mm", 1, 0, "FeaturesProxyModel" ); qmlRegisterType< RelationFeaturesModel >( "mm", 1, 0, "RelationFeaturesModel" ); qmlRegisterType< ValueRelationFeaturesModel >( "mm", 1, 0, "ValueRelationFeaturesModel" ); qmlRegisterType< RelationReferenceFeaturesModel >( "mm", 1, 0, "RelationReferenceFeaturesModel" ); diff --git a/app/qml/form/editors/MMFormValueRelationEditor.qml b/app/qml/form/editors/MMFormValueRelationEditor.qml index 41c4b31a3..e98643ed2 100644 --- a/app/qml/form/editors/MMFormValueRelationEditor.qml +++ b/app/qml/form/editors/MMFormValueRelationEditor.qml @@ -76,15 +76,11 @@ MMFormComboboxBaseEditor { valueRole: "FeatureId" textRole: "FeatureTitle" - list.model: MM.FeaturesProxyModel { - id: vrDropdownProxyModel + list.model: MM.ValueRelationFeaturesModel { + id: vrDropdownModel - featuresSourceModel: MM.ValueRelationFeaturesModel { - id: vrDropdownModel - - config: root._fieldConfig - pair: root._fieldFeatureLayerPair - } + config: root._fieldConfig + pair: root._fieldFeatureLayerPair } onSearchTextChanged: ( searchText ) => vrDropdownModel.searchExpression = searchText diff --git a/app/qml/layers/MMFeaturesListPage.qml b/app/qml/layers/MMFeaturesListPage.qml index 13042e795..04b8bb256 100644 --- a/app/qml/layers/MMFeaturesListPage.qml +++ b/app/qml/layers/MMFeaturesListPage.qml @@ -56,14 +56,11 @@ MMComponents.MMPage { topMargin: __style.spacing20 } - model: MM.FeaturesProxyModel { - id: featuresProxyModel + model: MM.FeaturesModel { + id: featuresModel - featuresSourceModel: MM.FeaturesModel { - id: featuresModel - - layer: root.selectedLayer - } + useAttributeTableSortOrder: true + layer: root.selectedLayer } clip: true diff --git a/app/test/testmodels.cpp b/app/test/testmodels.cpp index 844fd07ba..0d637bd90 100644 --- a/app/test/testmodels.cpp +++ b/app/test/testmodels.cpp @@ -10,7 +10,6 @@ #include "testmodels.h" #include "testutils.h" #include "featuresmodel.h" -#include "featuresproxymodel.h" #include "valuerelationfeaturesmodel.h" #include "projectsmodel.h" #include "projectsproxymodel.h" @@ -58,10 +57,9 @@ void TestModels::testFeaturesModel() QCOMPARE( title, QStringLiteral( "First" ) ); } -void TestModels::testFeaturesProxyModel() +void TestModels::testFeaturesModelSorted() { FeaturesModel model; - FeaturesProxyModel proxy; QSignalSpy spy( &model, &FeaturesModel::fetchingResultsChanged ); @@ -71,66 +69,62 @@ void TestModels::testFeaturesProxyModel() QVERIFY( layer && layer->isValid() ); // enable sorting + model.mUseAttributeTableSortOrder = true; QgsAttributeTableConfig conf = layer->attributeTableConfig(); conf.setSortExpression( QStringLiteral( "Name" ) ); layer->setAttributeTableConfig( conf ); - proxy.setFeaturesSourceModel( &model ); model.setLayer( layer ); model.reloadFeatures(); spy.wait(); - QCOMPARE( proxy.rowCount(), layer->dataProvider()->featureCount() ); - QCOMPARE( proxy.data( proxy.index( 0, 0 ), FeaturesModel::SortValue ), QLatin1String( "A1" ) ); - QCOMPARE( proxy.data( proxy.index( 1, 0 ), FeaturesModel::SortValue ), QLatin1String( "A2" ) ); - QCOMPARE( proxy.data( proxy.index( 2, 0 ), FeaturesModel::SortValue ), QLatin1String( "B1" ) ); - QCOMPARE( proxy.data( proxy.index( 3, 0 ), FeaturesModel::SortValue ), QLatin1String( "B2" ) ); - QCOMPARE( proxy.data( proxy.index( 4, 0 ), FeaturesModel::SortValue ), QLatin1String( "C1" ) ); - QCOMPARE( proxy.data( proxy.index( 5, 0 ), FeaturesModel::SortValue ), QLatin1String( "C2" ) ); - QCOMPARE( proxy.data( proxy.index( 6, 0 ), FeaturesModel::SortValue ), QLatin1String( "D1" ) ); - QCOMPARE( proxy.data( proxy.index( 7, 0 ), FeaturesModel::SortValue ), QLatin1String( "D2" ) ); - QCOMPARE( proxy.data( proxy.index( 8, 0 ), FeaturesModel::SortValue ), QLatin1String( "VERYBIG" ) ); - - // filter the fModel (this is not proxy model filtering) - // and reverse sort order + QCOMPARE( model.rowCount(), layer->dataProvider()->featureCount() ); + QCOMPARE( model.data( model.index( 0, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "A1" ) ); + QCOMPARE( model.data( model.index( 1, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "A2" ) ); + QCOMPARE( model.data( model.index( 2, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "B1" ) ); + QCOMPARE( model.data( model.index( 3, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "B2" ) ); + QCOMPARE( model.data( model.index( 4, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "C1" ) ); + QCOMPARE( model.data( model.index( 5, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "C2" ) ); + QCOMPARE( model.data( model.index( 6, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "D1" ) ); + QCOMPARE( model.data( model.index( 7, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "D2" ) ); + QCOMPARE( model.data( model.index( 8, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "VERYBIG" ) ); + + // filter the model and reverse sort order conf.setSortOrder( Qt::DescendingOrder ); layer->setAttributeTableConfig( conf ); - model.setupSorting(); model.setSearchExpression( QStringLiteral( "D" ) ); spy.wait(); - QCOMPARE( proxy.rowCount(), 2 ); - QCOMPARE( proxy.data( proxy.index( 0, 0 ), FeaturesModel::SortValue ), QLatin1String( "D2" ) ); - QCOMPARE( proxy.data( proxy.index( 1, 0 ), FeaturesModel::SortValue ), QLatin1String( "D1" ) ); + QCOMPARE( model.rowCount(), 2 ); + QCOMPARE( model.data( model.index( 0, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "D2" ) ); + QCOMPARE( model.data( model.index( 1, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "D1" ) ); // disable sorting and filtering // should get all items with default ordering - conf.setSortExpression( QString() ); - layer->setAttributeTableConfig( conf ); - model.setupSorting(); + model.mUseAttributeTableSortOrder = false; model.setSearchExpression( QString() ); spy.wait(); - QCOMPARE( proxy.rowCount(), layer->dataProvider()->featureCount() ); - QCOMPARE( proxy.data( proxy.index( 0, 0 ), FeaturesModel::FeatureId ), 1 ); - QCOMPARE( proxy.data( proxy.index( 1, 0 ), FeaturesModel::FeatureId ), 2 ); - QCOMPARE( proxy.data( proxy.index( 2, 0 ), FeaturesModel::FeatureId ), 3 ); - QCOMPARE( proxy.data( proxy.index( 3, 0 ), FeaturesModel::FeatureId ), 4 ); - QCOMPARE( proxy.data( proxy.index( 4, 0 ), FeaturesModel::FeatureId ), 5 ); - QCOMPARE( proxy.data( proxy.index( 5, 0 ), FeaturesModel::FeatureId ), 6 ); - QCOMPARE( proxy.data( proxy.index( 6, 0 ), FeaturesModel::FeatureId ), 7 ); - QCOMPARE( proxy.data( proxy.index( 7, 0 ), FeaturesModel::FeatureId ), 8 ); - QCOMPARE( proxy.data( proxy.index( 8, 0 ), FeaturesModel::FeatureId ), 100000000 ); + QCOMPARE( model.rowCount(), layer->dataProvider()->featureCount() ); + QCOMPARE( model.data( model.index( 0, 0 ), FeaturesModel::ModelRoles::FeatureId ), 1 ); + QCOMPARE( model.data( model.index( 1, 0 ), FeaturesModel::ModelRoles::FeatureId ), 2 ); + QCOMPARE( model.data( model.index( 2, 0 ), FeaturesModel::ModelRoles::FeatureId ), 3 ); + QCOMPARE( model.data( model.index( 3, 0 ), FeaturesModel::ModelRoles::FeatureId ), 4 ); + QCOMPARE( model.data( model.index( 4, 0 ), FeaturesModel::ModelRoles::FeatureId ), 5 ); + QCOMPARE( model.data( model.index( 5, 0 ), FeaturesModel::ModelRoles::FeatureId ), 6 ); + QCOMPARE( model.data( model.index( 6, 0 ), FeaturesModel::ModelRoles::FeatureId ), 7 ); + QCOMPARE( model.data( model.index( 7, 0 ), FeaturesModel::ModelRoles::FeatureId ), 8 ); + QCOMPARE( model.data( model.index( 8, 0 ), FeaturesModel::ModelRoles::FeatureId ), 100000000 ); } -void TestModels::testFeaturesProxyModelWithValueRelation() +void TestModels::testValueRelationFeaturesModel() { QString projectDir = TestUtils::testDataDir() + "/project_value_relations"; QString projectName = "proj.qgz"; @@ -151,8 +145,6 @@ void TestModels::testFeaturesProxyModelWithValueRelation() FeatureLayerPair pair( f, mainLayer ); ValueRelationFeaturesModel model; - FeaturesProxyModel proxy; - proxy.setFeaturesSourceModel( &model ); QSignalSpy spy( &model, &FeaturesModel::fetchingResultsChanged ); @@ -171,78 +163,86 @@ void TestModels::testFeaturesProxyModelWithValueRelation() QCOMPARE( model.rowCount(), 9 ); QCOMPARE( model.layer()->id(), subsubLayer->id() ); - QCOMPARE( proxy.rowCount(), 9 ); - QCOMPARE( proxy.data( proxy.index( 0, 0 ), FeaturesModel::FeatureId ), 1 ); - QCOMPARE( proxy.data( proxy.index( 1, 0 ), FeaturesModel::FeatureId ), 2 ); - QCOMPARE( proxy.data( proxy.index( 2, 0 ), FeaturesModel::FeatureId ), 3 ); - QCOMPARE( proxy.data( proxy.index( 3, 0 ), FeaturesModel::FeatureId ), 4 ); - QCOMPARE( proxy.data( proxy.index( 4, 0 ), FeaturesModel::FeatureId ), 5 ); - QCOMPARE( proxy.data( proxy.index( 5, 0 ), FeaturesModel::FeatureId ), 6 ); - QCOMPARE( proxy.data( proxy.index( 6, 0 ), FeaturesModel::FeatureId ), 7 ); - QCOMPARE( proxy.data( proxy.index( 7, 0 ), FeaturesModel::FeatureId ), 8 ); - QCOMPARE( proxy.data( proxy.index( 8, 0 ), FeaturesModel::FeatureId ), 100000000 ); + QCOMPARE( model.rowCount(), 9 ); + QCOMPARE( model.data( model.index( 0, 0 ), FeaturesModel::ModelRoles::FeatureId ), 1 ); + QCOMPARE( model.data( model.index( 1, 0 ), FeaturesModel::ModelRoles::FeatureId ), 2 ); + QCOMPARE( model.data( model.index( 2, 0 ), FeaturesModel::ModelRoles::FeatureId ), 3 ); + QCOMPARE( model.data( model.index( 3, 0 ), FeaturesModel::ModelRoles::FeatureId ), 4 ); + QCOMPARE( model.data( model.index( 4, 0 ), FeaturesModel::ModelRoles::FeatureId ), 5 ); + QCOMPARE( model.data( model.index( 5, 0 ), FeaturesModel::ModelRoles::FeatureId ), 6 ); + QCOMPARE( model.data( model.index( 6, 0 ), FeaturesModel::ModelRoles::FeatureId ), 7 ); + QCOMPARE( model.data( model.index( 7, 0 ), FeaturesModel::ModelRoles::FeatureId ), 8 ); + QCOMPARE( model.data( model.index( 8, 0 ), FeaturesModel::ModelRoles::FeatureId ), 100000000 ); // enable order by value for the value relation model.reset(); config[ QStringLiteral( "OrderByValue" ) ] = true; model.setConfig( config ); - model.setupSorting(); model.setPair( pair ); spy.wait(); - QCOMPARE( proxy.rowCount(), 9 ); - QCOMPARE( proxy.data( proxy.index( 0, 0 ), FeaturesModel::SortValue ), QLatin1String( "A1" ) ); - QCOMPARE( proxy.data( proxy.index( 1, 0 ), FeaturesModel::SortValue ), QLatin1String( "A2" ) ); - QCOMPARE( proxy.data( proxy.index( 2, 0 ), FeaturesModel::SortValue ), QLatin1String( "B1" ) ); - QCOMPARE( proxy.data( proxy.index( 3, 0 ), FeaturesModel::SortValue ), QLatin1String( "B2" ) ); - QCOMPARE( proxy.data( proxy.index( 4, 0 ), FeaturesModel::SortValue ), QLatin1String( "C1" ) ); - QCOMPARE( proxy.data( proxy.index( 5, 0 ), FeaturesModel::SortValue ), QLatin1String( "C2" ) ); - QCOMPARE( proxy.data( proxy.index( 6, 0 ), FeaturesModel::SortValue ), QLatin1String( "D1" ) ); - QCOMPARE( proxy.data( proxy.index( 7, 0 ), FeaturesModel::SortValue ), QLatin1String( "D2" ) ); - QCOMPARE( proxy.data( proxy.index( 8, 0 ), FeaturesModel::SortValue ), QLatin1String( "VERYBIG" ) ); - - // add a search expression to base model + QCOMPARE( model.rowCount(), 9 ); + QCOMPARE( model.data( model.index( 0, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "A1" ) ); + QCOMPARE( model.data( model.index( 1, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "A2" ) ); + QCOMPARE( model.data( model.index( 2, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "B1" ) ); + QCOMPARE( model.data( model.index( 3, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "B2" ) ); + QCOMPARE( model.data( model.index( 4, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "C1" ) ); + QCOMPARE( model.data( model.index( 5, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "C2" ) ); + QCOMPARE( model.data( model.index( 6, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "D1" ) ); + QCOMPARE( model.data( model.index( 7, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "D2" ) ); + QCOMPARE( model.data( model.index( 8, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "VERYBIG" ) ); + + // add a search expression to model model.setSearchExpression( QStringLiteral( "D" ) ); spy.wait(); QCOMPARE( model.rowCount(), 2 ); - QCOMPARE( proxy.rowCount(), 2 ); - QCOMPARE( proxy.data( proxy.index( 0, 0 ), FeaturesModel::SortValue ), QLatin1String( "D1" ) ); - QCOMPARE( proxy.data( proxy.index( 1, 0 ), FeaturesModel::SortValue ), QLatin1String( "D2" ) ); + QCOMPARE( model.rowCount(), 2 ); + QCOMPARE( model.data( model.index( 0, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "D1" ) ); + QCOMPARE( model.data( model.index( 1, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "D2" ) ); - // add a filter expression to the base model + // add a filter expression to the model config[ QStringLiteral( "FilterExpression" ) ] = "subFk = 1"; model.setConfig( config ); - model.setupSorting(); model.setSearchExpression( QString() ); spy.wait(); QCOMPARE( model.rowCount(), 2 ); - QCOMPARE( proxy.data( proxy.index( 0, 0 ), FeaturesModel::SortValue ), QLatin1String( "A1" ) ); - QCOMPARE( proxy.data( proxy.index( 1, 0 ), FeaturesModel::SortValue ), QLatin1String( "A2" ) ); + QCOMPARE( model.data( model.index( 0, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "A1" ) ); + QCOMPARE( model.data( model.index( 1, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "A2" ) ); - // remove filters and sorting + // remove sorting model.reset(); config.remove( QStringLiteral( "OrderByValue" ) ); + model.setConfig( config ); + model.setPair( pair ); + + spy.wait(); + + QCOMPARE( model.rowCount(), 2 ); + QCOMPARE( model.data( model.index( 0, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "A2" ) ); + QCOMPARE( model.data( model.index( 1, 0 ), FeaturesModel::ModelRoles::FeatureTitle ), QLatin1String( "A1" ) ); + + // remove filters + model.reset(); config.remove( QStringLiteral( "FilterExpression" ) ); model.setConfig( config ); - model.setupSorting(); model.setPair( pair ); spy.wait(); - QCOMPARE( proxy.rowCount(), 9 ); - QCOMPARE( proxy.data( proxy.index( 0, 0 ), FeaturesModel::FeatureId ), 1 ); - QCOMPARE( proxy.data( proxy.index( 1, 0 ), FeaturesModel::FeatureId ), 2 ); - QCOMPARE( proxy.data( proxy.index( 2, 0 ), FeaturesModel::FeatureId ), 3 ); - QCOMPARE( proxy.data( proxy.index( 3, 0 ), FeaturesModel::FeatureId ), 4 ); - QCOMPARE( proxy.data( proxy.index( 4, 0 ), FeaturesModel::FeatureId ), 5 ); - QCOMPARE( proxy.data( proxy.index( 5, 0 ), FeaturesModel::FeatureId ), 6 ); - QCOMPARE( proxy.data( proxy.index( 6, 0 ), FeaturesModel::FeatureId ), 7 ); - QCOMPARE( proxy.data( proxy.index( 7, 0 ), FeaturesModel::FeatureId ), 8 ); - QCOMPARE( proxy.data( proxy.index( 8, 0 ), FeaturesModel::FeatureId ), 100000000 ); + QCOMPARE( model.rowCount(), 9 ); + QCOMPARE( model.data( model.index( 0, 0 ), FeaturesModel::ModelRoles::FeatureId ), 1 ); + QCOMPARE( model.data( model.index( 1, 0 ), FeaturesModel::ModelRoles::FeatureId ), 2 ); + QCOMPARE( model.data( model.index( 2, 0 ), FeaturesModel::ModelRoles::FeatureId ), 3 ); + QCOMPARE( model.data( model.index( 3, 0 ), FeaturesModel::ModelRoles::FeatureId ), 4 ); + QCOMPARE( model.data( model.index( 4, 0 ), FeaturesModel::ModelRoles::FeatureId ), 5 ); + QCOMPARE( model.data( model.index( 5, 0 ), FeaturesModel::ModelRoles::FeatureId ), 6 ); + QCOMPARE( model.data( model.index( 6, 0 ), FeaturesModel::ModelRoles::FeatureId ), 7 ); + QCOMPARE( model.data( model.index( 7, 0 ), FeaturesModel::ModelRoles::FeatureId ), 8 ); + QCOMPARE( model.data( model.index( 8, 0 ), FeaturesModel::ModelRoles::FeatureId ), 100000000 ); } void TestModels::testProjectsModel() diff --git a/app/test/testmodels.h b/app/test/testmodels.h index d66b1ba37..4c3e41991 100644 --- a/app/test/testmodels.h +++ b/app/test/testmodels.h @@ -23,8 +23,8 @@ class TestModels : public QObject void cleanup(); // will be called after every testfunction. void testFeaturesModel(); - void testFeaturesProxyModel(); - void testFeaturesProxyModelWithValueRelation(); + void testFeaturesModelSorted(); + void testValueRelationFeaturesModel(); void testProjectsModel(); void testProjectsProxyModel(); diff --git a/app/valuerelationfeaturesmodel.cpp b/app/valuerelationfeaturesmodel.cpp index 2ed0638de..6ce4e65ae 100644 --- a/app/valuerelationfeaturesmodel.cpp +++ b/app/valuerelationfeaturesmodel.cpp @@ -40,6 +40,12 @@ void ValueRelationFeaturesModel::setupFeatureRequest( QgsFeatureRequest &request request.setExpressionContext( filterContext ); } } + + if ( mConfig.value( QStringLiteral( "OrderByValue" ) ).toBool() ) + { + // replace any existing order by clause with our value field + request.setOrderBy( QgsFeatureRequest::OrderBy( { QgsFeatureRequest::OrderByClause( mTitleField ) } ) ); + } } void ValueRelationFeaturesModel::setup() @@ -207,9 +213,3 @@ void ValueRelationFeaturesModel::setConfig( const QVariantMap &newConfig ) setup(); } - -void ValueRelationFeaturesModel::setupSorting() -{ - const bool orderByValue = mConfig.value( QStringLiteral( "OrderByValue" ) ).toBool(); - mSortExpression = orderByValue ? mTitleField : QString(); -} diff --git a/app/valuerelationfeaturesmodel.h b/app/valuerelationfeaturesmodel.h index 2c660efeb..7a1d178bd 100644 --- a/app/valuerelationfeaturesmodel.h +++ b/app/valuerelationfeaturesmodel.h @@ -37,7 +37,6 @@ class ValueRelationFeaturesModel : public FeaturesModel void reset() override; void setupFeatureRequest( QgsFeatureRequest &request ) override; QVariant featureTitle( const FeatureLayerPair &pair ) const override; - void setupSorting() override; Q_INVOKABLE QVariant convertToKey( const QVariant &id ); Q_INVOKABLE QVariant convertToQgisType( const QVariantList &featureIds ); // feature id -> key From 07b99f79aa93ac87ef7dc680f5fd62afeaddf9b8 Mon Sep 17 00:00:00 2001 From: Tomas Mizera Date: Wed, 9 Oct 2024 22:59:35 +0200 Subject: [PATCH 13/14] update strings --- app/i18n/input_en.ts | 8 ++++---- app/i18n/input_hu.qm | Bin 70704 -> 70706 bytes app/i18n/input_sl.qm | Bin 65417 -> 65108 bytes app/i18n/input_sl_SI.qm | Bin 65502 -> 65215 bytes 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/i18n/input_en.ts b/app/i18n/input_en.ts index d4fb5e6cb..4513cea6d 100644 --- a/app/i18n/input_en.ts +++ b/app/i18n/input_en.ts @@ -156,7 +156,7 @@ FeaturesModel - + Unknown title @@ -735,7 +735,7 @@ Won't be added to the project. MMFeaturesListPage - + Add feature @@ -2791,12 +2791,12 @@ only allows up to %1 downloaded projects. - + Report submitted. Please contact us on %1 - + Failed to submit report. Please check your internet connection. diff --git a/app/i18n/input_hu.qm b/app/i18n/input_hu.qm index bad31a8840a542cd33a9d6b1e679ed47bb078f4c..e28299bfa22c31504c13a0f9e7216a852c53648a 100644 GIT binary patch delta 4221 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 drr^7@&;}F8%-j diff --git a/app/i18n/input_sl.qm b/app/i18n/input_sl.qm index eadfb766cc246734b995d1abecf428e94a10dd99..91f9f5a6a1c1e0c4d1c71142ef56edf599113f98 100644 GIT binary patch delta 5142 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 diff --git a/app/i18n/input_sl_SI.qm b/app/i18n/input_sl_SI.qm index 208f1372487a12952fa3b4a6f96b16f8a5649a63..b375e978f5a740d637cec465cfd243cb3afcce2d 100644 GIT binary patch delta 4992 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 Rjj(B8R#5%?A=j3*`ER*H-@X6< delta 5228 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 From a066b22c4c3f4026af5c354885d5d20ba41dccd6 Mon Sep 17 00:00:00 2001 From: Tomas Mizera Date: Wed, 9 Oct 2024 23:00:04 +0200 Subject: [PATCH 14/14] Change versions to 2024.4.1 --- .zenodo.json | 4 ++-- CITATION.cff | 2 +- CMakeLists.txt | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.zenodo.json b/.zenodo.json index 679504442..8e70b4f5c 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -2,7 +2,7 @@ "description": "

Mergin Maps mobile app is a QGIS powered app for Android and iOS devices.

", "license": "GPLv3", "title": "Mergin Maps mobile app", - "version": "2024.5.0", + "version": "2024.4.1", "upload_type": "software", "publication_date": "2022-02-24", "creators": [ @@ -39,7 +39,7 @@ "related_identifiers": [ { "scheme": "url", - "identifier": "https://github.com/MerginMaps/mobile/tree/2024.5.0", + "identifier": "https://github.com/MerginMaps/mobile/tree/2024.4.1", "relation": "isSupplementTo" }, { diff --git a/CITATION.cff b/CITATION.cff index 8b1d6266b..b53b22977 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,4 +1,4 @@ -cff-version: 2024.5.0 +cff-version: 2024.4.1 message: "If you use this software, please cite it as below." authors: - family-names: "Martin" diff --git a/CMakeLists.txt b/CMakeLists.txt index 8a883047c..a02d666a6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,8 +6,8 @@ cmake_minimum_required(VERSION 3.22) # TODO automatically change with the scripts/update version script set(MM_VERSION_MAJOR "2024") -set(MM_VERSION_MINOR "5") -set(MM_VERSION_PATCH "0") +set(MM_VERSION_MINOR "4") +set(MM_VERSION_PATCH "1") set(QT_VERSION_DEFAULT "6.6.3") # Note: we cannot set this for non-android build, since CMake will start looking for