Tcl-Tk-Tkwidget-treectrl
view release on metacpan or search on metacpan
generic/tkTreeTheme.c view on Meta::CPAN
* tkTreeTheme.c --
*
* This module implements visual themes.
*
* Copyright (c) 2005-2011 Tim Baker
*/
#ifdef USE_TTK
#include "tkTreeCtrl.h"
#include "ttk/ttkTheme.h"
#include "ttk/ttk-extra.h"
typedef struct TreeThemeData_
{
Ttk_Layout layout;
Ttk_Layout buttonLayout;
Ttk_Layout headingLayout;
Tk_OptionTable buttonOptionTable;
Tk_OptionTable headingOptionTable;
Ttk_Box clientBox;
int buttonWidth[2], buttonHeight[2];
Ttk_Padding buttonPadding[2];
} TreeThemeData_;
int TreeTheme_DrawHeaderItem(TreeCtrl *tree, Drawable drawable, int state,
int arrow, int visIndex, int x, int y, int width, int height)
{
TreeThemeData themeData = tree->themeData;
Ttk_Layout layout = themeData->headingLayout;
Ttk_State ttk_state = 0;
Ttk_Box box;
if (layout == NULL)
return TCL_ERROR;
box = Ttk_MakeBox(x, y, width, height);
switch (state) {
case COLUMN_STATE_ACTIVE: ttk_state = TTK_STATE_ACTIVE; break;
case COLUMN_STATE_PRESSED: ttk_state = TTK_STATE_PRESSED; break;
}
eTtk_RebindSublayout(layout, NULL); /* !!! rebind to column */
eTtk_PlaceLayout(layout, ttk_state, box);
eTtk_DrawLayout(layout, ttk_state, drawable);
return TCL_OK;
}
int TreeTheme_GetHeaderContentMargins(TreeCtrl *tree, int state, int arrow, int bounds[4])
{
return TCL_ERROR;
}
int TreeTheme_DrawHeaderArrow(TreeCtrl *tree, Drawable drawable, int state, int up, int x, int y, int width, int height)
{
return TCL_ERROR;
}
/* From ttkTreeview.c */
#define TTK_STATE_OPEN TTK_STATE_USER1
int TreeTheme_DrawButton(TreeCtrl *tree, Drawable drawable, int open, int x, int y, int width, int height)
{
TreeThemeData themeData = tree->themeData;
Ttk_Layout layout = themeData->buttonLayout;
Ttk_State ttk_state = 0;
Ttk_Box box;
Ttk_Padding padding;
if (layout == NULL)
return TCL_ERROR;
open = open ? 1 : 0;
padding = themeData->buttonPadding[open];
x -= padding.left;
y -= padding.top;
width = themeData->buttonWidth[open];
height = themeData->buttonHeight[open];
box = Ttk_MakeBox(x, y, width, height);
ttk_state = open ? TTK_STATE_OPEN : 0;
eTtk_RebindSublayout(layout, NULL); /* !!! rebind to item */
eTtk_PlaceLayout(layout, ttk_state, box);
eTtk_DrawLayout(layout, ttk_state, drawable);
return TCL_OK;
}
int TreeTheme_GetButtonSize(TreeCtrl *tree, Drawable drawable, int open, int *widthPtr, int *heightPtr)
{
TreeThemeData themeData = tree->themeData;
Ttk_Padding padding;
if (themeData->buttonLayout == NULL)
return TCL_ERROR;
open = open ? 1 : 0;
padding = themeData->buttonPadding[open];
*widthPtr = themeData->buttonWidth[open] - padding.left - padding.right;
*heightPtr = themeData->buttonHeight[open] - padding.top - padding.bottom;
return TCL_OK;
}
int TreeTheme_GetArrowSize(TreeCtrl *tree, Drawable drawable, int up, int *widthPtr, int *heightPtr)
{
return TCL_ERROR;
}
int TreeTheme_SetBorders(TreeCtrl *tree)
{
TreeThemeData themeData = tree->themeData;
Tk_Window tkwin = tree->tkwin;
Ttk_Box clientBox = themeData->clientBox;
tree->inset.left = clientBox.x;
tree->inset.top = clientBox.y;
tree->inset.right = Tk_Width(tkwin) - (clientBox.x + clientBox.width);
tree->inset.bottom = Tk_Height(tkwin) - (clientBox.y + clientBox.height);
generic/tkTreeTheme.c view on Meta::CPAN
if (top > 0 || bottom > 0) {
pixmapTB = Tk_GetPixmap(tree->display, Tk_WindowId(tkwin),
Tk_Width(tkwin), MAX(top, bottom), Tk_Depth(tkwin));
}
/* DebugDrawBorder(tree, 0, left, top, right, bottom);*/
if (left > 0) {
eTtk_DrawLayout(themeData->layout, state, pixmapLR);
XCopyArea(tree->display, pixmapLR, drawable,
tree->copyGC, 0, 0,
left, Tk_Height(tkwin),
0, 0);
}
if (top > 0) {
eTtk_DrawLayout(themeData->layout, state, pixmapTB);
XCopyArea(tree->display, pixmapTB, drawable,
tree->copyGC, 0, 0,
Tk_Width(tkwin), top,
0, 0);
}
if (right > 0) {
winBox.x -= winBox.width - right;
eTtk_PlaceLayout(themeData->layout, state, winBox);
eTtk_DrawLayout(themeData->layout, state, pixmapLR);
XCopyArea(tree->display, pixmapLR, drawable,
tree->copyGC, 0, 0,
right, Tk_Height(tkwin),
Tree_BorderRight(tree), 0);
}
if (bottom > 0) {
winBox.x = 0;
winBox.y -= winBox.height - bottom;
eTtk_PlaceLayout(themeData->layout, state, winBox);
eTtk_DrawLayout(themeData->layout, state, pixmapTB);
XCopyArea(tree->display, pixmapTB, drawable,
tree->copyGC, 0, 0,
Tk_Width(tkwin), bottom,
0, Tree_BorderBottom(tree));
}
if (pixmapLR != None)
Tk_FreePixmap(tree->display, pixmapLR);
if (pixmapTB != None)
Tk_FreePixmap(tree->display, pixmapTB);
return TCL_OK;
}
static Tk_OptionSpec NullOptionSpecs[] =
{
{TK_OPTION_END, 0,0,0, NULL, -1,-1, 0,0,0}
};
/* from ttkTreeview.c */
static Ttk_Layout
GetSublayout(
Tcl_Interp *interp,
Ttk_Theme themePtr,
Ttk_Layout parentLayout,
const char *layoutName,
Tk_OptionTable optionTable,
Ttk_Layout *layoutPtr)
{
Ttk_Layout newLayout = eTtk_CreateSublayout(
interp, themePtr, parentLayout, layoutName, optionTable);
if (newLayout) {
if (*layoutPtr)
eTtk_FreeLayout(*layoutPtr);
*layoutPtr = newLayout;
}
return newLayout;
}
Ttk_Layout
TreeCtrlGetLayout(
Tcl_Interp *interp,
Ttk_Theme themePtr,
void *recordPtr
)
{
TreeCtrl *tree = recordPtr;
TreeThemeData themeData = tree->themeData;
Ttk_Layout treeLayout, newLayout;
if (themeData->headingOptionTable == NULL)
themeData->headingOptionTable = Tk_CreateOptionTable(interp, NullOptionSpecs);
if (themeData->buttonOptionTable == NULL)
themeData->buttonOptionTable = Tk_CreateOptionTable(interp, NullOptionSpecs);
/* Create a new layout record based on widget -style or class */
treeLayout = eTtk_CreateLayout(interp, themePtr, "TreeCtrl", tree,
tree->optionTable, tree->tkwin);
/* Create a sublayout for drawing the column headers. The sublayout is
* called "TreeCtrl.TreeCtrlHeading" by default. The actual layout specification
* was defined by Ttk_RegisterLayout("TreeCtrlHeading") below. */
newLayout = GetSublayout(interp, themePtr, treeLayout,
".TreeCtrlHeading", themeData->headingOptionTable,
&themeData->headingLayout);
if (newLayout == NULL)
return NULL;
newLayout = GetSublayout(interp, themePtr, treeLayout,
".TreeCtrlButton", themeData->buttonOptionTable,
&themeData->buttonLayout);
if (newLayout == NULL)
return NULL;
return treeLayout;
}
void
TreeCtrlDoLayout(
generic/tkTreeTheme.c view on Meta::CPAN
}
static Ttk_ElementSpec TreeitemIndicatorElementSpec =
{
TK_STYLE_VERSION_2,
sizeof(TreeitemIndicator),
TreeitemIndicatorOptions,
TreeitemIndicatorSize,
TreeitemIndicatorDraw
};
TTK_BEGIN_LAYOUT(HeadingLayout)
TTK_NODE("Treeheading.cell", TTK_FILL_BOTH)
TTK_NODE("Treeheading.border", TTK_FILL_BOTH)
TTK_END_LAYOUT
TTK_BEGIN_LAYOUT(ButtonLayout)
TTK_NODE("Treeitem.indicator", TTK_PACK_LEFT)
TTK_END_LAYOUT
TTK_BEGIN_LAYOUT(TreeCtrlLayout)
TTK_GROUP("TreeCtrl.field", TTK_FILL_BOTH|TTK_BORDER,
TTK_GROUP("TreeCtrl.padding", TTK_FILL_BOTH,
TTK_NODE("TreeCtrl.client", TTK_FILL_BOTH)))
TTK_END_LAYOUT
void TreeTheme_ThemeChanged(TreeCtrl *tree)
{
}
int TreeTheme_InitWidget(TreeCtrl *tree)
{
tree->themeData = (TreeThemeData) ckalloc(sizeof(TreeThemeData_));
memset(tree->themeData, '\0', sizeof(TreeThemeData_));
return TCL_OK;
}
int TreeTheme_FreeWidget(TreeCtrl *tree)
{
TreeThemeData themeData = tree->themeData;
if (themeData != NULL) {
if (themeData->layout != NULL)
eTtk_FreeLayout(themeData->layout);
if (themeData->buttonLayout != NULL)
eTtk_FreeLayout(themeData->buttonLayout);
if (themeData->headingLayout != NULL)
eTtk_FreeLayout(themeData->headingLayout);
ckfree((char *) themeData);
}
return TCL_OK;
}
int TreeTheme_InitInterp(Tcl_Interp *interp)
{
Ttk_Theme theme = Ttk_GetDefaultTheme(interp);
Ttk_RegisterLayout(theme, "TreeCtrl", TreeCtrlLayout);
/* Problem: what if Treeview also defines this? */
Ttk_RegisterElement(interp, theme, "Treeheading.cell", &HeaderElementSpec, 0);
/* Problem: what if Treeview also defines this? */
Ttk_RegisterElement(interp, theme, "Treeitem.indicator", &TreeitemIndicatorElementSpec, 0);
Ttk_RegisterLayout(theme, "TreeCtrlHeading", HeadingLayout);
Ttk_RegisterLayout(theme, "TreeCtrlButton", ButtonLayout);
return TCL_OK;
}
#endif /* USE_TTK */
( run in 2.186 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )