mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-30 10:22:34 +01:00
added box widget
This commit is contained in:
@@ -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
|
static void
|
||||||
singleClick(WMWidget *self, void *data)
|
singleClick(WMWidget *self, void *data)
|
||||||
{
|
{
|
||||||
@@ -1204,9 +1238,12 @@ main(int argc, char **argv)
|
|||||||
* Put the testSomething() function you want to test here.
|
* Put the testSomething() function you want to test here.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
testBox(scr);
|
||||||
|
#if 0
|
||||||
testList(scr);
|
testList(scr);
|
||||||
|
|
||||||
#if 0
|
testProgressIndicator(scr);
|
||||||
|
|
||||||
testColorWell(scr);
|
testColorWell(scr);
|
||||||
|
|
||||||
testTextField(scr);
|
testTextField(scr);
|
||||||
@@ -1217,7 +1254,6 @@ main(int argc, char **argv)
|
|||||||
testFontPanel(scr);
|
testFontPanel(scr);
|
||||||
|
|
||||||
testScrollView(scr);
|
testScrollView(scr);
|
||||||
|
|
||||||
testButton(scr);
|
testButton(scr);
|
||||||
|
|
||||||
testFrame(scr);
|
testFrame(scr);
|
||||||
@@ -1230,7 +1266,6 @@ main(int argc, char **argv)
|
|||||||
testSplitView(scr);
|
testSplitView(scr);
|
||||||
|
|
||||||
testGradientButtons(scr);
|
testGradientButtons(scr);
|
||||||
testProgressIndicator(scr);
|
|
||||||
|
|
||||||
|
|
||||||
testOpenFilePanel(scr);
|
testOpenFilePanel(scr);
|
||||||
|
|||||||
@@ -284,7 +284,8 @@ enum {
|
|||||||
WC_ProgressIndicator = 15,
|
WC_ProgressIndicator = 15,
|
||||||
WC_MenuView = 16,
|
WC_MenuView = 16,
|
||||||
WC_Ruler = 17,
|
WC_Ruler = 17,
|
||||||
WC_Text = 18
|
WC_Text = 18,
|
||||||
|
WC_Box = 19
|
||||||
};
|
};
|
||||||
|
|
||||||
/* All widgets must start with the following structure
|
/* 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_TabView WMTabView;
|
||||||
typedef struct W_Ruler WMRuler;
|
typedef struct W_Ruler WMRuler;
|
||||||
typedef struct W_Text WMText;
|
typedef struct W_Text WMText;
|
||||||
|
typedef struct W_Box WMBox;
|
||||||
|
|
||||||
|
|
||||||
/* not widgets */
|
/* not widgets */
|
||||||
@@ -1634,6 +1636,18 @@ WMView *WMGetTabViewItemView(WMTabViewItem *item);
|
|||||||
|
|
||||||
void WMDestroyTabViewItem(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,
|
int WMRunAlertPanel(WMScreen *app, WMWindow *owner, char *title, char *msg,
|
||||||
|
|||||||
198
WINGs/wbox.c
Normal file
198
WINGs/wbox.c
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user