rock_widget_collection  0.1
MultiViewWidget.cc
Go to the documentation of this file.
1 /*
2  * File: MuliViewWidget.cc
3  * Author: blueck
4  *
5  * Created on 10. Februar 2011, 14:14
6  */
7 
8 #include <QtCore/qhash.h>
9 #include <QtGui/qmenubar.h>
10 #include <QtGui/qbuttongroup.h>
11 #include <QtGui/qboxlayout.h>
12 #include <QtGui/qstackedwidget.h>
13 #include <QtCore/qmetaobject.h>
14 #include <QtCore/qcoreevent.h>
15 #include <QtGui/qtooltip.h>
16 
17 #include "MultiViewWidget.h"
18 #include "MultiViewPlugin.h"
19 
20 
21 #include <typeinfo>
22 
23 
24 MultiViewWidget::MultiViewWidget(QWidget* parent) : QWidget(parent)
25 {
26  initialized = false;
27  currentWidget = NULL;
28  pseudoWidget = NULL;
29  designerMode = false;
30  clicking = false;
32  thumbnailWidth = 150;
33  thumbnailHeight = 150;
34 
35 
36  top = new QHBoxLayout();
37  bottom = new QHBoxLayout();
38  left = new QVBoxLayout();
39  mid = new QVBoxLayout();
40  right = new QVBoxLayout();
41  setLayout(&layout);
42  initialized=true;
43 
44 
45  layout.update();
46  layout.activate();
47 
48 }
49 
51 {
52 }
53 
54 
56  int midStart = 1;
57  int centerWidth = 3;
58 
59  if(top->count() == 0){
60  layout.removeItem(top);
61  midStart-=1;
62  }else{
63  centerWidth++;
64  layout.addLayout(top,0,0,1,3);
65  }
66 
67 
68  if(right->count() > 0){
69  centerWidth--;
70  layout.removeItem(right);
71  layout.addLayout(right,midStart,2,1,1);
72  }else{
73  layout.removeItem(right);
74  }
75 
76  if(left->count() > 0){
77  layout.removeItem(mid);
78  centerWidth--;
79  layout.addLayout(left,midStart,0,1,1);
80  layout.addLayout(mid,midStart,1,1,centerWidth);
81  }else{
82  layout.removeItem(left);
83  layout.removeItem(mid);
84  layout.addLayout(mid,midStart,0,1,centerWidth);
85  }
86 
87 
88  if(bottom->count() > 0){
89  layout.addLayout(bottom,midStart+1,0,1,3);
90  }else{
91  layout.removeItem(bottom);
92  }
93  layout.update();
94 }
95 
96 void MultiViewWidget::setThumbnailSize(int width, int height)
97 {
98  thumbnailWidth = width;
99  thumbnailHeight = height;
100 }
101 
103 {
104  QList<QString> keys = widgets.keys();
105  for(int i=0;i<keys.size();i++)
106  {
107  WidgetButton* button = widgets[keys[i]];
108  if(button->getWidget() == widget)
109  {
110  return button;
111  }
112  }
113  return NULL;
114 }
115 
116 void MultiViewWidget::addWidget(const QString &name, QWidget* widget_, const QIcon &icon, bool useOnlyIcon, int position)
117 {
118  QWidget *widget = widget_;
119 
120 #if 0 //Not possible because ruby qt don't initialize all components as QWidget so we have no chance to get the right obect at this point
121  //Try cast the QT way
122  MultiWidget *w = qobject_cast<MultiWidget*>(widget_);
123  if(w){
124  widget= w;
125  printf("Cast sucsessful\n");
126  }else{
127  //MultiWidget *bla = (MultiWidget*) widget_;
128  printf("ARGHHHH: %s Name: %s \n",typeid(widget).name(),widget->objectName().toStdString().c_str());
129 
130  printf("QT Means: %s\n",widget->metaObject()->className());
131  const QMetaObject *o = widget->metaObject();
132  for(int i=0; i<o->methodCount(); i++){
133  printf("Method found: %s\n",o->method(i).signature());
134  }
135  printf("\n\n");
136  //printf("Got one: %s \n",bla->getMinimizedLabel().toStdString().c_str());
137  //printf("Cast failed\n");
138  }
139 #endif
140 
141 
142  if(widgets.contains(name))
143  {
144  std::cerr << "A Widget with the name: [" << name.toStdString() << "] already exists!" << std::endl;
145  return;
146  }
147  WidgetButton* widgetButton=0;
148 
149  switch(position){
150  case WidgetButton::Left:
151  case WidgetButton::Right:
152  widgetButton = new WidgetButton(0,Qt::Vertical,thumbnailWidth, thumbnailHeight);
153  break;
154  case WidgetButton::Top:
156  default:
157  widgetButton = new WidgetButton(0,Qt::Horizontal,thumbnailWidth, thumbnailHeight);
158  break;
159  }
160 
161  //widgetButton->setFixedSize(thumbnailWidth, thumbnailHeight);
162  widgetButton->setIconAlternative(icon, useOnlyIcon);
163 
164 
165  // show the widget if its the only one
166  if(widgets.size() == 0)
167  {
168  widgetButton->setWidget(name, widget, false);
169  widgets.insert(name, widgetButton);
170  mid->addWidget(widget);
171  currentWidget = widgetButton;
172  }
173  else
174  {
175  widgetButton->setWidget(name, widget);
176  }
177 
178  widgets.insert(name, widgetButton);
179  //left->addWidget(widgetButton);
180 
181 
182  if(position != WidgetButton::Default){
183  switch(position){
184  case WidgetButton::Left:
185  left->addWidget(widgetButton);
186  break;
187  case WidgetButton::Right:
188  right->addWidget(widgetButton);
189  break;
190  case WidgetButton::Top:
191  top->addWidget(widgetButton);
192  break;
194  bottom->addWidget(widgetButton);
195  break;
196  }
197  }else{
198  switch(currentWidget->getPosition())
199  {
200  case WidgetButton::Left:
201  left->addWidget(widgetButton);
202  break;
203  case WidgetButton::Right:
204  right->addWidget(widgetButton);
205  break;
207  bottom->addWidget(widgetButton);
208  break;
209  case WidgetButton::Top:
210  top->addWidget(widgetButton);
211  break;
212  }
213  }
214 
215  connect(widgetButton, SIGNAL(clicked()), this, SLOT(widgetClicked()));
216  emit widgetButtonAdded(widgetButton);
217  updateView();
218 
219  timer.setSingleShot(true);
220  timer.start(500);
221  connect(&timer,SIGNAL(timeout()),this,SLOT(fixStatus()));
222 }
223 
225  QList<WidgetButton*> list = getAllWidgetButtons();
226  for(int i=0;i<list.size();i++){
227  if(list[i] == currentWidget){
228  list[i]->setActive(true);
229  }else{
230  list[i]->setActive(false);
231  }
232  list[i]->corrcetName();
233  }
234 }
235 
236 
237 QWidget* MultiViewWidget::getWidget(const QString& name)
238 {
239  return widgets.value(name)->getWidget();
240 }
241 
242 void MultiViewWidget::deleteWidget(const QString& name)
243 {
244  if(widgets.contains(name))
245  {
246  WidgetButton* button = widgets[name];
247  widgets.remove(name);
248  QWidget* widget = button->getWidget();
249  layout.removeWidget(widget);
250  mid->removeWidget(button);
251  top->removeWidget(button);
252  left->removeWidget(button);
253  right->removeWidget(button);
254  bottom->removeWidget(button);
255  delete button;
256  }
257  updateView();
258 }
259 
261 {
262  if(event->type() == QEvent::ToolTip)
263  {
264  QToolTip::hideText();
265  event->ignore();
266  return true;
267  }
268  return QWidget::event(event);
269 }
270 
272 {
273  //QWidget::childEvent(event);
274  if(initialized)
275  {
276 
277  if(event->type() == QChildEvent::ChildAdded)
278  {
279  if(!clicking)
280  {
281  if(event->child()->isWidgetType())
282  {
283  // we never need to watch adding of widgetbuttons, then everything went well already
284  WidgetButton* testButton = dynamic_cast<WidgetButton*> (event->child());
285  if(testButton != NULL)
286  {
287  return;
288  }
289  // we never want to add a widget which is already added
290  QWidget* child = (QWidget*)event->child();
291  if(child->windowTitle().isEmpty())
292  addWidget(QString::number(currentWidgetIndex), child);
293  else
294  addWidget(child->windowTitle(), child);
296  }
297  }
298  }
299  else if(event->type() == QChildEvent::ChildRemoved)
300  {
301  if(!clicking)
302  {
303  if(event->child()->isWidgetType())
304  {
305  // look which widget was removed and remove the button also
306  QWidget* child = (QWidget*)event->child();
307  QList<QString> keys = widgets.keys();
308  for(int i=0;i<keys.size();i++)
309  {
310  WidgetButton* button = widgets[keys[i]];
311  if(button->getWidget() == child)
312  {
313  widgets.remove(keys[i]);
314  QWidget* widget = button->getWidget();
315  layout.removeWidget(widget);
316  mid->removeWidget(button);
317  left->removeWidget(button);
318  right->removeWidget(button);
319  bottom->removeWidget(button);
320  top->removeWidget(button);
321  widget = NULL;
322  return;
323  }
324  }
325  }
326  }
327  }
328  }
329 }
330 
332 {
333  return widgets.values();
334 }
335 
337 {
338  clicking = true;
339 
340  WidgetButton *sender = dynamic_cast<WidgetButton*>(QObject::sender());
341  if(sender <= 0){
342  fprintf(stderr,"FATAL: Cannot Handle unknown Widget %s:%i\n",__FILE__,__LINE__);
343  return;
344  }
345 
346  //sender->printStatus();
347  sender->showWidget(false);
348  QWidget* widget = sender->getWidget();
349 /*
350  if(designerMode)
351  {
352  QList<WidgetButton*> buttons = getAllWidgetButtons();
353  for(int i=0;i<buttons.size();i++)
354  {
355  if(sender != buttons[i])
356  {
357  buttons[i]->getWidget()->setMaximumSize(0, 0);
358  }
359  else
360  {
361  buttons[i]->getWidget()->setMaximumSize(1000000, 1000000);
362  }
363 
364  }
365  }
366  */
367  widget->setEnabled(true);
368 
369  currentWidget->setActive(false);
370  sender->setActive(true);
371 
372  mid->removeWidget(currentWidget->getWidget());
373  mid->addWidget(widget);
374 
375  currentWidget = sender;
376  QList<QString> keys = widgets.keys();
377  for(int i=0;i<keys.size();i++)
378  {
379  WidgetButton* button = widgets.value(keys[i]);
380  if(button != sender)
381  {
382  button->showWidget(true);
383  }
384  }
385 
386  /*
387  // try to be stupid and use an arbitary large number
388  // this is NOT a good solution, if you've got a better one....
389  if(currentWidget->getWidget()->maximumHeight() < 1000000 || currentWidget->getWidget()->maximumWidth() < 1000000)
390  {
391  // no breaks in left and right are ON PURPOSE
392  switch(currentWidget->getPosition())
393  {
394  case WidgetButton::Left:
395  {
396  center.setColumnStretch(3, 10);
397  }
398  case WidgetButton::Right:
399  {
400  layout.setColumnStretch(0, 10);
401  }
402  case WidgetButton::Top:
403  {
404  layout.setRowStretch(3, 10);
405  break;
406  }
407  case WidgetButton::Bottom:
408  {
409  layout.setRowStretch(0, 10);
410  break;
411  }
412  }
413  }
414  else
415  {
416  switch(currentWidget->getPosition())
417  {
418  case WidgetButton::Left:
419  {
420  layout.setColumnStretch(3, 0);
421  }
422  case WidgetButton::Right:
423  {
424  layout.setColumnStretch(0, 0);
425  }
426  case WidgetButton::Top:
427  {
428  layout.setRowStretch(3, 0);
429  break;
430  }
431  case WidgetButton::Bottom:
432  {
433  layout.setRowStretch(0, 0);
434  break;
435  }
436  }
437  }
438  */
439  clicking = false;
440 // repaint();
441 }
442 
QWidget * getWidget(const QString &name)
QHash< QString, WidgetButton * > widgets
QVBoxLayout * right
void setThumbnailSize(int width=150, int height=150)
QHBoxLayout * top
QList< WidgetButton * > getAllWidgetButtons()
QHBoxLayout * bottom
MultiViewWidget(QWidget *parent)
void childEvent(QChildEvent *event)
void widgetButtonAdded(QWidget *widget)
QVBoxLayout * left
QVBoxLayout * mid
void deleteWidget(const QString &name)
QWidget * pseudoWidget
void setActive(bool active)
Definition: WidgetButton.cc:64
void setIconAlternative(const QIcon &icon, bool isAlternative=false)
bool event(QEvent *event)
void setWidget(const QString &name, QWidget *widget, bool shown=true)
void addWidget(const QString &name, QWidget *widget, const QIcon &icon=QIcon(), bool useOnlyIcon=false, int position=0)
QGridLayout layout
const Position getPosition() const
Definition: WidgetButton.cc:53
WidgetButton * currentWidget
void showWidget(bool shown)
QWidget * getWidget()
WidgetButton * getButtonForWidget(QWidget *widget)
virtual ~MultiViewWidget()