2008-01-07 18:03:41 +00:00
|
|
|
/**
|
|
|
|
* $Id:
|
|
|
|
*
|
|
|
|
* ***** 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,
|
|
|
|
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2008 Blender Foundation.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
2008-11-19 16:28:11 +00:00
|
|
|
#include "BLI_arithb.h"
|
2.5: Space Image ported back
Organized as follows:
uvedit/
uv editing related code
uvedit_draw.c: drawing code
uvedit_ops.c: operators, just a few done
uvedit_unwrap_ops.c: will be operators for unwrapping
uvedit_paramatrizer.c: lscm/abf/stretch/pack
space_image/
space_image.c: registration and common getter/setters
image_draw.c: drawing code, mostly functional
image_panels.c: panels, all commented out
image_render.c: render callbacks, non functional
image_ops.c: operators, only view navigation done
image_header.c: header, menus mostly done but missing buttons
Notes:
* Header menus consist only of Operator and RNA buttons, if they
are not implemented they're displayed grayed out. Ideally the full
header could work like this, but std_libbuttons looks problematic.
* Started using view2d code more than the old code, but for now it
still does own view2d management due to some very specific
requirements that the image window has. The drawing code however
is more clear hopefully, it only uses view2d, and there is no
switching between 'p' and 'f' view2d's anymore, it is always 'f'.
* In order to make uvedit operators more independent I move some
image space settings to scene toolsettings, and the current image
and its buffer is in the context. Especially sync selection and
select mode belonged there anyway as this cannot work correct with
different spaces having different settings anyway.
* Image paint is not back yet, did not want to put that together with
uvedit because there's really no code sharing.. perhaps vertex paint,
image paint and sculpt would be good to have in one module to share
brush code, partial redraw, etc better.
2009-01-15 04:38:18 +00:00
|
|
|
#include "BLI_blenlib.h"
|
|
|
|
#include "BLI_editVert.h"
|
2008-01-07 18:03:41 +00:00
|
|
|
|
2009-02-04 17:40:50 +00:00
|
|
|
#include "DNA_armature_types.h"
|
|
|
|
#include "DNA_image_types.h"
|
|
|
|
#include "DNA_object_types.h"
|
|
|
|
#include "DNA_mesh_types.h"
|
|
|
|
#include "DNA_curve_types.h"
|
|
|
|
#include "DNA_scene_types.h"
|
|
|
|
|
|
|
|
#include "BKE_blender.h"
|
2008-12-18 02:56:48 +00:00
|
|
|
#include "BKE_context.h"
|
2.5: Space Image ported back
Organized as follows:
uvedit/
uv editing related code
uvedit_draw.c: drawing code
uvedit_ops.c: operators, just a few done
uvedit_unwrap_ops.c: will be operators for unwrapping
uvedit_paramatrizer.c: lscm/abf/stretch/pack
space_image/
space_image.c: registration and common getter/setters
image_draw.c: drawing code, mostly functional
image_panels.c: panels, all commented out
image_render.c: render callbacks, non functional
image_ops.c: operators, only view navigation done
image_header.c: header, menus mostly done but missing buttons
Notes:
* Header menus consist only of Operator and RNA buttons, if they
are not implemented they're displayed grayed out. Ideally the full
header could work like this, but std_libbuttons looks problematic.
* Started using view2d code more than the old code, but for now it
still does own view2d management due to some very specific
requirements that the image window has. The drawing code however
is more clear hopefully, it only uses view2d, and there is no
switching between 'p' and 'f' view2d's anymore, it is always 'f'.
* In order to make uvedit operators more independent I move some
image space settings to scene toolsettings, and the current image
and its buffer is in the context. Especially sync selection and
select mode belonged there anyway as this cannot work correct with
different spaces having different settings anyway.
* Image paint is not back yet, did not want to put that together with
uvedit because there's really no code sharing.. perhaps vertex paint,
image paint and sculpt would be good to have in one module to share
brush code, partial redraw, etc better.
2009-01-15 04:38:18 +00:00
|
|
|
#include "BKE_customdata.h"
|
2009-02-04 17:40:50 +00:00
|
|
|
#include "BKE_global.h"
|
|
|
|
#include "BKE_image.h"
|
2009-02-04 11:52:16 +00:00
|
|
|
#include "BKE_idprop.h"
|
2008-01-07 18:03:41 +00:00
|
|
|
#include "BKE_library.h"
|
|
|
|
#include "BKE_main.h"
|
2009-02-05 01:12:47 +00:00
|
|
|
#include "BKE_multires.h"
|
2.5
View3D has been split now in a local part (RegionView3D) and a
per-area part (old View3D). Currently local is:
- view transform
- camera zoom/offset
- gpencil (todo)
- custom clipping planes
Rest is in Area still, like active camera, draw type, layers,
localview, custom centers, around-settings, transform widget,
gridlines, and so on (mostly stuff as available in header).
To see it work; also added new feature for region split,
press SHIFT+ALT+CTRL+S for four-split.
The idea is to make a preset 4-split, configured to stick
to top/right/front views for three views.
Another cool idea to explore is to then box-clip all drawing
based on these 3 views.
Note about the code:
- currently view3d still stores some depricated settings, to
convert from older files. Not all settings are copied over
though, like custom clip planes or the 'lock view to object'.
- since some view3d ops are now on area level, the operators
for it should keep track of that.
Bugfix in transform: quat initialize in operator-invoke missed
one zero.
Als brought back GE to compile for missing Ipos and channels.
2009-01-19 16:54:41 +00:00
|
|
|
#include "BKE_report.h"
|
2008-01-07 18:03:41 +00:00
|
|
|
#include "BKE_screen.h"
|
|
|
|
#include "BKE_utildefines.h"
|
|
|
|
|
|
|
|
#include "WM_api.h"
|
|
|
|
#include "WM_types.h"
|
|
|
|
|
2008-12-31 18:52:15 +00:00
|
|
|
#include "ED_util.h"
|
2008-01-07 18:03:41 +00:00
|
|
|
#include "ED_screen.h"
|
2008-11-19 16:28:11 +00:00
|
|
|
#include "ED_screen_types.h"
|
2008-01-07 18:03:41 +00:00
|
|
|
|
2009-02-04 17:40:50 +00:00
|
|
|
#include "RE_pipeline.h"
|
|
|
|
#include "IMB_imbuf.h"
|
|
|
|
#include "IMB_imbuf_types.h"
|
|
|
|
|
2008-11-21 19:14:38 +00:00
|
|
|
#include "RNA_access.h"
|
|
|
|
#include "RNA_define.h"
|
|
|
|
|
2009-01-15 18:28:40 +00:00
|
|
|
#include "UI_interface.h"
|
2009-01-25 20:22:05 +00:00
|
|
|
#include "UI_resources.h"
|
2009-01-15 18:28:40 +00:00
|
|
|
|
2008-01-07 18:03:41 +00:00
|
|
|
#include "screen_intern.h" /* own module include */
|
|
|
|
|
2008-11-19 16:28:11 +00:00
|
|
|
/* ************** Exported Poll tests ********************** */
|
2008-01-10 17:38:17 +00:00
|
|
|
|
2.5 getting-back-into-coding commit :)
- cleaned up join and split operations. Most noticable is operator callback
design, which should make a design based on user-less exec() first, then
wrap invoke() and modal() around it. The exec() should be callable with
only Context and properties.
- split now works again; and inversed as previously, if you drag from a
triangle (action zone) inside area it subdivides area as expected.
- dragging from triangle outside area, over an edge, joins areas
- split has been simplified, it had too many options... it could just work
simpler (now)
- 'action zone' now is an operator itself, a widget sending an ACTIONZONE event,
which can be handled by others (so other gestures can be added in action zone
too)
Still evaluating:
- context gets set where?
- code structure confuses... what are proper functions for operators?
- what is WM... should low level screen stuff more there?
- when do you send event, notifier?
- files grow to large, will clean
Oh yeah and docs, docs, docs. Coming! :)
2008-11-17 18:54:03 +00:00
|
|
|
int ED_operator_areaactive(bContext *C)
|
|
|
|
{
|
2008-12-18 02:56:48 +00:00
|
|
|
if(CTX_wm_window(C)==NULL) return 0;
|
|
|
|
if(CTX_wm_screen(C)==NULL) return 0;
|
|
|
|
if(CTX_wm_area(C)==NULL) return 0;
|
2.5 getting-back-into-coding commit :)
- cleaned up join and split operations. Most noticable is operator callback
design, which should make a design based on user-less exec() first, then
wrap invoke() and modal() around it. The exec() should be callable with
only Context and properties.
- split now works again; and inversed as previously, if you drag from a
triangle (action zone) inside area it subdivides area as expected.
- dragging from triangle outside area, over an edge, joins areas
- split has been simplified, it had too many options... it could just work
simpler (now)
- 'action zone' now is an operator itself, a widget sending an ACTIONZONE event,
which can be handled by others (so other gestures can be added in action zone
too)
Still evaluating:
- context gets set where?
- code structure confuses... what are proper functions for operators?
- what is WM... should low level screen stuff more there?
- when do you send event, notifier?
- files grow to large, will clean
Oh yeah and docs, docs, docs. Coming! :)
2008-11-17 18:54:03 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2008-01-07 18:03:41 +00:00
|
|
|
int ED_operator_screenactive(bContext *C)
|
|
|
|
{
|
2008-12-18 02:56:48 +00:00
|
|
|
if(CTX_wm_window(C)==NULL) return 0;
|
|
|
|
if(CTX_wm_screen(C)==NULL) return 0;
|
2008-01-07 18:03:41 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2.5 getting-back-into-coding commit :)
- cleaned up join and split operations. Most noticable is operator callback
design, which should make a design based on user-less exec() first, then
wrap invoke() and modal() around it. The exec() should be callable with
only Context and properties.
- split now works again; and inversed as previously, if you drag from a
triangle (action zone) inside area it subdivides area as expected.
- dragging from triangle outside area, over an edge, joins areas
- split has been simplified, it had too many options... it could just work
simpler (now)
- 'action zone' now is an operator itself, a widget sending an ACTIONZONE event,
which can be handled by others (so other gestures can be added in action zone
too)
Still evaluating:
- context gets set where?
- code structure confuses... what are proper functions for operators?
- what is WM... should low level screen stuff more there?
- when do you send event, notifier?
- files grow to large, will clean
Oh yeah and docs, docs, docs. Coming! :)
2008-11-17 18:54:03 +00:00
|
|
|
/* when mouse is over area-edge */
|
2008-01-10 17:38:17 +00:00
|
|
|
int ED_operator_screen_mainwinactive(bContext *C)
|
2008-01-07 18:03:41 +00:00
|
|
|
{
|
2008-12-18 02:56:48 +00:00
|
|
|
if(CTX_wm_window(C)==NULL) return 0;
|
|
|
|
if(CTX_wm_screen(C)==NULL) return 0;
|
|
|
|
if (CTX_wm_screen(C)->subwinactive!=CTX_wm_screen(C)->mainwin) return 0;
|
2008-01-10 17:38:17 +00:00
|
|
|
return 1;
|
2008-01-07 18:03:41 +00:00
|
|
|
}
|
|
|
|
|
2009-01-01 14:57:04 +00:00
|
|
|
int ED_operator_scene_editable(bContext *C)
|
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
if(scene && scene->id.lib==NULL)
|
|
|
|
return 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-12-26 19:07:31 +00:00
|
|
|
static int ed_spacetype_test(bContext *C, int type)
|
|
|
|
{
|
|
|
|
if(ED_operator_areaactive(C)) {
|
|
|
|
SpaceLink *sl= (SpaceLink *)CTX_wm_space_data(C);
|
|
|
|
return sl && (sl->spacetype == type);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ED_operator_view3d_active(bContext *C)
|
|
|
|
{
|
|
|
|
return ed_spacetype_test(C, SPACE_VIEW3D);
|
|
|
|
}
|
|
|
|
|
|
|
|
int ED_operator_timeline_active(bContext *C)
|
|
|
|
{
|
|
|
|
return ed_spacetype_test(C, SPACE_TIME);
|
|
|
|
}
|
|
|
|
|
|
|
|
int ED_operator_outliner_active(bContext *C)
|
|
|
|
{
|
|
|
|
if(ed_spacetype_test(C, SPACE_OOPS)) {
|
|
|
|
SpaceOops *so= (SpaceOops *)CTX_wm_space_data(C);
|
2008-12-28 22:26:02 +00:00
|
|
|
return (so->type == SO_OUTLINER);
|
2008-12-26 19:07:31 +00:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ED_operator_file_active(bContext *C)
|
|
|
|
{
|
|
|
|
return ed_spacetype_test(C, SPACE_FILE);
|
|
|
|
}
|
|
|
|
|
|
|
|
int ED_operator_action_active(bContext *C)
|
|
|
|
{
|
|
|
|
return ed_spacetype_test(C, SPACE_ACTION);
|
|
|
|
}
|
|
|
|
|
|
|
|
int ED_operator_buttons_active(bContext *C)
|
|
|
|
{
|
|
|
|
return ed_spacetype_test(C, SPACE_BUTS);
|
|
|
|
}
|
|
|
|
|
|
|
|
int ED_operator_node_active(bContext *C)
|
|
|
|
{
|
2009-02-10 15:51:33 +00:00
|
|
|
if(ed_spacetype_test(C, SPACE_NODE)) {
|
|
|
|
SpaceNode *snode= (SpaceNode *)CTX_wm_space_data(C);
|
|
|
|
if(snode->edittree)
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
2008-12-26 19:07:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int ED_operator_ipo_active(bContext *C)
|
|
|
|
{
|
|
|
|
return ed_spacetype_test(C, SPACE_IPO);
|
|
|
|
}
|
|
|
|
|
|
|
|
int ED_operator_sequencer_active(bContext *C)
|
|
|
|
{
|
|
|
|
return ed_spacetype_test(C, SPACE_SEQ);
|
|
|
|
}
|
|
|
|
|
2009-02-04 17:40:50 +00:00
|
|
|
int ED_operator_image_active(bContext *C)
|
|
|
|
{
|
|
|
|
return ed_spacetype_test(C, SPACE_IMAGE);
|
|
|
|
}
|
|
|
|
|
2009-01-01 13:15:35 +00:00
|
|
|
int ED_operator_object_active(bContext *C)
|
|
|
|
{
|
|
|
|
return NULL != CTX_data_active_object(C);
|
|
|
|
}
|
|
|
|
|
|
|
|
int ED_operator_editmesh(bContext *C)
|
|
|
|
{
|
|
|
|
Object *obedit= CTX_data_edit_object(C);
|
|
|
|
if(obedit && obedit->type==OB_MESH)
|
|
|
|
return NULL != ((Mesh *)obedit->data)->edit_mesh;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-02-01 18:07:02 +00:00
|
|
|
int ED_operator_editarmature(bContext *C)
|
|
|
|
{
|
|
|
|
Object *obedit= CTX_data_edit_object(C);
|
|
|
|
if(obedit && obedit->type==OB_ARMATURE)
|
|
|
|
return NULL != ((bArmature *)obedit->data)->edbo;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ED_operator_posemode(bContext *C)
|
|
|
|
{
|
|
|
|
Object *obact= CTX_data_active_object(C);
|
2009-02-09 01:27:44 +00:00
|
|
|
Object *obedit= CTX_data_edit_object(C);
|
|
|
|
|
|
|
|
if ((obact != obedit) && (obact) && (obact->type==OB_ARMATURE))
|
2009-02-01 18:07:02 +00:00
|
|
|
return (obact->flag & OB_POSEMODE)!=0;
|
2009-02-09 01:27:44 +00:00
|
|
|
|
2009-02-01 18:07:02 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2.5: Space Image ported back
Organized as follows:
uvedit/
uv editing related code
uvedit_draw.c: drawing code
uvedit_ops.c: operators, just a few done
uvedit_unwrap_ops.c: will be operators for unwrapping
uvedit_paramatrizer.c: lscm/abf/stretch/pack
space_image/
space_image.c: registration and common getter/setters
image_draw.c: drawing code, mostly functional
image_panels.c: panels, all commented out
image_render.c: render callbacks, non functional
image_ops.c: operators, only view navigation done
image_header.c: header, menus mostly done but missing buttons
Notes:
* Header menus consist only of Operator and RNA buttons, if they
are not implemented they're displayed grayed out. Ideally the full
header could work like this, but std_libbuttons looks problematic.
* Started using view2d code more than the old code, but for now it
still does own view2d management due to some very specific
requirements that the image window has. The drawing code however
is more clear hopefully, it only uses view2d, and there is no
switching between 'p' and 'f' view2d's anymore, it is always 'f'.
* In order to make uvedit operators more independent I move some
image space settings to scene toolsettings, and the current image
and its buffer is in the context. Especially sync selection and
select mode belonged there anyway as this cannot work correct with
different spaces having different settings anyway.
* Image paint is not back yet, did not want to put that together with
uvedit because there's really no code sharing.. perhaps vertex paint,
image paint and sculpt would be good to have in one module to share
brush code, partial redraw, etc better.
2009-01-15 04:38:18 +00:00
|
|
|
int ED_operator_uvedit(bContext *C)
|
|
|
|
{
|
|
|
|
Object *obedit= CTX_data_edit_object(C);
|
|
|
|
EditMesh *em= NULL;
|
|
|
|
|
|
|
|
if(obedit && obedit->type==OB_MESH)
|
|
|
|
em= ((Mesh *)obedit->data)->edit_mesh;
|
|
|
|
|
|
|
|
if(em && (em->faces.first) && (CustomData_has_layer(&em->fdata, CD_MTFACE)))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-02-07 01:27:46 +00:00
|
|
|
int ED_operator_uvmap(bContext *C)
|
|
|
|
{
|
|
|
|
Object *obedit= CTX_data_edit_object(C);
|
|
|
|
EditMesh *em= NULL;
|
|
|
|
|
|
|
|
if(obedit && obedit->type==OB_MESH)
|
|
|
|
em= ((Mesh *)obedit->data)->edit_mesh;
|
|
|
|
|
|
|
|
if(em && (em->faces.first))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2.5: Most curve/surface editmode operators back:
* Hide, Reveal
* Separate, Duplicate, Delete
* Set Weight, Set Radius, Set Spline Type, Set Handle Type, Set Smooth
* Tilt, Clear Tilt
* Smooth, Smooth Radius
* De(select) First, De(select) Last, De(select) All, Select Inverse,
Select Linked, Select Control Point Row, Select Next, Select Previous,
Select More, Select Less, Select Random, Select Every Nth
* Switch Direction, Subdivide, Make Segment, Spin, Extrude, Toggle Cyclic
* Specials Menu
Not working correct yet:
* Add Vertex (ctrl click)
* Add Menu
2009-02-12 22:12:21 +00:00
|
|
|
int ED_operator_editsurfcurve(bContext *C)
|
2009-01-01 13:15:35 +00:00
|
|
|
{
|
|
|
|
Object *obedit= CTX_data_edit_object(C);
|
2.5: Most curve/surface editmode operators back:
* Hide, Reveal
* Separate, Duplicate, Delete
* Set Weight, Set Radius, Set Spline Type, Set Handle Type, Set Smooth
* Tilt, Clear Tilt
* Smooth, Smooth Radius
* De(select) First, De(select) Last, De(select) All, Select Inverse,
Select Linked, Select Control Point Row, Select Next, Select Previous,
Select More, Select Less, Select Random, Select Every Nth
* Switch Direction, Subdivide, Make Segment, Spin, Extrude, Toggle Cyclic
* Specials Menu
Not working correct yet:
* Add Vertex (ctrl click)
* Add Menu
2009-02-12 22:12:21 +00:00
|
|
|
if(obedit && ELEM(obedit->type, OB_CURVE, OB_SURF))
|
|
|
|
return NULL != ((Curve *)obedit->data)->editnurb;
|
2009-01-01 13:15:35 +00:00
|
|
|
return 0;
|
2009-02-11 23:02:21 +00:00
|
|
|
|
|
|
|
// XXX this test was in many tools, still needed?
|
|
|
|
// if(v3d==0 || (v3d->lay & obedit->lay)==0 ) return 0;
|
2009-01-01 13:15:35 +00:00
|
|
|
}
|
2008-12-26 19:07:31 +00:00
|
|
|
|
|
|
|
|
2.5: Most curve/surface editmode operators back:
* Hide, Reveal
* Separate, Duplicate, Delete
* Set Weight, Set Radius, Set Spline Type, Set Handle Type, Set Smooth
* Tilt, Clear Tilt
* Smooth, Smooth Radius
* De(select) First, De(select) Last, De(select) All, Select Inverse,
Select Linked, Select Control Point Row, Select Next, Select Previous,
Select More, Select Less, Select Random, Select Every Nth
* Switch Direction, Subdivide, Make Segment, Spin, Extrude, Toggle Cyclic
* Specials Menu
Not working correct yet:
* Add Vertex (ctrl click)
* Add Menu
2009-02-12 22:12:21 +00:00
|
|
|
int ED_operator_editcurve(bContext *C)
|
|
|
|
{
|
|
|
|
Object *obedit= CTX_data_edit_object(C);
|
|
|
|
if(obedit && obedit->type==OB_CURVE)
|
|
|
|
return NULL != ((Curve *)obedit->data)->editnurb;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ED_operator_editsurf(bContext *C)
|
|
|
|
{
|
|
|
|
Object *obedit= CTX_data_edit_object(C);
|
|
|
|
if(obedit && obedit->type==OB_SURF)
|
|
|
|
return NULL != ((Curve *)obedit->data)->editnurb;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-11-19 16:28:11 +00:00
|
|
|
/* *************************** action zone operator ************************** */
|
|
|
|
|
|
|
|
/* operator state vars used:
|
|
|
|
none
|
|
|
|
|
|
|
|
functions:
|
|
|
|
|
|
|
|
apply() set actionzone event
|
|
|
|
|
|
|
|
exit() free customdata
|
|
|
|
|
|
|
|
callbacks:
|
|
|
|
|
|
|
|
exec() never used
|
|
|
|
|
|
|
|
invoke() check if in zone
|
|
|
|
add customdata, put mouseco and area in it
|
|
|
|
add modal handler
|
|
|
|
|
|
|
|
modal() accept modal events while doing it
|
|
|
|
call apply() with gesture info, active window, nonactive window
|
|
|
|
call exit() and remove handler when LMB confirm
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct sActionzoneData {
|
|
|
|
ScrArea *sa1, *sa2;
|
|
|
|
AZone *az;
|
|
|
|
int x, y, gesture_dir;
|
|
|
|
} sActionzoneData;
|
|
|
|
|
|
|
|
/* used by other operators too */
|
|
|
|
static ScrArea *screen_areahascursor(bScreen *scr, int x, int y)
|
|
|
|
{
|
|
|
|
ScrArea *sa= NULL;
|
|
|
|
sa= scr->areabase.first;
|
|
|
|
while(sa) {
|
|
|
|
if(BLI_in_rcti(&sa->totrct, x, y)) break;
|
|
|
|
sa= sa->next;
|
|
|
|
}
|
|
|
|
|
|
|
|
return sa;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-12-15 16:54:47 +00:00
|
|
|
AZone *is_in_area_actionzone(ScrArea *sa, int x, int y)
|
2008-11-19 16:28:11 +00:00
|
|
|
{
|
|
|
|
AZone *az= NULL;
|
|
|
|
int i= 0;
|
|
|
|
|
|
|
|
for(az= sa->actionzones.first, i= 0; az; az= az->next, i++) {
|
Lots of stuff; couldn't commit in parts because of refactor work.
* Changes in interface/ module
This commit brings back the way how buttons/menus work under control
of WM event system. The previous implementation extended usage of
handlers and operators in an interesting but confusing way. Better to
try it first according the design specs. :)
Most obviously:
- modal-handler operators are not stored anymore in regions/areas/windows.
such modal handlers own their operator, and should remove it themselves.
- removed code to move handlers from one queue to another.
(needs review with brecht!)
- WM fix: the API call to remove a modal handler got removed. This was a
dangerous thing anyway, and you should leave that to the event system.
Now, if a handler modal() call gets a cancel/finish return, it frees
itself in event system. WM_event_remove_modal_handler was a confusing
call anyway!
Todo:
- allow button-activate to refresh after using button
- re-enable arrow keys for menus
(do both after commit)
- review return values of operator callbacks in interface_ops.c
* Fixes in WM system
- Freeing areas/regions/windows, also on quit, now correctly closes
running modal handlers
- On starting a modal handler, the handler now stores previous area
and region context, so they send proper notifiers etc.
* Other fixes
- Area-split operator had bug, wrong minimal size checking. This
solves error when trying to split a very narrow area.
- removed DNA_USHORT_FIX from screen_types.h, gave warning
- operators didn't get ID name copied when activated, needed for
later re-use or saving.
2008-12-02 14:22:52 +00:00
|
|
|
if(az->type == AZONE_TRI) {
|
2008-11-19 16:28:11 +00:00
|
|
|
if(IsPointInTri2DInts(az->x1, az->y1, az->x2, az->y2, x, y))
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if(az->type == AZONE_QUAD) {
|
|
|
|
if(az->x1 < x && x < az->x2 && az->y1 < y && y < az->y2)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return az;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int actionzone_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|
|
|
{
|
2008-12-18 02:56:48 +00:00
|
|
|
AZone *az= is_in_area_actionzone(CTX_wm_area(C), event->x, event->y);
|
2008-11-19 16:28:11 +00:00
|
|
|
sActionzoneData *sad;
|
|
|
|
|
|
|
|
/* quick escape */
|
|
|
|
if(az==NULL)
|
|
|
|
return OPERATOR_PASS_THROUGH;
|
|
|
|
|
|
|
|
/* ok we do the actionzone */
|
|
|
|
sad= op->customdata= MEM_callocN(sizeof(sActionzoneData), "sActionzoneData");
|
2008-12-18 02:56:48 +00:00
|
|
|
sad->sa1= CTX_wm_area(C);
|
2008-11-19 16:28:11 +00:00
|
|
|
sad->az= az;
|
|
|
|
sad->x= event->x; sad->y= event->y;
|
|
|
|
|
|
|
|
/* add modal handler */
|
2008-12-18 02:56:48 +00:00
|
|
|
WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
return OPERATOR_RUNNING_MODAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void actionzone_exit(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
if(op->customdata)
|
|
|
|
MEM_freeN(op->customdata);
|
|
|
|
op->customdata= NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* send EVT_ACTIONZONE event */
|
|
|
|
static void actionzone_apply(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
wmEvent event;
|
2008-12-18 02:56:48 +00:00
|
|
|
wmWindow *win= CTX_wm_window(C);
|
2008-11-19 16:28:11 +00:00
|
|
|
|
2008-12-18 02:56:48 +00:00
|
|
|
event= *(win->eventstate); /* XXX huh huh? make api call */
|
2008-11-19 16:28:11 +00:00
|
|
|
event.type= EVT_ACTIONZONE;
|
|
|
|
event.customdata= op->customdata;
|
|
|
|
event.customdatafree= TRUE;
|
|
|
|
op->customdata= NULL;
|
|
|
|
|
2008-12-18 02:56:48 +00:00
|
|
|
wm_event_add(win, &event);
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int actionzone_modal(bContext *C, wmOperator *op, wmEvent *event)
|
|
|
|
{
|
|
|
|
sActionzoneData *sad= op->customdata;
|
|
|
|
int deltax, deltay;
|
|
|
|
|
|
|
|
switch(event->type) {
|
|
|
|
case MOUSEMOVE:
|
|
|
|
/* calculate gesture direction */
|
|
|
|
deltax= (event->x - sad->x);
|
|
|
|
deltay= (event->y - sad->y);
|
|
|
|
|
|
|
|
if(deltay > ABS(deltax))
|
|
|
|
sad->gesture_dir= AZONE_N;
|
|
|
|
else if(deltax > ABS(deltay))
|
|
|
|
sad->gesture_dir= AZONE_E;
|
|
|
|
else if(deltay < -ABS(deltax))
|
|
|
|
sad->gesture_dir= AZONE_S;
|
|
|
|
else
|
|
|
|
sad->gesture_dir= AZONE_W;
|
|
|
|
|
|
|
|
/* gesture is large enough? */
|
|
|
|
if(ABS(deltax) > 12 || ABS(deltay) > 12) {
|
|
|
|
|
|
|
|
/* second area, for join */
|
2008-12-18 02:56:48 +00:00
|
|
|
sad->sa2= screen_areahascursor(CTX_wm_screen(C), event->x, event->y);
|
2008-11-19 16:28:11 +00:00
|
|
|
/* apply sends event */
|
|
|
|
actionzone_apply(C, op);
|
|
|
|
actionzone_exit(C, op);
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case ESCKEY:
|
|
|
|
case LEFTMOUSE:
|
|
|
|
actionzone_exit(C, op);
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
|
|
|
|
return OPERATOR_RUNNING_MODAL;
|
|
|
|
}
|
|
|
|
|
2008-12-26 11:11:21 +00:00
|
|
|
void SCREEN_OT_actionzone(wmOperatorType *ot)
|
2008-11-19 16:28:11 +00:00
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Handle area action zones";
|
2008-12-26 11:11:21 +00:00
|
|
|
ot->idname= "SCREEN_OT_actionzone";
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
ot->invoke= actionzone_invoke;
|
|
|
|
ot->modal= actionzone_modal;
|
|
|
|
|
|
|
|
ot->poll= ED_operator_areaactive;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* *********** Rip area operator ****************** */
|
|
|
|
|
|
|
|
|
|
|
|
/* operator callback */
|
|
|
|
/* (ton) removed attempt to merge ripped area with another, don't think this is desired functionality.
|
|
|
|
conventions: 'atomic' and 'dont think for user' :) */
|
|
|
|
static int screen_area_rip_op(bContext *C, wmOperator *op)
|
|
|
|
{
|
2008-12-18 02:56:48 +00:00
|
|
|
wmWindow *newwin, *win;
|
|
|
|
bScreen *newsc, *sc;
|
|
|
|
ScrArea *sa;
|
2008-11-19 16:28:11 +00:00
|
|
|
rcti rect;
|
|
|
|
|
2008-12-18 02:56:48 +00:00
|
|
|
win= CTX_wm_window(C);
|
|
|
|
sc= CTX_wm_screen(C);
|
|
|
|
sa= CTX_wm_area(C);
|
|
|
|
|
2008-11-19 16:28:11 +00:00
|
|
|
/* poll() checks area context, but we don't accept full-area windows */
|
2008-12-18 02:56:48 +00:00
|
|
|
if(sc->full != SCREENNORMAL)
|
2008-11-19 16:28:11 +00:00
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
|
|
|
|
/* adds window to WM */
|
2008-12-18 02:56:48 +00:00
|
|
|
rect= sa->totrct;
|
|
|
|
BLI_translate_rcti(&rect, win->posx, win->posy);
|
|
|
|
newwin= WM_window_open(C, &rect);
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
/* allocs new screen and adds to newly created window, using window size */
|
2009-01-04 14:14:06 +00:00
|
|
|
newsc= screen_add(newwin, CTX_data_scene(C), sc->id.name+2);
|
2008-12-18 19:41:36 +00:00
|
|
|
newwin->screen= newsc;
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
/* copy area to new screen */
|
2008-12-18 02:56:48 +00:00
|
|
|
area_copy_data((ScrArea *)newsc->areabase.first, sa, 0);
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
/* screen, areas init */
|
2008-12-27 16:09:56 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
2008-12-26 11:11:21 +00:00
|
|
|
void SCREEN_OT_area_rip(wmOperatorType *ot)
|
2008-11-19 16:28:11 +00:00
|
|
|
{
|
|
|
|
ot->name= "Rip Area into New Window";
|
2008-12-26 11:11:21 +00:00
|
|
|
ot->idname= "SCREEN_OT_area_rip";
|
2008-11-19 16:28:11 +00:00
|
|
|
|
2008-12-17 15:38:40 +00:00
|
|
|
ot->invoke= WM_operator_confirm;
|
2008-11-19 16:28:11 +00:00
|
|
|
ot->exec= screen_area_rip_op;
|
|
|
|
ot->poll= ED_operator_areaactive;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ************** move area edge operator *********************************** */
|
|
|
|
|
|
|
|
/* operator state vars used:
|
|
|
|
x, y mouse coord near edge
|
|
|
|
delta movement of edge
|
|
|
|
|
|
|
|
functions:
|
|
|
|
|
|
|
|
init() set default property values, find edge based on mouse coords, test
|
|
|
|
if the edge can be moved, select edges, calculate min and max movement
|
|
|
|
|
|
|
|
apply() apply delta on selection
|
|
|
|
|
|
|
|
exit() cleanup, send notifier
|
|
|
|
|
|
|
|
cancel() cancel moving
|
|
|
|
|
|
|
|
callbacks:
|
|
|
|
|
|
|
|
exec() execute without any user interaction, based on properties
|
|
|
|
call init(), apply(), exit()
|
|
|
|
|
|
|
|
invoke() gets called on mouse click near edge
|
|
|
|
call init(), add handler
|
|
|
|
|
|
|
|
modal() accept modal events while doing it
|
|
|
|
call apply() with delta motion
|
|
|
|
call exit() and remove handler
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct sAreaMoveData {
|
|
|
|
int bigger, smaller, origval;
|
|
|
|
char dir;
|
|
|
|
} sAreaMoveData;
|
|
|
|
|
|
|
|
/* helper call to move area-edge, sets limits */
|
|
|
|
static void area_move_set_limits(bScreen *sc, int dir, int *bigger, int *smaller)
|
|
|
|
{
|
|
|
|
ScrArea *sa;
|
|
|
|
|
|
|
|
/* we check all areas and test for free space with MINSIZE */
|
|
|
|
*bigger= *smaller= 100000;
|
|
|
|
|
|
|
|
for(sa= sc->areabase.first; sa; sa= sa->next) {
|
|
|
|
if(dir=='h') {
|
|
|
|
int y1= sa->v2->vec.y - sa->v1->vec.y-AREAMINY;
|
|
|
|
|
|
|
|
/* if top or down edge selected, test height */
|
|
|
|
if(sa->v1->flag && sa->v4->flag)
|
|
|
|
*bigger= MIN2(*bigger, y1);
|
|
|
|
else if(sa->v2->flag && sa->v3->flag)
|
|
|
|
*smaller= MIN2(*smaller, y1);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
int x1= sa->v4->vec.x - sa->v1->vec.x-AREAMINX;
|
|
|
|
|
|
|
|
/* if left or right edge selected, test width */
|
|
|
|
if(sa->v1->flag && sa->v2->flag)
|
|
|
|
*bigger= MIN2(*bigger, x1);
|
|
|
|
else if(sa->v3->flag && sa->v4->flag)
|
|
|
|
*smaller= MIN2(*smaller, x1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* validate selection inside screen, set variables OK */
|
|
|
|
/* return 0: init failed */
|
|
|
|
static int area_move_init (bContext *C, wmOperator *op)
|
|
|
|
{
|
2008-12-18 02:56:48 +00:00
|
|
|
bScreen *sc= CTX_wm_screen(C);
|
2008-11-19 16:28:11 +00:00
|
|
|
ScrEdge *actedge;
|
|
|
|
sAreaMoveData *md;
|
|
|
|
int x, y;
|
|
|
|
|
|
|
|
/* required properties */
|
2008-11-24 15:51:55 +00:00
|
|
|
x= RNA_int_get(op->ptr, "x");
|
|
|
|
y= RNA_int_get(op->ptr, "y");
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
/* setup */
|
2008-12-18 02:56:48 +00:00
|
|
|
actedge= screen_find_active_scredge(sc, x, y);
|
2008-11-19 16:28:11 +00:00
|
|
|
if(actedge==NULL) return 0;
|
|
|
|
|
|
|
|
md= MEM_callocN(sizeof(sAreaMoveData), "sAreaMoveData");
|
|
|
|
op->customdata= md;
|
|
|
|
|
|
|
|
md->dir= scredge_is_horizontal(actedge)?'h':'v';
|
|
|
|
if(md->dir=='h') md->origval= actedge->v1->vec.y;
|
|
|
|
else md->origval= actedge->v1->vec.x;
|
|
|
|
|
2008-12-18 02:56:48 +00:00
|
|
|
select_connected_scredge(sc, actedge);
|
2008-11-19 16:28:11 +00:00
|
|
|
/* now all vertices with 'flag==1' are the ones that can be moved. */
|
|
|
|
|
2008-12-18 02:56:48 +00:00
|
|
|
area_move_set_limits(sc, md->dir, &md->bigger, &md->smaller);
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* moves selected screen edge amount of delta, used by split & move */
|
|
|
|
static void area_move_apply_do(bContext *C, int origval, int delta, int dir, int bigger, int smaller)
|
|
|
|
{
|
2008-12-18 02:56:48 +00:00
|
|
|
wmWindow *win= CTX_wm_window(C);
|
|
|
|
bScreen *sc= CTX_wm_screen(C);
|
2008-11-19 16:28:11 +00:00
|
|
|
ScrVert *v1;
|
|
|
|
|
|
|
|
delta= CLAMPIS(delta, -smaller, bigger);
|
|
|
|
|
2008-12-18 02:56:48 +00:00
|
|
|
for (v1= sc->vertbase.first; v1; v1= v1->next) {
|
2008-11-19 16:28:11 +00:00
|
|
|
if (v1->flag) {
|
|
|
|
/* that way a nice AREAGRID */
|
2008-12-18 02:56:48 +00:00
|
|
|
if((dir=='v') && v1->vec.x>0 && v1->vec.x<win->sizex-1) {
|
2008-11-19 16:28:11 +00:00
|
|
|
v1->vec.x= origval + delta;
|
|
|
|
if(delta != bigger && delta != -smaller) v1->vec.x-= (v1->vec.x % AREAGRID);
|
|
|
|
}
|
2008-12-18 02:56:48 +00:00
|
|
|
if((dir=='h') && v1->vec.y>0 && v1->vec.y<win->sizey-1) {
|
2008-11-19 16:28:11 +00:00
|
|
|
v1->vec.y= origval + delta;
|
|
|
|
|
|
|
|
v1->vec.y+= AREAGRID-1;
|
|
|
|
v1->vec.y-= (v1->vec.y % AREAGRID);
|
|
|
|
|
|
|
|
/* prevent too small top header */
|
2008-12-18 02:56:48 +00:00
|
|
|
if(v1->vec.y > win->sizey-AREAMINY)
|
|
|
|
v1->vec.y= win->sizey-AREAMINY;
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-12-27 16:09:56 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void area_move_apply(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
sAreaMoveData *md= op->customdata;
|
|
|
|
int delta;
|
|
|
|
|
2008-11-24 15:51:55 +00:00
|
|
|
delta= RNA_int_get(op->ptr, "delta");
|
2008-11-19 16:28:11 +00:00
|
|
|
area_move_apply_do(C, md->origval, delta, md->dir, md->bigger, md->smaller);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void area_move_exit(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
if(op->customdata)
|
|
|
|
MEM_freeN(op->customdata);
|
|
|
|
op->customdata= NULL;
|
|
|
|
|
|
|
|
/* this makes sure aligned edges will result in aligned grabbing */
|
2008-12-18 02:56:48 +00:00
|
|
|
removedouble_scrverts(CTX_wm_screen(C));
|
|
|
|
removedouble_scredges(CTX_wm_screen(C));
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int area_move_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
if(!area_move_init(C, op))
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
|
|
|
|
area_move_apply(C, op);
|
|
|
|
area_move_exit(C, op);
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* interaction callback */
|
|
|
|
static int area_move_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|
|
|
{
|
2008-11-24 15:51:55 +00:00
|
|
|
RNA_int_set(op->ptr, "x", event->x);
|
|
|
|
RNA_int_set(op->ptr, "y", event->y);
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
if(!area_move_init(C, op))
|
|
|
|
return OPERATOR_PASS_THROUGH;
|
|
|
|
|
|
|
|
/* add temp handler */
|
2008-12-18 02:56:48 +00:00
|
|
|
WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
return OPERATOR_RUNNING_MODAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int area_move_cancel(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
|
2008-11-24 15:51:55 +00:00
|
|
|
RNA_int_set(op->ptr, "delta", 0);
|
2008-11-19 16:28:11 +00:00
|
|
|
area_move_apply(C, op);
|
|
|
|
area_move_exit(C, op);
|
|
|
|
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* modal callback for while moving edges */
|
|
|
|
static int area_move_modal(bContext *C, wmOperator *op, wmEvent *event)
|
|
|
|
{
|
|
|
|
sAreaMoveData *md;
|
|
|
|
int delta, x, y;
|
|
|
|
|
|
|
|
md= op->customdata;
|
|
|
|
|
2008-11-24 15:51:55 +00:00
|
|
|
x= RNA_int_get(op->ptr, "x");
|
|
|
|
y= RNA_int_get(op->ptr, "y");
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
/* execute the events */
|
|
|
|
switch(event->type) {
|
|
|
|
case MOUSEMOVE:
|
|
|
|
delta= (md->dir == 'v')? event->x - x: event->y - y;
|
2008-11-24 15:51:55 +00:00
|
|
|
RNA_int_set(op->ptr, "delta", delta);
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
area_move_apply(C, op);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LEFTMOUSE:
|
|
|
|
if(event->val==0) {
|
|
|
|
area_move_exit(C, op);
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ESCKEY:
|
|
|
|
return area_move_cancel(C, op);
|
|
|
|
}
|
|
|
|
|
|
|
|
return OPERATOR_RUNNING_MODAL;
|
|
|
|
}
|
|
|
|
|
2008-12-26 11:11:21 +00:00
|
|
|
void SCREEN_OT_area_move(wmOperatorType *ot)
|
2008-11-19 16:28:11 +00:00
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Move area edges";
|
2008-12-26 11:11:21 +00:00
|
|
|
ot->idname= "SCREEN_OT_area_move";
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
ot->exec= area_move_exec;
|
|
|
|
ot->invoke= area_move_invoke;
|
|
|
|
ot->cancel= area_move_cancel;
|
|
|
|
ot->modal= area_move_modal;
|
|
|
|
|
|
|
|
ot->poll= ED_operator_screen_mainwinactive; /* when mouse is over area-edge */
|
2008-11-21 19:14:38 +00:00
|
|
|
|
|
|
|
/* rna */
|
2009-01-16 23:53:11 +00:00
|
|
|
RNA_def_int(ot->srna, "x", 0, INT_MIN, INT_MAX, "X", "", INT_MIN, INT_MAX);
|
|
|
|
RNA_def_int(ot->srna, "y", 0, INT_MIN, INT_MAX, "Y", "", INT_MIN, INT_MAX);
|
|
|
|
RNA_def_int(ot->srna, "delta", 0, INT_MIN, INT_MAX, "Delta", "", INT_MIN, INT_MAX);
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* ************** split area operator *********************************** */
|
|
|
|
|
|
|
|
/*
|
|
|
|
operator state vars:
|
|
|
|
fac spit point
|
|
|
|
dir direction 'v' or 'h'
|
|
|
|
|
|
|
|
operator customdata:
|
|
|
|
area pointer to (active) area
|
|
|
|
x, y last used mouse pos
|
|
|
|
(more, see below)
|
|
|
|
|
|
|
|
functions:
|
|
|
|
|
|
|
|
init() set default property values, find area based on context
|
|
|
|
|
|
|
|
apply() split area based on state vars
|
|
|
|
|
|
|
|
exit() cleanup, send notifier
|
|
|
|
|
|
|
|
cancel() remove duplicated area
|
|
|
|
|
|
|
|
callbacks:
|
|
|
|
|
|
|
|
exec() execute without any user interaction, based on state vars
|
|
|
|
call init(), apply(), exit()
|
|
|
|
|
|
|
|
invoke() gets called on mouse click in action-widget
|
|
|
|
call init(), add modal handler
|
|
|
|
call apply() with initial motion
|
|
|
|
|
|
|
|
modal() accept modal events while doing it
|
|
|
|
call move-areas code with delta motion
|
|
|
|
call exit() or cancel() and remove handler
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define SPLIT_STARTED 1
|
|
|
|
#define SPLIT_PROGRESS 2
|
|
|
|
|
|
|
|
typedef struct sAreaSplitData
|
|
|
|
{
|
|
|
|
int x, y; /* last used mouse position */
|
|
|
|
|
|
|
|
int origval; /* for move areas */
|
|
|
|
int bigger, smaller; /* constraints for moving new edge */
|
|
|
|
int delta; /* delta move edge */
|
2008-12-03 19:33:42 +00:00
|
|
|
int origmin, origsize; /* to calculate fac, for property storage */
|
|
|
|
|
2008-11-19 16:28:11 +00:00
|
|
|
ScrEdge *nedge; /* new edge */
|
|
|
|
ScrArea *sarea; /* start area */
|
|
|
|
ScrArea *narea; /* new area */
|
|
|
|
} sAreaSplitData;
|
|
|
|
|
|
|
|
/* generic init, no UI stuff here */
|
|
|
|
static int area_split_init(bContext *C, wmOperator *op)
|
|
|
|
{
|
2008-12-18 02:56:48 +00:00
|
|
|
ScrArea *sa= CTX_wm_area(C);
|
2008-11-19 16:28:11 +00:00
|
|
|
sAreaSplitData *sd;
|
|
|
|
int dir;
|
|
|
|
|
|
|
|
/* required context */
|
2008-12-18 02:56:48 +00:00
|
|
|
if(sa==NULL) return 0;
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
/* required properties */
|
2009-01-16 23:53:11 +00:00
|
|
|
dir= RNA_enum_get(op->ptr, "direction");
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
/* minimal size */
|
2008-12-18 02:56:48 +00:00
|
|
|
if(dir=='v' && sa->winx < 2*AREAMINX) return 0;
|
|
|
|
if(dir=='h' && sa->winy < 2*AREAMINY) return 0;
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
/* custom data */
|
|
|
|
sd= (sAreaSplitData*)MEM_callocN(sizeof (sAreaSplitData), "op_area_split");
|
|
|
|
op->customdata= sd;
|
|
|
|
|
2008-12-18 02:56:48 +00:00
|
|
|
sd->sarea= sa;
|
|
|
|
sd->origsize= dir=='v' ? sa->winx:sa->winy;
|
|
|
|
sd->origmin = dir=='v' ? sa->totrct.xmin:sa->totrct.ymin;
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* with sa as center, sb is located at: 0=W, 1=N, 2=E, 3=S */
|
|
|
|
/* used with split operator */
|
|
|
|
static ScrEdge *area_findsharededge(bScreen *screen, ScrArea *sa, ScrArea *sb)
|
|
|
|
{
|
|
|
|
ScrVert *sav1= sa->v1;
|
|
|
|
ScrVert *sav2= sa->v2;
|
|
|
|
ScrVert *sav3= sa->v3;
|
|
|
|
ScrVert *sav4= sa->v4;
|
|
|
|
ScrVert *sbv1= sb->v1;
|
|
|
|
ScrVert *sbv2= sb->v2;
|
|
|
|
ScrVert *sbv3= sb->v3;
|
|
|
|
ScrVert *sbv4= sb->v4;
|
|
|
|
|
|
|
|
if(sav1==sbv4 && sav2==sbv3) { /* sa to right of sb = W */
|
|
|
|
return screen_findedge(screen, sav1, sav2);
|
|
|
|
}
|
|
|
|
else if(sav2==sbv1 && sav3==sbv4) { /* sa to bottom of sb = N */
|
|
|
|
return screen_findedge(screen, sav2, sav3);
|
|
|
|
}
|
|
|
|
else if(sav3==sbv2 && sav4==sbv1) { /* sa to left of sb = E */
|
|
|
|
return screen_findedge(screen, sav3, sav4);
|
|
|
|
}
|
|
|
|
else if(sav1==sbv2 && sav4==sbv3) { /* sa on top of sb = S*/
|
|
|
|
return screen_findedge(screen, sav1, sav4);
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
Lots of stuff; couldn't commit in parts because of refactor work.
* Changes in interface/ module
This commit brings back the way how buttons/menus work under control
of WM event system. The previous implementation extended usage of
handlers and operators in an interesting but confusing way. Better to
try it first according the design specs. :)
Most obviously:
- modal-handler operators are not stored anymore in regions/areas/windows.
such modal handlers own their operator, and should remove it themselves.
- removed code to move handlers from one queue to another.
(needs review with brecht!)
- WM fix: the API call to remove a modal handler got removed. This was a
dangerous thing anyway, and you should leave that to the event system.
Now, if a handler modal() call gets a cancel/finish return, it frees
itself in event system. WM_event_remove_modal_handler was a confusing
call anyway!
Todo:
- allow button-activate to refresh after using button
- re-enable arrow keys for menus
(do both after commit)
- review return values of operator callbacks in interface_ops.c
* Fixes in WM system
- Freeing areas/regions/windows, also on quit, now correctly closes
running modal handlers
- On starting a modal handler, the handler now stores previous area
and region context, so they send proper notifiers etc.
* Other fixes
- Area-split operator had bug, wrong minimal size checking. This
solves error when trying to split a very narrow area.
- removed DNA_USHORT_FIX from screen_types.h, gave warning
- operators didn't get ID name copied when activated, needed for
later re-use or saving.
2008-12-02 14:22:52 +00:00
|
|
|
/* do the split, return success */
|
|
|
|
static int area_split_apply(bContext *C, wmOperator *op)
|
2008-11-19 16:28:11 +00:00
|
|
|
{
|
2008-12-18 02:56:48 +00:00
|
|
|
bScreen *sc= CTX_wm_screen(C);
|
2008-11-19 16:28:11 +00:00
|
|
|
sAreaSplitData *sd= (sAreaSplitData *)op->customdata;
|
|
|
|
float fac;
|
|
|
|
int dir;
|
|
|
|
|
2009-01-16 23:53:11 +00:00
|
|
|
fac= RNA_float_get(op->ptr, "factor");
|
|
|
|
dir= RNA_enum_get(op->ptr, "direction");
|
2008-11-19 16:28:11 +00:00
|
|
|
|
2008-12-18 02:56:48 +00:00
|
|
|
sd->narea= area_split(CTX_wm_window(C), sc, sd->sarea, dir, fac);
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
if(sd->narea) {
|
|
|
|
ScrVert *sv;
|
|
|
|
|
2008-12-18 02:56:48 +00:00
|
|
|
sd->nedge= area_findsharededge(sc, sd->sarea, sd->narea);
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
/* select newly created edge, prepare for moving edge */
|
2008-12-18 02:56:48 +00:00
|
|
|
for(sv= sc->vertbase.first; sv; sv= sv->next)
|
2008-11-19 16:28:11 +00:00
|
|
|
sv->flag = 0;
|
|
|
|
|
|
|
|
sd->nedge->v1->flag= 1;
|
|
|
|
sd->nedge->v2->flag= 1;
|
|
|
|
|
|
|
|
if(dir=='h') sd->origval= sd->nedge->v1->vec.y;
|
|
|
|
else sd->origval= sd->nedge->v1->vec.x;
|
|
|
|
|
2008-12-27 16:09:56 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
|
Lots of stuff; couldn't commit in parts because of refactor work.
* Changes in interface/ module
This commit brings back the way how buttons/menus work under control
of WM event system. The previous implementation extended usage of
handlers and operators in an interesting but confusing way. Better to
try it first according the design specs. :)
Most obviously:
- modal-handler operators are not stored anymore in regions/areas/windows.
such modal handlers own their operator, and should remove it themselves.
- removed code to move handlers from one queue to another.
(needs review with brecht!)
- WM fix: the API call to remove a modal handler got removed. This was a
dangerous thing anyway, and you should leave that to the event system.
Now, if a handler modal() call gets a cancel/finish return, it frees
itself in event system. WM_event_remove_modal_handler was a confusing
call anyway!
Todo:
- allow button-activate to refresh after using button
- re-enable arrow keys for menus
(do both after commit)
- review return values of operator callbacks in interface_ops.c
* Fixes in WM system
- Freeing areas/regions/windows, also on quit, now correctly closes
running modal handlers
- On starting a modal handler, the handler now stores previous area
and region context, so they send proper notifiers etc.
* Other fixes
- Area-split operator had bug, wrong minimal size checking. This
solves error when trying to split a very narrow area.
- removed DNA_USHORT_FIX from screen_types.h, gave warning
- operators didn't get ID name copied when activated, needed for
later re-use or saving.
2008-12-02 14:22:52 +00:00
|
|
|
|
|
|
|
return 1;
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
|
|
|
|
Lots of stuff; couldn't commit in parts because of refactor work.
* Changes in interface/ module
This commit brings back the way how buttons/menus work under control
of WM event system. The previous implementation extended usage of
handlers and operators in an interesting but confusing way. Better to
try it first according the design specs. :)
Most obviously:
- modal-handler operators are not stored anymore in regions/areas/windows.
such modal handlers own their operator, and should remove it themselves.
- removed code to move handlers from one queue to another.
(needs review with brecht!)
- WM fix: the API call to remove a modal handler got removed. This was a
dangerous thing anyway, and you should leave that to the event system.
Now, if a handler modal() call gets a cancel/finish return, it frees
itself in event system. WM_event_remove_modal_handler was a confusing
call anyway!
Todo:
- allow button-activate to refresh after using button
- re-enable arrow keys for menus
(do both after commit)
- review return values of operator callbacks in interface_ops.c
* Fixes in WM system
- Freeing areas/regions/windows, also on quit, now correctly closes
running modal handlers
- On starting a modal handler, the handler now stores previous area
and region context, so they send proper notifiers etc.
* Other fixes
- Area-split operator had bug, wrong minimal size checking. This
solves error when trying to split a very narrow area.
- removed DNA_USHORT_FIX from screen_types.h, gave warning
- operators didn't get ID name copied when activated, needed for
later re-use or saving.
2008-12-02 14:22:52 +00:00
|
|
|
return 0;
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void area_split_exit(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
if (op->customdata) {
|
|
|
|
MEM_freeN(op->customdata);
|
|
|
|
op->customdata = NULL;
|
|
|
|
}
|
|
|
|
|
2008-12-27 16:09:56 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
/* this makes sure aligned edges will result in aligned grabbing */
|
2008-12-18 02:56:48 +00:00
|
|
|
removedouble_scrverts(CTX_wm_screen(C));
|
|
|
|
removedouble_scredges(CTX_wm_screen(C));
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* UI callback, adds new handler */
|
|
|
|
static int area_split_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|
|
|
{
|
|
|
|
sAreaSplitData *sd;
|
|
|
|
|
|
|
|
if(event->type==EVT_ACTIONZONE) {
|
|
|
|
sActionzoneData *sad= event->customdata;
|
|
|
|
int dir;
|
|
|
|
|
|
|
|
/* verify *sad itself */
|
|
|
|
if(sad==NULL || sad->sa1==NULL || sad->az==NULL)
|
|
|
|
return OPERATOR_PASS_THROUGH;
|
|
|
|
|
|
|
|
/* is this our *sad? if areas not equal it should be passed on */
|
2008-12-18 02:56:48 +00:00
|
|
|
if(CTX_wm_area(C)!=sad->sa1 || sad->sa1!=sad->sa2)
|
2008-11-19 16:28:11 +00:00
|
|
|
return OPERATOR_PASS_THROUGH;
|
|
|
|
|
|
|
|
/* prepare operator state vars */
|
|
|
|
if(sad->gesture_dir==AZONE_N || sad->gesture_dir==AZONE_S) {
|
|
|
|
dir= 'h';
|
2009-01-16 23:53:11 +00:00
|
|
|
RNA_float_set(op->ptr, "factor", ((float)(event->x - sad->sa1->v1->vec.x)) / (float)sad->sa1->winx);
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
dir= 'v';
|
2009-01-16 23:53:11 +00:00
|
|
|
RNA_float_set(op->ptr, "factor", ((float)(event->y - sad->sa1->v1->vec.y)) / (float)sad->sa1->winy);
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
2009-01-16 23:53:11 +00:00
|
|
|
RNA_enum_set(op->ptr, "direction", dir);
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
/* general init, also non-UI case, adds customdata, sets area and defaults */
|
|
|
|
if(!area_split_init(C, op))
|
|
|
|
return OPERATOR_PASS_THROUGH;
|
|
|
|
|
|
|
|
sd= (sAreaSplitData *)op->customdata;
|
|
|
|
|
|
|
|
sd->x= event->x;
|
|
|
|
sd->y= event->y;
|
|
|
|
|
|
|
|
/* do the split */
|
Lots of stuff; couldn't commit in parts because of refactor work.
* Changes in interface/ module
This commit brings back the way how buttons/menus work under control
of WM event system. The previous implementation extended usage of
handlers and operators in an interesting but confusing way. Better to
try it first according the design specs. :)
Most obviously:
- modal-handler operators are not stored anymore in regions/areas/windows.
such modal handlers own their operator, and should remove it themselves.
- removed code to move handlers from one queue to another.
(needs review with brecht!)
- WM fix: the API call to remove a modal handler got removed. This was a
dangerous thing anyway, and you should leave that to the event system.
Now, if a handler modal() call gets a cancel/finish return, it frees
itself in event system. WM_event_remove_modal_handler was a confusing
call anyway!
Todo:
- allow button-activate to refresh after using button
- re-enable arrow keys for menus
(do both after commit)
- review return values of operator callbacks in interface_ops.c
* Fixes in WM system
- Freeing areas/regions/windows, also on quit, now correctly closes
running modal handlers
- On starting a modal handler, the handler now stores previous area
and region context, so they send proper notifiers etc.
* Other fixes
- Area-split operator had bug, wrong minimal size checking. This
solves error when trying to split a very narrow area.
- removed DNA_USHORT_FIX from screen_types.h, gave warning
- operators didn't get ID name copied when activated, needed for
later re-use or saving.
2008-12-02 14:22:52 +00:00
|
|
|
if(area_split_apply(C, op)) {
|
2008-12-18 02:56:48 +00:00
|
|
|
area_move_set_limits(CTX_wm_screen(C), dir, &sd->bigger, &sd->smaller);
|
Lots of stuff; couldn't commit in parts because of refactor work.
* Changes in interface/ module
This commit brings back the way how buttons/menus work under control
of WM event system. The previous implementation extended usage of
handlers and operators in an interesting but confusing way. Better to
try it first according the design specs. :)
Most obviously:
- modal-handler operators are not stored anymore in regions/areas/windows.
such modal handlers own their operator, and should remove it themselves.
- removed code to move handlers from one queue to another.
(needs review with brecht!)
- WM fix: the API call to remove a modal handler got removed. This was a
dangerous thing anyway, and you should leave that to the event system.
Now, if a handler modal() call gets a cancel/finish return, it frees
itself in event system. WM_event_remove_modal_handler was a confusing
call anyway!
Todo:
- allow button-activate to refresh after using button
- re-enable arrow keys for menus
(do both after commit)
- review return values of operator callbacks in interface_ops.c
* Fixes in WM system
- Freeing areas/regions/windows, also on quit, now correctly closes
running modal handlers
- On starting a modal handler, the handler now stores previous area
and region context, so they send proper notifiers etc.
* Other fixes
- Area-split operator had bug, wrong minimal size checking. This
solves error when trying to split a very narrow area.
- removed DNA_USHORT_FIX from screen_types.h, gave warning
- operators didn't get ID name copied when activated, needed for
later re-use or saving.
2008-12-02 14:22:52 +00:00
|
|
|
|
|
|
|
/* add temp handler for edge move or cancel */
|
2008-12-18 02:56:48 +00:00
|
|
|
WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
|
Lots of stuff; couldn't commit in parts because of refactor work.
* Changes in interface/ module
This commit brings back the way how buttons/menus work under control
of WM event system. The previous implementation extended usage of
handlers and operators in an interesting but confusing way. Better to
try it first according the design specs. :)
Most obviously:
- modal-handler operators are not stored anymore in regions/areas/windows.
such modal handlers own their operator, and should remove it themselves.
- removed code to move handlers from one queue to another.
(needs review with brecht!)
- WM fix: the API call to remove a modal handler got removed. This was a
dangerous thing anyway, and you should leave that to the event system.
Now, if a handler modal() call gets a cancel/finish return, it frees
itself in event system. WM_event_remove_modal_handler was a confusing
call anyway!
Todo:
- allow button-activate to refresh after using button
- re-enable arrow keys for menus
(do both after commit)
- review return values of operator callbacks in interface_ops.c
* Fixes in WM system
- Freeing areas/regions/windows, also on quit, now correctly closes
running modal handlers
- On starting a modal handler, the handler now stores previous area
and region context, so they send proper notifiers etc.
* Other fixes
- Area-split operator had bug, wrong minimal size checking. This
solves error when trying to split a very narrow area.
- removed DNA_USHORT_FIX from screen_types.h, gave warning
- operators didn't get ID name copied when activated, needed for
later re-use or saving.
2008-12-02 14:22:52 +00:00
|
|
|
|
|
|
|
return OPERATOR_RUNNING_MODAL;
|
|
|
|
}
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
}
|
2008-11-24 10:45:36 +00:00
|
|
|
else {
|
|
|
|
/* nonmodal for now */
|
|
|
|
return op->type->exec(C, op);
|
|
|
|
}
|
|
|
|
|
2008-11-19 16:28:11 +00:00
|
|
|
return OPERATOR_PASS_THROUGH;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* function to be called outside UI context, or for redo */
|
|
|
|
static int area_split_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!area_split_init(C, op))
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
|
|
|
|
area_split_apply(C, op);
|
|
|
|
area_split_exit(C, op);
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int area_split_cancel(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
sAreaSplitData *sd= (sAreaSplitData *)op->customdata;
|
|
|
|
|
2008-12-18 02:56:48 +00:00
|
|
|
if (screen_area_join(C, CTX_wm_screen(C), sd->sarea, sd->narea)) {
|
|
|
|
if (CTX_wm_area(C) == sd->narea) {
|
|
|
|
CTX_wm_area_set(C, NULL);
|
2008-12-18 19:41:36 +00:00
|
|
|
CTX_wm_region_set(C, NULL);
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
|
|
|
sd->narea = NULL;
|
|
|
|
}
|
|
|
|
area_split_exit(C, op);
|
|
|
|
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int area_split_modal(bContext *C, wmOperator *op, wmEvent *event)
|
|
|
|
{
|
|
|
|
sAreaSplitData *sd= (sAreaSplitData *)op->customdata;
|
2008-12-03 19:33:42 +00:00
|
|
|
float fac;
|
2008-11-19 16:28:11 +00:00
|
|
|
int dir;
|
|
|
|
|
|
|
|
/* execute the events */
|
|
|
|
switch(event->type) {
|
|
|
|
case MOUSEMOVE:
|
2009-01-16 23:53:11 +00:00
|
|
|
dir= RNA_enum_get(op->ptr, "direction");
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
sd->delta= (dir == 'v')? event->x - sd->origval: event->y - sd->origval;
|
|
|
|
area_move_apply_do(C, sd->origval, sd->delta, dir, sd->bigger, sd->smaller);
|
|
|
|
|
2008-12-03 19:33:42 +00:00
|
|
|
fac= (dir == 'v') ? event->x-sd->origmin : event->y-sd->origmin;
|
2009-01-16 23:53:11 +00:00
|
|
|
RNA_float_set(op->ptr, "factor", fac / (float)sd->origsize);
|
2008-12-03 19:33:42 +00:00
|
|
|
|
2008-12-27 16:09:56 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
|
2008-11-19 16:28:11 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LEFTMOUSE:
|
|
|
|
if(event->val==0) { /* mouse up */
|
|
|
|
area_split_exit(C, op);
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case RIGHTMOUSE: /* cancel operation */
|
|
|
|
case ESCKEY:
|
|
|
|
return area_split_cancel(C, op);
|
|
|
|
}
|
|
|
|
|
|
|
|
return OPERATOR_RUNNING_MODAL;
|
|
|
|
}
|
|
|
|
|
2008-12-09 15:59:43 +00:00
|
|
|
static EnumPropertyItem prop_direction_items[] = {
|
|
|
|
{'h', "HORIZONTAL", "Horizontal", ""},
|
|
|
|
{'v', "VERTICAL", "Vertical", ""},
|
|
|
|
{0, NULL, NULL, NULL}};
|
|
|
|
|
2008-12-26 11:11:21 +00:00
|
|
|
void SCREEN_OT_area_split(wmOperatorType *ot)
|
2008-11-19 16:28:11 +00:00
|
|
|
{
|
|
|
|
ot->name = "Split area";
|
2008-12-26 11:11:21 +00:00
|
|
|
ot->idname = "SCREEN_OT_area_split";
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
ot->exec= area_split_exec;
|
|
|
|
ot->invoke= area_split_invoke;
|
|
|
|
ot->modal= area_split_modal;
|
|
|
|
|
2008-11-24 10:45:36 +00:00
|
|
|
ot->poll= ED_operator_areaactive;
|
2008-12-03 19:33:42 +00:00
|
|
|
ot->flag= OPTYPE_REGISTER;
|
|
|
|
|
2008-11-21 19:14:38 +00:00
|
|
|
/* rna */
|
2009-01-16 23:53:11 +00:00
|
|
|
RNA_def_enum(ot->srna, "direction", prop_direction_items, 'h', "Direction", "");
|
|
|
|
RNA_def_float(ot->srna, "factor", 0.5f, 0.0, 1.0, "Factor", "", 0.0, 1.0);
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
|
|
|
|
2008-12-17 16:21:14 +00:00
|
|
|
/* ************** frame change operator ***************************** */
|
|
|
|
|
|
|
|
|
|
|
|
/* function to be called outside UI context, or for redo */
|
|
|
|
static int frame_offset_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
int delta;
|
|
|
|
|
|
|
|
delta = RNA_int_get(op->ptr, "delta");
|
|
|
|
|
2008-12-18 02:56:48 +00:00
|
|
|
CTX_data_scene(C)->r.cfra += delta;
|
2009-02-09 15:50:09 +00:00
|
|
|
|
2008-12-27 16:09:56 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, CTX_data_scene(C));
|
2008-12-17 16:21:14 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
2008-12-26 11:11:21 +00:00
|
|
|
void SCREEN_OT_frame_offset(wmOperatorType *ot)
|
2008-12-17 16:21:14 +00:00
|
|
|
{
|
|
|
|
ot->name = "Frame Offset";
|
2008-12-26 11:11:21 +00:00
|
|
|
ot->idname = "SCREEN_OT_frame_offset";
|
2008-12-17 16:21:14 +00:00
|
|
|
|
|
|
|
ot->exec= frame_offset_exec;
|
|
|
|
|
|
|
|
ot->poll= ED_operator_screenactive;
|
|
|
|
ot->flag= OPTYPE_REGISTER;
|
|
|
|
|
|
|
|
/* rna */
|
2009-01-16 23:53:11 +00:00
|
|
|
RNA_def_int(ot->srna, "delta", 0, INT_MIN, INT_MAX, "Delta", "", INT_MIN, INT_MAX);
|
2008-12-17 16:21:14 +00:00
|
|
|
}
|
|
|
|
|
2008-12-17 17:33:45 +00:00
|
|
|
/* ************** switch screen operator ***************************** */
|
|
|
|
|
|
|
|
|
|
|
|
/* function to be called outside UI context, or for redo */
|
|
|
|
static int screen_set_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
2008-12-18 02:56:48 +00:00
|
|
|
bScreen *screen= CTX_wm_screen(C);
|
2009-02-08 12:16:35 +00:00
|
|
|
ScrArea *sa= CTX_wm_area(C);
|
2009-02-07 19:37:29 +00:00
|
|
|
int tot= BLI_countlist(&CTX_data_main(C)->screen);
|
2008-12-17 17:33:45 +00:00
|
|
|
int delta= RNA_int_get(op->ptr, "delta");
|
|
|
|
|
2008-12-17 19:40:19 +00:00
|
|
|
/* this screen is 'fake', solve later XXX */
|
2009-02-08 12:16:35 +00:00
|
|
|
if(sa && sa->full)
|
2008-12-17 19:40:19 +00:00
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
|
2008-12-17 17:33:45 +00:00
|
|
|
if(delta==1) {
|
2009-02-07 19:37:29 +00:00
|
|
|
while(tot--) {
|
|
|
|
screen= screen->id.next;
|
|
|
|
if(screen==NULL) screen= CTX_data_main(C)->screen.first;
|
|
|
|
if(screen->winid==0 && screen->full==0)
|
|
|
|
break;
|
|
|
|
}
|
2008-12-17 17:33:45 +00:00
|
|
|
}
|
|
|
|
else if(delta== -1) {
|
2009-02-07 19:37:29 +00:00
|
|
|
while(tot--) {
|
|
|
|
screen= screen->id.prev;
|
|
|
|
if(screen==NULL) screen= CTX_data_main(C)->screen.last;
|
|
|
|
if(screen->winid==0 && screen->full==0)
|
|
|
|
break;
|
|
|
|
}
|
2008-12-17 17:33:45 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
screen= NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(screen) {
|
2009-02-07 19:37:29 +00:00
|
|
|
ED_screen_set(C, screen);
|
2008-12-17 17:33:45 +00:00
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
|
2008-12-26 11:11:21 +00:00
|
|
|
void SCREEN_OT_screen_set(wmOperatorType *ot)
|
2008-12-17 17:33:45 +00:00
|
|
|
{
|
|
|
|
ot->name = "Set Screen";
|
2008-12-26 11:11:21 +00:00
|
|
|
ot->idname = "SCREEN_OT_screen_set";
|
2008-12-17 17:33:45 +00:00
|
|
|
|
|
|
|
ot->exec= screen_set_exec;
|
|
|
|
ot->poll= ED_operator_screenactive;
|
|
|
|
|
|
|
|
/* rna */
|
2009-01-16 23:53:11 +00:00
|
|
|
RNA_def_pointer_runtime(ot->srna, "screen", &RNA_Screen, "Screen", "");
|
|
|
|
RNA_def_int(ot->srna, "delta", 0, INT_MIN, INT_MAX, "Delta", "", INT_MIN, INT_MAX);
|
2008-12-17 17:33:45 +00:00
|
|
|
}
|
|
|
|
|
2008-12-17 19:40:19 +00:00
|
|
|
/* ************** screen full-area operator ***************************** */
|
|
|
|
|
|
|
|
|
|
|
|
/* function to be called outside UI context, or for redo */
|
|
|
|
static int screen_full_area_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
2009-02-04 17:40:50 +00:00
|
|
|
ed_screen_fullarea(C, CTX_wm_area(C));
|
2008-12-17 19:40:19 +00:00
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
2008-12-26 11:11:21 +00:00
|
|
|
void SCREEN_OT_screen_full_area(wmOperatorType *ot)
|
2008-12-17 19:40:19 +00:00
|
|
|
{
|
2009-01-25 20:22:05 +00:00
|
|
|
ot->name = "Toggle Make Area Fullscreen";
|
2008-12-26 11:11:21 +00:00
|
|
|
ot->idname = "SCREEN_OT_screen_full_area";
|
2008-12-17 19:40:19 +00:00
|
|
|
|
|
|
|
ot->exec= screen_full_area_exec;
|
2009-02-08 12:16:35 +00:00
|
|
|
ot->poll= ED_operator_areaactive;
|
2009-01-31 19:40:40 +00:00
|
|
|
ot->flag= OPTYPE_REGISTER;
|
|
|
|
|
2008-12-17 19:40:19 +00:00
|
|
|
}
|
|
|
|
|
2008-12-17 17:33:45 +00:00
|
|
|
|
|
|
|
|
2008-11-19 16:28:11 +00:00
|
|
|
/* ************** join area operator ********************************************** */
|
|
|
|
|
|
|
|
/* operator state vars used:
|
|
|
|
x1, y1 mouse coord in first area, which will disappear
|
|
|
|
x2, y2 mouse coord in 2nd area, which will become joined
|
|
|
|
|
|
|
|
functions:
|
|
|
|
|
|
|
|
init() find edge based on state vars
|
|
|
|
test if the edge divides two areas,
|
|
|
|
store active and nonactive area,
|
|
|
|
|
|
|
|
apply() do the actual join
|
|
|
|
|
|
|
|
exit() cleanup, send notifier
|
|
|
|
|
|
|
|
callbacks:
|
|
|
|
|
|
|
|
exec() calls init, apply, exit
|
|
|
|
|
|
|
|
invoke() sets mouse coords in x,y
|
|
|
|
call init()
|
|
|
|
add modal handler
|
|
|
|
|
|
|
|
modal() accept modal events while doing it
|
|
|
|
call apply() with active window and nonactive window
|
|
|
|
call exit() and remove handler when LMB confirm
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct sAreaJoinData
|
|
|
|
{
|
|
|
|
ScrArea *sa1; /* first area to be considered */
|
|
|
|
ScrArea *sa2; /* second area to be considered */
|
|
|
|
ScrArea *scr; /* designed for removal */
|
|
|
|
|
|
|
|
} sAreaJoinData;
|
|
|
|
|
|
|
|
|
|
|
|
/* validate selection inside screen, set variables OK */
|
|
|
|
/* return 0: init failed */
|
|
|
|
/* XXX todo: find edge based on (x,y) and set other area? */
|
|
|
|
static int area_join_init(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
ScrArea *sa1, *sa2;
|
|
|
|
sAreaJoinData* jd= NULL;
|
|
|
|
int x1, y1;
|
|
|
|
int x2, y2;
|
|
|
|
|
|
|
|
/* required properties, make negative to get return 0 if not set by caller */
|
2008-11-24 15:51:55 +00:00
|
|
|
x1= RNA_int_get(op->ptr, "x1");
|
|
|
|
y1= RNA_int_get(op->ptr, "y1");
|
|
|
|
x2= RNA_int_get(op->ptr, "x2");
|
|
|
|
y2= RNA_int_get(op->ptr, "y2");
|
2008-11-19 16:28:11 +00:00
|
|
|
|
2008-12-18 02:56:48 +00:00
|
|
|
sa1 = screen_areahascursor(CTX_wm_screen(C), x1, y1);
|
|
|
|
sa2 = screen_areahascursor(CTX_wm_screen(C), x2, y2);
|
2008-11-19 16:28:11 +00:00
|
|
|
if(sa1==NULL || sa2==NULL || sa1==sa2)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
jd = (sAreaJoinData*)MEM_callocN(sizeof (sAreaJoinData), "op_area_join");
|
|
|
|
|
|
|
|
jd->sa1 = sa1;
|
|
|
|
jd->sa1->flag |= AREA_FLAG_DRAWJOINFROM;
|
|
|
|
jd->sa2 = sa2;
|
|
|
|
jd->sa2->flag |= AREA_FLAG_DRAWJOINTO;
|
|
|
|
|
|
|
|
op->customdata= jd;
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* apply the join of the areas (space types) */
|
|
|
|
static int area_join_apply(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
sAreaJoinData *jd = (sAreaJoinData *)op->customdata;
|
|
|
|
if (!jd) return 0;
|
|
|
|
|
2008-12-18 02:56:48 +00:00
|
|
|
if(!screen_area_join(C, CTX_wm_screen(C), jd->sa1, jd->sa2)){
|
2008-11-19 16:28:11 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2008-12-18 02:56:48 +00:00
|
|
|
if (CTX_wm_area(C) == jd->sa2) {
|
|
|
|
CTX_wm_area_set(C, NULL);
|
2008-12-18 19:41:36 +00:00
|
|
|
CTX_wm_region_set(C, NULL);
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* finish operation */
|
|
|
|
static void area_join_exit(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
if (op->customdata) {
|
|
|
|
MEM_freeN(op->customdata);
|
|
|
|
op->customdata = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* this makes sure aligned edges will result in aligned grabbing */
|
2008-12-18 02:56:48 +00:00
|
|
|
removedouble_scredges(CTX_wm_screen(C));
|
|
|
|
removenotused_scredges(CTX_wm_screen(C));
|
|
|
|
removenotused_scrverts(CTX_wm_screen(C));
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int area_join_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
if(!area_join_init(C, op))
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
|
|
|
|
area_join_apply(C, op);
|
|
|
|
area_join_exit(C, op);
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* interaction callback */
|
|
|
|
static int area_join_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|
|
|
{
|
|
|
|
|
|
|
|
if(event->type==EVT_ACTIONZONE) {
|
|
|
|
sActionzoneData *sad= event->customdata;
|
|
|
|
|
|
|
|
/* verify *sad itself */
|
|
|
|
if(sad==NULL || sad->sa1==NULL || sad->sa2==NULL)
|
|
|
|
return OPERATOR_PASS_THROUGH;
|
|
|
|
|
|
|
|
/* is this our *sad? if areas equal it should be passed on */
|
|
|
|
if(sad->sa1==sad->sa2)
|
|
|
|
return OPERATOR_PASS_THROUGH;
|
|
|
|
|
|
|
|
/* prepare operator state vars */
|
2008-11-24 15:51:55 +00:00
|
|
|
RNA_int_set(op->ptr, "x1", sad->x);
|
|
|
|
RNA_int_set(op->ptr, "y1", sad->y);
|
|
|
|
RNA_int_set(op->ptr, "x2", event->x);
|
|
|
|
RNA_int_set(op->ptr, "y2", event->y);
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
if(!area_join_init(C, op))
|
|
|
|
return OPERATOR_PASS_THROUGH;
|
|
|
|
|
|
|
|
/* add temp handler */
|
2008-12-18 02:56:48 +00:00
|
|
|
WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
return OPERATOR_RUNNING_MODAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return OPERATOR_PASS_THROUGH;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int area_join_cancel(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
sAreaJoinData *jd = (sAreaJoinData *)op->customdata;
|
|
|
|
|
|
|
|
if (jd->sa1) {
|
|
|
|
jd->sa1->flag &= ~AREA_FLAG_DRAWJOINFROM;
|
|
|
|
jd->sa1->flag &= ~AREA_FLAG_DRAWJOINTO;
|
|
|
|
}
|
|
|
|
if (jd->sa2) {
|
|
|
|
jd->sa2->flag &= ~AREA_FLAG_DRAWJOINFROM;
|
|
|
|
jd->sa2->flag &= ~AREA_FLAG_DRAWJOINTO;
|
|
|
|
}
|
|
|
|
|
2008-12-27 16:09:56 +00:00
|
|
|
WM_event_add_notifier(C, NC_WINDOW, NULL);
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
area_join_exit(C, op);
|
|
|
|
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* modal callback while selecting area (space) that will be removed */
|
|
|
|
static int area_join_modal(bContext *C, wmOperator *op, wmEvent *event)
|
|
|
|
{
|
2008-12-18 02:56:48 +00:00
|
|
|
bScreen *sc= CTX_wm_screen(C);
|
2008-11-19 16:28:11 +00:00
|
|
|
sAreaJoinData *jd = (sAreaJoinData *)op->customdata;
|
|
|
|
|
|
|
|
/* execute the events */
|
|
|
|
switch(event->type) {
|
|
|
|
|
|
|
|
case MOUSEMOVE:
|
|
|
|
{
|
2008-12-18 02:56:48 +00:00
|
|
|
ScrArea *sa = screen_areahascursor(sc, event->x, event->y);
|
2008-11-19 16:28:11 +00:00
|
|
|
int dir;
|
|
|
|
|
|
|
|
if (sa) {
|
|
|
|
if (jd->sa1 != sa) {
|
2008-12-18 02:56:48 +00:00
|
|
|
dir = area_getorientation(sc, jd->sa1, sa);
|
2008-11-19 16:28:11 +00:00
|
|
|
if (dir >= 0) {
|
|
|
|
if (jd->sa2) jd->sa2->flag &= ~AREA_FLAG_DRAWJOINTO;
|
|
|
|
jd->sa2 = sa;
|
|
|
|
jd->sa2->flag |= AREA_FLAG_DRAWJOINTO;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* we are not bordering on the previously selected area
|
|
|
|
we check if area has common border with the one marked for removal
|
|
|
|
in this case we can swap areas.
|
|
|
|
*/
|
2008-12-18 02:56:48 +00:00
|
|
|
dir = area_getorientation(sc, sa, jd->sa2);
|
2008-11-19 16:28:11 +00:00
|
|
|
if (dir >= 0) {
|
|
|
|
if (jd->sa1) jd->sa1->flag &= ~AREA_FLAG_DRAWJOINFROM;
|
|
|
|
if (jd->sa2) jd->sa2->flag &= ~AREA_FLAG_DRAWJOINTO;
|
|
|
|
jd->sa1 = jd->sa2;
|
|
|
|
jd->sa2 = sa;
|
|
|
|
if (jd->sa1) jd->sa1->flag |= AREA_FLAG_DRAWJOINFROM;
|
|
|
|
if (jd->sa2) jd->sa2->flag |= AREA_FLAG_DRAWJOINTO;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if (jd->sa2) jd->sa2->flag &= ~AREA_FLAG_DRAWJOINTO;
|
|
|
|
jd->sa2 = NULL;
|
|
|
|
}
|
|
|
|
}
|
2008-12-27 16:09:56 +00:00
|
|
|
WM_event_add_notifier(C, NC_WINDOW, NULL);
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* we are back in the area previously selected for keeping
|
|
|
|
* we swap the areas if possible to allow user to choose */
|
|
|
|
if (jd->sa2 != NULL) {
|
|
|
|
if (jd->sa1) jd->sa1->flag &= ~AREA_FLAG_DRAWJOINFROM;
|
|
|
|
if (jd->sa2) jd->sa2->flag &= ~AREA_FLAG_DRAWJOINTO;
|
|
|
|
jd->sa1 = jd->sa2;
|
|
|
|
jd->sa2 = sa;
|
|
|
|
if (jd->sa1) jd->sa1->flag |= AREA_FLAG_DRAWJOINFROM;
|
|
|
|
if (jd->sa2) jd->sa2->flag |= AREA_FLAG_DRAWJOINTO;
|
2008-12-18 02:56:48 +00:00
|
|
|
dir = area_getorientation(sc, jd->sa1, jd->sa2);
|
2008-11-19 16:28:11 +00:00
|
|
|
if (dir < 0) {
|
|
|
|
printf("oops, didn't expect that!\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
2008-12-18 02:56:48 +00:00
|
|
|
dir = area_getorientation(sc, jd->sa1, sa);
|
2008-11-19 16:28:11 +00:00
|
|
|
if (dir >= 0) {
|
|
|
|
if (jd->sa2) jd->sa2->flag &= ~AREA_FLAG_DRAWJOINTO;
|
|
|
|
jd->sa2 = sa;
|
|
|
|
jd->sa2->flag |= AREA_FLAG_DRAWJOINTO;
|
|
|
|
}
|
|
|
|
}
|
2008-12-27 16:09:56 +00:00
|
|
|
WM_event_add_notifier(C, NC_WINDOW, NULL);
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case LEFTMOUSE:
|
|
|
|
if(event->val==0) {
|
|
|
|
area_join_apply(C, op);
|
2008-12-27 16:09:56 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
|
2008-11-19 16:28:11 +00:00
|
|
|
area_join_exit(C, op);
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ESCKEY:
|
|
|
|
return area_join_cancel(C, op);
|
|
|
|
}
|
|
|
|
|
|
|
|
return OPERATOR_RUNNING_MODAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Operator for joining two areas (space types) */
|
2008-12-26 11:11:21 +00:00
|
|
|
void SCREEN_OT_area_join(wmOperatorType *ot)
|
2008-11-19 16:28:11 +00:00
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Join area";
|
2008-12-26 11:11:21 +00:00
|
|
|
ot->idname= "SCREEN_OT_area_join";
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= area_join_exec;
|
|
|
|
ot->invoke= area_join_invoke;
|
|
|
|
ot->modal= area_join_modal;
|
|
|
|
|
2009-02-08 12:16:35 +00:00
|
|
|
ot->poll= ED_operator_areaactive;
|
2008-11-21 19:14:38 +00:00
|
|
|
|
|
|
|
/* rna */
|
2009-01-16 23:53:11 +00:00
|
|
|
RNA_def_int(ot->srna, "x1", -100, INT_MIN, INT_MAX, "X 1", "", INT_MIN, INT_MAX);
|
|
|
|
RNA_def_int(ot->srna, "y1", -100, INT_MIN, INT_MAX, "Y 1", "", INT_MIN, INT_MAX);
|
|
|
|
RNA_def_int(ot->srna, "x2", -100, INT_MIN, INT_MAX, "X 2", "", INT_MIN, INT_MAX);
|
|
|
|
RNA_def_int(ot->srna, "y2", -100, INT_MIN, INT_MAX, "Y 2", "", INT_MIN, INT_MAX);
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
|
|
|
|
2008-12-03 19:33:42 +00:00
|
|
|
/* ************** repeat last operator ***************************** */
|
|
|
|
|
|
|
|
static int repeat_last_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
2008-12-18 02:56:48 +00:00
|
|
|
wmOperator *lastop= CTX_wm_manager(C)->operators.last;
|
2008-12-03 19:33:42 +00:00
|
|
|
|
2009-02-01 12:00:00 +00:00
|
|
|
if(lastop)
|
|
|
|
WM_operator_repeat(C, lastop);
|
2008-12-03 19:33:42 +00:00
|
|
|
|
2009-01-31 19:40:40 +00:00
|
|
|
return OPERATOR_CANCELLED;
|
2008-12-03 19:33:42 +00:00
|
|
|
}
|
|
|
|
|
2008-12-26 11:11:21 +00:00
|
|
|
void SCREEN_OT_repeat_last(wmOperatorType *ot)
|
2008-12-03 19:33:42 +00:00
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Repeat Last";
|
2008-12-26 11:11:21 +00:00
|
|
|
ot->idname= "SCREEN_OT_repeat_last";
|
2008-12-03 19:33:42 +00:00
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= repeat_last_exec;
|
|
|
|
|
|
|
|
ot->poll= ED_operator_screenactive;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2009-01-15 18:28:40 +00:00
|
|
|
static int repeat_history_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|
|
|
{
|
|
|
|
wmWindowManager *wm= CTX_wm_manager(C);
|
|
|
|
wmOperator *lastop;
|
2009-02-04 11:52:16 +00:00
|
|
|
uiMenuItem *head;
|
2009-01-15 18:28:40 +00:00
|
|
|
int items, i;
|
|
|
|
|
|
|
|
items= BLI_countlist(&wm->operators);
|
|
|
|
if(items==0)
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
|
2009-02-04 11:52:16 +00:00
|
|
|
head= uiPupMenuBegin(op->type->name, 0);
|
|
|
|
|
2009-01-15 18:28:40 +00:00
|
|
|
for (i=items-1, lastop= wm->operators.last; lastop; lastop= lastop->prev, i--)
|
2009-02-04 11:52:16 +00:00
|
|
|
uiMenuItemIntO(head, lastop->type->name, 0, op->type->idname, "index", i);
|
|
|
|
|
|
|
|
uiPupMenuEnd(C, head);
|
2009-01-15 18:28:40 +00:00
|
|
|
|
2009-02-04 11:52:16 +00:00
|
|
|
return OPERATOR_CANCELLED;
|
2009-01-15 18:28:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int repeat_history_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
wmWindowManager *wm= CTX_wm_manager(C);
|
|
|
|
|
|
|
|
op= BLI_findlink(&wm->operators, RNA_int_get(op->ptr, "index"));
|
|
|
|
if(op) {
|
|
|
|
/* let's put it as last operator in list */
|
|
|
|
BLI_remlink(&wm->operators, op);
|
|
|
|
BLI_addtail(&wm->operators, op);
|
|
|
|
|
2009-02-01 12:00:00 +00:00
|
|
|
WM_operator_repeat(C, op);
|
2009-01-15 18:28:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SCREEN_OT_repeat_history(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Repeat History";
|
|
|
|
ot->idname= "SCREEN_OT_repeat_history";
|
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->invoke= repeat_history_invoke;
|
|
|
|
ot->exec= repeat_history_exec;
|
|
|
|
|
|
|
|
ot->poll= ED_operator_screenactive;
|
|
|
|
|
2009-01-16 23:53:11 +00:00
|
|
|
RNA_def_int(ot->srna, "index", 0, 0, INT_MAX, "Index", "", 0, 1000);
|
2009-01-15 18:28:40 +00:00
|
|
|
}
|
|
|
|
|
2009-02-04 11:52:16 +00:00
|
|
|
/* ********************** redo operator ***************************** */
|
|
|
|
|
|
|
|
static int redo_last_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
#if 0
|
|
|
|
/* XXX context is not correct after popup menu */
|
|
|
|
wmOperator *lastop= CTX_wm_manager(C)->operators.last;
|
|
|
|
|
|
|
|
if(lastop) {
|
|
|
|
ED_undo_pop(C);
|
|
|
|
WM_operator_repeat(C, lastop);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void redo_last_cb(bContext *C, void *arg1, void *arg2)
|
|
|
|
{
|
2009-02-07 16:43:55 +00:00
|
|
|
wmOperator *lastop= CTX_wm_manager(C)->operators.last;
|
|
|
|
|
|
|
|
if(lastop) {
|
|
|
|
ED_undo_pop(C);
|
|
|
|
WM_operator_repeat(C, lastop);
|
|
|
|
}
|
|
|
|
|
2009-02-04 11:52:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static uiBlock *ui_block_create_redo_last(bContext *C, ARegion *ar, void *arg_op)
|
|
|
|
{
|
|
|
|
wmWindowManager *wm= CTX_wm_manager(C);
|
|
|
|
wmOperator *op= arg_op;
|
|
|
|
PointerRNA ptr;
|
|
|
|
uiBlock *block;
|
|
|
|
int height;
|
|
|
|
|
|
|
|
block= uiBeginBlock(C, ar, "redo_last_popup", UI_EMBOSS, UI_HELV);
|
|
|
|
uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1);
|
|
|
|
uiBlockSetFunc(block, redo_last_cb, NULL, NULL);
|
|
|
|
|
|
|
|
if(!op->properties) {
|
|
|
|
IDPropertyTemplate val = {0};
|
|
|
|
op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties");
|
|
|
|
}
|
|
|
|
|
|
|
|
RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
|
|
|
|
height= uiDefAutoButsRNA(block, &ptr);
|
|
|
|
|
|
|
|
uiPopupBoundsBlock(block, 4.0f, 0, 0);
|
|
|
|
uiEndBlock(C, block);
|
|
|
|
|
|
|
|
return block;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int redo_last_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|
|
|
{
|
|
|
|
wmWindowManager *wm= CTX_wm_manager(C);
|
|
|
|
wmOperator *lastop= wm->operators.last;
|
|
|
|
|
|
|
|
if(!lastop)
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
|
|
|
|
/* only for operators that are registered and did an undo push */
|
|
|
|
if(!(lastop->type->flag & OPTYPE_REGISTER) || !(lastop->type->flag & OPTYPE_UNDO))
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
|
|
|
|
uiPupBlockO(C, ui_block_create_redo_last, lastop, op->type->idname, WM_OP_EXEC_DEFAULT);
|
|
|
|
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SCREEN_OT_redo_last(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Redo Last";
|
|
|
|
ot->idname= "SCREEN_OT_redo_last";
|
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->invoke= redo_last_invoke;
|
|
|
|
ot->exec= redo_last_exec;
|
|
|
|
|
|
|
|
ot->poll= ED_operator_screenactive;
|
|
|
|
}
|
|
|
|
|
2008-12-09 15:59:43 +00:00
|
|
|
/* ************** region split operator ***************************** */
|
|
|
|
|
|
|
|
/* insert a region in the area region list */
|
|
|
|
static int region_split_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
2008-12-18 02:56:48 +00:00
|
|
|
ARegion *ar= CTX_wm_region(C);
|
2008-12-09 15:59:43 +00:00
|
|
|
|
2.5
View3D has been split now in a local part (RegionView3D) and a
per-area part (old View3D). Currently local is:
- view transform
- camera zoom/offset
- gpencil (todo)
- custom clipping planes
Rest is in Area still, like active camera, draw type, layers,
localview, custom centers, around-settings, transform widget,
gridlines, and so on (mostly stuff as available in header).
To see it work; also added new feature for region split,
press SHIFT+ALT+CTRL+S for four-split.
The idea is to make a preset 4-split, configured to stick
to top/right/front views for three views.
Another cool idea to explore is to then box-clip all drawing
based on these 3 views.
Note about the code:
- currently view3d still stores some depricated settings, to
convert from older files. Not all settings are copied over
though, like custom clip planes or the 'lock view to object'.
- since some view3d ops are now on area level, the operators
for it should keep track of that.
Bugfix in transform: quat initialize in operator-invoke missed
one zero.
Als brought back GE to compile for missing Ipos and channels.
2009-01-19 16:54:41 +00:00
|
|
|
if(ar->regiontype==RGN_TYPE_HEADER)
|
|
|
|
BKE_report(op->reports, RPT_ERROR, "Cannot split header");
|
|
|
|
else if(ar->alignment==RGN_ALIGN_QSPLIT)
|
|
|
|
BKE_report(op->reports, RPT_ERROR, "Cannot split further");
|
|
|
|
else {
|
|
|
|
ScrArea *sa= CTX_wm_area(C);
|
|
|
|
ARegion *newar= BKE_area_region_copy(sa->type, ar);
|
|
|
|
int dir= RNA_enum_get(op->ptr, "type");
|
2008-12-09 15:59:43 +00:00
|
|
|
|
2.5
View3D has been split now in a local part (RegionView3D) and a
per-area part (old View3D). Currently local is:
- view transform
- camera zoom/offset
- gpencil (todo)
- custom clipping planes
Rest is in Area still, like active camera, draw type, layers,
localview, custom centers, around-settings, transform widget,
gridlines, and so on (mostly stuff as available in header).
To see it work; also added new feature for region split,
press SHIFT+ALT+CTRL+S for four-split.
The idea is to make a preset 4-split, configured to stick
to top/right/front views for three views.
Another cool idea to explore is to then box-clip all drawing
based on these 3 views.
Note about the code:
- currently view3d still stores some depricated settings, to
convert from older files. Not all settings are copied over
though, like custom clip planes or the 'lock view to object'.
- since some view3d ops are now on area level, the operators
for it should keep track of that.
Bugfix in transform: quat initialize in operator-invoke missed
one zero.
Als brought back GE to compile for missing Ipos and channels.
2009-01-19 16:54:41 +00:00
|
|
|
BLI_insertlinkafter(&sa->regionbase, ar, newar);
|
|
|
|
|
|
|
|
newar->alignment= ar->alignment;
|
|
|
|
|
|
|
|
if(dir=='h')
|
|
|
|
ar->alignment= RGN_ALIGN_HSPLIT;
|
|
|
|
else
|
|
|
|
ar->alignment= RGN_ALIGN_VSPLIT;
|
|
|
|
|
|
|
|
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
|
|
|
|
}
|
2008-12-09 15:59:43 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
2008-12-26 11:11:21 +00:00
|
|
|
void SCREEN_OT_region_split(wmOperatorType *ot)
|
2008-12-09 15:59:43 +00:00
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Split Region";
|
2008-12-26 11:11:21 +00:00
|
|
|
ot->idname= "SCREEN_OT_region_split";
|
2008-12-09 15:59:43 +00:00
|
|
|
|
|
|
|
/* api callbacks */
|
2.5
View3D has been split now in a local part (RegionView3D) and a
per-area part (old View3D). Currently local is:
- view transform
- camera zoom/offset
- gpencil (todo)
- custom clipping planes
Rest is in Area still, like active camera, draw type, layers,
localview, custom centers, around-settings, transform widget,
gridlines, and so on (mostly stuff as available in header).
To see it work; also added new feature for region split,
press SHIFT+ALT+CTRL+S for four-split.
The idea is to make a preset 4-split, configured to stick
to top/right/front views for three views.
Another cool idea to explore is to then box-clip all drawing
based on these 3 views.
Note about the code:
- currently view3d still stores some depricated settings, to
convert from older files. Not all settings are copied over
though, like custom clip planes or the 'lock view to object'.
- since some view3d ops are now on area level, the operators
for it should keep track of that.
Bugfix in transform: quat initialize in operator-invoke missed
one zero.
Als brought back GE to compile for missing Ipos and channels.
2009-01-19 16:54:41 +00:00
|
|
|
ot->invoke= WM_menu_invoke;
|
2008-12-09 15:59:43 +00:00
|
|
|
ot->exec= region_split_exec;
|
|
|
|
ot->poll= ED_operator_areaactive;
|
|
|
|
|
2.5
View3D has been split now in a local part (RegionView3D) and a
per-area part (old View3D). Currently local is:
- view transform
- camera zoom/offset
- gpencil (todo)
- custom clipping planes
Rest is in Area still, like active camera, draw type, layers,
localview, custom centers, around-settings, transform widget,
gridlines, and so on (mostly stuff as available in header).
To see it work; also added new feature for region split,
press SHIFT+ALT+CTRL+S for four-split.
The idea is to make a preset 4-split, configured to stick
to top/right/front views for three views.
Another cool idea to explore is to then box-clip all drawing
based on these 3 views.
Note about the code:
- currently view3d still stores some depricated settings, to
convert from older files. Not all settings are copied over
though, like custom clip planes or the 'lock view to object'.
- since some view3d ops are now on area level, the operators
for it should keep track of that.
Bugfix in transform: quat initialize in operator-invoke missed
one zero.
Als brought back GE to compile for missing Ipos and channels.
2009-01-19 16:54:41 +00:00
|
|
|
RNA_def_enum(ot->srna, "type", prop_direction_items, 'h', "Direction", "");
|
2008-12-09 15:59:43 +00:00
|
|
|
}
|
|
|
|
|
2.5
View3D has been split now in a local part (RegionView3D) and a
per-area part (old View3D). Currently local is:
- view transform
- camera zoom/offset
- gpencil (todo)
- custom clipping planes
Rest is in Area still, like active camera, draw type, layers,
localview, custom centers, around-settings, transform widget,
gridlines, and so on (mostly stuff as available in header).
To see it work; also added new feature for region split,
press SHIFT+ALT+CTRL+S for four-split.
The idea is to make a preset 4-split, configured to stick
to top/right/front views for three views.
Another cool idea to explore is to then box-clip all drawing
based on these 3 views.
Note about the code:
- currently view3d still stores some depricated settings, to
convert from older files. Not all settings are copied over
though, like custom clip planes or the 'lock view to object'.
- since some view3d ops are now on area level, the operators
for it should keep track of that.
Bugfix in transform: quat initialize in operator-invoke missed
one zero.
Als brought back GE to compile for missing Ipos and channels.
2009-01-19 16:54:41 +00:00
|
|
|
/* ************** region four-split operator ***************************** */
|
|
|
|
|
|
|
|
/* insert a region in the area region list */
|
|
|
|
static int region_foursplit_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
ARegion *ar= CTX_wm_region(C);
|
|
|
|
|
|
|
|
/* some rules... */
|
|
|
|
if(ar->regiontype!=RGN_TYPE_WINDOW)
|
|
|
|
BKE_report(op->reports, RPT_ERROR, "Only window region can be 4-splitted");
|
2009-01-20 18:31:11 +00:00
|
|
|
else if(ar->alignment==RGN_ALIGN_QSPLIT) {
|
|
|
|
ScrArea *sa= CTX_wm_area(C);
|
|
|
|
ARegion *arn;
|
|
|
|
|
|
|
|
/* keep current region */
|
|
|
|
ar->alignment= 0;
|
|
|
|
|
|
|
|
if(sa->spacetype==SPACE_VIEW3D) {
|
|
|
|
RegionView3D *rv3d= ar->regiondata;
|
|
|
|
rv3d->viewlock= 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
for(ar= sa->regionbase.first; ar; ar= arn) {
|
|
|
|
arn= ar->next;
|
|
|
|
if(ar->alignment==RGN_ALIGN_QSPLIT) {
|
|
|
|
ED_region_exit(C, ar);
|
|
|
|
BKE_area_region_free(sa->type, ar);
|
|
|
|
BLI_remlink(&sa->regionbase, ar);
|
|
|
|
MEM_freeN(ar);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
|
|
|
|
}
|
2.5
View3D has been split now in a local part (RegionView3D) and a
per-area part (old View3D). Currently local is:
- view transform
- camera zoom/offset
- gpencil (todo)
- custom clipping planes
Rest is in Area still, like active camera, draw type, layers,
localview, custom centers, around-settings, transform widget,
gridlines, and so on (mostly stuff as available in header).
To see it work; also added new feature for region split,
press SHIFT+ALT+CTRL+S for four-split.
The idea is to make a preset 4-split, configured to stick
to top/right/front views for three views.
Another cool idea to explore is to then box-clip all drawing
based on these 3 views.
Note about the code:
- currently view3d still stores some depricated settings, to
convert from older files. Not all settings are copied over
though, like custom clip planes or the 'lock view to object'.
- since some view3d ops are now on area level, the operators
for it should keep track of that.
Bugfix in transform: quat initialize in operator-invoke missed
one zero.
Als brought back GE to compile for missing Ipos and channels.
2009-01-19 16:54:41 +00:00
|
|
|
else if(ar->next)
|
|
|
|
BKE_report(op->reports, RPT_ERROR, "Only last region can be 4-splitted");
|
|
|
|
else {
|
|
|
|
ScrArea *sa= CTX_wm_area(C);
|
|
|
|
ARegion *newar;
|
|
|
|
int count;
|
|
|
|
|
|
|
|
ar->alignment= RGN_ALIGN_QSPLIT;
|
|
|
|
|
|
|
|
for(count=0; count<3; count++) {
|
|
|
|
newar= BKE_area_region_copy(sa->type, ar);
|
|
|
|
BLI_addtail(&sa->regionbase, newar);
|
|
|
|
}
|
|
|
|
|
2009-01-20 14:23:32 +00:00
|
|
|
/* lock views and set them */
|
|
|
|
if(sa->spacetype==SPACE_VIEW3D) {
|
|
|
|
RegionView3D *rv3d;
|
|
|
|
|
|
|
|
rv3d= ar->regiondata;
|
|
|
|
rv3d->viewlock= RV3D_LOCKED; rv3d->view= V3D_VIEW_FRONT; rv3d->persp= V3D_ORTHO;
|
|
|
|
|
|
|
|
ar= ar->next;
|
|
|
|
rv3d= ar->regiondata;
|
|
|
|
rv3d->viewlock= RV3D_LOCKED; rv3d->view= V3D_VIEW_TOP; rv3d->persp= V3D_ORTHO;
|
|
|
|
|
|
|
|
ar= ar->next;
|
|
|
|
rv3d= ar->regiondata;
|
|
|
|
rv3d->viewlock= RV3D_LOCKED; rv3d->view= V3D_VIEW_RIGHT; rv3d->persp= V3D_ORTHO;
|
|
|
|
|
|
|
|
ar= ar->next;
|
|
|
|
rv3d= ar->regiondata;
|
|
|
|
rv3d->view= V3D_VIEW_CAMERA; rv3d->persp= V3D_CAMOB;
|
|
|
|
}
|
|
|
|
|
2.5
View3D has been split now in a local part (RegionView3D) and a
per-area part (old View3D). Currently local is:
- view transform
- camera zoom/offset
- gpencil (todo)
- custom clipping planes
Rest is in Area still, like active camera, draw type, layers,
localview, custom centers, around-settings, transform widget,
gridlines, and so on (mostly stuff as available in header).
To see it work; also added new feature for region split,
press SHIFT+ALT+CTRL+S for four-split.
The idea is to make a preset 4-split, configured to stick
to top/right/front views for three views.
Another cool idea to explore is to then box-clip all drawing
based on these 3 views.
Note about the code:
- currently view3d still stores some depricated settings, to
convert from older files. Not all settings are copied over
though, like custom clip planes or the 'lock view to object'.
- since some view3d ops are now on area level, the operators
for it should keep track of that.
Bugfix in transform: quat initialize in operator-invoke missed
one zero.
Als brought back GE to compile for missing Ipos and channels.
2009-01-19 16:54:41 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SCREEN_OT_region_foursplit(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Split Region in 4 Parts";
|
|
|
|
ot->idname= "SCREEN_OT_region_foursplit";
|
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->invoke= WM_operator_confirm;
|
|
|
|
ot->exec= region_foursplit_exec;
|
|
|
|
ot->poll= ED_operator_areaactive;
|
2009-01-31 19:40:40 +00:00
|
|
|
ot->flag= OPTYPE_REGISTER;
|
2.5
View3D has been split now in a local part (RegionView3D) and a
per-area part (old View3D). Currently local is:
- view transform
- camera zoom/offset
- gpencil (todo)
- custom clipping planes
Rest is in Area still, like active camera, draw type, layers,
localview, custom centers, around-settings, transform widget,
gridlines, and so on (mostly stuff as available in header).
To see it work; also added new feature for region split,
press SHIFT+ALT+CTRL+S for four-split.
The idea is to make a preset 4-split, configured to stick
to top/right/front views for three views.
Another cool idea to explore is to then box-clip all drawing
based on these 3 views.
Note about the code:
- currently view3d still stores some depricated settings, to
convert from older files. Not all settings are copied over
though, like custom clip planes or the 'lock view to object'.
- since some view3d ops are now on area level, the operators
for it should keep track of that.
Bugfix in transform: quat initialize in operator-invoke missed
one zero.
Als brought back GE to compile for missing Ipos and channels.
2009-01-19 16:54:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-12-15 11:59:42 +00:00
|
|
|
/* ************** region flip operator ***************************** */
|
|
|
|
|
|
|
|
/* flip a region alignment */
|
|
|
|
static int region_flip_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
2008-12-18 02:56:48 +00:00
|
|
|
ARegion *ar= CTX_wm_region(C);
|
|
|
|
|
|
|
|
if(ar->alignment==RGN_ALIGN_TOP)
|
|
|
|
ar->alignment= RGN_ALIGN_BOTTOM;
|
|
|
|
else if(ar->alignment==RGN_ALIGN_BOTTOM)
|
|
|
|
ar->alignment= RGN_ALIGN_TOP;
|
|
|
|
else if(ar->alignment==RGN_ALIGN_LEFT)
|
|
|
|
ar->alignment= RGN_ALIGN_RIGHT;
|
|
|
|
else if(ar->alignment==RGN_ALIGN_RIGHT)
|
|
|
|
ar->alignment= RGN_ALIGN_LEFT;
|
2008-12-15 11:59:42 +00:00
|
|
|
|
2008-12-27 16:09:56 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
|
2009-01-25 20:22:05 +00:00
|
|
|
printf("executed region flip\n");
|
2008-12-15 11:59:42 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
2009-01-25 20:22:05 +00:00
|
|
|
static void testfunc(bContext *C, void *argv, int arg)
|
|
|
|
{
|
|
|
|
printf("arg %d\n", arg);
|
|
|
|
}
|
|
|
|
|
2.5: UI & Menus
* Cleaned up UI_interface.h a bit, and added some comments to
organize things a bit and indicate what should be used when.
* uiMenu* functions can now be used to create menus for headers
too, this is done with a uiDefMenuBut, which takes a pointer
to a uiMenuCreateFunc, that will then call uiMenu* functions.
* Renamed uiMenuBegin/End to uiPupMenuBegin/End, as these are
specific to making popup menus. Will convert the other
conformation popup menu functions to use this too so we can
remove some code.
* Extended uiMenu functions, now there is is also:
BooleanO, FloatO, BooleanR, EnumR, LevelEnumR, Separator.
* Converted image window headers to use uiMenu functions, simplifies
menu code further here. Did not remove the uiDefMenu functions as
they are used in sequencer/view3d in some places now (will fix).
* Also tried to simplify and fix bounds computation a bit better
for popup menus. It tried to find out in advance what the size
of the menu was but this is difficult with keymap strings in
there, now uiPopupBoundsBlock can figure this out afterwards and
ensure the popup is within the window bounds. Will convert some
other functions to use this too.
2009-01-30 12:18:08 +00:00
|
|
|
static void newlevel1(bContext *C, uiMenuItem *head, void *arg)
|
2009-01-25 20:22:05 +00:00
|
|
|
{
|
|
|
|
uiMenuFunc(head, testfunc, NULL);
|
|
|
|
|
|
|
|
uiMenuItemVal(head, "First", ICON_PROP_ON, 1);
|
|
|
|
uiMenuItemVal(head, "Second", ICON_PROP_CON, 2);
|
|
|
|
uiMenuItemVal(head, "Third", ICON_SMOOTHCURVE, 3);
|
|
|
|
uiMenuItemVal(head, "Fourth", ICON_SHARPCURVE, 4);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int testing123(bContext *C, wmOperator *op, wmEvent *event)
|
|
|
|
{
|
2009-02-04 11:52:16 +00:00
|
|
|
uiMenuItem *head= uiPupMenuBegin("Hello world", 0);
|
2009-01-25 20:22:05 +00:00
|
|
|
|
|
|
|
uiMenuContext(head, WM_OP_EXEC_DEFAULT);
|
2009-02-04 11:52:16 +00:00
|
|
|
uiMenuItemO(head, ICON_PROP_ON, "SCREEN_OT_region_flip");
|
|
|
|
uiMenuItemO(head, ICON_PROP_CON, "SCREEN_OT_screen_full_area");
|
|
|
|
uiMenuItemO(head, ICON_SMOOTHCURVE, "SCREEN_OT_region_foursplit");
|
2009-01-25 20:22:05 +00:00
|
|
|
uiMenuLevel(head, "Submenu", newlevel1);
|
2009-02-04 11:52:16 +00:00
|
|
|
uiMenuItemO(head, ICON_PROP_ON, "SCREEN_OT_area_rip");
|
2009-01-25 20:22:05 +00:00
|
|
|
|
2.5: UI & Menus
* Cleaned up UI_interface.h a bit, and added some comments to
organize things a bit and indicate what should be used when.
* uiMenu* functions can now be used to create menus for headers
too, this is done with a uiDefMenuBut, which takes a pointer
to a uiMenuCreateFunc, that will then call uiMenu* functions.
* Renamed uiMenuBegin/End to uiPupMenuBegin/End, as these are
specific to making popup menus. Will convert the other
conformation popup menu functions to use this too so we can
remove some code.
* Extended uiMenu functions, now there is is also:
BooleanO, FloatO, BooleanR, EnumR, LevelEnumR, Separator.
* Converted image window headers to use uiMenu functions, simplifies
menu code further here. Did not remove the uiDefMenu functions as
they are used in sequencer/view3d in some places now (will fix).
* Also tried to simplify and fix bounds computation a bit better
for popup menus. It tried to find out in advance what the size
of the menu was but this is difficult with keymap strings in
there, now uiPopupBoundsBlock can figure this out afterwards and
ensure the popup is within the window bounds. Will convert some
other functions to use this too.
2009-01-30 12:18:08 +00:00
|
|
|
uiPupMenuEnd(C, head);
|
2009-01-25 20:22:05 +00:00
|
|
|
|
|
|
|
/* this operator is only for a menu, not used further */
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
}
|
|
|
|
|
2008-12-26 11:11:21 +00:00
|
|
|
void SCREEN_OT_region_flip(wmOperatorType *ot)
|
2008-12-15 11:59:42 +00:00
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Flip Region";
|
2008-12-26 11:11:21 +00:00
|
|
|
ot->idname= "SCREEN_OT_region_flip";
|
2008-12-15 11:59:42 +00:00
|
|
|
|
|
|
|
/* api callbacks */
|
2009-01-25 20:22:05 +00:00
|
|
|
ot->invoke= testing123; // XXX WM_operator_confirm;
|
2008-12-15 11:59:42 +00:00
|
|
|
ot->exec= region_flip_exec;
|
|
|
|
|
|
|
|
ot->poll= ED_operator_areaactive;
|
2009-01-31 19:40:40 +00:00
|
|
|
ot->flag= OPTYPE_REGISTER;
|
2009-01-25 20:22:05 +00:00
|
|
|
|
|
|
|
RNA_def_int(ot->srna, "test", 0, INT_MIN, INT_MAX, "test", "", INT_MIN, INT_MAX);
|
|
|
|
|
2008-12-15 11:59:42 +00:00
|
|
|
}
|
|
|
|
|
2008-12-21 19:58:25 +00:00
|
|
|
/* ****************** anim player, typically with timer ***************** */
|
|
|
|
|
|
|
|
static int screen_animation_play(bContext *C, wmOperator *op, wmEvent *event)
|
|
|
|
{
|
2008-12-22 12:57:53 +00:00
|
|
|
bScreen *screen= CTX_wm_screen(C);
|
2008-12-21 19:58:25 +00:00
|
|
|
|
2008-12-22 12:57:53 +00:00
|
|
|
if(screen->animtimer==event->customdata) {
|
2008-12-21 19:58:25 +00:00
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
|
|
|
|
scene->r.cfra++;
|
2008-12-21 23:39:52 +00:00
|
|
|
|
2008-12-22 12:57:53 +00:00
|
|
|
if (scene->r.psfra) {
|
|
|
|
if(scene->r.cfra > scene->r.pefra)
|
|
|
|
scene->r.cfra= scene->r.psfra;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if(scene->r.cfra > scene->r.efra)
|
|
|
|
scene->r.cfra= scene->r.sfra;
|
|
|
|
}
|
2008-12-21 19:58:25 +00:00
|
|
|
|
2009-02-09 15:50:09 +00:00
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
|
2008-12-21 19:58:25 +00:00
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
return OPERATOR_PASS_THROUGH;
|
|
|
|
}
|
|
|
|
|
2008-12-26 11:11:21 +00:00
|
|
|
void SCREEN_OT_animation_play(wmOperatorType *ot)
|
2008-12-21 19:58:25 +00:00
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Animation player";
|
2008-12-26 11:11:21 +00:00
|
|
|
ot->idname= "SCREEN_OT_animation_play";
|
2008-12-21 19:58:25 +00:00
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->invoke= screen_animation_play;
|
|
|
|
|
|
|
|
ot->poll= ED_operator_screenactive;
|
|
|
|
|
|
|
|
}
|
2008-12-09 15:59:43 +00:00
|
|
|
|
2.5: work on bringing back SpaceTime options
- RMB select, also with SHIFT
- RMB tweak for translate
- SHIFT+D dupli
- BKEY border select/deselect
- AKEY (de)select all
- XKEY delete
- GKEY grab
Added some XXX comments for future todos, especially for when other
spaces come back with time markers.
Also added ED_util for putting in all to-be-cleaned cruft
Context conflict: input methods for Markers can conflict with other
spacetypes. It was solved in pre-2.5 with manually tweaking it all over,
but I would prefer one keymap for all marker stuff. Needs some thinking...
could be solved with a boundbox check for bottom part of 2d window.
Tweak issue: both tweak styles are possible:
- Hold mouse button, move, operator ends on mouse release
- Hold mouse button, move, operator ends on mouse click
Problem is that modally handled operators use fixed keymaps... like ESC,
SPACE, ENTER, or press/release mousebutton for 'assign'. There's a lot
to say for making this all consistant, or become part of 1 general keymap?
Should also be possibe to define 'tweak' defaults for Tablet different
than for mouse...
2008-11-29 15:10:31 +00:00
|
|
|
/* ************** border select operator (template) ***************************** */
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
/* operator state vars used: (added by default WM callbacks)
|
|
|
|
xmin, ymin
|
|
|
|
xmax, ymax
|
|
|
|
|
|
|
|
customdata: the wmGesture pointer
|
|
|
|
|
|
|
|
callbacks:
|
|
|
|
|
|
|
|
exec() has to be filled in by user
|
|
|
|
|
|
|
|
invoke() default WM function
|
|
|
|
adds modal handler
|
|
|
|
|
|
|
|
modal() default WM function
|
|
|
|
accept modal events while doing it, calls exec(), handles ESC and border drawing
|
|
|
|
|
|
|
|
poll() has to be filled in by user for context
|
|
|
|
*/
|
2.5: work on bringing back SpaceTime options
- RMB select, also with SHIFT
- RMB tweak for translate
- SHIFT+D dupli
- BKEY border select/deselect
- AKEY (de)select all
- XKEY delete
- GKEY grab
Added some XXX comments for future todos, especially for when other
spaces come back with time markers.
Also added ED_util for putting in all to-be-cleaned cruft
Context conflict: input methods for Markers can conflict with other
spacetypes. It was solved in pre-2.5 with manually tweaking it all over,
but I would prefer one keymap for all marker stuff. Needs some thinking...
could be solved with a boundbox check for bottom part of 2d window.
Tweak issue: both tweak styles are possible:
- Hold mouse button, move, operator ends on mouse release
- Hold mouse button, move, operator ends on mouse click
Problem is that modally handled operators use fixed keymaps... like ESC,
SPACE, ENTER, or press/release mousebutton for 'assign'. There's a lot
to say for making this all consistant, or become part of 1 general keymap?
Should also be possibe to define 'tweak' defaults for Tablet different
than for mouse...
2008-11-29 15:10:31 +00:00
|
|
|
#if 0
|
2008-11-19 16:28:11 +00:00
|
|
|
static int border_select_do(bContext *C, wmOperator *op)
|
|
|
|
{
|
2008-11-24 15:51:55 +00:00
|
|
|
int event_type= RNA_int_get(op->ptr, "event_type");
|
2008-11-24 10:45:36 +00:00
|
|
|
|
|
|
|
if(event_type==LEFTMOUSE)
|
|
|
|
printf("border select do select\n");
|
|
|
|
else if(event_type==RIGHTMOUSE)
|
|
|
|
printf("border select deselect\n");
|
|
|
|
else
|
|
|
|
printf("border select do something\n");
|
|
|
|
|
2008-11-19 16:28:11 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2008-12-26 11:11:21 +00:00
|
|
|
void SCREEN_OT_border_select(wmOperatorType *ot)
|
2008-11-19 16:28:11 +00:00
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Border select";
|
2008-12-26 11:11:21 +00:00
|
|
|
ot->idname= "SCREEN_OT_border_select";
|
2008-11-19 16:28:11 +00:00
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= border_select_do;
|
|
|
|
ot->invoke= WM_border_select_invoke;
|
|
|
|
ot->modal= WM_border_select_modal;
|
|
|
|
|
|
|
|
ot->poll= ED_operator_areaactive;
|
2008-11-24 10:45:36 +00:00
|
|
|
|
|
|
|
/* rna */
|
2009-01-16 23:53:11 +00:00
|
|
|
RNA_def_int(ot->srna, "event_type", 0, INT_MIN, INT_MAX, "Event Type", "", INT_MIN, INT_MAX);
|
|
|
|
RNA_def_int(ot->srna, "xmin", 0, INT_MIN, INT_MAX, "X Min", "", INT_MIN, INT_MAX);
|
|
|
|
RNA_def_int(ot->srna, "xmax", 0, INT_MIN, INT_MAX, "X Max", "", INT_MIN, INT_MAX);
|
|
|
|
RNA_def_int(ot->srna, "ymin", 0, INT_MIN, INT_MAX, "Y Min", "", INT_MIN, INT_MAX);
|
|
|
|
RNA_def_int(ot->srna, "ymax", 0, INT_MIN, INT_MAX, "Y Max", "", INT_MIN, INT_MAX);
|
2008-11-24 10:45:36 +00:00
|
|
|
|
2008-11-19 16:28:11 +00:00
|
|
|
}
|
2.5: work on bringing back SpaceTime options
- RMB select, also with SHIFT
- RMB tweak for translate
- SHIFT+D dupli
- BKEY border select/deselect
- AKEY (de)select all
- XKEY delete
- GKEY grab
Added some XXX comments for future todos, especially for when other
spaces come back with time markers.
Also added ED_util for putting in all to-be-cleaned cruft
Context conflict: input methods for Markers can conflict with other
spacetypes. It was solved in pre-2.5 with manually tweaking it all over,
but I would prefer one keymap for all marker stuff. Needs some thinking...
could be solved with a boundbox check for bottom part of 2d window.
Tweak issue: both tweak styles are possible:
- Hold mouse button, move, operator ends on mouse release
- Hold mouse button, move, operator ends on mouse click
Problem is that modally handled operators use fixed keymaps... like ESC,
SPACE, ENTER, or press/release mousebutton for 'assign'. There's a lot
to say for making this all consistant, or become part of 1 general keymap?
Should also be possibe to define 'tweak' defaults for Tablet different
than for mouse...
2008-11-29 15:10:31 +00:00
|
|
|
#endif
|
2008-11-19 16:28:11 +00:00
|
|
|
|
2009-02-04 17:40:50 +00:00
|
|
|
/* ****************************** render invoking ***************** */
|
|
|
|
|
|
|
|
/* set callbacks, exported to sequence render too.
|
|
|
|
Only call in foreground (UI) renders. */
|
|
|
|
|
|
|
|
/* returns biggest area that is not uv/image editor. Note that it uses buttons */
|
|
|
|
/* window as the last possible alternative. */
|
|
|
|
static ScrArea *biggest_non_image_area(bContext *C)
|
|
|
|
{
|
|
|
|
bScreen *sc= CTX_wm_screen(C);
|
|
|
|
ScrArea *sa, *big= NULL;
|
|
|
|
int size, maxsize= 0, bwmaxsize= 0;
|
|
|
|
short foundwin= 0;
|
|
|
|
|
|
|
|
for(sa= sc->areabase.first; sa; sa= sa->next) {
|
|
|
|
if(sa->winx > 10 && sa->winy > 10) {
|
|
|
|
size= sa->winx*sa->winy;
|
|
|
|
if(sa->spacetype == SPACE_BUTS) {
|
|
|
|
if(foundwin == 0 && size > bwmaxsize) {
|
|
|
|
bwmaxsize= size;
|
|
|
|
big= sa;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(sa->spacetype != SPACE_IMAGE && size > maxsize) {
|
|
|
|
maxsize= size;
|
|
|
|
big= sa;
|
|
|
|
foundwin= 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return big;
|
|
|
|
}
|
|
|
|
|
|
|
|
static ScrArea *biggest_area(bContext *C)
|
|
|
|
{
|
|
|
|
bScreen *sc= CTX_wm_screen(C);
|
|
|
|
ScrArea *sa, *big= NULL;
|
|
|
|
int size, maxsize= 0;
|
|
|
|
|
|
|
|
for(sa= sc->areabase.first; sa; sa= sa->next) {
|
|
|
|
size= sa->winx*sa->winy;
|
|
|
|
if(size > maxsize) {
|
|
|
|
maxsize= size;
|
|
|
|
big= sa;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return big;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static ScrArea *find_area_showing_r_result(bContext *C)
|
|
|
|
{
|
|
|
|
bScreen *sc= CTX_wm_screen(C);
|
|
|
|
ScrArea *sa;
|
|
|
|
SpaceImage *sima;
|
|
|
|
|
|
|
|
/* find an imagewindow showing render result */
|
|
|
|
for(sa=sc->areabase.first; sa; sa= sa->next) {
|
|
|
|
if(sa->spacetype==SPACE_IMAGE) {
|
|
|
|
sima= sa->spacedata.first;
|
|
|
|
if(sima->image && sima->image->type==IMA_TYPE_R_RESULT)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return sa;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void screen_set_image_output(bContext *C)
|
|
|
|
{
|
|
|
|
ScrArea *sa;
|
|
|
|
SpaceImage *sima;
|
|
|
|
|
|
|
|
sa= find_area_showing_r_result(C);
|
|
|
|
|
|
|
|
if(sa==NULL) {
|
|
|
|
/* find largest open non-image area */
|
|
|
|
sa= biggest_non_image_area(C);
|
|
|
|
if(sa) {
|
|
|
|
ED_area_newspace(C, sa, SPACE_IMAGE);
|
|
|
|
sima= sa->spacedata.first;
|
|
|
|
|
|
|
|
/* makes ESC go back to prev space */
|
|
|
|
sima->flag |= SI_PREVSPACE;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* use any area of decent size */
|
|
|
|
sa= biggest_area(C);
|
|
|
|
if(sa->spacetype!=SPACE_IMAGE) {
|
|
|
|
// XXX newspace(sa, SPACE_IMAGE);
|
|
|
|
sima= sa->spacedata.first;
|
|
|
|
|
|
|
|
/* makes ESC go back to prev space */
|
|
|
|
sima->flag |= SI_PREVSPACE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sima= sa->spacedata.first;
|
|
|
|
|
|
|
|
/* get the correct image, and scale it */
|
|
|
|
sima->image= BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result");
|
|
|
|
|
|
|
|
if(G.displaymode==2) { // XXX
|
|
|
|
if(sa->full==0) {
|
|
|
|
sima->flag |= SI_FULLWINDOW;
|
|
|
|
|
|
|
|
ed_screen_fullarea(C, sa);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/* executes blocking render */
|
|
|
|
static int screen_render_exec(bContext *C, wmOperator *op)
|
|
|
|
{
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
Render *re= RE_GetRender(scene->id.name);
|
|
|
|
|
|
|
|
if(re==NULL) {
|
|
|
|
re= RE_NewRender(scene->id.name);
|
|
|
|
}
|
|
|
|
RE_test_break_cb(re, NULL, (int (*)(void *)) blender_test_break);
|
|
|
|
|
|
|
|
if(RNA_boolean_get(op->ptr, "anim"))
|
|
|
|
RE_BlenderAnim(re, scene, scene->r.sfra, scene->r.efra, scene->frame_step);
|
|
|
|
else
|
|
|
|
RE_BlenderFrame(re, scene, scene->r.cfra);
|
|
|
|
|
|
|
|
// no redraw needed, we leave state as we entered it
|
|
|
|
ED_update_for_newframe(C, 1);
|
|
|
|
|
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, scene);
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct RenderJob {
|
|
|
|
Scene *scene;
|
|
|
|
Render *re;
|
|
|
|
wmWindow *win;
|
|
|
|
int anim;
|
2009-02-05 19:28:28 +00:00
|
|
|
Image *image;
|
|
|
|
ImageUser iuser;
|
2009-02-04 17:40:50 +00:00
|
|
|
short *stop;
|
|
|
|
short *do_update;
|
|
|
|
} RenderJob;
|
|
|
|
|
|
|
|
static void render_freejob(void *rjv)
|
|
|
|
{
|
|
|
|
RenderJob *rj= rjv;
|
|
|
|
|
|
|
|
MEM_freeN(rj);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* called inside thread! */
|
2009-02-05 19:28:28 +00:00
|
|
|
static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrect)
|
2009-02-04 17:40:50 +00:00
|
|
|
{
|
2009-02-05 19:28:28 +00:00
|
|
|
RenderJob *rj= rjv;
|
|
|
|
ImBuf *ibuf;
|
|
|
|
float x1, y1, *rectf= NULL;
|
|
|
|
int ymin, ymax, xmin, xmax;
|
|
|
|
int rymin, rxmin;
|
|
|
|
char *rectc;
|
|
|
|
|
|
|
|
ibuf= BKE_image_get_ibuf(rj->image, &rj->iuser);
|
|
|
|
if(ibuf==NULL) return;
|
|
|
|
|
|
|
|
/* if renrect argument, we only refresh scanlines */
|
|
|
|
if(renrect) {
|
|
|
|
/* if ymax==recty, rendering of layer is ready, we should not draw, other things happen... */
|
|
|
|
if(rr->renlay==NULL || renrect->ymax>=rr->recty)
|
|
|
|
return;
|
2009-02-04 17:40:50 +00:00
|
|
|
|
2009-02-05 19:28:28 +00:00
|
|
|
/* xmin here is first subrect x coord, xmax defines subrect width */
|
2009-02-14 18:31:19 +00:00
|
|
|
xmin = renrect->xmin + rr->crop;
|
|
|
|
xmax = renrect->xmax - xmin - rr->crop;
|
2009-02-05 19:28:28 +00:00
|
|
|
if (xmax<2) return;
|
2009-02-04 17:40:50 +00:00
|
|
|
|
2009-02-14 18:31:19 +00:00
|
|
|
ymin= renrect->ymin + rr->crop;
|
|
|
|
ymax= renrect->ymax - ymin - rr->crop;
|
2009-02-05 19:28:28 +00:00
|
|
|
if(ymax<2)
|
|
|
|
return;
|
|
|
|
renrect->ymin= renrect->ymax;
|
2009-02-14 18:31:19 +00:00
|
|
|
|
2009-02-05 19:28:28 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
xmin = ymin = rr->crop;
|
|
|
|
xmax = rr->rectx - 2*rr->crop;
|
|
|
|
ymax = rr->recty - 2*rr->crop;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* xmin ymin is in tile coords. transform to ibuf */
|
|
|
|
rxmin= rr->tilerect.xmin + xmin;
|
|
|
|
if(rxmin >= ibuf->x) return;
|
|
|
|
rymin= rr->tilerect.ymin + ymin;
|
|
|
|
if(rymin >= ibuf->y) return;
|
|
|
|
|
|
|
|
if(rxmin + xmax > ibuf->x)
|
|
|
|
xmax= ibuf->x - rxmin;
|
|
|
|
if(rymin + ymax > ibuf->y)
|
|
|
|
ymax= ibuf->y - rymin;
|
2009-02-14 16:43:02 +00:00
|
|
|
|
2009-02-05 19:28:28 +00:00
|
|
|
if(xmax < 1 || ymax < 1) return;
|
|
|
|
|
|
|
|
/* find current float rect for display, first case is after composit... still weak */
|
|
|
|
if(rr->rectf)
|
|
|
|
rectf= rr->rectf;
|
|
|
|
else {
|
|
|
|
if(rr->rect32)
|
|
|
|
return;
|
|
|
|
else {
|
|
|
|
if(rr->renlay==NULL || rr->renlay->rectf==NULL) return;
|
|
|
|
rectf= rr->renlay->rectf;
|
2009-02-04 17:40:50 +00:00
|
|
|
}
|
|
|
|
}
|
2009-02-05 19:28:28 +00:00
|
|
|
if(rectf==NULL) return;
|
|
|
|
|
|
|
|
rectf+= 4*(rr->rectx*ymin + xmin);
|
|
|
|
rectc= (char *)(ibuf->rect + ibuf->x*rymin + rxmin);
|
|
|
|
|
|
|
|
for(y1= 0; y1<ymax; y1++) {
|
|
|
|
float *rf= rectf;
|
|
|
|
char *rc= rectc;
|
|
|
|
|
2009-02-14 18:31:19 +00:00
|
|
|
/* XXX temp. because crop offset */
|
2009-02-14 16:43:02 +00:00
|
|
|
if( rectc >= (char *)(ibuf->rect)) {
|
|
|
|
for(x1= 0; x1<xmax; x1++, rf += 4, rc+=4) {
|
|
|
|
rc[0]= FTOCHAR(rf[0]);
|
|
|
|
rc[1]= FTOCHAR(rf[1]);
|
|
|
|
rc[2]= FTOCHAR(rf[2]);
|
|
|
|
rc[3]= FTOCHAR(rf[3]);
|
|
|
|
}
|
2009-02-05 19:28:28 +00:00
|
|
|
}
|
|
|
|
rectf += 4*rr->rectx;
|
|
|
|
rectc += 4*ibuf->x;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* make jobs timer to send notifier */
|
|
|
|
*(rj->do_update)= 1;
|
2009-02-04 17:40:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void render_startjob(void *rjv, short *stop, short *do_update)
|
|
|
|
{
|
|
|
|
RenderJob *rj= rjv;
|
|
|
|
|
|
|
|
rj->stop= stop;
|
|
|
|
rj->do_update= do_update;
|
|
|
|
|
|
|
|
if(rj->anim)
|
|
|
|
RE_BlenderAnim(rj->re, rj->scene, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->frame_step);
|
|
|
|
else
|
|
|
|
RE_BlenderFrame(rj->re, rj->scene, rj->scene->r.cfra);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* called by render, check job 'stop' value or the global */
|
|
|
|
static int render_breakjob(void *rjv)
|
|
|
|
{
|
|
|
|
RenderJob *rj= rjv;
|
|
|
|
|
|
|
|
if(G.afbreek)
|
|
|
|
return 1;
|
|
|
|
if(rj->stop && *(rj->stop))
|
|
|
|
return 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* using context, starts job */
|
|
|
|
static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|
|
|
{
|
|
|
|
/* new render clears all callbacks */
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
Render *re;
|
|
|
|
wmJob *steve;
|
|
|
|
RenderJob *rj;
|
|
|
|
Image *ima;
|
|
|
|
|
|
|
|
/* only one job at a time */
|
|
|
|
if(WM_jobs_test(CTX_wm_manager(C), scene))
|
|
|
|
return OPERATOR_CANCELLED;
|
|
|
|
|
|
|
|
/* handle UI stuff */
|
|
|
|
WM_cursor_wait(1);
|
2009-02-05 01:12:47 +00:00
|
|
|
|
|
|
|
/* flush multires changes (for sculpt) */
|
|
|
|
multires_force_update(CTX_data_active_object(C));
|
2009-02-04 17:40:50 +00:00
|
|
|
|
2009-02-05 01:12:47 +00:00
|
|
|
// get editmode results
|
2009-02-04 17:40:50 +00:00
|
|
|
// store spare
|
|
|
|
// get view3d layer, local layer, make this nice api call to render
|
|
|
|
// store spare
|
|
|
|
|
|
|
|
/* ensure at least 1 area shows result */
|
|
|
|
screen_set_image_output(C);
|
|
|
|
|
|
|
|
/* job custom data */
|
|
|
|
rj= MEM_callocN(sizeof(RenderJob), "render job");
|
|
|
|
rj->scene= scene;
|
|
|
|
rj->win= CTX_wm_window(C);
|
|
|
|
rj->anim= RNA_boolean_get(op->ptr, "anim");
|
2009-02-05 19:28:28 +00:00
|
|
|
rj->iuser.scene= scene;
|
|
|
|
rj->iuser.ok= 1;
|
2009-02-04 17:40:50 +00:00
|
|
|
|
|
|
|
/* setup job */
|
|
|
|
steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene);
|
|
|
|
WM_jobs_customdata(steve, rj, render_freejob);
|
|
|
|
WM_jobs_timer(steve, 0.2, NC_SCENE|ND_RENDER_RESULT, 0);
|
|
|
|
WM_jobs_callbacks(steve, render_startjob, NULL, NULL);
|
|
|
|
|
2009-02-05 19:28:28 +00:00
|
|
|
/* get a render result image, and make sure it is empty */
|
2009-02-04 17:40:50 +00:00
|
|
|
ima= BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result");
|
|
|
|
BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE);
|
2009-02-05 19:28:28 +00:00
|
|
|
rj->image= ima;
|
|
|
|
|
2009-02-04 17:40:50 +00:00
|
|
|
/* setup new render */
|
|
|
|
re= RE_NewRender(scene->id.name);
|
|
|
|
RE_test_break_cb(re, rj, render_breakjob);
|
|
|
|
RE_display_draw_cb(re, rj, image_rect_update);
|
|
|
|
rj->re= re;
|
|
|
|
G.afbreek= 0;
|
|
|
|
|
|
|
|
// BKE_report in render!
|
|
|
|
// RE_error_cb(re, error_cb);
|
|
|
|
|
|
|
|
WM_jobs_start(steve);
|
|
|
|
|
|
|
|
G.afbreek= 0;
|
|
|
|
|
|
|
|
WM_cursor_wait(0);
|
|
|
|
WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, scene);
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* contextual render, using current scene, view3d? */
|
|
|
|
void SCREEN_OT_render(wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Render";
|
|
|
|
ot->idname= "SCREEN_OT_render";
|
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->invoke= screen_render_invoke;
|
|
|
|
ot->exec= screen_render_exec;
|
|
|
|
|
|
|
|
ot->poll= ED_operator_screenactive;
|
|
|
|
|
|
|
|
RNA_def_int(ot->srna, "layers", 0, 0, INT_MAX, "Layers", "", 0, INT_MAX);
|
|
|
|
RNA_def_boolean(ot->srna, "anim", 0, "Animation", "");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* *********************** cancel render viewer *************** */
|
|
|
|
|
|
|
|
static int render_view_cancel_exec(bContext *C, wmOperator *unused)
|
|
|
|
{
|
|
|
|
ScrArea *sa= CTX_wm_area(C);
|
|
|
|
SpaceImage *sima= sa->spacedata.first;
|
|
|
|
|
|
|
|
if(sima->flag & SI_PREVSPACE) {
|
|
|
|
sima->flag &= ~SI_PREVSPACE;
|
|
|
|
ED_area_prevspace(C);
|
|
|
|
}
|
|
|
|
else if(sima->flag & SI_FULLWINDOW) {
|
|
|
|
sima->flag &= ~SI_FULLWINDOW;
|
|
|
|
ED_screen_full_prevspace(C);
|
|
|
|
}
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SCREEN_OT_render_view_cancel(struct wmOperatorType *ot)
|
|
|
|
{
|
|
|
|
/* identifiers */
|
|
|
|
ot->name= "Cancel Render View";
|
|
|
|
ot->idname= "SCREEN_OT_render_view_cancel";
|
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
ot->exec= render_view_cancel_exec;
|
|
|
|
ot->poll= ED_operator_image_active;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-11-19 16:28:11 +00:00
|
|
|
/* **************** Assigning operatortypes to global list, adding handlers **************** */
|
|
|
|
|
2.5 Branch
==========
* Changed wmOperatorType, removing init/exit callbacks and adding cancel
callback, removed default storage in favor of properties. Defined return
values for exec/invoke/modal/cancel.
* Don't allocate operator on the stack, and removed operator copy for
handlers. Now it frees based on return values from callbacks, and just
keeps a wmOperator on the heap. Also it now registers after the operator
is fully finished, to get the correct final properties.
* Changed OP_get_* functions to return 1 if the property is found and 0
otherwise, gives more readable code in my opinion. Added OP_verify_*
functions to quickly check if the property is available and set if it's
not, that's common for exec/invoke.
* Removed WM_operatortypelist_append in favor of WM_operatortype_append
which takes a function pointer instead of a list, avoids macro's and
duplicating code.
* Fix a crash where the handler would still be used while it was freed by
the operator.
* Spacetypes now have operatortypes() and keymap() callbacks to abstract
them a bit more.
* Renamed C->curarea to C->area for consistency. Removed View3D/View2D/
SpaceIpo from bContext, seems bad to keep these.
* Set context variables like window/screen/area/region to NULL again when
leaving that context, instead of leaving the pointers there.
* Added if(G.f & G_DEBUG) for many of the prints, makes output a bit
cleaner and easier to debug.
* Fixed priority of the editors/interface module in scons, would otherwise
give link errors.
* Added start of generic view2d api.
* Added space_time with some basic drawing and a single operator to change
the frame.
2008-06-11 10:10:31 +00:00
|
|
|
/* called in spacetypes.c */
|
2008-01-07 18:03:41 +00:00
|
|
|
void ED_operatortypes_screen(void)
|
|
|
|
{
|
2.5 getting-back-into-coding commit :)
- cleaned up join and split operations. Most noticable is operator callback
design, which should make a design based on user-less exec() first, then
wrap invoke() and modal() around it. The exec() should be callable with
only Context and properties.
- split now works again; and inversed as previously, if you drag from a
triangle (action zone) inside area it subdivides area as expected.
- dragging from triangle outside area, over an edge, joins areas
- split has been simplified, it had too many options... it could just work
simpler (now)
- 'action zone' now is an operator itself, a widget sending an ACTIONZONE event,
which can be handled by others (so other gestures can be added in action zone
too)
Still evaluating:
- context gets set where?
- code structure confuses... what are proper functions for operators?
- what is WM... should low level screen stuff more there?
- when do you send event, notifier?
- files grow to large, will clean
Oh yeah and docs, docs, docs. Coming! :)
2008-11-17 18:54:03 +00:00
|
|
|
/* generic UI stuff */
|
2008-12-26 11:11:21 +00:00
|
|
|
WM_operatortype_append(SCREEN_OT_actionzone);
|
|
|
|
WM_operatortype_append(SCREEN_OT_repeat_last);
|
2009-01-15 18:28:40 +00:00
|
|
|
WM_operatortype_append(SCREEN_OT_repeat_history);
|
2009-02-04 11:52:16 +00:00
|
|
|
WM_operatortype_append(SCREEN_OT_redo_last);
|
2.5 getting-back-into-coding commit :)
- cleaned up join and split operations. Most noticable is operator callback
design, which should make a design based on user-less exec() first, then
wrap invoke() and modal() around it. The exec() should be callable with
only Context and properties.
- split now works again; and inversed as previously, if you drag from a
triangle (action zone) inside area it subdivides area as expected.
- dragging from triangle outside area, over an edge, joins areas
- split has been simplified, it had too many options... it could just work
simpler (now)
- 'action zone' now is an operator itself, a widget sending an ACTIONZONE event,
which can be handled by others (so other gestures can be added in action zone
too)
Still evaluating:
- context gets set where?
- code structure confuses... what are proper functions for operators?
- what is WM... should low level screen stuff more there?
- when do you send event, notifier?
- files grow to large, will clean
Oh yeah and docs, docs, docs. Coming! :)
2008-11-17 18:54:03 +00:00
|
|
|
|
2008-11-24 18:59:59 +00:00
|
|
|
/* screen tools */
|
2008-12-26 11:11:21 +00:00
|
|
|
WM_operatortype_append(SCREEN_OT_area_move);
|
|
|
|
WM_operatortype_append(SCREEN_OT_area_split);
|
|
|
|
WM_operatortype_append(SCREEN_OT_area_join);
|
|
|
|
WM_operatortype_append(SCREEN_OT_area_rip);
|
|
|
|
WM_operatortype_append(SCREEN_OT_region_split);
|
2.5
View3D has been split now in a local part (RegionView3D) and a
per-area part (old View3D). Currently local is:
- view transform
- camera zoom/offset
- gpencil (todo)
- custom clipping planes
Rest is in Area still, like active camera, draw type, layers,
localview, custom centers, around-settings, transform widget,
gridlines, and so on (mostly stuff as available in header).
To see it work; also added new feature for region split,
press SHIFT+ALT+CTRL+S for four-split.
The idea is to make a preset 4-split, configured to stick
to top/right/front views for three views.
Another cool idea to explore is to then box-clip all drawing
based on these 3 views.
Note about the code:
- currently view3d still stores some depricated settings, to
convert from older files. Not all settings are copied over
though, like custom clip planes or the 'lock view to object'.
- since some view3d ops are now on area level, the operators
for it should keep track of that.
Bugfix in transform: quat initialize in operator-invoke missed
one zero.
Als brought back GE to compile for missing Ipos and channels.
2009-01-19 16:54:41 +00:00
|
|
|
WM_operatortype_append(SCREEN_OT_region_foursplit);
|
2008-12-26 11:11:21 +00:00
|
|
|
WM_operatortype_append(SCREEN_OT_region_flip);
|
|
|
|
WM_operatortype_append(SCREEN_OT_screen_set);
|
|
|
|
WM_operatortype_append(SCREEN_OT_screen_full_area);
|
2009-02-14 16:43:02 +00:00
|
|
|
WM_operatortype_append(SCREEN_OT_screenshot);
|
2009-02-14 18:31:19 +00:00
|
|
|
WM_operatortype_append(SCREEN_OT_screencast);
|
2008-12-17 17:33:45 +00:00
|
|
|
|
2008-12-17 16:21:14 +00:00
|
|
|
/*frame changes*/
|
2008-12-26 11:11:21 +00:00
|
|
|
WM_operatortype_append(SCREEN_OT_frame_offset);
|
|
|
|
WM_operatortype_append(SCREEN_OT_animation_play);
|
2008-12-21 19:58:25 +00:00
|
|
|
|
2009-02-04 17:40:50 +00:00
|
|
|
/* render */
|
|
|
|
WM_operatortype_append(SCREEN_OT_render);
|
|
|
|
WM_operatortype_append(SCREEN_OT_render_view_cancel);
|
|
|
|
|
2008-11-24 18:59:59 +00:00
|
|
|
/* tools shared by more space types */
|
2008-12-31 18:52:15 +00:00
|
|
|
WM_operatortype_append(ED_OT_undo);
|
2009-02-04 17:40:50 +00:00
|
|
|
WM_operatortype_append(ED_OT_redo);
|
2008-11-24 18:59:59 +00:00
|
|
|
|
2008-01-07 18:03:41 +00:00
|
|
|
}
|
|
|
|
|
2.5 Branch
==========
* Changed wmOperatorType, removing init/exit callbacks and adding cancel
callback, removed default storage in favor of properties. Defined return
values for exec/invoke/modal/cancel.
* Don't allocate operator on the stack, and removed operator copy for
handlers. Now it frees based on return values from callbacks, and just
keeps a wmOperator on the heap. Also it now registers after the operator
is fully finished, to get the correct final properties.
* Changed OP_get_* functions to return 1 if the property is found and 0
otherwise, gives more readable code in my opinion. Added OP_verify_*
functions to quickly check if the property is available and set if it's
not, that's common for exec/invoke.
* Removed WM_operatortypelist_append in favor of WM_operatortype_append
which takes a function pointer instead of a list, avoids macro's and
duplicating code.
* Fix a crash where the handler would still be used while it was freed by
the operator.
* Spacetypes now have operatortypes() and keymap() callbacks to abstract
them a bit more.
* Renamed C->curarea to C->area for consistency. Removed View3D/View2D/
SpaceIpo from bContext, seems bad to keep these.
* Set context variables like window/screen/area/region to NULL again when
leaving that context, instead of leaving the pointers there.
* Added if(G.f & G_DEBUG) for many of the prints, makes output a bit
cleaner and easier to debug.
* Fixed priority of the editors/interface module in scons, would otherwise
give link errors.
* Added start of generic view2d api.
* Added space_time with some basic drawing and a single operator to change
the frame.
2008-06-11 10:10:31 +00:00
|
|
|
/* called in spacetypes.c */
|
|
|
|
void ED_keymap_screen(wmWindowManager *wm)
|
2008-01-07 18:03:41 +00:00
|
|
|
{
|
2008-12-08 15:02:57 +00:00
|
|
|
ListBase *keymap= WM_keymap_listbase(wm, "Screen", 0, 0);
|
2.5 getting-back-into-coding commit :)
- cleaned up join and split operations. Most noticable is operator callback
design, which should make a design based on user-less exec() first, then
wrap invoke() and modal() around it. The exec() should be callable with
only Context and properties.
- split now works again; and inversed as previously, if you drag from a
triangle (action zone) inside area it subdivides area as expected.
- dragging from triangle outside area, over an edge, joins areas
- split has been simplified, it had too many options... it could just work
simpler (now)
- 'action zone' now is an operator itself, a widget sending an ACTIONZONE event,
which can be handled by others (so other gestures can be added in action zone
too)
Still evaluating:
- context gets set where?
- code structure confuses... what are proper functions for operators?
- what is WM... should low level screen stuff more there?
- when do you send event, notifier?
- files grow to large, will clean
Oh yeah and docs, docs, docs. Coming! :)
2008-11-17 18:54:03 +00:00
|
|
|
|
2009-01-23 14:43:25 +00:00
|
|
|
/* standard timers */
|
|
|
|
WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", TIMER0, KM_ANY, KM_ANY, 0);
|
|
|
|
|
2008-12-26 11:11:21 +00:00
|
|
|
WM_keymap_verify_item(keymap, "SCREEN_OT_actionzone", LEFTMOUSE, KM_PRESS, 0, 0);
|
2008-12-08 15:02:57 +00:00
|
|
|
|
2009-02-14 16:43:02 +00:00
|
|
|
/* screen tools */
|
2008-12-26 11:11:21 +00:00
|
|
|
WM_keymap_verify_item(keymap, "SCREEN_OT_area_move", LEFTMOUSE, KM_PRESS, 0, 0);
|
2009-01-15 18:28:40 +00:00
|
|
|
WM_keymap_verify_item(keymap, "SCREEN_OT_area_split", EVT_ACTIONZONE, 0, 0, 0);
|
|
|
|
WM_keymap_verify_item(keymap, "SCREEN_OT_area_join", EVT_ACTIONZONE, 0, 0, 0);
|
2009-01-02 03:16:38 +00:00
|
|
|
WM_keymap_verify_item(keymap, "SCREEN_OT_area_rip", RKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
|
2008-12-26 11:11:21 +00:00
|
|
|
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_screen_set", RIGHTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "delta", 1);
|
|
|
|
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_screen_set", LEFTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "delta", -1);
|
|
|
|
WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", UPARROWKEY, KM_PRESS, KM_CTRL, 0);
|
|
|
|
WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", DOWNARROWKEY, KM_PRESS, KM_CTRL, 0);
|
|
|
|
WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", SPACEKEY, KM_PRESS, KM_CTRL, 0);
|
2009-02-14 16:43:02 +00:00
|
|
|
WM_keymap_add_item(keymap, "SCREEN_OT_screenshot", F3KEY, KM_PRESS, KM_CTRL, 0);
|
2009-02-14 18:31:19 +00:00
|
|
|
WM_keymap_add_item(keymap, "SCREEN_OT_screencast", F3KEY, KM_PRESS, KM_ALT, 0);
|
2.5: gesture code in WM
- Simplified and cleaned previous border code
It was a bit too complex, too many data manipulations
Original idea was to have WM API calls to manage border, circle, lines,
lasso, etc. This now means that WM provides callbacks for custom operators,
so it's very easy to make them. Check bottom of screen_edit.c for an
example.
Currently two borders were coded; with and without cross hair.
Press Bkey in any area-region to test it (note: time window has wrong matrix!)
Some specs to note:
- gestures are in region space, and draw 'over'. That latter still needs some
work when we do real composites.
- only the active region is redrawn.
- on todo is the generic gesture engine for 'tweak' or like how currently grab
gestures in Blender work. These will be configurable per area-region, and WM
then will send the proper "Gesture Event" with properties (N, S, E, W, etc)
to which you then can assign operators. Such events will be generated with low
priority, so other handlers who swallowed mouse events have preference.
2008-11-19 13:16:05 +00:00
|
|
|
|
2008-12-09 15:59:43 +00:00
|
|
|
/* tests */
|
2.5
View3D has been split now in a local part (RegionView3D) and a
per-area part (old View3D). Currently local is:
- view transform
- camera zoom/offset
- gpencil (todo)
- custom clipping planes
Rest is in Area still, like active camera, draw type, layers,
localview, custom centers, around-settings, transform widget,
gridlines, and so on (mostly stuff as available in header).
To see it work; also added new feature for region split,
press SHIFT+ALT+CTRL+S for four-split.
The idea is to make a preset 4-split, configured to stick
to top/right/front views for three views.
Another cool idea to explore is to then box-clip all drawing
based on these 3 views.
Note about the code:
- currently view3d still stores some depricated settings, to
convert from older files. Not all settings are copied over
though, like custom clip planes or the 'lock view to object'.
- since some view3d ops are now on area level, the operators
for it should keep track of that.
Bugfix in transform: quat initialize in operator-invoke missed
one zero.
Als brought back GE to compile for missing Ipos and channels.
2009-01-19 16:54:41 +00:00
|
|
|
WM_keymap_add_item(keymap, "SCREEN_OT_region_split", SKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
|
|
|
|
WM_keymap_add_item(keymap, "SCREEN_OT_region_foursplit", SKEY, KM_PRESS, KM_CTRL|KM_ALT|KM_SHIFT, 0);
|
2008-12-27 11:44:00 +00:00
|
|
|
|
2009-01-15 18:28:40 +00:00
|
|
|
WM_keymap_verify_item(keymap, "SCREEN_OT_repeat_history", F3KEY, KM_PRESS, 0, 0);
|
2008-12-26 11:11:21 +00:00
|
|
|
WM_keymap_verify_item(keymap, "SCREEN_OT_repeat_last", F4KEY, KM_PRESS, 0, 0);
|
2009-01-15 18:28:40 +00:00
|
|
|
WM_keymap_add_item(keymap, "SCREEN_OT_region_flip", F5KEY, KM_PRESS, 0, 0);
|
2009-02-04 11:52:16 +00:00
|
|
|
WM_keymap_verify_item(keymap, "SCREEN_OT_redo_last", F6KEY, KM_PRESS, 0, 0);
|
2008-12-31 18:52:15 +00:00
|
|
|
|
2009-01-28 18:26:47 +00:00
|
|
|
/* files */
|
2009-02-14 14:25:48 +00:00
|
|
|
WM_keymap_add_item(keymap, "FILE_OT_exec", RETKEY, KM_PRESS, 0, 0);
|
|
|
|
WM_keymap_add_item(keymap, "FILE_OT_cancel", ESCKEY, KM_PRESS, 0, 0);
|
2009-01-28 18:26:47 +00:00
|
|
|
|
2008-12-31 18:52:15 +00:00
|
|
|
/* undo */
|
|
|
|
WM_keymap_add_item(keymap, "ED_OT_undo", ZKEY, KM_PRESS, KM_CTRL, 0);
|
|
|
|
WM_keymap_add_item(keymap, "ED_OT_undo", ZKEY, KM_PRESS, KM_OSKEY, 0);
|
|
|
|
WM_keymap_add_item(keymap, "ED_OT_redo", ZKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
|
|
|
|
WM_keymap_add_item(keymap, "ED_OT_redo", ZKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0);
|
|
|
|
|
2009-02-04 17:40:50 +00:00
|
|
|
/* render */
|
|
|
|
WM_keymap_add_item(keymap, "SCREEN_OT_render", F12KEY, KM_PRESS, 0, 0);
|
|
|
|
WM_keymap_add_item(keymap, "SCREEN_OT_render_view_cancel", ESCKEY, KM_PRESS, 0, 0);
|
2009-01-23 14:43:25 +00:00
|
|
|
|
|
|
|
/* frame offsets */
|
|
|
|
keymap= WM_keymap_listbase(wm, "Frames", 0, 0);
|
|
|
|
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", UPARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", 10);
|
|
|
|
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", -10);
|
|
|
|
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", LEFTARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", -1);
|
|
|
|
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", RIGHTARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", 1);
|
|
|
|
|
2008-01-07 18:03:41 +00:00
|
|
|
}
|
|
|
|
|