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()), mDockBar(new DockBar(Qt::Horizontal, button_orientation::horizontal, this)),
15  mLeftToolbar(new Toolbar()), mRightToolbar(new Toolbar()), mCurrentWidget(nullptr), mActionDetach(new QAction(this))
16  {
20 
21  setFocusPolicy(Qt::FocusPolicy::StrongFocus);
22 
23  mVerticalLayout->setContentsMargins(0, 0, 0, 0);
24  mVerticalLayout->setSpacing(0);
25 
26  mHorizontalLayout->setContentsMargins(0, 0, 0, 0);
27  mHorizontalLayout->setSpacing(0);
28 
29  mDockBar->setAutohide(false);
31  // mDockBar->setFixedHeight(24); // use settings
32 
33  // mToolbar->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
34  // mToolbar->setFixedHeight(24); // use settings
35 
37  mLeftToolbar->setIconSize(QSize(18, 18));
39  mRightToolbar->setIconSize(QSize(18, 18));
40 
41  // m_content_toolbar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
42  // m_container_toolbar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::MinimumExpanding);
43 
44  mActionDetach->setText("Detach");
45  mRightToolbar->addAction(mActionDetach);
46  mDockBar->setAnchor(this);
47 
48  setLayout(mVerticalLayout);
49  mVerticalLayout->addLayout(mHorizontalLayout);
50  mVerticalLayout->setAlignment(mHorizontalLayout, Qt::AlignTop);
51  mHorizontalLayout->addWidget(mDockBar);
52  mHorizontalLayout->addWidget(mLeftToolbar);
53  mHorizontalLayout->addWidget(mRightToolbar);
54 
55  hide();
56  }
57 
58  void TabWidget::add(ContentWidget* widget, int index)
59  {
60  widget->setAnchor(this);
61  mDockBar->addButton(widget, index);
62  if (mCurrentWidget == nullptr)
63  open(widget);
64  show();
65  }
66 
68  {
69  int index = mDockBar->index(widget);
70  if (index != -1)
71  {
72  mDockBar->removeButton(index);
73 
74  if (widget == mCurrentWidget)
75  {
76  widget->hide();
77  widget->setParent(nullptr);
78  mCurrentWidget = nullptr;
79  handleNoCurrentWidget(index);
80  }
81  widget->setAnchor(nullptr);
82  }
83  }
84 
86  {
87  int index = mDockBar->index(widget);
88  if (index != -1)
89  {
90  mDockBar->detachButton(widget);
91  ContentFrame* frame = new ContentFrame(widget, false, nullptr);
92  mDetachedFrames.append(frame);
93  frame->setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, frame->size(), qApp->desktop()->availableGeometry()));
94  frame->show();
95 
96  if (widget == mCurrentWidget)
97  {
98  mCurrentWidget = nullptr;
99  handleNoCurrentWidget(index);
100  }
101  }
102  }
103 
105  {
106  int index = mDockBar->index(widget);
107  if (index != -1)
108  {
109  if (mCurrentWidget == nullptr)
110  open(widget);
111  mDockBar->reattachButton(widget);
112  show();
113 
114  for (ContentFrame* frame : mDetachedFrames)
115  {
116  if (frame->content() == widget)
117  mDetachedFrames.removeOne(frame);
118  }
119  }
120  }
121 
123  {
124  int index = mDockBar->index(widget);
125  if (index == -1)
126  return;
127 
128  if (mCurrentWidget)
129  {
130  mCurrentWidget->hide();
131  mCurrentWidget->setParent(nullptr);
132  mDockBar->uncheckButton(mCurrentWidget);
133  }
134  mLeftToolbar->clear();
135  mVerticalLayout->addWidget(widget);
136  widget->show();
137  widget->setupToolbar(mLeftToolbar);
138  mDockBar->checkButton(widget);
139  mCurrentWidget = widget;
140 
141  for (QShortcut* r : mActiveShortcuts)
142  {
143  delete r;
144  }
145 
146  mActiveShortcuts.clear();
147 
148  for (QShortcut* s : widget->createShortcuts())
149  {
150  s->setParent(this);
151  s->setContext(Qt::WidgetWithChildrenShortcut);
152  s->setEnabled(true);
153  mActiveShortcuts.append(s);
154  }
155  }
156 
158  {
159  Q_UNUSED(widget)
160 
161  mDockBar->checkButton(mCurrentWidget);
162  }
163 
165  {
166  ContentWidget* widget = mDockBar->nextAvailableWidget(index);
167  if (widget)
168  open(widget);
169  else
170  {
171  hide();
172  mLeftToolbar->clear();
173  }
174  }
175 
176  //does not delete the widgets, just removes
178  {
179  for (int i = 0; i < mDockBar->count(); ++i)
180  {
181  ContentWidget* widget = mDockBar->widgetAt(0);
182  remove(widget);
183  }
184 
185  mDockBar->update();
186  }
187 
189  {
190  if (mCurrentWidget)
191  detach(mCurrentWidget);
192  }
193 
195  {
196  show();
197  }
198 
200  {
201  if (mDockBar->unused())
202  hide();
203  }
204 
205  int TabWidget::count() const
206  {
207  return mDockBar->count();
208  }
209 }
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)
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:429
void setAutohide(bool autohide)
Definition: dock_bar.cpp:258
void reattachButton(ContentWidget *widget)
Definition: dock_bar.cpp:414
void uncheckButton(ContentWidget *widget)
Definition: dock_bar.cpp:441
bool unused()
Definition: dock_bar.cpp:263
ContentWidget * nextAvailableWidget(int index)
Definition: dock_bar.cpp:460
void detachButton(ContentWidget *widget)
Definition: dock_bar.cpp:396
void addButton(ContentWidget *widget, int index)
Definition: dock_bar.cpp:343
ContentWidget * widgetAt(int index)
Definition: dock_bar.cpp:453
TabWidget(QWidget *parent=nullptr)
Definition: tab_widget.cpp:13
void detachCurrentWidget()
Definition: tab_widget.cpp:188
virtual void reattach(ContentWidget *widget)
Definition: tab_widget.cpp:104
void handleNoCurrentWidget(int index)
Definition: tab_widget.cpp:164
void handleDragStart()
Definition: tab_widget.cpp:194
virtual void detach(ContentWidget *widget)
Definition: tab_widget.cpp:85
virtual void add(ContentWidget *widget, int index=-1)
Definition: tab_widget.cpp:58
void handleDragEnd()
Definition: tab_widget.cpp:199
virtual void remove(ContentWidget *widget)
Definition: tab_widget.cpp:67
int count() const override
Definition: tab_widget.cpp:205
virtual void open(ContentWidget *widget)
Definition: tab_widget.cpp:122
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
button_orientation
Definition: dock_button.h:41
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
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()