MeshLib C++ Docs
Loading...
Searching...
No Matches
MRUIStyle.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRMesh/MRFinally.h"
5#include "exports.h"
6#include "MRUnits.h"
7#include "MRVectorTraits.h"
8#include "MRImGui.h"
9#include <span>
10#include <string>
11#include <optional>
12#include <filesystem>
13
14namespace MR
15{
16
17class ImGuiImage;
18
19namespace UI
20{
21
22// Returns the global UI scale. Use this instead of passing around the scale in parameters.
23[[nodiscard]] MRVIEWER_API float scale();
24
25namespace detail
26{
27 // Strictly for internal use. Updates the value that `scale()` returns.
28 MRVIEWER_API void setScale( float newScale );
29}
30
31// Checks if the item with this name in the current window is active.
32[[nodiscard]] MRVIEWER_API bool isItemActive( const char* name );
33
34// Use this to store state across frames. Like what `CollapsingHeader()` uses to store it's open/close state.
35namespace StateStorage
36{
37
38[[nodiscard]] MRVIEWER_API bool readBool( std::string_view key, bool defaultValue = false );
39MRVIEWER_API void writeBool( std::string_view key, bool value );
40
41}
42
43// enumeration texture types
54
55// get texture by type
56MRVIEWER_API std::unique_ptr<ImGuiImage>& getTexture( TextureType type );
57
59MRVIEWER_API void init();
60
63{
65 bool enabled = true;
66
68 ImGuiButtonFlags flags = ImGuiButtonFlags_None;
69
74
77
79 bool forceImguiTextColor = false;
81 bool border = false;
82
85
87 bool enableTestEngine = true;
88
90 std::string testEngineName;
91};
92
94{
95 // basic customization parameters
97
98 // if false - text is to the right
99 bool textUnderImage = true;
100};
101
103{
104 // the point from which the axes will be drawn
106
107 // size plot by axis
108 float size = 100.f;
109 // optimal length between dashes
110 float optimalLenth = 10.0f;
111 // the minimum value of the axis
112 float minValue = 0.0f;
113 // the maximal value of the axis
114 float maxValue = 1.0f;
115 // sign every nth dash
117
118 // length dash without text
119 float lenDash = 8.0f;
120 // length dash with text
121 float lenDashWithText = 12.0f;
122 // text offset from dash
123 float textPadding = 3.0f;
124 // the format of the text for labels
126};
127
129MRVIEWER_API ImGuiKey getImGuiModPrimaryCtrl();
130
132MRVIEWER_API const char* getImGuiPrimaryCtrlName();
133
135MRVIEWER_API bool checkKey( ImGuiKey passedKey );
136
138[[deprecated( "Use UI::buttonEx( label, size, params ) instead" )]]
139MRVIEWER_API bool buttonEx( const char* label,bool active, const Vector2f& size = Vector2f( 0, 0 ),
140 ImGuiButtonFlags flags = ImGuiButtonFlags_None, const ButtonCustomizationParams& customParams = {} );
141
143MRVIEWER_API bool buttonEx( const char* label, const Vector2f& size = Vector2f( 0, 0 ), const ButtonCustomizationParams& customParams = {} );
146MRVIEWER_API bool button( const char* label, bool active, const Vector2f& size = Vector2f( 0, 0 ), ImGuiKey key = ImGuiKey_None );
149inline bool button( const char* label, const Vector2f& size = Vector2f( 0, 0 ), ImGuiKey key = ImGuiKey_None )
150{
151 return button( label, true, size, key );
152}
155MRVIEWER_API bool buttonCommonSize( const char* label, const Vector2f& size = Vector2f( 0, 0 ), ImGuiKey key = ImGuiKey_None );
157MRVIEWER_API bool buttonUnique( const char* label, int* value, int ownValue, const Vector2f& size = Vector2f( 0, 0 ), ImGuiKey key = ImGuiKey_None );
158
159// draw dash with text along the horizontal axis
160MRVIEWER_API void drawPoltHorizontalAxis( const PlotAxis& plotAxis );
161// draw dash with text along the vertical axis
162MRVIEWER_API void drawPoltVerticalAxis( const PlotAxis& plotAxis );
163
164// draw a button with an icon and text under it
165MRVIEWER_API bool buttonIconEx(
166 const std::string& name,
167 const Vector2f& iconSize,
168 const std::string& text,
169 const ImVec2& buttonSize,
170 const ButtonIconCustomizationParams& params = {} );
171
172// button with a gradient, always active
173inline bool buttonIcon( const std::string& name, const Vector2f& iconSize, const std::string& text, const ImVec2& buttonSize )
174{
175 return buttonIconEx( name, iconSize, text, buttonSize );
176}
177// button without a gradient, always active, configurable by an external style
179 const std::string& name,
180 const Vector2f& iconSize,
181 const std::string& text,
182 const ImVec2& buttonSize,
183 bool textUnderIcon = true,
184 ImGuiKey key = ImGuiKey_None )
185{
187 params.baseParams.forceImGuiBackground = true;
188 params.baseParams.forceImguiTextColor = true;
189 params.textUnderImage = textUnderIcon;
190 params.baseParams.underlineFirstLetter = std::string_view( ImGui::GetKeyName( key ) ) == std::string_view( text.c_str(), 1 );
191 return buttonIconEx( name, iconSize, text, buttonSize, params ) || checkKey( key );
192}
195MRVIEWER_API bool buttonUniqueIcon(
196 const std::string& iconName,
197 const Vector2f& iconSize,
198 const std::string& text,
199 const ImVec2& buttonSize,
200 int* value,
201 int ownValue,
202 bool textUnderIcon = true,
203 ImGuiKey key = ImGuiKey_None );
204
205
207MRVIEWER_API bool toggle( const char* label, bool* value );
209MRVIEWER_API bool checkbox( const char* label, bool* value );
211MRVIEWER_API bool checkboxOrFixedValue( const char* label, bool* value, std::optional<bool> valueOverride );
213MRVIEWER_API bool checkboxValid( const char* label, bool* value, bool valid );
215MRVIEWER_API bool checkboxMixed( const char* label, bool* value, bool mixed );
217template <typename Getter, typename Setter>
218bool checkbox( const char* label, Getter get, Setter set )
219{
220 bool value = get();
221 bool ret = checkbox( label, &value );
222 set( value );
223 return ret;
224}
225template <typename Getter, typename Setter>
226bool checkboxValid( const char* label, Getter get, Setter set, bool valid )
227{
228 bool value = get();
229 bool ret = checkboxValid( label, &value, valid );
230 set( value );
231 return ret;
232}
233
235template <typename T>
236bool checkboxFlags( const char* label, T& target, T flags )
237{
238 bool value = bool( target & flags );
239 bool mixed = value && ( target & flags ) != flags;
240 if ( checkboxMixed( label, &value, mixed ) )
241 {
242 if ( value )
243 target |= flags;
244 else
245 target &= ~flags;
246 return true;
247 }
248 return false;
249}
250
252{
253 // The persistent value of this setting, as set by the user by clicking the checkbox.
254 bool baseValue = false;
255 // Whether the setting is currently inverted because the modifier is held.
256 bool modifierHeld = false;
257
259
261
262 // You usually want to read this instead of the variables above.
263 // Returns `baseValue`, but inverted if `modifierHeld` is set.
264 [[nodiscard]] explicit operator bool() const { return baseValue != modifierHeld; }
265};
266
276MRVIEWER_API bool checkboxOrModifier( const char* label, CheckboxOrModifierState& value, int modifiers, int respectedModifiers = -1, std::optional<bool> valueOverride = {} );
277
278
280MRVIEWER_API bool radioButton( const char* label, int* value, int valButton );
282MRVIEWER_API bool radioButtonOrFixedValue( const char* label, int* value, int valButton, std::optional<int> valueOverride );
283
285{
286 // The permanent value of this setting, as set by the user by clicking the radio button.
287 int value{};
288 // The value that is displayed, and to be used - can differ from `value` if modifiers are pressed.
290
291 // The effective value, affected by modifiers.
292 [[nodiscard]] explicit operator int() const
293 {
294 return effectiveValue;
295 }
296};
297
304MRVIEWER_API bool radioButtonOrModifier( const char* label, RadioButtonOrModifierState& value, int valButton, int modifiers, int respectedModifiers = -1, std::optional<int> valueOverride = {} );
305
307MRVIEWER_API bool colorEdit4( const char* label, Vector4f& color, ImGuiColorEditFlags flags = ImGuiColorEditFlags_None );
308MRVIEWER_API bool colorEdit4( const char* label, Color& color, ImGuiColorEditFlags flags = ImGuiColorEditFlags_None );
309
311MRVIEWER_API bool combo( const char* label, int* v, const std::vector<std::string>& options,
312 bool showPreview = true, const std::vector<std::string>& tooltips = {}, const std::string& defaultText = "Not selected" );
313
315MRVIEWER_API bool beginCombo( const char* label, const std::string& text = "Not selected", bool showPreview = true );
316MRVIEWER_API void endCombo( bool showPreview = true );
317
319MRVIEWER_API bool inputText( const char* label, std::string& str, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = nullptr, void* user_data = nullptr );
321MRVIEWER_API bool inputTextIntoArray( const char* label, char* array, std::size_t size, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = nullptr, void* user_data = nullptr );
322
324MRVIEWER_API bool inputTextMultiline( const char* label, std::string& str, const ImVec2& size = ImVec2(), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = nullptr, void* user_data = nullptr );
326MRVIEWER_API bool inputTextIntoArrayMultiline( const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = nullptr, void* user_data = nullptr );
327
329{
330 std::optional<ImVec2> cachedSize; // Reset this when manually modifying the text.
331};
333MRVIEWER_API bool inputTextMultilineFullyScrollable( CachedTextSize& cache, const char* label, std::string& str, const ImVec2& size = ImVec2(), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = nullptr, void* user_data = nullptr );
334MRVIEWER_API bool inputTextIntoArrayMultilineFullyScrollable( CachedTextSize& cache, const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = nullptr, void* user_data = nullptr );
335
337MRVIEWER_API bool inputTextCentered( const char* label, std::string& str, float width = 0.0f, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = nullptr, void* user_data = nullptr );
338
340MRVIEWER_API void inputTextCenteredReadOnly( const char* label, const std::string& str, float width = 0.0f, const std::optional<ImVec4>& textColor = {}, const std::optional<ImVec4>& labelColor = {} );
341
342
343namespace detail
344{
345 // A type-erased slider.
346 MRVIEWER_API bool genericSlider( const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags );
347
348 // Whether `T` is a scalar type that we can use with our widgets.
349 template <typename T>
350 concept Scalar = std::is_arithmetic_v<T> && !std::is_same_v<T, bool>;
351
352 // Whether `T` is a scalar or vector that we can use with our widgets.
353 template <typename T>
355
356 // Whether `Bound` is a valid min/max bound for `Target`.
357 // That is, either the same type, or if `Target` is a vector, `Bound` can also be a scalar of the same type.
358 template <typename Bound, typename Target>
360 std::same_as<Bound, Target> ||
361 ( VectorTraits<Bound>::size == 1 && std::same_as<typename VectorTraits<Bound>::BaseType, typename VectorTraits<Target>::BaseType> );
362
363 // Whether `Speed` is a valid drag speed type for `Target`.
364 // That is, either a single/vector of `float` or the same type as target (or its element if it's a vector).
365 template <typename Speed, typename Target>
367 std::same_as<Speed, typename VectorTraits<Target>::BaseType> || std::same_as<Speed, float> ||
368 std::same_as<Speed, Target> || std::same_as<Speed, typename VectorTraits<Target>::template ChangeBase<float>>;
369
370 // A common code for sliders and other widgets dealing with measurement units.
371 // `E` must be explicitly set to a measurement unit enum. The other template parameters are deduced.
372 // `label` is the widget label, `v` is the target value.
373 // `func` draws the widget for an individual scalar. We call it more than once for vectors.
374 // `func` is `( const char* label, auto& elem, int i ) -> bool`.
375 // It receives `elem` already converted to the display units (so you must convert min/max bounds manually). `i` is the element index for vectors.
376 // When `v` is integral, `func` will be instantiated for both integral and floating-point element type. The latter is required if we're doing conversions.
377 // NOTE: For integral `v`, in `func` you must look at the type of `elem` and convert your min/max bounds (etc) to the same type.
378 // Notice `unitParams` being accepted by an lvalue reference. For convenience, we reset the `sourceUnit` in it before calling the user callback,
379 // since at that point no further conversions are necessary.
380 template <UnitEnum E, VectorOrScalar T, typename F>
381 [[nodiscard]] bool unitWidget( const char* label, T& v, UnitToStringParams<E>& unitParams, F&& func );
382
383}
384
385// Default flags for `slider()` and `drag()` below.
386inline constexpr int defaultSliderFlags = ImGuiSliderFlags_AlwaysClamp;
387
388// Default drag speed for `UI::drag()`.
389template <UnitEnum E, detail::VectorOrScalar T>
390requires ( VectorTraits<T>::size == 1 )
391[[nodiscard]] float getDefaultDragSpeed();
392
393// Default step speed for `UI::input()`.
394template <UnitEnum E, detail::VectorOrScalar T, detail::VectorOrScalar TargetType>
395[[nodiscard]] T getDefaultStep( bool fast );
396
397// Draw a slider.
398// `E` must be specified explicitly, to one of: `NoUnit` `LengthUnit`, `AngleUnit`, ...
399// By default, for angles `v` will be converted to degrees for display (but `vMin`, `vMax` are still in radians, same as `v`),
400// while length and unit-less values will be left as is. This can be customized in `unitParams` or globally (see `MRUnits.h`).
401template <UnitEnum E, detail::VectorOrScalar T, detail::ValidBoundForTargetType<T> U = typename VectorTraits<T>::BaseType>
402bool slider( const char* label, T& v, const U& vMin, const U& vMax, UnitToStringParams<E> unitParams = {}, ImGuiSliderFlags flags = defaultSliderFlags );
403
404// Draw a dragging widget. Also includes [+] and [-] buttons (for integers only by default_, like `ImGui::Input`).
405// `E` must be specified explicitly, to one of: `NoUnit` `LengthUnit`, `AngleUnit`, ...
406// By default, for angles `v` will be converted to degrees for display (but `vSpeed` is still in radians, same as `v`),
407// while length and unit-less values will be left as is. This can be customized in `unitParams` or globally (see `MRUnits.h`).
408// If only the min limit is specified, then the max limit is assumed to be the largest number.
409template <UnitEnum E, detail::VectorOrScalar T, detail::ValidDragSpeedForTargetType<T> SpeedType = float, detail::ValidBoundForTargetType<T> U = typename VectorTraits<T>::BaseType>
410bool drag( const char* label, T& v, SpeedType vSpeed = getDefaultDragSpeed<E, SpeedType>(), const U& vMin = std::numeric_limits<U>::lowest(), const U& vMax = std::numeric_limits<U>::max(), UnitToStringParams<E> unitParams = {}, ImGuiSliderFlags flags = defaultSliderFlags, const U& step = getDefaultStep<E, U, T>( false ), const U& stepFast = getDefaultStep<E, U, T>( true ) );
411
412// Like `drag()`, but clicking it immediately activates text input, so it's not actually draggable.
413template <UnitEnum E, detail::VectorOrScalar T, detail::ValidBoundForTargetType<T> U = typename VectorTraits<T>::BaseType>
414bool input( const char* label, T& v, const U& vMin = std::numeric_limits<U>::lowest(), const U& vMax = std::numeric_limits<U>::max(), UnitToStringParams<E> unitParams = {}, ImGuiSliderFlags flags = defaultSliderFlags );
415
416// Draw a read-only copyable value.
417// `E` must be specified explicitly, to one of: `NoUnit` `LengthUnit`, `AngleUnit`, ...
418// By default, for angles `v` will be converted to degrees for display, while length and unit-less values will be left as is.
419// This can be customized in `unitParams` or globally (see `MRUnits.h`).
420template <UnitEnum E, detail::VectorOrScalar T>
421void readOnlyValue( const char* label, const T& v, std::optional<ImVec4> textColor = {}, UnitToStringParams<E> unitParams = {}, std::optional<ImVec4> labelColor = {} );
422
423
424// A generic wrapper for drawing plus-minus drags/inputs/etc that can be toggled between symmetric and asymmetric mode.
425// Prefer `inputPlusMinus()` and other functions written on top of this one.
426// `func` is a `(const char* subLabel, T& value, const UnitToStringParams<E>& subUnitParams) -> bool`, draw your widget there with the automatic width,
427// the specified label and value, and return its return value. `value` will receive either `plus` or `minus`.
428template <UnitEnum E, detail::Scalar T, typename F>
429bool plusMinusGeneric( const char* label, T& plus, T& minus, UnitToStringParams<E> unitToStringParams, F&& func );
430
431// A `drag()` for two numbers that can be toggled between symmetric and asymmetric mode.
432// Notice the `wrapFunc` parameter. If specified, it is a `(const char* subLabel, T& value, auto&& f) -> bool` lambda that must do `return f();`.
433// That is called for each of the two plus/minus parts of the widget, and lets you e.g. set a custom style for those.
434// Here we intentionally don't allow passing the step values, that wouldn't render too well.
435template <UnitEnum E, detail::Scalar T, detail::ValidDragSpeedForTargetType<T> SpeedType = float, typename F = std::nullptr_t>
436bool dragPlusMinus( const char* label, T& plus, T& minus, SpeedType speed = getDefaultDragSpeed<E, SpeedType>(), T plusMin = T{}, T plusMax = std::numeric_limits<T>::max(), UnitToStringParams<E> unitParams = {}, ImGuiSliderFlags flags = defaultSliderFlags, F&& wrapFunc = nullptr );
437
438// An `input()` for two numbers that can be toggled between symmetric and asymmetric mode.
439// Notice the `wrapFunc` parameter. If specified, it is a `(const char* subLabel, T& value, auto&& f) -> bool` lambda that must do `return f();`.
440// That is called for each of the two plus/minus parts of the widget, and lets you e.g. set a custom style for those.
441template <UnitEnum E, detail::Scalar T, typename F = std::nullptr_t>
442bool inputPlusMinus( const char* label, T& plus, T& minus, T plusMin = T{}, T plusMax = std::numeric_limits<T>::max(), UnitToStringParams<E> unitParams = {}, ImGuiSliderFlags flags = defaultSliderFlags, F&& wrapFunc = nullptr );
443
444
446MRVIEWER_API const std::pair<const char*, ImU32>& notificationChar( NotificationType type );
447
449MRVIEWER_API void mouseControlHint( ImGuiMouseButton btn, const std::string& hint );
450
452MRVIEWER_API void transparentText( const char* fmt, ... );
454MRVIEWER_API void transparentTextWrapped( const char* fmt, ... );
456MRVIEWER_API void notificationFrame( NotificationType type, const std::string& str );
457
459MRVIEWER_API void setTooltipIfHovered( const std::string& text );
460
463{
465 const ImGuiImage* icon{ nullptr };
466
468 Vector2f iconSize;
469
471 std::string label;
472
474 std::string suffix;
475
477 std::optional<Color> suffixFrameColor;
478
481 bool forceImGuiSpacing = false;
482
484 float extraScale = 1;
485};
486
488MRVIEWER_API void separator( const SeparatorParams& params );
489
494MRVIEWER_API void separator( const std::string& text = "", int issueCount = -1 );
495MRVIEWER_API void separator(
496 const std::string& text,
497 const ImVec4& color,
498 const std::string& issueCount );
499// separator line with icon and text
500// iconSize icon size without scaling
501MRVIEWER_API void separator( const ImGuiImage& icon, const std::string& text, const Vector2f& iconSize = { 24.f, 24.f } );
502MRVIEWER_API void separator( const std::string& iconName, const std::string& text, const Vector2f& iconSize = { 24.f, 24.f } );
503
508MRVIEWER_API void progressBar( float fraction, const Vector2f& size = Vector2f( -1, 0 ) );
509
510// create and append items into a TabBar: see corresponding ImGui:: functions
511MRVIEWER_API bool beginTabBar( const char* str_id, ImGuiTabBarFlags flags = 0 );
512MRVIEWER_API void endTabBar();
513MRVIEWER_API bool beginTabItem( const char* label, bool* p_open = NULL, ImGuiTabItemFlags flags = 0 );
514MRVIEWER_API void endTabItem();
515
525MRVIEWER_API void alignTextToFramePadding( float padding );
529MRVIEWER_API void alignTextToControl( float controlHeight );
531MRVIEWER_API void alignTextToRadioButton();
533MRVIEWER_API void alignTextToCheckBox();
535MRVIEWER_API void alignTextToButton();
536
540MRVIEWER_API void highlightWindowArea( const ImVec2& min = {-1.0f, -1.0f}, const ImVec2& max = { -1.0f, -1.0f } );
541
544{
546 std::string configName;
548 std::string imGuiIdKey;
550 std::filesystem::path configDirectory;
552 std::string* inputName{ nullptr };
554 bool inputNameDialog = true;
556 bool triggerSave = false;
558 bool warnExisting = true;
560 std::function<bool( const std::string& name )> onSave;
561
563 MRVIEWER_API std::string popupName() const;
564};
565
567MRVIEWER_API void saveCustomConfigModal(const CustomConfigModalSettings& settings );
568
569// While this exists, it temporarily disables in the given list the flags with 0 bits in the given mask
571{
572 ImDrawList& list;
573 ImDrawFlags oldFlags{};
574
575public:
576 Disabler( ImDrawList& list, ImDrawFlags mask )
577 : list( list ), oldFlags( list.Flags )
578 {
579 list.Flags &= mask;
580 }
581
582 Disabler( const Disabler& ) = delete;
583 Disabler& operator=( const Disabler& ) = delete;
584
586 {
587 list.Flags = oldFlags;
588 }
589};
590
591// While this exists, it temporarily disables antialiasing for the lines drawn to this list.
593{
594public:
595 LineAntialiasingDisabler( ImDrawList& list ) : Disabler( list, ~ImDrawListFlags_AntiAliasedLines )
596 {
597 }
598};
599
600} // namespace UI
601
602}
603
604#include "MRUIStyle.ipp"
Definition MRImGuiImage.h:15
Definition MRUIStyle.h:571
Disabler(const Disabler &)=delete
Disabler(ImDrawList &list, ImDrawFlags mask)
Definition MRUIStyle.h:576
Disabler & operator=(const Disabler &)=delete
~Disabler()
Definition MRUIStyle.h:585
Definition MRUIStyle.h:593
LineAntialiasingDisabler(ImDrawList &list)
Definition MRUIStyle.h:595
Definition MRUIStyle.h:350
Definition MRUIStyle.h:359
Definition MRUIStyle.h:354
auto width(const Box< V > &box)
returns size along x axis
Definition MRMesh/MRBox.h:354
constexpr const V & get(const Box< V > &box) noexcept
get<0> returns min, get<1> returns max
Definition MRMesh/MRBox.h:400
MRVIEWER_API bool readBool(std::string_view key, bool defaultValue=false)
MRVIEWER_API void writeBool(std::string_view key, bool value)
MRVIEWER_API void setScale(float newScale)
MRVIEWER_API bool genericSlider(const char *label, ImGuiDataType data_type, void *p_data, const void *p_min, const void *p_max, const char *format, ImGuiSliderFlags flags)
bool unitWidget(const char *label, T &v, UnitToStringParams< E > &unitParams, F &&func)
TextureType
Definition MRUIStyle.h:45
MRVIEWER_API bool checkboxOrModifier(const char *label, CheckboxOrModifierState &value, int modifiers, int respectedModifiers=-1, std::optional< bool > valueOverride={})
MRVIEWER_API std::unique_ptr< ImGuiImage > & getTexture(TextureType type)
MRVIEWER_API bool inputTextMultilineFullyScrollable(CachedTextSize &cache, const char *label, std::string &str, const ImVec2 &size=ImVec2(), ImGuiInputTextFlags flags=0, ImGuiInputTextCallback callback=nullptr, void *user_data=nullptr)
This version adds a horizontal scrollbar. Also it never draws the label, and uses full window width b...
MRVIEWER_API bool radioButtonOrModifier(const char *label, RadioButtonOrModifierState &value, int valButton, int modifiers, int respectedModifiers=-1, std::optional< int > valueOverride={})
MRVIEWER_API void endTabBar()
MRVIEWER_API bool isItemActive(const char *name)
bool inputPlusMinus(const char *label, T &plus, T &minus, T plusMin=T{}, T plusMax=std::numeric_limits< T >::max(), UnitToStringParams< E > unitParams={}, ImGuiSliderFlags flags=defaultSliderFlags, F &&wrapFunc=nullptr)
MRVIEWER_API void transparentTextWrapped(const char *fmt,...)
similar to ImGui::TextWrapped but use current text color with alpha channel = 0.5
MRVIEWER_API bool inputTextIntoArrayMultiline(const char *label, char *buf, size_t buf_size, const ImVec2 &size=ImVec2(), ImGuiInputTextFlags flags=0, ImGuiInputTextCallback callback=nullptr, void *user_data=nullptr)
This overload is for arrays, as opposed to std::strings.
MRVIEWER_API void endTabItem()
bool buttonIcon(const std::string &name, const Vector2f &iconSize, const std::string &text, const ImVec2 &buttonSize)
Definition MRUIStyle.h:173
MRVIEWER_API void alignTextToButton()
Specialization of alignTextToFramePadding for UI::button with default height.
T getDefaultStep(bool fast)
MRVIEWER_API void alignTextToCheckBox()
Specialization of alignTextToFramePadding for UI::checkbox.
MRVIEWER_API void notificationFrame(NotificationType type, const std::string &str)
similar to ImGui::TextWrapped but also have styled background and notification type indicator
bool buttonIconFlatBG(const std::string &name, const Vector2f &iconSize, const std::string &text, const ImVec2 &buttonSize, bool textUnderIcon=true, ImGuiKey key=ImGuiKey_None)
Definition MRUIStyle.h:178
MRVIEWER_API bool checkbox(const char *label, bool *value)
draw gradient checkbox
bool dragPlusMinus(const char *label, T &plus, T &minus, SpeedType speed=getDefaultDragSpeed< E, SpeedType >(), T plusMin=T{}, T plusMax=std::numeric_limits< T >::max(), UnitToStringParams< E > unitParams={}, ImGuiSliderFlags flags=defaultSliderFlags, F &&wrapFunc=nullptr)
MRVIEWER_API void highlightWindowArea(const ImVec2 &min={-1.0f, -1.0f}, const ImVec2 &max={ -1.0f, -1.0f })
MRVIEWER_API float scale()
MRVIEWER_API void inputTextCenteredReadOnly(const char *label, const std::string &str, float width=0.0f, const std::optional< ImVec4 > &textColor={}, const std::optional< ImVec4 > &labelColor={})
draw read-only text box with text aligned by center
MRVIEWER_API bool inputTextIntoArrayMultilineFullyScrollable(CachedTextSize &cache, const char *label, char *buf, size_t buf_size, const ImVec2 &size=ImVec2(), ImGuiInputTextFlags flags=0, ImGuiInputTextCallback callback=nullptr, void *user_data=nullptr)
MRVIEWER_API void separator(const SeparatorParams &params)
separator line with customizations
MRVIEWER_API void alignTextToControl(float controlHeight)
MRVIEWER_API bool checkKey(ImGuiKey passedKey)
returns true if button is pressed in this frame, preserve its further processing in viewer keyboard e...
bool drag(const char *label, T &v, SpeedType vSpeed=getDefaultDragSpeed< E, SpeedType >(), const U &vMin=std::numeric_limits< U >::lowest(), const U &vMax=std::numeric_limits< U >::max(), UnitToStringParams< E > unitParams={}, ImGuiSliderFlags flags=defaultSliderFlags, const U &step=getDefaultStep< E, U, T >(false), const U &stepFast=getDefaultStep< E, U, T >(true))
MRVIEWER_API bool beginCombo(const char *label, const std::string &text="Not selected", bool showPreview=true)
draw custom content combo box
float getDefaultDragSpeed()
constexpr int defaultSliderFlags
Definition MRUIStyle.h:386
bool plusMinusGeneric(const char *label, T &plus, T &minus, UnitToStringParams< E > unitToStringParams, F &&func)
bool slider(const char *label, T &v, const U &vMin, const U &vMax, UnitToStringParams< E > unitParams={}, ImGuiSliderFlags flags=defaultSliderFlags)
MRVIEWER_API bool combo(const char *label, int *v, const std::vector< std::string > &options, bool showPreview=true, const std::vector< std::string > &tooltips={}, const std::string &defaultText="Not selected")
draw combo box
MRVIEWER_API const std::pair< const char *, ImU32 > & notificationChar(NotificationType type)
returns icons font character for given notification type, and its color
MRVIEWER_API bool radioButton(const char *label, int *value, int valButton)
draw gradient radio button
MRVIEWER_API void mouseControlHint(ImGuiMouseButton btn, const std::string &hint)
draws hint with corresponding mouse btn icon
MRVIEWER_API bool checkboxValid(const char *label, bool *value, bool valid)
If valid is false checkbox is disabled. Same as checkboxOrFixedValue( ..., valid ?...
MRVIEWER_API void alignTextToRadioButton()
Specialization of alignTextToFramePadding for UI::radioButton.
MRVIEWER_API void endCombo(bool showPreview=true)
MRVIEWER_API bool buttonEx(const char *label, bool active, const Vector2f &size=Vector2f(0, 0), ImGuiButtonFlags flags=ImGuiButtonFlags_None, const ButtonCustomizationParams &customParams={})
draw gradient button, which can be disabled (active = false)
MRVIEWER_API bool inputTextIntoArray(const char *label, char *array, std::size_t size, ImGuiInputTextFlags flags=0, ImGuiInputTextCallback callback=nullptr, void *user_data=nullptr)
This overload is for arrays, as opposed to std::strings.
MRVIEWER_API void transparentText(const char *fmt,...)
similar to ImGui::Text but use current text color with alpha channel = 0.5
MRVIEWER_API void init()
init internal parameters
MRVIEWER_API bool checkboxOrFixedValue(const char *label, bool *value, std::optional< bool > valueOverride)
If valueOverride is specified, then the checkbox is disabled and that value is displayed instead of v...
void readOnlyValue(const char *label, const T &v, std::optional< ImVec4 > textColor={}, UnitToStringParams< E > unitParams={}, std::optional< ImVec4 > labelColor={})
MRVIEWER_API bool colorEdit4(const char *label, Vector4f &color, ImGuiColorEditFlags flags=ImGuiColorEditFlags_None)
draw gradient color edit 4
MRVIEWER_API bool buttonUniqueIcon(const std::string &iconName, const Vector2f &iconSize, const std::string &text, const ImVec2 &buttonSize, int *value, int ownValue, bool textUnderIcon=true, ImGuiKey key=ImGuiKey_None)
MRVIEWER_API bool inputTextMultiline(const char *label, std::string &str, const ImVec2 &size=ImVec2(), ImGuiInputTextFlags flags=0, ImGuiInputTextCallback callback=nullptr, void *user_data=nullptr)
Draws multiline text input, should be used instead of ImGui::InputTextMultiline().
MRVIEWER_API bool checkboxMixed(const char *label, bool *value, bool mixed)
draw gradient checkbox with mixed state
MRVIEWER_API bool buttonIconEx(const std::string &name, const Vector2f &iconSize, const std::string &text, const ImVec2 &buttonSize, const ButtonIconCustomizationParams &params={})
MRVIEWER_API bool beginTabBar(const char *str_id, ImGuiTabBarFlags flags=0)
MRVIEWER_API void drawPoltHorizontalAxis(const PlotAxis &plotAxis)
bool checkboxFlags(const char *label, T &target, T flags)
Draw a checkbox toggling one or more bits in the mask.
Definition MRUIStyle.h:236
bool input(const char *label, T &v, const U &vMin=std::numeric_limits< U >::lowest(), const U &vMax=std::numeric_limits< U >::max(), UnitToStringParams< E > unitParams={}, ImGuiSliderFlags flags=defaultSliderFlags)
MRVIEWER_API void drawPoltVerticalAxis(const PlotAxis &plotAxis)
MRVIEWER_API void saveCustomConfigModal(const CustomConfigModalSettings &settings)
Draw modal window to save user configs (for example Palettes)
MRVIEWER_API bool buttonUnique(const char *label, int *value, int ownValue, const Vector2f &size=Vector2f(0, 0), ImGuiKey key=ImGuiKey_None)
draw button with same logic as radioButton
MRVIEWER_API void setTooltipIfHovered(const std::string &text)
draw tooltip only if current item is hovered
MRVIEWER_API ImGuiKey getImGuiModPrimaryCtrl()
returns imgui modifier Id based on current environment
MRVIEWER_API bool button(const char *label, bool active, const Vector2f &size=Vector2f(0, 0), ImGuiKey key=ImGuiKey_None)
MRVIEWER_API const char * getImGuiPrimaryCtrlName()
returns "Ctrl" by default or "Command" if ImGui has changed it internally for macos
MRVIEWER_API bool toggle(const char *label, bool *value)
draws checkbox-like toggle (enabled/disabled states)(O=)/(=O)
MRVIEWER_API bool radioButtonOrFixedValue(const char *label, int *value, int valButton, std::optional< int > valueOverride)
If valueOverride is specified, then the radio button is disabled and that value is displayed instead ...
MRVIEWER_API bool inputText(const char *label, std::string &str, ImGuiInputTextFlags flags=0, ImGuiInputTextCallback callback=nullptr, void *user_data=nullptr)
Draws text input, should be used instead of ImGui::InputText().
MRVIEWER_API void progressBar(float fraction, const Vector2f &size=Vector2f(-1, 0))
MRVIEWER_API void alignTextToFramePadding(float padding)
MRVIEWER_API bool beginTabItem(const char *label, bool *p_open=NULL, ImGuiTabItemFlags flags=0)
MRVIEWER_API bool inputTextCentered(const char *label, std::string &str, float width=0.0f, ImGuiInputTextFlags flags=0, ImGuiInputTextCallback callback=nullptr, void *user_data=nullptr)
draw input text box with text aligned by center
MRVIEWER_API bool buttonCommonSize(const char *label, const Vector2f &size=Vector2f(0, 0), ImGuiKey key=ImGuiKey_None)
Definition MRCameraOrientationPlugin.h:8
ImVec2 size(const ViewportRectangle &rect)
Definition MRViewport.h:29
NotificationType
Definition MRNotificationType.h:7
std::variant< > VarUnitToStringParams
Definition MRUnits.h:122
Definition MRMesh/MRColor.h:9
parameters to customize buttonEx
Definition MRUIStyle.h:63
bool forceImguiTextColor
force use if ImGuiCol_Text for text
Definition MRUIStyle.h:79
ImGuiImage * customTexture
Definition MRUIStyle.h:73
bool border
show border or not
Definition MRUIStyle.h:81
ImGuiButtonFlags flags
imgui flags for this button
Definition MRUIStyle.h:68
bool enabled
If false, the button is grayed out and can't be clicked.
Definition MRUIStyle.h:65
std::string testEngineName
if not empty, force use this string as name in TestEngine
Definition MRUIStyle.h:90
bool underlineFirstLetter
draw line under first letter of label
Definition MRUIStyle.h:84
bool forceImGuiBackground
force use imgui background if !customTexture
Definition MRUIStyle.h:76
bool enableTestEngine
Allow interacting with this button from UI::TestEngine.
Definition MRUIStyle.h:87
Definition MRUIStyle.h:94
bool textUnderImage
Definition MRUIStyle.h:99
ButtonCustomizationParams baseParams
Definition MRUIStyle.h:96
Definition MRUIStyle.h:329
std::optional< ImVec2 > cachedSize
Definition MRUIStyle.h:330
Definition MRUIStyle.h:252
bool modifierHeld
Definition MRUIStyle.h:256
CheckboxOrModifierState()
Definition MRUIStyle.h:258
CheckboxOrModifierState(bool baseValue)
Definition MRUIStyle.h:260
bool baseValue
Definition MRUIStyle.h:254
Settings required for UI::saveCustomConfigModal
Definition MRUIStyle.h:544
std::string imGuiIdKey
Optional string added at the end of popup name to have unique names.
Definition MRUIStyle.h:548
MRVIEWER_API std::string popupName() const
returns accumulated name of the popup
std::filesystem::path configDirectory
Directory where to save config.
Definition MRUIStyle.h:550
std::string configName
Name of desired config type.
Definition MRUIStyle.h:546
bool triggerSave
if true - opens modal in this frame, or saves if (!inputNameDialog && inputName)
Definition MRUIStyle.h:556
bool inputNameDialog
If false, inputName is used (if inputName is nullptr this option is not used)
Definition MRUIStyle.h:554
bool warnExisting
If true - warns user before overriding existing file, otherwise override without warning.
Definition MRUIStyle.h:558
std::function< bool(const std::string &name)> onSave
Callback that is called when save is requested->returns true if file saved successfully (to close mod...
Definition MRUIStyle.h:560
std::string * inputName
String used by input.
Definition MRUIStyle.h:552
Definition MRUIStyle.h:103
float size
Definition MRUIStyle.h:108
VarUnitToStringParams labelFormatParams
Definition MRUIStyle.h:125
float lenDash
Definition MRUIStyle.h:119
size_t textDashIndicesStep
Definition MRUIStyle.h:116
float minValue
Definition MRUIStyle.h:112
float lenDashWithText
Definition MRUIStyle.h:121
ImVec2 startAxisPoint
Definition MRUIStyle.h:105
float optimalLenth
Definition MRUIStyle.h:110
float maxValue
Definition MRUIStyle.h:114
float textPadding
Definition MRUIStyle.h:123
Definition MRUIStyle.h:285
int value
Definition MRUIStyle.h:287
int effectiveValue
Definition MRUIStyle.h:289
Parameters for drawing custom separator.
Definition MRUIStyle.h:463
std::string suffix
framed text after label (might be used for some indications)
Definition MRUIStyle.h:474
std::optional< Color > suffixFrameColor
color of background frame behind suffix (if not present default ImGuiCol_FrameBg is used)
Definition MRUIStyle.h:477
const ImGuiImage * icon
optional icon in the left part of separator
Definition MRUIStyle.h:465
Vector2f iconSize
size of icon
Definition MRUIStyle.h:468
bool forceImGuiSpacing
Definition MRUIStyle.h:481
float extraScale
The spacing is multiplied by this.
Definition MRUIStyle.h:484
std::string label
label at the left part of separator (drawn after icon if present)
Definition MRUIStyle.h:471
Definition MRUnits.h:68
Definition MRMesh/MRVectorTraits.h:15
static constexpr int size
Definition MRMesh/MRVectorTraits.h:19
T BaseType
Definition MRMesh/MRVectorTraits.h:18