MeshLib C++ Docs
Loading...
Searching...
No Matches
MRRibbonSchema.h
Go to the documentation of this file.
1#pragma once
2#include "MRViewerFwd.h"
4#include "MRMesh/MRMeshFwd.h"
5#include "MRMesh/MRphmap.h"
6#include <json/forwards.h>
7#include <filesystem>
8#include <vector>
9#include <string>
10#include <memory>
11
12namespace MR
13{
14
15// needed for big buttons text aligning
16using SplitCaptionInfo = std::vector<std::pair<std::string_view, float>>;
17
23
25{
26 std::shared_ptr<RibbonMenuItem> item;
27 std::string caption;
28 std::string tooltip;
29 std::string icon;
31 std::string helpLink; // link to help page
32};
33
36class MRVIEWER_CLASS RibbonSchemaLoadListener
37{
38public:
39 virtual ~RibbonSchemaLoadListener() = default;
40
41protected:
42 friend class RibbonSchemaLoader;
43 virtual void onRibbonSchemaLoad_() = 0;
44};
45
49using MenuItemsList = std::vector<std::string>;
51{
52 std::string name;
53 int priority{ 0 };
54 bool experimental{ false };
55};
56
57// This structure describes UI schema of ribbon menu
77
78// This class holds static ribbon schema,
79// note that schema becomes valid after loading (RibbonSchemaLoader)
80class MRVIEWER_CLASS RibbonSchemaHolder
81{
82public:
83 MRVIEWER_API static RibbonSchema& schema();
84
87 MRVIEWER_API static bool addItem( const std::shared_ptr<RibbonMenuItem>& item );
88
91 MRVIEWER_API static bool delItem( const std::shared_ptr<RibbonMenuItem>& item );
92
95 {
96 int tabIndex{ -1 }; // -1 is default value if item has no tab
97 const MenuItemInfo* item{ nullptr }; // item info to show correct caption
98 };
99
102 {
103 float captionWeight{ 1.f };
104 float captionOrderWeight{ 1.f };
105 float tooltipWeight{ 1.f };
106 float tooltipOrderWeight{ 1.f };
107 };
108
111 {
113 int* captionCount = nullptr;
115 std::vector<SearchResultWeight>* weights = nullptr;
117 RequirementsFunction requirementsFunc = {};
118 };
120 MRVIEWER_API static std::vector<SearchResult> search( const std::string& searchStr, const SearchParams& params );
121
123 MRVIEWER_API static int findItemTab( const std::shared_ptr<RibbonMenuItem>& item );
124
125private:
126 RibbonSchemaHolder() = default;
127};
128
129// Class for loading ribbon schema from structure files (basically called from RibbonMenu, but can be called separately)
130class MRVIEWER_CLASS RibbonSchemaLoader
131{
132public:
134 virtual ~RibbonSchemaLoader() = default;
135
136 // Loads schema from files
137 MRVIEWER_API virtual void loadSchema() const;
138
139 // Reads schema items list from `root` to `list`
140 MRVIEWER_API static void readMenuItemsList( const Json::Value& root, MenuItemsList& list );
141
142 // Recalc items sizes
143 MRVIEWER_API static void recalcItemSizes();
144protected:
145 // finds structure json files in exe directory
146 MRVIEWER_API virtual std::vector<std::filesystem::path> getStructureFiles_( const std::string& fileExtension ) const;
147 // sort structure json files by order
148 MRVIEWER_API void sortFilesByOrder_( std::vector<std::filesystem::path>& files ) const;
149 // appends one menu items json info
150 MRVIEWER_API void readItemsJson_( const std::filesystem::path& path ) const;
151 MRVIEWER_API void readItemsJson_( const Json::Value& root ) const;
152 // appends one ui json info
153 MRVIEWER_API void readUIJson_( const std::filesystem::path& path ) const;
154 MRVIEWER_API void readUIJson_( const Json::Value& root ) const;
155};
156
157
158template<typename T>
160{
161 static_assert( std::is_base_of_v<RibbonMenuItem, T> );
162public:
163 template<typename F>
164 RibbonMenuItemCall( F f, std::function<void(std::shared_ptr<T>)> g ) : g_( std::move( g ) )
165 {
166 const auto& items = RibbonSchemaHolder::schema().items;
167 for ( const auto& item : items )
168 {
169 auto plugin = std::dynamic_pointer_cast< T >( item.second.item );
170 if ( !plugin )
171 continue;
172 f( plugin_ = std::move( plugin ) );
173 break;
174 }
175 }
177 {
178 if ( g_ && plugin_ )
179 g_( plugin_ );
180 }
181private:
182 std::shared_ptr<T> plugin_;
183 std::function<void(std::shared_ptr<T>)> g_;
184};
185
187#define MR_RIBBON_ITEM_CALL(pluginType,f,g) \
188 static MR::RibbonMenuItemCall<pluginType> ribbonMenuItemCall##func##pluginType##_( f, g );
189
190} //namespace MR
Definition MRRibbonSchema.h:160
RibbonMenuItemCall(F f, std::function< void(std::shared_ptr< T >)> g)
Definition MRRibbonSchema.h:164
~RibbonMenuItemCall()
Definition MRRibbonSchema.h:176
Definition MRRibbonSchema.h:81
static MRVIEWER_API RibbonSchema & schema()
static MRVIEWER_API bool delItem(const std::shared_ptr< RibbonMenuItem > &item)
static MRVIEWER_API bool addItem(const std::shared_ptr< RibbonMenuItem > &item)
static MRVIEWER_API int findItemTab(const std::shared_ptr< RibbonMenuItem > &item)
returns item tab index in schema.tabsOrder or -1 if no tab found (e.g. scene fast access panel or hea...
static MRVIEWER_API std::vector< SearchResult > search(const std::string &searchStr, const SearchParams &params)
searches for tools with the most appropriate names (captions) or tooltips
Definition MRRibbonSchema.h:37
virtual void onRibbonSchemaLoad_()=0
virtual ~RibbonSchemaLoadListener()=default
Definition MRRibbonSchema.h:131
virtual ~RibbonSchemaLoader()=default
MRVIEWER_API void sortFilesByOrder_(std::vector< std::filesystem::path > &files) const
static MRVIEWER_API void recalcItemSizes()
virtual MRVIEWER_API std::vector< std::filesystem::path > getStructureFiles_(const std::string &fileExtension) const
MRVIEWER_API void readUIJson_(const std::filesystem::path &path) const
MRVIEWER_API void readItemsJson_(const Json::Value &root) const
MRVIEWER_API void readItemsJson_(const std::filesystem::path &path) const
virtual MRVIEWER_API void loadSchema() const
MRVIEWER_API void readUIJson_(const Json::Value &root) const
static MRVIEWER_API void readMenuItemsList(const Json::Value &root, MenuItemsList &list)
RibbonSchemaLoader()=default
Definition MRCameraOrientationPlugin.h:8
std::vector< std::pair< std::string_view, float > > SplitCaptionInfo
Definition MRRibbonSchema.h:16
std::function< std::string(const std::shared_ptr< RibbonMenuItem > &)> RequirementsFunction
Definition MRViewerFwd.h:78
HashMap< std::string, MenuItemInfo > ItemMap
Definition MRRibbonSchema.h:46
std::vector< std::string > MenuItemsList
Definition MRRibbonMenuItem.h:9
HashMap< std::string, std::vector< std::string > > TabsGroupsMap
Definition MRRibbonSchema.h:47
TabsGroupsMap GroupsItemsMap
Definition MRRibbonSchema.h:48
phmap::flat_hash_map< K, V, Hash, Eq > HashMap
Definition MRMesh/MRMeshFwd.h:592
Definition MRRibbonSchema.h:19
SplitCaptionInfo splitInfo
Definition MRRibbonSchema.h:21
float baseSize
Definition MRRibbonSchema.h:20
Definition MRRibbonSchema.h:25
std::string caption
Definition MRRibbonSchema.h:27
std::string helpLink
Definition MRRibbonSchema.h:31
std::string icon
Definition MRRibbonSchema.h:29
std::shared_ptr< RibbonMenuItem > item
Definition MRRibbonSchema.h:26
std::string tooltip
Definition MRRibbonSchema.h:28
MenuItemCaptionSize captionSize
Definition MRRibbonSchema.h:30
tool search options
Definition MRRibbonSchema.h:111
ancillary struct to hold information for search result order
Definition MRRibbonSchema.h:102
struct to hold information for search result presentation
Definition MRRibbonSchema.h:95
Definition MRRibbonSchema.h:59
MRVIEWER_API void updateCaptions()
updates inner caption for all StateBasePlugins in schema
MRVIEWER_API void eliminateEmptyGroups()
deletes empty groups (and references on them from tabs)
MenuItemsList sceneButtonsList
Definition MRRibbonSchema.h:66
MenuItemsList defaultQuickAccessList
Definition MRRibbonSchema.h:64
TabsGroupsMap tabsMap
Definition MRRibbonSchema.h:61
GroupsItemsMap groupsMap
Definition MRRibbonSchema.h:62
std::vector< RibbonTab > tabsOrder
Definition MRRibbonSchema.h:60
MRVIEWER_API void sortTabsByPriority()
re-order items in tabsOrder according to their priority, the order of items having same priority is p...
ItemMap items
Definition MRRibbonSchema.h:63
MenuItemsList headerQuickAccessList
Definition MRRibbonSchema.h:65
Definition MRRibbonSchema.h:51
bool experimental
Definition MRRibbonSchema.h:54
int priority
Definition MRRibbonSchema.h:53
std::string name
Definition MRRibbonSchema.h:52