diff --git a/WINGs/Tests/wtest.c b/WINGs/Tests/wtest.c index 5b283af9..f4381aa3 100644 --- a/WINGs/Tests/wtest.c +++ b/WINGs/Tests/wtest.c @@ -115,6 +115,40 @@ testFrame(WMScreen *scr) } +void +testBox(WMScreen *scr) +{ + WMWindow *win; + WMBox *box; + WMButton *btn; + int i; + + windowCount++; + + win = WMCreateWindow(scr, "testBox"); + WMSetWindowTitle(win, "Box"); + WMSetWindowCloseAction(win, closeAction, NULL); + WMResizeWidget(win, 400, 300); + + box = WMCreateBox(win); + WMMoveWidget(box, 50, 50); + WMResizeWidget(box, 300, 200); +// WMSetBoxHorizontal(box, True); + for (i = 0; i < 4; i++) { + btn = WMCreateCommandButton(box); + WMSetButtonText(btn, "bla"); + WMMapWidget(btn); + WMAddBoxSubview(box, WMWidgetView(btn), i&1, True, 20, 0, 5); + } + + WMRealizeWidget(win); + WMMapSubwidgets(win); + WMMapWidget(win); + +} + + + static void singleClick(WMWidget *self, void *data) { @@ -1204,9 +1238,12 @@ main(int argc, char **argv) * Put the testSomething() function you want to test here. */ + testBox(scr); +#if 0 testList(scr); -#if 0 + testProgressIndicator(scr); + testColorWell(scr); testTextField(scr); @@ -1217,7 +1254,6 @@ main(int argc, char **argv) testFontPanel(scr); testScrollView(scr); - testButton(scr); testFrame(scr); @@ -1230,7 +1266,6 @@ main(int argc, char **argv) testSplitView(scr); testGradientButtons(scr); - testProgressIndicator(scr); testOpenFilePanel(scr); diff --git a/WINGs/WINGs.h b/WINGs/WINGs.h index 3bc6b13d..335c3fed 100644 --- a/WINGs/WINGs.h +++ b/WINGs/WINGs.h @@ -284,7 +284,8 @@ enum { WC_ProgressIndicator = 15, WC_MenuView = 16, WC_Ruler = 17, - WC_Text = 18 + WC_Text = 18, + WC_Box = 19 }; /* All widgets must start with the following structure @@ -330,6 +331,7 @@ typedef struct W_SplitView WMSplitView; typedef struct W_TabView WMTabView; typedef struct W_Ruler WMRuler; typedef struct W_Text WMText; +typedef struct W_Box WMBox; /* not widgets */ @@ -1634,6 +1636,18 @@ WMView *WMGetTabViewItemView(WMTabViewItem *item); void WMDestroyTabViewItem(WMTabViewItem *item); + +/* ....................................................................... */ + +WMBox *WMCreateBox(WMWidget *parent); + +void WMSetBoxBorderWidth(WMBox *box, unsigned width); + +void WMAddBoxSubview(WMBox *bPtr, WMView *view, Bool expand, Bool fill, + int minSize, int maxSize, int space); + +void WMSetBoxHorizontal(WMBox *box, Bool flag); + /* ....................................................................... */ int WMRunAlertPanel(WMScreen *app, WMWindow *owner, char *title, char *msg, diff --git a/WINGs/wbox.c b/WINGs/wbox.c new file mode 100644 index 00000000..f3e4262a --- /dev/null +++ b/WINGs/wbox.c @@ -0,0 +1,198 @@ + + +#include "WINGsP.h" + + +typedef struct { + WMView *view; + int minSize; + int maxSize; + int space; + unsigned expand:1; + unsigned fill:1; +} SubviewItem; + + +typedef struct W_Box { + W_Class widgetClass; + W_View *view; + + SubviewItem *subviews; + int subviewCount; + + short borderWidth; + + unsigned horizontal:1; +} Box; + + +#define DEFAULT_WIDTH 40 +#define DEFAULT_HEIGHT 40 + + +static void destroyBox(Box *bPtr); + +static void handleEvents(XEvent *event, void *data); + +static void didResize(struct W_ViewDelegate*, WMView*); + +static W_ViewDelegate delegate = { + NULL, + NULL, + didResize, + NULL, + NULL +}; + + + +WMBox* +WMCreateBox(WMWidget *parent) +{ + Box *bPtr; + + bPtr = wmalloc(sizeof(Box)); + memset(bPtr, 0, sizeof(Box)); + + bPtr->widgetClass = WC_Box; + + bPtr->view = W_CreateView(W_VIEW(parent)); + if (!bPtr->view) { + wfree(bPtr); + return NULL; + } + bPtr->view->self = bPtr; + + bPtr->view->delegate = &delegate; + + WMCreateEventHandler(bPtr->view, StructureNotifyMask, + handleEvents, bPtr); + + WMResizeWidget(bPtr, DEFAULT_WIDTH, DEFAULT_HEIGHT); + + bPtr->subviews = NULL; + bPtr->subviewCount = 0; + + return bPtr; +} + + +static void +rearrange(WMBox *box) +{ + int i; + int x, y; + int w, h; + int total; + int expands = 0; + + x = box->borderWidth; + y = box->borderWidth; + if (box->horizontal) { + h = WMWidgetHeight(box) - 2 * box->borderWidth; + total = WMWidgetWidth(box) - 2 * box->borderWidth; + } else { + w = WMWidgetWidth(box) - 2 * box->borderWidth; + total = WMWidgetHeight(box) - 2 * box->borderWidth; + } + + + for (i = 0; i < box->subviewCount; i++) { + total -= box->subviews[i].minSize; + total -= box->subviews[i].space; + if (box->subviews[i].expand) { + expands++; + } + } + + for (i = 0; i < box->subviewCount; i++) { + if (box->horizontal) { + w = box->subviews[i].minSize; + if (box->subviews[i].expand) + w += total/expands; + } else { + h = box->subviews[i].minSize; + if (box->subviews[i].expand) + h += total/expands; + } + W_ResizeView(box->subviews[i].view, w, h); + W_MoveView(box->subviews[i].view, x, y); + if (box->horizontal) { + x += w + box->subviews[i].space; + } else { + y += h + box->subviews[i].space; + } + } +} + + +void +WMSetBoxBorderWidth(WMBox *box, unsigned width) +{ + box->borderWidth = width; + + rearrange(box); +} + + +void +WMAddBoxSubview(WMBox *bPtr, WMView *view, Bool expand, Bool fill, + int minSize, int maxSize, int space) +{ + int i = bPtr->subviewCount; + + bPtr->subviewCount++; + if (!bPtr->subviews) + bPtr->subviews = wmalloc(sizeof(SubviewItem)); + else + bPtr->subviews = wrealloc(bPtr->subviews, + bPtr->subviewCount*sizeof(SubviewItem)); + bPtr->subviews[i].view = view; + bPtr->subviews[i].minSize = minSize; + bPtr->subviews[i].maxSize = maxSize; + bPtr->subviews[i].expand = expand; + bPtr->subviews[i].fill = fill; + bPtr->subviews[i].space = space; + + rearrange(bPtr); +} + + +void +WMSetBoxHorizontal(WMBox *box, Bool flag) +{ + box->horizontal = flag; + rearrange(box); +} + + +static void +destroyBox(Box *bPtr) +{ + wfree(bPtr); +} + + +static void +didResize(struct W_ViewDelegate *delegate, WMView *view) +{ + rearrange(view->self); +} + +static void +handleEvents(XEvent *event, void *data) +{ + Box *bPtr = (Box*)data; + + CHECK_CLASS(data, WC_Box); + + switch (event->type) { + case DestroyNotify: + destroyBox(bPtr); + break; + + case ConfigureNotify: + rearrange(bPtr); + break; + } +}