diff options
Diffstat (limited to 'macosx/ttkMacOSXTheme.c')
-rw-r--r-- | macosx/ttkMacOSXTheme.c | 546 |
1 files changed, 306 insertions, 240 deletions
diff --git a/macosx/ttkMacOSXTheme.c b/macosx/ttkMacOSXTheme.c index a6dafaf..fd8f6d3 100644 --- a/macosx/ttkMacOSXTheme.c +++ b/macosx/ttkMacOSXTheme.c @@ -5,7 +5,9 @@ * * Copyright (c) 2004 Joe English * Copyright (c) 2005 Neil Madden - * Copyright (c) 2006-2007 Daniel A. Steffen <das@users.sourceforge.net> + * Copyright (c) 2006-2009 Daniel A. Steffen <das@users.sourceforge.net> + * Copyright 2008-2009, Apple Inc. + * Copyright 2009 Kevin Walzer/WordTech Communications LLC. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. @@ -27,34 +29,22 @@ * top-level window, not to the Tk_Window. BoxToRect() * accounts for this. * - * RCS: @(#) $Id: ttkMacOSXTheme.c,v 1.21.2.4 2010/08/26 02:06:10 hobbs Exp $ + * RCS: @(#) $Id: ttkMacOSXTheme.c,v 1.29 2009/10/22 08:32:23 dkf Exp $ */ #include "tkMacOSXPrivate.h" #include "ttk/ttkTheme.h" -#if !defined(BUILD_tile) /* * Use this version in the core: */ #define BEGIN_DRAWING(d) { \ TkMacOSXDrawingContext dc; \ - if (!TkMacOSXSetupDrawingContext((d), NULL, 0, &dc)) {return;} + if (!TkMacOSXSetupDrawingContext((d), NULL, 1, &dc)) {return;} #define END_DRAWING \ TkMacOSXRestoreDrawingContext(&dc); } -#else /* BUILD_tile */ -/* - * TkMacOSXSetupDrawingContext is not available to extensions, - * need to do this the hard way in Tile: - */ -#define BEGIN_DRAWING(d) { \ - CGrafPtr saveWorld; GDHandle saveDevice; \ - GetGWorld(&saveWorld, &saveDevice); \ - SetGWorld(TkMacOSXGetDrawablePort(d), 0); \ - TkMacOSXSetUpClippingRgn(d); -#define END_DRAWING \ - SetGWorld(saveWorld,saveDevice); } -#endif /* defined(BUILD_TILE) */ + +#define HIOrientation kHIThemeOrientationNormal #ifdef __LP64__ #define RangeToFactor(maximum) (((double) (INT_MAX >> 1)) / (maximum)) @@ -71,48 +61,20 @@ * Convert a Ttk_Box in Tk coordinates relative to the given Drawable * to a native Rect relative to the containing port. */ -static inline Rect BoxToRect(Drawable d, Ttk_Box b) +static inline CGRect BoxToRect(Drawable d, Ttk_Box b) { MacDrawable *md = (MacDrawable*)d; - Rect rect; + CGRect rect; - rect.top = b.y + md->yOff; - rect.left = b.x + md->xOff; - rect.bottom = rect.top + b.height; - rect.right = rect.left + b.width; + rect.origin.y = b.y + md->yOff; + rect.origin.x = b.x + md->xOff; + rect.size.height = b.height; + rect.size.width = b.width; return rect; } /* - * PatternOrigin -- - * Compute brush pattern origin for a Drawable relative to a Tk_Window. - * - * Notes: This will only be nonzero if the Drawable is an off-screen pixmap. - * See also SF bug #1157739. - */ -static Point PatternOrigin(Tk_Window tkwin, Drawable d) -{ - MacDrawable *md = (MacDrawable*)d; - Rect bounds; - Point origin; - - TkMacOSXWinBounds((TkWindow *) tkwin, &bounds); - origin.h = md->xOff - bounds.left; - origin.v = md->yOff - bounds.top; - - return origin; -} - -/* - * DontErase -- - * No-op ThemeEraseProc, can be passed to DrawThemeButton &c. - */ -static void DontErase( - const Rect *bounds, UInt32 eraseData, SInt16 depth, Boolean isColorDev) -{ } - -/* * Table mapping Tk states to Appearance manager ThemeStates */ @@ -147,16 +109,16 @@ static Ttk_Padding ButtonMargins = {2,2,2,2}; typedef struct { ThemeButtonKind kind; ThemeMetric heightMetric; -} ThemeButtonParms; +} ThemeButtonParams; -static ThemeButtonParms - PushButtonParms = { kThemePushButton, kThemeMetricPushButtonHeight }, - CheckBoxParms = { kThemeCheckBox, kThemeMetricCheckBoxHeight }, - RadioButtonParms = { kThemeRadioButton, kThemeMetricRadioButtonHeight }, - BevelButtonParms = { kThemeBevelButton, NoThemeMetric }, - PopupButtonParms = { kThemePopupButton, kThemeMetricPopupButtonHeight }, - DisclosureParms = { kThemeDisclosureButton, kThemeMetricDisclosureTriangleHeight }, - ListHeaderParms = { kThemeListHeaderButton, kThemeMetricListHeaderHeight }; +static ThemeButtonParams + PushButtonParams = { kThemePushButton, kThemeMetricPushButtonHeight }, + CheckBoxParams = { kThemeCheckBox, kThemeMetricCheckBoxHeight }, + RadioButtonParams = { kThemeRadioButton, kThemeMetricRadioButtonHeight }, + BevelButtonParams = { kThemeBevelButton, NoThemeMetric }, + PopupButtonParams = { kThemePopupButton, kThemeMetricPopupButtonHeight }, + DisclosureParams = { kThemeDisclosureButton, kThemeMetricDisclosureTriangleHeight }, + ListHeaderParams = { kThemeListHeaderButton, kThemeMetricListHeaderHeight }; static Ttk_StateTable ButtonValueTable[] = { { kThemeButtonMixed, TTK_STATE_ALTERNATE, 0 }, @@ -175,16 +137,18 @@ static Ttk_StateTable ButtonAdornmentTable[] = { /* * computeButtonDrawInfo -- - * Fill in an appearance manager ThemeButtonDrawInfo record. + * Fill in an appearance manager HIThemeButtonDrawInfo record. */ -static ThemeButtonDrawInfo computeButtonDrawInfo( - ThemeButtonParms *parms, Ttk_State state) +static inline HIThemeButtonDrawInfo computeButtonDrawInfo( + ThemeButtonParams *params, Ttk_State state) { - ThemeButtonDrawInfo info; - - info.state = Ttk_StateTableLookup(ThemeStateTable, state); - info.value = Ttk_StateTableLookup(ButtonValueTable, state); - info.adornment = Ttk_StateTableLookup(ButtonAdornmentTable, state); + const HIThemeButtonDrawInfo info = { + .version = 0, + .state = Ttk_StateTableLookup(ThemeStateTable, state), + .kind = params ? params->kind : 0, + .value = Ttk_StateTableLookup(ButtonValueTable, state), + .adornment = Ttk_StateTableLookup(ButtonAdornmentTable, state), + }; return info; } @@ -192,12 +156,12 @@ static void ButtonElementSizeNoPadding( void *clientData, void *elementRecord, Tk_Window tkwin, int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr) { - ThemeButtonParms *parms = clientData; + ThemeButtonParams *params = clientData; - if (parms->heightMetric != NoThemeMetric) { + if (params->heightMetric != NoThemeMetric) { SInt32 height; - ChkErr(GetThemeMetric, parms->heightMetric, &height); + ChkErr(GetThemeMetric, params->heightMetric, &height); *heightPtr = height; } } @@ -206,10 +170,10 @@ static void ButtonElementSize( void *clientData, void *elementRecord, Tk_Window tkwin, int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr) { - ThemeButtonParms *parms = clientData; - ThemeButtonDrawInfo info = computeButtonDrawInfo(parms, 0); - static const Rect scratchBounds = {0, 0, 100, 100}; - Rect contentBounds; + ThemeButtonParams *params = clientData; + const HIThemeButtonDrawInfo info = computeButtonDrawInfo(params, 0); + static const CGRect scratchBounds = {{0, 0}, {100, 100}}; + CGRect contentBounds; ButtonElementSizeNoPadding( clientData, elementRecord, tkwin, @@ -220,13 +184,13 @@ static void ButtonElementSize( * for the content bounds of a dummy rectangle, then use * the difference as the padding. */ - ChkErr(GetThemeButtonContentBounds, - &scratchBounds, parms->kind, &info, &contentBounds); + ChkErr(HIThemeGetButtonContentBounds, + &scratchBounds, &info, &contentBounds); - paddingPtr->left = contentBounds.left; - paddingPtr->top = contentBounds.top; - paddingPtr->right = scratchBounds.right - contentBounds.right + 1; - paddingPtr->bottom = scratchBounds.bottom - contentBounds.bottom; + paddingPtr->left = CGRectGetMinX(contentBounds); + paddingPtr->top = CGRectGetMinY(contentBounds); + paddingPtr->right = CGRectGetMaxX(scratchBounds) - CGRectGetMaxX(contentBounds) + 1; + paddingPtr->bottom = CGRectGetMaxY(scratchBounds) - CGRectGetMaxY(contentBounds); /* * Now add a little extra padding to account for drop shadows. @@ -242,12 +206,12 @@ static void ButtonElementDraw( void *clientData, void *elementRecord, Tk_Window tkwin, Drawable d, Ttk_Box b, Ttk_State state) { - ThemeButtonParms *parms = clientData; - ThemeButtonDrawInfo info = computeButtonDrawInfo(parms, state); - Rect bounds = BoxToRect(d, Ttk_PadBox(b, ButtonMargins)); + ThemeButtonParams *params = clientData; + CGRect bounds = BoxToRect(d, Ttk_PadBox(b, ButtonMargins)); + const HIThemeButtonDrawInfo info = computeButtonDrawInfo(params, state); BEGIN_DRAWING(d) - ChkErr(DrawThemeButton, &bounds, parms->kind, &info, NULL, NULL, NULL, 0); + ChkErr(HIThemeDrawButton, &bounds, &info, dc.context, HIOrientation, NULL); END_DRAWING } @@ -263,26 +227,77 @@ static Ttk_ElementSpec ButtonElementSpec = { * +++ Notebook elements. */ + +/* Tab position logic, c.f. ttkNotebook.c TabState() */ + +#define TTK_STATE_NOTEBOOK_FIRST TTK_STATE_USER1 +#define TTK_STATE_NOTEBOOK_LAST TTK_STATE_USER2 static Ttk_StateTable TabStyleTable[] = { - { kThemeTabFrontInactive, TTK_STATE_SELECTED|TTK_STATE_BACKGROUND, 0 }, - { kThemeTabNonFrontInactive, TTK_STATE_BACKGROUND, 0 }, - { kThemeTabFrontUnavailable, TTK_STATE_DISABLED|TTK_STATE_SELECTED, 0 }, - { kThemeTabNonFrontUnavailable, TTK_STATE_DISABLED, 0 }, - { kThemeTabFront, TTK_STATE_SELECTED, 0 }, - { kThemeTabNonFrontPressed, TTK_STATE_PRESSED, 0 }, - { kThemeTabNonFront, 0,0 } + { kThemeTabFrontInactive, TTK_STATE_SELECTED|TTK_STATE_BACKGROUND}, + { kThemeTabNonFrontInactive, TTK_STATE_BACKGROUND}, + { kThemeTabFrontUnavailable, TTK_STATE_DISABLED|TTK_STATE_SELECTED}, + { kThemeTabNonFrontUnavailable, TTK_STATE_DISABLED}, + { kThemeTabFront, TTK_STATE_SELECTED}, + { kThemeTabNonFrontPressed, TTK_STATE_PRESSED}, + { kThemeTabNonFront, 0} +}; + +static Ttk_StateTable TabAdornmentTable[] = { + { kHIThemeTabAdornmentNone, + TTK_STATE_NOTEBOOK_FIRST|TTK_STATE_NOTEBOOK_LAST}, + {kHIThemeTabAdornmentTrailingSeparator, TTK_STATE_NOTEBOOK_FIRST}, + {kHIThemeTabAdornmentNone, TTK_STATE_NOTEBOOK_LAST}, + {kHIThemeTabAdornmentTrailingSeparator, 0 }, +}; + +static Ttk_StateTable TabPositionTable[] = { + { kHIThemeTabPositionOnly, + TTK_STATE_NOTEBOOK_FIRST|TTK_STATE_NOTEBOOK_LAST}, + { kHIThemeTabPositionFirst, TTK_STATE_NOTEBOOK_FIRST}, + { kHIThemeTabPositionLast, TTK_STATE_NOTEBOOK_LAST}, + { kHIThemeTabPositionMiddle, 0 }, }; /* - * Quoth DrawThemeTab() reference manual: - * "Small tabs have a height of 16 pixels large tabs have a height of - * 21 pixels. (The widths of tabs are variable.) Additionally, the - * distance that the tab overlaps the pane must be included in the tab - * rectangle this overlap distance is always 3 pixels, although the - * 3-pixel overlap is only drawn for the front tab." + * Apple XHIG Tab View Specifications: + * + * Control sizes: Tab views are available in regular, small, and mini sizes. + * The tab height is fixed for each size, but you control the size of the pane + * area. The tab heights for each size are listed below: + * - Regular size: 20 pixels. + * - Small: 17 pixels. + * - Mini: 15 pixels. + * + * Label spacing and fonts: The tab labels should be in a font that’s + * proportional to the size of the tab view control. In addition, the label + * should be placed so that there are equal margins of space before and after + * it. The guidelines below provide the specifications you should use for tab + * labels: + * - Regular size: System font. Center in tab, leaving 12 pixels on each side. + * - Small: Small system font. Center in tab, leaving 10 pixels on each side. + * - Mini: Mini system font. Center in tab, leaving 8 pixels on each side. + * + * Control spacing: Whether you decide to inset a tab view in a window or + * extend its edges to the window sides and bottom, you should place the top + * edge of the tab view 12 or 14 pixels below the bottom edge of the title bar + * (or toolbar, if there is one). If you choose to inset a tab view in a + * window, you should leave a margin of 20 pixels between the sides and bottom + * of the tab view and the sides and bottom of the window (although 16 pixels + * is also an acceptable margin-width). If you need to provide controls below + * the tab view, leave enough space below the tab view so the controls are 20 + * pixels above the bottom edge of the window and 12 pixels between the tab + * view and the controls. + * If you choose to extend the tab view sides and bottom so that they meet the + * window sides and bottom, you should leave a margin of at least 20 pixels + * between the content in the tab view and the tab-view edges. + * + * <URL: http://developer.apple.com/documentation/userexperience/Conceptual/ + * AppleHIGuidelines/XHIGControls/XHIGControls.html#//apple_ref/doc/uid/ + * TP30000359-TPXREF116> */ -static const int TAB_HEIGHT = 21; -static const int TAB_OVERLAP = 3; + +static const int TAB_HEIGHT = 10; +static const int TAB_OVERLAP = 10; static void TabElementSize( void *clientData, void *elementRecord, Tk_Window tkwin, @@ -295,12 +310,20 @@ static void TabElementDraw( void *clientData, void *elementRecord, Tk_Window tkwin, Drawable d, Ttk_Box b, Ttk_State state) { - Rect bounds = BoxToRect(d, b); - ThemeTabStyle tabStyle = Ttk_StateTableLookup(TabStyleTable, state); - - bounds.bottom += TAB_OVERLAP; + CGRect bounds = BoxToRect(d, b); + HIThemeTabDrawInfo info = { + .version = 1, + .style = Ttk_StateTableLookup(TabStyleTable, state), + .direction = kThemeTabNorth, + .size = kHIThemeTabSizeNormal, + .adornment = Ttk_StateTableLookup(TabAdornmentTable, state), + .kind = kHIThemeTabKindNormal, + .position = Ttk_StateTableLookup(TabPositionTable, state), + }; + + bounds.size.height += TAB_OVERLAP; BEGIN_DRAWING(d) - ChkErr(DrawThemeTab, &bounds, tabStyle, kThemeTabNorth, 0, 0); + ChkErr(HIThemeDrawTab, &bounds, &info, dc.context, HIOrientation, NULL); END_DRAWING } @@ -319,19 +342,27 @@ static void PaneElementSize( void *clientData, void *elementRecord, Tk_Window tkwin, int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr) { - /* Padding determined by trial-and-error */ - *paddingPtr = Ttk_MakePadding(2, 8, 2, 2); + *paddingPtr = Ttk_MakePadding(9, 5, 9, 9); } static void PaneElementDraw( void *clientData, void *elementRecord, Tk_Window tkwin, Drawable d, Ttk_Box b, Ttk_State state) { - Rect bounds = BoxToRect(d, b); - ThemeDrawState drawState = Ttk_StateTableLookup(ThemeStateTable, state); - + CGRect bounds = BoxToRect(d, b); + HIThemeTabPaneDrawInfo info = { + .version = 1, + .state = Ttk_StateTableLookup(ThemeStateTable, state), + .direction = kThemeTabNorth, + .size = kHIThemeTabSizeNormal, + .kind = kHIThemeTabKindNormal, + .adornment = kHIThemeTabPaneAdornmentNormal, + }; + + bounds.origin.y -= TAB_OVERLAP; + bounds.size.height += TAB_OVERLAP; BEGIN_DRAWING(d) - ChkErr(DrawThemeTabPane, &bounds, drawState); + ChkErr(HIThemeDrawTabPane, &bounds, &info, dc.context, HIOrientation); END_DRAWING } @@ -364,11 +395,15 @@ static void GroupElementDraw( void *clientData, void *elementRecord, Tk_Window tkwin, Drawable d, Ttk_Box b, Ttk_State state) { - Rect bounds = BoxToRect(d, b); - ThemeDrawState drawState = Ttk_StateTableLookup(ThemeStateTable, state); + CGRect bounds = BoxToRect(d, b); + const HIThemeGroupBoxDrawInfo info = { + .version = 0, + .state = Ttk_StateTableLookup(ThemeStateTable, state), + .kind = kHIThemeGroupBoxKindPrimaryOpaque, + }; BEGIN_DRAWING(d) - ChkErr(DrawThemePrimaryGroup, &bounds, drawState); + ChkErr(HIThemeDrawGroupBox, &bounds, &info, dc.context, HIOrientation); END_DRAWING } @@ -410,8 +445,13 @@ static void EntryElementDraw( EntryElement *e = elementRecord; Tk_3DBorder backgroundPtr = Tk_Get3DBorderFromObj(tkwin,e->backgroundObj); Ttk_Box inner = Ttk_PadBox(b, Ttk_UniformPadding(3)); - Rect bounds = BoxToRect(d, inner); - ThemeDrawState drawState = Ttk_StateTableLookup(ThemeStateTable, state); + CGRect bounds = BoxToRect(d, inner); + const HIThemeFrameDrawInfo info = { + .version = 0, + .kind = kHIThemeFrameTextFieldSquare, + .state = Ttk_StateTableLookup(ThemeStateTable, state), + .isFocused = state & TTK_STATE_FOCUS, + }; /* * Erase w/background color: @@ -421,10 +461,10 @@ static void EntryElementDraw( inner.x,inner.y, inner.width, inner.height); BEGIN_DRAWING(d) - ChkErr(DrawThemeEditTextFrame, &bounds, drawState); - if (state & TTK_STATE_FOCUS) { + ChkErr(HIThemeDrawFrame, &bounds, &info, dc.context, HIOrientation); + /*if (state & TTK_STATE_FOCUS) { ChkErr(DrawThemeFocusRect, &bounds, 1); - } + }*/ END_DRAWING } @@ -460,13 +500,17 @@ static void ComboboxElementDraw( void *clientData, void *elementRecord, Tk_Window tkwin, Drawable d, Ttk_Box b, Ttk_State state) { - ThemeButtonParms *parms = clientData; - ThemeButtonDrawInfo info = computeButtonDrawInfo(parms, state); - Rect bounds = BoxToRect(d, Ttk_PadBox(b, ComboboxMargins)); + CGRect bounds = BoxToRect(d, Ttk_PadBox(b, ComboboxMargins)); + const HIThemeButtonDrawInfo info = { + .version = 0, + .state = Ttk_StateTableLookup(ThemeStateTable, state), + .kind = kThemeComboBox, + .value = Ttk_StateTableLookup(ButtonValueTable, state), + .adornment = Ttk_StateTableLookup(ButtonAdornmentTable, state), + }; BEGIN_DRAWING(d) - ChkErr(DrawThemeButton, - &bounds, kThemeComboBox, &info, NULL, NULL, NULL, 0); + ChkErr(HIThemeDrawButton, &bounds, &info, dc.context, HIOrientation, NULL); END_DRAWING } @@ -503,20 +547,20 @@ static void SpinButtonElementDraw( void *clientData, void *elementRecord, Tk_Window tkwin, Drawable d, Ttk_Box b, Ttk_State state) { - Rect bounds = BoxToRect(d, Ttk_PadBox(b, SpinbuttonMargins)); - ThemeButtonDrawInfo info; - + CGRect bounds = BoxToRect(d, Ttk_PadBox(b, SpinbuttonMargins)); /* @@@ can't currently distinguish PressedUp (== Pressed) from PressedDown; * ignore this bit for now [see #2219588] */ - info.state = Ttk_StateTableLookup(ThemeStateTable, - state & ~TTK_STATE_PRESSED); - info.value = Ttk_StateTableLookup(ButtonValueTable, state); - info.adornment = kThemeAdornmentNone; + const HIThemeButtonDrawInfo info = { + .version = 0, + .state = Ttk_StateTableLookup(ThemeStateTable, state & ~TTK_STATE_PRESSED), + .kind = kThemeIncDecButton, + .value = Ttk_StateTableLookup(ButtonValueTable, state), + .adornment = kThemeAdornmentNone, + }; BEGIN_DRAWING(d) - ChkErr(DrawThemeButton, - &bounds, kThemeIncDecButton, &info, NULL, NULL, NULL, 0); + ChkErr(HIThemeDrawButton, &bounds, &info, dc.context, HIOrientation, NULL); END_DRAWING } @@ -582,40 +626,37 @@ static void TrackElementDraw( { TrackElementData *data = clientData; TrackElement *elem = elementRecord; - double from = 0, to = 100, value = 0, factor; int orientation = TTK_ORIENT_HORIZONTAL; - ThemeTrackDrawInfo info; + double from = 0, to = 100, value = 0, factor; + Ttk_GetOrientFromObj(NULL, elem->orientObj, &orientation); Tcl_GetDoubleFromObj(NULL, elem->fromObj, &from); Tcl_GetDoubleFromObj(NULL, elem->toObj, &to); Tcl_GetDoubleFromObj(NULL, elem->valueObj, &value); - Ttk_GetOrientFromObj(NULL, elem->orientObj, &orientation); factor = RangeToFactor(to - from); - info.kind = data->kind; - info.bounds = BoxToRect(d, b); - info.min = (int) from * factor; - info.max = (int) to * factor; - info.value = (int) value * factor; - - info.attributes = orientation == TTK_ORIENT_HORIZONTAL - ? kThemeTrackHorizontal : 0; - info.attributes |= kThemeTrackShowThumb; - info.enableState = Ttk_StateTableLookup(ThemeTrackEnableTable, state); - - switch (data->kind) { - case kThemeProgressBar: - info.trackInfo.progress.phase = 0; /* 1-4: animation phase */ - break; - case kThemeSlider: - info.trackInfo.slider.pressState = 0; /* @@@ fill this in */ - info.trackInfo.slider.thumbDir = kThemeThumbPlain; - /* kThemeThumbUpward, kThemeThumbDownward, kThemeThumbPlain */ - break; + HIThemeTrackDrawInfo info = { + .version = 0, + .kind = data->kind, + .bounds = BoxToRect(d, b), + .min = from * factor, + .max = to * factor, + .value = value * factor, + .attributes = kThemeTrackShowThumb | + (orientation == TTK_ORIENT_HORIZONTAL ? + kThemeTrackHorizontal : 0), + .enableState = Ttk_StateTableLookup(ThemeTrackEnableTable, state), + .trackInfo.progress.phase = 0, + }; + + if (info.kind == kThemeSlider) { + info.trackInfo.slider.pressState = state & TTK_STATE_PRESSED ? + kThemeThumbPressed : 0; + info.trackInfo.slider.thumbDir = kThemeThumbPlain; } BEGIN_DRAWING(d) - ChkErr(DrawThemeTrack, &info, NULL, NULL, 0); + ChkErr(HIThemeDrawTrack, &info, NULL, dc.context, HIOrientation); END_DRAWING } @@ -697,10 +738,8 @@ static void PbarElementDraw( Drawable d, Ttk_Box b, Ttk_State state) { PbarElement *pbar = elementRecord; - int orientation = TTK_ORIENT_HORIZONTAL; + int orientation = TTK_ORIENT_HORIZONTAL, phase = 0; double value = 0, maximum = 100, factor; - int phase = 0; - ThemeTrackDrawInfo info; Ttk_GetOrientFromObj(NULL, pbar->orientObj, &orientation); Tcl_GetDoubleFromObj(NULL, pbar->valueObj, &value); @@ -708,23 +747,23 @@ static void PbarElementDraw( Tcl_GetIntFromObj(NULL, pbar->phaseObj, &phase); factor = RangeToFactor(maximum); - if (!strcmp("indeterminate", Tcl_GetString(pbar->modeObj)) && value) { - info.kind = kThemeIndeterminateBar; - } else { - info.kind = kThemeProgressBar; - } - info.bounds = BoxToRect(d, b); - info.min = 0; - info.max = (int) maximum * factor; - info.value = (int) value * factor; - info.attributes = orientation == TTK_ORIENT_HORIZONTAL - ? kThemeTrackHorizontal : 0; - info.attributes |= kThemeTrackShowThumb; - info.enableState = Ttk_StateTableLookup(ThemeTrackEnableTable, state); - info.trackInfo.progress.phase = phase; + HIThemeTrackDrawInfo info = { + .version = 0, + .kind = (!strcmp("indeterminate", Tcl_GetString(pbar->modeObj)) && value) ? + kThemeIndeterminateBar : kThemeProgressBar, + .bounds = BoxToRect(d, b), + .min = 0, + .max = maximum * factor, + .value = value * factor, + .attributes = kThemeTrackShowThumb | + (orientation == TTK_ORIENT_HORIZONTAL ? + kThemeTrackHorizontal : 0), + .enableState = Ttk_StateTableLookup(ThemeTrackEnableTable, state), + .trackInfo.progress.phase = phase, + }; BEGIN_DRAWING(d) - ChkErr(DrawThemeTrack, &info, NULL, NULL, 0); + ChkErr(HIThemeDrawTrack, &info, NULL, dc.context, HIOrientation); END_DRAWING } @@ -755,16 +794,15 @@ static void SeparatorElementDraw( void *clientData, void *elementRecord, Tk_Window tkwin, Drawable d, Ttk_Box b, unsigned int state) { - Rect bounds = BoxToRect(d, b); - ThemeDrawState drawState; + CGRect bounds = BoxToRect(d, b); + const HIThemeSeparatorDrawInfo info = { + .version = 0, + /* Separator only supports kThemeStateActive, kThemeStateInactive */ + .state = Ttk_StateTableLookup(ThemeStateTable, state & TTK_STATE_BACKGROUND), + }; - /* - * DrawThemeSeparator only supports kThemeStateActive / kThemeStateInactive - */ - state &= TTK_STATE_BACKGROUND; - drawState = Ttk_StateTableLookup(ThemeStateTable, state); BEGIN_DRAWING(d) - ChkErr(DrawThemeSeparator, &bounds, drawState); + ChkErr(HIThemeDrawSeparator, &bounds, &info, dc.context, HIOrientation); END_DRAWING } @@ -786,29 +824,36 @@ static void SizegripElementSize( void *clientData, void *elementRecord, Tk_Window tkwin, int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr) { - Point origin = {0, 0}; - Rect bounds; - - ChkErr(GetThemeStandaloneGrowBoxBounds, - origin, sizegripGrowDirection, false, &bounds); - *widthPtr = bounds.right - bounds.left; - *heightPtr = bounds.bottom - bounds.top; + HIThemeGrowBoxDrawInfo info = { + .version = 0, + .state = kThemeStateActive, + .kind = kHIThemeGrowBoxKindNormal, + .direction = sizegripGrowDirection, + .size = kHIThemeGrowBoxSizeNormal, + }; + CGRect bounds = CGRectZero; + + ChkErr(HIThemeGetGrowBoxBounds, &bounds.origin, &info, &bounds); + *widthPtr = bounds.size.width; + *heightPtr = bounds.size.height; } static void SizegripElementDraw( void *clientData, void *elementRecord, Tk_Window tkwin, Drawable d, Ttk_Box b, unsigned int state) { - Rect bounds = BoxToRect(d, b); - Point origin = {bounds.top, bounds.left}; - - /* Grow box only supports kThemeStateActive, kThemeStateInactive */ - state &= TTK_STATE_BACKGROUND; + CGRect bounds = BoxToRect(d, b); + HIThemeGrowBoxDrawInfo info = { + .version = 0, + /* Grow box only supports kThemeStateActive, kThemeStateInactive */ + .state = Ttk_StateTableLookup(ThemeStateTable, state & TTK_STATE_BACKGROUND), + .kind = kHIThemeGrowBoxKindNormal, + .direction = sizegripGrowDirection, + .size = kHIThemeGrowBoxSizeNormal, + }; BEGIN_DRAWING(d) - ChkErr(DrawThemeStandaloneGrowBox, - origin, sizegripGrowDirection, false, - Ttk_StateTableLookup(ThemeStateTable, state)); + ChkErr(HIThemeDrawGrowBox, &bounds.origin, &info, dc.context, HIOrientation); END_DRAWING } @@ -836,15 +881,15 @@ static void FillElementDraw( void *clientData, void *elementRecord, Tk_Window tkwin, Drawable d, Ttk_Box b, Ttk_State state) { - Rect bounds = BoxToRect(d, b); + CGRect bounds = BoxToRect(d, b); ThemeBrush brush = (state & TTK_STATE_BACKGROUND) ? kThemeBrushModelessDialogBackgroundInactive : kThemeBrushModelessDialogBackgroundActive; BEGIN_DRAWING(d) - ChkErr(SetThemeBackground, brush, 32, true); - QDSetPatternOrigin(PatternOrigin(tkwin, d)); - EraseRect(&bounds); + ChkErr(HIThemeSetFill, brush, NULL, dc.context, HIOrientation); + //QDSetPatternOrigin(PatternOrigin(tkwin, d)); + CGContextFillRect(dc.context, bounds); END_DRAWING } @@ -891,12 +936,12 @@ static void ToolbarBackgroundElementDraw( Drawable d, Ttk_Box b, Ttk_State state) { ThemeBrush brush = kThemeBrushToolbarBackground; - Rect bounds = BoxToRect(d, Ttk_WinBox(tkwin)); + CGRect bounds = BoxToRect(d, Ttk_WinBox(tkwin)); BEGIN_DRAWING(d) - ChkErr(SetThemeBackground, brush, 32, true); - QDSetPatternOrigin(PatternOrigin(tkwin, d)); - EraseRect(&bounds); + ChkErr(HIThemeSetFill, brush, NULL, dc.context, HIOrientation); + //QDSetPatternOrigin(PatternOrigin(tkwin, d)); + CGContextFillRect(dc.context, bounds); END_DRAWING } @@ -913,26 +958,39 @@ static Ttk_ElementSpec ToolbarBackgroundElementSpec = { * Redefine the header to use a kThemeListHeaderButton. */ +#define TTK_TREEVIEW_STATE_SORTARROW TTK_STATE_USER1 +static Ttk_StateTable TreeHeaderValueTable[] = { + { kThemeButtonOn, TTK_STATE_ALTERNATE}, + { kThemeButtonOn, TTK_STATE_SELECTED}, + { kThemeButtonOff, 0} +}; static Ttk_StateTable TreeHeaderAdornmentTable[] = { - { kThemeAdornmentHeaderButtonSortUp, TTK_STATE_ALTERNATE, 0 }, - { kThemeAdornmentFocus, TTK_STATE_FOCUS, 0 }, - { kThemeAdornmentNone, 0, 0 } + { kThemeAdornmentHeaderButtonSortUp, + TTK_STATE_ALTERNATE|TTK_TREEVIEW_STATE_SORTARROW}, + { kThemeAdornmentDefault, + TTK_STATE_SELECTED|TTK_TREEVIEW_STATE_SORTARROW}, + { kThemeAdornmentHeaderButtonNoSortArrow, TTK_STATE_ALTERNATE}, + { kThemeAdornmentHeaderButtonNoSortArrow, TTK_STATE_SELECTED}, + { kThemeAdornmentFocus, TTK_STATE_FOCUS}, + { kThemeAdornmentNone, 0} }; static void TreeHeaderElementDraw( void *clientData, void *elementRecord, Tk_Window tkwin, Drawable d, Ttk_Box b, Ttk_State state) { - ThemeButtonParms *parms = clientData; - Rect bounds = BoxToRect(d, b); - ThemeButtonDrawInfo info; - - info.state = Ttk_StateTableLookup(ThemeStateTable, state); - info.value = Ttk_StateTableLookup(ButtonValueTable, state); - info.adornment = Ttk_StateTableLookup(TreeHeaderAdornmentTable, state); + ThemeButtonParams *params = clientData; + CGRect bounds = BoxToRect(d, b); + const HIThemeButtonDrawInfo info = { + .version = 0, + .state = Ttk_StateTableLookup(ThemeStateTable, state), + .kind = params->kind, + .value = Ttk_StateTableLookup(TreeHeaderValueTable, state), + .adornment = Ttk_StateTableLookup(TreeHeaderAdornmentTable, state), + }; BEGIN_DRAWING(d) - ChkErr(DrawThemeButton, &bounds, parms->kind, &info, NULL, NULL, NULL, 0); + ChkErr(HIThemeDrawButton, &bounds, &info, dc.context, HIOrientation, NULL); END_DRAWING } @@ -947,8 +1005,8 @@ static Ttk_ElementSpec TreeHeaderElementSpec = { /* * Disclosure triangle: */ -#define TTK_TREEVIEW_STATE_OPEN TTK_STATE_USER1 -#define TTK_TREEVIEW_STATE_LEAF TTK_STATE_USER2 +#define TTK_TREEVIEW_STATE_OPEN TTK_STATE_USER1 +#define TTK_TREEVIEW_STATE_LEAF TTK_STATE_USER2 static Ttk_StateTable DisclosureValueTable[] = { { kThemeDisclosureDown, TTK_TREEVIEW_STATE_OPEN, 0 }, { kThemeDisclosureRight, 0, 0 }, @@ -970,21 +1028,20 @@ static void DisclosureElementDraw( void *clientData, void *elementRecord, Tk_Window tkwin, Drawable d, Ttk_Box b, Ttk_State state) { - Rect bounds = BoxToRect(d, b); - ThemeButtonDrawInfo info; - - if (state & TTK_TREEVIEW_STATE_LEAF) { - return; + if (!(state & TTK_TREEVIEW_STATE_LEAF)) { + CGRect bounds = BoxToRect(d, b); + const HIThemeButtonDrawInfo info = { + .version = 0, + .state = Ttk_StateTableLookup(ThemeStateTable, state), + .kind = kThemeDisclosureTriangle, + .value = Ttk_StateTableLookup(DisclosureValueTable, state), + .adornment = kThemeAdornmentDrawIndicatorOnly, + }; + + BEGIN_DRAWING(d) + ChkErr(HIThemeDrawButton, &bounds, &info, dc.context, HIOrientation, NULL); + END_DRAWING } - - info.state = Ttk_StateTableLookup(ThemeStateTable, state); - info.value = Ttk_StateTableLookup(DisclosureValueTable, state); - info.adornment = kThemeAdornmentDrawIndicatorOnly; - - BEGIN_DRAWING(d) - ChkErr(DrawThemeButton, - &bounds, kThemeDisclosureTriangle, &info, NULL, DontErase, NULL, 0); - END_DRAWING } static Ttk_ElementSpec DisclosureElementSpec = { @@ -1080,23 +1137,23 @@ static int AquaTheme_Init(Tcl_Interp *interp) &ToolbarBackgroundElementSpec, 0); Ttk_RegisterElementSpec(themePtr, "Button.button", - &ButtonElementSpec, &PushButtonParms); + &ButtonElementSpec, &PushButtonParams); Ttk_RegisterElementSpec(themePtr, "Checkbutton.button", - &ButtonElementSpec, &CheckBoxParms); + &ButtonElementSpec, &CheckBoxParams); Ttk_RegisterElementSpec(themePtr, "Radiobutton.button", - &ButtonElementSpec, &RadioButtonParms); + &ButtonElementSpec, &RadioButtonParams); Ttk_RegisterElementSpec(themePtr, "Toolbutton.border", - &ButtonElementSpec, &BevelButtonParms); + &ButtonElementSpec, &BevelButtonParams); Ttk_RegisterElementSpec(themePtr, "Menubutton.button", - &ButtonElementSpec, &PopupButtonParms); + &ButtonElementSpec, &PopupButtonParams); Ttk_RegisterElementSpec(themePtr, "Spinbox.spinbutton", &SpinButtonElementSpec, 0); Ttk_RegisterElementSpec(themePtr, "Combobox.button", &ComboboxElementSpec, 0); Ttk_RegisterElementSpec(themePtr, "Treeitem.indicator", - &DisclosureElementSpec, &DisclosureParms); + &DisclosureElementSpec, &DisclosureParams); Ttk_RegisterElementSpec(themePtr, "Treeheading.cell", - &TreeHeaderElementSpec, &ListHeaderParms); + &TreeHeaderElementSpec, &ListHeaderParams); Ttk_RegisterElementSpec(themePtr, "Notebook.tab", &TabElementSpec, 0); Ttk_RegisterElementSpec(themePtr, "Notebook.client", &PaneElementSpec, 0); @@ -1136,4 +1193,13 @@ int Ttk_MacOSXPlatformInit(Tcl_Interp *interp) { return AquaTheme_Init(interp); } + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 79 + * coding: utf-8 + * End: + */ |