Re: [sigc] conditions in libsigc



On Thursday 06 July 2006 21:07, Paul Pogonyshev wrote:
> Chris Vine wrote:
> > There are a few minor points of implementation about the code which are
> > not a criticism (your code was just to convey the idea) - Glib::RefPtr is
> > not used correctly
>
> Why (though it is not important for conditions)?

Glib::RefPtr is designed to reference objects derived from GObject (sorry, I 
can't remember their glibmm class designation, probably Glib::Object) but not 
from GtkObject (Gtk::Object).  Classes derived from Gtk::Object are owned by 
the container in which they are placed, if you provide they are to be managed 
(as you did).  If you assign them to a Glib::RefPtr you will need to 
increment the reference count when doing so in order to pass ownership to the 
Glib::RefPtr smart pointer.  If you don't have them as managed objects, you 
don't need to increment the reference count (but you may have to call 
gtk_object_sink() on them to eliminate the floating reference - I am not sure 
whether you need to do this in gtkmm because I either use the raw C objects 
or, with gtkmm, have them managed by the container).

> > and conjuction::update(condition, condition) calls a non-existent
> > method (conjunction::set_state()),
>
> This method is defined in `condition_impl' and `conjunction' inherits that
> class.  So it is not non-existent.

Yes I missed that.

> > but the intention is clear enough and the
> > absent conjuction::set_state() method was probably just a result of a
> > cut-and-paste - I can see what it would do.
> >
> > However, your code does the updating of the Gtk::Button twice, which
> > illustrates what would have been my point.
>
> No, it doesn't.  Maybe I should have used different variables, but one
> window's button is only condition-driven, while the other's is
> `traditional'. You can make sure by deleting the second window from the
> code.  Only conditions are left and the first button is still working.

OK, I see - I was misled by the fact that you had the window pointer as a 
class member, when it is only local to the constructor and used twice (and 
the same with the other members, other than the pointer to the Gtk::Button 
object).  I had missed on reading through the code that you had done 
everything twice with two equivalent windows implemented in the two different 
ways.

> > It does it once via
> > Windows::controller (a SensitivityController object) employing the
> > condition object approach which you propose.  It does it again the
> > "normal" gtkmm/libsigc++ way, via the following lines in
> > Windows::Windows():
> >
> >   entry->signal_changed ().connect (sigc::mem_fun (*this,
> >                              &Windows::update_sensitivity));
> >   check_button->signal_toggled ().connect (sigc::mem_fun (*this,
> >                              &Windows::update_sensitivity));
> >
> > The Windows::update_sensitivity() slot just does this:
> >
> >   button->set_sensitive (entry->get_text_length () > 0 &&
> >                          check_button->get_active ());
>
> As I mentioned above, different methods of sensivity controlling are
> applied to different buttons in different windows.
>
> > This slot tests and employs the state information retained by the gtkmm
> > object, rather than by the SensitivityController object.  In other words,
> > all your code for condition objects can be replaced by these lines of
> > "traditional" code.
>
> I'm not sure I understand you, but will try to answer.  Yes, conditions are
> nothing new.  They are merely wrappings around currently possible code,
> which make life easier.  More code is moved to the libraries and less is
> left for you to write.  Instead of writing new callback, connecting it and
> maybe setting the initial state you are done with combining standard
> conditions and creating Gtk::SensibilityController (or calling
> Gtk::Widget::set_sensitive (sigc::condition) if that is implemented.)
>
> > In its place, to implement the condition feature it is
> > necessary to write implementation classes for each condition on a
> > case-by-case basis (in this case, the ToggleButtonActiveCondition and
> > EntryNotEmptyCondition classes).
>
> Yes, but this should be done in the library.  All this classes should
> belong to Gtkmm and you don't write them yourselves.  Tracking sensitivity
> or visibility is a common task and any non-trivial application does that. 
> Why not transfer this common task to the GUI library (Gtkmm)?
>
> > I do therefore wonder if it is worth it.
>
> Not really if they are not implemented in the libraries, because then
> implementing conditions costs more than they save.  If, however, conditions
> are implemented in the libraries, I'm sure it is worth it, saves coding for
> library users and makes error probability smaller.

My comments assumed it was implemented in the library.  The choice is between 
three lines of code and, as I said and you agree, writing implementation 
classes for each condition derived from condition_impl.

> > Your approach is also rather inflexible - it can only synthesise from two
> > states.
>
> Yes, conditions cannot solve all problems.  If you need some advanced
> checking, you should use traditional scheme, which doesn't go away. 
> However, I'm sure that 75% of appropriate tasks are solvable with
> `standard' conditions.

With a certain sense of deja vu, this would be relevant to gtkmm rather than 
the libsigc++ library (yes, I know you want the substructure in libsigc++, 
but I am talking about the condition implementation classes here, which is 
what is relevant to any "standard" conditions you propose).  Furthermore, in 
my opinion (I accept not in yours) I doubt that there are sufficient 
synthesised conditions not already in gtkmm which are suitable as a standard.

Chris




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]