Welcome to mirror list, hosted at ThFree Co, Russian Federation.

wm_manipulator_intern.h « intern « manipulators « windowmanager « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: ecf4ffd2ac48689edf6025a831d76df2a5213271 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
 * ***** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 * Contributor(s): none yet.
 *
 * ***** END GPL LICENSE BLOCK *****
 */

/** \file blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
 *  \ingroup wm
 */


#ifndef __WM_MANIPULATOR_INTERN_H__
#define __WM_MANIPULATOR_INTERN_H__

struct wmKeyConfig;
struct wmManipulatorMap;
struct ManipulatorGeomInfo;
struct GHashIterator;

#include "wm_manipulator_fn.h"

/* -------------------------------------------------------------------- */
/* wmManipulator */


bool wm_manipulator_select_set_ex(
        struct wmManipulatorMap *mmap, struct wmManipulator *mpr, bool select,
        bool use_array, bool use_callback);
bool wm_manipulator_select_and_highlight(bContext *C, struct wmManipulatorMap *mmap, struct wmManipulator *mpr);

void wm_manipulator_calculate_scale(struct wmManipulator *mpr, const bContext *C);
void wm_manipulator_update(struct wmManipulator *mpr, const bContext *C, const bool refresh_map);

int wm_manipulator_is_visible(struct wmManipulator *mpr);
enum {
	WM_MANIPULATOR_IS_VISIBLE_UPDATE = (1 << 0),
	WM_MANIPULATOR_IS_VISIBLE_DRAW = (1 << 1),
};

/* -------------------------------------------------------------------- */
/* wmManipulatorGroup */

enum {
	TWEAK_MODAL_CANCEL = 1,
	TWEAK_MODAL_CONFIRM,
	TWEAK_MODAL_PRECISION_ON,
	TWEAK_MODAL_PRECISION_OFF,
	TWEAK_MODAL_SNAP_ON,
	TWEAK_MODAL_SNAP_OFF,
};

struct wmManipulatorGroup *wm_manipulatorgroup_new_from_type(
        struct wmManipulatorMap *mmap, struct wmManipulatorGroupType *wgt);
void wm_manipulatorgroup_free(bContext *C, struct wmManipulatorGroup *mgroup);
void wm_manipulatorgroup_manipulator_register(struct wmManipulatorGroup *mgroup, struct wmManipulator *mpr);
struct wmManipulator *wm_manipulatorgroup_find_intersected_manipulator(
        const struct wmManipulatorGroup *mgroup, struct bContext *C, const struct wmEvent *event,
        int *r_part);
void wm_manipulatorgroup_intersectable_manipulators_to_list(
        const struct wmManipulatorGroup *mgroup, struct ListBase *listbase);
void wm_manipulatorgroup_ensure_initialized(struct wmManipulatorGroup *mgroup, const struct bContext *C);
bool wm_manipulatorgroup_is_visible_in_drawstep(
        const struct wmManipulatorGroup *mgroup, const eWM_ManipulatorMapDrawStep drawstep);

void wm_manipulatorgrouptype_setup_keymap(
        struct wmManipulatorGroupType *wgt, struct wmKeyConfig *keyconf);


/* -------------------------------------------------------------------- */
/* wmManipulatorMap */

typedef struct wmManipulatorMapSelectState {
	struct wmManipulator **items;
	int len, len_alloc;
} wmManipulatorMapSelectState;

struct wmManipulatorMap {

	struct wmManipulatorMapType *type;
	ListBase groups;  /* wmManipulatorGroup */

	/* private, update tagging (enum defined in C source). */
	char update_flag[WM_MANIPULATORMAP_DRAWSTEP_MAX];

	/**
	 * \brief Manipulator map runtime context
	 *
	 * Contains information about this manipulator-map. Currently
	 * highlighted manipulator, currently selected manipulators, ...
	 */
	struct {
		/* we redraw the manipulator-map when this changes */
		struct wmManipulator *highlight;
		/* User has clicked this manipulator and it gets all input. */
		struct wmManipulator *modal;
		/* array for all selected manipulators */
		struct wmManipulatorMapSelectState select;
		/* cursor location at point of entering modal (see: WM_MANIPULATOR_GRAB_CURSOR) */
		int event_xy[2];
		short event_grabcursor;
		/* until we have nice cursor push/pop API. */
		int last_cursor;
	} mmap_context;
};

/**
 * This is a container for all manipulator types that can be instantiated in a region.
 * (similar to dropboxes).
 *
 * \note There is only ever one of these for every (area, region) combination.
 */
struct wmManipulatorMapType {
	struct wmManipulatorMapType *next, *prev;
	short spaceid, regionid;
	/* types of manipulator-groups for this manipulator-map type */
	ListBase grouptype_refs;

	/* eManipulatorMapTypeUpdateFlags */
	eWM_ManipulatorMapTypeUpdateFlag type_update_flag;
};

void wm_manipulatormap_select_array_clear(struct wmManipulatorMap *mmap);
bool wm_manipulatormap_deselect_all(struct wmManipulatorMap *mmap);
void wm_manipulatormap_select_array_shrink(struct wmManipulatorMap *mmap, int len_subtract);
void wm_manipulatormap_select_array_push_back(struct wmManipulatorMap *mmap, wmManipulator *mpr);
void wm_manipulatormap_select_array_remove(struct wmManipulatorMap *mmap, wmManipulator *mpr);

#endif