dee

Merge lp:~mhr3/dee/introspectable-sort-methods into lp:dee

Proposed by Michal Hruby
Status: Merged
Approved by: Paweł Stołowski
Approved revision: 376
Merged at revision: 376
Proposed branch: lp:~mhr3/dee/introspectable-sort-methods
Merge into: lp:dee
Diff against target: 418 lines (+289/-6)
5 files modified
bindings/python/Dee.py (+20/-1)
src/dee-model.c (+98/-0)
src/dee-model.h (+37/-5)
tests/test-model-rows.c (+130/-0)
vapi/dee-1.0.vapi (+4/-0)
To merge this branch: bzr merge lp:~mhr3/dee/introspectable-sort-methods
Reviewer Review Type Date Requested Status
Paweł Stołowski (community) Approve
Review via email: mp+118801@code.launchpad.net

Commit message

Make the *sorted methods usable with introspection

Description of the change

Dee's find_sorted and insert_sorted were not usable from introspectable languages.

Added a delegate that's introspection friendly and tests that make sure it's working.

To post a comment you must log in.
Revision history for this message
Paweł Stołowski (stolowski) wrote :

Looks, good. Just one question:
30 + # FIXME: perhaps override __eq__ on ModelIter?
is this still applicable?

review: Needs Information
376. By Michal Hruby

Remove fixed FIXME

Revision history for this message
Michal Hruby (mhr3) wrote :

> Looks, good. Just one question:
> 30 + # FIXME: perhaps override __eq__ on ModelIter?
> is this still applicable?

Right, already fixed.

Revision history for this message
Paweł Stołowski (stolowski) wrote :

Looks good, tests pass.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'bindings/python/Dee.py'
--- bindings/python/Dee.py 2012-06-27 15:36:53 +0000
+++ bindings/python/Dee.py 2012-08-15 13:38:19 +0000
@@ -63,14 +63,20 @@
63 def insert_before (self, iter, *args):63 def insert_before (self, iter, *args):
64 return self.insert_row_before (iter, self._build_row(args))64 return self.insert_row_before (iter, self._build_row(args))
65 65
66 def insert_row_sorted (self, row_spec, sort_func, data):
67 return self.insert_row_sorted_with_sizes (row_spec, sort_func, data)
68
66 def insert_sorted (self, sort_func, *args):69 def insert_sorted (self, sort_func, *args):
67 return self.insert_row_sorted (self._build_row(args), sort_func, None)70 return self.insert_row_sorted (self._build_row(args), sort_func, None)
68 71
72 def find_row_sorted (self, row_spec, sort_func, data):
73 return self.find_row_sorted_with_sizes (row_spec, sort_func, data)
74
69 def find_sorted (self, sort_func, *args):75 def find_sorted (self, sort_func, *args):
70 return self.find_row_sorted (self._build_row(args), sort_func, None)76 return self.find_row_sorted (self._build_row(args), sort_func, None)
71 77
72 def get_schema (self):78 def get_schema (self):
73 return Dee.Model.get_schema(self)[0]79 return Dee.Model.get_schema(self)
74 80
75 def get_value (self, itr, column):81 def get_value (self, itr, column):
76 return Dee.Model.get_value (self, itr, column).unpack()82 return Dee.Model.get_value (self, itr, column).unpack()
@@ -108,8 +114,21 @@
108 return self.get_n_rows()114 return self.get_n_rows()
109 115
110 116
117class ModelIter(Dee.ModelIter):
118
119 def __init__(self):
120 Dee.ModelIter.__init__(self)
121
122 def __eq__ (self, other):
123 if not isinstance (other, ModelIter):
124 return False
125 return repr(self) == repr(other)
126
127
111128
112Model = override(Model)129Model = override(Model)
113__all__.append('Model')130__all__.append('Model')
131ModelIter = override(ModelIter)
132__all__.append('ModelIter')
114133
115134
116135
=== modified file 'src/dee-model.c'
--- src/dee-model.c 2012-02-28 00:36:16 +0000
+++ src/dee-model.c 2012-08-15 13:38:19 +0000
@@ -975,6 +975,20 @@
975 return (* iface->insert_row_before) (self, iter, row_members);975 return (* iface->insert_row_before) (self, iter, row_members);
976}976}
977977
978/* Translates DeeCompareRowFunc callback into DeeCompareRowSizedFunc */
979static gint
980dee_model_cmp_func_translate_func (GVariant **row1,
981 GVariant **row2,
982 gpointer data)
983{
984 gpointer *all_data = (gpointer*) data;
985 DeeCompareRowSizedFunc cmp_func = (DeeCompareRowSizedFunc) all_data[0];
986 gpointer user_data = all_data[1];
987 guint array_length = GPOINTER_TO_UINT (all_data[2]);
988
989 return cmp_func (row1, array_length, row2, array_length, user_data);
990}
991
978/**992/**
979 * dee_model_insert_row_sorted:993 * dee_model_insert_row_sorted:
980 * @self: The model to do a sorted insert on994 * @self: The model to do a sorted insert on
@@ -1009,6 +1023,41 @@
1009}1023}
10101024
1011/**1025/**
1026 * dee_model_insert_row_sorted_with_sizes:
1027 * @self: The model to do a sorted insert on
1028 * @row_members: (array zero-terminated=1): An array of
1029 * #GVariants with type signature matching those of the
1030 * column schemas of @self. If any of the variants have floating
1031 * references they will be consumed.
1032 * @cmp_func: (scope call): Callback used for comparison or rows
1033 * @user_data: (closure): Arbitrary pointer passed to @cmp_func during search
1034 *
1035 * Inserts a row in @self according to the sorting specified by @cmp_func.
1036 * If you use this method for insertion you should not use other methods as this
1037 * method assumes the model to be already sorted by @cmp_func.
1038 *
1039 * Returns: (transfer none) (type Dee.ModelIter): A #DeeModelIter pointing to the new row
1040 */
1041DeeModelIter*
1042dee_model_insert_row_sorted_with_sizes (DeeModel *self,
1043 GVariant **row_members,
1044 DeeCompareRowSizedFunc cmp_func,
1045 gpointer user_data)
1046{
1047 gpointer all_data[3];
1048
1049 g_return_val_if_fail (DEE_IS_MODEL (self), NULL);
1050
1051 all_data[0] = cmp_func;
1052 all_data[1] = user_data;
1053 all_data[2] = GUINT_TO_POINTER (dee_model_get_n_columns (self));
1054
1055 return dee_model_insert_row_sorted (self, row_members,
1056 dee_model_cmp_func_translate_func,
1057 all_data);
1058}
1059
1060/**
1012 * dee_model_insert_sorted:1061 * dee_model_insert_sorted:
1013 * @self: The model to do a sorted insert on1062 * @self: The model to do a sorted insert on
1014 * @cmp_func: (scope call): Callback used for comparison or rows1063 * @cmp_func: (scope call): Callback used for comparison or rows
@@ -1103,6 +1152,55 @@
1103}1152}
11041153
1105/**1154/**
1155 * dee_model_find_row_sorted_with_sizes:
1156 * @self: The model to search
1157 * @row_spec: (array zero-terminated=1): An array of
1158 * #GVariants with type signature matching those of the
1159 * column schemas of @self. No references will be taken on the variants.
1160 * @cmp_func: (scope call): Callback used for comparison or rows
1161 * @user_data: (closure): Arbitrary pointer passed to @cmp_func during search
1162 * @out_was_found: (out): A place to store a boolean value that will be set when
1163 * this method returns. If %TRUE then an exact match was found.
1164 * If %FALSE then the returned iter points to a row just after
1165 * where @row_spec would have been inserted.
1166 * Pass %NULL to ignore.
1167 *
1168 * Like dee_model_find_row_sorted(), but uses DeeCompareRowSizedFunc and
1169 * therefore doesn't cause trouble when used from introspected languages.
1170 *
1171 * Finds a row in @self according to the sorting specified by @cmp_func.
1172 * This method will assume that @self is already sorted by @cmp_func.
1173 *
1174 * If you use this method for searching you should only use
1175 * dee_model_insert_row_sorted() (or dee_model_insert_row_sorted_with_sizes())
1176 * to insert rows in the model.
1177 *
1178 * Returns: (transfer none) (type Dee.ModelIter): If @out_was_found is set to
1179 * %TRUE then a #DeeModelIter pointing to the first matching row.
1180 * If it is %FALSE then the iter pointing to the row just after where
1181 * @row_spec_would have been inserted.
1182 */
1183DeeModelIter*
1184dee_model_find_row_sorted_with_sizes (DeeModel *self,
1185 GVariant **row_spec,
1186 DeeCompareRowSizedFunc cmp_func,
1187 gpointer user_data,
1188 gboolean *out_was_found)
1189{
1190 gpointer all_data[3];
1191
1192 g_return_val_if_fail (DEE_IS_MODEL (self), NULL);
1193
1194 all_data[0] = cmp_func;
1195 all_data[1] = user_data;
1196 all_data[2] = GUINT_TO_POINTER (dee_model_get_n_columns (self));
1197
1198 return dee_model_find_row_sorted (self, row_spec,
1199 dee_model_cmp_func_translate_func,
1200 all_data, out_was_found);
1201}
1202
1203/**
1106 * dee_model_find_sorted:1204 * dee_model_find_sorted:
1107 * @self: The model to search1205 * @self: The model to search
1108 * @cmp_func: (scope call): Callback used for comparison or rows1206 * @cmp_func: (scope call): Callback used for comparison or rows
11091207
=== modified file 'src/dee-model.h'
--- src/dee-model.h 2012-03-19 11:18:50 +0000
+++ src/dee-model.h 2012-08-15 13:38:19 +0000
@@ -78,6 +78,27 @@
78 GVariant** row2,78 GVariant** row2,
79 gpointer user_data);79 gpointer user_data);
8080
81/**
82 * DeeCompareRowSizedFunc:
83 * @row1: (array length=row1_length): Row data
84 * @row1_length: The number of elements in row1 array
85 * @row2: (array length=row2_length): Row data to compare with
86 * @row2_length: The number of elements in row2 array
87 * @user_data: (closure): User data passed to comparison function
88 *
89 * Compares @row1 and @row2. Mainly used with
90 * dee_model_insert_row_sorted_with_sizes() and
91 * dee_model_find_row_sorted_with_sizes().
92 *
93 * Returns: -1, 0, or 1 if @row1 is respectively less than, equal, or greater
94 * than @row2.
95 */
96typedef gint (*DeeCompareRowSizedFunc) (GVariant** row1,
97 guint row1_length,
98 GVariant** row2,
99 guint row2_length,
100 gpointer user_data);
101
81struct _DeeModelIface102struct _DeeModelIface
82{103{
83 GTypeInterface g_iface;104 GTypeInterface g_iface;
@@ -291,6 +312,11 @@
291 DeeCompareRowFunc cmp_func,312 DeeCompareRowFunc cmp_func,
292 gpointer user_data);313 gpointer user_data);
293314
315DeeModelIter* dee_model_insert_row_sorted_with_sizes (DeeModel *self,
316 GVariant **row_members,
317 DeeCompareRowSizedFunc cmp_func,
318 gpointer user_data);
319
294DeeModelIter* dee_model_insert_sorted (DeeModel *self,320DeeModelIter* dee_model_insert_sorted (DeeModel *self,
295 DeeCompareRowFunc cmp_func,321 DeeCompareRowFunc cmp_func,
296 gpointer user_data,322 gpointer user_data,
@@ -302,11 +328,17 @@
302 gpointer user_data,328 gpointer user_data,
303 gboolean *out_was_found);329 gboolean *out_was_found);
304330
305DeeModelIter* dee_model_find_sorted (DeeModel *self,331DeeModelIter* dee_model_find_row_sorted_with_sizes (DeeModel *self,
306 DeeCompareRowFunc cmp_func,332 GVariant **row_spec,
307 gpointer user_data,333 DeeCompareRowSizedFunc cmp_func,
308 gboolean *out_was_found,334 gpointer user_data,
309 ...);335 gboolean *out_was_found);
336
337DeeModelIter* dee_model_find_sorted (DeeModel *self,
338 DeeCompareRowFunc cmp_func,
339 gpointer user_data,
340 gboolean *out_was_found,
341 ...);
310342
311void dee_model_remove (DeeModel *self,343void dee_model_remove (DeeModel *self,
312 DeeModelIter *iter);344 DeeModelIter *iter);
313345
=== modified file 'tests/test-model-rows.c'
--- tests/test-model-rows.c 2012-01-26 19:08:42 +0000
+++ tests/test-model-rows.c 2012-08-15 13:38:19 +0000
@@ -47,6 +47,7 @@
47static void test_iter_backwards (RowsFixture *fix, gconstpointer data);47static void test_iter_backwards (RowsFixture *fix, gconstpointer data);
48static void test_illegal_access (RowsFixture *fix, gconstpointer data);48static void test_illegal_access (RowsFixture *fix, gconstpointer data);
49static void test_sorted (RowsFixture *fix, gconstpointer data);49static void test_sorted (RowsFixture *fix, gconstpointer data);
50static void test_sorted_with_sizes (RowsFixture *fix, gconstpointer data);
5051
51static void test_model_iter_copy (RowsFixture *fix, gconstpointer data);52static void test_model_iter_copy (RowsFixture *fix, gconstpointer data);
52static void test_model_iter_free (RowsFixture *fix, gconstpointer data);53static void test_model_iter_free (RowsFixture *fix, gconstpointer data);
@@ -133,6 +134,13 @@
133 proxy_rows_setup, test_sorted, proxy_rows_teardown);134 proxy_rows_setup, test_sorted, proxy_rows_teardown);
134 g_test_add (TXN_DOMAIN"/Sorted", RowsFixture, 0,135 g_test_add (TXN_DOMAIN"/Sorted", RowsFixture, 0,
135 txn_rows_setup, test_sorted, txn_rows_teardown);136 txn_rows_setup, test_sorted, txn_rows_teardown);
137
138 g_test_add (SEQ_DOMAIN"/Sorted/WithSizes", RowsFixture, 0,
139 seq_rows_setup, test_sorted_with_sizes, seq_rows_teardown);
140 g_test_add (PROXY_DOMAIN"/Sorted/WithSizes", RowsFixture, 0,
141 proxy_rows_setup, test_sorted_with_sizes, proxy_rows_teardown);
142 g_test_add (TXN_DOMAIN"/Sorted/WithSizes", RowsFixture, 0,
143 txn_rows_setup, test_sorted_with_sizes, txn_rows_teardown);
136}144}
137145
138static void146static void
@@ -560,3 +568,125 @@
560 g_assert (was_found);568 g_assert (was_found);
561 g_assert (result == hter);569 g_assert (result == hter);
562}570}
571
572static gint
573sized_cmp_col_0 (GVariant **row1, guint row1_length,
574 GVariant **row2, guint row2_length, gpointer user_data)
575{
576 g_assert_cmpstr (user_data, ==, "test-user-data");
577 g_assert_cmpuint (row1_length, ==, 2);
578 g_assert_cmpuint (row2_length, ==, 2);
579 g_assert_cmpuint (row1_length, ==, row2_length);
580 return g_variant_get_int32 (row2[0]) - g_variant_get_int32 (row1[0]);
581}
582
583static void
584test_sorted_with_sizes (RowsFixture *fix, gconstpointer data)
585{
586 DeeModelIter *hter, *iter, *jter, *kter;
587 gboolean was_found;
588 GVariant *row_spec[2];
589
590 /* FINAL MODEL: [(28,s), (27,s), (26,s), (25,s)]
591 * ~= [hter, iter, jter, kter] */
592
593 row_spec[0] = g_variant_new_int32 (0);
594 row_spec[1] = g_variant_new_string ("");
595 /* Test find() with an empty model. With NULL was_found arg */
596 iter = dee_model_find_row_sorted_with_sizes (fix->model, row_spec,
597 sized_cmp_col_0,
598 "test-user-data",
599 NULL);
600 g_assert (iter == dee_model_get_last_iter (fix->model));
601
602 /* Test find() with an empty model. With non-NULL was_found arg */
603 was_found = TRUE;
604 iter = dee_model_find_row_sorted_with_sizes (fix->model, row_spec,
605 sized_cmp_col_0,
606 "test-user-data",
607 &was_found);
608 g_assert (!was_found);
609 g_assert (iter == dee_model_get_last_iter (fix->model));
610
611 /* Insert the first row */
612 row_spec[0] = g_variant_new_int32 (27);
613 row_spec[1] = g_variant_new_string ("Sorta sorted");
614 iter = dee_model_insert_row_sorted_with_sizes (fix->model, row_spec,
615 sized_cmp_col_0,
616 "test-user-data");
617 g_assert (iter != dee_model_get_last_iter (fix->model));
618 g_assert (iter == dee_model_get_first_iter (fix->model));
619
620 /* Test append */
621 row_spec[0] = g_variant_new_int32 (25);
622 row_spec[1] = g_variant_new_string ("Sorta sorted");
623 kter = dee_model_insert_row_sorted_with_sizes (fix->model, row_spec,
624 sized_cmp_col_0,
625 "test-user-data");
626 g_assert (kter != dee_model_get_last_iter (fix->model));
627 g_assert (kter != dee_model_get_first_iter (fix->model));
628 g_assert (iter == dee_model_get_first_iter (fix->model));
629 g_assert (kter != iter);
630
631 g_assert_cmpint (2, ==, dee_model_get_n_rows (fix->model));
632 g_assert (kter == dee_model_next (fix->model, iter));
633
634 /* Test insert in between rows */
635 row_spec[0] = g_variant_new_int32 (26);
636 row_spec[1] = g_variant_new_string ("Sorta sorted");
637 jter = dee_model_insert_row_sorted_with_sizes (fix->model, row_spec,
638 sized_cmp_col_0,
639 "test-user-data");
640 g_assert (jter != dee_model_get_last_iter (fix->model));
641 g_assert (jter != dee_model_get_first_iter (fix->model));
642 g_assert (iter == dee_model_get_first_iter (fix->model));
643 g_assert (jter != iter);
644 g_assert (jter != kter);
645
646 g_assert (jter == dee_model_next (fix->model, iter));
647 g_assert (kter == dee_model_next (fix->model, jter));
648 g_assert (dee_model_get_last_iter (fix->model) == dee_model_next (fix->model, kter));
649
650 /* Test prepend */
651 row_spec[0] = g_variant_new_int32 (28);
652 row_spec[1] = g_variant_new_string ("Sorta sorted");
653 hter = dee_model_insert_row_sorted_with_sizes (fix->model, row_spec,
654 sized_cmp_col_0,
655 "test-user-data");
656 g_assert (hter == dee_model_get_first_iter (fix->model));
657 g_assert (iter == dee_model_next (fix->model, hter));
658
659 g_assert_cmpint (4, ==, dee_model_get_n_rows (fix->model));
660
661 /* Test find() again now that we have data in the model */
662 DeeModelIter *result;
663 row_spec[0] = g_variant_new_int32 (24);
664 row_spec[1] = g_variant_new_string ("");
665 result = dee_model_find_row_sorted_with_sizes (fix->model, row_spec,
666 sized_cmp_col_0,
667 "test-user-data", NULL);
668 g_assert (result == dee_model_get_last_iter (fix->model));
669 row_spec[0] = g_variant_new_int32 (28);
670 row_spec[1] = g_variant_new_string ("");
671 result = dee_model_find_row_sorted_with_sizes (fix->model, row_spec,
672 sized_cmp_col_0,
673 "test-user-data", NULL);
674 g_assert (result == hter);
675
676 /* Test find(). With non-NULL was_found arg */
677 was_found = FALSE;
678 row_spec[0] = g_variant_new_int32 (24);
679 row_spec[1] = g_variant_new_string ("");
680 result = dee_model_find_row_sorted_with_sizes (fix->model, row_spec,
681 sized_cmp_col_0,
682 "test-user-data", &was_found);
683 g_assert (result == dee_model_get_last_iter (fix->model));
684 row_spec[0] = g_variant_new_int32 (28);
685 row_spec[1] = g_variant_new_string ("");
686 result = dee_model_find_row_sorted_with_sizes (fix->model, row_spec,
687 sized_cmp_col_0,
688 "test-user-data", &was_found);
689 g_assert (was_found);
690 g_assert (result == hter);
691}
692
563693
=== modified file 'vapi/dee-1.0.vapi'
--- vapi/dee-1.0.vapi 2012-03-19 11:18:50 +0000
+++ vapi/dee-1.0.vapi 2012-08-15 13:38:19 +0000
@@ -208,6 +208,7 @@
208 public abstract unowned Dee.ModelIter append_row ([CCode (array_length = false, array_null_terminated = true)] GLib.Variant[] row_members);208 public abstract unowned Dee.ModelIter append_row ([CCode (array_length = false, array_null_terminated = true)] GLib.Variant[] row_members);
209 public abstract void clear ();209 public abstract void clear ();
210 public abstract unowned Dee.ModelIter find_row_sorted ([CCode (array_length = false, array_null_terminated = true)] GLib.Variant[] row_spec, [CCode (delegate_target_pos = 2.5)] Dee.CompareRowFunc cmp_func, out bool out_was_found);210 public abstract unowned Dee.ModelIter find_row_sorted ([CCode (array_length = false, array_null_terminated = true)] GLib.Variant[] row_spec, [CCode (delegate_target_pos = 2.5)] Dee.CompareRowFunc cmp_func, out bool out_was_found);
211 public unowned Dee.ModelIter find_row_sorted_with_sizes ([CCode (array_length = false, array_null_terminated = true)] GLib.Variant[] row_spec, [CCode (delegate_target_pos = 2.5)] Dee.CompareRowSizedFunc cmp_func, out bool out_was_found);
211 public unowned Dee.ModelIter find_sorted ([CCode (delegate_target_pos = 1.5)] Dee.CompareRowFunc cmp_func, out bool out_was_found, ...);212 public unowned Dee.ModelIter find_sorted ([CCode (delegate_target_pos = 1.5)] Dee.CompareRowFunc cmp_func, out bool out_was_found, ...);
212 public void @get (Dee.ModelIter iter, ...);213 public void @get (Dee.ModelIter iter, ...);
213 public abstract bool get_bool (Dee.ModelIter iter, uint column);214 public abstract bool get_bool (Dee.ModelIter iter, uint column);
@@ -235,6 +236,7 @@
235 public abstract unowned Dee.ModelIter insert_row (uint pos, [CCode (array_length = false, array_null_terminated = true)] GLib.Variant[] row_members);236 public abstract unowned Dee.ModelIter insert_row (uint pos, [CCode (array_length = false, array_null_terminated = true)] GLib.Variant[] row_members);
236 public abstract unowned Dee.ModelIter insert_row_before (Dee.ModelIter iter, [CCode (array_length = false, array_null_terminated = true)] GLib.Variant[] row_members);237 public abstract unowned Dee.ModelIter insert_row_before (Dee.ModelIter iter, [CCode (array_length = false, array_null_terminated = true)] GLib.Variant[] row_members);
237 public abstract unowned Dee.ModelIter insert_row_sorted ([CCode (array_length = false, array_null_terminated = true)] GLib.Variant[] row_members, Dee.CompareRowFunc cmp_func);238 public abstract unowned Dee.ModelIter insert_row_sorted ([CCode (array_length = false, array_null_terminated = true)] GLib.Variant[] row_members, Dee.CompareRowFunc cmp_func);
239 public unowned Dee.ModelIter insert_row_sorted_with_sizes ([CCode (array_length = false, array_null_terminated = true)] GLib.Variant[] row_members, Dee.CompareRowSizedFunc cmp_func);
238 public unowned Dee.ModelIter insert_sorted ([CCode (delegate_target_pos = 1.5)] Dee.CompareRowFunc cmp_func, ...);240 public unowned Dee.ModelIter insert_sorted ([CCode (delegate_target_pos = 1.5)] Dee.CompareRowFunc cmp_func, ...);
239 public abstract bool is_first (Dee.ModelIter iter);241 public abstract bool is_first (Dee.ModelIter iter);
240 public abstract bool is_last (Dee.ModelIter iter);242 public abstract bool is_last (Dee.ModelIter iter);
@@ -343,6 +345,8 @@
343 [CCode (cheader_filename = "dee.h", instance_pos = 2.9)]345 [CCode (cheader_filename = "dee.h", instance_pos = 2.9)]
344 public delegate int CompareRowFunc ([CCode (array_length = false)] GLib.Variant[] row1, [CCode (array_length = false)] GLib.Variant[] row2);346 public delegate int CompareRowFunc ([CCode (array_length = false)] GLib.Variant[] row1, [CCode (array_length = false)] GLib.Variant[] row2);
345 [CCode (cheader_filename = "dee.h", instance_pos = 2.9)]347 [CCode (cheader_filename = "dee.h", instance_pos = 2.9)]
348 public delegate int CompareRowSizedFunc ([CCode (array_length_cname = "row1_length", array_length_pos = 1.5, array_length_type = "guint")] GLib.Variant[] row1, [CCode (array_length_cname = "row2_length", array_length_pos = 2.1, array_length_type = "guint")] GLib.Variant[] row2);
349 [CCode (cheader_filename = "dee.h", instance_pos = 2.9)]
346 public delegate void FilterMapFunc (Dee.Model orig_model, Dee.FilterModel filter_model);350 public delegate void FilterMapFunc (Dee.Model orig_model, Dee.FilterModel filter_model);
347 [CCode (cheader_filename = "dee.h", instance_pos = 3.9)]351 [CCode (cheader_filename = "dee.h", instance_pos = 3.9)]
348 public delegate bool FilterMapNotify (Dee.Model orig_model, Dee.ModelIter orig_iter, Dee.FilterModel filter_model);352 public delegate bool FilterMapNotify (Dee.Model orig_model, Dee.ModelIter orig_iter, Dee.FilterModel filter_model);

Subscribers

People subscribed via source and target branches

to all changes: