#include <stdlib.h>
#include <string.h>
-#include "grid.h"
#include "newt.h"
#include "newt_pr.h"
newtGrid grid;
newtComponent co;
} u;
+ int padLeft, padTop, padRight, padBottom;
+ int anchor;
+ int flags;
};
struct grid_s {
}
void newtGridSetField(newtGrid grid, int col, int row,
- enum newtGridElement type, void * val) {
+ enum newtGridElement type, void * val, int padLeft,
+ int padTop, int padRight, int padBottom, int anchor,
+ int flags) {
struct gridField * field = &grid->fields[col][row];
if (field->type == NEWT_GRID_SUBGRID)
field->type = type;
field->u.co = (void *) val;
+ field->padLeft = padLeft;
+ field->padRight = padRight;
+ field->padTop = padTop;
+ field->padBottom = padBottom;
+ field->anchor = anchor;
+
grid->width = grid->height = -1;
}
int row, col;
int i, j;
int minWidth, minHeight;
- int colSpacing;
int * widths, * heights;
int thisLeft, thisTop;
+ int x, y, remx, remy;
widths = alloca(sizeof(*widths) * grid->cols);
memset(widths, 0, sizeof(*widths) * grid->cols);
j = field->u.co->width;
}
+ j += field->padLeft + field->padRight;
+
i += j;
if (j > widths[col]) widths[col] = j;
}
j = field->u.co->height;
}
+ j += field->padTop + field->padBottom;
+
i += j;
if (j > heights[col]) heights[col] = j;
}
if (i > minHeight) minHeight = i;
}
- if (grid->width == -1) {
- colSpacing = 1;
- } else {
- colSpacing = (grid->width - minWidth) / (grid->cols - 1);
- }
- minWidth += colSpacing * (grid->cols - 1);
-
- if (minWidth < grid->width) grid->width = minWidth; /* ack! */
- if (minHeight < grid->height) grid->height = minHeight; /* ditto! */
+ /* this catches the -1 case */
+ if (grid->width < minWidth) grid->width = minWidth; /* ack! */
+ if (grid->height < minHeight) grid->height = minHeight; /* ditto! */
if (!set) return;
thisLeft = left;
for (col = 0; col < grid->cols; col++) {
field = &grid->fields[col][row];
+
+ x = thisLeft + field->padLeft;
+ remx = widths[col] - field->padLeft - field->padRight;
+ y = thisTop + field->padTop;
+ remy = heights[col] - field->padTop - field->padBottom;
+
if (field->type == NEWT_GRID_SUBGRID) {
- shuffleGrid(field->u.grid, thisLeft, thisTop, 1);
+ remx -= field->u.grid->width;
+ remy -= field->u.grid->height;
} else {
- field->u.co->top = thisTop;
- field->u.co->left = thisLeft;
+ remx -= field->u.co->width;
+ remy -= field->u.co->height;
+ }
+
+ if (field->anchor & NEWT_ANCHOR_RIGHT)
+ x += remx;
+ else if (!(field->anchor & NEWT_ANCHOR_LEFT))
+ x += (remx / 2);
+
+ if (field->anchor & NEWT_ANCHOR_BOTTOM)
+ y += remx;
+ else if (!(field->anchor & NEWT_ANCHOR_TOP))
+ y += (remy / 2);
+
+
+ if (field->type == NEWT_GRID_SUBGRID) {
+ shuffleGrid(field->u.grid, x, y, 1);
+ } else {
+ field->u.co->left = x;
+ field->u.co->top = y;
if (field->u.co->ops->place)
field->u.co->ops->place(field->u.co);
}
- thisLeft += widths[col] + colSpacing;
+ thisLeft += widths[col];
}
thisTop += heights[row];
void newtGridPlace(newtGrid grid, int left, int top) {
grid->width = grid->height = -1;
-
shuffleGrid(grid, left, top, 1);
}