diff --git a/centrallix/htmlgen/htdrv_pane.c b/centrallix/htmlgen/htdrv_pane.c
index 0683cc6e6..7d3269f38 100644
--- a/centrallix/htmlgen/htdrv_pane.c
+++ b/centrallix/htmlgen/htdrv_pane.c
@@ -58,7 +58,7 @@ htpnRender(pHtSession s, pWgtrNode tree, int z)
char name[64];
char main_bg[128];
char bdr[64];
- int x=-1,y=-1,w,h;
+ int x=-1,y=-1,w,h,totalW,totalH,flexW,totalFlexW,flexH,totalFlexH;
int id;
int style = 1; /* 0 = lowered, 1 = raised, 2 = none, 3 = bordered */
char* c1;
@@ -90,6 +90,39 @@ htpnRender(pHtSession s, pWgtrNode tree, int z)
mssError(1,"HTPN","Pane widget must have a 'height' property");
return -1;
}
+ if (wgtrGetPropertyValue(tree, "fl_width",DATA_T_INTEGER,POD(&flexW)) != 0)
+ {
+ mssError(1,"HTPN","Pane widget must have a 'fl_width' property");
+ return -1;
+ }
+ if (wgtrGetPropertyValue(tree, "fl_height",DATA_T_INTEGER,POD(&flexH)) != 0)
+ {
+ mssError(1,"HTPN","Pane widget must have a 'fl_height' property");
+ return -1;
+ }
+ if (wgtrGetPropertyValue(tree, "total_flexW",DATA_T_INTEGER,POD(&totalFlexW)) != 0)
+ {
+ mssError(1,"HTPN","Pane widget must have a 'total_flexW' property");
+ return -1;
+ }
+ if (wgtrGetPropertyValue(tree, "total_flexH",DATA_T_INTEGER,POD(&totalFlexH)) != 0)
+ {
+ mssError(1,"HTPN","Pane widget must have a 'total_flexH' property");
+ return -1;
+ }
+
+ pWgtrNode parentTree = wgtrGetRoot(tree);
+
+ if (wgtrGetPropertyValue(parentTree,"width",DATA_T_INTEGER,POD(&totalW)) != 0)
+ {
+ mssError(1,"HTPN","Pane widget must have a 'width' property");
+ return -1;
+ }
+ if (wgtrGetPropertyValue(parentTree,"height",DATA_T_INTEGER,POD(&totalH)) != 0)
+ {
+ mssError(1,"HTPN","Pane widget must have a 'height' property");
+ return -1;
+ }
/** Border radius, for raised/lowered/bordered panes **/
if (wgtrGetPropertyValue(tree,"border_radius",DATA_T_INTEGER,POD(&border_radius)) != 0)
@@ -156,17 +189,17 @@ htpnRender(pHtSession s, pWgtrNode tree, int z)
/** Ok, write the style header items. **/
if (style == 2) /* flat */
{
- htrAddStylesheetItem_va(s,"\t#pn%POSmain { POSITION:absolute; VISIBILITY:inherit; overflow:hidden; LEFT:%INTpx; TOP:%INTpx; WIDTH:%POSpx; HEIGHT:%POSpx; Z-INDEX:%POS; }\n",id,x,y,w,h,z);
+ htrAddStylesheetItem_va(s,"\t#pn%POSmain { POSITION:absolute; VISIBILITY:inherit; overflow:hidden; LEFT:%INTpx; TOP:%INTpx; WIDTH:calc(%POSpx + (100%% - %POSpx) * (%POS/%POS)); HEIGHT:calc(%POSpx + (100%% - %POSpx) * (%POS/%POS)); Z-INDEX:%POS; }\n",id,x,y,w,totalW,flexW,totalFlexW,h,totalH,flexH,totalFlexH,totalz);
htrAddStylesheetItem_va(s,"\t#pn%POSmain { border-radius: %INTpx; %STR}\n",id,border_radius,main_bg);
}
else if (style == 0 || style == 1) /* lowered or raised */
{
- htrAddStylesheetItem_va(s,"\t#pn%POSmain { POSITION:absolute; VISIBILITY:inherit; overflow: hidden; LEFT:%INTpx; TOP:%INTpx; WIDTH:%POSpx; HEIGHT:%POSpx; Z-INDEX:%POS; }\n",id,x,y,w-2*box_offset,h-2*box_offset,z);
+ htrAddStylesheetItem_va(s,"\t#pn%POSmain { POSITION:absolute; VISIBILITY:inherit; overflow: hidden; LEFT:%INTpx; TOP:%INTpx; WIDTH:calc(%POSpx + (100%% - %POSpx) * (%POS/%POS)); HEIGHT:calc(%POSpx + (100%% - %POSpx) * (%POS/%POS)); Z-INDEX:%POS; }\n",id,x,y,w-2*box_offset,totalW,flexW,totalFlexW,h-2*box_offset,totalH,flexH,totalFlexH,totalz);
htrAddStylesheetItem_va(s,"\t#pn%POSmain { border-style: solid; border-width: 1px; border-color: %STR %STR %STR %STR; border-radius: %INTpx; %STR}\n",id,c1,c2,c2,c1,border_radius,main_bg);
}
else if (style == 3) /* bordered */
{
- htrAddStylesheetItem_va(s,"\t#pn%POSmain { POSITION:absolute; VISIBILITY:inherit; overflow: hidden; LEFT:%INTpx; TOP:%INTpx; WIDTH:%POSpx; HEIGHT:%POSpx; Z-INDEX:%POS; }\n",id,x,y,w-2*box_offset,h-2*box_offset,z);
+ htrAddStylesheetItem_va(s,"\t#pn%POSmain { POSITION:absolute; VISIBILITY:inherit; overflow: hidden; LEFT:%INTpx; TOP:%INTpx; WIDTH:calc(%POSpx + (100%% - %POSpx) * (%POS/%POS)); HEIGHT:calc(%POSpx + (100%% - %POSpx) * (%POS/%POS)); Z-INDEX:%POS; }\n",id,x,y,w-2*box_offset,totalW,flexW,totalFlexW,h-2*box_offset,totalH,flexH,totalFlexH,totalz);
htrAddStylesheetItem_va(s,"\t#pn%POSmain { border-style: solid; border-width: 1px; border-color:%STR&CSSVAL; border-radius: %INTpx; %STR}\n",id,bdr,border_radius,main_bg);
}
if (shadow_radius > 0)
diff --git a/centrallix/include/wgtr.h b/centrallix/include/wgtr.h
index 99f8c3760..2635e550d 100644
--- a/centrallix/include/wgtr.h
+++ b/centrallix/include/wgtr.h
@@ -101,6 +101,7 @@ typedef struct _WN
int r_x, r_y, r_width, r_height; /** Requested geometry **/
int pre_x, pre_y, pre_width, pre_height; /** pre-layout geom. **/
int fl_x, fl_y, fl_width, fl_height;/** Flexibility **/
+ int total_flexW, total_flexH; /** container flexibility **/
double fx, fy, fw, fh; /** internal flexibility calculations **/
int min_width, min_height; /** absolute minimums **/
int x, y, width, height; /** actual geometry **/
@@ -170,7 +171,8 @@ pWgtrNode wgtrParseOpenObject(pObject obj, pStruct app_params, pWgtrClientInfo c
void wgtrFree(pWgtrNode tree); /** frees memory associated with a widget tree **/
pWgtrNode wgtrNewNode( char* name, char* type, pObjSession s,
int rx, int ry, int rwidth, int rheight,
- int flx, int fly, int flwidth, int flheight); /** create a new widget node **/
+ int flx, int fly, int flwidth, int flheight
+ int flwidthTotal, int flheightTotal); /** create a new widget node **/
int wgtrSetupNode(pWgtrNode node);
int wgtrMergeOverlays(pWgtrNode node, char* objpath, char* app_path, char* overlays[], char* templates[]);
@@ -206,6 +208,8 @@ int wgtrSetDMPrivateData(pWgtrNode tree, void* data);
void* wgtrGetDMPrivateData(pWgtrNode tree);
int wgtrGetContainerHeight(pWgtrNode tree);
int wgtrGetContainerWidth(pWgtrNode tree);
+int wgtrGetContainerFlexWidth(pWgtrNode tree); /** get widget container flexible width **/
+int wgtrGetContainerFlexHeight(pWgtrNode tree); /** get widget container flexible height **/
int wgtrMoveChildren(pWgtrNode tree, int x_offset, int y_offset);
/** misc. functions **/
diff --git a/centrallix/wgtr/wgtr.c b/centrallix/wgtr/wgtr.c
index e2fd2c07c..0b63e87b1 100755
--- a/centrallix/wgtr/wgtr.c
+++ b/centrallix/wgtr/wgtr.c
@@ -288,6 +288,8 @@ wgtrCopyInTemplate(pWgtrNode tree, pObject tree_obj, pWgtrNode match, char* base
if (match->fl_y >= 0) tree->fl_y = match->fl_y;
if (match->fl_width >= 0) tree->fl_width = match->fl_width;
if (match->fl_height >= 0) tree->fl_height = match->fl_height;
+ if (match->total_flexW >= 0) tree->total_flexW = match->total_flexW;
+ if (match->total_flexH >= 0) tree->total_flexH = match->total_flexH;
/** Check for substitutions **/
for(prop=objGetFirstAttr(tree_obj);prop;prop=objGetNextAttr(tree_obj))
@@ -352,7 +354,8 @@ wgtrCopyInTemplate(pWgtrNode tree, pObject tree_obj, pWgtrNode match, char* base
snprintf(new_name, sizeof(new_name), "%s_%s", base_name, subtree->Name);
if ((new_node = wgtrNewNode(new_name, subtree->Type, subtree->ObjSession,
subtree->r_x, subtree->r_y, subtree->r_width, subtree->r_height,
- subtree->fl_x, subtree->fl_y, subtree->fl_width, subtree->fl_height)) == NULL)
+ subtree->fl_x, subtree->fl_y, subtree->fl_width, subtree->fl_height,
+ subtree->total_flexW, subtree->total_flexH)) == NULL)
return -1;
if (wgtrSetupNode(new_node) < 0)
@@ -1515,7 +1518,8 @@ wgtrSetProperty(pWgtrNode widget, char* name, int datatype, pObjData val)
pWgtrNode
wgtrNewNode( char* name, char* type, pObjSession s,
int rx, int ry, int rwidth, int rheight,
- int flx, int fly, int flwidth, int flheight)
+ int flx, int fly, int flwidth, int flheight,
+ int flwidthTotal, int flheightTotal)
{
pWgtrNode node;
@@ -1538,6 +1542,8 @@ wgtrNewNode( char* name, char* type, pObjSession s,
node->fl_y = fly;
node->fl_width = flwidth;
node->fl_height = flheight;
+ node->total_flexW = flwidthTotal; /* added for total flexible width of container */
+ node->total_flexH = flheightTotal; /* added for total flexible height of container */
node->ObjSession = s;
node->Parent = NULL;
node->min_height = 0;