MeshLib C++ Docs
Loading...
Searching...
No Matches
MRRibbonMenu.h
Go to the documentation of this file.
1#pragma once
2#include "ImGuiMenu.h"
3#include "MRRibbonMenuItem.h"
7#include "MRAsyncTimer.h"
8#include "MRRibbonSchema.h"
10#include "MRMesh/MRSignal.h"
12#include <type_traits>
13#include <array>
14
15namespace MR
16{
17
18class Object;
19
20// Class to control and render ribbon-style menu
21// stores menu items,
22// menu structure is provided by `menuItemsStructure.json` file (parsed on init)
23class MRVIEWER_CLASS RibbonMenu : public ImGuiMenu
24{
25 struct CustomContextMenuCheckbox
26 {
27 using Setter = std::function<void( std::shared_ptr<Object> object, ViewportId id, bool checked )>;
28 using Getter = std::function<bool( std::shared_ptr<Object> object, ViewportId id )>;
29 Setter setter;
30 Getter getter;
31 // display a checkBox when only these types of objects are selected
32 // by default, it is always hidden
33 SelectedTypesMask selectedMask = SelectedTypesMask( -1 );
34 };
35
36public:
37 MRVIEWER_API RibbonMenu();
38 MRVIEWER_API ~RibbonMenu();
39
40 // returns RibonMenu from ViewerInstance()
41 MRVIEWER_API static std::shared_ptr<RibbonMenu> instance();
42
43 // adds a custom checkBox to the context menu
44 // it is applied to the selected objects
45 MRVIEWER_API void setCustomContextCheckbox(
46 const std::string& name,
47 CustomContextMenuCheckbox customContextMenuCheckbox );
48
49 MRVIEWER_API virtual void init( MR::Viewer* _viewer ) override;
50
51 MRVIEWER_API virtual void shutdown() override;
52
54 MRVIEWER_API void openToolbarCustomize();
55
56 MRVIEWER_API virtual void load_font( int font_size = 13 ) override;
57
58 MRVIEWER_API virtual std::filesystem::path getMenuFontPath() const override;
59
60 // set top panel pinned and unpinned
61 MRVIEWER_API virtual void pinTopPanel( bool on );
62 MRVIEWER_API bool isTopPannelPinned() const;
63 // this functions allow you to get top panel height (before scaling)
64 int getTopPanelOpenedHeight() const { return topPanelOpenedHeight_; }
65 int getTopPanelHiddenHeight() const { return topPanelHiddenHeight_; }
66 int getTopPanelCurrentHeight() const { return currentTopPanelHeight_; }
67 // set maximum wait time (in seconds) before top panel is closed after mouse leaves it (only when not pinned)
68 // minimum value is 0 seconds, panel will close immediately after mouse leaves it
69 void setTopPanelMaxOpenedTimer( float sec ) { openedMaxSecs_ = std::max( 0.0f, sec ); }
70
72 MRVIEWER_API virtual void setQuickAccessListVersion( int version );
74 MRVIEWER_API virtual void readQuickAccessList( const Json::Value& root );
75
77 MRVIEWER_API void resetQuickAccessList();
78
80 Vector2i getSceneSize() { return Vector2i( int( sceneSize_.x ), int( sceneSize_.y ) ); };
81
83 MRVIEWER_API void setSceneSize( const Vector2i& size );
84
86 bool hasActiveBlockingItem() const { return bool( activeBlockingItem_.item ); }
88 bool hasAnyActiveItem() const { return bool( activeBlockingItem_.item ) || !activeNonBlockingItems_.empty(); }
89
91 MRVIEWER_API void updateItemStatus( const std::string& itemName );
92
94 int getActiveTabIndex() const { return activeTabIndex_; }
95
96
98 RibbonFontManager& getFontManager() { return fontManager_; };
99
101 RibbonButtonDrawer& getRibbonButtonDrawer() { return buttonDrawer_; }
102
104 Toolbar& getToolbar() { return *toolbar_; }
105
107 RibbonNotifier& getRibbonNotifier() { return notifier_; };
108
109 void setActiveListPos( const ImVec2& pos ) { activeListPos_ = pos; }
110
112 void showActiveList() { activeListPressed_ = true; };
113
116 MRVIEWER_API virtual void pushNotification( const RibbonNotification& notification );
117
119 MRVIEWER_API static void cloneTree( const std::vector<std::shared_ptr<Object>>& selectedObjects );
121 MRVIEWER_API static void cloneSelectedPart( const std::shared_ptr<Object>& object );
122
123 using TabChangedSignal = boost::signals2::signal<void( int prevTabId, int newTabId )>;
126
128 bool getAutoCloseBlockingPlugins() const { return autoCloseBlockingPlugins_; }
130 void setAutoCloseBlockingPlugins( bool value ) { autoCloseBlockingPlugins_ = value; }
131
133 const RibbonMenuUIConfig& getMenuUIConfig() const { return menuUIConfig_; }
134 MRVIEWER_API virtual void setMenuUIConfig( const RibbonMenuUIConfig& newConfig );
135
136 // ======== selected objects options drawing
137 bool drawGroupUngroupButton( const std::vector<std::shared_ptr<Object>>& selected );
138 bool drawSelectSubtreeButton( const std::vector<std::shared_ptr<Object>>& selected );
139 bool drawCloneButton( const std::vector<std::shared_ptr<Object>>& selected );
140 bool drawCustomCheckBox( const std::vector<std::shared_ptr<Object>>& selected, SelectedTypesMask selectedMask );
141 bool drawCloneSelectionButton( const std::vector<std::shared_ptr<Object>>& selected );
142 bool drawMergeSubtreeButton( const std::vector<std::shared_ptr<Object>>& selected );
143protected:
144 // draw single item
145 MRVIEWER_API virtual void drawBigButtonItem_( const MenuItemInfo& item );
146 // draw set of small text buttons
147 MRVIEWER_API virtual void drawSmallButtonsSet_( const std::vector<std::string>& group, int setFrontIndex, int setLength,
148 bool withText );
149
150 // Configuration of ribbon group
152 {
153 int numBig{ 0 };
154 int numSmallText{ 0 };
155 int numSmall{ 0 };
156 };
157 using DrawTabConfig = std::vector<DrawGroupConfig>;
158 // draw group of items
159 MRVIEWER_API virtual DrawTabConfig setupItemsGroupConfig_( const std::vector<std::string>& groupsInTab, const std::string& tabName, bool centerItems );
160 MRVIEWER_API virtual void setupItemsGroup_( const std::vector<std::string>& groupsInTab, const std::string& tabName, bool centerItems );
161 MRVIEWER_API virtual void drawItemsGroup_( const std::string& tabName, const std::string& groupName,
162 DrawGroupConfig config );
163 // ribbon menu item pressed
164 // requiremetnsHint - text that is showed if tool is unavailable (if empty then tool is available)
165 // returns true if item was actually activated or deactivated with press action
166 MRVIEWER_API virtual bool itemPressed_( const std::shared_ptr<RibbonMenuItem>& item, const std::string& requiremetnsHint = {} );
167
169 MRVIEWER_API virtual std::string getRequirements_( const std::shared_ptr<RibbonMenuItem>& item ) const;
170
171 MRVIEWER_API virtual void drawActiveBlockingDialog_();
172 MRVIEWER_API virtual void drawActiveNonBlockingDialogs_();
173
174 MRVIEWER_API virtual void postResize_( int width, int height ) override;
175 MRVIEWER_API virtual void postRescale_( float x, float y ) override;
176
178 {
179 std::shared_ptr<RibbonMenuItem> item;
180 // this flag is needed to correctly fix position of UI dialog (temporary, while plugin dialogs are floating in viewport)
181 bool dialogPositionFixed{ false };
182 };
184 std::vector<DialogItemPtr> activeNonBlockingItems_;
185 MRVIEWER_API virtual void drawItemDialog_( DialogItemPtr& itemPtr );
186
187 // Draw ribbon top panel
188 MRVIEWER_API virtual void drawTopPanel_( bool drawTabs = true, bool centerItems = false );
189 // Draw scene list window with content
190 MRVIEWER_API virtual void drawRibbonSceneList_();
191 // Draw vertical line at the right border of scene to enable resize of scene list
192 // returns size of scene window
193 MRVIEWER_API virtual Vector2f drawRibbonSceneResizeLine_();
194 // Draw viewport id and projection type for all viewporrts
195 MRVIEWER_API virtual void drawRibbonViewportsLabels_();
196
197 MRVIEWER_API virtual void drawRibbonSceneInformation_( const std::vector<std::shared_ptr<Object>>& selected );
198
199 MRVIEWER_API virtual bool drawCollapsingHeaderTransform_() override;
200 MRVIEWER_API virtual bool drawTransformContextMenu_( const std::shared_ptr<Object>& selected ) override;
201
202 MRVIEWER_API virtual void addRibbonItemShortcut_( const std::string& itemName, const ShortcutKey& key, ShortcutCategory category );
203
204 MRVIEWER_API virtual void setupShortcuts_() override;
205
206 MRVIEWER_API virtual void drawShortcutsWindow_() override;
207 // reads files with panel description
208 MRVIEWER_API virtual void readMenuItemsStructure_();
209
210 std::vector<std::shared_ptr<const Object>> prevFrameSelectedObjectsCache_;
211
212 MRVIEWER_API virtual bool drawCollapsingHeader_( const char* label, ImGuiTreeNodeFlags flags = 0 ) override;
213
214 MRVIEWER_API virtual void highlightBlocking_();
215
216 // draw scene list buttons
217 MRVIEWER_API virtual void drawSceneListButtons_();
218
219 // updates viewport sizes with respect to ribbon top and left panels
220 MRVIEWER_API virtual void fixViewportsSize_( int w, int h );
221
222 // need to be called if you override windows pipeline and use ActiveListPlugin
223 MRVIEWER_API void drawActiveList_();
224
225 // call this to draw RibbonNotifier with respect of scene size and ribbon top panel
226 MRVIEWER_API virtual void drawNotifications_();
227
228 // this function changes internal sizes of topPanel when it is enabled or disabled
229 MRVIEWER_API virtual void updateTopPanelSize_( bool drawTabs );
230
231 // draw quick access bar at header level
232 MRVIEWER_API virtual void drawHeaderQuickAccess_( float menuScaling );
233
234 // this functions draws header helpers:
235 // 1. Active tools list
236 // 2. Search bar
237 // 3. Help button
238 // 4. Ribbon pin/unpin button
239 // returns width available for drawing tabs
240 MRVIEWER_API virtual float drawHeaderHelpers_( float requiredTabSize, float menuScaling );
241
242 // helper list of active tools
243 MRVIEWER_API virtual void drawActiveListButton_( float btnSize );
244 // header helper search bar at panel
245 MRVIEWER_API virtual void drawSearchButton_();
246 // header helper button to pin/unpin ribbon
247 MRVIEWER_API virtual void drawCollapseButton_();
248 // header helper button link to help page
249 MRVIEWER_API virtual void drawHelpButton_( const std::string& url );
250
252
253private:
254 void changeTab_( int newTab );
255
256 void sortObjectsRecursive_( std::shared_ptr<Object> object );
257
258 // part of top panel
259 void drawHeaderPannel_();
260
261 ImVec2 activeListPos_{ 0,0 };
262 bool activeListPressed_{ false };
263
264 void beginTopPanel_();
265 void endTopPanel_();
266 void drawTopPanelOpened_( bool drawTabs, bool centerItems );
267
268 std::string transformClipboardText_;
269
270 int currentTopPanelHeight_ = 113;
271 int topPanelOpenedHeight_ = 113;
272 int topPanelHiddenHeight_ = 33;
273
274 ImVec2 sceneSize_{ 310, 0 };
275 float informationHeight_{ 0.f };
276 float transformHeight_{ 0.f };
277
278 RibbonMenuUIConfig menuUIConfig_;
279
280 // how long blocking window will blink in seconds
281 float blockingHighlightTimer_{ 0.0f };
282
283 // current scroll position of tabs panel
284 float tabPanelScroll_{ 0.0f };
285
286 bool autoCloseBlockingPlugins_{ true };
287
288 enum class CollapseState
289 {
290 Closed,
291 Opened,
292 Pinned
293 } collapseState_{ CollapseState::Pinned };
294 // seconds to stay opened if not pinned
295 float openedMaxSecs_{ 2.0f };
296 float openedTimer_{ openedMaxSecs_ };
297
298 int activeTabIndex_{ 0 };
299 RibbonFontManager fontManager_;
300 RibbonButtonDrawer buttonDrawer_;
301
302 std::unordered_map<std::string, CustomContextMenuCheckbox> customCheckBox_;
303
304 std::unique_ptr<Toolbar> toolbar_;
305 RibbonNotifier notifier_;
306#ifndef __EMSCRIPTEN__
307 AsyncRequest asyncRequest_;
308#endif // !__EMSCRIPTEN__
309};
310
311// Checks if RibbonMenu is available, if it is - forwards notification to RibbonNotifier. Otherwise - calls showModal() function
312MRVIEWER_API void pushNotification( const RibbonNotification& notification );
313
314}
Definition ImGuiMenu.h:55
class for drawing ribbon menu buttons
Definition MRRibbonButtonDrawer.h:50
Definition MRRibbonFontManager.h:11
Definition MRRibbonMenuSearch.h:17
Definition MRRibbonMenu.h:24
MRVIEWER_API ~RibbonMenu()
bool hasAnyActiveItem() const
returns true if any plugin is now active
Definition MRRibbonMenu.h:88
virtual MRVIEWER_API void drawSceneListButtons_()
int getTopPanelOpenedHeight() const
Definition MRRibbonMenu.h:64
void setTopPanelMaxOpenedTimer(float sec)
Definition MRRibbonMenu.h:69
void showActiveList()
set active plugins list showed
Definition MRRibbonMenu.h:112
virtual MRVIEWER_API void drawSearchButton_()
void setActiveListPos(const ImVec2 &pos)
Definition MRRibbonMenu.h:109
bool drawCloneSelectionButton(const std::vector< std::shared_ptr< Object > > &selected)
bool drawGroupUngroupButton(const std::vector< std::shared_ptr< Object > > &selected)
virtual MRVIEWER_API void setupShortcuts_() override
virtual MRVIEWER_API void setMenuUIConfig(const RibbonMenuUIConfig &newConfig)
virtual MRVIEWER_API void addRibbonItemShortcut_(const std::string &itemName, const ShortcutKey &key, ShortcutCategory category)
virtual MRVIEWER_API void drawActiveNonBlockingDialogs_()
DialogItemPtr activeBlockingItem_
Definition MRRibbonMenu.h:183
virtual MRVIEWER_API void shutdown() override
virtual MRVIEWER_API void drawShortcutsWindow_() override
virtual MRVIEWER_API void drawCollapseButton_()
virtual MRVIEWER_API void drawSmallButtonsSet_(const std::vector< std::string > &group, int setFrontIndex, int setLength, bool withText)
virtual MRVIEWER_API DrawTabConfig setupItemsGroupConfig_(const std::vector< std::string > &groupsInTab, const std::string &tabName, bool centerItems)
virtual MRVIEWER_API std::string getRequirements_(const std::shared_ptr< RibbonMenuItem > &item) const
returns requirements line for given tool, empty line means that tool is available
bool hasActiveBlockingItem() const
returns true if any blocking plugin is now active
Definition MRRibbonMenu.h:86
MRVIEWER_API bool isTopPannelPinned() const
static MRVIEWER_API std::shared_ptr< RibbonMenu > instance()
virtual MRVIEWER_API bool drawCollapsingHeader_(const char *label, ImGuiTreeNodeFlags flags=0) override
virtual MRVIEWER_API void highlightBlocking_()
bool getAutoCloseBlockingPlugins() const
returns flag defining if closing plugin on opening another one is enabled
Definition MRRibbonMenu.h:128
int getTopPanelHiddenHeight() const
Definition MRRibbonMenu.h:65
virtual MRVIEWER_API void drawActiveBlockingDialog_()
virtual MRVIEWER_API void readMenuItemsStructure_()
Vector2i getSceneSize()
get Scene List window size
Definition MRRibbonMenu.h:80
virtual MRVIEWER_API void drawNotifications_()
virtual MRVIEWER_API void drawHelpButton_(const std::string &url)
virtual MRVIEWER_API bool drawCollapsingHeaderTransform_() override
virtual MRVIEWER_API void drawBigButtonItem_(const MenuItemInfo &item)
MRVIEWER_API void drawActiveList_()
virtual MRVIEWER_API void drawRibbonSceneInformation_(const std::vector< std::shared_ptr< Object > > &selected)
virtual MRVIEWER_API void drawActiveListButton_(float btnSize)
virtual MRVIEWER_API void init(MR::Viewer *_viewer) override
static MRVIEWER_API void cloneTree(const std::vector< std::shared_ptr< Object > > &selectedObjects)
clones given objects with sub-objects (except for ancillary and unrecognized children) and undo
virtual MRVIEWER_API void drawItemDialog_(DialogItemPtr &itemPtr)
std::vector< std::shared_ptr< const Object > > prevFrameSelectedObjectsCache_
Definition MRRibbonMenu.h:210
virtual MRVIEWER_API float drawHeaderHelpers_(float requiredTabSize, float menuScaling)
virtual MRVIEWER_API void postResize_(int width, int height) override
virtual MRVIEWER_API void setQuickAccessListVersion(int version)
set quick access menu item list version
virtual MRVIEWER_API bool itemPressed_(const std::shared_ptr< RibbonMenuItem > &item, const std::string &requiremetnsHint={})
virtual MRVIEWER_API Vector2f drawRibbonSceneResizeLine_()
virtual MRVIEWER_API void load_font(int font_size=13) override
MRVIEWER_API void resetQuickAccessList()
reset quick access menu items list to default
MRVIEWER_API RibbonMenu()
virtual MRVIEWER_API void drawItemsGroup_(const std::string &tabName, const std::string &groupName, DrawGroupConfig config)
void setAutoCloseBlockingPlugins(bool value)
sets flag defining if closing plugin on opening another one is enabled or not
Definition MRRibbonMenu.h:130
virtual MRVIEWER_API void setupItemsGroup_(const std::vector< std::string > &groupsInTab, const std::string &tabName, bool centerItems)
RibbonFontManager & getFontManager()
get access to Ribbon font manager
Definition MRRibbonMenu.h:98
RibbonNotifier & getRibbonNotifier()
get access to Ribbon notifier
Definition MRRibbonMenu.h:107
static MRVIEWER_API void cloneSelectedPart(const std::shared_ptr< Object > &object)
clones selected part of given object as separate object (faces, points)
virtual MRVIEWER_API void drawTopPanel_(bool drawTabs=true, bool centerItems=false)
virtual MRVIEWER_API void pinTopPanel(bool on)
bool drawSelectSubtreeButton(const std::vector< std::shared_ptr< Object > > &selected)
bool drawCloneButton(const std::vector< std::shared_ptr< Object > > &selected)
virtual MRVIEWER_API std::filesystem::path getMenuFontPath() const override
virtual MRVIEWER_API void readQuickAccessList(const Json::Value &root)
read quick access menu items list from json
RibbonMenuSearch searcher_
Definition MRRibbonMenu.h:251
bool drawCustomCheckBox(const std::vector< std::shared_ptr< Object > > &selected, SelectedTypesMask selectedMask)
Toolbar & getToolbar()
get access to Ribbon Toolbar
Definition MRRibbonMenu.h:104
std::vector< DialogItemPtr > activeNonBlockingItems_
Definition MRRibbonMenu.h:184
boost::signals2::signal< void(int prevTabId, int newTabId)> TabChangedSignal
Definition MRRibbonMenu.h:123
std::vector< DrawGroupConfig > DrawTabConfig
Definition MRRibbonMenu.h:157
virtual MRVIEWER_API void postRescale_(float x, float y) override
virtual MRVIEWER_API void drawHeaderQuickAccess_(float menuScaling)
virtual MRVIEWER_API void updateTopPanelSize_(bool drawTabs)
bool drawMergeSubtreeButton(const std::vector< std::shared_ptr< Object > > &selected)
RibbonButtonDrawer & getRibbonButtonDrawer()
get access to Ribbon button drawer
Definition MRRibbonMenu.h:101
int getTopPanelCurrentHeight() const
Definition MRRibbonMenu.h:66
MRVIEWER_API void setCustomContextCheckbox(const std::string &name, CustomContextMenuCheckbox customContextMenuCheckbox)
virtual MRVIEWER_API void drawRibbonSceneList_()
const RibbonMenuUIConfig & getMenuUIConfig() const
returns current menu ui configuration (find more in RibbonMenuUIConfig comments)
Definition MRRibbonMenu.h:133
virtual MRVIEWER_API void fixViewportsSize_(int w, int h)
MRVIEWER_API void openToolbarCustomize()
open Toolbar Customize modal popup
virtual MRVIEWER_API bool drawTransformContextMenu_(const std::shared_ptr< Object > &selected) override
virtual MRVIEWER_API void pushNotification(const RibbonNotification &notification)
int getActiveTabIndex() const
returns index of active tab in RibbonSchemaHolder::schema().tabsOrder
Definition MRRibbonMenu.h:94
virtual MRVIEWER_API void drawRibbonViewportsLabels_()
MRVIEWER_API void updateItemStatus(const std::string &itemName)
updates status of item if it was changed outside of menu
TabChangedSignal tabChangedSignal
this signal is called when active tab changes
Definition MRRibbonMenu.h:125
MRVIEWER_API void setSceneSize(const Vector2i &size)
set Scene List window size
Definition MRRibbonNotification.h:64
class to draw toolbar and toolbar customize windows
Definition MRToolbar.h:21
Definition MRViewer.h:87
Definition MRViewportId.h:16
Definition MRCameraOrientationPlugin.h:8
SelectedTypesMask
Definition ImGuiMenu.h:34
MRVIEWER_API void pushNotification(const RibbonNotification &notification)
ShortcutCategory
Definition MRShortcutManager.h:28
Definition MRRibbonSchema.h:25
Definition MRRibbonMenuUIConfig.h:14
Definition MRRibbonMenu.h:178
std::shared_ptr< RibbonMenuItem > item
Definition MRRibbonMenu.h:179
Definition MRRibbonMenu.h:152
Definition MRRibbonNotification.h:38
Definition MRShortcutManager.h:13