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"
9#include "MRMesh/MRSignal.h"
11#include <type_traits>
12#include <array>
13
14namespace MR
15{
16
17class Object;
18
25
38
39// Class to control and render ribbon-style menu
40// stores menu items,
41// menu structure is provided by `menuItemsStructure.json` file (parsed on init)
42class MRVIEWER_CLASS RibbonMenu : public ImGuiMenu
43{
44 struct CustomContextMenuCheckbox
45 {
46 using Setter = std::function<void( std::shared_ptr<Object> object, ViewportId id, bool checked )>;
47 using Getter = std::function<bool( std::shared_ptr<Object> object, ViewportId id )>;
48 Setter setter;
49 Getter getter;
50 // display a checkBox when only these types of objects are selected
51 // by default, it is always hidden
52 SelectedTypesMask selectedMask = SelectedTypesMask( -1 );
53 };
54
55public:
56 MRVIEWER_API RibbonMenu();
57 MRVIEWER_API ~RibbonMenu();
58
59 // returns RibonMenu from ViewerInstance()
60 MRVIEWER_API static std::shared_ptr<RibbonMenu> instance();
61
62 // adds a custom checkBox to the context menu
63 // it is applied to the selected objects
64 MRVIEWER_API void setCustomContextCheckbox(
65 const std::string& name,
66 CustomContextMenuCheckbox customContextMenuCheckbox );
67
68 MRVIEWER_API virtual void init( MR::Viewer* _viewer ) override;
69
70 MRVIEWER_API virtual void shutdown() override;
71
73 MRVIEWER_API void openToolbarCustomize();
74
75 MRVIEWER_API virtual void load_font( int font_size = 13 ) override;
76
77 MRVIEWER_API virtual std::filesystem::path getMenuFontPath() const override;
78
79 // set top panel pinned and unpinned
80 MRVIEWER_API virtual void pinTopPanel( bool on );
81 MRVIEWER_API bool isTopPannelPinned() const;
82 // this functions allow you to get top panel height (before scaling)
83 int getTopPanelOpenedHeight() const { return topPanelOpenedHeight_; }
84 int getTopPanelHiddenHeight() const { return topPanelHiddenHeight_; }
85 int getTopPanelCurrentHeight() const { return currentTopPanelHeight_; }
86 // set maximum wait time (in seconds) before top panel is closed after mouse leaves it (only when not pinned)
87 // minimum value is 0 seconds, panel will close immediately after mouse leaves it
88 void setTopPanelMaxOpenedTimer( float sec ) { openedMaxSecs_ = std::max( 0.0f, sec ); }
89
91 MRVIEWER_API virtual void setQuickAccessListVersion( int version );
93 MRVIEWER_API virtual void readQuickAccessList( const Json::Value& root );
94
96 MRVIEWER_API void resetQuickAccessList();
97
99 Vector2i getSceneSize() { return Vector2i( int( sceneSize_.x ), int( sceneSize_.y ) ); };
100
102 MRVIEWER_API void setSceneSize( const Vector2i& size );
103
105 bool hasActiveBlockingItem() const { return bool( activeBlockingItem_.item ); }
107 bool hasAnyActiveItem() const { return bool( activeBlockingItem_.item ) || !activeNonBlockingItems_.empty(); }
108
110 MRVIEWER_API void updateItemStatus( const std::string& itemName );
111
113 int getActiveTabIndex() const { return activeTabIndex_; }
114
115
117 RibbonFontManager& getFontManager() { return fontManager_; };
118
120 RibbonButtonDrawer& getRibbonButtonDrawer() { return buttonDrawer_; }
121
123 Toolbar& getToolbar() { return *toolbar_; }
124
126 RibbonNotifier& getRibbonNotifier() { return notifier_; };
127
128 void setActiveListPos( const ImVec2& pos ) { activeListPos_ = pos; }
129
131 void showActiveList() { activeListPressed_ = true; };
132
135 MRVIEWER_API virtual void pushNotification( const RibbonNotification& notification );
136
138 MRVIEWER_API static void cloneTree( const std::vector<std::shared_ptr<Object>>& selectedObjects );
140 MRVIEWER_API static void cloneSelectedPart( const std::shared_ptr<Object>& object );
141
142 using TabChangedSignal = boost::signals2::signal<void( int prevTabId, int newTabId )>;
145
147 bool getAutoCloseBlockingPlugins() const { return autoCloseBlockingPlugins_; }
149 void setAutoCloseBlockingPlugins( bool value ) { autoCloseBlockingPlugins_ = value; }
150
152 const RibbonMenuUIConfig& getMenuUIConfig() const { return menuUIConfig_; }
153 MRVIEWER_API virtual void setMenuUIConfig( const RibbonMenuUIConfig& newConfig );
154
155 // ======== selected objects options drawing
156 bool drawGroupUngroupButton( const std::vector<std::shared_ptr<Object>>& selected );
157 bool drawSelectSubtreeButton( const std::vector<std::shared_ptr<Object>>& selected );
158 bool drawCloneButton( const std::vector<std::shared_ptr<Object>>& selected );
159 bool drawCustomCheckBox( const std::vector<std::shared_ptr<Object>>& selected, SelectedTypesMask selectedMask );
160 bool drawCloneSelectionButton( const std::vector<std::shared_ptr<Object>>& selected );
161 bool drawMergeSubtreeButton( const std::vector<std::shared_ptr<Object>>& selected );
162protected:
163 // draw single item
164 MRVIEWER_API virtual void drawBigButtonItem_( const MenuItemInfo& item );
165 // draw set of small text buttons
166 MRVIEWER_API virtual void drawSmallButtonsSet_( const std::vector<std::string>& group, int setFrontIndex, int setLength,
167 bool withText );
168
169 // Configuration of ribbon group
171 {
172 int numBig{ 0 };
173 int numSmallText{ 0 };
174 int numSmall{ 0 };
175 };
176 using DrawTabConfig = std::vector<DrawGroupConfig>;
177 // draw group of items
178 MRVIEWER_API virtual DrawTabConfig setupItemsGroupConfig_( const std::vector<std::string>& groupsInTab, const std::string& tabName, bool centerItems );
179 MRVIEWER_API virtual void setupItemsGroup_( const std::vector<std::string>& groupsInTab, const std::string& tabName, bool centerItems );
180 MRVIEWER_API virtual void drawItemsGroup_( const std::string& tabName, const std::string& groupName,
181 DrawGroupConfig config );
182 // ribbon menu item pressed
183 // requiremetnsHint - text that is showed if tool is unavailable (if empty then tool is available)
184 // returns true if item was actually activated or deactivated with press action
185 MRVIEWER_API virtual bool itemPressed_( const std::shared_ptr<RibbonMenuItem>& item, const std::string& requiremetnsHint = {} );
186
188 MRVIEWER_API virtual std::string getRequirements_( const std::shared_ptr<RibbonMenuItem>& item ) const;
189
190 MRVIEWER_API virtual void drawActiveBlockingDialog_();
191 MRVIEWER_API virtual void drawActiveNonBlockingDialogs_();
192
193 MRVIEWER_API virtual void postResize_( int width, int height ) override;
194 MRVIEWER_API virtual void postRescale_( float x, float y ) override;
195
197 {
198 std::shared_ptr<RibbonMenuItem> item;
199 // this flag is needed to correctly fix position of UI dialog (temporary, while plugin dialogs are floating in viewport)
200 bool dialogPositionFixed{ false };
201 };
203 std::vector<DialogItemPtr> activeNonBlockingItems_;
204 MRVIEWER_API virtual void drawItemDialog_( DialogItemPtr& itemPtr );
205
206 // Draw ribbon top panel
207 MRVIEWER_API virtual void drawTopPanel_( bool drawTabs = true, bool centerItems = false );
208 // Draw scene list window with content
209 MRVIEWER_API virtual void drawRibbonSceneList_();
210 // Draw vertical line at the right border of scene to enable resize of scene list
211 // returns size of scene window
212 MRVIEWER_API virtual Vector2f drawRibbonSceneResizeLine_();
213 // Draw viewport id and projection type for all viewporrts
214 MRVIEWER_API virtual void drawRibbonViewportsLabels_();
215
216 MRVIEWER_API virtual void drawRibbonSceneInformation_( const std::vector<std::shared_ptr<Object>>& selected );
217
218 MRVIEWER_API virtual bool drawCollapsingHeaderTransform_() override;
219 MRVIEWER_API virtual bool drawTransformContextMenu_( const std::shared_ptr<Object>& selected ) override;
220
221 MRVIEWER_API virtual void addRibbonItemShortcut_( const std::string& itemName, const ShortcutKey& key, ShortcutCategory category );
222
223 MRVIEWER_API virtual void setupShortcuts_() override;
224
225 MRVIEWER_API virtual void drawShortcutsWindow_() override;
226 // reads files with panel description
227 MRVIEWER_API virtual void readMenuItemsStructure_();
228
229 std::vector<std::shared_ptr<const Object>> prevFrameSelectedObjectsCache_;
230
231 MRVIEWER_API virtual bool drawCollapsingHeader_( const char* label, ImGuiTreeNodeFlags flags = 0 ) override;
232
233 MRVIEWER_API virtual void highlightBlocking_();
234
235 // draw scene list buttons
236 MRVIEWER_API virtual void drawSceneListButtons_();
237
238 // updates viewport sizes with respect to ribbon top and left panels
239 MRVIEWER_API virtual void fixViewportsSize_( int w, int h );
240
241 // need to be called if you override windows pipeline and use ActiveListPlugin
242 MRVIEWER_API void drawActiveList_();
243
244 // call this to draw RibbonNotifier with respect of scene size and ribbon top panel
245 MRVIEWER_API virtual void drawNotifications_();
246
247 // this function changes internal sizes of topPanel when it is enabled or disabled
248 MRVIEWER_API virtual void updateTopPanelSize_( bool drawTabs );
249
251
252private:
253 void changeTab_( int newTab );
254
255 void drawSearchButton_();
256 void drawCollapseButton_();
257 void drawHelpButton_();
258
259 void sortObjectsRecursive_( std::shared_ptr<Object> object );
260
261 // part of top panel
262 void drawHeaderQuickAccess_();
263 void drawHeaderPannel_();
264 void drawActiveListButton_( float btnSize );
265
266 ImVec2 activeListPos_{ 0,0 };
267 bool activeListPressed_{ false };
268
269 void beginTopPanel_();
270 void endTopPanel_();
271 void drawTopPanelOpened_( bool drawTabs, bool centerItems );
272
273 std::string transformClipboardText_;
274
275 int currentTopPanelHeight_ = 113;
276 int topPanelOpenedHeight_ = 113;
277 int topPanelHiddenHeight_ = 33;
278
279 ImVec2 sceneSize_{ 310, 0 };
280 float informationHeight_{ 0.f };
281 float transformHeight_{ 0.f };
282
283 RibbonMenuUIConfig menuUIConfig_;
284
285 // how long blocking window will blink in seconds
286 float blockingHighlightTimer_{ 0.0f };
287
288 // current scroll position of tabs panel
289 float tabPanelScroll_{ 0.0f };
290
291 bool autoCloseBlockingPlugins_{ true };
292
293 enum class CollapseState
294 {
295 Closed,
296 Opened,
297 Pinned
298 } collapseState_{ CollapseState::Pinned };
299 // seconds to stay opened if not pinned
300 float openedMaxSecs_{ 2.0f };
301 float openedTimer_{ openedMaxSecs_ };
302
303 int activeTabIndex_{ 0 };
304 RibbonFontManager fontManager_;
305 RibbonButtonDrawer buttonDrawer_;
306
307 std::unordered_map<std::string, CustomContextMenuCheckbox> customCheckBox_;
308
309 std::unique_ptr<Toolbar> toolbar_;
310 RibbonNotifier notifier_;
311#ifndef __EMSCRIPTEN__
312 AsyncRequest asyncRequest_;
313#endif // !__EMSCRIPTEN__
314};
315
316// Checks if RibbonMenu is available, if it is - forwards notification to RibbonNotifier. Otherwise - calls showModal() function
317MRVIEWER_API void pushNotification( const RibbonNotification& notification );
318
319}
Definition ImGuiMenu.h:55
class for drawing ribbon menu buttons
Definition MRRibbonButtonDrawer.h:48
Definition MRRibbonFontManager.h:11
Definition MRRibbonMenuSearch.h:17
Definition MRRibbonMenu.h:43
MRVIEWER_API ~RibbonMenu()
bool hasAnyActiveItem() const
returns true if any plugin is now active
Definition MRRibbonMenu.h:107
virtual MRVIEWER_API void drawSceneListButtons_()
int getTopPanelOpenedHeight() const
Definition MRRibbonMenu.h:83
void setTopPanelMaxOpenedTimer(float sec)
Definition MRRibbonMenu.h:88
void showActiveList()
set active plugins list showed
Definition MRRibbonMenu.h:131
void setActiveListPos(const ImVec2 &pos)
Definition MRRibbonMenu.h:128
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:202
virtual MRVIEWER_API void shutdown() override
virtual MRVIEWER_API void drawShortcutsWindow_() override
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:105
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:147
int getTopPanelHiddenHeight() const
Definition MRRibbonMenu.h:84
virtual MRVIEWER_API void drawActiveBlockingDialog_()
virtual MRVIEWER_API void readMenuItemsStructure_()
Vector2i getSceneSize()
get Scene List window size
Definition MRRibbonMenu.h:99
virtual MRVIEWER_API void drawNotifications_()
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 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:229
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:149
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:117
RibbonNotifier & getRibbonNotifier()
get access to Ribbon notifier
Definition MRRibbonMenu.h:126
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:250
bool drawCustomCheckBox(const std::vector< std::shared_ptr< Object > > &selected, SelectedTypesMask selectedMask)
Toolbar & getToolbar()
get access to Ribbon Toolbar
Definition MRRibbonMenu.h:123
std::vector< DialogItemPtr > activeNonBlockingItems_
Definition MRRibbonMenu.h:203
boost::signals2::signal< void(int prevTabId, int newTabId)> TabChangedSignal
Definition MRRibbonMenu.h:142
std::vector< DrawGroupConfig > DrawTabConfig
Definition MRRibbonMenu.h:176
virtual MRVIEWER_API void postRescale_(float x, float y) override
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:120
int getTopPanelCurrentHeight() const
Definition MRRibbonMenu.h:85
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:152
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:113
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:144
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:84
Definition MRViewportId.h:16
@ None
special value not to limit path in one slice
Definition MRVoxelPath.h:33
SelectedTypesMask
Definition ImGuiMenu.h:34
RibbonTopPanelLayoutMode
Definition MRRibbonMenu.h:20
@ RibbonWithTabs
both ribbon toolbar and tabs
@ RibbonNoTabs
show only icons from the first tab, without tabs panel
MRVIEWER_API void pushNotification(const RibbonNotification &notification)
ShortcutCategory
Definition MRShortcutManager.h:28
Definition MRRibbonSchema.h:25
Definition MRRibbonMenu.h:27
RibbonTopPanelLayoutMode topLayout
how to show top panel
Definition MRRibbonMenu.h:28
bool drawNotifications
if false - no notifications are drawn on screen
Definition MRRibbonMenu.h:34
bool centerRibbonItems
if true - items on selected tab will be centered to have equal spacing from left and right (ignored t...
Definition MRRibbonMenu.h:29
bool operator==(const RibbonMenuUIConfig &) const =default
bool drawToolbar
if false - toolbar will be hidden (ignored if top panel is hidden)
Definition MRRibbonMenu.h:32
bool drawViewportTags
if false - window with viewport label and id will be hidden
Definition MRRibbonMenu.h:33
bool drawScenePanel
if false - panel with scene tree, information and transform will be hidden
Definition MRRibbonMenu.h:31
Definition MRRibbonMenu.h:197
std::shared_ptr< RibbonMenuItem > item
Definition MRRibbonMenu.h:198
Definition MRRibbonMenu.h:171
Definition MRRibbonNotification.h:38
Definition MRShortcutManager.h:13