PeriDyno 1.0.0
Loading...
Searching...
No Matches
Builder.cpp
Go to the documentation of this file.
1/*
2 TabToolbar - a small utility library for Qt, providing tabbed toolbars
3 Copyright (C) 2018 Oleksii Sierov
4
5 TabToolbar is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 TabToolbar is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public License
16 along with TabToolbar. If not, see <http://www.gnu.org/licenses/>.
17*/
18#include <QJsonDocument>
19#include <QJsonArray>
20#include <QJsonObject>
21#include <QJsonValue>
22#include <QFile>
23#include <QMap>
24#include <QByteArray>
25#include <functional>
26#include <stdexcept>
27
28#include "Builder.h"
29#include "TabToolbar.h"
30#include "Page.h"
31#include "Group.h"
32#include "SubGroup.h"
33
34using namespace tt;
35
36Builder::Builder(QWidget* parent) : QObject(parent)
37{
38}
39
40QWidget* Builder::operator[](const QString& widgetName) const
41{
42 return guiWidgets.value(widgetName, nullptr);
43}
44
45void Builder::SetCustomWidgetCreator(const QString& name, const std::function<QWidget*()>& creator)
46{
47 customWidgetCreators[name] = [creator](const QJsonObject&) { return creator(); };
48}
49
50void Builder::SetCustomWidgetCreator(const QString& name, const std::function<QWidget*(const QJsonObject&)>& creator)
51{
52 customWidgetCreators[name] = creator;
53}
54
55TabToolbar* Builder::CreateTabToolbar(const QString& configPath)
56{
57 const QList<QAction*>& actions = parent()->findChildren<QAction*>();
58 const QList<QMenu*>& menus = parent()->findChildren<QMenu*>();
59 QMap<QString, QAction*> actionsMap;
60 QMap<QString, QMenu*> menusMap;
61 for(QAction* action : actions)
62 actionsMap.insert(action->objectName(), action);
63 for(QMenu* menu : menus)
64 menusMap.insert(menu->objectName(), menu);
65
66 QFile configFile(configPath);
67 configFile.open(QIODevice::ReadOnly);
68 const QJsonDocument config(QJsonDocument::fromJson(configFile.readAll()));
69 const QJsonObject root = config.object();
70 const int groupHeight = root["groupHeight"].toInt();
71 const int groupRowCount = root["groupRowCount"].toInt();
72 const bool hasSpecialTab = root["specialTab"].toBool();
73 TabToolbar* tt = new TabToolbar((QWidget*)parent(), groupHeight, groupRowCount);
74
75 auto CreateCustomWidget = [this, tt](const QString& name, const QJsonObject& item)
76 {
77 if(!customWidgetCreators.contains(name))
78 throw std::logic_error(std::string("Unknown item type: ") + name.toStdString());
79 QWidget* w = customWidgetCreators[name](item);
80 if(item.contains("name"))
81 {
82 w->setObjectName(item["name"].toString());
83 guiWidgets[w->objectName()] = w;
84 }
85 w->setParent(tt);
86 return w;
87 };
88
89 auto CreateActionParams = [this, &actionsMap, &menusMap](const QJsonObject& obj)
90 {
92 const QString type = obj["type"].toString();
93 if(type == "delayedPopup")
94 params.type = QToolButton::DelayedPopup;
95 else if(type == "instantPopup")
96 params.type = QToolButton::InstantPopup;
97 else if(type == "menuButtonPopup")
98 params.type = QToolButton::MenuButtonPopup;
99 else
100 throw std::logic_error(std::string("Unknown toolbutton popup mode: ") + type.toStdString());
101
102 params.action = actionsMap[obj["name"].toString()];
103 params.menu = nullptr;
104 if(obj.contains("menu") && !obj["menu"].isNull())
105 params.menu = menusMap[obj["menu"].toString()];
106 return params;
107 };
108
109 const QJsonArray cornerActions = root["cornerActions"].toArray();
110 for(int i=0; i<cornerActions.size(); i++)
111 tt->AddCornerAction(actionsMap[cornerActions.at(i).toString()]);
112
113 const QJsonArray menusList = root["menus"].toArray();
114 for(int i=0; i<menusList.size(); i++)
115 {
116 const QJsonObject menuObject = menusList.at(i).toObject();
117 QMenu* menu = new QMenu((QWidget*)parent());
118 menu->setObjectName(menuObject["name"].toString());
119 menusMap[menu->objectName()] = menu;
120 guiWidgets[menu->objectName()] = menu;
121 const QJsonArray menuActions = menuObject["actions"].toArray();
122 for(int j=0; j<menuActions.size(); j++)
123 {
124 const QString actionName = menuActions.at(j).toString();
125 if(actionName == "separator")
126 menu->addSeparator();
127 else
128 menu->addActions({actionsMap[actionName]});
129 }
130 }
131
132 const QJsonArray tabs = root["tabs"].toArray();
133 for(int i=0; i<tabs.size(); i++)
134 {
135 const QJsonObject tab = tabs.at(i).toObject();
136 const QString pageDisplayName = tab["displayName"].toString();
137 const QString pageName = tab["name"].toString();
138 Page* page = tt->AddPage(pageDisplayName);
139 guiWidgets[pageName] = page;
140
141 const QJsonArray groups = tab["groups"].toArray();
142 for(int j=0; j<groups.size(); j++)
143 {
144 const QJsonObject groupObject = groups.at(j).toObject();
145 const QString groupDisplayName = groupObject["displayName"].toString();
146 const QString groupName = groupObject["name"].toString();
147 Group* group = page->AddGroup(groupDisplayName);
148 guiWidgets[groupName] = group;
149
150 const QJsonArray content = groupObject["content"].toArray();
151 for(int k=0; k<content.size(); k++)
152 {
153 const QJsonObject item = content.at(k).toObject();
154
155 static const QList<QString> defaultTypes = {"action", "subgroup", "separator"};
156 const QString itemType = item["itemType"].toString();
157 int type = defaultTypes.indexOf(itemType);
158 switch(type)
159 {
160 case 0: //action
161 {
162 SubGroup::ActionParams params = CreateActionParams(item);
163 group->AddAction(params.type, params.action, params.menu);
164 break;
165 }
166 case 1: //subgroup
167 {
169 if(!item["aligned"].toBool())
170 align = SubGroup::Align::No;
171 SubGroup* subGroup = group->AddSubGroup(align);
172 const QString subGroupName = item["name"].toString();
173 subGroup->setObjectName(subGroupName);
174 guiWidgets[subGroupName] = subGroup;
175
176 const QJsonArray subGroupContent = item["content"].toArray();
177 for(int w=0; w<subGroupContent.size(); w++)
178 {
179 const QJsonObject sgItem = subGroupContent.at(w).toObject();
180
181 static const QList<QString> defaultSgTypes = {"action", "horizontalActions"};
182 const QString sgItemType = sgItem["itemType"].toString();
183 int sgType = defaultSgTypes.indexOf(sgItemType);
184 switch(sgType)
185 {
186 case 0: //action
187 {
188 SubGroup::ActionParams params = CreateActionParams(sgItem);
189 subGroup->AddAction(params.type, params.action, params.menu);
190 break;
191 }
192 case 1: //horizontalActions
193 {
194 std::vector<SubGroup::ActionParams> horizActions;
195 const QJsonArray horizActionsArray = sgItem["actions"].toArray();
196 for(int x=0; x<horizActionsArray.size(); x++)
197 {
198 const QJsonObject horizAction = horizActionsArray.at(x).toObject();
199 horizActions.push_back(CreateActionParams(horizAction));
200 }
201 subGroup->AddHorizontalButtons(horizActions);
202 break;
203 }
204 default:
205 {
206 QWidget* w = CreateCustomWidget(sgItemType, sgItem);
207 subGroup->AddWidget(w);
208 break;
209 }
210 }
211 }
212 break;
213 }
214 case 2: //separator
215 group->AddSeparator();
216 break;
217 default: //custom widget
218 {
219 QWidget* w = CreateCustomWidget(itemType, item);
220 group->AddWidget(w);
221 break;
222 }
223 }
224 }
225 }
226 }
227
228 tt->SetSpecialTabEnabled(hasSpecialTab);
229 return tt;
230}
void SetCustomWidgetCreator(const QString &name, const std::function< QWidget *()> &creator)
Definition Builder.cpp:45
Builder(QWidget *parent)
Definition Builder.cpp:36
QMap< QString, QWidget * > guiWidgets
Definition Builder.h:50
QWidget * operator[](const QString &widgetName) const
Definition Builder.cpp:40
QMap< QString, std::function< QWidget *(const QJsonObject &)> > customWidgetCreators
Definition Builder.h:51
TabToolbar * CreateTabToolbar(const QString &configPath)
Definition Builder.cpp:55
void AddWidget(QWidget *widget)
Definition Group.cpp:147
SubGroup * AddSubGroup(SubGroup::Align align)
Definition Group.cpp:97
void AddSeparator()
Definition Group.cpp:118
void AddAction(QToolButton::ToolButtonPopupMode type, QAction *action, QMenu *menu=nullptr)
Definition Group.cpp:123
Group * AddGroup(const QString &name)
Definition Page.cpp:91
void AddWidget(QWidget *widget)
Definition SubGroup.cpp:68
void AddAction(QToolButton::ToolButtonPopupMode type, QAction *action, QMenu *menu=nullptr)
Definition SubGroup.cpp:48
void AddHorizontalButtons(const std::vector< ActionParams > &params)
Definition SubGroup.cpp:77
Definition Builder.h:33
QToolButton::ToolButtonPopupMode type
Definition SubGroup.h:50