[gnome-games] game-model: Add support for different sort types
- From: Alexander Mikhaylenko <alexm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-games] game-model: Add support for different sort types
- Date: Fri, 31 Jul 2020 11:25:45 +0000 (UTC)
commit 31be786a0661edc2146d9dadba6a8b4b8b92ec46
Author: Neville <nevilleantony98 gmail com>
Date: Sat Jul 18 14:38:55 2020 +0530
game-model: Add support for different sort types
Adds a SortType enum which can be used to decide which comparison func
to use when comparing games in the game-model. It automatically calls
sort when sorting type is changed.
This will be used in the upcoming commits to sort the games in the
decreasing order of last played games.
src/core/game-model.vala | 58 ++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 56 insertions(+), 2 deletions(-)
---
diff --git a/src/core/game-model.vala b/src/core/game-model.vala
index c62dd7a5c..be4058c16 100644
--- a/src/core/game-model.vala
+++ b/src/core/game-model.vala
@@ -6,10 +6,45 @@ private class Games.GameModel : Object, ListModel {
private Sequence<Game> sequence;
private int n_games;
+ private CompareDataFunc<Game> compare_func;
public bool always_replace;
+ public enum SortType {
+ BY_NAME,
+ BY_LAST_PLAYED;
+
+ public CompareDataFunc<Game> get_sort_function () {
+ switch (this) {
+ case BY_NAME:
+ return Game.compare;
+
+ case BY_LAST_PLAYED:
+ return Game.compare_by_date_time;
+
+ default:
+ assert_not_reached ();
+ }
+ }
+ }
+
+ private SortType _sort_type = BY_NAME;
+ public SortType sort_type {
+ get { return _sort_type; }
+ set {
+ if (sort_type == value)
+ return;
+
+ _sort_type = value;
+
+ compare_func = sort_type.get_sort_function ();
+ sequence.sort (compare_func);
+ items_changed (0, n_games, n_games);
+ }
+ }
+
construct {
+ compare_func = sort_type.get_sort_function ();
sequence = new Sequence<Game> ();
n_games = 0;
}
@@ -29,7 +64,7 @@ private class Games.GameModel : Object, ListModel {
}
public void add_game (Game game) {
- var iter = sequence.insert_sorted (game, Game.compare);
+ var iter = sequence.insert_sorted (game, compare_func);
n_games++;
items_changed (iter.get_position (), 0, 1);
@@ -51,7 +86,18 @@ private class Games.GameModel : Object, ListModel {
}
public void remove_game (Game game) {
- var iter = sequence.lookup (game, Game.compare);
+ SequenceIter<Game> iter = null;
+ // Might be expensive so only do it when sequence is sorted by recently played
+ if (sort_type == BY_LAST_PLAYED)
+ iter = get_game_iter (game);
+ else
+ iter = sequence.lookup (game, compare_func);
+
+ if (iter == null)
+ return;
+
+ if (iter == null)
+ return;
var pos = iter.get_position ();
iter.remove ();
@@ -60,4 +106,12 @@ private class Games.GameModel : Object, ListModel {
items_changed (pos, 1, 0);
game_removed (game);
}
+
+ private SequenceIter<Game>? get_game_iter (Game game) {
+ for (var iter = sequence.get_begin_iter (); !iter.is_end (); iter = iter.next ())
+ if (Game.equal (iter.get (), game))
+ return iter;
+
+ return null;
+ }
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]