RE: 2.4 features - Indenting container
- From: Owen Taylor <otaylor redhat com>
 
- To: Murray Cumming Comneon com
 
- Cc: gtk-devel-list gnome org, merchan baton phys lsu edu
 
- Subject: RE: 2.4 features - Indenting container
 
- Date: 09 Apr 2003 11:26:42 -0400
 
On Wed, 2003-04-09 at 05:41, Murray Cumming Comneon com wrote:
> > From: Owen Taylor [mailto:otaylor redhat com] 
> > On Thu, 2003-03-13 at 10:35, Murray Cumming Comneon com wrote:
> > > So, can we agree that a version of Gregory's patch that does 4-sided
> > > (independent) padding could go into 2.4?
> > > 
> > http://mail.gnome.org/archives/gtk-devel-list/2002-December/msg00090.html
> 
> > Well, I don't think it would actually share any _code_ with
> > that patch ... nothing wrong with that patch, but once you go with
> > 4-sided padding instead of 1-sided padding just about everything
> > changes. 
> >
> > But yes, I'd be in favor of a 4-sided padding addition to GtkAlignment.
> 
> OK. I have adapted that patch for 4 sides:
> http://bugzilla.gnome.org/show_bug.cgi?id=110365
> 
> It does share some code with Gregory's patch because I don't have much clue
> about this requisition/allocation stuff, so I welcome criticism.
> 
> Also, it should be changed to use the private-data stuff. I believe that
> this is not yet in cvs. Is there a bug number for it so I can make this one
> depend on it?
It's in CVS; all you'd need to do is up GLIB_REQUIRED_VERSION in
gtk+/configure.in.
> Also, this patch adds examples/alignment_padding, which exercises the
> new functionality.
examples/ are stuff auto-extracted from the tutorial, and shouldn't
be touched in general. The two choices are:
 - Write an example with straightforward code that is helpful
   to application writers and put it in gtk-demo.
 - Write a test case that exhaustively tests your additions and
   put it in testgtk. (The prop-editor stuff there, as used by
   the entry example may make this easier.)
Review comments:
* I was a little suprised by the C API
void       gtk_alignment_set_padding (GtkAlignment      *alignment,
			              GtkPositionType    pad_pos,
				      guint              padding);
guint       gtk_alignment_get_padding (GtkAlignment      *alignment,
				       GtkPositionType    pad_pos);
  I would have expected functions that get/set all four parameters 
  at once; similar to the way gtk_misc_set/get_padding
  work. I don't think the above is _bad_; it might even be
  a nicer API. But there is something to be said for consistency.
  I'd be interested to hear other people's thoughts on this.
* Don't editorialize in comments:
+  /* The Padding could almost be in a separate widget, but it's loosely related to alignment. */
  We're doing it this way, so it's the right way to do it :-)
* You have name=padding_top, nick="Top padding" - this is going to 
  confuse people ... I don't think there is any other place in
  GTK+ like this. I'd suggest name="top_padding", nick="Top Padding".
  (Note capitalization as well)
* Spelling:
+  /* Intialize padding with default values: */
  But also, really, what does that comment add?
* I know it's a matter of opinion, but I think some of the other
  comments are of pretty dubious value:
+    /* Padding. Call gtk_alignment_set_padding() with the appropriate GTK_POS_* value: */
+    /* Padding. Call gtk_alignment_get_padding() with the appropriate GTK_POS_* value: */
+  /* Set the appropriate struct field, depending on the padding position: */
+  /* Get the appropriate struct field, depending on the padding position: */
  If the code itself is transparent:
+    case PROP_PADDING_TOP:
+      gtk_alignment_set_padding (alignment, GTK_POS_TOP, g_value_get_uint (value));
  Then adding a comment just means more code to read.
* To answer your question:
===      
+
+      /* TODO: Rename x and y to border_x and border_y? murrayc */
* For the allocation code:
===
  I think it would do more for the clarity of the code to remove
  x/y and replace them with a border_width variable, since 
  x == y == border_width.
  Which would make the comment:
=========
+      /* 2*x because there are 2 borders - 1 on each side: */
+      width = MAX (allocation->width - padding_horizontal - 2 * x, 0);
+      height = MAX (allocation->height - padding_vertical - 2 * y, 0);
=========
  probably unnecessary.
* You have a common bug in your size computation:
+  guint padding_horizontal, padding_vertical;
+      width = MAX (allocation->width - padding_horizontal - 2 * x, 0);
+      height = MAX (allocation->height - padding_vertical - 2 * y, 0);
  allocation->width - padding_horizontal - 2 * x will be unsigned, 
  so the MAX (, 0) does nothing. You already aren't worrying about
  overflow for padding_left + padding_right, so we are saying "pass
  in ridiculous values, get what you deserve", I'd just make 
  padding_horizontal/padding_vertical signed. In fact, I might make
  the padding values signed everywhere ... generally we've switched
  to using signed dimensions in GTK+ to avoid these problems with
  promotion.
  (If you have a signed value, you can also catch a not-unlikely
  programming problem with:
    g_return_if_fail (top_padding < 0)
  rather than computing ridiculous sizes, and having the program
  die probably with a BadAlloc X error somewhere down the line.)
* Note the ;; at the end of:
==== 
-      child_allocation.x = alignment->xalign * (width - child_allocation.width) + allocation->x + x;
-      child_allocation.y = alignment->yalign * (height - child_allocation.height) + allocation->y + y;
+      child_allocation.x = alignment->xalign * (width - child_allocation.width) + allocation->x + x + alignment->padding_left;
+      child_allocation.y = alignment->yalign * (height - child_allocation.height) + allocation->y + y + alignment->padding_top;;
====
* In gtk_alignment_set_padding(), you have a
  g_object_freeze_notify/thaw_notify pair, which is only 
  needed if you are notifying multiple values. (But see
  my above comment about possible API changes.)
  And also, you don't actually notify the _single_ value
  you do set.
* In get_padding, you have:
+    return alignment->padding_top;
+    break;
   Etc. We would typically omit the useless break; in this case.
* There are some extra blank lines introduced in the header.
Regards,
                                               Owen
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]