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