PeriDyno 1.0.0
Loading...
Searching...
No Matches
SubGroup.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 <QMenu>
19#include <QAction>
20#include <QSize>
21#include <QScreen>
22#include <QSpacerItem>
23
24#include "Styles.h"
25#include "StyleTools.h"
26#include "SubGroup.h"
27#include "TabToolbar.h"
28#include <stdexcept>
29
30using namespace tt;
31
32SubGroup::SubGroup(Align align, QWidget* parent) : QFrame(parent)
33{
34 setFrameShape(NoFrame);
35 setLineWidth(0);
36 setContentsMargins(0, 0, 0, 0);
37 setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
38
39 innerLayout = new QVBoxLayout(this);
40 innerLayout->setContentsMargins(0, 0, 0, 0);
41 innerLayout->setSpacing(1);
42 innerLayout->setDirection(QBoxLayout::TopToBottom);
43 QSpacerItem* spacer = new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, (align == Align::Yes ? QSizePolicy::Expanding : QSizePolicy::Ignored));
44 innerLayout->addItem(spacer);
45 setLayout(innerLayout);
46}
47
48void SubGroup::AddAction(QToolButton::ToolButtonPopupMode type, QAction* action, QMenu* menu)
49{
50 const int iconSize = GetPixelMetric(QStyle::PM_SmallIconSize) * GetScaleFactor(*this);
51 QFrame* frame = ConstructInnerFrame(0);
52
53 QToolButton* btn = new QToolButton(this);
54 btn->setProperty("TTInternal", QVariant(true));
55 btn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
56 btn->setAutoRaise(true);
57 btn->setDefaultAction(action);
58 btn->setPopupMode(type);
59 btn->setIconSize(QSize(iconSize, iconSize));
60 if(menu)
61 btn->setMenu(menu);
62 btn->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
63
64 frame->layout()->addWidget(btn);
65 innerLayout->insertWidget(innerLayout->count()-1, frame);
66}
67
68void SubGroup::AddWidget(QWidget* widget)
69{
70 QFrame* frame = ConstructInnerFrame(4);
71 widget->setParent(frame);
72 widget->setProperty("TTInternal", QVariant(true));
73 frame->layout()->addWidget(widget);
74 innerLayout->insertWidget(innerLayout->count()-1, frame);
75}
76
77void SubGroup::AddHorizontalButtons(const std::vector<ActionParams>& params)
78{
79 const int iconSize = GetPixelMetric(QStyle::PM_SmallIconSize) * GetScaleFactor(*this);
80 QFrame* frame = ConstructInnerFrame(0);
81 frame->setProperty("TTHorizontalFrame", QVariant(true));
82
83 for(auto& param : params)
84 {
85 QToolButton* btn = new QToolButton(this);
86 btn->setProperty("TTInternal", QVariant(true));
87 btn->setToolButtonStyle(Qt::ToolButtonIconOnly);
88 btn->setAutoRaise(true);
89 btn->setDefaultAction(param.action);
90 btn->setPopupMode(param.type);
91 btn->setIconSize(QSize(iconSize, iconSize));
92 if(param.menu)
93 btn->setMenu(param.menu);
94 btn->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
95 frame->layout()->addWidget(btn);
96 }
97
98 innerLayout->insertWidget(innerLayout->count()-1, frame);
99}
100
102{
103
104 const auto* parentTT = _FindTabToolbarParent(*this);
105 if (!parentTT)
106 throw std::runtime_error("Group should be constructed inside TabToolbar!");
107
108 unsigned groupMaxHeight = parentTT->GroupMaxHeight();
109 unsigned rowCount = parentTT->RowCount();
110
111 QFrame* frame = new QFrame(this);
112 frame->setFrameShape(QFrame::NoFrame);
113 frame->setLineWidth(0);
114 frame->setContentsMargins(0, 0, 0, 0);
115 QSizePolicy policy(QSizePolicy::Maximum, QSizePolicy::Preferred);
116 policy.setHorizontalStretch(0);
117 policy.setVerticalStretch(1);
118 frame->setSizePolicy(policy);
119 frame->setMaximumHeight(groupMaxHeight / rowCount);
120 QHBoxLayout* l = new QHBoxLayout(frame);
121 l->setContentsMargins(0, 0, 0, 0);
122 l->setSpacing(spacing);
123 l->setDirection(QBoxLayout::LeftToRight);
124 frame->setLayout(l);
125 QSpacerItem* spacer = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
126 l->addItem(spacer);
127 return frame;
128}
QVBoxLayout * innerLayout
Definition SubGroup.h:64
void AddWidget(QWidget *widget)
Definition SubGroup.cpp:68
void AddAction(QToolButton::ToolButtonPopupMode type, QAction *action, QMenu *menu=nullptr)
Definition SubGroup.cpp:48
SubGroup(Align align, QWidget *parent=nullptr)
Definition SubGroup.cpp:32
void AddHorizontalButtons(const std::vector< ActionParams > &params)
Definition SubGroup.cpp:77
QFrame * ConstructInnerFrame(int spacing)
Definition SubGroup.cpp:101
Definition Builder.h:33
int GetPixelMetric(QStyle::PixelMetric metric)
float GetScaleFactor(const QWidget &widget)
TabToolbar * _FindTabToolbarParent(QWidget &startingWidget)