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 
37 namespace 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
armarx::ArmarXMainWindow
The ArmarXMainWindow class.
Definition: ArmarXMainWindow.h:76
armarx::StatusDockWidgetTitleBar::event
bool event(QEvent *event) override
Definition: TitlebarWidget.cpp:169
WidgetNameDialog.h
armarx::StatusDockWidgetTitleBar::StatusDockWidgetTitleBar
StatusDockWidgetTitleBar(QWidget *parent=0, ArmarXMainWindow *mainWindow=0)
Definition: TitlebarWidget.cpp:39
armarx::StatusDockWidgetTitleBar::addCustomWidget
void addCustomWidget(QWidget *widget)
Definition: TitlebarWidget.cpp:102
armarx::StatusDockWidgetTitleBar::changeStatus
void changeStatus(ManagedIceObjectState state, QStringList dependencies)
Definition: TitlebarWidget.cpp:184
armarx::StatusDockWidgetTitleBar::changeFloatingStatus
void changeFloatingStatus()
Definition: TitlebarWidget.cpp:176
ArmarXMainWindow.h
armarx::WidgetNameDialog
The WidgetNameDialog class.
Definition: WidgetNameDialog.h:41
armarx::WidgetNameDialog::getWidgetName
QString getWidgetName() const
Definition: WidgetNameDialog.cpp:57
armarx::StatusDockWidgetTitleBar::minimumSizeHint
QSize minimumSizeHint() const override
Definition: TitlebarWidget.cpp:143
TitlebarWidget.h
armarx::StatusDockWidgetTitleBar::openChangeTitleDialog
void openChangeTitleDialog(bool)
Definition: TitlebarWidget.cpp:271
armarx::StatusDockWidgetTitleBar::sizeHint
QSize sizeHint() const override
Definition: TitlebarWidget.cpp:118
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27