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{
19
20
21class Object;
22
26class MRVIEWER_CLASS RibbonMenu : public ImGuiMenu
27{
28 struct CustomContextMenuCheckbox
29 {
30 using Setter = std::function<void( std::shared_ptr<Object> object, ViewportId id, bool checked )>;
31 using Getter = std::function<bool( std::shared_ptr<Object> object, ViewportId id )>;
37 };
38
39public:
40 MRVIEWER_API RibbonMenu();
41 MRVIEWER_API ~RibbonMenu();
42
44 MRVIEWER_API static std::shared_ptr<RibbonMenu> instance();
45
48 MRVIEWER_API void setCustomContextCheckbox(
49 const std::string& name,
50 CustomContextMenuCheckbox customContextMenuCheckbox );
51
52 MRVIEWER_API virtual void init( MR::Viewer* _viewer ) override;
53
54 MRVIEWER_API virtual void shutdown() override;
55
56 virtual void drawViewerWindow() override {}
57
58 MRVIEWER_API virtual void drawAdditionalWindows() override;
59
61 MRVIEWER_API void openToolbarCustomize();
62
63 MRVIEWER_API virtual void loadFonts( int font_size = 13 ) override;
64
65 MRVIEWER_API virtual std::filesystem::path getMenuFontPath() const override;
66
68 MRVIEWER_API virtual void pinTopPanel( bool on );
69 MRVIEWER_API bool isTopPannelPinned() const;
71 int getTopPanelOpenedHeight() const { return topPanelOpenedHeight_; }
72 int getTopPanelHiddenHeight() const { return topPanelHiddenHeight_; }
73 int getTopPanelCurrentHeight() const { return currentTopPanelHeight_; }
76 void setTopPanelMaxOpenedTimer( float sec ) { openedMaxSecs_ = std::max( 0.0f, sec ); }
77
79 MRVIEWER_API virtual void setQuickAccessListVersion( int version );
81 MRVIEWER_API virtual void readQuickAccessList( const Json::Value& root );
82
84 MRVIEWER_API void resetQuickAccessList();
85
87 Vector2i getSceneSize() { return Vector2i( int( sceneSize_.x ), int( sceneSize_.y ) ); };
88
90 MRVIEWER_API void setSceneSize( const Vector2i& size );
91
93 bool hasActiveBlockingItem() const { return bool( activeBlockingItem_.item ); }
95 bool hasAnyActiveItem() const { return bool( activeBlockingItem_.item ) || !activeNonBlockingItems_.empty(); }
96
98 MRVIEWER_API void updateItemStatus( const std::string& itemName );
99
101 int getActiveTabIndex() const { return activeTabIndex_; }
102
103
105 RibbonFontManager& getFontManager() { return fontManager_; };
106
108 RibbonButtonDrawer& getRibbonButtonDrawer() { return buttonDrawer_; }
109
111 Toolbar& getToolbar() { return *toolbar_; }
112
114 RibbonNotifier& getRibbonNotifier() { return notifier_; };
115
116 void setActiveListPos( const ImVec2& pos ) { activeListPos_ = pos; }
117
119 void showActiveList() { activeListPressed_ = true; };
120
123 MRVIEWER_API virtual void pushNotification( const RibbonNotification& notification );
124
126 MRVIEWER_API static void cloneTree( const std::vector<std::shared_ptr<Object>>& selectedObjects );
128 MRVIEWER_API static void cloneSelectedPart( const std::shared_ptr<Object>& object );
129
130 using TabChangedSignal = boost::signals2::signal<void( int prevTabId, int newTabId )>;
133
135 bool getAutoCloseBlockingPlugins() const { return autoCloseBlockingPlugins_; }
137 void setAutoCloseBlockingPlugins( bool value ) { autoCloseBlockingPlugins_ = value; }
138
140 const RibbonMenuUIConfig& getMenuUIConfig() const { return menuUIConfig_; }
141 MRVIEWER_API virtual void setMenuUIConfig( const RibbonMenuUIConfig& newConfig );
142
144 bool drawGroupUngroupButton( const std::vector<std::shared_ptr<Object>>& selected );
145 bool drawSelectSubtreeButton( const std::vector<std::shared_ptr<Object>>& selected );
146 bool drawCloneButton( const std::vector<std::shared_ptr<Object>>& selected );
147 bool drawCustomCheckBox( const std::vector<std::shared_ptr<Object>>& selected, SelectedTypesMask selectedMask );
148 bool drawCloneSelectionButton( const std::vector<std::shared_ptr<Object>>& selected );
149 bool drawMergeSubtreeButton( const std::vector<std::shared_ptr<Object>>& selected );
150protected:
152 MRVIEWER_API virtual void drawBigButtonItem_( const MenuItemInfo& item );
154 MRVIEWER_API virtual void drawSmallButtonsSet_( const std::vector<std::string>& group, int setFrontIndex, int setLength,
155 bool withText );
156
159 {
160 int numBig{ 0 };
161 int numSmallText{ 0 };
162 int numSmall{ 0 };
163 };
164 using DrawTabConfig = std::vector<DrawGroupConfig>;
166 MRVIEWER_API virtual DrawTabConfig setupItemsGroupConfig_( const std::vector<std::string>& groupsInTab, const std::string& tabName, bool centerItems );
167 MRVIEWER_API virtual void setupItemsGroup_( const std::vector<std::string>& groupsInTab, const std::string& tabName, bool centerItems );
168 MRVIEWER_API virtual void drawItemsGroup_( const std::string& tabName, const std::string& groupName,
169 DrawGroupConfig config );
173 MRVIEWER_API virtual bool itemPressed_( const std::shared_ptr<RibbonMenuItem>& item, const std::string& requiremetnsHint = {} );
174
176 MRVIEWER_API virtual std::string getRequirements_( const std::shared_ptr<RibbonMenuItem>& item ) const;
177
178 MRVIEWER_API virtual void drawActiveBlockingDialog_();
179 MRVIEWER_API virtual void drawActiveNonBlockingDialogs_();
180
181 MRVIEWER_API virtual void postResize_( int width, int height ) override;
182 MRVIEWER_API virtual void postRescale_( float x, float y ) override;
183
185 {
186 std::shared_ptr<RibbonMenuItem> item;
188 bool dialogPositionFixed{ false };
189 };
191 std::vector<DialogItemPtr> activeNonBlockingItems_;
192 MRVIEWER_API virtual void drawItemDialog_( DialogItemPtr& itemPtr );
193
195 MRVIEWER_API virtual void drawTopPanel_( bool drawTabs = true, bool centerItems = false );
197 MRVIEWER_API virtual void drawRibbonSceneList_();
200 MRVIEWER_API virtual Vector2f drawRibbonSceneResizeLine_();
202 MRVIEWER_API virtual void drawRibbonViewportsLabels_();
203
204 MRVIEWER_API virtual void drawRibbonSceneInformation_( const std::vector<std::shared_ptr<Object>>& selected );
205
206 MRVIEWER_API virtual bool drawCollapsingHeaderTransform_() override;
207 MRVIEWER_API virtual bool drawTransformContextMenu_( const std::shared_ptr<Object>& selected ) override;
208
209 MRVIEWER_API virtual void addRibbonItemShortcut_( const std::string& itemName, const ShortcutKey& key, ShortcutCategory category );
210
211 MRVIEWER_API virtual void setupShortcuts_() override;
212
213 MRVIEWER_API virtual void drawShortcutsWindow_() override;
215 MRVIEWER_API virtual void readMenuItemsStructure_();
216
217 std::vector<std::shared_ptr<const Object>> prevFrameSelectedObjectsCache_;
218
219 MRVIEWER_API virtual bool drawCollapsingHeader_( const char* label, ImGuiTreeNodeFlags flags = 0 ) override;
220
221 MRVIEWER_API virtual void highlightBlocking_();
222
224 MRVIEWER_API virtual void drawSceneListButtons_();
225
227 MRVIEWER_API virtual void fixViewportsSize_( int w, int h );
228
230 MRVIEWER_API void drawActiveList_();
231
233 MRVIEWER_API virtual void drawNotifications_();
234
236 MRVIEWER_API virtual void updateTopPanelSize_( bool drawTabs );
237
239 MRVIEWER_API virtual void drawHeaderQuickAccess_();
240
247 MRVIEWER_API virtual float drawHeaderHelpers_( float requiredTabSize );
248
250 MRVIEWER_API virtual void drawActiveListButton_( float btnSize );
252 MRVIEWER_API virtual void drawSearchButton_();
254 MRVIEWER_API virtual void drawCollapseButton_();
256 MRVIEWER_API virtual void drawHelpButton_( const std::string& url );
257
259
260private:
261 void changeTab_( int newTab );
262
263 void sortObjectsRecursive_( std::shared_ptr<Object> object );
264
266 void drawHeaderPannel_();
267
268 ImVec2 activeListPos_{ 0,0 };
269 bool activeListPressed_{ false };
270
271 void beginTopPanel_();
272 void endTopPanel_();
273 void drawTopPanelOpened_( bool drawTabs, bool centerItems );
274
275 std::string transformClipboardText_;
276
277 int currentTopPanelHeight_ = 113;
278 int topPanelOpenedHeight_ = 113;
279 int topPanelHiddenHeight_ = 33;
280
281 ImVec2 sceneSize_{ 310, 0 };
282 float informationHeight_{ 0.f };
283 float transformHeight_{ 0.f };
284
285 RibbonMenuUIConfig menuUIConfig_;
286
288 float blockingHighlightTimer_{ 0.0f };
289
291 float tabPanelScroll_{ 0.0f };
292
293 bool autoCloseBlockingPlugins_{ true };
294
295 enum class CollapseState
296 {
297 Closed,
298 Opened,
299 Pinned
300 } collapseState_{ CollapseState::Pinned };
302 float openedMaxSecs_{ 2.0f };
303 float openedTimer_{ openedMaxSecs_ };
304
305 int activeTabIndex_{ 0 };
306 RibbonFontManager fontManager_;
307 RibbonButtonDrawer buttonDrawer_;
308
309 std::unordered_map<std::string, CustomContextMenuCheckbox> customCheckBox_;
310
311 std::unique_ptr<Toolbar> toolbar_;
312 RibbonNotifier notifier_;
313#ifndef __EMSCRIPTEN__
314 AsyncRequest asyncRequest_;
315#endif
316};
317
319MRVIEWER_API void pushNotification( const RibbonNotification& notification );
320
321}
Definition ImGuiMenu.h:53
named object in the data model
Definition MRObject.h:62
class for drawing ribbon menu buttons
Definition MRRibbonButtonDrawer.h:53
Definition MRRibbonFontManager.h:15
separate class for search in ribbon menu
Definition MRRibbonMenuSearch.h:20
class to hold and operate with notifications
Definition MRRibbonNotification.h:67
class to draw toolbar and toolbar customize windows
Definition MRToolbar.h:24
GLFW-based mesh viewer.
Definition MRViewer.h:69
Definition MRViewportId.h:16
auto width(const Box< V > &box)
returns size along x axis
Definition MRBox.h:354
auto height(const Box< V > &box)
returns size along y axis
Definition MRBox.h:361
SelectedTypesMask selectedMask
Definition MRRibbonMenu.h:36
bool hasAnyActiveItem() const
returns true if any plugin is now active
Definition MRRibbonMenu.h:95
virtual void pushNotification(const RibbonNotification &notification)
int getTopPanelOpenedHeight() const
this functions allow you to get top panel height (before scaling)
Definition MRRibbonMenu.h:71
SelectedTypesMask
Definition ImGuiMenu.h:32
virtual void postResize_(int width, int height) override
Scene events.
int numSmall
Definition MRRibbonMenu.h:162
void setTopPanelMaxOpenedTimer(float sec)
Definition MRRibbonMenu.h:76
void showActiveList()
set active plugins list showed
Definition MRRibbonMenu.h:119
virtual void drawItemDialog_(DialogItemPtr &itemPtr)
virtual void updateTopPanelSize_(bool drawTabs)
this function changes internal sizes of topPanel when it is enabled or disabled
void setActiveListPos(const ImVec2 &pos)
Definition MRRibbonMenu.h:116
bool drawCloneSelectionButton(const std::vector< std::shared_ptr< Object > > &selected)
bool drawGroupUngroupButton(const std::vector< std::shared_ptr< Object > > &selected)
======== selected objects options drawing
virtual void init(MR::Viewer *_viewer) override
This function is called when the viewer is initialized (no mesh will be loaded at this stage)
virtual void drawActiveBlockingDialog_()
bool isTopPannelPinned() const
void resetQuickAccessList()
reset quick access menu items list to default
int numSmallText
Definition MRRibbonMenu.h:161
virtual void setMenuUIConfig(const RibbonMenuUIConfig &newConfig)
DialogItemPtr activeBlockingItem_
Definition MRRibbonMenu.h:190
ImVec2 size(const ViewportRectangle &rect)
Definition MRViewport.h:32
virtual void drawAdditionalWindows() override
override this instead using callback_draw_custom_window
virtual void drawItemsGroup_(const std::string &tabName, const std::string &groupName, DrawGroupConfig config)
virtual void drawActiveListButton_(float btnSize)
helper list of active tools
virtual bool drawTransformContextMenu_(const std::shared_ptr< Object > &selected) override
bool hasActiveBlockingItem() const
returns true if any blocking plugin is now active
Definition MRRibbonMenu.h:93
bool getAutoCloseBlockingPlugins() const
returns flag defining if closing plugin on opening another one is enabled
Definition MRRibbonMenu.h:135
int getTopPanelHiddenHeight() const
Definition MRRibbonMenu.h:72
std::function< void(std::shared_ptr< Object > object, ViewportId id, bool checked)> Setter
Definition MRRibbonMenu.h:30
Vector2i getSceneSize()
get Scene List window size
Definition MRRibbonMenu.h:87
virtual void drawActiveNonBlockingDialogs_()
std::function< bool(std::shared_ptr< Object > object, ViewportId id)> Getter
Definition MRRibbonMenu.h:31
virtual void drawRibbonSceneInformation_(const std::vector< std::shared_ptr< Object > > &selected)
virtual void addRibbonItemShortcut_(const std::string &itemName, const ShortcutKey &key, ShortcutCategory category)
virtual void drawSearchButton_()
header helper search bar at panel
static 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 void drawRibbonSceneList_()
Draw scene list window with content.
virtual void drawNotifications_()
call this to draw RibbonNotifier with respect of scene size and ribbon top panel
virtual bool drawCollapsingHeader_(const char *label, ImGuiTreeNodeFlags flags=0) override
override this to have custom UI in "Selection Properties" window (under "Draw Options")
bool dialogPositionFixed
this flag is needed to correctly fix position of UI dialog (temporary, while plugin dialogs are float...
Definition MRRibbonMenu.h:188
virtual void drawBigButtonItem_(const MenuItemInfo &item)
draw single item
virtual bool itemPressed_(const std::shared_ptr< RibbonMenuItem > &item, const std::string &requiremetnsHint={})
std::vector< std::shared_ptr< const Object > > prevFrameSelectedObjectsCache_
Definition MRRibbonMenu.h:217
static std::shared_ptr< RibbonMenu > instance()
returns RibonMenu from ViewerInstance()
Getter getter
Definition MRRibbonMenu.h:33
virtual std::string getRequirements_(const std::shared_ptr< RibbonMenuItem > &item) const
returns requirements line for given tool, empty line means that tool is available
virtual void drawSceneListButtons_()
draw scene list buttons
virtual void shutdown() override
This function is called before shutdown.
virtual std::filesystem::path getMenuFontPath() const override
void openToolbarCustomize()
open Toolbar Customize modal popup
void setAutoCloseBlockingPlugins(bool value)
sets flag defining if closing plugin on opening another one is enabled or not
Definition MRRibbonMenu.h:137
virtual void drawViewerWindow() override
override this instead using callback_draw_viewer_window
Definition MRRibbonMenu.h:56
virtual DrawTabConfig setupItemsGroupConfig_(const std::vector< std::string > &groupsInTab, const std::string &tabName, bool centerItems)
draw group of items
void drawActiveList_()
need to be called if you override windows pipeline and use ActiveListPlugin
virtual void loadFonts(int font_size=13) override
void updateItemStatus(const std::string &itemName)
updates status of item if it was changed outside of menu
RibbonFontManager & getFontManager()
get access to Ribbon font manager
Definition MRRibbonMenu.h:105
RibbonNotifier & getRibbonNotifier()
get access to Ribbon notifier
Definition MRRibbonMenu.h:114
virtual void setQuickAccessListVersion(int version)
set quick access menu item list version
static void cloneSelectedPart(const std::shared_ptr< Object > &object)
clones selected part of given object as separate object (faces, points)
ShortcutCategory
Definition MRShortcutManager.h:31
bool drawSelectSubtreeButton(const std::vector< std::shared_ptr< Object > > &selected)
bool drawCloneButton(const std::vector< std::shared_ptr< Object > > &selected)
virtual void drawTopPanel_(bool drawTabs=true, bool centerItems=false)
Draw ribbon top panel.
RibbonMenuSearch searcher_
Definition MRRibbonMenu.h:258
virtual void postRescale_(float x, float y) override
bool drawCustomCheckBox(const std::vector< std::shared_ptr< Object > > &selected, SelectedTypesMask selectedMask)
int numBig
Definition MRRibbonMenu.h:160
virtual void drawRibbonViewportsLabels_()
Draw viewport id and projection type for all viewporrts.
Setter setter
Definition MRRibbonMenu.h:32
Toolbar & getToolbar()
get access to Ribbon Toolbar
Definition MRRibbonMenu.h:111
std::vector< DialogItemPtr > activeNonBlockingItems_
Definition MRRibbonMenu.h:191
void setCustomContextCheckbox(const std::string &name, CustomContextMenuCheckbox customContextMenuCheckbox)
boost::signals2::signal< void(int prevTabId, int newTabId)> TabChangedSignal
Definition MRRibbonMenu.h:130
std::vector< DrawGroupConfig > DrawTabConfig
Definition MRRibbonMenu.h:164
virtual void readMenuItemsStructure_()
reads files with panel description
virtual void setupItemsGroup_(const std::vector< std::string > &groupsInTab, const std::string &tabName, bool centerItems)
bool drawMergeSubtreeButton(const std::vector< std::shared_ptr< Object > > &selected)
virtual void drawShortcutsWindow_() override
A virtual function for drawing of the dialog with shortcuts. It can be overriden in the inherited cla...
virtual void highlightBlocking_()
virtual void drawHeaderQuickAccess_()
draw quick access bar at header level
void pushNotification(const RibbonNotification &notification)
Checks if RibbonMenu is available, if it is - forwards notification to RibbonNotifier....
virtual void drawSmallButtonsSet_(const std::vector< std::string > &group, int setFrontIndex, int setLength, bool withText)
draw set of small text buttons
RibbonButtonDrawer & getRibbonButtonDrawer()
get access to Ribbon button drawer
Definition MRRibbonMenu.h:108
int getTopPanelCurrentHeight() const
Definition MRRibbonMenu.h:73
const RibbonMenuUIConfig & getMenuUIConfig() const
returns current menu ui configuration (find more in RibbonMenuUIConfig comments)
Definition MRRibbonMenu.h:140
virtual void fixViewportsSize_(int w, int h)
updates viewport sizes with respect to ribbon top and left panels
void setSceneSize(const Vector2i &size)
set Scene List window size
std::shared_ptr< RibbonMenuItem > item
Definition MRRibbonMenu.h:186
virtual void setupShortcuts_() override
virtual void pinTopPanel(bool on)
set top panel pinned and unpinned
virtual void drawCollapseButton_()
header helper button to pin/unpin ribbon
virtual float drawHeaderHelpers_(float requiredTabSize)
virtual bool drawCollapsingHeaderTransform_() override
override this to customize appearance of collapsing headers for transform block
virtual void drawHelpButton_(const std::string &url)
header helper button link to help page
int getActiveTabIndex() const
returns index of active tab in RibbonSchemaHolder::schema().tabsOrder
Definition MRRibbonMenu.h:101
virtual void readQuickAccessList(const Json::Value &root)
read quick access menu items list from json
virtual Vector2f drawRibbonSceneResizeLine_()
TabChangedSignal tabChangedSignal
this signal is called when active tab changes
Definition MRRibbonMenu.h:132
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
Definition MRRibbonSchema.h:28
Definition MRRibbonMenuUIConfig.h:18
Definition MRRibbonMenu.h:185
Configuration of ribbon group.
Definition MRRibbonMenu.h:159
Definition MRRibbonNotification.h:41
Definition MRShortcutManager.h:16