TIP 82: Add -offrelief Option to Checkbutton and Radiobutton

Bounty program for improvements to Tcl and certain Tcl packages.
Tcl 2017 Conference, Houston/TX, US, Oct 16-20
Send your abstracts to tclconference@googlegroups.com
by Aug 21.
Author:		D. Richard Hipp <drh@hwaci.com>
State:		Final
Type:		Project
Vote:		Done
Created:	10-Jan-2002
Tcl-Version:	8.4


This TIP proposes adding option -offrelief to the checkbutton and radiobutton widgets to specify the relief of the widget when -indicatoron is off and the state of the button is off. This feature is needed to support the use of checkbutton and radiobutton widgets on toolbars.


The checkbutton and radiobutton widgets both support the -overrelief option which is suppose to provide the capability to change the relief of the widget on mouse-over. The -overrelief option is not used by the underlying C code. The value of -overrelief is used only by the script bindings to change the -relief option in response to and events. But with the checkbutton and radiobutton widgets, the value of -relief is ignored when -indicatoron is turned off. Hence, -overrelief has no effect when -indicatoron is off.

An example of the effect we would like to achieve is the Bold/Italic/Underline and text justification toolbar buttons on word processors. The Bold/Italic/Underline toolbar buttons are most naturally implemented using Tk checkbuttons and the text justification toolbar buttons are most naturally implemented using Tk radiobuttons. The buttons are configured to be flat most of the time (-relief flat) but raise up on mouseover (-overrelief raised). Toolbar buttons do not show indicators (-indicatoron off). This last configuration option is the crux of the problem since when -indicatoron is off, the relief of the button is hard-coded to be raised when the button is on and sunken when the button is off. In the current implementation, there is no way to get the off-relief to be flat, and hence there is no way to achieve the customary look for these common toolbar buttons.

Proposed Enhancement

This TIP proposes to modify the checkbutton and radiobutton widgets to support a -offrelief option. -offrelief will take any of the usual relief values. The default value will be raised. The -offrelief option determines the relief of the widget when -indicatoron option is off and the button itself is off.

The default bindings for checkbuttons and radiobuttons will also need to be changed so that they copy the value of -overrelief into -offrelief instead of into -relief when the value of -indicatoron is false.

When -indicatoron is off and the button itself is on, the relief continues to be hard-coded to sunken. For symmetry, we might consider adding another -onrelief option to cover this case. But it is difficult to imagine ever wanting to change the value of -onrelief so it has been omitted from this TIP. If there as strong desire to have -onrelief, it can be added later.

Alternative Proposals

A simpler solution would be to change the -indicatoron option so that it causes the off-relief to come from the -relief option instead of using a hard-coded raised relief. That approach is conceptually simpler, but it breaks backwards compatibility and so must be rejected.

Another possibility is to modify -indicatoron so that it takes a third value (other than on or off) where the third value works like off but takes the off-relief from the -relief option instead of always using raised. But this second idea seems more contrived and makes it more difficult to define an alternative on-relief value with a later modification.


This document has been placed in the public domain.