From 68b4bebca9b0f1424c00a03c2912b7ef00a23d27 Mon Sep 17 00:00:00 2001 From: Dharanish Date: Tue, 23 Jul 2024 14:04:36 +0200 Subject: [PATCH] Fix collapsing and sorting of collapsed groups --- .../habits/list/views/CollapseButtonView.kt | 10 +++-- .../habits/list/views/HabitCardView.kt | 44 ++++--------------- .../habits/list/views/HabitGroupCardView.kt | 2 + .../isoron/uhabits/core/models/HabitGroup.kt | 16 ++++--- .../isoron/uhabits/core/models/HabitList.kt | 6 +-- .../core/models/memory/MemoryHabitList.kt | 7 +++ .../core/models/sqlite/SQLiteHabitList.kt | 6 +++ .../core/models/sqlite/SQLiteHabitListTest.kt | 2 +- 8 files changed, 44 insertions(+), 49 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CollapseButtonView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CollapseButtonView.kt index 12c54cf55..ab11baf3d 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CollapseButtonView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CollapseButtonView.kt @@ -25,6 +25,11 @@ class CollapseButtonView( private var drawer = Drawer() var collapsed = false + set(value) { + field = value + drawer.rotate() + invalidate() + } init { setOnClickListener(this) @@ -33,9 +38,8 @@ class CollapseButtonView( override fun onClick(v: View) { collapsed = !collapsed habitGroup!!.collapsed = collapsed - drawer.rotate() - invalidate() (context as ListHabitsActivity).component.listHabitsMenu.behavior.onPreferencesChanged() + invalidate() } override fun onDraw(canvas: Canvas) { @@ -66,7 +70,7 @@ class CollapseButtonView( } fun rotate() { - if (rotationAngle == 0f) { + if (collapsed) { rotationAngle = 90f offset_y = 0f offset_x = -0.4f diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt index e047549b9..cac6cb1b2 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt @@ -38,7 +38,6 @@ import org.isoron.platform.gui.toInt import org.isoron.uhabits.R import org.isoron.uhabits.activities.common.views.RingView import org.isoron.uhabits.core.models.Habit -import org.isoron.uhabits.core.models.HabitGroup import org.isoron.uhabits.core.models.ModelObservable import org.isoron.uhabits.core.models.Timestamp import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior @@ -267,16 +266,15 @@ class HabitCardView( } scoreRing.apply { setColor(c) - if (h.isSubHabit()) { - val rightMargin = dp(8f).toInt() - val ringSize = dp(15f).toInt() - val leftMargin = - if (habit?.isSubHabit() == true) dp(30f).toInt() else dp(8f).toInt() - layoutParams = LinearLayout.LayoutParams(ringSize, ringSize).apply { - setMargins(leftMargin, 0, rightMargin, 0) - gravity = Gravity.CENTER - } +// if (h.isSubHabit()) { + val rightMargin = dp(8f).toInt() + val ringSize = dp(15f).toInt() + val leftMargin = if (h.isSubHabit() == true) dp(30f).toInt() else dp(8f).toInt() + layoutParams = LinearLayout.LayoutParams(ringSize, ringSize).apply { + setMargins(leftMargin, 0, rightMargin, 0) + gravity = Gravity.CENTER } +// } } checkmarkPanel.apply { color = c @@ -297,32 +295,6 @@ class HabitCardView( } } - private fun copyAttributesFrom(hgr: HabitGroup) { - fun getActiveColor(habitGroup: HabitGroup): Int { - return when (habitGroup.isArchived) { - true -> sres.getColor(R.attr.contrast60) - false -> currentTheme().color(habitGroup.color).toInt() - } - } - - val c = getActiveColor(hgr) - label.apply { - text = hgr.name - setTextColor(c) - } - scoreRing.apply { - setColor(c) - } - checkmarkPanel.apply { - color = c - visibility = View.GONE - } - numberPanel.apply { - color = c - visibility = View.GONE - } - } - private fun triggerRipple(x: Float, y: Float) { val background = innerFrame.background background.setHotspot(x, y) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitGroupCardView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitGroupCardView.kt index bcac0dafa..6f5efd87a 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitGroupCardView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitGroupCardView.kt @@ -147,6 +147,8 @@ class HabitGroupCardView( setColor(c) } + collapseButtonView.collapsed = hgr.collapsed + if (collapseButtonView.collapsed) { addButtonView.visibility = GONE } else { diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitGroup.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitGroup.kt index be2ef7365..a11eed785 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitGroup.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitGroup.kt @@ -34,7 +34,10 @@ data class HabitGroup( parent.habitList.getFiltered(matcher), parent.scores, parent.streaks - ) + ) { + this.collapsed = parent.collapsed + this.parent = parent + } init { if (uuid == null) this.uuid = UUID.randomUUID().toString().replace("-", "") @@ -42,24 +45,27 @@ data class HabitGroup( var observable = ModelObservable() + var parent: HabitGroup? = null + val uriString: String get() = "content://org.isoron.uhabits/habitgroup/$id" var collapsed = false set(value) { - if (value != field) { - field = value - habitList.forEach { it.collapsed = value } - } + field = value + habitList.collapsed = value + if (parent != null) parent!!.collapsed = value } fun hasReminder(): Boolean = reminder != null fun isCompletedToday(): Boolean { + if (habitList.isEmpty) return false return habitList.all { it.isCompletedToday() } } fun isEnteredToday(): Boolean { + if (habitList.isEmpty) return false return habitList.all { it.isEnteredToday() } } diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt index 48ab3cd15..0f7c4e340 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt @@ -34,6 +34,8 @@ abstract class HabitList : Iterable { @JvmField protected val filter: HabitMatcher + abstract var collapsed: Boolean + var groupId: Long? = null /** @@ -140,10 +142,6 @@ abstract class HabitList : Iterable { * Removes the reference to the habit from the list at the given position. * * Does not affect the repository or records - * - * If the given habit is not in the list, does nothing. - * - * @param h the habit to be removed. */ abstract fun removeAt(position: Int) diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.kt index c2d40a3fd..3a08b3048 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.kt @@ -51,6 +51,13 @@ class MemoryHabitList : HabitList { getComposedComparatorByOrder(primaryOrder, secondaryOrder) private var parent: MemoryHabitList? = null + override var collapsed: Boolean = false + set(value) { + field = value + val habits = parent?.list ?: list + habits.forEach { it.collapsed = value } + } + constructor() : super() constructor( matcher: HabitMatcher, diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitList.kt index edb78636f..6d19f1fe1 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitList.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitList.kt @@ -144,6 +144,12 @@ class SQLiteHabitList @Inject constructor(private val modelFactory: ModelFactory observable.notifyListeners() } + override var collapsed: Boolean = list.collapsed + set(value) { + field = value + list.collapsed = value + } + @Synchronized override fun indexOf(h: Habit): Int { loadRecords() diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitListTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitListTest.kt index 12d7581d3..93165556f 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitListTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitListTest.kt @@ -48,7 +48,7 @@ class SQLiteHabitListTest : BaseUnitTest() { override fun setUp() { super.setUp() val db: Database = buildMemoryDatabase() - db.execute("PRAGMA foreign_keys = ON;") + db.execute("PRAGMA foreign_keys = OFF;") modelFactory = SQLModelFactory(db) habitList = SQLiteHabitList(modelFactory) fixtures = HabitFixtures(modelFactory, habitList)