TitlebarWidget.cpp
Go to the documentation of this file.
1/*
2* This file is part of ArmarX.
3*
4* ArmarX is free software; you can redistribute it and/or modify
5* it under the terms of the GNU General Public License version 2 as
6* published by the Free Software Foundation.
7*
8* ArmarX is distributed in the hope that it will be useful, but
9* WITHOUT ANY WARRANTY; without even the implied warranty of
10* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11* GNU General Public License for more details.
12*
13* You should have received a copy of the GNU General Public License
14* along with this program. If not, see <http://www.gnu.org/licenses/>.
15*
16* @package ArmarX::
17* @author Mirko Waechter ( mirko.waechter at kit dot edu)
18* @date 2012
19* @copyright http://www.gnu.org/licenses/gpl-2.0.txt
20* GNU General Public License
21*/
22
23#include "TitlebarWidget.h"
24
25#include <QDockWidget>
26#include <QEvent>
27#include <QGridLayout>
28#include <QLabel>
29#include <QSpacerItem>
30#include <QToolBar>
31#include <QToolButton>
32
34
35#include "WidgetNameDialog.h"
36
37namespace armarx
38{
40 ArmarXMainWindow* mainWindow) :
41 QWidget(parent),
42 mainWindow(mainWindow),
43 imageOffline(QPixmap::fromImage(QImage(QString::fromUtf8(":/icons/network-offline.png")))),
44 imageIdle(QPixmap::fromImage(QImage(QString::fromUtf8(":/icons/network-idle.png"))))
45 {
46
47 this->setContentsMargins(1, 1, 1, 1);
48 dockWidget = qobject_cast<QDockWidget*>(parentWidget());
49 layout = new QGridLayout(this);
50 layout->setMargin(2);
51 layout->setSpacing(2);
52 layout->setContentsMargins(-1, 0, -1, 0);
53
54 statusIcon = new QLabel(this);
55 statusIcon->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
56 layout->addWidget(statusIcon, 0, 0);
57
58
59 title = new QLabel(dockWidget->windowTitle(), this);
60 layout->addWidget(title, 0, 1);
61
62 editTitleBar = new QToolBar(this);
63 editTitleBar->setIconSize(QSize(16, 16));
64 QIcon icon3;
65 icon3.addFile(QString::fromUtf8(":/icons/accessories-text-editor-6.ico"), QSize(16, 16));
66 QAction* editTitleAction = editTitleBar->addAction(icon3, "");
67 editTitleAction->setToolTip("Change the name of this widget instance");
68 connect(editTitleAction, SIGNAL(triggered(bool)), this, SLOT(openChangeTitleDialog(bool)));
69
70 layout->addWidget(editTitleBar, 0, 2);
71
72 QSpacerItem* spacer =
73 new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Expanding);
74 layout->addItem(spacer, 0, 4);
75
76
77 undockButton = new QToolButton(this);
78 undockButton->setObjectName(QString::fromUtf8("undockButton"));
79 QIcon icon2;
80 icon2.addFile(QString::fromUtf8(":/icons/tab-detach.svg"), QSize(10, 10));
81 undockButton->setIcon(icon2);
82 undockButton->setIconSize(QSize(10, 10));
83 // undockButton->setCheckable(true);
84 undockButton->setToolTip("Toggle the floating status of the widget");
85 layout->addWidget(undockButton, 0, 5);
86 closeButton = new QToolButton(this);
87 closeButton->setObjectName(QString::fromUtf8("btnClose"));
88 QIcon icon1;
89 icon1.addFile(QString::fromUtf8(":/icons/dialog-close.ico"), QSize(8, 8));
90 closeButton->setIcon(icon1);
91 closeButton->setIconSize(QSize(10, 10));
92 closeButton->setToolTip("Close the widget");
93
94 layout->addWidget(closeButton, 0, 6);
95
96
97 connect(closeButton, SIGNAL(clicked()), dockWidget, SLOT(close()));
98 connect(undockButton, SIGNAL(clicked()), this, SLOT(changeFloatingStatus()));
99 }
100
101 void
103 {
104 if (!widget)
105 {
106 return;
107 }
108
109 if (!widget->parent())
110 {
111 widget->setParent(this);
112 }
113
114 layout->addWidget(widget, 0, 3);
115 }
116
117 QSize
119 {
120 QDockWidget* dockWidget = qobject_cast<QDockWidget*>(parentWidget());
121 QSize size;
122 // size = dockWidget->size();
123 size.setHeight(0);
124 size.setWidth(0);
125
126
127 if (dockWidget->features() & QDockWidget::DockWidgetVerticalTitleBar)
128 {
129 // I need to be vertical
130 size.setHeight(title->minimumWidth() + 30);
131 size.setWidth(34);
132 }
133 else
134 {
135 // I need to be horizontal
136 return layout->sizeHint();
137 }
138
139 return size;
140 }
141
142 QSize
144 {
145 QDockWidget* dockWidget = qobject_cast<QDockWidget*>(parentWidget());
146 QSize size;
147
148 size.setHeight(0);
149
150 if (dockWidget->features() & QDockWidget::DockWidgetVerticalTitleBar)
151 {
152 // I need to be vertical
153 size.setHeight(layout->minimumSize().height());
154
155 size.setWidth(30);
156 }
157 else
158 {
159 // I need to be horizontal
160 size.setHeight(30);
161
162 size.setWidth(layout->minimumSize().width());
163 }
164
165 return size;
166 }
167
168 bool
170 {
171 event->ignore();
172 return false;
173 }
174
175 void
177 {
178 QDockWidget* dockWidget = qobject_cast<QDockWidget*>(parentWidget());
179 // undockButton->setChecked(!dockWidget->isFloating());
180 dockWidget->setFloating(!dockWidget->isFloating());
181 }
182
183 void
184 StatusDockWidgetTitleBar::changeStatus(ManagedIceObjectState state, QStringList dependencies)
185 {
186 auto setTextColor = [this](QString color)
187 { title->setStyleSheet("QLabel { color : " + color + "; }"); };
188 setTextColor("black");
189 QDockWidget* dockWidget = qobject_cast<QDockWidget*>(parentWidget());
190 title->setText(dockWidget->windowTitle());
191 switch (state)
192 {
193 case eManagedIceObjectCreated:
194 statusIcon->setToolTip("Component created");
195 break;
196
197 case eManagedIceObjectInitializing:
198 statusIcon->setToolTip("Component initializing");
199 setTextColor("yellow");
200 break;
201
202 case eManagedIceObjectInitialized:
203 if (dependencies.length() > 0)
204 {
205 QString waitingFor = "Component initialized & waiting for dependencies: " +
206 dependencies.join(", ");
207 statusIcon->setToolTip(waitingFor);
208 title->setToolTip(waitingFor);
209 title->setText(dockWidget->windowTitle() + " waiting for " +
210 dependencies.at(0) + (dependencies.length() > 1 ? " ..." : ""));
211 setTextColor("red");
212 }
213 else
214 {
215 setTextColor("black");
216 statusIcon->setToolTip("Component initialized");
217 }
218
219 break;
220
221 case eManagedIceObjectExited:
222 statusIcon->setToolTip("Component exited");
223 break;
224
225 case eManagedIceObjectExiting:
226 statusIcon->setToolTip("Component exiting");
227 break;
228
229 case eManagedIceObjectStarting:
230 statusIcon->setToolTip("Component starting");
231 setTextColor("yellow");
232
233 break;
234
235 case eManagedIceObjectStarted:
236 if (dependencies.length() > 0)
237 {
238 QString connectedTo =
239 "Component started & connected to " + dependencies.join(", ");
240 statusIcon->setToolTip(connectedTo);
241 title->setToolTip(connectedTo);
242 }
243 else
244 {
245 statusIcon->setToolTip("Component started");
246 }
247
248 break;
249
250 default:
251 break;
252 }
253
254 switch (state)
255 {
256 case eManagedIceObjectStarted:
257 {
258 statusIcon->setPixmap(imageIdle);
259 }
260 break;
261
262 default:
263 {
264 statusIcon->setPixmap(imageOffline);
265 }
266 break;
267 }
268 }
269
270 void
272 {
273 WidgetNameDialog d(dockWidget->objectName(), mainWindow);
274
275 if (d.exec() == QDialog::Accepted)
276 {
277 dockWidget->setWindowTitle(d.getWidgetName());
278 dockWidget->setObjectName(d.getWidgetName());
279 title->setText(d.getWidgetName());
280 }
281 }
282} // namespace armarx
The ArmarXMainWindow class.
QSize minimumSizeHint() const override
void changeStatus(ManagedIceObjectState state, QStringList dependencies)
bool event(QEvent *event) override
StatusDockWidgetTitleBar(QWidget *parent=0, ArmarXMainWindow *mainWindow=0)
void addCustomWidget(QWidget *widget)
The WidgetNameDialog class.
This file offers overloads of toIce() and fromIce() functions for STL container types.