2015-12-27 16:36:08 +11:00
|
|
|
/*
|
|
|
|
|
* 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
|
2018-06-01 18:19:39 +02:00
|
|
|
* of the License, or (at your option) any later version.
|
2015-12-27 16:36:08 +11:00
|
|
|
*
|
|
|
|
|
* 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.
|
|
|
|
|
*
|
|
|
|
|
* The Original Code is Copyright (C) 2007 Blender Foundation.
|
|
|
|
|
* All rights reserved.
|
|
|
|
|
*/
|
|
|
|
|
|
2019-02-18 08:08:12 +11:00
|
|
|
/** \file
|
|
|
|
|
* \ingroup wm
|
2015-12-27 16:36:08 +11:00
|
|
|
*
|
|
|
|
|
* Generic re-usable property definitions and accessors for operators to share.
|
|
|
|
|
* (`WM_operator_properties_*` functions).
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "DNA_space_types.h"
|
|
|
|
|
|
|
|
|
|
#include "BLI_rect.h"
|
2015-12-27 17:46:55 +11:00
|
|
|
#include "BLI_math_base.h"
|
2015-12-27 16:36:08 +11:00
|
|
|
|
|
|
|
|
#include "UI_resources.h"
|
|
|
|
|
|
|
|
|
|
#include "RNA_access.h"
|
|
|
|
|
#include "RNA_define.h"
|
|
|
|
|
#include "RNA_enum_types.h"
|
|
|
|
|
|
2018-08-14 10:28:41 +10:00
|
|
|
#include "ED_select_utils.h"
|
|
|
|
|
|
2015-12-27 16:36:08 +11:00
|
|
|
#include "WM_api.h"
|
|
|
|
|
#include "WM_types.h"
|
|
|
|
|
|
2018-11-20 10:06:02 +11:00
|
|
|
void WM_operator_properties_confirm_or_exec(wmOperatorType *ot)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
PropertyRNA *prop;
|
2018-11-20 10:06:02 +11:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
prop = RNA_def_boolean(ot->srna, "confirm", true, "Confirm", "Prompt for confirmation");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
2018-11-20 10:06:02 +11:00
|
|
|
}
|
|
|
|
|
|
2015-12-27 16:36:08 +11:00
|
|
|
/* default properties for fileselect */
|
2019-04-17 06:17:24 +02:00
|
|
|
void WM_operator_properties_filesel(wmOperatorType *ot,
|
|
|
|
|
int filter,
|
|
|
|
|
short type,
|
|
|
|
|
short action,
|
|
|
|
|
short flag,
|
|
|
|
|
short display,
|
|
|
|
|
short sort)
|
2015-12-27 16:36:08 +11:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
PropertyRNA *prop;
|
|
|
|
|
|
|
|
|
|
static const EnumPropertyItem file_display_items[] = {
|
|
|
|
|
{FILE_DEFAULTDISPLAY,
|
|
|
|
|
"DEFAULT",
|
|
|
|
|
0,
|
|
|
|
|
"Default",
|
|
|
|
|
"Automatically determine display type for files"},
|
UI: File Browser Design Overhaul
This is a general redesign of the File Browser GUI and interaction
methods. For screenshots, check patch D5601.
Main changes in short:
* File Browser as floating window
* New layout of regions
* Popovers for view and filter options
* Vertical list view with interactive column header
* New and updated icons
* Keymap consistency fixes
* Many tweaks and fixes to the drawing of views
----
General:
* The file browser now opens as temporary floating window. It closes on
Esc. The header is hidden then.
* When the file browser is opened as regular editor, the header remains
visible.
* All file browser regions are now defined in Python (the button
layout).
* Adjusted related operator UI names.
Keymap:
Keymap is now consistent with other list-based views in Blender, such as
the Outliner.
* Left click to select, double-click to open
* Right-click context menus
* Shift-click to fill selection
* Ctrl-click to extend selection
Operator options:
These previously overlapped with the source list, which caused numerous
issues with resizing and presenting many settings in a small panel area.
It was also generally inconsistent with Blender.
* Moved to new sidebar, which can easily be shown or hidden using a
prominent Options toggle.
* IO operators have new layouts to match this new sidebar, using
sub-panels. This will have to be committed separately (Add-on
repository).
* If operators want to show the options by default, they have the option
to do so (see `WM_FILESEL_SHOW_PROPS`, `hide_props_region`), otherwise
they are hidden by default.
General Layout:
The layout has been changed to be simpler, more standard, and fits
better in with Blender 2.8.
* More conventional layout (file path at top, file name at the bottom,
execute/cancel buttons in bottom right).
* Use of popovers to group controls, and allow for more descriptive
naming.
* Search box is always live now, just like Outliner.
Views:
* Date Modified column combines both date and time, also uses user
friendly strings for recent dates (i.e. "Yesterday", "Today").
* Details columns (file size, modification date/time) are now toggleable
for all display types, they are not hardcoded per display type.
* File sizes now show as B, KB, MB, ... rather than B, KiB, MiB, … They
are now also calculated using base 10 of course.
* Option to sort in inverse order.
Vertical List View:
* This view now used a much simpler single vertical list with columns
for information.
* Users can click on the headers of these columns to order by that
category, and click again to reverse the ordering.
Icons:
* Updated icons by Jendrzych, with better centering.
* Files and folders have new icons in Icon view.
* Both files and folders have reworked superimposed icons that show
users the file/folder type.
* 3D file documents correctly use the 3d file icon, which was unused
previously.
* Workspaces now show their icon on Link/Append - also when listed in
the Outliner.
Minor Python-API breakage:
* `bpy.types.FileSelectParams.display_type`: `LIST_SHORT` and
`LIST_LONG` are replaced by `LIST_VERTICAL` and `LIST_HORIZONTAL`.
Removes the feature where directories would automatically be created if
they are entered into the file path text button, but don't exist. We
were not sure if users use it enough to keep it. We can definitely bring
it back.
----
//Combined effort by @billreynish, @harley, @jendrzych, my university
colleague Brian Meisenheimer and myself.//
Differential Revision: https://developer.blender.org/D5601
Reviewers: Brecht, Bastien
2019-09-03 15:43:38 +02:00
|
|
|
{FILE_VERTICALDISPLAY,
|
|
|
|
|
"LIST_VERTICAL",
|
|
|
|
|
ICON_SHORTDISPLAY, /* Name of deprecated short list */
|
2019-04-17 06:17:24 +02:00
|
|
|
"Short List",
|
|
|
|
|
"Display files as short list"},
|
UI: File Browser Design Overhaul
This is a general redesign of the File Browser GUI and interaction
methods. For screenshots, check patch D5601.
Main changes in short:
* File Browser as floating window
* New layout of regions
* Popovers for view and filter options
* Vertical list view with interactive column header
* New and updated icons
* Keymap consistency fixes
* Many tweaks and fixes to the drawing of views
----
General:
* The file browser now opens as temporary floating window. It closes on
Esc. The header is hidden then.
* When the file browser is opened as regular editor, the header remains
visible.
* All file browser regions are now defined in Python (the button
layout).
* Adjusted related operator UI names.
Keymap:
Keymap is now consistent with other list-based views in Blender, such as
the Outliner.
* Left click to select, double-click to open
* Right-click context menus
* Shift-click to fill selection
* Ctrl-click to extend selection
Operator options:
These previously overlapped with the source list, which caused numerous
issues with resizing and presenting many settings in a small panel area.
It was also generally inconsistent with Blender.
* Moved to new sidebar, which can easily be shown or hidden using a
prominent Options toggle.
* IO operators have new layouts to match this new sidebar, using
sub-panels. This will have to be committed separately (Add-on
repository).
* If operators want to show the options by default, they have the option
to do so (see `WM_FILESEL_SHOW_PROPS`, `hide_props_region`), otherwise
they are hidden by default.
General Layout:
The layout has been changed to be simpler, more standard, and fits
better in with Blender 2.8.
* More conventional layout (file path at top, file name at the bottom,
execute/cancel buttons in bottom right).
* Use of popovers to group controls, and allow for more descriptive
naming.
* Search box is always live now, just like Outliner.
Views:
* Date Modified column combines both date and time, also uses user
friendly strings for recent dates (i.e. "Yesterday", "Today").
* Details columns (file size, modification date/time) are now toggleable
for all display types, they are not hardcoded per display type.
* File sizes now show as B, KB, MB, ... rather than B, KiB, MiB, … They
are now also calculated using base 10 of course.
* Option to sort in inverse order.
Vertical List View:
* This view now used a much simpler single vertical list with columns
for information.
* Users can click on the headers of these columns to order by that
category, and click again to reverse the ordering.
Icons:
* Updated icons by Jendrzych, with better centering.
* Files and folders have new icons in Icon view.
* Both files and folders have reworked superimposed icons that show
users the file/folder type.
* 3D file documents correctly use the 3d file icon, which was unused
previously.
* Workspaces now show their icon on Link/Append - also when listed in
the Outliner.
Minor Python-API breakage:
* `bpy.types.FileSelectParams.display_type`: `LIST_SHORT` and
`LIST_LONG` are replaced by `LIST_VERTICAL` and `LIST_HORIZONTAL`.
Removes the feature where directories would automatically be created if
they are entered into the file path text button, but don't exist. We
were not sure if users use it enough to keep it. We can definitely bring
it back.
----
//Combined effort by @billreynish, @harley, @jendrzych, my university
colleague Brian Meisenheimer and myself.//
Differential Revision: https://developer.blender.org/D5601
Reviewers: Brecht, Bastien
2019-09-03 15:43:38 +02:00
|
|
|
{FILE_HORIZONTALDISPLAY,
|
|
|
|
|
"LIST_HORIZONTAL",
|
|
|
|
|
ICON_LONGDISPLAY, /* Name of deprecated long list */
|
2019-04-17 06:17:24 +02:00
|
|
|
"Long List",
|
|
|
|
|
"Display files as a detailed list"},
|
|
|
|
|
{FILE_IMGDISPLAY, "THUMBNAIL", ICON_IMGDISPLAY, "Thumbnails", "Display files as thumbnails"},
|
|
|
|
|
{0, NULL, 0, NULL, NULL},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (flag & WM_FILESEL_FILEPATH) {
|
|
|
|
|
RNA_def_string_file_path(ot->srna, "filepath", NULL, FILE_MAX, "File Path", "Path to file");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (flag & WM_FILESEL_DIRECTORY) {
|
|
|
|
|
RNA_def_string_dir_path(
|
|
|
|
|
ot->srna, "directory", NULL, FILE_MAX, "Directory", "Directory of the file");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (flag & WM_FILESEL_FILENAME) {
|
|
|
|
|
RNA_def_string_file_name(
|
|
|
|
|
ot->srna, "filename", NULL, FILE_MAX, "File Name", "Name of the file");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (flag & WM_FILESEL_FILES) {
|
2019-05-13 22:18:11 +02:00
|
|
|
prop = RNA_def_collection_runtime(
|
|
|
|
|
ot->srna, "files", &RNA_OperatorFileListElement, "Files", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
|
|
|
|
|
UI: File Browser Design Overhaul
This is a general redesign of the File Browser GUI and interaction
methods. For screenshots, check patch D5601.
Main changes in short:
* File Browser as floating window
* New layout of regions
* Popovers for view and filter options
* Vertical list view with interactive column header
* New and updated icons
* Keymap consistency fixes
* Many tweaks and fixes to the drawing of views
----
General:
* The file browser now opens as temporary floating window. It closes on
Esc. The header is hidden then.
* When the file browser is opened as regular editor, the header remains
visible.
* All file browser regions are now defined in Python (the button
layout).
* Adjusted related operator UI names.
Keymap:
Keymap is now consistent with other list-based views in Blender, such as
the Outliner.
* Left click to select, double-click to open
* Right-click context menus
* Shift-click to fill selection
* Ctrl-click to extend selection
Operator options:
These previously overlapped with the source list, which caused numerous
issues with resizing and presenting many settings in a small panel area.
It was also generally inconsistent with Blender.
* Moved to new sidebar, which can easily be shown or hidden using a
prominent Options toggle.
* IO operators have new layouts to match this new sidebar, using
sub-panels. This will have to be committed separately (Add-on
repository).
* If operators want to show the options by default, they have the option
to do so (see `WM_FILESEL_SHOW_PROPS`, `hide_props_region`), otherwise
they are hidden by default.
General Layout:
The layout has been changed to be simpler, more standard, and fits
better in with Blender 2.8.
* More conventional layout (file path at top, file name at the bottom,
execute/cancel buttons in bottom right).
* Use of popovers to group controls, and allow for more descriptive
naming.
* Search box is always live now, just like Outliner.
Views:
* Date Modified column combines both date and time, also uses user
friendly strings for recent dates (i.e. "Yesterday", "Today").
* Details columns (file size, modification date/time) are now toggleable
for all display types, they are not hardcoded per display type.
* File sizes now show as B, KB, MB, ... rather than B, KiB, MiB, … They
are now also calculated using base 10 of course.
* Option to sort in inverse order.
Vertical List View:
* This view now used a much simpler single vertical list with columns
for information.
* Users can click on the headers of these columns to order by that
category, and click again to reverse the ordering.
Icons:
* Updated icons by Jendrzych, with better centering.
* Files and folders have new icons in Icon view.
* Both files and folders have reworked superimposed icons that show
users the file/folder type.
* 3D file documents correctly use the 3d file icon, which was unused
previously.
* Workspaces now show their icon on Link/Append - also when listed in
the Outliner.
Minor Python-API breakage:
* `bpy.types.FileSelectParams.display_type`: `LIST_SHORT` and
`LIST_LONG` are replaced by `LIST_VERTICAL` and `LIST_HORIZONTAL`.
Removes the feature where directories would automatically be created if
they are entered into the file path text button, but don't exist. We
were not sure if users use it enough to keep it. We can definitely bring
it back.
----
//Combined effort by @billreynish, @harley, @jendrzych, my university
colleague Brian Meisenheimer and myself.//
Differential Revision: https://developer.blender.org/D5601
Reviewers: Brecht, Bastien
2019-09-03 15:43:38 +02:00
|
|
|
if ((flag & WM_FILESEL_SHOW_PROPS) == 0) {
|
|
|
|
|
prop = RNA_def_boolean(ot->srna,
|
|
|
|
|
"hide_props_region",
|
|
|
|
|
true,
|
|
|
|
|
"Hide Operator Properties",
|
|
|
|
|
"Collapse the region displaying the operator settings");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
}
|
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (action == FILE_SAVE) {
|
|
|
|
|
/* note, this is only used to check if we should highlight the filename area red when the
|
|
|
|
|
* filepath is an existing file. */
|
|
|
|
|
prop = RNA_def_boolean(ot->srna,
|
|
|
|
|
"check_existing",
|
|
|
|
|
true,
|
|
|
|
|
"Check Existing",
|
|
|
|
|
"Check and warn on overwriting existing files");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
prop = RNA_def_boolean(
|
|
|
|
|
ot->srna, "filter_blender", (filter & FILE_TYPE_BLENDER) != 0, "Filter .blend files", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_boolean(ot->srna,
|
|
|
|
|
"filter_backup",
|
|
|
|
|
(filter & FILE_TYPE_BLENDER_BACKUP) != 0,
|
|
|
|
|
"Filter .blend files",
|
|
|
|
|
"");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_boolean(
|
|
|
|
|
ot->srna, "filter_image", (filter & FILE_TYPE_IMAGE) != 0, "Filter image files", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_boolean(
|
|
|
|
|
ot->srna, "filter_movie", (filter & FILE_TYPE_MOVIE) != 0, "Filter movie files", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_boolean(
|
|
|
|
|
ot->srna, "filter_python", (filter & FILE_TYPE_PYSCRIPT) != 0, "Filter python files", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_boolean(
|
|
|
|
|
ot->srna, "filter_font", (filter & FILE_TYPE_FTFONT) != 0, "Filter font files", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_boolean(
|
|
|
|
|
ot->srna, "filter_sound", (filter & FILE_TYPE_SOUND) != 0, "Filter sound files", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_boolean(
|
|
|
|
|
ot->srna, "filter_text", (filter & FILE_TYPE_TEXT) != 0, "Filter text files", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
2019-09-05 07:54:41 +02:00
|
|
|
prop = RNA_def_boolean(
|
|
|
|
|
ot->srna, "filter_archive", (filter & FILE_TYPE_ARCHIVE) != 0, "Filter archive files", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
2019-04-17 06:17:24 +02:00
|
|
|
prop = RNA_def_boolean(
|
|
|
|
|
ot->srna, "filter_btx", (filter & FILE_TYPE_BTX) != 0, "Filter btx files", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_boolean(
|
|
|
|
|
ot->srna, "filter_collada", (filter & FILE_TYPE_COLLADA) != 0, "Filter COLLADA files", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_boolean(
|
|
|
|
|
ot->srna, "filter_alembic", (filter & FILE_TYPE_ALEMBIC) != 0, "Filter Alembic files", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_boolean(
|
|
|
|
|
ot->srna, "filter_folder", (filter & FILE_TYPE_FOLDER) != 0, "Filter folders", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_boolean(
|
|
|
|
|
ot->srna, "filter_blenlib", (filter & FILE_TYPE_BLENDERLIB) != 0, "Filter Blender IDs", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
|
|
|
|
|
prop = RNA_def_int(
|
|
|
|
|
ot->srna,
|
|
|
|
|
"filemode",
|
|
|
|
|
type,
|
|
|
|
|
FILE_LOADLIB,
|
|
|
|
|
FILE_SPECIAL,
|
|
|
|
|
"File Browser Mode",
|
|
|
|
|
"The setting for the file browser mode to load a .blend file, a library or a special file",
|
|
|
|
|
FILE_LOADLIB,
|
|
|
|
|
FILE_SPECIAL);
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
|
|
|
|
|
if (flag & WM_FILESEL_RELPATH) {
|
|
|
|
|
RNA_def_boolean(ot->srna,
|
|
|
|
|
"relative_path",
|
|
|
|
|
true,
|
|
|
|
|
"Relative Path",
|
|
|
|
|
"Select the file relative to the blend file");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((filter & FILE_TYPE_IMAGE) || (filter & FILE_TYPE_MOVIE)) {
|
|
|
|
|
prop = RNA_def_boolean(ot->srna, "show_multiview", 0, "Enable Multi-View", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_boolean(ot->srna, "use_multiview", 0, "Use Multi-View", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
prop = RNA_def_enum(ot->srna, "display_type", file_display_items, display, "Display Type", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
|
|
|
|
|
prop = RNA_def_enum(
|
|
|
|
|
ot->srna, "sort_method", rna_enum_file_sort_items, sort, "File sorting mode", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
2015-12-27 16:36:08 +11:00
|
|
|
}
|
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
static void wm_operator_properties_select_action_ex(wmOperatorType *ot,
|
|
|
|
|
int default_action,
|
2019-04-16 13:12:28 +02:00
|
|
|
const EnumPropertyItem *select_actions,
|
2019-04-17 06:17:24 +02:00
|
|
|
bool hide_gui)
|
2015-12-27 16:36:08 +11:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
PropertyRNA *prop;
|
|
|
|
|
prop = RNA_def_enum(
|
|
|
|
|
ot->srna, "action", select_actions, default_action, "Action", "Selection action to execute");
|
2019-04-16 13:12:28 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (hide_gui) {
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
}
|
2015-12-27 16:36:08 +11:00
|
|
|
}
|
|
|
|
|
|
2019-04-16 13:12:28 +02:00
|
|
|
void WM_operator_properties_select_action(wmOperatorType *ot, int default_action, bool hide_gui)
|
2015-12-27 16:36:08 +11:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
static const EnumPropertyItem select_actions[] = {
|
|
|
|
|
{SEL_TOGGLE, "TOGGLE", 0, "Toggle", "Toggle selection for all elements"},
|
|
|
|
|
{SEL_SELECT, "SELECT", 0, "Select", "Select all elements"},
|
|
|
|
|
{SEL_DESELECT, "DESELECT", 0, "Deselect", "Deselect all elements"},
|
|
|
|
|
{SEL_INVERT, "INVERT", 0, "Invert", "Invert selection of all elements"},
|
|
|
|
|
{0, NULL, 0, NULL, NULL},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
wm_operator_properties_select_action_ex(ot, default_action, select_actions, hide_gui);
|
2015-12-27 16:36:08 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* only SELECT/DESELECT
|
|
|
|
|
*/
|
2019-04-17 06:17:24 +02:00
|
|
|
void WM_operator_properties_select_action_simple(wmOperatorType *ot,
|
|
|
|
|
int default_action,
|
|
|
|
|
bool hide_gui)
|
2015-12-27 16:36:08 +11:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
static const EnumPropertyItem select_actions[] = {
|
|
|
|
|
{SEL_SELECT, "SELECT", 0, "Select", "Select all elements"},
|
|
|
|
|
{SEL_DESELECT, "DESELECT", 0, "Deselect", "Deselect all elements"},
|
|
|
|
|
{0, NULL, 0, NULL, NULL},
|
|
|
|
|
};
|
2015-12-27 16:36:08 +11:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
wm_operator_properties_select_action_ex(ot, default_action, select_actions, hide_gui);
|
2015-12-27 16:36:08 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Use for all select random operators.
|
|
|
|
|
* Adds properties: percent, seed, action.
|
|
|
|
|
*/
|
|
|
|
|
void WM_operator_properties_select_random(wmOperatorType *ot)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
RNA_def_float_percentage(ot->srna,
|
|
|
|
|
"percent",
|
|
|
|
|
50.f,
|
|
|
|
|
0.0f,
|
|
|
|
|
100.0f,
|
|
|
|
|
"Percent",
|
|
|
|
|
"Percentage of objects to select randomly",
|
|
|
|
|
0.f,
|
|
|
|
|
100.0f);
|
|
|
|
|
RNA_def_int(ot->srna,
|
|
|
|
|
"seed",
|
|
|
|
|
0,
|
|
|
|
|
0,
|
|
|
|
|
INT_MAX,
|
|
|
|
|
"Random Seed",
|
|
|
|
|
"Seed for the random number generator",
|
|
|
|
|
0,
|
|
|
|
|
255);
|
|
|
|
|
|
|
|
|
|
WM_operator_properties_select_action_simple(ot, SEL_SELECT, false);
|
2015-12-27 16:36:08 +11:00
|
|
|
}
|
|
|
|
|
|
2016-03-29 01:20:45 +11:00
|
|
|
int WM_operator_properties_select_random_seed_increment_get(wmOperator *op)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
PropertyRNA *prop = RNA_struct_find_property(op->ptr, "seed");
|
|
|
|
|
int value = RNA_property_int_get(op->ptr, prop);
|
|
|
|
|
|
|
|
|
|
if (op->flag & OP_IS_INVOKE) {
|
|
|
|
|
if (!RNA_property_is_set(op->ptr, prop)) {
|
|
|
|
|
value += 1;
|
|
|
|
|
RNA_property_int_set(op->ptr, prop, value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return value;
|
2016-03-29 01:20:45 +11:00
|
|
|
}
|
|
|
|
|
|
2015-12-27 16:36:08 +11:00
|
|
|
void WM_operator_properties_select_all(wmOperatorType *ot)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
WM_operator_properties_select_action(ot, SEL_TOGGLE, true);
|
2015-12-27 16:36:08 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WM_operator_properties_border(wmOperatorType *ot)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
PropertyRNA *prop;
|
|
|
|
|
|
|
|
|
|
prop = RNA_def_int(ot->srna, "xmin", 0, INT_MIN, INT_MAX, "X Min", "", INT_MIN, INT_MAX);
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_int(ot->srna, "xmax", 0, INT_MIN, INT_MAX, "X Max", "", INT_MIN, INT_MAX);
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_int(ot->srna, "ymin", 0, INT_MIN, INT_MAX, "Y Min", "", INT_MIN, INT_MAX);
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_int(ot->srna, "ymax", 0, INT_MIN, INT_MAX, "Y Max", "", INT_MIN, INT_MAX);
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
|
|
|
|
|
prop = RNA_def_boolean(ot->srna, "wait_for_input", true, "Wait for Input", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
2015-12-27 16:36:08 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WM_operator_properties_border_to_rcti(struct wmOperator *op, rcti *rect)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
rect->xmin = RNA_int_get(op->ptr, "xmin");
|
|
|
|
|
rect->ymin = RNA_int_get(op->ptr, "ymin");
|
|
|
|
|
rect->xmax = RNA_int_get(op->ptr, "xmax");
|
|
|
|
|
rect->ymax = RNA_int_get(op->ptr, "ymax");
|
2015-12-27 16:36:08 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WM_operator_properties_border_to_rctf(struct wmOperator *op, rctf *rect)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
rcti rect_i;
|
|
|
|
|
WM_operator_properties_border_to_rcti(op, &rect_i);
|
|
|
|
|
BLI_rctf_rcti_copy(rect, &rect_i);
|
2015-12-27 16:36:08 +11:00
|
|
|
}
|
|
|
|
|
|
2017-10-16 15:32:09 +11:00
|
|
|
/**
|
2018-10-05 10:27:04 +10:00
|
|
|
* Use with #WM_gesture_box_invoke
|
2017-10-16 15:32:09 +11:00
|
|
|
*/
|
2018-10-05 10:27:04 +10:00
|
|
|
void WM_operator_properties_gesture_box_ex(wmOperatorType *ot, bool deselect, bool extend)
|
2015-12-27 16:36:08 +11:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
PropertyRNA *prop;
|
|
|
|
|
|
|
|
|
|
WM_operator_properties_border(ot);
|
|
|
|
|
|
|
|
|
|
if (deselect) {
|
|
|
|
|
prop = RNA_def_boolean(
|
|
|
|
|
ot->srna, "deselect", false, "Deselect", "Deselect rather than select items");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
|
|
|
|
|
}
|
|
|
|
|
if (extend) {
|
|
|
|
|
prop = RNA_def_boolean(ot->srna,
|
|
|
|
|
"extend",
|
|
|
|
|
true,
|
|
|
|
|
"Extend",
|
|
|
|
|
"Extend selection instead of deselecting everything first");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
|
|
|
|
|
}
|
2015-12-27 16:36:08 +11:00
|
|
|
}
|
|
|
|
|
|
2019-05-31 19:53:24 +10:00
|
|
|
/**
|
|
|
|
|
* Disable using cursor position,
|
|
|
|
|
* use when view operators are initialized from buttons.
|
|
|
|
|
*/
|
|
|
|
|
void WM_operator_properties_use_cursor_init(wmOperatorType *ot)
|
|
|
|
|
{
|
2019-07-25 13:41:38 +10:00
|
|
|
PropertyRNA *prop = RNA_def_boolean(ot->srna,
|
|
|
|
|
"use_cursor_init",
|
|
|
|
|
true,
|
|
|
|
|
"Use Mouse Position",
|
|
|
|
|
"Allow the initial mouse position to be used");
|
2019-05-31 19:53:24 +10:00
|
|
|
RNA_def_property_flag(prop, PROP_SKIP_SAVE | PROP_HIDDEN);
|
|
|
|
|
}
|
|
|
|
|
|
2018-10-05 10:27:04 +10:00
|
|
|
void WM_operator_properties_gesture_box_select(wmOperatorType *ot)
|
2017-10-16 21:58:51 +11:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
WM_operator_properties_gesture_box_ex(ot, true, true);
|
2017-10-16 21:58:51 +11:00
|
|
|
}
|
2018-10-05 10:27:04 +10:00
|
|
|
void WM_operator_properties_gesture_box(wmOperatorType *ot)
|
2017-10-16 21:58:51 +11:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
WM_operator_properties_gesture_box_ex(ot, false, false);
|
2017-10-16 21:58:51 +11:00
|
|
|
}
|
|
|
|
|
|
2018-08-14 10:28:41 +10:00
|
|
|
void WM_operator_properties_select_operation(wmOperatorType *ot)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
static const EnumPropertyItem select_mode_items[] = {
|
2019-05-06 16:47:13 +02:00
|
|
|
{SEL_OP_SET, "SET", ICON_SELECT_SET, "Set", "Set a new selection"},
|
|
|
|
|
{SEL_OP_ADD, "ADD", ICON_SELECT_EXTEND, "Extend", "Extend existing selection"},
|
|
|
|
|
{SEL_OP_SUB, "SUB", ICON_SELECT_SUBTRACT, "Subtract", "Subtract existing selection"},
|
|
|
|
|
{SEL_OP_XOR, "XOR", ICON_SELECT_DIFFERENCE, "Difference", "Inverts existing selection"},
|
|
|
|
|
{SEL_OP_AND, "AND", ICON_SELECT_INTERSECT, "Intersect", "Intersect existing selection"},
|
2019-04-17 06:17:24 +02:00
|
|
|
{0, NULL, 0, NULL, NULL},
|
|
|
|
|
};
|
|
|
|
|
PropertyRNA *prop = RNA_def_enum(ot->srna, "mode", select_mode_items, SEL_OP_SET, "Mode", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
|
2018-08-14 10:28:41 +10:00
|
|
|
}
|
|
|
|
|
|
2018-11-23 18:06:50 +11:00
|
|
|
/* Some tools don't support XOR/AND. */
|
2018-11-23 17:52:28 +11:00
|
|
|
void WM_operator_properties_select_operation_simple(wmOperatorType *ot)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
static const EnumPropertyItem select_mode_items[] = {
|
2019-05-06 16:47:13 +02:00
|
|
|
{SEL_OP_SET, "SET", ICON_SELECT_SET, "Set", "Set a new selection"},
|
|
|
|
|
{SEL_OP_ADD, "ADD", ICON_SELECT_EXTEND, "Extend", "Extend existing selection"},
|
|
|
|
|
{SEL_OP_SUB, "SUB", ICON_SELECT_SUBTRACT, "Subtract", "Subtract existing selection"},
|
2019-04-17 06:17:24 +02:00
|
|
|
{0, NULL, 0, NULL, NULL},
|
|
|
|
|
};
|
|
|
|
|
PropertyRNA *prop = RNA_def_enum(ot->srna, "mode", select_mode_items, SEL_OP_SET, "Mode", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
|
2018-11-23 17:52:28 +11:00
|
|
|
}
|
|
|
|
|
|
WM: Utilities for select operators to work with click-dragging items
Based on work by Bastien and Brecht in the Node Editor, this adds more
generalized support for selecting items so that click+drag actions on
items (nodes, makers, dopesheet keys, etc.) works as wanted.
Note that this only adds the barebones to support this in other editors,
it's not used yet (will be done in followup commits).
The behavior is supposed to work as follows:
* Clicking an unselected item immediately selects it, and deselects
other items (doesn't wait for release events).
* Click+drag on an unselected item immediately selects it, deselects
others and drags it in one go (don't require selecting it first!).
* Click+drag on a selected item won't change the selection state (and
won't send an undo push) and start dragging all selected items as soon
as the drag event is recognized.
* Clicking on a selected item will still deselect others, but that will
only happen on mouse release, when we know the intention is not to drag
the item.
Included in: https://developer.blender.org/D5979
Reviewed by: Brecht van Lommel, William Reynish
2019-10-04 15:11:19 +02:00
|
|
|
void WM_operator_properties_generic_select(wmOperatorType *ot)
|
|
|
|
|
{
|
|
|
|
|
PropertyRNA *prop = RNA_def_boolean(
|
2019-10-14 11:55:49 +02:00
|
|
|
ot->srna, "wait_to_deselect_others", false, "Wait to Deselect Others", "");
|
WM: Utilities for select operators to work with click-dragging items
Based on work by Bastien and Brecht in the Node Editor, this adds more
generalized support for selecting items so that click+drag actions on
items (nodes, makers, dopesheet keys, etc.) works as wanted.
Note that this only adds the barebones to support this in other editors,
it's not used yet (will be done in followup commits).
The behavior is supposed to work as follows:
* Clicking an unselected item immediately selects it, and deselects
other items (doesn't wait for release events).
* Click+drag on an unselected item immediately selects it, deselects
others and drags it in one go (don't require selecting it first!).
* Click+drag on a selected item won't change the selection state (and
won't send an undo push) and start dragging all selected items as soon
as the drag event is recognized.
* Clicking on a selected item will still deselect others, but that will
only happen on mouse release, when we know the intention is not to drag
the item.
Included in: https://developer.blender.org/D5979
Reviewed by: Brecht van Lommel, William Reynish
2019-10-04 15:11:19 +02:00
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
|
|
|
|
|
RNA_def_int(ot->srna, "mouse_x", 0, INT_MIN, INT_MAX, "Mouse X", "", INT_MIN, INT_MAX);
|
|
|
|
|
RNA_def_int(ot->srna, "mouse_y", 0, INT_MIN, INT_MAX, "Mouse Y", "", INT_MIN, INT_MAX);
|
|
|
|
|
}
|
|
|
|
|
|
2018-10-05 10:27:04 +10:00
|
|
|
void WM_operator_properties_gesture_box_zoom(wmOperatorType *ot)
|
2017-10-16 21:58:51 +11:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
WM_operator_properties_border(ot);
|
2017-10-16 21:58:51 +11:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
PropertyRNA *prop;
|
|
|
|
|
prop = RNA_def_boolean(ot->srna, "zoom_out", false, "Zoom Out", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
2017-10-16 21:58:51 +11:00
|
|
|
}
|
|
|
|
|
|
2017-10-16 16:11:04 +11:00
|
|
|
/**
|
|
|
|
|
* Use with #WM_gesture_lasso_invoke
|
|
|
|
|
*/
|
2019-03-07 23:41:32 +11:00
|
|
|
void WM_operator_properties_gesture_lasso(wmOperatorType *ot)
|
2017-10-16 16:11:04 +11:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
PropertyRNA *prop;
|
|
|
|
|
prop = RNA_def_collection_runtime(ot->srna, "path", &RNA_OperatorMousePath, "Path", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
2017-10-16 16:11:04 +11:00
|
|
|
}
|
|
|
|
|
|
2017-10-16 15:32:09 +11:00
|
|
|
/**
|
|
|
|
|
* Use with #WM_gesture_straightline_invoke
|
|
|
|
|
*/
|
2015-12-27 16:36:08 +11:00
|
|
|
void WM_operator_properties_gesture_straightline(wmOperatorType *ot, int cursor)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
PropertyRNA *prop;
|
|
|
|
|
|
|
|
|
|
prop = RNA_def_int(ot->srna, "xstart", 0, INT_MIN, INT_MAX, "X Start", "", INT_MIN, INT_MAX);
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_int(ot->srna, "xend", 0, INT_MIN, INT_MAX, "X End", "", INT_MIN, INT_MAX);
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_int(ot->srna, "ystart", 0, INT_MIN, INT_MAX, "Y Start", "", INT_MIN, INT_MAX);
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_int(ot->srna, "yend", 0, INT_MIN, INT_MAX, "Y End", "", INT_MIN, INT_MAX);
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
|
|
|
|
|
if (cursor) {
|
|
|
|
|
prop = RNA_def_int(ot->srna,
|
|
|
|
|
"cursor",
|
|
|
|
|
cursor,
|
|
|
|
|
0,
|
|
|
|
|
INT_MAX,
|
|
|
|
|
"Cursor",
|
|
|
|
|
"Mouse cursor style to use during the modal operator",
|
|
|
|
|
0,
|
|
|
|
|
INT_MAX);
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN);
|
|
|
|
|
}
|
2015-12-27 16:36:08 +11:00
|
|
|
}
|
2015-12-27 17:46:55 +11:00
|
|
|
|
2017-10-16 15:32:09 +11:00
|
|
|
/**
|
|
|
|
|
* Use with #WM_gesture_circle_invoke
|
|
|
|
|
*/
|
2019-03-05 22:26:45 +11:00
|
|
|
void WM_operator_properties_gesture_circle(wmOperatorType *ot)
|
2017-10-16 15:32:09 +11:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
PropertyRNA *prop;
|
|
|
|
|
const int radius_default = 25;
|
2017-10-16 15:32:09 +11:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
prop = RNA_def_int(ot->srna, "x", 0, INT_MIN, INT_MAX, "X", "", INT_MIN, INT_MAX);
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_int(ot->srna, "y", 0, INT_MIN, INT_MAX, "Y", "", INT_MIN, INT_MAX);
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
|
|
|
|
RNA_def_int(ot->srna, "radius", radius_default, 1, INT_MAX, "Radius", "", 1, INT_MAX);
|
2017-10-16 21:58:51 +11:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
prop = RNA_def_boolean(ot->srna, "wait_for_input", true, "Wait for Input", "");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
2017-10-16 15:32:09 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WM_operator_properties_mouse_select(wmOperatorType *ot)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
PropertyRNA *prop;
|
|
|
|
|
|
|
|
|
|
prop = RNA_def_boolean(ot->srna,
|
|
|
|
|
"extend",
|
|
|
|
|
false,
|
|
|
|
|
"Extend",
|
|
|
|
|
"Extend selection instead of deselecting everything first");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_boolean(ot->srna, "deselect", false, "Deselect", "Remove from selection");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
|
|
|
|
|
prop = RNA_def_boolean(ot->srna, "toggle", false, "Toggle Selection", "Toggle the selection");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
|
2019-04-29 11:33:50 +02:00
|
|
|
|
|
|
|
|
prop = RNA_def_boolean(ot->srna,
|
|
|
|
|
"deselect_all",
|
2019-04-29 15:01:55 +02:00
|
|
|
false,
|
2019-04-29 11:33:50 +02:00
|
|
|
"Deselect On Nothing",
|
|
|
|
|
"Deselect all when nothing under the cursor");
|
|
|
|
|
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
|
2017-10-16 15:32:09 +11:00
|
|
|
}
|
|
|
|
|
|
2015-12-27 17:46:55 +11:00
|
|
|
/**
|
|
|
|
|
* \param nth_can_disable: Enable if we want to be able to select no interval at all.
|
|
|
|
|
*/
|
|
|
|
|
void WM_operator_properties_checker_interval(wmOperatorType *ot, bool nth_can_disable)
|
|
|
|
|
{
|
2019-09-04 22:46:24 +10:00
|
|
|
const int nth_default = nth_can_disable ? 0 : 1;
|
|
|
|
|
const int nth_min = min_ii(nth_default, 1);
|
2019-04-17 06:17:24 +02:00
|
|
|
RNA_def_int(ot->srna,
|
2019-09-04 22:46:24 +10:00
|
|
|
"skip",
|
2019-04-17 06:17:24 +02:00
|
|
|
nth_default,
|
|
|
|
|
nth_min,
|
|
|
|
|
INT_MAX,
|
2019-09-04 22:46:24 +10:00
|
|
|
"Deselected",
|
|
|
|
|
"Number of deselected elements in the repetitive sequence",
|
2019-04-17 06:17:24 +02:00
|
|
|
nth_min,
|
|
|
|
|
100);
|
2019-09-04 22:46:24 +10:00
|
|
|
RNA_def_int(ot->srna,
|
|
|
|
|
"nth",
|
|
|
|
|
1,
|
|
|
|
|
1,
|
|
|
|
|
INT_MAX,
|
|
|
|
|
"Selected",
|
|
|
|
|
"Number of selected elements in the repetitive sequence",
|
|
|
|
|
1,
|
|
|
|
|
100);
|
2019-04-17 06:17:24 +02:00
|
|
|
RNA_def_int(ot->srna,
|
|
|
|
|
"offset",
|
|
|
|
|
0,
|
|
|
|
|
INT_MIN,
|
|
|
|
|
INT_MAX,
|
|
|
|
|
"Offset",
|
|
|
|
|
"Offset from the starting point",
|
|
|
|
|
-100,
|
|
|
|
|
100);
|
2015-12-27 17:46:55 +11:00
|
|
|
}
|
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
void WM_operator_properties_checker_interval_from_op(struct wmOperator *op,
|
|
|
|
|
struct CheckerIntervalParams *op_params)
|
2015-12-27 17:46:55 +11:00
|
|
|
{
|
2019-09-04 22:46:24 +10:00
|
|
|
const int nth = RNA_int_get(op->ptr, "nth");
|
2019-04-17 06:17:24 +02:00
|
|
|
const int skip = RNA_int_get(op->ptr, "skip");
|
|
|
|
|
int offset = RNA_int_get(op->ptr, "offset");
|
|
|
|
|
|
|
|
|
|
op_params->nth = nth;
|
|
|
|
|
op_params->skip = skip;
|
2019-08-14 23:29:46 +10:00
|
|
|
|
|
|
|
|
/* So input of offset zero ends up being (nth - 1). */
|
|
|
|
|
op_params->offset = mod_i(offset, nth + skip);
|
2015-12-27 17:46:55 +11:00
|
|
|
}
|
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
bool WM_operator_properties_checker_interval_test(const struct CheckerIntervalParams *op_params,
|
|
|
|
|
int depth)
|
2015-12-27 17:46:55 +11:00
|
|
|
{
|
2019-09-04 22:46:24 +10:00
|
|
|
return ((op_params->skip == 0) ||
|
2019-04-17 06:17:24 +02:00
|
|
|
((op_params->offset + depth) % (op_params->skip + op_params->nth) >= op_params->skip));
|
2015-12-27 17:46:55 +11:00
|
|
|
}
|