2023-08-16 00:20:26 +10:00
|
|
|
/* SPDX-FileCopyrightText: 2008 Blender Authors
|
2023-05-31 16:19:06 +02:00
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
2011-02-21 07:25:24 +00:00
|
|
|
|
2019-02-18 08:08:12 +11:00
|
|
|
/** \file
|
|
|
|
|
* \ingroup editors
|
2011-02-21 07:25:24 +00:00
|
|
|
*/
|
|
|
|
|
|
2012-02-17 18:59:41 +00:00
|
|
|
#pragma once
|
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
|
|
|
|
2023-08-04 23:11:22 +02:00
|
|
|
#include "WM_types.hh"
|
2020-03-02 15:09:10 +01:00
|
|
|
|
2019-01-28 21:08:24 +11:00
|
|
|
struct Main;
|
2008-12-30 19:01:12 +00:00
|
|
|
struct bContext;
|
2025-01-22 03:30:40 +01:00
|
|
|
class WorkspaceStatus;
|
2008-12-30 19:01:12 +00:00
|
|
|
|
2024-02-13 15:36:38 +01:00
|
|
|
namespace blender::bke::id {
|
|
|
|
|
class IDRemapper;
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-26 17:54:30 +11:00
|
|
|
/* `ed_util.cc` */
|
2021-12-09 00:55:11 +11:00
|
|
|
|
2023-08-04 22:47:22 -04:00
|
|
|
void ED_editors_init_for_undo(Main *bmain);
|
|
|
|
|
void ED_editors_init(bContext *C);
|
2021-12-09 00:55:11 +11:00
|
|
|
/**
|
|
|
|
|
* Frees all edit-mode stuff.
|
|
|
|
|
*/
|
2023-08-04 22:47:22 -04:00
|
|
|
void ED_editors_exit(Main *bmain, bool do_undo_system);
|
2019-11-07 16:52:03 +11:00
|
|
|
|
2023-08-04 22:47:22 -04:00
|
|
|
bool ED_editors_flush_edits_for_object_ex(Main *bmain,
|
|
|
|
|
Object *ob,
|
2020-01-30 16:46:09 +11:00
|
|
|
bool for_render,
|
|
|
|
|
bool check_needs_flush);
|
2023-08-04 22:47:22 -04:00
|
|
|
bool ED_editors_flush_edits_for_object(Main *bmain, Object *ob);
|
2020-01-30 16:46:09 +11:00
|
|
|
|
2021-12-09 00:55:11 +11:00
|
|
|
/**
|
|
|
|
|
* Flush any temp data from object editing to DNA before writing files, rendering, copying, etc.
|
|
|
|
|
*/
|
2023-08-04 22:47:22 -04:00
|
|
|
bool ED_editors_flush_edits_ex(Main *bmain, bool for_render, bool check_needs_flush);
|
|
|
|
|
bool ED_editors_flush_edits(Main *bmain);
|
2008-12-31 17:11:42 +00:00
|
|
|
|
2021-12-09 00:55:11 +11:00
|
|
|
/**
|
|
|
|
|
* Use to free ID references within runtime data (stored outside of DNA)
|
|
|
|
|
*
|
|
|
|
|
* \param new_id: may be NULL to unlink \a old_id.
|
|
|
|
|
*/
|
2023-08-04 22:47:22 -04:00
|
|
|
void ED_spacedata_id_remap_single(ScrArea *area, SpaceLink *sl, ID *old_id, ID *new_id);
|
2024-02-13 15:36:38 +01:00
|
|
|
void ED_spacedata_id_remap(ScrArea *area,
|
|
|
|
|
SpaceLink *sl,
|
|
|
|
|
const blender::bke::id::IDRemapper &mappings);
|
2008-12-31 17:11:42 +00:00
|
|
|
|
2023-08-04 17:55:14 -04:00
|
|
|
void ED_operatortypes_edutils();
|
UI: Redesigned data-block selectors
The previous design is rather old and has a couple of problems:
* Scalability: The current solution of adding little icon buttons next to the
data-block name field doesn't scale well. It only works if there's a small
number of operations. We need to be able to place more items there for better
data-block management. Especially with the introduction of library overrides.
* Discoverability: It's not obvious what some of the icons do. They appear and
disappear, but it's not obvious why some are available at times and others
not.
* Unclear Status: Currently their library status (linked, indirectly linked,
broken link, library override) isn't really clear.
* Unusual behavior: Some of the icon buttons allow Shift or Ctrl clicking to
invoke alternative behaviors. This is not a usual pattern in Blender.
This patch does the following changes:
* Adds a menu to the right of the name button to access all kinds of operations
(create, delete, unlink, user management, library overrides, etc).
* Make good use of the "disabled hint" for tooltips, to explain why buttons are
disabled. The UI team wants to establish this as a good practise.
* Use superimposed icons for duplicate and unlink, rather than extra buttons
(uses less space, looks less distracting and is a nice + consistent design
language).
* Remove fake user and user count button, they are available from the menu now.
* Support tooltips for superimposed icons (committed mouse hover feedback to
master already).
* Slightly increase size of the name button - it was already a bit small
before, and the move from real buttons to superimposed icons reduces usable
space for the name itself.
* More clearly differentiate between duplicate and creating a new data-block.
The latter is only available in the menu.
* Display library status icon on the left (linked, missing library, overridden,
asset)
* Disables "Make Single User" button - in review we weren't sure if there are
good use-cases for it, so better to see if we can remove it.
Note that I do expect some aspects of this design to change still. I think some
changes are problematic, but others disagreed. I will open a feedback thread on
devtalk to see what others think.
Differential Revision: https://developer.blender.org/D8554
Reviewed by: Bastien Montagne
Design discussed and agreed on with the UI team, also see T79959.
2020-12-18 18:12:11 +01:00
|
|
|
|
2021-03-01 16:20:55 +01:00
|
|
|
/* Drawing */
|
2021-12-09 00:55:11 +11:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Callback that draws a line between the mouse and a position given as the initial argument.
|
|
|
|
|
*/
|
2023-08-04 22:47:22 -04:00
|
|
|
void ED_region_draw_mouse_line_cb(const bContext *C, ARegion *region, void *arg_info);
|
2021-03-01 16:20:55 +01:00
|
|
|
|
2021-12-09 00:55:11 +11:00
|
|
|
/**
|
|
|
|
|
* \note Keep in sync with #BKE_image_stamp_buf.
|
|
|
|
|
*/
|
2021-03-01 16:20:55 +01:00
|
|
|
void ED_region_image_metadata_draw(
|
2023-08-04 22:47:22 -04:00
|
|
|
int x, int y, ImBuf *ibuf, const rctf *frame, float zoomx, float zoomy);
|
2021-03-01 16:20:55 +01:00
|
|
|
|
2021-07-22 23:44:53 +01:00
|
|
|
/* Slider */
|
2021-12-09 00:55:11 +11:00
|
|
|
|
2021-07-22 23:44:53 +01:00
|
|
|
struct tSlider;
|
2023-08-04 22:47:22 -04:00
|
|
|
enum SliderMode { SLIDER_MODE_PERCENT = 0, SLIDER_MODE_FLOAT = 1 };
|
2021-07-22 23:44:53 +01:00
|
|
|
|
2023-08-04 22:47:22 -04:00
|
|
|
tSlider *ED_slider_create(bContext *C);
|
2021-12-09 00:55:11 +11:00
|
|
|
/**
|
|
|
|
|
* For modal operations so the percentage doesn't pop on the first mouse movement.
|
|
|
|
|
*/
|
2023-08-04 22:47:22 -04:00
|
|
|
void ED_slider_init(tSlider *slider, const wmEvent *event);
|
2021-12-09 00:55:11 +11:00
|
|
|
/**
|
|
|
|
|
* Calculate slider factor based on mouse position.
|
|
|
|
|
*/
|
2023-08-04 22:47:22 -04:00
|
|
|
bool ED_slider_modal(tSlider *slider, const wmEvent *event);
|
|
|
|
|
void ED_slider_destroy(bContext *C, tSlider *slider);
|
2021-07-22 23:44:53 +01:00
|
|
|
|
2021-12-09 00:55:11 +11:00
|
|
|
/**
|
|
|
|
|
* Return string based on the current state of the slider.
|
|
|
|
|
*/
|
2023-08-04 22:47:22 -04:00
|
|
|
void ED_slider_status_string_get(const tSlider *slider,
|
2021-07-22 23:44:53 +01:00
|
|
|
char *status_string,
|
2022-01-12 12:49:36 +01:00
|
|
|
size_t size_of_status_string);
|
2021-07-22 23:44:53 +01:00
|
|
|
|
2025-01-22 03:30:40 +01:00
|
|
|
void ED_slider_status_get(const tSlider *slider, WorkspaceStatus &status);
|
|
|
|
|
|
2024-03-28 20:57:47 +11:00
|
|
|
float ED_slider_factor_get(const tSlider *slider);
|
2023-08-04 22:47:22 -04:00
|
|
|
void ED_slider_factor_set(tSlider *slider, float factor);
|
2021-07-22 23:44:53 +01:00
|
|
|
|
2025-01-03 17:23:12 +01:00
|
|
|
/**
|
|
|
|
|
* By default the increment step is 0.1, which depending on the factor bounds might not be desired.
|
|
|
|
|
* Only has an effect if increment is allowed and enabled.
|
|
|
|
|
* See `ED_slider_allow_increments_set`.
|
2025-01-16 13:02:07 +11:00
|
|
|
* \param increment_step: cannot be 0.
|
2025-01-03 17:23:12 +01:00
|
|
|
*/
|
|
|
|
|
void ED_slider_increment_step_set(tSlider *slider, float increment_step);
|
|
|
|
|
|
2024-03-26 17:54:30 +11:00
|
|
|
/** One bool value for each side of the slider. Allows to enable overshoot only on one side. */
|
2023-08-04 22:47:22 -04:00
|
|
|
void ED_slider_allow_overshoot_set(tSlider *slider, bool lower, bool upper);
|
2023-05-05 17:22:39 +02:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Set the soft limits for the slider, which are applied until the user enables overshooting.
|
|
|
|
|
*/
|
2024-05-06 09:20:05 +10:00
|
|
|
void ED_slider_factor_bounds_set(tSlider *slider,
|
|
|
|
|
float factor_bound_lower,
|
2024-07-27 13:20:43 +10:00
|
|
|
float factor_bound_upper);
|
2021-07-22 23:44:53 +01:00
|
|
|
|
2024-03-28 20:57:47 +11:00
|
|
|
bool ED_slider_allow_increments_get(const tSlider *slider);
|
2023-08-04 22:47:22 -04:00
|
|
|
void ED_slider_allow_increments_set(tSlider *slider, bool value);
|
2023-01-06 11:30:40 +01:00
|
|
|
|
2024-01-19 12:08:40 -05:00
|
|
|
void ED_slider_mode_set(tSlider *slider, SliderMode mode);
|
2024-03-28 20:57:47 +11:00
|
|
|
SliderMode ED_slider_mode_get(const tSlider *slider);
|
2023-08-04 22:47:22 -04:00
|
|
|
void ED_slider_unit_set(tSlider *slider, const char *unit);
|
2024-04-25 15:48:17 +02:00
|
|
|
/* Set a name that will show next to the slider to indicate which property is modified currently.
|
|
|
|
|
* To clear, set to an empty string. */
|
2024-07-27 13:20:43 +10:00
|
|
|
void ED_slider_property_label_set(tSlider *slider, const char *property_label);
|
2023-07-07 15:08:40 +02:00
|
|
|
|
2008-12-10 17:58:18 +00:00
|
|
|
/* ************** XXX OLD CRUFT WARNING ************* */
|
|
|
|
|
|
2021-12-09 00:55:11 +11:00
|
|
|
/**
|
|
|
|
|
* Now only used in 2D spaces, like time, f-curve, NLA, image, etc.
|
|
|
|
|
*
|
|
|
|
|
* \note Shift/Control are not configurable key-bindings.
|
|
|
|
|
*/
|
2008-12-19 19:11:02 +00:00
|
|
|
void apply_keyb_grid(
|
2022-02-24 22:48:34 +11:00
|
|
|
bool shift, bool ctrl, float *val, float fac1, float fac2, float fac3, int invert);
|
2008-12-10 17:58:18 +00:00
|
|
|
|
2011-01-26 14:18:16 +00:00
|
|
|
/* where else to go ? */
|
2023-08-04 22:47:22 -04:00
|
|
|
void unpack_menu(bContext *C,
|
2011-01-26 14:18:16 +00:00
|
|
|
const char *opname,
|
|
|
|
|
const char *id_name,
|
|
|
|
|
const char *abs_name,
|
|
|
|
|
const char *folder,
|
2023-08-04 22:47:22 -04:00
|
|
|
PackedFile *pf);
|