diff options
Diffstat (limited to 'generic/ttk/ttkNotebook.c')
-rw-r--r-- | generic/ttk/ttkNotebook.c | 103 |
1 files changed, 73 insertions, 30 deletions
diff --git a/generic/ttk/ttkNotebook.c b/generic/ttk/ttkNotebook.c index 2304774..c97c30e 100644 --- a/generic/ttk/ttkNotebook.c +++ b/generic/ttk/ttkNotebook.c @@ -1,8 +1,5 @@ -/* $Id: ttkNotebook.c,v 1.10 2007/10/25 22:52:41 jenglish Exp $ +/* $Id: ttkNotebook.c,v 1.11 2007/11/25 18:11:12 jenglish Exp $ * Copyright (c) 2004, Joe English - * - * NOTE-ACTIVE: activeTabIndex is not always correct (it's - * more trouble than it's worth to track this 100%) */ #include <string.h> @@ -645,35 +642,36 @@ static int NextTab(Notebook *nb, int index) /* SelectNearestTab -- * Handles the case where the current tab is forgotten, hidden, - * or destroyed. Select the next available tab; or, if there is none, - * leaves all tabs unselected. + * or destroyed. + * + * Unmap the current tab and schedule the next available one + * to be mapped at the next GM update. */ static void SelectNearestTab(Notebook *nb) { - int nextIndex = NextTab(nb, nb->notebook.currentIndex); + int currentIndex = nb->notebook.currentIndex; + int nextIndex = NextTab(nb, currentIndex); - if (nextIndex >= 0) { - SelectTab(nb, nextIndex); - } else { - /* No available tabs -- unmap current one. - * ASSERT: this is safe to do even when the slave is being destroyed. - */ - if (nb->notebook.currentIndex >= 0) { - Ttk_UnmapSlave(nb->notebook.mgr, nb->notebook.currentIndex); - TtkSendVirtualEvent(nb->core.tkwin, "NotebookTabChanged"); - } - nb->notebook.currentIndex = -1; + if (currentIndex >= 0) { + Ttk_UnmapSlave(nb->notebook.mgr, currentIndex); + } + if (currentIndex != nextIndex) { + TtkSendVirtualEvent(nb->core.tkwin, "NotebookTabChanged"); } + + nb->notebook.currentIndex = nextIndex; + Ttk_ManagerLayoutChanged(nb->notebook.mgr); + TtkRedisplayWidget(&nb->core); } /* TabRemoved -- GM SlaveRemoved hook. * Select the next tab if the current one is being removed. * Adjust currentIndex to account for removed slave. */ -static void TabRemoved(Ttk_Manager *mgr, int index) +static void TabRemoved(void *managerData, int index) { - Notebook *nb = Ttk_ManagerData(mgr); - Tab *tab = Ttk_SlaveData(mgr, index); + Notebook *nb = managerData; + Tab *tab = Ttk_SlaveData(nb->notebook.mgr, index); if (index == nb->notebook.currentIndex) { SelectNearestTab(nb); @@ -688,6 +686,11 @@ static void TabRemoved(Ttk_Manager *mgr, int index) TtkRedisplayWidget(&nb->core); } +static int TabRequest(void *managerData, int index, int width, int height) +{ + return 1; +} + /* AddTab -- * Add new tab at specified index. */ @@ -700,12 +703,14 @@ static int AddTab( if (!Ttk_Maintainable(interp, slaveWindow, nb->core.tkwin)) { return TCL_ERROR; } +#if 0 /* can't happen */ if (Ttk_SlaveIndex(nb->notebook.mgr, slaveWindow) >= 0) { Tcl_AppendResult(interp, Tk_PathName(slaveWindow), " already added", NULL); return TCL_ERROR; } +#endif /* Create and insert tab. */ @@ -731,12 +736,12 @@ static int AddTab( return TCL_OK; } -static Ttk_ManagerSpec NotebookManagerSpec = -{ +static Ttk_ManagerSpec NotebookManagerSpec = { { "notebook", Ttk_GeometryRequestProc, Ttk_LostSlaveProc }, NotebookSize, NotebookPlaceSlaves, - TabRemoved, + TabRequest, + TabRemoved }; /*------------------------------------------------------------------------ @@ -853,6 +858,8 @@ static int NotebookAddCommand( Notebook *nb = recordPtr; int index = Ttk_NumberSlaves(nb->notebook.mgr); Tk_Window slaveWindow; + int slaveIndex; + Tab *tab; if (objc <= 2 || objc % 2 != 1) { Tcl_WrongNumArgs(interp, 2, objv, "window ?options...?"); @@ -863,14 +870,21 @@ static int NotebookAddCommand( if (!slaveWindow) { return TCL_ERROR; } + slaveIndex = Ttk_SlaveIndex(nb->notebook.mgr, slaveWindow); - /* Create and initialize new tab: - */ - if (AddTab(interp, nb, index, slaveWindow, objc-3,objv+3) != TCL_OK) { + if (slaveIndex < 0) { /* New tab */ + return AddTab(interp, nb, index, slaveWindow, objc-3,objv+3); + } + + tab = Ttk_SlaveData(nb->notebook.mgr, slaveIndex); + if (tab->state == TAB_STATE_HIDDEN) { + tab->state = TAB_STATE_NORMAL; + } + if (ConfigureTab(interp, nb, tab, slaveWindow, objc-4,objv+4) != TCL_OK) { return TCL_ERROR; } - TtkResizeWidget(&nb->core); + TtkRedisplayWidget(&nb->core); return TCL_OK; } @@ -949,8 +963,8 @@ static int NotebookInsertCommand( return TCL_OK; } -/* $nb forget $item -- - * Removes the selected tab. +/* $nb forget $tab -- + * Removes the specified tab. */ static int NotebookForgetCommand( Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], void *recordPtr) @@ -972,6 +986,34 @@ static int NotebookForgetCommand( return TCL_OK; } +/* $nb hide $tab -- + * Hides the specified tab. + */ +static int NotebookHideCommand( + Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], void *recordPtr) +{ + Notebook *nb = recordPtr; + int index; + Tab *tab; + + if (objc != 3) { + Tcl_WrongNumArgs(interp, 2, objv, "tab"); + return TCL_ERROR; + } + + if (GetTabIndex(interp, nb, objv[2], &index) != TCL_OK) { + return TCL_ERROR; + } + + tab = Ttk_SlaveData(nb->notebook.mgr, index); + tab->state = TAB_STATE_HIDDEN; + if (index == nb->notebook.currentIndex) { + SelectNearestTab(nb); + } + + return TCL_OK; +} + /* $nb identify $x $y -- * Returns name of tab element at $x,$y; empty string if none. */ @@ -1153,6 +1195,7 @@ static WidgetCommandSpec NotebookCommands[] = { "configure", TtkWidgetConfigureCommand }, { "cget", TtkWidgetCgetCommand }, { "forget", NotebookForgetCommand }, + { "hide", NotebookHideCommand }, { "identify", NotebookIdentifyCommand }, { "index", NotebookIndexCommand }, { "insert", NotebookInsertCommand }, |