diff options
Diffstat (limited to 'generic/ttk/ttkFrame.c')
-rw-r--r-- | generic/ttk/ttkFrame.c | 93 |
1 files changed, 58 insertions, 35 deletions
diff --git a/generic/ttk/ttkFrame.c b/generic/ttk/ttkFrame.c index b6f8fe8..700288f 100644 --- a/generic/ttk/ttkFrame.c +++ b/generic/ttk/ttkFrame.c @@ -1,4 +1,4 @@ -/* $Id: ttkFrame.c,v 1.7 2007/10/25 07:08:26 jenglish Exp $ +/* $Id: ttkFrame.c,v 1.8 2007/11/18 19:20:25 jenglish Exp $ * Copyright (c) 2004, Joe English * * ttk::frame and ttk::labelframe widgets. @@ -14,8 +14,7 @@ * +++ Frame widget: */ -typedef struct -{ +typedef struct { Tcl_Obj *borderWidthObj; Tcl_Obj *paddingObj; Tcl_Obj *reliefObj; @@ -23,8 +22,7 @@ typedef struct Tcl_Obj *heightObj; } FramePart; -typedef struct -{ +typedef struct { WidgetCore core; FramePart frame; } Frame; @@ -241,11 +239,11 @@ typedef struct { Tk_Window labelWidget; Ttk_Manager *mgr; + Ttk_Layout labelLayout; /* Sublayout for label */ Ttk_Box labelParcel; /* Set in layoutProc */ } LabelframePart; -typedef struct -{ +typedef struct { WidgetCore core; FramePart frame; LabelframePart label; @@ -274,8 +272,7 @@ static Tk_OptionSpec LabelframeOptionSpecs[] = /* * Labelframe style parameters: */ -typedef struct -{ +typedef struct { int borderWidth; /* border width */ Ttk_Padding padding; /* internal padding */ Ttk_PositionSpec labelAnchor; /* corner/side to place label */ @@ -321,17 +318,13 @@ static void LabelframeStyleOptions(Labelframe *lf, LabelframeStyle *style) static void LabelframeLabelSize(Labelframe *lframePtr, int *widthPtr, int *heightPtr) { - WidgetCore *corePtr = &lframePtr->core; Tk_Window labelWidget = lframePtr->label.labelWidget; - Ttk_LayoutNode *textNode = Ttk_LayoutFindNode(corePtr->layout, "text"); if (labelWidget) { *widthPtr = Tk_ReqWidth(labelWidget); *heightPtr = Tk_ReqHeight(labelWidget); - } else if (textNode) { - Ttk_LayoutNodeReqSize(corePtr->layout, textNode, widthPtr, heightPtr); } else { - *widthPtr = *heightPtr = 0; + Ttk_LayoutSize(lframePtr->label.labelLayout, 0, widthPtr, heightPtr); } } @@ -379,6 +372,36 @@ static int LabelframeSize(void *recordPtr, int *widthPtr, int *heightPtr) return 0; } +/* + * LabelframeGetLayout -- + * Getlayout widget hook. + */ + +static Ttk_Layout LabelframeGetLayout( + Tcl_Interp *interp, Ttk_Theme theme, void *recordPtr) +{ + Labelframe *lf = recordPtr; + Ttk_Layout frameLayout = TtkWidgetGetLayout(interp, theme, recordPtr); + Ttk_Layout labelLayout; + + if (!frameLayout) { + return NULL; + } + + labelLayout = Ttk_CreateSublayout( + interp, theme, frameLayout, ".Label", lf->core.optionTable); + + if (labelLayout) { + if (lf->label.labelLayout) { + Ttk_FreeLayout(lf->label.labelLayout); + } + Ttk_RebindSublayout(labelLayout, recordPtr); + lf->label.labelLayout = labelLayout; + } + + return frameLayout; +} + /* * LabelframeDoLayout -- * Labelframe layout hook. @@ -390,20 +413,12 @@ static void LabelframeDoLayout(void *recordPtr) { Labelframe *lframePtr = recordPtr; WidgetCore *corePtr = &lframePtr->core; - Ttk_Box borderParcel = Ttk_WinBox(corePtr->tkwin); - Ttk_LayoutNode - *textNode = Ttk_LayoutFindNode(corePtr->layout, "text"), - *borderNode = Ttk_LayoutFindNode(corePtr->layout, "border"); int lw, lh; /* Label width and height */ LabelframeStyle style; + Ttk_Box borderParcel = Ttk_WinBox(lframePtr->core.tkwin); Ttk_Box labelParcel; /* - * Do base layout: - */ - Ttk_PlaceLayout(corePtr->layout,corePtr->state,borderParcel); - - /* * Compute label parcel: */ LabelframeStyleOptions(lframePtr, &style); @@ -429,16 +444,22 @@ static void LabelframeDoLayout(void *recordPtr) /* * Place border and label: */ - if (borderNode) { - Ttk_PlaceLayoutNode(corePtr->layout, borderNode, borderParcel); - } - if (textNode) { - Ttk_PlaceLayoutNode(corePtr->layout, textNode, labelParcel); - } + Ttk_PlaceLayout(corePtr->layout, corePtr->state, borderParcel); + Ttk_PlaceLayout(lframePtr->label.labelLayout, corePtr->state, labelParcel); /* labelWidget placed in LabelframePlaceSlaves GM hook */ lframePtr->label.labelParcel = labelParcel; } +static void LabelframeDisplay(void *recordPtr, Drawable d) +{ + Labelframe *lframePtr = recordPtr; + Ttk_DrawLayout(lframePtr->core.layout, lframePtr->core.state, d); + Ttk_DrawLayout(lframePtr->label.labelLayout, lframePtr->core.state, d); +} + +/* +++ Labelframe geometry manager hooks. + */ + /* LabelframePlaceSlaves -- * Sets the position and size of the labelwidget. */ @@ -455,9 +476,6 @@ static void LabelframePlaceSlaves(void *recordPtr) } } -/* Labelframe geometry manager: - */ - /* LabelRemoved -- * Unset the -labelwidget option. * @@ -489,6 +507,7 @@ static int LabelframeInitialize(Tcl_Interp *interp, void *recordPtr) lframe->label.mgr = Ttk_CreateManager( &LabelframeManagerSpec, lframe, lframe->core.tkwin); lframe->label.labelWidget = 0; + lframe->label.labelLayout = 0; lframe->label.labelParcel = Ttk_MakeBox(-1,-1,-1,-1); return TCL_OK; @@ -585,19 +604,22 @@ static WidgetSpec LabelframeWidgetSpec = LabelframeCleanup, /* cleanupProc */ LabelframeConfigure, /* configureProc */ TtkNullPostConfigure, /* postConfigureProc */ - TtkWidgetGetLayout, /* getLayoutProc */ + LabelframeGetLayout, /* getLayoutProc */ LabelframeSize, /* sizeProc */ LabelframeDoLayout, /* layoutProc */ - TtkWidgetDisplay /* displayProc */ + LabelframeDisplay /* displayProc */ }; TTK_BEGIN_LAYOUT(LabelframeLayout) TTK_NODE("Labelframe.border", TTK_FILL_BOTH) +TTK_END_LAYOUT + +TTK_BEGIN_LAYOUT(LabelSublayout) TTK_NODE("Labelframe.text", TTK_FILL_BOTH) TTK_END_LAYOUT /* ====================================================================== - * +++ Initialization: + * +++ Initialization. */ MODULE_SCOPE @@ -607,6 +629,7 @@ void TtkFrame_Init(Tcl_Interp *interp) Ttk_RegisterLayout(theme, "TFrame", FrameLayout); Ttk_RegisterLayout(theme, "TLabelframe", LabelframeLayout); + Ttk_RegisterLayout(theme, "TLabelframe.Label", LabelSublayout); RegisterWidget(interp, "ttk::frame", &FrameWidgetSpec); RegisterWidget(interp, "ttk::labelframe", &LabelframeWidgetSpec); |