Index: generic/ttk/ttkLabel.c ================================================================== --- generic/ttk/ttkLabel.c +++ generic/ttk/ttkLabel.c @@ -239,10 +239,53 @@ sizeof(TextElement), TextElementOptions, TextElementSize, TextElementDraw }; + +/*---------------------------------------------------------------------- + * +++ cText (collapsing text) element. + * + * This element is the same as the Text element, except its dimensions + * are 0,0 when the text to display is "". + */ + +static int cTextSetup(TextElement *text, Tk_Window tkwin) +{ + if (*Tcl_GetString(text->textObj) == '\0') { + return 0; + } else { + return TextSetup(text, tkwin); + } +} + +static void cTextElementSize( + void *dummy, void *elementRecord, Tk_Window tkwin, + int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr) +{ + TextElement *text = (TextElement *)elementRecord; + (void)dummy; + (void)paddingPtr; + + if (!cTextSetup(text, tkwin)) + return; + + *heightPtr = text->height; + *widthPtr = TextReqWidth(text); + + TextCleanup(text); + + return; +} + +static const Ttk_ElementSpec cTextElementSpec = { + TK_STYLE_VERSION_2, + sizeof(TextElement), + TextElementOptions, + cTextElementSize, + TextElementDraw +}; /*---------------------------------------------------------------------- * +++ Image element. * Draws an image. */ @@ -718,9 +761,10 @@ void TtkLabel_Init(Tcl_Interp *interp) { Ttk_Theme theme = Ttk_GetDefaultTheme(interp); Ttk_RegisterElement(interp, theme, "text", &TextElementSpec, NULL); + Ttk_RegisterElement(interp, theme, "ctext", &cTextElementSpec, NULL); Ttk_RegisterElement(interp, theme, "image", &ImageElementSpec, NULL); Ttk_RegisterElement(interp, theme, "label", &LabelElementSpec, NULL); } Index: generic/ttk/ttkProgress.c ================================================================== --- generic/ttk/ttkProgress.c +++ generic/ttk/ttkProgress.c @@ -559,11 +559,11 @@ TTK_END_LAYOUT TTK_BEGIN_LAYOUT(HorizontalProgressbarLayout) TTK_GROUP("Horizontal.Progressbar.trough", TTK_FILL_BOTH, TTK_NODE("Horizontal.Progressbar.pbar", TTK_PACK_LEFT|TTK_FILL_Y) - TTK_NODE("Horizontal.Progressbar.text", TTK_PACK_LEFT)) + TTK_NODE("Horizontal.Progressbar.ctext", TTK_PACK_LEFT)) TTK_END_LAYOUT /* * Initialization: */ Index: library/ttk/vistaTheme.tcl ================================================================== --- library/ttk/vistaTheme.tcl +++ library/ttk/vistaTheme.tcl @@ -193,11 +193,11 @@ ttk::style element create Horizontal.Progressbar.pbar vsapi \ PROGRESS 3 {{} 1} -padding 8 ttk::style layout Horizontal.TProgressbar { Horizontal.Progressbar.trough -sticky nswe -children { Horizontal.Progressbar.pbar -side left -sticky ns - Horizontal.Progressbar.text -sticky nesw + Horizontal.Progressbar.ctext -sticky nesw } } ttk::style element create Vertical.Progressbar.pbar vsapi \ PROGRESS 3 {{} 1} -padding 8 ttk::style layout Vertical.TProgressbar { Index: tests/ttk/progressbar.test ================================================================== --- tests/ttk/progressbar.test +++ tests/ttk/progressbar.test @@ -121,24 +121,30 @@ unset res thefont destroy .p } -result {{-anchor e} {-foreground green} {-justify center} {-text {Cannot be seen}} {-wraplength 250}} test progressbar-3.3 {horizontal progressbar height with no -text (TIP #442) specified - Bug [8bee4b2009]} -setup { + set res {} set oldTheme [ttk::style theme use] } -body { ttk::style theme use default set imga [image create photo -file [file join [file dirname [info script]] pb_image.svg] -format {svg -scale 0.8}] ::ttk::style element create Horizontal.Progressbar.pbar image $imga - pack [ttk::progressbar .p -orient horizontal] + # -text "": progressbar height does not depend on font height + pack [ttk::progressbar .p -orient horizontal -font {TkDefaultFont 24}] .p step 25 update - expr {[winfo reqheight .p] == [image height $imga] + 2} + set res [expr {[winfo reqheight .p] == [image height $imga] + 2}] + # -text "something": progressbar height adjusts to contain the font height + .p configure -text Hello -font {TkDefaultFont 24} + update + lappend res [expr {[winfo reqheight .p] == [font metrics [.p cget -font] -linespace] + 2}] } -cleanup { destroy .p ttk::style theme use $oldTheme # there's no way I know to undo '::ttk::style element create...' -} -result {1} +} -result {1 1} test progressbar-4.1 "style command" -body { ttk::progressbar .wh ; # default is -orient horizontal ttk::progressbar .wv -orient vertical list [.wh cget -style] [.wh style] [winfo class .wh]\