2011-02-23 10:52:22 +00:00
/*
2010-03-21 01:14:04 +00:00
* $ Id $
2009-04-27 13:55:38 +00:00
*
* * * * * * BEGIN GPL LICENSE BLOCK * * * * *
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software Foundation ,
2010-02-12 13:34:04 +00:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
2009-04-27 13:55:38 +00:00
*
* The Original Code is Copyright ( C ) 2009 Blender Foundation .
* All rights reserved .
*
*
* Contributor ( s ) : Blender Foundation
*
* * * * * * END GPL LICENSE BLOCK * * * * *
*/
2011-02-27 20:29:51 +00:00
/** \file blender/editors/space_view3d/view3d_toolbar.c
* \ ingroup spview3d
*/
2009-04-27 13:55:38 +00:00
# include <string.h>
# include <stdio.h>
# include <math.h>
# include <float.h>
# include "DNA_object_types.h"
# include "DNA_scene_types.h"
# include "MEM_guardedalloc.h"
2009-11-10 20:43:45 +00:00
# include "BLI_math.h"
2009-04-27 13:55:38 +00:00
# include "BLI_blenlib.h"
# include "BLI_editVert.h"
# include "BLI_rand.h"
2011-01-07 18:36:47 +00:00
# include "BLI_utildefines.h"
2011-08-11 06:06:17 +00:00
# include "BLI_ghash.h"
2009-04-27 13:55:38 +00:00
2011-09-20 07:39:25 +00:00
# include "BLF_translation.h"
2011-06-15 11:41:15 +00:00
2009-04-27 13:55:38 +00:00
# include "BKE_context.h"
# include "BKE_idprop.h"
# include "BKE_global.h"
# include "BKE_screen.h"
# include "WM_api.h"
# include "WM_types.h"
# include "RNA_access.h"
# include "ED_screen.h"
# include "ED_util.h"
# include "UI_interface.h"
# include "UI_resources.h"
# include "view3d_intern.h" // own include
/* ******************* view3d space & buttons ************** */
2.5
Operator goodies!
--- Macro operators
Operators now can consist of multiple operators. Such a macro operator
is identical and behaves identical to other opererators. Macros can
also be constructed of macros even! Currently only hardcoded macros are
implemented, this to solve combined operators such as 'add duplicate' or
'extrude' (both want a transform appended).
Usage is simple:
- WM_operatortype_append_macro() : add new operatortype, name, flags
- WM_operatortype_macro_define() : add existing operator to macro
(Note: macro_define will also allow properties to be set, doesnt work
right now)
On converting the macro wmOperatorType to a real operator, it makes a
list of all operators, and the standard macro callbacks (exec, invoke,
modal, poll) just will use all.
Important note; switching to a modal operator only works as last in the
chain now!
Macros implemented for duplicate, extrude and rip. Tool menu works fine
for it, also the redo hotkey F4 works properly.
--- Operator redo fix
The operators use the undo system to switch back, but this could give
errors if other actions added undo pushes (buttons, outliner). Now the
redo for operator searches back for the correct undo level.
This fixes issues with many redos.
Note for brecht: removed the ED_undo_push for buttons... it was called
on *every* button now, which is probably too much? For example, using
the 'toolbar' redo also caused this...
2009-07-29 17:56:38 +00:00
static void view3d_panel_operator_redo_buts ( const bContext * C , Panel * pa , wmOperator * op )
{
2010-12-15 05:42:23 +00:00
uiLayoutOperatorButs ( C , pa - > layout , op , NULL , ' V ' , 0 ) ;
2009-08-16 20:23:34 +00:00
}
static void view3d_panel_operator_redo_header ( const bContext * C , Panel * pa )
{
2011-05-23 10:14:07 +00:00
wmOperator * op = WM_operator_last_redo ( C ) ;
2009-08-16 20:23:34 +00:00
if ( op ) BLI_strncpy ( pa - > drawname , op - > type - > name , sizeof ( pa - > drawname ) ) ;
2011-09-15 13:20:18 +00:00
else BLI_strncpy ( pa - > drawname , N_ ( " Operator " ) , sizeof ( pa - > drawname ) ) ;
2.5
Operator goodies!
--- Macro operators
Operators now can consist of multiple operators. Such a macro operator
is identical and behaves identical to other opererators. Macros can
also be constructed of macros even! Currently only hardcoded macros are
implemented, this to solve combined operators such as 'add duplicate' or
'extrude' (both want a transform appended).
Usage is simple:
- WM_operatortype_append_macro() : add new operatortype, name, flags
- WM_operatortype_macro_define() : add existing operator to macro
(Note: macro_define will also allow properties to be set, doesnt work
right now)
On converting the macro wmOperatorType to a real operator, it makes a
list of all operators, and the standard macro callbacks (exec, invoke,
modal, poll) just will use all.
Important note; switching to a modal operator only works as last in the
chain now!
Macros implemented for duplicate, extrude and rip. Tool menu works fine
for it, also the redo hotkey F4 works properly.
--- Operator redo fix
The operators use the undo system to switch back, but this could give
errors if other actions added undo pushes (buttons, outliner). Now the
redo for operator searches back for the correct undo level.
This fixes issues with many redos.
Note for brecht: removed the ED_undo_push for buttons... it was called
on *every* button now, which is probably too much? For example, using
the 'toolbar' redo also caused this...
2009-07-29 17:56:38 +00:00
}
2010-01-21 21:58:40 +00:00
static void view3d_panel_operator_redo_operator ( const bContext * C , Panel * pa , wmOperator * op )
{
if ( op - > type - > flag & OPTYPE_MACRO ) {
for ( op = op - > macro . first ; op ; op = op - > next ) {
2011-02-27 18:03:19 +00:00
uiItemL ( pa - > layout , op - > type - > name , ICON_NONE ) ;
2010-01-21 21:58:40 +00:00
view3d_panel_operator_redo_operator ( C , pa , op ) ;
}
}
else {
view3d_panel_operator_redo_buts ( C , pa , op ) ;
}
}
2009-05-19 17:13:33 +00:00
static void view3d_panel_operator_redo ( const bContext * C , Panel * pa )
2009-04-27 13:55:38 +00:00
{
2011-05-23 10:14:07 +00:00
wmOperator * op = WM_operator_last_redo ( C ) ;
2009-04-27 13:55:38 +00:00
uiBlock * block ;
if ( op = = NULL )
return ;
2009-09-18 13:02:20 +00:00
if ( WM_operator_poll ( ( bContext * ) C , op - > type ) = = 0 )
2009-04-27 13:55:38 +00:00
return ;
2009-08-16 20:23:34 +00:00
block = uiLayoutGetBlock ( pa - > layout ) ;
2011-01-12 18:00:23 +00:00
if ( ED_undo_valid ( C , op - > type - > name ) = = 0 )
uiLayoutSetEnabled ( pa - > layout , 0 ) ;
2009-08-16 20:23:34 +00:00
2011-01-19 14:19:20 +00:00
/* note, blockfunc is a default but->func, use Handle func to allow button callbacks too */
uiBlockSetHandleFunc ( block , ED_undo_operator_repeat_cb_evt , op ) ;
2009-04-27 13:55:38 +00:00
2010-01-21 21:58:40 +00:00
view3d_panel_operator_redo_operator ( C , pa , op ) ;
2009-04-27 13:55:38 +00:00
}
2009-06-27 15:21:37 +00:00
/* ******************* */
typedef struct CustomTool {
struct CustomTool * next , * prev ;
char opname [ OP_MAX_TYPENAME ] ;
2009-07-02 11:23:19 +00:00
char context [ OP_MAX_TYPENAME ] ;
2009-06-27 15:21:37 +00:00
} CustomTool ;
static void operator_call_cb ( struct bContext * C , void * arg_listbase , void * arg2 )
{
wmOperatorType * ot = arg2 ;
if ( ot ) {
CustomTool * ct = MEM_callocN ( sizeof ( CustomTool ) , " CustomTool " ) ;
BLI_addtail ( arg_listbase , ct ) ;
BLI_strncpy ( ct - > opname , ot - > idname , OP_MAX_TYPENAME ) ;
2009-08-15 19:40:09 +00:00
BLI_strncpy ( ct - > context , CTX_data_mode_string ( C ) , OP_MAX_TYPENAME ) ;
2009-06-27 15:21:37 +00:00
}
}
2010-11-17 09:45:45 +00:00
static void operator_search_cb ( const struct bContext * C , void * UNUSED ( arg ) , const char * str , uiSearchItems * items )
2009-06-27 15:21:37 +00:00
{
2011-08-11 06:06:17 +00:00
GHashIterator * iter = WM_operatortype_iter ( ) ;
for ( ; ! BLI_ghashIterator_isDone ( iter ) ; BLI_ghashIterator_step ( iter ) ) {
wmOperatorType * ot = BLI_ghashIterator_getValue ( iter ) ;
2009-06-27 15:21:37 +00:00
if ( BLI_strcasestr ( ot - > name , str ) ) {
2009-09-18 13:02:20 +00:00
if ( WM_operator_poll ( ( bContext * ) C , ot ) ) {
2009-06-27 15:21:37 +00:00
if ( 0 = = uiSearchItemAdd ( items , ot - > name , ot , 0 ) )
break ;
}
}
}
2011-08-11 06:06:17 +00:00
BLI_ghashIterator_free ( iter ) ;
2009-06-27 15:21:37 +00:00
}
/* ID Search browse menu, open */
static uiBlock * tool_search_menu ( bContext * C , ARegion * ar , void * arg_listbase )
{
static char search [ OP_MAX_TYPENAME ] ;
wmEvent event ;
wmWindow * win = CTX_wm_window ( C ) ;
uiBlock * block ;
uiBut * but ;
/* clear initial search string, then all items show */
search [ 0 ] = 0 ;
block = uiBeginBlock ( C , ar , " _popup " , UI_EMBOSS ) ;
uiBlockSetFlag ( block , UI_BLOCK_LOOP | UI_BLOCK_REDRAW | UI_BLOCK_RET_1 ) ;
/* fake button, it holds space for search items */
uiDefBut ( block , LABEL , 0 , " " , 10 , 15 , 150 , uiSearchBoxhHeight ( ) , NULL , 0 , 0 , 0 , 0 , NULL ) ;
2010-01-03 08:37:18 +00:00
but = uiDefSearchBut ( block , search , 0 , ICON_VIEWZOOM , OP_MAX_TYPENAME , 10 , 0 , 150 , 19 , 0 , 0 , " " ) ;
2009-06-29 11:29:52 +00:00
uiButSetSearchFunc ( but , operator_search_cb , arg_listbase , operator_call_cb , NULL ) ;
2009-06-27 15:21:37 +00:00
uiBoundsBlock ( block , 6 ) ;
uiBlockSetDirection ( block , UI_DOWN ) ;
uiEndBlock ( C , block ) ;
event = * ( win - > eventstate ) ; /* XXX huh huh? make api call */
event . type = EVT_BUT_OPEN ;
event . val = KM_PRESS ;
event . customdata = but ;
event . customdatafree = FALSE ;
wm_event_add ( win , & event ) ;
return block ;
}
2009-07-02 11:23:19 +00:00
static void view3d_panel_tool_shelf ( const bContext * C , Panel * pa )
2009-06-26 15:48:09 +00:00
{
2009-07-02 11:23:19 +00:00
SpaceLink * sl = CTX_wm_space_data ( C ) ;
SpaceType * st = NULL ;
2009-06-26 15:48:09 +00:00
uiLayout * col ;
2009-08-15 19:40:09 +00:00
const char * context = CTX_data_mode_string ( C ) ;
2009-06-26 15:48:09 +00:00
2009-07-02 11:23:19 +00:00
if ( sl )
st = BKE_spacetype_from_id ( sl - > spacetype ) ;
if ( st & & st - > toolshelf . first ) {
CustomTool * ct ;
for ( ct = st - > toolshelf . first ; ct ; ct = ct - > next ) {
if ( 0 = = strncmp ( context , ct - > context , OP_MAX_TYPENAME ) ) {
col = uiLayoutColumn ( pa - > layout , 1 ) ;
2011-02-27 18:03:19 +00:00
uiItemFullO ( col , ct - > opname , NULL , ICON_NONE , NULL , WM_OP_INVOKE_REGION_WIN , 0 ) ;
2009-06-27 15:21:37 +00:00
}
2009-06-26 15:48:09 +00:00
}
}
2009-07-02 11:23:19 +00:00
col = uiLayoutColumn ( pa - > layout , 1 ) ;
uiDefBlockBut ( uiLayoutGetBlock ( pa - > layout ) , tool_search_menu , & st - > toolshelf , " Add Tool " , 0 , 0 , UI_UNIT_X , UI_UNIT_Y , " Add Tool in shelf, gets saved in files " ) ;
2009-06-26 15:48:09 +00:00
}
2010-01-12 07:50:14 +00:00
void view3d_toolshelf_register ( ARegionType * art )
2009-04-27 13:55:38 +00:00
{
2009-05-19 17:13:33 +00:00
PanelType * pt ;
2009-04-27 13:55:38 +00:00
2009-06-26 15:48:09 +00:00
pt = MEM_callocN ( sizeof ( PanelType ) , " spacetype view3d panel tools " ) ;
2009-07-02 11:23:19 +00:00
strcpy ( pt - > idname , " VIEW3D_PT_tool_shelf " ) ;
strcpy ( pt - > label , " Tool Shelf " ) ;
pt - > draw = view3d_panel_tool_shelf ;
2009-06-26 15:48:09 +00:00
BLI_addtail ( & art - > paneltypes , pt ) ;
2009-07-02 11:23:19 +00:00
}
void view3d_tool_props_register ( ARegionType * art )
{
PanelType * pt ;
2009-06-26 15:48:09 +00:00
2009-05-19 17:13:33 +00:00
pt = MEM_callocN ( sizeof ( PanelType ) , " spacetype view3d panel last operator " ) ;
strcpy ( pt - > idname , " VIEW3D_PT_last_operator " ) ;
2009-08-16 20:23:34 +00:00
strcpy ( pt - > label , " Operator " ) ;
pt - > draw_header = view3d_panel_operator_redo_header ;
2009-05-19 17:13:33 +00:00
pt - > draw = view3d_panel_operator_redo ;
BLI_addtail ( & art - > paneltypes , pt ) ;
}
2009-04-27 13:55:38 +00:00
2010-01-12 07:50:14 +00:00
/* ********** operator to open/close toolshelf region */
2009-07-02 11:23:19 +00:00
2010-10-15 01:36:14 +00:00
static int view3d_toolshelf ( bContext * C , wmOperator * UNUSED ( op ) )
2009-04-27 13:55:38 +00:00
{
ScrArea * sa = CTX_wm_area ( C ) ;
ARegion * ar = view3d_has_tools_region ( sa ) ;
2009-09-14 19:12:29 +00:00
if ( ar )
ED_region_toggle_hidden ( C , ar ) ;
2009-04-27 13:55:38 +00:00
return OPERATOR_FINISHED ;
}
2010-01-12 07:50:14 +00:00
void VIEW3D_OT_toolshelf ( wmOperatorType * ot )
2009-04-27 13:55:38 +00:00
{
2011-09-15 13:20:18 +00:00
ot - > name = " Tool Shelf " ;
ot - > description = " Toggles tool shelf display " ;
2010-01-12 07:50:14 +00:00
ot - > idname = " VIEW3D_OT_toolshelf " ;
2009-04-27 13:55:38 +00:00
2010-01-12 07:50:14 +00:00
ot - > exec = view3d_toolshelf ;
2009-04-27 13:55:38 +00:00
ot - > poll = ED_operator_view3d_active ;
/* flags */
ot - > flag = 0 ;
}