This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-archive/source/blender/editors/include/ED_numinput.h
Bastien Montagne 0e3fa0b761 Fix T41590: When scene scale is not 1.0, and units are "None," Blender assumes translations are in meters.
Turned out there were several issues in handling of scale parameter by numinput.
Fixed that by factorizing more some code in common with 'usual' numbuttons eval code
(new `bUnit_getScaleUnit()` helper will return valid scaled value, depending on
given system and type).

Now, numinput behaves as expected - using default unit amended by scale in case no unit is given
(i.e. entering '20' with a scale of 0.01 will give you 20cm, and '20cm' as well!).
2014-08-26 12:31:08 +02:00

90 lines
3.3 KiB
C++

/*
* ***** 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 ED_numinput.h
* \ingroup editors
*/
#ifndef __ED_NUMINPUT_H__
#define __ED_NUMINPUT_H__
#define NUM_STR_REP_LEN 64
#define NUM_MAX_ELEMENTS 3
typedef struct NumInput {
short idx_max; /* idx_max < NUM_MAX_ELEMENTS */
int unit_sys;
int unit_type[NUM_MAX_ELEMENTS]; /* Each value can have a different type */
bool unit_use_radians;
short flag; /* Flags affecting all values' behavior */
short val_flag[NUM_MAX_ELEMENTS]; /* Per-value flags */
float val[NUM_MAX_ELEMENTS]; /* Direct value of the input */
float val_org[NUM_MAX_ELEMENTS]; /* Original value of the input, for reset */
float val_inc[NUM_MAX_ELEMENTS]; /* Increment steps */
short idx; /* Active element/value */
char str[NUM_STR_REP_LEN]; /* String as typed by user for edited value (we assume ASCII world!) */
/* Current position of cursor in edited value str (first byte of "current" letter, so 0 for an empty str) */
int str_cur;
} NumInput;
/* NumInput.flag */
enum {
NUM_AFFECT_ALL = (1 << 0),
/* (1 << 9) and above are reserved for internal flags! */
};
/* NumInput.val_flag[] */
enum {
/* Public! */
NUM_NULL_ONE = (1 << 0),
NUM_NO_NEGATIVE = (1 << 1),
NUM_NO_ZERO = (1 << 2),
NUM_NO_FRACTION = (1 << 3),
/* (1 << 9) and above are reserved for internal flags! */
};
struct UnitSettings;
/*********************** NumInput ********************************/
/* There are important things to note here for code using numinput:
* * Values passed to applyNumInput() should be valid and are stored as default ones (val_org), if it is not EDITED.
* * bool returned by applyNumInput should be used to decide whether to apply numinput-specific post-process to data.
* * *Once applyNumInput has been called*, hasNumInput returns a valid value to decide whether to use numinput
* as drawstr source or not (i.e. to call outputNumInput).
*
* Those two steps have to be separated (so do not use a common call to hasNumInput() to do both in the same time!).
*/
void initNumInput(NumInput *n);
void outputNumInput(NumInput *n, char *str, struct UnitSettings *unit_settings);
bool hasNumInput(const NumInput *n);
bool applyNumInput(NumInput *n, float *vec);
bool handleNumInput(struct bContext *C, NumInput *n, const struct wmEvent *event);
#define NUM_MODAL_INCREMENT_UP 18
#define NUM_MODAL_INCREMENT_DOWN 19
#endif /* __ED_NUMINPUT_H__ */