📄 labeledwidget.itk
字号:
## Labeledwidget# ----------------------------------------------------------------------# Implements a labeled widget which contains a label and child site.# The child site is a frame which can filled with any widget via a # derived class or though the use of the childsite method. This class# was designed to be a general purpose base class for supporting the # combination of label widget and a childsite, where a label may be # text, bitmap or image. The options include the ability to position # the label around the childsite widget, modify the font and margin, # and control the display of the label. ## ----------------------------------------------------------------------# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com## @(#) $Id: labeledwidget.itk,v 1.1 2003/02/05 10:54:07 mdejong Exp $# ----------------------------------------------------------------------# Copyright (c) 1995 DSC Technologies Corporation# ======================================================================# Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission.# # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE.# ======================================================================## Usual options.#itk::usual Labeledwidget { keep -background -cursor -foreground -labelfont}# ------------------------------------------------------------------# LABELEDWIDGET# ------------------------------------------------------------------class iwidgets::Labeledwidget { inherit itk::Widget constructor {args} {} destructor {} itk_option define -disabledforeground disabledForeground \ DisabledForeground \#a3a3a3 itk_option define -labelpos labelPos Position w itk_option define -labelmargin labelMargin Margin 2 itk_option define -labeltext labelText Text {} itk_option define -labelvariable labelVariable Variable {} itk_option define -labelbitmap labelBitmap Bitmap {} itk_option define -labelimage labelImage Image {} itk_option define -state state State normal public method childsite protected method _positionLabel {{when later}} proc alignlabels {args} {} protected variable _reposition "" ;# non-null => _positionLabel pending} ## Provide a lowercased access method for the Labeledwidget class.# proc ::iwidgets::labeledwidget {pathName args} { uplevel ::iwidgets::Labeledwidget $pathName $args}# ------------------------------------------------------------------# CONSTRUCTOR# ------------------------------------------------------------------body iwidgets::Labeledwidget::constructor {args} { # # Create a frame for the childsite widget. # itk_component add -protected lwchildsite { frame $itk_interior.lwchildsite } # # Create label. # itk_component add label { label $itk_interior.label } { usual rename -font -labelfont labelFont Font ignore -highlightcolor -highlightthickness } # # Set the interior to be the childsite for derived classes. # set itk_interior $itk_component(lwchildsite) # # Initialize the widget based on the command line options. # eval itk_initialize $args # # When idle, position the label. # _positionLabel}# ------------------------------------------------------------------# DESTURCTOR# ------------------------------------------------------------------body iwidgets::Labeledwidget::destructor {} { if {$_reposition != ""} {after cancel $_reposition}}# ------------------------------------------------------------------# OPTIONS# ------------------------------------------------------------------# ------------------------------------------------------------------# OPTION: -disabledforeground## Specified the foreground to be used on the label when disabled.# ------------------------------------------------------------------configbody iwidgets::Labeledwidget::disabledforeground {}# ------------------------------------------------------------------# OPTION: -labelpos## Set the position of the label on the labeled widget. The margin# between the label and childsite comes along for the ride.# ------------------------------------------------------------------configbody iwidgets::Labeledwidget::labelpos { _positionLabel}# ------------------------------------------------------------------# OPTION: -labelmargin## Specifies the distance between the widget and label.# ------------------------------------------------------------------configbody iwidgets::Labeledwidget::labelmargin { _positionLabel}# ------------------------------------------------------------------# OPTION: -labeltext## Specifies the label text.# ------------------------------------------------------------------configbody iwidgets::Labeledwidget::labeltext { $itk_component(label) configure -text $itk_option(-labeltext) _positionLabel}# ------------------------------------------------------------------# OPTION: -labelvariable## Specifies the label text variable.# ------------------------------------------------------------------configbody iwidgets::Labeledwidget::labelvariable { $itk_component(label) configure -textvariable $itk_option(-labelvariable) uplevel [list trace variable \ $itk_option(-labelvariable) w [code _positionLabel]] _positionLabel}# ------------------------------------------------------------------# OPTION: -labelbitmap## Specifies the label bitmap.# ------------------------------------------------------------------configbody iwidgets::Labeledwidget::labelbitmap { $itk_component(label) configure -bitmap $itk_option(-labelbitmap) _positionLabel}# ------------------------------------------------------------------# OPTION: -labelimage## Specifies the label image.# ------------------------------------------------------------------configbody iwidgets::Labeledwidget::labelimage { $itk_component(label) configure -image $itk_option(-labelimage) _positionLabel}# ------------------------------------------------------------------# OPTION: -state## Specifies the state of the label. # ------------------------------------------------------------------configbody iwidgets::Labeledwidget::state { _positionLabel}# ------------------------------------------------------------------# METHODS# ------------------------------------------------------------------# ------------------------------------------------------------------# METHOD: childsite## Returns the path name of the child site widget.# ------------------------------------------------------------------body iwidgets::Labeledwidget::childsite {} { return $itk_component(lwchildsite)}# ------------------------------------------------------------------# PROCEDURE: alignlabels widget ?widget ...?## The alignlabels procedure takes a list of widgets derived from# the Labeledwidget class and adjusts the label margin to align # the labels.# ------------------------------------------------------------------body iwidgets::Labeledwidget::alignlabels {args} { update set maxLabelWidth 0 # # Verify that all the widgets are of type Labeledwidget and # determine the size of the maximum length label string. # foreach iwid $args { set objcmd [itcl::find objects -isa Labeledwidget *::$iwid] if {$objcmd == ""} { error "$iwid is not a \"Labeledwidget\"" } set csWidth [winfo reqwidth $iwid.lwchildsite] set shellWidth [winfo reqwidth $iwid] if {[expr $shellWidth - $csWidth] > $maxLabelWidth} { set maxLabelWidth [expr $shellWidth - $csWidth] } } # # Adjust the margins for the labels such that the child sites and # labels line up. # foreach iwid $args { set csWidth [winfo reqwidth $iwid.lwchildsite] set shellWidth [winfo reqwidth $iwid] set labelSize [expr $shellWidth - $csWidth] if {$maxLabelWidth > $labelSize} { set objcmd [itcl::find objects -isa Labeledwidget *::$iwid] set dist [expr $maxLabelWidth - \ ($labelSize - [$objcmd cget -labelmargin])] $objcmd configure -labelmargin $dist } } }# ------------------------------------------------------------------# PROTECTED METHOD: _positionLabel ?when?## Packs the label and label margin. If "when" is "now", the# change is applied immediately. If it is "later" or it is not# specified, then the change is applied later, when the application# is idle.# ------------------------------------------------------------------body iwidgets::Labeledwidget::_positionLabel {{when later}} { if {$when == "later"} { if {$_reposition == ""} { set _reposition [after idle [code $this _positionLabel now]] } return } elseif {$when != "now"} { error "bad option \"$when\": should be now or later" } # # If we have a label, be it text, bitmap, or image continue. # if {($itk_option(-labeltext) != {}) || \ ($itk_option(-labelbitmap) != {}) || \ ($itk_option(-labelimage) != {}) || \ ($itk_option(-labelvariable) != {})} { # # Set the foreground color based on the state. # if {[info exists itk_option(-state)]} { switch -- $itk_option(-state) { disabled { $itk_component(label) configure \ -foreground $itk_option(-disabledforeground) } normal { $itk_component(label) configure \ -foreground $itk_option(-foreground) } } } set parent [winfo parent $itk_component(lwchildsite)] # # Switch on the label position option. Using the grid, # adjust the row/column setting of the label, margin, and # and childsite. The margin height/width is adjust based # on the orientation as well. Finally, set the weights such # that the childsite takes the heat on expansion and shrinkage. # switch $itk_option(-labelpos) { nw - n - ne { grid $itk_component(label) -row 0 -column 0 \ -sticky $itk_option(-labelpos) grid $itk_component(lwchildsite) -row 2 -column 0 \ -sticky nsew grid rowconfigure $parent 0 -weight 0 -minsize 0 grid rowconfigure $parent 1 -weight 0 -minsize \ [winfo pixels $itk_component(label) \ $itk_option(-labelmargin)] grid rowconfigure $parent 2 -weight 1 -minsize 0 grid columnconfigure $parent 0 -weight 1 -minsize 0 grid columnconfigure $parent 1 -weight 0 -minsize 0 grid columnconfigure $parent 2 -weight 0 -minsize 0 } en - e - es { grid $itk_component(lwchildsite) -row 0 -column 0 \ -sticky nsew grid $itk_component(label) -row 0 -column 2 \ -sticky $itk_option(-labelpos) grid rowconfigure $parent 0 -weight 1 -minsize 0 grid rowconfigure $parent 1 -weight 0 -minsize 0 grid rowconfigure $parent 2 -weight 0 -minsize 0 grid columnconfigure $parent 0 -weight 1 -minsize 0 grid columnconfigure $parent 1 -weight 0 -minsize \ [winfo pixels $itk_component(label) \ $itk_option(-labelmargin)] grid columnconfigure $parent 2 -weight 0 -minsize 0 } se - s - sw { grid $itk_component(lwchildsite) -row 0 -column 0 \ -sticky nsew grid $itk_component(label) -row 2 -column 0 \ -sticky $itk_option(-labelpos) grid rowconfigure $parent 0 -weight 1 -minsize 0 grid rowconfigure $parent 1 -weight 0 -minsize \ [winfo pixels $itk_component(label) \ $itk_option(-labelmargin)] grid rowconfigure $parent 2 -weight 0 -minsize 0 grid columnconfigure $parent 0 -weight 1 -minsize 0 grid columnconfigure $parent 1 -weight 0 -minsize 0 grid columnconfigure $parent 2 -weight 0 -minsize 0 } wn - w - ws { grid $itk_component(lwchildsite) -row 0 -column 2 \ -sticky nsew grid $itk_component(label) -row 0 -column 0 \ -sticky $itk_option(-labelpos) grid rowconfigure $parent 0 -weight 1 -minsize 0 grid rowconfigure $parent 1 -weight 0 -minsize 0 grid rowconfigure $parent 2 -weight 0 -minsize 0 grid columnconfigure $parent 0 -weight 0 -minsize 0 grid columnconfigure $parent 1 -weight 0 -minsize \ [winfo pixels $itk_component(label) \ $itk_option(-labelmargin)] grid columnconfigure $parent 2 -weight 1 -minsize 0 } default { error "bad labelpos option\ \"$itk_option(-labelpos)\": should be\ nw, n, ne, sw, s, se, en, e, es, wn, w, or ws" } } # # Else, neither the label text, bitmap, or image have a value, so # forget them so they don't appear and manage only the childsite. # } else { grid forget $itk_component(label) grid $itk_component(lwchildsite) -row 0 -column 0 -sticky nsew set parent [winfo parent $itk_component(lwchildsite)] grid rowconfigure $parent 0 -weight 1 -minsize 0 grid rowconfigure $parent 1 -weight 0 -minsize 0 grid rowconfigure $parent 2 -weight 0 -minsize 0 grid columnconfigure $parent 0 -weight 1 -minsize 0 grid columnconfigure $parent 1 -weight 0 -minsize 0 grid columnconfigure $parent 2 -weight 0 -minsize 0 } # # Reset the resposition flag. # set _reposition ""}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -