diff options
Diffstat (limited to 'unix/tkUnixScale.c')
| -rw-r--r-- | unix/tkUnixScale.c | 124 |
1 files changed, 70 insertions, 54 deletions
diff --git a/unix/tkUnixScale.c b/unix/tkUnixScale.c index 8f4d23b..69bcb27 100644 --- a/unix/tkUnixScale.c +++ b/unix/tkUnixScale.c @@ -114,17 +114,21 @@ DisplayVerticalScale( int x, y, width, height, shadowWidth; double tickValue, tickInterval = scalePtr->tickInterval; Tk_3DBorder sliderBorder; + int scaleWidth, borderWidth, sliderLength; /* * Display the information from left to right across the window. */ + Tk_GetPixelsFromObj(NULL, tkwin, scalePtr->widthObj, &scaleWidth); + Tk_GetPixelsFromObj(NULL, tkwin, scalePtr->borderWidthObj, &borderWidth); + Tk_GetPixelsFromObj(NULL, tkwin, scalePtr->sliderLengthObj, &sliderLength); if (!(scalePtr->flags & REDRAW_OTHER)) { drawnAreaPtr->x = scalePtr->vertTickRightX; drawnAreaPtr->y = scalePtr->inset; - drawnAreaPtr->width = scalePtr->vertTroughX + scalePtr->width - + 2*scalePtr->borderWidth - scalePtr->vertTickRightX; - drawnAreaPtr->height -= 2*scalePtr->inset; + drawnAreaPtr->width = scalePtr->vertTroughX + scaleWidth + + 2 * borderWidth - scalePtr->vertTickRightX; + drawnAreaPtr->height -= 2 * scalePtr->inset; } Tk_Fill3DRectangle(tkwin, drawable, scalePtr->bgBorder, drawnAreaPtr->x, drawnAreaPtr->y, drawnAreaPtr->width, @@ -187,33 +191,33 @@ DisplayVerticalScale( Tk_Draw3DRectangle(tkwin, drawable, scalePtr->bgBorder, scalePtr->vertTroughX, scalePtr->inset, - scalePtr->width + 2*scalePtr->borderWidth, - Tk_Height(tkwin) - 2*scalePtr->inset, scalePtr->borderWidth, + scaleWidth + 2 * borderWidth, + Tk_Height(tkwin) - 2 * scalePtr->inset, borderWidth, TK_RELIEF_SUNKEN); XFillRectangle(scalePtr->display, drawable, scalePtr->troughGC, - scalePtr->vertTroughX + scalePtr->borderWidth, - scalePtr->inset + scalePtr->borderWidth, - (unsigned) scalePtr->width, - (unsigned) (Tk_Height(tkwin) - 2*scalePtr->inset - - 2*scalePtr->borderWidth)); + scalePtr->vertTroughX + borderWidth, + scalePtr->inset + borderWidth, + (unsigned) scaleWidth, + (unsigned) (Tk_Height(tkwin) - 2 * scalePtr->inset + - 2 * borderWidth)); if (scalePtr->state == STATE_ACTIVE) { sliderBorder = scalePtr->activeBorder; } else { sliderBorder = scalePtr->bgBorder; } - width = scalePtr->width; - height = scalePtr->sliderLength/2; - x = scalePtr->vertTroughX + scalePtr->borderWidth; + width = scaleWidth; + height = sliderLength / 2; + x = scalePtr->vertTroughX + borderWidth; y = TkScaleValueToPixel(scalePtr, scalePtr->value) - height; - shadowWidth = scalePtr->borderWidth/2; + shadowWidth = borderWidth / 2; if (shadowWidth == 0) { shadowWidth = 1; } Tk_Draw3DRectangle(tkwin, drawable, sliderBorder, x, y, width, - 2*height, shadowWidth, scalePtr->sliderRelief); + 2 * height, shadowWidth, scalePtr->sliderRelief); x += shadowWidth; y += shadowWidth; - width -= 2*shadowWidth; + width -= 2 * shadowWidth; height -= shadowWidth; Tk_Fill3DRectangle(tkwin, drawable, sliderBorder, x, y, width, height, shadowWidth, scalePtr->sliderRelief); @@ -224,13 +228,14 @@ DisplayVerticalScale( * Draw the label to the right of the scale. */ - if ((scalePtr->flags & REDRAW_OTHER) && (scalePtr->labelLength != 0)) { + if ((scalePtr->flags & REDRAW_OTHER) && (scalePtr->labelObj != NULL)) { Tk_FontMetrics fm; + Tcl_Size labelLength; + const char *label = Tcl_GetStringFromObj(scalePtr->labelObj, &labelLength); Tk_GetFontMetrics(scalePtr->tkfont, &fm); Tk_DrawChars(scalePtr->display, drawable, scalePtr->textGC, - scalePtr->tkfont, scalePtr->label, - scalePtr->labelLength, scalePtr->vertLabelX, + scalePtr->tkfont, label, labelLength, scalePtr->vertLabelX, scalePtr->inset + (3 * fm.ascent) / 2); } } @@ -329,17 +334,21 @@ DisplayHorizontalScale( int x, y, width, height, shadowWidth; double tickInterval = scalePtr->tickInterval; Tk_3DBorder sliderBorder; + int scaleWidth, borderWidth, sliderLength; /* * Display the information from bottom to top across the window. */ + Tk_GetPixelsFromObj(NULL, tkwin, scalePtr->widthObj, &scaleWidth); + Tk_GetPixelsFromObj(NULL, tkwin, scalePtr->borderWidthObj, &borderWidth); + Tk_GetPixelsFromObj(NULL, tkwin, scalePtr->sliderLengthObj, &sliderLength); if (!(scalePtr->flags & REDRAW_OTHER)) { drawnAreaPtr->x = scalePtr->inset; drawnAreaPtr->y = scalePtr->horizValueY; drawnAreaPtr->width -= 2*scalePtr->inset; - drawnAreaPtr->height = scalePtr->horizTroughY + scalePtr->width - + 2*scalePtr->borderWidth - scalePtr->horizValueY; + drawnAreaPtr->height = scalePtr->horizTroughY + scaleWidth + + 2 * borderWidth - scalePtr->horizValueY; } Tk_Fill3DRectangle(tkwin, drawable, scalePtr->bgBorder, drawnAreaPtr->x, drawnAreaPtr->y, drawnAreaPtr->width, @@ -410,25 +419,25 @@ DisplayHorizontalScale( y = scalePtr->horizTroughY; Tk_Draw3DRectangle(tkwin, drawable, scalePtr->bgBorder, scalePtr->inset, y, - Tk_Width(tkwin) - 2*scalePtr->inset, - scalePtr->width + 2*scalePtr->borderWidth, - scalePtr->borderWidth, TK_RELIEF_SUNKEN); + Tk_Width(tkwin) - 2 * scalePtr->inset, + scaleWidth + 2 * borderWidth, + borderWidth, TK_RELIEF_SUNKEN); XFillRectangle(scalePtr->display, drawable, scalePtr->troughGC, - scalePtr->inset + scalePtr->borderWidth, - y + scalePtr->borderWidth, - (unsigned) (Tk_Width(tkwin) - 2*scalePtr->inset - - 2*scalePtr->borderWidth), - (unsigned) scalePtr->width); + scalePtr->inset + borderWidth, + y + borderWidth, + (unsigned) (Tk_Width(tkwin) - 2 * scalePtr->inset + - 2 * borderWidth), + (unsigned) scaleWidth); if (scalePtr->state == STATE_ACTIVE) { sliderBorder = scalePtr->activeBorder; } else { sliderBorder = scalePtr->bgBorder; } - width = scalePtr->sliderLength/2; - height = scalePtr->width; + width = sliderLength / 2; + height = scaleWidth; x = TkScaleValueToPixel(scalePtr, scalePtr->value) - width; - y += scalePtr->borderWidth; - shadowWidth = scalePtr->borderWidth/2; + y += borderWidth; + shadowWidth = borderWidth / 2; if (shadowWidth == 0) { shadowWidth = 1; } @@ -447,13 +456,14 @@ DisplayHorizontalScale( * Draw the label at the top of the scale. */ - if ((scalePtr->flags & REDRAW_OTHER) && (scalePtr->labelLength != 0)) { + if ((scalePtr->flags & REDRAW_OTHER) && (scalePtr->labelObj != NULL)) { Tk_FontMetrics fm; + Tcl_Size labelLength; + const char *label = Tcl_GetStringFromObj(scalePtr->labelObj, &labelLength); Tk_GetFontMetrics(scalePtr->tkfont, &fm); Tk_DrawChars(scalePtr->display, drawable, scalePtr->textGC, - scalePtr->tkfont, scalePtr->label, - scalePtr->labelLength, scalePtr->inset + fm.ascent/2, + scalePtr->tkfont, label, labelLength, scalePtr->inset + fm.ascent/2, scalePtr->horizLabelY + fm.ascent); } } @@ -554,9 +564,10 @@ TkpDisplayScale( char string[TCL_DOUBLE_SPACE]; XRectangle drawnArea; Tcl_DString buf; + int highlightWidth, borderWidth; scalePtr->flags &= ~REDRAW_PENDING; - if ((scalePtr->tkwin == NULL) || !Tk_IsMapped(scalePtr->tkwin)) { + if ((tkwin == NULL) || !Tk_IsMapped(tkwin)) { goto done; } @@ -565,14 +576,14 @@ TkpDisplayScale( */ Tcl_Preserve(scalePtr); - if ((scalePtr->flags & INVOKE_COMMAND) && (scalePtr->command != NULL)) { + if ((scalePtr->flags & INVOKE_COMMAND) && (scalePtr->commandObj != NULL)) { Tcl_Preserve(interp); if (snprintf(string, TCL_DOUBLE_SPACE, scalePtr->valueFormat, scalePtr->value) < 0) { string[TCL_DOUBLE_SPACE - 1] = '\0'; } Tcl_DStringInit(&buf); - Tcl_DStringAppend(&buf, scalePtr->command, TCL_INDEX_NONE); + Tcl_DStringAppend(&buf, Tcl_GetString(scalePtr->commandObj), TCL_INDEX_NONE); Tcl_DStringAppend(&buf, " ", TCL_INDEX_NONE); Tcl_DStringAppend(&buf, string, TCL_INDEX_NONE); result = Tcl_EvalEx(interp, Tcl_DStringValue(&buf), TCL_INDEX_NONE, TCL_EVAL_GLOBAL); @@ -624,15 +635,17 @@ TkpDisplayScale( * vertical scales: border and traversal highlight. */ + Tk_GetPixelsFromObj(NULL, tkwin, scalePtr->highlightWidthObj, &highlightWidth); + Tk_GetPixelsFromObj(NULL, tkwin, scalePtr->borderWidthObj, &borderWidth); if (scalePtr->flags & REDRAW_OTHER) { if (scalePtr->relief != TK_RELIEF_FLAT) { Tk_Draw3DRectangle(tkwin, pixmap, scalePtr->bgBorder, - scalePtr->highlightWidth, scalePtr->highlightWidth, - Tk_Width(tkwin) - 2*scalePtr->highlightWidth, - Tk_Height(tkwin) - 2*scalePtr->highlightWidth, - scalePtr->borderWidth, scalePtr->relief); + highlightWidth, highlightWidth, + Tk_Width(tkwin) - 2 * highlightWidth, + Tk_Height(tkwin) - 2 * highlightWidth, + borderWidth, scalePtr->relief); } - if (scalePtr->highlightWidth > 0) { + if (highlightWidth > 0) { GC gc; if (scalePtr->flags & GOT_FOCUS) { @@ -641,7 +654,7 @@ TkpDisplayScale( gc = Tk_GCForColor( Tk_3DBorderColor(scalePtr->highlightBorder), pixmap); } - Tk_DrawFocusHighlight(tkwin, gc, scalePtr->highlightWidth, pixmap); + Tk_DrawFocusHighlight(tkwin, gc, highlightWidth, pixmap); } } @@ -684,12 +697,15 @@ TkpScaleElement( TkScale *scalePtr, /* Widget record for scale. */ int x, int y) /* Coordinates within scalePtr's window. */ { - int sliderFirst; + int sliderFirst, width, borderWidth, sliderLength; + Tk_GetPixelsFromObj(NULL, scalePtr->tkwin, scalePtr->widthObj, &width); + Tk_GetPixelsFromObj(NULL, scalePtr->tkwin, scalePtr->borderWidthObj, &borderWidth); + Tk_GetPixelsFromObj(NULL, scalePtr->tkwin, scalePtr->sliderLengthObj, &sliderLength); if (scalePtr->orient == ORIENT_VERTICAL) { if ((x < scalePtr->vertTroughX) - || (x >= (scalePtr->vertTroughX + 2*scalePtr->borderWidth + - scalePtr->width))) { + || (x >= (scalePtr->vertTroughX + 2 * borderWidth + + width))) { return OTHER; } if ((y < scalePtr->inset) @@ -697,19 +713,19 @@ TkpScaleElement( return OTHER; } sliderFirst = TkScaleValueToPixel(scalePtr, scalePtr->value) - - scalePtr->sliderLength/2; + - sliderLength/2; if (y < sliderFirst) { return TROUGH1; } - if (y < sliderFirst + scalePtr->sliderLength) { + if (y < sliderFirst + sliderLength) { return SLIDER; } return TROUGH2; } if ((y < scalePtr->horizTroughY) - || (y >= (scalePtr->horizTroughY + 2*scalePtr->borderWidth + - scalePtr->width))) { + || (y >= (scalePtr->horizTroughY + 2 * borderWidth + + width))) { return OTHER; } if ((x < scalePtr->inset) @@ -717,11 +733,11 @@ TkpScaleElement( return OTHER; } sliderFirst = TkScaleValueToPixel(scalePtr, scalePtr->value) - - scalePtr->sliderLength/2; + - sliderLength / 2; if (x < sliderFirst) { return TROUGH1; } - if (x < sliderFirst + scalePtr->sliderLength) { + if (x < sliderFirst + sliderLength) { return SLIDER; } return TROUGH2; |
