]> Dogcows Code - chaz/tint2/blobdiff - src/util/area.c
sample-task-align.patch, src-task-align.patch
[chaz/tint2] / src / util / area.c
index 9b70b1210f54d44c8e43fe3d739ce4b5f91707ee..f6e1a1bdefd54ba400de1a27237595d9482e3ddc 100644 (file)
@@ -2,7 +2,7 @@
 *
 * Tint2 : area
 *
-* Copyright (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr)
+* Copyright (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr) from Omega distribution
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version 2
@@ -96,9 +96,9 @@ void init_rendering(void *obj, int pos)
 void rendering(void *obj)
 {
        Panel *panel = (Panel*)obj;
-       
+
        size_by_content(&panel->area);
-       size_by_layout(&panel->area, 0, 0);
+       size_by_layout(&panel->area, 0, 1);
        
        refresh(&panel->area);
 }
@@ -130,6 +130,54 @@ void size_by_content (Area *a)
 }
 
 
+// calculate total size of all children including
+// parent's padding
+int children_size(Area *a, int horizontal)
+{
+       int size = 0;
+       GSList *l;
+
+       for (l = a->list; l; l = l->next) {
+               Area *child = ((Area*)l->data);
+               if (!child->on_screen) continue;
+
+               if (horizontal)
+                       size += child->width + a->paddingx;
+               else
+                       size += child->height + a->paddingy;
+       }
+
+       return size;
+}
+
+
+// calculate chilren's align offset depending on the align type
+int align_offset(Area *a, int align, int horizontal)
+{
+       int size = 0;
+       int child_size = children_size(a, horizontal);
+
+       if (horizontal)
+               size = a->width;
+       else
+               size = a->height;
+
+       switch (align) {
+       case ALIGN_LEFT:
+               return 0;
+
+       case ALIGN_CENTER:
+               return (size - child_size) / 2;
+
+       case ALIGN_RIGHT:
+               return size - child_size;
+
+       default:
+               return 0;
+       }
+}
+
+
 void size_by_layout (Area *a, int pos, int level)
 {
        // don't resize hiden objects
@@ -175,8 +223,13 @@ void size_by_layout (Area *a, int pos, int level)
                        }
                }
                
-               //printf("level %d, object %d, pos %d\n", level, i, pos);
-               size_by_layout(child, pos, level+1);
+               /*// position of each visible object
+               int k;
+               for (k=0 ; k < level ; k++) printf("  ");
+               printf("tree level %d, object %d, pos %d, %s\n", level, i, pos, (child->size_mode == SIZE_BY_LAYOUT) ? "SIZE_BY_LAYOUT" : "SIZE_BY_CONTENT");*/
+
+               int offset = align_offset(child, panel_config.g_task.align, panel_horizontal);
+               size_by_layout(child, pos + offset, level + 1);
                
                if (panel_horizontal)
                        pos += child->width + a->paddingx;
@@ -239,9 +292,9 @@ int resize_by_layout(void *obj, int maximum_size)
                        if (child->on_screen && child->size_mode == SIZE_BY_LAYOUT)
                                nb_by_layout++;
                }
+               //printf("  resize_by_layout Deb %d, %d\n", nb_by_content, nb_by_layout);
                if (nb_by_content+nb_by_layout)
                        size -= ((nb_by_content+nb_by_layout-1) * a->paddingx);
-               //printf("resize_panel : size_panel %d, size_layout %d\n", panel->area.width, size);
 
                int width=0, modulo=0, old_width;
                if (nb_by_layout) {
@@ -441,7 +494,7 @@ void add_area (Area *a)
 {
        Area *parent = (Area*)a->parent;
 
-       parent->list = g_slist_remove(parent->list, a);
+       parent->list = g_slist_append(parent->list, a);
        set_redraw (parent);
 
 }
This page took 0.023126 seconds and 4 git commands to generate.