111 lines
3.0 KiB
C++
111 lines
3.0 KiB
C++
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
/** \file
|
|
* \ingroup editors
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define NUM_STR_REP_LEN 64
|
|
#define NUM_MAX_ELEMENTS 3
|
|
|
|
struct wmEvent;
|
|
|
|
typedef struct NumInput {
|
|
/** idx_max < NUM_MAX_ELEMENTS */
|
|
short idx_max;
|
|
int unit_sys;
|
|
/** Each value can have a different type */
|
|
int unit_type[NUM_MAX_ELEMENTS];
|
|
bool unit_use_radians;
|
|
|
|
/** Flags affecting all values' behavior */
|
|
short flag;
|
|
/** Per-value flags */
|
|
short val_flag[NUM_MAX_ELEMENTS];
|
|
/** Direct value of the input */
|
|
float val[NUM_MAX_ELEMENTS];
|
|
/** Original value of the input, for reset */
|
|
float val_org[NUM_MAX_ELEMENTS];
|
|
/** Increment steps */
|
|
float val_inc[NUM_MAX_ELEMENTS];
|
|
|
|
/** Active element/value */
|
|
short idx;
|
|
/** String as typed by user for edited value (we assume ASCII world!) */
|
|
char str[NUM_STR_REP_LEN];
|
|
/** 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;
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/** \name NumInput
|
|
* \{ */
|
|
|
|
/**
|
|
* There are important things to note here for code using numeric-input:
|
|
* - 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
|
|
* numeric-input-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);
|
|
/**
|
|
* \param str: Must be NUM_STR_REP_LEN * (idx_max + 1) length.
|
|
*/
|
|
void outputNumInput(NumInput *n, char *str, struct UnitSettings *unit_settings);
|
|
bool hasNumInput(const NumInput *n);
|
|
/**
|
|
* \warning \a vec must be set beforehand otherwise we risk uninitialized vars.
|
|
*/
|
|
bool applyNumInput(NumInput *n, float *vec);
|
|
bool handleNumInput(struct bContext *C, NumInput *n, const struct wmEvent *event);
|
|
|
|
/** Share with `TFM_MODAL_CANCEL` in `transform.h`. */
|
|
#define NUM_MODAL_INCREMENT_UP 18
|
|
#define NUM_MODAL_INCREMENT_DOWN 19
|
|
|
|
bool user_string_to_number(bContext *C,
|
|
const char *str,
|
|
const struct UnitSettings *unit,
|
|
int type,
|
|
double *r_value,
|
|
bool use_single_line_error,
|
|
char **r_error);
|
|
|
|
/** \} */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|