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