summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2015-04-01 15:33:44 +0000
committerMatthias Melcher <fltk@matthiasm.com>2015-04-01 15:33:44 +0000
commit61a7bf60f92c59092728fdbe6e9a08572a687ac5 (patch)
tree6aeb494721a420795619f950c4a9c3610cc685ca
parentd44b518c070b9b92f7aefca7e7a66c0b67366b62 (diff)
Finally fixed the order of arrow and icon in the Type browser in Fluid.
Boy, this has been bothering me since the early eighties (or whenever I checked that in first). Sorry that it took me a little while. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@10657 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
-rw-r--r--fluid/Fl_Type.cxx86
1 files changed, 73 insertions, 13 deletions
diff --git a/fluid/Fl_Type.cxx b/fluid/Fl_Type.cxx
index 84d61e10b..cc55a1a65 100644
--- a/fluid/Fl_Type.cxx
+++ b/fluid/Fl_Type.cxx
@@ -253,9 +253,41 @@ const char* Fl_Type::title() {
extern const char* subclassname(Fl_Type*);
+
+/**
+ Draw an item in the widget browser.
+
+ A browser line starts with a variable size space. This space directly
+ relates to the level of the type entry.
+
+ If this type has the ability to store children, a triangle follows, pointing
+ right (closed) or pointing down (open, children shown)
+
+ Next follows an Icon that is specific to the type. This makes it easy to
+ spot certain types
+
+ Now follows some text. For classes and widgets, this is the type itself,
+ followed by the name of the object. Other objects show their content as
+ text, possibly abbreviated with an elipsis.
+
+ \param v v is a pointer to the actual widget type and can be cast safely
+ to Fl_Type
+ \param X, Y these give the position in window coordinates of the top left
+ corner of this line
+ */
void Widget_Browser::item_draw(void *v, int X, int Y, int, int) const {
+ // cast to a more general type
Fl_Type *l = (Fl_Type *)v;
- X += 3 + 18 + l->level * 12;
+
+ // calculate the horizontal start position of this item
+ // 3 is the edge of the browser
+ // 13 is the width of the arrow that indicates children for the item
+ // 18 is the width of the icon
+ // 12 is the indent per level
+ X += 3 + 13 + 18 + l->level * 12;
+
+ // items can contain a comment. If they do, the comment gets a second text
+ // line inside this browser line
int comment_incr = 0;
if (show_comments && l->comment()) {
char buf[82], *d = buf;
@@ -270,34 +302,48 @@ void Widget_Browser::item_draw(void *v, int X, int Y, int, int) const {
if (l->new_selected) fl_color(fl_contrast(FL_DARK_GREEN,FL_SELECTION_COLOR));
else fl_color(fl_contrast(FL_DARK_GREEN,color()));
fl_font(textfont()+FL_ITALIC, textsize()-2);
- fl_draw(buf, (l->is_parent())?X+12:X, Y+12);
+ fl_draw(buf, X, Y+12);
Y += comment_incr/2;
comment_incr -= comment_incr/2;
}
+
if (l->new_selected) fl_color(fl_contrast(FL_FOREGROUND_COLOR,FL_SELECTION_COLOR));
else fl_color(FL_FOREGROUND_COLOR);
- Fl_Pixmap *pm = pixmap[l->pixmapID()];
- if (pm) pm->draw(X-18, Y);
- switch (l->is_public()) {
- case 0: lock_pixmap.draw(X - 17, Y); break;
- case 2: protected_pixmap.draw(X - 17, Y); break;
- }
+
+ // Width=10: Draw the triangle that indicate possible children
if (l->is_parent()) {
+ X = X - 18 - 13;
if (!l->next || l->next->level <= l->level) {
if (l->open_!=(l==pushedtitle)) {
+ // an outlined triangle to the right indicates closed item, no children
fl_loop(X,Y+7,X+5,Y+12,X+10,Y+7);
} else {
+ // an outlined triangle to the bottom indicates open item, no children
fl_loop(X+2,Y+2,X+7,Y+7,X+2,Y+12);
}
} else {
if (l->open_!=(l==pushedtitle)) {
+ // afilled triangle to the right indicates closed item, with children
fl_polygon(X,Y+7,X+5,Y+12,X+10,Y+7);
} else {
+ // a filled triangle to the bottom indicates open item, with children
fl_polygon(X+2,Y+2,X+7,Y+7,X+2,Y+12);
}
}
- X += 10;
+ X = X + 13 + 18;
}
+
+ // Width=18: Draw the icon associated with the type.
+ Fl_Pixmap *pm = pixmap[l->pixmapID()];
+ if (pm) pm->draw(X-18, Y);
+
+ // Add tags on top of the icon for locked and protected types.
+ switch (l->is_public()) {
+ case 0: lock_pixmap.draw(X - 17, Y); break;
+ case 2: protected_pixmap.draw(X - 17, Y); break;
+ }
+
+ // Indent=12 per level: Now write the text that comes after the graphics representation
Y += comment_incr;
if (l->is_widget() || l->is_class()) {
const char* c = subclassname(l);
@@ -344,8 +390,7 @@ int Widget_Browser::item_width(void *v) const {
if (!l->visible) return 0;
- int W = 3 + 16 + 18 + l->level*10;
- if (l->is_parent()) W += 10;
+ int W = 3 + 13 + 18 + l->level * 12;
if (l->is_widget() || l->is_class()) {
const char* c = l->type_name();
@@ -392,6 +437,21 @@ void Widget_Browser::callback() {
selection_changed((Fl_Type*)selection());
}
+
+/**
+ Override the event handling fo rthis browser.
+
+ The vertical mouse position corresponds to an entry in the Type tree.
+ The horizontal position has the following hot zones:
+ * 0-3 is the windget frame and ignored
+ * the next hot zone starts 12*indent pixels further to the right
+ * the next 13 pixels refer to the arrow that indicates children for the item
+ * 18 pixels follow for the icon
+ * the remianing part is filled with text
+
+ \param e the incoming event type
+ \return 0 if the event is not supported, and 1 if the event was "used up"
+ */
int Widget_Browser::handle(int e) {
static Fl_Type *title;
Fl_Type *l;
@@ -401,7 +461,7 @@ int Widget_Browser::handle(int e) {
if (!Fl::event_inside(X,Y,W,H)) break;
l = (Fl_Type*)find_item(Fl::event_y());
if (l) {
- X += 12*l->level + 18 - hposition();
+ X += 3 + 12*l->level - hposition();
if (l->is_parent() && Fl::event_x()>X && Fl::event_x()<X+13) {
title = pushedtitle = l;
redraw_line(l);
@@ -413,7 +473,7 @@ int Widget_Browser::handle(int e) {
if (!title) break;
l = (Fl_Type*)find_item(Fl::event_y());
if (l) {
- X += 12*l->level + 18 - hposition();
+ X += 3 + 12*l->level - hposition();
if (l->is_parent() && Fl::event_x()>X && Fl::event_x()<X+13) ;
else l = 0;
}