PeriDyno 1.0.0
Loading...
Searching...
No Matches
Group.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 <QHBoxLayout>
19#include <QVBoxLayout>
20#include <QLabel>
21#include <QToolButton>
22#include <QMenu>
23#include <QAction>
24#include <QSize>
25#include <QApplication>
26#include <QStyle>
27#include <QPainter>
28#include <QProxyStyle>
29#include <QScreen>
30#include <QStyleOptionToolButton>
31
32#include "Group.h"
33#include "Styles.h"
34#include "StyleTools.h"
35#include "SubGroup.h"
36#include "TabToolbar.h"
37#include "CompactToolButton.h"
38#include "ToolButtonStyle.h"
39#include <stdexcept>
40
41using namespace tt;
42
43Group::Group(const QString& name, QWidget* parent) : QFrame(parent)
44{
45 setFrameShape(NoFrame);
46 setLineWidth(0);
47 setContentsMargins(0, 0, 0, 0);
48 setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
49
50 QHBoxLayout* separatorLayout = new QHBoxLayout(this);
51 separatorLayout->setContentsMargins(0, 0, 0, 0);
52 separatorLayout->setSpacing(0);
53 separatorLayout->setDirection(QBoxLayout::LeftToRight);
54 setLayout(separatorLayout);
55
56 QVBoxLayout* outerLayout = new QVBoxLayout();
57 outerLayout->setContentsMargins(0, 0, 0, 0);
58 outerLayout->setSpacing(0);
59 outerLayout->setDirection(QBoxLayout::TopToBottom);
60 separatorLayout->addLayout(outerLayout);
61 separatorLayout->addWidget(CreateSeparator());
62
63 QFrame* innerFrame = new QFrame(this);
64 innerFrame->setFrameShape(NoFrame);
65 innerFrame->setLineWidth(0);
66 innerFrame->setContentsMargins(0, 0, 0, 0);
67 innerFrame->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);
68
69 innerLayout = new QHBoxLayout(innerFrame);
70 innerLayout->setContentsMargins(2, 4, 2, 0);
71 innerLayout->setSpacing(4);
72 innerLayout->setDirection(QBoxLayout::LeftToRight);
73 innerFrame->setLayout(innerLayout);
74
75 outerLayout->addWidget(innerFrame);
76
77 QLabel* groupName = new QLabel(name, this);
78 groupName->setProperty("TTGroupName", QVariant(true));
79 groupName->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
80 groupName->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
81 //groupName->adjustSize();
82 groupName->setFixedHeight(12);
83
84 outerLayout->addWidget(groupName);
85
86 const auto* parentTT = _FindTabToolbarParent(*this);
87 if (!parentTT)
88 throw std::runtime_error("Group should be constructed inside TabToolbar!");
89
90 unsigned groupMaxHeight = parentTT->GroupMaxHeight();
91 unsigned rowCount = parentTT->RowCount();
92 const unsigned height = groupMaxHeight + groupName->height() + rowCount - 1;
93 setMinimumHeight(height);
94 setMaximumHeight(height);
95}
96
98{
99 SubGroup* sgrp = new SubGroup(align, this);
100 innerLayout->addWidget(sgrp);
101 return sgrp;
102}
103
105{
106 QFrame* separator = new QFrame(this);
107 separator->setObjectName("Separator");
108 separator->setProperty("TTSeparator", QVariant(true));
109 separator->setAutoFillBackground(false);
110 separator->setFrameShadow(QFrame::Plain);
111 separator->setLineWidth(1);
112 separator->setMidLineWidth(0);
113 separator->setFixedWidth(1);
114 separator->setFrameShape(QFrame::VLine);
115 return separator;
116}
117
119{
120 innerLayout->addWidget(CreateSeparator());
121}
122
123void Group::AddAction(QToolButton::ToolButtonPopupMode type, QAction* action, QMenu* menu)
124{
125 if(type == QToolButton::MenuButtonPopup)
126 {
127 innerLayout->addWidget(new CompactToolButton(action, menu, this));
128 }
129 else
130 {
131 const int iconSize = GetPixelMetric(QStyle::PM_LargeIconSize) * GetScaleFactor(*this);
132 QToolButton* btn = new QToolButton(this);
133 btn->setProperty("TTInternal", QVariant(true));
134 btn->setAutoRaise(true);
135 btn->setDefaultAction(action);
136 btn->setIconSize(QSize(iconSize, iconSize));
137 btn->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);
138 btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
139 btn->setPopupMode(type);
140 //btn->setStyle(new TTToolButtonStyle());
141 if(menu)
142 btn->setMenu(menu);
143 innerLayout->addWidget(btn);
144 }
145}
146
147void Group::AddWidget(QWidget* widget)
148{
149 widget->setParent(this);
150 widget->setProperty("TTInternal", QVariant(true));
151 innerLayout->addWidget(widget);
152}
void AddWidget(QWidget *widget)
Definition Group.cpp:147
SubGroup * AddSubGroup(SubGroup::Align align)
Definition Group.cpp:97
void AddSeparator()
Definition Group.cpp:118
Group(const QString &name, QWidget *parent=nullptr)
Definition Group.cpp:43
QFrame * CreateSeparator()
Definition Group.cpp:104
QHBoxLayout * innerLayout
Definition Group.h:49
void AddAction(QToolButton::ToolButtonPopupMode type, QAction *action, QMenu *menu=nullptr)
Definition Group.cpp:123
Definition Builder.h:33
int GetPixelMetric(QStyle::PixelMetric metric)
float GetScaleFactor(const QWidget &widget)
TabToolbar * _FindTabToolbarParent(QWidget &startingWidget)