dee

Merge lp:~mhr3/dee/add-changesets into lp:dee

Proposed by Michal Hruby
Status: Merged
Approved by: Paweł Stołowski
Approved revision: 430
Merged at revision: 429
Proposed branch: lp:~mhr3/dee/add-changesets
Merge into: lp:dee
Diff against target: 956 lines (+510/-21)
15 files modified
configure.ac (+1/-1)
debian/changelog (+6/-0)
debian/libdee-1.0-4.symbols (+2/-0)
src/dee-filter-model.c (+55/-0)
src/dee-model.c (+111/-0)
src/dee-model.h (+12/-4)
src/dee-proxy-model.c (+61/-1)
src/dee-sequence-model.c (+3/-3)
src/dee-serializable-model.c (+52/-0)
src/dee-shared-model.c (+5/-2)
tests/test-client-server.c (+15/-0)
tests/test-filter-model.c (+138/-8)
tests/test-model-interactions.c (+15/-0)
tests/test-resource-manager.c (+30/-2)
vapi/dee-1.0.vapi (+4/-0)
To merge this branch: bzr merge lp:~mhr3/dee/add-changesets
Reviewer Review Type Date Requested Status
Paweł Stołowski (community) Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+185111@code.launchpad.net

Commit message

Add support for changesets to DeeModel API.

Description of the change

Add support for changesets to DeeModel API.

This will allow us to make dee models more compatible with the way Qt models work and therefore enable us to implement more efficient Qt model wrapper for DeeModel.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Paweł Stołowski (stolowski) wrote :

Great stuff, looks good, some suggestions though:

1) I think it would make sense to implement a rudimentary check for dee_model_begin_changeset / dee_model_end_changeset calls to ensure they're called in a sequence, e.g. by maintaining an internal flag, so that calling end/begin or begin/begin etc. would give a warning.

2) Can you extend the tests to check that "started" signal arrives before "end"?

review: Needs Fixing
lp:~mhr3/dee/add-changesets updated
430. By Michal Hruby

Act on review comments

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

> Great stuff, looks good, some suggestions though:
>
> 1) I think it would make sense to implement a rudimentary check for
> dee_model_begin_changeset / dee_model_end_changeset calls to ensure they're
> called in a sequence, e.g. by maintaining an internal flag, so that calling
> end/begin or begin/begin etc. would give a warning.
>
> 2) Can you extend the tests to check that "started" signal arrives before
> "end"?

Done.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Paweł Stołowski (stolowski) wrote :

Yay, awesome! +1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'configure.ac'
--- configure.ac 2013-07-19 10:13:05 +0000
+++ configure.ac 2013-09-16 18:51:54 +0000
@@ -5,7 +5,7 @@
5# Don't forget to check also GIR_VERSION5# Don't forget to check also GIR_VERSION
6m4_define([dee_major], [1])6m4_define([dee_major], [1])
7m4_define([dee_minor], [2])7m4_define([dee_minor], [2])
8m4_define([dee_micro], [6])8m4_define([dee_micro], [7])
9m4_define([dee_api],9m4_define([dee_api],
10 [dee_major.dee_minor])10 [dee_major.dee_minor])
11m4_define([dee_version],11m4_define([dee_version],
1212
=== modified file 'debian/changelog'
--- debian/changelog 2013-09-04 02:32:11 +0000
+++ debian/changelog 2013-09-16 18:51:54 +0000
@@ -1,3 +1,9 @@
1dee (1.2.7-0ubuntu1) UNRELEASED; urgency=low
2
3 * Added begin and end changeset API.
4
5 -- Michal Hruby <michal.hruby@canonical.com> Tue, 10 Sep 2013 11:59:21 +0100
6
1dee (1.2.6+13.10.20130904-0ubuntu1) saucy; urgency=low7dee (1.2.6+13.10.20130904-0ubuntu1) saucy; urgency=low
28
3 [ Michal Hruby ]9 [ Michal Hruby ]
410
=== modified file 'debian/libdee-1.0-4.symbols'
--- debian/libdee-1.0-4.symbols 2013-05-31 04:30:18 +0000
+++ debian/libdee-1.0-4.symbols 2013-09-16 18:51:54 +0000
@@ -54,12 +54,14 @@
54 dee_index_lookup_one@Base 0.5.1654 dee_index_lookup_one@Base 0.5.16
55 dee_model_append@Base 0.5.255 dee_model_append@Base 0.5.2
56 dee_model_append_row@Base 0.5.256 dee_model_append_row@Base 0.5.2
57 dee_model_begin_changeset@Base 0replaceme
57 dee_model_build_named_row@Base 1.2.0daily12.12.0558 dee_model_build_named_row@Base 1.2.0daily12.12.05
58 dee_model_build_named_row_sunk@Base 1.2.0daily12.12.0559 dee_model_build_named_row_sunk@Base 1.2.0daily12.12.05
59 dee_model_build_named_row_valist@Base 1.2.0daily12.12.0560 dee_model_build_named_row_valist@Base 1.2.0daily12.12.05
60 dee_model_build_row@Base 0.5.261 dee_model_build_row@Base 0.5.2
61 dee_model_clear@Base 0.5.262 dee_model_clear@Base 0.5.2
62 dee_model_clear_tag@Base 0.5.1263 dee_model_clear_tag@Base 0.5.12
64 dee_model_end_changeset@Base 0replaceme
63 dee_model_find_row_sorted@Base 1.0.065 dee_model_find_row_sorted@Base 1.0.0
64 dee_model_find_row_sorted_with_sizes@Base 1.0.1466 dee_model_find_row_sorted_with_sizes@Base 1.0.14
65 dee_model_find_sorted@Base 1.0.067 dee_model_find_sorted@Base 1.0.0
6668
=== modified file 'src/dee-filter-model.c'
--- src/dee-filter-model.c 2013-01-04 17:53:43 +0000
+++ src/dee-filter-model.c 2013-09-16 18:51:54 +0000
@@ -97,6 +97,8 @@
97 gulong on_orig_row_added_id;97 gulong on_orig_row_added_id;
98 gulong on_orig_row_removed_id;98 gulong on_orig_row_removed_id;
99 gulong on_orig_row_changed_id;99 gulong on_orig_row_changed_id;
100 gulong on_orig_changeset_started_id;
101 gulong on_orig_changeset_finished_id;
100};102};
101103
102enum104enum
@@ -162,6 +164,12 @@
162static void on_orig_model_row_changed (DeeFilterModel *self,164static void on_orig_model_row_changed (DeeFilterModel *self,
163 DeeModelIter *iter);165 DeeModelIter *iter);
164166
167static void on_orig_model_changeset_started (DeeFilterModel *self,
168 DeeModel *iter);
169
170static void on_orig_model_changeset_finished (DeeFilterModel *self,
171 DeeModel *iter);
172
165/* GObject stuff */173/* GObject stuff */
166static void174static void
167dee_filter_model_finalize (GObject *object)175dee_filter_model_finalize (GObject *object)
@@ -192,10 +200,16 @@
192 g_signal_handler_disconnect (priv->orig_model, priv->on_orig_row_removed_id);200 g_signal_handler_disconnect (priv->orig_model, priv->on_orig_row_removed_id);
193 if (priv->on_orig_row_changed_id != 0)201 if (priv->on_orig_row_changed_id != 0)
194 g_signal_handler_disconnect (priv->orig_model, priv->on_orig_row_changed_id);202 g_signal_handler_disconnect (priv->orig_model, priv->on_orig_row_changed_id);
203 if (priv->on_orig_changeset_started_id != 0)
204 g_signal_handler_disconnect (priv->orig_model, priv->on_orig_changeset_started_id);
205 if (priv->on_orig_changeset_finished_id != 0)
206 g_signal_handler_disconnect (priv->orig_model, priv->on_orig_changeset_finished_id);
195207
196 priv->on_orig_row_added_id = 0;208 priv->on_orig_row_added_id = 0;
197 priv->on_orig_row_removed_id = 0;209 priv->on_orig_row_removed_id = 0;
198 priv->on_orig_row_changed_id = 0;210 priv->on_orig_row_changed_id = 0;
211 priv->on_orig_changeset_started_id = 0;
212 priv->on_orig_changeset_finished_id = 0;
199213
200 if (priv->orig_model)214 if (priv->orig_model)
201 {215 {
@@ -242,6 +256,16 @@
242 g_signal_connect_swapped (priv->orig_model, "row-changed",256 g_signal_connect_swapped (priv->orig_model, "row-changed",
243 G_CALLBACK (on_orig_model_row_changed), object);257 G_CALLBACK (on_orig_model_row_changed), object);
244258
259 priv->on_orig_changeset_started_id =
260 g_signal_connect_swapped (priv->orig_model, "changeset-started",
261 G_CALLBACK (on_orig_model_changeset_started),
262 object);
263
264 priv->on_orig_changeset_finished_id =
265 g_signal_connect_swapped (priv->orig_model, "changeset-finished",
266 G_CALLBACK (on_orig_model_changeset_finished),
267 object);
268
245 if (G_OBJECT_CLASS (dee_filter_model_parent_class)->constructed)269 if (G_OBJECT_CLASS (dee_filter_model_parent_class)->constructed)
246 G_OBJECT_CLASS (dee_filter_model_parent_class)->constructed (object);270 G_OBJECT_CLASS (dee_filter_model_parent_class)->constructed (object);
247}271}
@@ -327,6 +351,8 @@
327 priv->on_orig_row_added_id = 0;351 priv->on_orig_row_added_id = 0;
328 priv->on_orig_row_removed_id = 0;352 priv->on_orig_row_removed_id = 0;
329 priv->on_orig_row_changed_id = 0;353 priv->on_orig_row_changed_id = 0;
354 priv->on_orig_changeset_started_id = 0;
355 priv->on_orig_changeset_finished_id = 0;
330}356}
331357
332static void358static void
@@ -681,6 +707,35 @@
681 }707 }
682}708}
683709
710static void
711on_orig_model_changeset_started (DeeFilterModel *self,
712 DeeModel *model)
713{
714 DeeFilterModelPrivate *priv;
715
716 priv = self->priv;
717
718 if (priv->ignore_orig_signals)
719 return;
720
721 /* this can end up being an empty changeset, but that's ok */
722 g_signal_emit_by_name (self, "changeset-started");
723}
724
725static void
726on_orig_model_changeset_finished (DeeFilterModel *self,
727 DeeModel *model)
728{
729 DeeFilterModelPrivate *priv;
730
731 priv = self->priv;
732
733 if (priv->ignore_orig_signals)
734 return;
735
736 g_signal_emit_by_name (self, "changeset-finished");
737}
738
684/*739/*
685 * DeeModel Interface Implementation740 * DeeModel Interface Implementation
686 */741 */
687742
=== modified file 'src/dee-model.c'
--- src/dee-model.c 2013-03-08 15:03:27 +0000
+++ src/dee-model.c 2013-09-16 18:51:54 +0000
@@ -98,6 +98,8 @@
98 DEE_MODEL_SIGNAL_ROW_ADDED,98 DEE_MODEL_SIGNAL_ROW_ADDED,
99 DEE_MODEL_SIGNAL_ROW_REMOVED,99 DEE_MODEL_SIGNAL_ROW_REMOVED,
100 DEE_MODEL_SIGNAL_ROW_CHANGED,100 DEE_MODEL_SIGNAL_ROW_CHANGED,
101 DEE_MODEL_SIGNAL_CHANGESET_STARTED,
102 DEE_MODEL_SIGNAL_CHANGESET_FINISHED,
101103
102 DEE_MODEL_LAST_SIGNAL104 DEE_MODEL_LAST_SIGNAL
103};105};
@@ -229,6 +231,44 @@
229 g_cclosure_marshal_VOID__BOXED,231 g_cclosure_marshal_VOID__BOXED,
230 G_TYPE_NONE, 1,232 G_TYPE_NONE, 1,
231 DEE_TYPE_MODEL_ITER);233 DEE_TYPE_MODEL_ITER);
234
235 /**
236 * DeeModel::changeset-started
237 * @self: the #DeeModel on which the signal is emitted
238 *
239 * Connect to this signal to be notified when a changeset that can contain
240 * multiple row additions / changes / removals is about to be committed
241 * to the model.
242 * Note that not all model implementations use the changeset approach and
243 * you might still get a row change signal outside of changeset-started and
244 * changeset-finished signals. It also isn't guaranteed that a changeset
245 * would always be non-empty.
246 */
247 dee_model_signals[DEE_MODEL_SIGNAL_CHANGESET_STARTED] =
248 g_signal_new ("changeset-started",
249 DEE_TYPE_MODEL,
250 G_SIGNAL_RUN_LAST,
251 G_STRUCT_OFFSET (DeeModelIface, changeset_started),
252 NULL, NULL,
253 g_cclosure_marshal_VOID__VOID,
254 G_TYPE_NONE, 0);
255
256 /**
257 * DeeModel::changeset-finished
258 * @self: the #DeeModel on which the signal is emitted
259 *
260 * Connect to this signal to be notified when a changeset that can contain
261 * multiple row additions / changes / removals has been committed
262 * to the model.
263 */
264 dee_model_signals[DEE_MODEL_SIGNAL_CHANGESET_FINISHED] =
265 g_signal_new ("changeset-finished",
266 DEE_TYPE_MODEL,
267 G_SIGNAL_RUN_LAST,
268 G_STRUCT_OFFSET (DeeModelIface, changeset_finished),
269 NULL, NULL,
270 g_cclosure_marshal_VOID__VOID,
271 G_TYPE_NONE, 0);
232}272}
233273
234/**274/**
@@ -646,6 +686,77 @@
646 return (* iface->get_n_rows) (self);686 return (* iface->get_n_rows) (self);
647}687}
648688
689/**
690 * dee_model_begin_changeset:
691 * @self: a #DeeModel
692 *
693 * Notify listeners that the model is about to be changed, which means that
694 * multiple row additions / changes / removals will follow.
695 * The default implementation of this method will emit
696 * the ::changeset-started signal.
697 *
698 * It is not stricly necessary to enclose every change to a model
699 * in a dee_model_begin_changeset() and dee_model_end_changeset() calls, but
700 * doing so is highly recommended and allows implementing various optimizations.
701 *
702 * The usual way to perform multiple changes to a model is as follows:
703 *
704 * <programlisting>
705 * void update_model (DeeModel *model)
706 * {
707 * GVariant **added_row_data1 = ...;
708 * GVariant **added_row_data2 = ...;
709 *
710 * dee_model_begin_changeset (model);
711 *
712 * dee_model_remove (model, dee_model_get_first_iter (model));
713 * dee_model_append_row (model, added_row_data1);
714 * dee_model_append_row (model, added_row_data2);
715 *
716 * dee_model_end_changeset (model);
717 * }
718 * </programlisting>
719 */
720void
721dee_model_begin_changeset (DeeModel *self)
722{
723 DeeModelIface *iface;
724
725 g_return_if_fail (DEE_IS_MODEL (self));
726
727 iface = DEE_MODEL_GET_IFACE (self);
728
729 if (iface->begin_changeset)
730 (* iface->begin_changeset) (self);
731 else
732 g_signal_emit (self, dee_model_signals[DEE_MODEL_SIGNAL_CHANGESET_STARTED], 0);
733}
734
735/**
736 * dee_model_end_changeset:
737 * @self: a #DeeModel
738 *
739 * Notify listeners that all changes have been committed to the model.
740 * The default implementation of this method will emit
741 * the ::changeset-finished signal.
742 *
743 * See also dee_model_begin_changeset().
744 */
745void
746dee_model_end_changeset (DeeModel *self)
747{
748 DeeModelIface *iface;
749
750 g_return_if_fail (DEE_IS_MODEL (self));
751
752 iface = DEE_MODEL_GET_IFACE (self);
753
754 if (iface->end_changeset)
755 (* iface->end_changeset) (self);
756 else
757 g_signal_emit (self, dee_model_signals[DEE_MODEL_SIGNAL_CHANGESET_FINISHED], 0);
758}
759
649static GVariant*760static GVariant*
650collect_variant (const gchar* col_schema, va_list *args)761collect_variant (const gchar* col_schema, va_list *args)
651{762{
652763
=== modified file 'src/dee-model.h'
--- src/dee-model.h 2012-11-27 17:49:57 +0000
+++ src/dee-model.h 2013-09-16 18:51:54 +0000
@@ -266,14 +266,18 @@
266 DeeModelIter *iter,266 DeeModelIter *iter,
267 GVariant **out_row_members);267 GVariant **out_row_members);
268268
269 void (*begin_changeset) (DeeModel *self);
270
271 void (*end_changeset) (DeeModel *self);
272
273 void (*changeset_started) (DeeModel *self);
274
275 void (*changeset_finished) (DeeModel *self);
276
269 /*< private >*/277 /*< private >*/
270 void (*_dee_model_1) (void);278 void (*_dee_model_1) (void);
271 void (*_dee_model_2) (void);279 void (*_dee_model_2) (void);
272 void (*_dee_model_3) (void);280 void (*_dee_model_3) (void);
273 void (*_dee_model_4) (void);
274 void (*_dee_model_5) (void);
275 void (*_dee_model_6) (void);
276 void (*_dee_model_7) (void);
277};281};
278282
279GType dee_model_iter_get_type (void);283GType dee_model_iter_get_type (void);
@@ -494,6 +498,10 @@
494 DeeModelIter *iter,498 DeeModelIter *iter,
495 DeeModelTag *tag);499 DeeModelTag *tag);
496500
501void dee_model_begin_changeset (DeeModel *self);
502
503void dee_model_end_changeset (DeeModel *self);
504
497GVariant** dee_model_build_row (DeeModel *self,505GVariant** dee_model_build_row (DeeModel *self,
498 GVariant **out_row_members,506 GVariant **out_row_members,
499 ...);507 ...);
500508
=== modified file 'src/dee-proxy-model.c'
--- src/dee-proxy-model.c 2013-01-04 17:53:43 +0000
+++ src/dee-proxy-model.c 2013-09-16 18:51:54 +0000
@@ -81,6 +81,8 @@
81 gulong row_added_handler;81 gulong row_added_handler;
82 gulong row_removed_handler;82 gulong row_removed_handler;
83 gulong row_changed_handler;83 gulong row_changed_handler;
84 gulong changeset_started_handler;
85 gulong changeset_finished_handler;
84};86};
8587
86#define DEE_PROXY_MODEL_BACK_END(model) (DEE_PROXY_MODEL(model)->priv->back_end)88#define DEE_PROXY_MODEL_BACK_END(model) (DEE_PROXY_MODEL(model)->priv->back_end)
@@ -233,6 +235,10 @@
233 DeeModelTag *tag,235 DeeModelTag *tag,
234 gpointer value);236 gpointer value);
235237
238static void dee_proxy_model_begin_changeset (DeeModel *self);
239
240static void dee_proxy_model_end_changeset (DeeModel *self);
241
236/*242/*
237 * Callbacks for relaying signals from the back end model243 * Callbacks for relaying signals from the back end model
238 */244 */
@@ -245,6 +251,12 @@
245static void on_back_end_row_changed (DeeProxyModel *self,251static void on_back_end_row_changed (DeeProxyModel *self,
246 DeeModelIter *iter);252 DeeModelIter *iter);
247253
254static void on_back_end_changeset_started (DeeProxyModel *self,
255 DeeModel *model);
256
257static void on_back_end_changeset_finished (DeeProxyModel *self,
258 DeeModel *model);
259
248/*260/*
249 * Overrides for DeeSerializableModel261 * Overrides for DeeSerializableModel
250 */262 */
@@ -270,6 +282,10 @@
270 g_signal_handler_disconnect (priv->back_end, priv->row_removed_handler);282 g_signal_handler_disconnect (priv->back_end, priv->row_removed_handler);
271 if (priv->row_changed_handler != 0)283 if (priv->row_changed_handler != 0)
272 g_signal_handler_disconnect (priv->back_end, priv->row_changed_handler);284 g_signal_handler_disconnect (priv->back_end, priv->row_changed_handler);
285 if (priv->changeset_started_handler != 0)
286 g_signal_handler_disconnect (priv->back_end, priv->changeset_started_handler);
287 if (priv->changeset_finished_handler != 0)
288 g_signal_handler_disconnect (priv->back_end, priv->changeset_finished_handler);
273289
274 g_object_unref (priv->back_end);290 g_object_unref (priv->back_end);
275 }291 }
@@ -302,6 +318,16 @@
302 priv->row_changed_handler =318 priv->row_changed_handler =
303 g_signal_connect_swapped (priv->back_end, "row-changed",319 g_signal_connect_swapped (priv->back_end, "row-changed",
304 G_CALLBACK (on_back_end_row_changed), object);320 G_CALLBACK (on_back_end_row_changed), object);
321
322 priv->changeset_started_handler =
323 g_signal_connect_swapped (priv->back_end, "changeset-started",
324 G_CALLBACK (on_back_end_changeset_started),
325 object);
326
327 priv->changeset_finished_handler =
328 g_signal_connect_swapped (priv->back_end, "changeset-finished",
329 G_CALLBACK (on_back_end_changeset_finished),
330 object);
305 }331 }
306 332
307 /* GObjectClass has NULL 'constructed' member, but we add this check for333 /* GObjectClass has NULL 'constructed' member, but we add this check for
@@ -407,7 +433,7 @@
407 * from the back end model.433 * from the back end model.
408 * You will most likely want to set this property to false434 * You will most likely want to set this property to false
409 * if the implementation manipulates with the rows in the model and keep435 * if the implementation manipulates with the rows in the model and keep
410 * track of seqnums.436 * track of seqnums yourself.
411 **/437 **/
412 pspec = g_param_spec_boolean ("inherit-seqnums", "Inherit seqnums",438 pspec = g_param_spec_boolean ("inherit-seqnums", "Inherit seqnums",
413 "Whether or not to inherit seqnums",439 "Whether or not to inherit seqnums",
@@ -462,6 +488,8 @@
462 iface->register_tag = dee_proxy_model_register_tag;488 iface->register_tag = dee_proxy_model_register_tag;
463 iface->get_tag = dee_proxy_model_get_tag;489 iface->get_tag = dee_proxy_model_get_tag;
464 iface->set_tag = dee_proxy_model_set_tag;490 iface->set_tag = dee_proxy_model_set_tag;
491 iface->begin_changeset = dee_proxy_model_begin_changeset;
492 iface->end_changeset = dee_proxy_model_end_changeset;
465493
466 iface->register_vardict_schema = dee_proxy_model_register_vardict_schema;494 iface->register_vardict_schema = dee_proxy_model_register_vardict_schema;
467 iface->get_vardict_schema = dee_proxy_model_get_vardict_schema;495 iface->get_vardict_schema = dee_proxy_model_get_vardict_schema;
@@ -479,6 +507,8 @@
479 priv->row_added_handler = 0;507 priv->row_added_handler = 0;
480 priv->row_removed_handler = 0;508 priv->row_removed_handler = 0;
481 priv->row_changed_handler = 0;509 priv->row_changed_handler = 0;
510 priv->changeset_started_handler = 0;
511 priv->changeset_finished_handler = 0;
482}512}
483513
484/*514/*
@@ -891,6 +921,22 @@
891 return dee_model_set_tag (DEE_PROXY_MODEL_BACK_END (self), iter, tag, value);921 return dee_model_set_tag (DEE_PROXY_MODEL_BACK_END (self), iter, tag, value);
892}922}
893923
924static void
925dee_proxy_model_begin_changeset (DeeModel *self)
926{
927 g_return_if_fail (DEE_IS_PROXY_MODEL (self));
928
929 dee_model_begin_changeset (DEE_PROXY_MODEL_BACK_END (self));
930}
931
932static void
933dee_proxy_model_end_changeset (DeeModel *self)
934{
935 g_return_if_fail (DEE_IS_PROXY_MODEL (self));
936
937 dee_model_end_changeset (DEE_PROXY_MODEL_BACK_END (self));
938}
939
894/*940/*
895 * Relay signals from back end941 * Relay signals from back end
896 */942 */
@@ -916,6 +962,20 @@
916 g_signal_emit_by_name (self, "row-changed", iter);962 g_signal_emit_by_name (self, "row-changed", iter);
917}963}
918964
965static void
966on_back_end_changeset_started (DeeProxyModel *self,
967 DeeModel *model)
968{
969 g_signal_emit_by_name (self, "changeset-started");
970}
971
972static void
973on_back_end_changeset_finished (DeeProxyModel *self,
974 DeeModel *model)
975{
976 g_signal_emit_by_name (self, "changeset-finished");
977}
978
919/*979/*
920 * Overrides for DeeSerializableModel980 * Overrides for DeeSerializableModel
921 */981 */
922982
=== modified file 'src/dee-sequence-model.c'
--- src/dee-sequence-model.c 2012-02-28 00:34:40 +0000
+++ src/dee-sequence-model.c 2013-09-16 18:51:54 +0000
@@ -280,9 +280,9 @@
280 obj_class->get_property = dee_sequence_model_get_property;280 obj_class->get_property = dee_sequence_model_get_property;
281281
282 /* Find signal ids for the model modification signals */282 /* Find signal ids for the model modification signals */
283 sigid_row_added = g_signal_lookup ("row-added", DEE_TYPE_SEQUENCE_MODEL);283 sigid_row_added = g_signal_lookup ("row-added", DEE_TYPE_MODEL);
284 sigid_row_removed = g_signal_lookup ("row-removed", DEE_TYPE_SEQUENCE_MODEL);284 sigid_row_removed = g_signal_lookup ("row-removed", DEE_TYPE_MODEL);
285 sigid_row_changed = g_signal_lookup ("row-changed", DEE_TYPE_SEQUENCE_MODEL);285 sigid_row_changed = g_signal_lookup ("row-changed", DEE_TYPE_MODEL);
286286
287 /* Add private data */287 /* Add private data */
288 g_type_class_add_private (obj_class, sizeof (DeeSequenceModelPrivate));288 g_type_class_add_private (obj_class, sizeof (DeeSequenceModelPrivate));
289289
=== modified file 'src/dee-serializable-model.c'
--- src/dee-serializable-model.c 2013-07-21 22:29:56 +0000
+++ src/dee-serializable-model.c 2013-09-16 18:51:54 +0000
@@ -77,6 +77,7 @@
77 gchar **column_names; // NULL terminated77 gchar **column_names; // NULL terminated
78 guint32 *column_name_hashes;78 guint32 *column_name_hashes;
79 GHashTable *field_schemas;79 GHashTable *field_schemas;
80 gboolean inside_changeset;
80};81};
8182
82typedef struct _FieldSchemaInfo FieldSchemaInfo;83typedef struct _FieldSchemaInfo FieldSchemaInfo;
@@ -238,6 +239,13 @@
238static gboolean dee_serializable_model_is_last (DeeModel *self,239static gboolean dee_serializable_model_is_last (DeeModel *self,
239 DeeModelIter *iter);240 DeeModelIter *iter);
240241
242static void dee_serializable_model_begin_changeset (DeeModel *self);
243
244static void dee_serializable_model_end_changeset (DeeModel *self);
245
246static guint sigid_changeset_started = 0;
247static guint sigid_changeset_finished = 0;
248
241/* FieldSchemaInfo methods */249/* FieldSchemaInfo methods */
242static FieldSchemaInfo*250static FieldSchemaInfo*
243field_schema_info_new (const gchar *schema, guint column)251field_schema_info_new (const gchar *schema, guint column)
@@ -352,6 +360,9 @@
352 klass->set_seqnum = dee_serializable_model_set_seqnum_real;360 klass->set_seqnum = dee_serializable_model_set_seqnum_real;
353 klass->inc_seqnum = dee_serializable_model_inc_seqnum_real;361 klass->inc_seqnum = dee_serializable_model_inc_seqnum_real;
354362
363 sigid_changeset_started = g_signal_lookup ("changeset-started", DEE_TYPE_MODEL);
364 sigid_changeset_finished = g_signal_lookup ("changeset-finished", DEE_TYPE_MODEL);
365
355 /* Add private data */366 /* Add private data */
356 g_type_class_add_private (obj_class, sizeof (DeeSerializableModelPrivate));367 g_type_class_add_private (obj_class, sizeof (DeeSerializableModelPrivate));
357}368}
@@ -1328,6 +1339,44 @@
1328 }1339 }
1329}1340}
13301341
1342static void
1343dee_serializable_model_begin_changeset (DeeModel *self)
1344{
1345 DeeSerializableModelPrivate *priv;
1346
1347 priv = DEE_SERIALIZABLE_MODEL (self)->priv;
1348
1349 if (!priv->inside_changeset)
1350 {
1351 priv->inside_changeset = TRUE;
1352 g_signal_emit (self, sigid_changeset_started, 0);
1353 }
1354 else
1355 {
1356 g_warning ("Ignored call to dee_model_begin_changeset, finish "
1357 "the current changeset using dee_model_end_changeset first");
1358 }
1359}
1360
1361static void
1362dee_serializable_model_end_changeset (DeeModel *self)
1363{
1364 DeeSerializableModelPrivate *priv;
1365
1366 priv = DEE_SERIALIZABLE_MODEL (self)->priv;
1367
1368 if (priv->inside_changeset)
1369 {
1370 priv->inside_changeset = FALSE;
1371 g_signal_emit (self, sigid_changeset_finished, 0);
1372 }
1373 else
1374 {
1375 g_warning ("Ignored call to dee_model_end_changeset, "
1376 "dee_model_begin_changeset has to be called first");
1377 }
1378}
1379
1331static DeeModelTag*1380static DeeModelTag*
1332dee_serializable_model_register_tag (DeeModel *self,1381dee_serializable_model_register_tag (DeeModel *self,
1333 GDestroyNotify tag_destroy)1382 GDestroyNotify tag_destroy)
@@ -1635,6 +1684,9 @@
1635 dee_serializable_model_register_vardict_schema;1684 dee_serializable_model_register_vardict_schema;
1636 iface->get_vardict_schema =1685 iface->get_vardict_schema =
1637 dee_serializable_model_get_vardict_schema;1686 dee_serializable_model_get_vardict_schema;
1687
1688 iface->begin_changeset = dee_serializable_model_begin_changeset;
1689 iface->end_changeset = dee_serializable_model_end_changeset;
1638}1690}
16391691
1640static void1692static void
16411693
=== modified file 'src/dee-shared-model.c'
--- src/dee-shared-model.c 2013-07-21 22:29:56 +0000
+++ src/dee-shared-model.c 2013-09-16 18:51:54 +0000
@@ -1477,6 +1477,7 @@
1477 trace_object (self, "Applying transaction of %i rows", n_rows);1477 trace_object (self, "Applying transaction of %i rows", n_rows);
14781478
1479 /* Phew. Finally. We're ready to merge the changes */1479 /* Phew. Finally. We're ready to merge the changes */
1480 g_signal_emit_by_name (self, "changeset-started");
1480 g_signal_emit (self, _signals[BEGIN_TRANSACTION], 0, seqnum_before, seqnum_after);1481 g_signal_emit (self, _signals[BEGIN_TRANSACTION], 0, seqnum_before, seqnum_after);
1481 priv->suppress_remote_signals = TRUE;1482 priv->suppress_remote_signals = TRUE;
1482 for (i = 0; i < n_rows; i++) /* Begin outer loop */1483 for (i = 0; i < n_rows; i++) /* Begin outer loop */
@@ -1513,8 +1514,9 @@
1513 g_critical ("Commit from %s contains rows of illegal length. "1514 g_critical ("Commit from %s contains rows of illegal length. "
1514 "The model may have been left in a dirty state",1515 "The model may have been left in a dirty state",
1515 sender_name);1516 sender_name);
1516 // FIXME: cleanup1517 /* cleanup */
1517 return;1518 g_variant_unref (row);
1519 continue;
1518 }1520 }
15191521
1520 /* Read the row cells into our stack allocated row buffer.1522 /* Read the row cells into our stack allocated row buffer.
@@ -1570,6 +1572,7 @@
1570 priv->last_committed_seqnum = seqnum_after;1572 priv->last_committed_seqnum = seqnum_after;
15711573
1572 g_signal_emit (self, _signals[END_TRANSACTION], 0, seqnum_before, seqnum_after);1574 g_signal_emit (self, _signals[END_TRANSACTION], 0, seqnum_before, seqnum_after);
1575 g_signal_emit_by_name (self, "changeset-finished");
1573}1576}
15741577
1575static void1578static void
15761579
=== modified file 'tests/test-client-server.c'
--- tests/test-client-server.c 2012-02-28 10:56:27 +0000
+++ tests/test-client-server.c 2013-09-16 18:51:54 +0000
@@ -820,6 +820,12 @@
820}820}
821821
822static void822static void
823changeset_signal (DeeModel *model, gboolean *value)
824{
825 *value = TRUE;
826}
827
828static void
823test_remote_append (Fixture *fix, gconstpointer data)829test_remote_append (Fixture *fix, gconstpointer data)
824{830{
825 if (gtx_wait_for_signal (G_OBJECT (fix->model), TIMEOUT, "notify::synchronized", NULL))831 if (gtx_wait_for_signal (G_OBJECT (fix->model), TIMEOUT, "notify::synchronized", NULL))
@@ -829,6 +835,13 @@
829 g_assert (dee_shared_model_is_leader (DEE_SHARED_MODEL (fix->model)));835 g_assert (dee_shared_model_is_leader (DEE_SHARED_MODEL (fix->model)));
830 g_assert_cmpuint (dee_model_get_n_rows (fix->model), ==, 0);836 g_assert_cmpuint (dee_model_get_n_rows (fix->model), ==, 0);
831837
838 gboolean got_changeset_start = FALSE;
839 gboolean got_changeset_finish = FALSE;
840 g_signal_connect (fix->model, "changeset-started",
841 G_CALLBACK (changeset_signal), &got_changeset_start);
842 g_signal_connect (fix->model, "changeset-finished",
843 G_CALLBACK (changeset_signal), &got_changeset_finish);
844
832 if (gtx_wait_for_command (TESTDIR,845 if (gtx_wait_for_command (TESTDIR,
833 MODEL_HELPER (append1, MODEL_NAME),846 MODEL_HELPER (append1, MODEL_NAME),
834 2000))847 2000))
@@ -838,6 +851,8 @@
838851
839 /* There should be a new row in the model */852 /* There should be a new row in the model */
840 g_assert_cmpuint (dee_model_get_n_rows (fix->model), ==, 1);853 g_assert_cmpuint (dee_model_get_n_rows (fix->model), ==, 1);
854 g_assert (got_changeset_start);
855 g_assert (got_changeset_finish);
841}856}
842857
843static void858static void
844859
=== modified file 'tests/test-filter-model.c'
--- tests/test-filter-model.c 2013-05-31 12:38:11 +0000
+++ tests/test-filter-model.c 2013-09-16 18:51:54 +0000
@@ -28,8 +28,16 @@
2828
29} FilterFixture;29} FilterFixture;
3030
31static void setup (FilterFixture *fix, gconstpointer data);31typedef struct
32static void teardown (FilterFixture *fix, gconstpointer data);32{
33 gint first;
34 gint second;
35
36} TwoIntsTuple;
37
38static void setup (FilterFixture *fix, gconstpointer data);
39static void setup_empty (FilterFixture *fix, gconstpointer data);
40static void teardown (FilterFixture *fix, gconstpointer data);
3341
34static void test_empty_orig (FilterFixture *fix,42static void test_empty_orig (FilterFixture *fix,
35 gconstpointer data);43 gconstpointer data);
@@ -54,6 +62,9 @@
54static void test_regex (FilterFixture *fix,62static void test_regex (FilterFixture *fix,
55 gconstpointer data);63 gconstpointer data);
5664
65static void test_changesets (FilterFixture *fix,
66 gconstpointer data);
67
57void68void
58test_filter_model_create_suite (void)69test_filter_model_create_suite (void)
59{70{
@@ -78,22 +89,35 @@
78 setup, test_any, teardown);89 setup, test_any, teardown);
79 g_test_add (DOMAIN"/Regex", FilterFixture, 0,90 g_test_add (DOMAIN"/Regex", FilterFixture, 0,
80 setup, test_regex, teardown);91 setup, test_regex, teardown);
92 g_test_add (DOMAIN"/Changesets", FilterFixture, 0,
93 setup_empty, test_changesets, teardown);
81}94}
8295
83static void96static void
84setup (FilterFixture *fix, gconstpointer data)97setup_empty (FilterFixture *fix, gconstpointer data)
85{98{
86 fix->model = dee_sequence_model_new ();99 fix->model = dee_sequence_model_new ();
87 dee_model_set_schema (fix->model, "i", "s", NULL);100 dee_model_set_schema (fix->model, "i", "s", NULL);
88 101
89 dee_model_append (fix->model, 0, "Zero");
90 dee_model_append (fix->model, 1, "One");
91 dee_model_append (fix->model, 2, "Two");
92
93 g_assert (DEE_IS_SEQUENCE_MODEL (fix->model));102 g_assert (DEE_IS_SEQUENCE_MODEL (fix->model));
94}103}
95104
96static void105static void
106add_3rows(DeeModel *model)
107{
108 dee_model_append (model, 0, "Zero");
109 dee_model_append (model, 1, "One");
110 dee_model_append (model, 2, "Two");
111}
112
113static void
114setup (FilterFixture *fix, gconstpointer data)
115{
116 setup_empty (fix, data);
117 add_3rows (fix->model);
118}
119
120static void
97teardown (FilterFixture *fix, gconstpointer data)121teardown (FilterFixture *fix, gconstpointer data)
98{122{
99 g_object_unref (fix->model);123 g_object_unref (fix->model);
@@ -282,7 +306,28 @@
282 g_assert_cmpint (27, ==, dee_model_get_int32 (fix->model, iter, 0));306 g_assert_cmpint (27, ==, dee_model_get_int32 (fix->model, iter, 0));
283 g_assert_cmpstr ("TwentySeven", ==, dee_model_get_string (m, iter, 1));307 g_assert_cmpstr ("TwentySeven", ==, dee_model_get_string (m, iter, 1));
284 g_assert_cmpstr ("TwentySeven", ==, dee_model_get_string (fix->model, iter, 1));308 g_assert_cmpstr ("TwentySeven", ==, dee_model_get_string (fix->model, iter, 1));
285 309
310 /* And append two more rows to the filtered model, to ensure the order */
311 dee_model_prepend (m, -1, "MinusOne");
312 dee_model_append (m, 39, "ThirtyNine");
313 g_assert_cmpint (3, ==, filter_add_count);
314 g_assert_cmpint (5, ==, orig_add_count);
315 g_assert_cmpint (3, ==, dee_model_get_n_rows (m));
316 g_assert_cmpint (8, ==, dee_model_get_n_rows (fix->model));
317 g_assert_cmpuint (3, ==, dee_serializable_model_get_seqnum (m));
318 iter = dee_model_prev (m, dee_model_get_last_iter (m));
319 g_assert_cmpint (39, ==, dee_model_get_int32 (m, iter, 0));
320 g_assert_cmpstr ("ThirtyNine", ==, dee_model_get_string (m, iter, 1));
321 iter = dee_model_prev (m, iter);
322 g_assert_cmpint (27, ==, dee_model_get_int32 (m, iter, 0));
323 g_assert_cmpstr ("TwentySeven", ==, dee_model_get_string (m, iter, 1));
324 iter = dee_model_prev (m, iter);
325 g_assert_cmpint (-1, ==, dee_model_get_int32 (m, iter, 0));
326 g_assert_cmpstr ("MinusOne", ==, dee_model_get_string (m, iter, 1));
327 iter = dee_model_prev (fix->model, dee_model_get_last_iter (fix->model));
328 g_assert_cmpint (39, ==, dee_model_get_int32 (fix->model, iter, 0));
329 g_assert_cmpstr ("ThirtyNine", ==, dee_model_get_string (fix->model, iter, 1));
330
286 g_object_unref (m);331 g_object_unref (m);
287}332}
288333
@@ -616,3 +661,88 @@
616 _test_orig_ordering (fix, &filter);661 _test_orig_ordering (fix, &filter);
617 g_regex_unref (regex);662 g_regex_unref (regex);
618}663}
664
665static void
666increment_first (TwoIntsTuple *tuple)
667{
668 tuple->first++;
669 // first always has to be incremented before second
670 g_assert (tuple->first > tuple->second);
671}
672
673static void
674increment_second (TwoIntsTuple *tuple)
675{
676 tuple->second++;
677 // second needs to be incremented after first
678 g_assert (tuple->second == tuple->first);
679}
680
681static void
682test_changesets (FilterFixture *fix, gconstpointer data)
683{
684 GRegex *regex;
685 DeeFilter filter;
686 DeeModel *filter_m1;
687 DeeModel *filter_m2;
688 DeeModel *filter_m3;
689
690 regex = g_regex_new ("^..[eo]", 0, 0, NULL);
691 dee_filter_new_regex (1, regex, &filter);
692 filter_m1 = dee_filter_model_new (fix->model, &filter);
693 g_regex_unref (regex);
694
695 regex = g_regex_new ("^Z", 0, 0, NULL);
696 dee_filter_new_regex (1, regex, &filter);
697 filter_m2 = dee_filter_model_new (fix->model, &filter);
698 g_regex_unref (regex);
699
700 regex = g_regex_new ("^X", 0, 0, NULL);
701 dee_filter_new_regex (1, regex, &filter);
702 filter_m3 = dee_filter_model_new (fix->model, &filter);
703 g_regex_unref (regex);
704
705 g_assert_cmpuint (0, ==, dee_model_get_n_rows (fix->model));
706 g_assert_cmpuint (0, ==, dee_model_get_n_rows (filter_m1));
707 g_assert_cmpuint (0, ==, dee_model_get_n_rows (filter_m2));
708 g_assert_cmpuint (0, ==, dee_model_get_n_rows (filter_m3));
709
710 TwoIntsTuple tuple_m0 = { 0, 0 };
711 TwoIntsTuple tuple_m1 = { 0, 0 };
712 TwoIntsTuple tuple_m2 = { 0, 0 };
713 TwoIntsTuple tuple_m3 = { 0, 0 };
714
715 g_signal_connect_swapped (fix->model, "changeset-started",
716 G_CALLBACK (increment_first), &tuple_m0);
717 g_signal_connect_swapped (fix->model, "changeset-finished",
718 G_CALLBACK (increment_second), &tuple_m0);
719 g_signal_connect_swapped (filter_m1, "changeset-started",
720 G_CALLBACK (increment_first), &tuple_m1);
721 g_signal_connect_swapped (filter_m1, "changeset-finished",
722 G_CALLBACK (increment_second), &tuple_m1);
723 g_signal_connect_swapped (filter_m2, "changeset-started",
724 G_CALLBACK (increment_first), &tuple_m2);
725 g_signal_connect_swapped (filter_m2, "changeset-finished",
726 G_CALLBACK (increment_second), &tuple_m2);
727 g_signal_connect_swapped (filter_m3, "changeset-started",
728 G_CALLBACK (increment_first), &tuple_m3);
729 g_signal_connect_swapped (filter_m3, "changeset-finished",
730 G_CALLBACK (increment_second), &tuple_m3);
731
732 dee_model_begin_changeset (fix->model);
733 add_3rows (fix->model);
734 dee_model_end_changeset (fix->model);
735
736 g_assert_cmpuint (3, ==, dee_model_get_n_rows (fix->model));
737 g_assert_cmpuint (2, ==, dee_model_get_n_rows (filter_m1));
738 g_assert_cmpuint (1, ==, dee_model_get_n_rows (filter_m2));
739 g_assert_cmpuint (0, ==, dee_model_get_n_rows (filter_m3));
740 g_assert_cmpint (tuple_m0.first, ==, 1);
741 g_assert_cmpint (tuple_m0.second, ==, 1);
742 g_assert_cmpint (tuple_m1.first, ==, 1);
743 g_assert_cmpint (tuple_m1.second, ==, 1);
744 g_assert_cmpint (tuple_m2.first, ==, 1);
745 g_assert_cmpint (tuple_m2.second, ==, 1);
746 g_assert_cmpint (tuple_m3.first, ==, 1);
747 g_assert_cmpint (tuple_m3.second, ==, 1);
748}
619749
=== modified file 'tests/test-model-interactions.c'
--- tests/test-model-interactions.c 2013-07-16 08:32:59 +0000
+++ tests/test-model-interactions.c 2013-09-16 18:51:54 +0000
@@ -699,6 +699,12 @@
699}699}
700700
701static void701static void
702changeset_signal (DeeModel *model, gboolean *value)
703{
704 *value = TRUE;
705}
706
707static void
702test_remote_append (Fixture *fix, gconstpointer data)708test_remote_append (Fixture *fix, gconstpointer data)
703{709{
704 if (gtx_wait_for_signal (G_OBJECT (fix->model), TIMEOUT, "notify::synchronized", NULL))710 if (gtx_wait_for_signal (G_OBJECT (fix->model), TIMEOUT, "notify::synchronized", NULL))
@@ -708,6 +714,13 @@
708 g_assert (dee_shared_model_is_leader (DEE_SHARED_MODEL (fix->model)));714 g_assert (dee_shared_model_is_leader (DEE_SHARED_MODEL (fix->model)));
709 g_assert_cmpuint (dee_model_get_n_rows (fix->model), ==, 0);715 g_assert_cmpuint (dee_model_get_n_rows (fix->model), ==, 0);
710716
717 gboolean got_changeset_start = FALSE;
718 gboolean got_changeset_finish = FALSE;
719 g_signal_connect (fix->model, "changeset-started",
720 G_CALLBACK (changeset_signal), &got_changeset_start);
721 g_signal_connect (fix->model, "changeset-finished",
722 G_CALLBACK (changeset_signal), &got_changeset_finish);
723
711 if (gtx_wait_for_command (TESTDIR,724 if (gtx_wait_for_command (TESTDIR,
712 MODEL_HELPER (append1, MODEL_NAME),725 MODEL_HELPER (append1, MODEL_NAME),
713 2000))726 2000))
@@ -717,6 +730,8 @@
717730
718 /* There should be a new row in the model */731 /* There should be a new row in the model */
719 g_assert_cmpuint (dee_model_get_n_rows (fix->model), ==, 1);732 g_assert_cmpuint (dee_model_get_n_rows (fix->model), ==, 1);
733 g_assert (got_changeset_start);
734 g_assert (got_changeset_finish);
720}735}
721736
722static void737static void
723738
=== modified file 'tests/test-resource-manager.c'
--- tests/test-resource-manager.c 2011-03-01 20:55:42 +0000
+++ tests/test-resource-manager.c 2013-09-16 18:51:54 +0000
@@ -38,17 +38,21 @@
38static void shared_model_teardown (Fixture *fix, gconstpointer data);38static void shared_model_teardown (Fixture *fix, gconstpointer data);
3939
40static void test_model_persistence (Fixture *fix, gconstpointer data);40static void test_model_persistence (Fixture *fix, gconstpointer data);
41static void test_resource_manager_default (Fixture *fix, gconstpointer data);
4142
42void43void
43test_resource_manager_create_suite (void)44test_resource_manager_create_suite (void)
44{45{
45#define DOMAIN "/ResourceManager"46#define DOMAIN "/ResourceManager"
4647
48 g_test_add (DOMAIN"/Default", Fixture, 0,
49 NULL, test_resource_manager_default, NULL);
50
47 g_test_add (DOMAIN"/SequenceModel", Fixture, 0,51 g_test_add (DOMAIN"/SequenceModel", Fixture, 0,
48 sequence_model_setup, test_model_persistence, sequence_model_teardown);52 sequence_model_setup, test_model_persistence, sequence_model_teardown);
4953
50 g_test_add (DOMAIN"/SharedModel", Fixture, 0,54 g_test_add (DOMAIN"/SharedModel", Fixture, 0,
51 shared_model_setup, test_model_persistence, shared_model_teardown);55 shared_model_setup, test_model_persistence, shared_model_teardown);
52}56}
5357
54static void58static void
@@ -192,3 +196,27 @@
192196
193 dee_assert_cmpmodel (fix->orig, fix->copy);197 dee_assert_cmpmodel (fix->orig, fix->copy);
194}198}
199
200static void
201test_resource_manager_default (Fixture *fix, gconstpointer data)
202{
203 DeeResourceManager *manager;
204 GError *error;
205 GObject *result;
206 gchar *primary_path;
207
208 error = NULL;
209
210 manager = dee_resource_manager_get_default ();
211 g_object_get (manager, "primary-path", &primary_path, NULL);
212 g_assert (g_str_has_suffix (primary_path, "resources"));
213 g_free (primary_path);
214
215 result = dee_resource_manager_load (manager,
216 "com.this.hopefully.doesnt.exist.com",
217 &error);
218 g_assert (result == NULL);
219 /* loading non-existing resource just returns NULL, doesn't throw error */
220 g_assert_no_error (error);
221}
222
195223
=== modified file 'vapi/dee-1.0.vapi'
--- vapi/dee-1.0.vapi 2013-04-10 14:30:44 +0000
+++ vapi/dee-1.0.vapi 2013-09-16 18:51:54 +0000
@@ -212,11 +212,13 @@
212 public interface Model : GLib.Object {212 public interface Model : GLib.Object {
213 public unowned Dee.ModelIter append (...);213 public unowned Dee.ModelIter append (...);
214 public abstract unowned Dee.ModelIter append_row ([CCode (array_length = false, array_null_terminated = true)] GLib.Variant[] row_members);214 public abstract unowned Dee.ModelIter append_row ([CCode (array_length = false, array_null_terminated = true)] GLib.Variant[] row_members);
215 public abstract void begin_changeset ();
215 [CCode (array_length_pos = 1.33333, array_length_type = "guint", cname = "dee_model_build_named_row_sunk")]216 [CCode (array_length_pos = 1.33333, array_length_type = "guint", cname = "dee_model_build_named_row_sunk")]
216 public GLib.Variant[] build_named_row ([CCode (array_length = false)] GLib.Variant[]? out_row_members, string first_column_name, ...);217 public GLib.Variant[] build_named_row ([CCode (array_length = false)] GLib.Variant[]? out_row_members, string first_column_name, ...);
217 [CCode (array_length_pos = 1.33333, array_length_type = "guint", cname = "dee_model_build_named_row_sunk")]218 [CCode (array_length_pos = 1.33333, array_length_type = "guint", cname = "dee_model_build_named_row_sunk")]
218 public unowned GLib.Variant[] build_named_row_static ([CCode (array_length = false)] GLib.Variant[] out_row_members, string first_column_name, ...);219 public unowned GLib.Variant[] build_named_row_static ([CCode (array_length = false)] GLib.Variant[] out_row_members, string first_column_name, ...);
219 public abstract void clear ();220 public abstract void clear ();
221 public abstract void end_changeset ();
220 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);222 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);
221 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);223 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);
222 public unowned Dee.ModelIter find_sorted ([CCode (delegate_target_pos = 1.5)] Dee.CompareRowFunc cmp_func, out bool out_was_found, ...);224 public unowned Dee.ModelIter find_sorted ([CCode (delegate_target_pos = 1.5)] Dee.CompareRowFunc cmp_func, out bool out_was_found, ...);
@@ -271,6 +273,8 @@
271 public void set_schema (...);273 public void set_schema (...);
272 public abstract void set_schema_full ([CCode (array_length_cname = "num_columns", array_length_pos = 1.1, array_length_type = "guint", array_null_terminated = true)] string[] column_schemas);274 public abstract void set_schema_full ([CCode (array_length_cname = "num_columns", array_length_pos = 1.1, array_length_type = "guint", array_null_terminated = true)] string[] column_schemas);
273 public abstract void set_value (Dee.ModelIter iter, uint column, GLib.Variant value);275 public abstract void set_value (Dee.ModelIter iter, uint column, GLib.Variant value);
276 public virtual signal void changeset_finished ();
277 public virtual signal void changeset_started ();
274 public virtual signal void row_added (Dee.ModelIter iter);278 public virtual signal void row_added (Dee.ModelIter iter);
275 public virtual signal void row_changed (Dee.ModelIter iter);279 public virtual signal void row_changed (Dee.ModelIter iter);
276 public virtual signal void row_removed (Dee.ModelIter iter);280 public virtual signal void row_removed (Dee.ModelIter iter);

Subscribers

People subscribed via source and target branches

to all changes: