HAL
tab_widget.cpp
Go to the documentation of this file.
5 #include <QApplication>
6 #include <QDebug>
7 #include <QDesktopWidget>
8 #include <QShortcut>
9 #include <QStyle>
10 
11 namespace hal
12 {
14  : Widget(parent), mVerticalLayout(new QVBoxLayout()), mHorizontalLayout(new QHBoxLayout()),
15  mLeftToolbar(new Toolbar()), mRightToolbar(new Toolbar()), mCurrentWidget(nullptr), mActionDetach(new QAction(this))
16  {
22 
23  setFocusPolicy(Qt::FocusPolicy::StrongFocus);
24 
25  mVerticalLayout->setContentsMargins(0, 0, 0, 0);
26  mVerticalLayout->setSpacing(0);
27 
28  mHorizontalLayout->setContentsMargins(0, 0, 0, 0);
29  mHorizontalLayout->setSpacing(0);
30 
31  mDockBar->setAutohide(false);
33  // mDockBar->setFixedHeight(24); // use settings
34 
35  // mToolbar->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
36  // mToolbar->setFixedHeight(24); // use settings
37 
39  mLeftToolbar->setIconSize(QSize(18, 18));
41  mRightToolbar->setIconSize(QSize(18, 18));
42 
43  // m_content_toolbar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
44  // m_container_toolbar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::MinimumExpanding);
45 
46  mActionDetach->setText("Detach");
47  mRightToolbar->addAction(mActionDetach);
48  mDockBar->setAnchor(this);
49 
50  setLayout(mVerticalLayout);
51  mVerticalLayout->addLayout(mHorizontalLayout);
52  mVerticalLayout->setAlignment(mHorizontalLayout, Qt::AlignTop);
53  mHorizontalLayout->addWidget(mDockBar);
54  mHorizontalLayout->addWidget(mLeftToolbar);
55  mHorizontalLayout->addWidget(mRightToolbar);
56 
57  hide();
58  }
59 
60  void TabWidget::add(ContentWidget* widget, int index)
61  {
62  widget->setAnchor(this);
63  mDockBar->addButton(widget, index);
64  if (mCurrentWidget == nullptr)
65  open(widget);
66  show();
67  }
68 
70  {
71  int index = mDockBar->index(widget);
72  if (index != -1)
73  {
74  mDockBar->removeButton(index);
75 
76  if (widget == mCurrentWidget)
77  {
78  widget->hide();
79  widget->setParent(nullptr);
80  mCurrentWidget = nullptr;
81  handleNoCurrentWidget(index);
82  }
83  widget->setAnchor(nullptr);
84  }
85  }
86 
88  {
89  int index = mDockBar->index(widget);
90  if (index != -1)
91  {
92  mDockBar->detachButton(widget);
93  ContentFrame* frame = new ContentFrame(widget, false, nullptr);
94  frame->setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, frame->size(), qApp->desktop()->availableGeometry()));
95  frame->show();
96 
97  if (widget == mCurrentWidget)
98  {
99  mCurrentWidget = nullptr;
100  handleNoCurrentWidget(index);
101  }
102  widget->setDetachedFrame(frame);
103  return frame;
104  }
105  return nullptr;
106  }
107 
109  {
110  int index = mDockBar->index(widget);
111  if (index != -1)
112  {
113  widget->setDetachedFrame(nullptr);
114  if (mCurrentWidget == nullptr)
115  open(widget);
116  mDockBar->reattachButton(widget);
117  show();
118  }
119  }
120 
122  {
123  int index = mDockBar->index(widget);
124  if (index == -1)
125  return;
126 
127  if (mCurrentWidget)
128  {
129  mCurrentWidget->hide();
130  mCurrentWidget->setParent(nullptr);
131  mDockBar->uncheckButton(mCurrentWidget);
132  }
133  mLeftToolbar->clear();
134  mVerticalLayout->addWidget(widget);
135  widget->show();
136  widget->setupToolbar(mLeftToolbar);
137  mDockBar->checkButton(widget);
138  mCurrentWidget = widget;
139 
140  for (QShortcut* r : mActiveShortcuts)
141  {
142  delete r;
143  }
144 
145  mActiveShortcuts.clear();
146 
147  for (QShortcut* s : widget->createShortcuts())
148  {
149  s->setParent(this);
150  s->setContext(Qt::WidgetWithChildrenShortcut);
151  s->setEnabled(true);
152  mActiveShortcuts.append(s);
153  }
154  }
155 
157  {
158  widget->setDetachedFrame(nullptr);
159  mDockBar->checkButton(mCurrentWidget);
160  }
161 
163  {
164  ContentWidget* widget = mDockBar->nextAvailableWidget(index);
165  if (widget)
166  open(widget);
167  else
168  {
169  hide();
170  mLeftToolbar->clear();
171  }
172  }
173 
174  //does not delete the widgets, just removes
176  {
177  for (int i = 0; i < mDockBar->count(); ++i)
178  {
179  ContentWidget* widget = mDockBar->widgetAt(0);
180  remove(widget);
181  }
182 
183  mDockBar->update();
184  }
185 
187  {
188  if (mCurrentWidget)
189  detach(mCurrentWidget);
190  }
191 
193  {
194  show();
195  }
196 
198  {
199  if (mDockBar->unused())
200  hide();
201  }
202 }
ContentLayout::Position mAnchorPosition
static ContentDragRelay * instance()
Wraps the ContentWidget class.
Definition: content_frame.h:45
Abstract class for Widgets within HAL's ContentArea.
virtual void setupToolbar(Toolbar *Toolbar)
void setAnchor(ContentAnchor *anchor)
void setDetachedFrame(ContentFrame *df)
virtual QList< QShortcut * > createShortcuts()
Contains and handles DockButtons.
Definition: dock_bar.h:48
bool removeButton(ContentWidget *widget)
Definition: dock_bar.cpp:359
void setAnchor(ContentAnchor *anchor)
Definition: dock_bar.cpp:253
int index(ContentWidget *widget)
Definition: dock_bar.cpp:284
void checkButton(ContentWidget *widget)
Definition: dock_bar.cpp:439
void setAutohide(bool autohide)
Definition: dock_bar.cpp:258
void reattachButton(ContentWidget *widget)
Definition: dock_bar.cpp:424
void uncheckButton(ContentWidget *widget)
Definition: dock_bar.cpp:451
bool unused()
Definition: dock_bar.cpp:263
ContentWidget * nextAvailableWidget(int index)
Definition: dock_bar.cpp:470
void detachButton(ContentWidget *widget)
Definition: dock_bar.cpp:406
void addButton(ContentWidget *widget, int index)
Definition: dock_bar.cpp:343
ContentWidget * widgetAt(int index)
Definition: dock_bar.cpp:463
TabWidget(QWidget *parent=nullptr)
Definition: tab_widget.cpp:13
void detachCurrentWidget()
Definition: tab_widget.cpp:186
virtual void reattach(ContentWidget *widget)
Definition: tab_widget.cpp:108
void handleNoCurrentWidget(int index)
Definition: tab_widget.cpp:162
void handleDragStart()
Definition: tab_widget.cpp:192
virtual ContentFrame * detach(ContentWidget *widget)
Definition: tab_widget.cpp:87
virtual void add(ContentWidget *widget, int index=-1)
Definition: tab_widget.cpp:60
void handleDragEnd()
Definition: tab_widget.cpp:197
virtual void remove(ContentWidget *widget)
Definition: tab_widget.cpp:69
virtual void open(ContentWidget *widget)
Definition: tab_widget.cpp:121
Toolbar for all ContentFrames and ContentWidgets.
Definition: toolbar.h:39
A QWidget customized for hal.
Definition: widget.h:41
void show()
Definition: widget.cpp:21
void setParent(QWidget *parent)
Definition: widget.cpp:9
void hide()
Definition: widget.cpp:15
void setText(const QString &text)
void triggered(bool checked)
void addLayout(QLayout *layout, int stretch)
void addWidget(QWidget *widget, int stretch, Qt::Alignment alignment)
void setSpacing(int spacing)
bool setAlignment(QWidget *w, Qt::Alignment alignment)
void setContentsMargins(int left, int top, int right, int bottom)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QRect alignedRect(Qt::LayoutDirection direction, Qt::Alignment alignment, const QSize &size, const QRect &rectangle)
AlignTop
LeftToRight
Horizontal
WidgetWithChildrenShortcut
QAction * addAction(const QString &text)
void clear()
void setIconSize(const QSize &iconSize)
bool close()
void setFocusPolicy(Qt::FocusPolicy policy)
void setGeometry(int x, int y, int w, int h)
void setLayout(QLayout *layout)
void show()
void setSizePolicy(QSizePolicy)
void update()