-
-
Notifications
You must be signed in to change notification settings - Fork 51
/
Copy pathVirtualizingListBoxModel.vala
145 lines (121 loc) · 4.04 KB
/
VirtualizingListBoxModel.vala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// -*- Mode: vala; indent-tabs-mode: nil; tab-width: 4 -*-
/*-
* Copyright (c) 2018 elementary LLC. (https://elementary.io)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Authored by: David Hewitt <davidmhewitt@gmail.com>
*/
public abstract class VirtualizingListBoxModel : GLib.ListModel, GLib.Object {
private Gee.HashSet<weak GLib.Object> selected_rows = new Gee.HashSet<weak GLib.Object> ();
public GLib.Type get_item_type () {
return typeof (GLib.Object);
}
public abstract uint get_n_items ();
public abstract GLib.Object? get_item (uint index);
public abstract GLib.Object? get_item_unfiltered (uint index);
public void unselect_all () {
selected_rows.clear ();
}
public void set_item_selected (GLib.Object item, bool selected) {
if (!selected) {
selected_rows.remove (item);
} else {
selected_rows.add (item);
}
}
public bool get_item_selected (GLib.Object item) {
return selected_rows.contains (item);
}
public Gee.ArrayList<GLib.Object> get_items_between (GLib.Object from, GLib.Object to) {
var items = new Gee.ArrayList<GLib.Object> ();
var start_found = false;
var ignore_next_break = false;
var length = get_n_items ();
for (int i = 0; i < length; i++) {
var item = get_item (i);
if ((item == from || item == to) && !start_found) {
start_found = true;
ignore_next_break = true;
} else if (!start_found) {
continue;
}
if (item != null) {
items.add (item);
}
if ((item == to || item == from) && !ignore_next_break) {
break;
}
ignore_next_break = false;
}
return items;
}
public int get_index_of (GLib.Object? item) {
if (item == null) {
return -1;
}
var length = get_n_items ();
for (int i = 0; i < length; i++) {
if (item == get_item (i)) {
return i;
}
}
return -1;
}
public int get_index_of_unfiltered (GLib.Object? item) {
if (item == null) {
return -1;
}
var length = get_n_items ();
for (int i = 0; i < length; i++) {
if (item == get_item_unfiltered (i)) {
return i;
}
}
return -1;
}
public int get_index_of_item_before (GLib.Object item) {
if (item == get_item (0)) {
return -1;
}
var length = get_n_items ();
for (int i = 1; i < length; i++) {
if (get_item (i) == item) {
if (get_item (i - 1) != null) {
return i - 1;
}
}
}
return -1;
}
public int get_index_of_item_after (GLib.Object item) {
if (item == get_item (get_n_items () - 1)) {
return -1;
}
var length = get_n_items ();
for (int i = 0; i < length - 1; i++) {
if (get_item (i) == item) {
if (get_item (i + 1) != null) {
return i + 1;
}
}
}
return -1;
}
public Gee.HashSet<weak GLib.Object> get_selected_rows () {
return selected_rows;
}
}