NCL Composer  0.1.5
 All Classes Functions Variables Pages
qnlyview.cpp
1 /*
2  * Copyright 2011 TeleMidia/PUC-Rio.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library. If not, see
16  * <http://www.gnu.org/licenses/>.
17  */
18 #include "qnlyview.h"
19 
20 QnlyView::QnlyView(QWidget* parent) :
21  QStackedWidget(parent),
22  gridVisibility(false)
23 {
24  setWindowTitle("Qnly");
25 
26  createActions();
27  createMenus();
28  createConnections();
29 
30  nregions = 0;
31  nregionbases = 0;
32 
33  selectedRegion = NULL;
34  selectedRegionBase = NULL;
35 }
36 
37 QnlyView::~QnlyView()
38 {
39 
40 }
41 
42 void QnlyView::createActions()
43 {
44  // help action
45  helpAction = new QAction(this);
46  helpAction->setText(tr("Help"));
47 
48  helpAction->setEnabled(false);
49  helpAction->setShortcut(QKeySequence("F1"));
50 
51  // undo action
52  // undoAction = new QAction(this);
53  // undoAction->setText(tr("Undo"));
54 
55  // undoAction->setEnabled(false);
56  // undoAction->setShortcut(QKeySequence("Ctrl+Z"));
57 
58  // redo action
59  redoAction = new QAction(this);
60  redoAction->setText(tr("Redo"));
61 
62  redoAction->setEnabled(false);
63  redoAction->setShortcut(QKeySequence("Ctrl+Shift+Z"));
64 
65  // cut action
66  cutAction = new QAction(this);
67  cutAction->setText(tr("Cut"));
68 
69  cutAction->setEnabled(false);
70  cutAction->setShortcut(QKeySequence("Ctrl+X"));
71 
72  // copy action
73  copyAction = new QAction(this);
74  copyAction->setText(tr("Copy"));
75 
76  copyAction->setEnabled(false);
77  copyAction->setShortcut(QKeySequence("Ctrl+C"));
78 
79  // paste action
80  pasteAction = new QAction(this);
81  pasteAction->setText(tr("Paste"));
82 
83  pasteAction->setEnabled(false);
84  pasteAction->setShortcut(QKeySequence("Ctrl+V"));
85 
86  // delete action
87  deleteAction = new QAction(this);
88  deleteAction->setText(tr("Delete"));
89 
90  deleteAction->setEnabled(false);
91  deleteAction->setShortcut(QKeySequence("Del"));
92 
93  // zoomin action
94  zoominAction = new QAction(this);
95  zoominAction->setText(tr("Zoom In"));
96 
97  zoominAction->setEnabled(false);
98  zoominAction->setShortcut(QKeySequence("Ctrl++"));
99 
100  // zoomout action
101  zoomoutAction = new QAction(this);
102  zoomoutAction->setText(tr("Zoom Out"));
103 
104  zoomoutAction->setEnabled(false);
105  zoomoutAction->setShortcut(QKeySequence("Ctrl+-"));
106 
107  // reset action
108  zoomresetAction = new QAction(this);
109  zoomresetAction->setText(tr("Reset"));
110 
111  zoomresetAction->setEnabled(false);
112  zoomresetAction->setShortcut(QKeySequence("Ctrl+0"));
113 
114  // fullscreen action
115  fullscreenAction = new QAction(this);
116  fullscreenAction->setText(tr("Full Screen"));
117 
118  fullscreenAction->setEnabled(true);
119  fullscreenAction->setShortcut(QKeySequence("F11"));
120 
121  // export action
122  exportAction = new QAction(this);
123  exportAction->setText(tr("Export..."));
124 
125  exportAction->setEnabled(false);
126 
127  // region action
128  regionAction = new QAction(this);
129  regionAction->setText(tr("Region"));
130 
131  regionAction->setEnabled(false);
132 
133  // regionbase action
134  regionbaseAction = new QAction(this);
135  regionbaseAction->setText(tr("Region Base"));
136 
137  regionbaseAction->setEnabled(true);
138 
139  // bring to front action
140  bringfrontAction = new QAction(this);
141  bringfrontAction->setText(tr("Bring to Front"));
142 
143  bringfrontAction->setEnabled(false);
144  bringfrontAction->setShortcut(QKeySequence("Shift+Ctrl+]"));
145 
146  // bring forward action
147  bringforwardAction = new QAction(this);
148  bringforwardAction->setText(tr("Bring Forward"));
149 
150  bringforwardAction->setEnabled(false);
151  bringforwardAction->setShortcut(QKeySequence("Ctrl+]"));
152 
153  // send backward action
154  sendbackwardAction = new QAction(this);
155  sendbackwardAction->setText(tr("Send Backward"));
156 
157  sendbackwardAction->setEnabled(false);
158  sendbackwardAction->setShortcut(QKeySequence("Ctrl+["));
159 
160  // send to back action
161  sendbackAction = new QAction(this);
162  sendbackAction->setText(tr("Send to Back"));
163 
164  sendbackAction->setEnabled(false);
165  sendbackAction->setShortcut(QKeySequence("Shift+Ctrl+["));
166 
167  // hide action
168  hideAction = new QAction(this);
169  hideAction->setText(tr("Hide"));
170 
171  hideAction->setEnabled(false);
172 
173  // properties action
174  propertiesAction = new QAction(this);
175  propertiesAction->setText(tr("Properties"));
176 
177  propertiesAction->setEnabled(false);
178 
179  regionbaseActionGroup = new QActionGroup(this);
180  regionbaseActionGroup->setExclusive(true);
181 
182  setMouseTracking(true);
183 }
184 
185 void QnlyView::createMenus()
186 {
187  // view menu
188  viewMenu = new QMenu();
189  viewMenu->setTitle(tr("View"));
190 
191  viewMenu->setEnabled(false);
192 
193  viewMenu->addAction(zoominAction);
194  viewMenu->addAction(zoomoutAction);
195  viewMenu->addAction(zoomresetAction);
196  viewMenu->addSeparator();
197  viewMenu->addAction(fullscreenAction);
198 
199  // insert menu
200  insertMenu = new QMenu();
201  insertMenu->setTitle(tr("Insert"));
202 
203  insertMenu->setEnabled(true);
204 
205  insertMenu->addAction(regionAction);
206  insertMenu->addAction(regionbaseAction);
207 
208  showMenu = new QMenu();
209  showMenu->setTitle(tr("Show"));
210 
211  showMenu->setEnabled(false);
212 
213  // arrange menu
214  arrangeMenu = new QMenu();
215  arrangeMenu->setTitle(tr("Arrange"));
216 
217  arrangeMenu->setEnabled(false);
218 
219  arrangeMenu->addAction(bringfrontAction);
220  arrangeMenu->addAction(bringforwardAction);
221  arrangeMenu->addAction(sendbackwardAction);
222  arrangeMenu->addAction(sendbackAction);
223 
224  // switch menu
225  switchMenu = new QMenu();
226  switchMenu->setTitle(tr("Switch"));
227 
228  switchMenu->setEnabled(false);
229 
230  // context menu
231  contextMenu = new QMenu();
232  contextMenu->addAction(helpAction);
233  // contextMenu->addSeparator();
234  // contextMenu->addAction(undoAction);
235  // contextMenu->addAction(redoAction);
236  // contextMenu->addSeparator();
237  // contextMenu->addAction(cutAction);
238  // contextMenu->addAction(copyAction);
239  // contextMenu->addAction(pasteAction);
240  // contextMenu->addSeparator();
241  contextMenu->addAction(deleteAction);
242  contextMenu->addSeparator();
243  contextMenu->addAction(exportAction);
244  contextMenu->addSeparator();
245  contextMenu->addMenu(viewMenu);
246  contextMenu->addMenu(insertMenu);
247  contextMenu->addMenu(showMenu);
248  contextMenu->addMenu(arrangeMenu);
249  contextMenu->addSeparator();
250  contextMenu->addAction(hideAction);
251  contextMenu->addSeparator();
252  contextMenu->addMenu(switchMenu);
253  contextMenu->addSeparator();
254  contextMenu->addAction(propertiesAction);
255 }
256 
257 void QnlyView::createConnections()
258 {
259  connect(regionbaseActionGroup, SIGNAL(triggered(QAction*)),
260  SLOT(performSwitch(QAction*)));
261 
262  connect(regionbaseAction, SIGNAL(triggered()),SLOT(performRegionBase()));
263 }
264 
265 void QnlyView::requestRegionAddition(const QString regionUID,
266  const QString parentUID,
267  const QString regionbaseUID,
268  QMap<QString, QString> attributes)
269 {
270  // attributes["id"] = "rg" + QString::number(nregions+1);
271  // attributes["id"] =
272 
273  emit regionAdded(regionUID, parentUID, regionbaseUID, attributes);
274 }
275 
276 void QnlyView::requestRegionChange(const QString regionUID,
277  const QString regionbaseUID,
278  QMap<QString, QString> attributes)
279 {
280 
281  emit regionChanged(regionUID,
282  regionbaseUID,
283  attributes);
284 }
285 
286 void QnlyView::performSwitch(QAction* action)
287 {
288  emit regionBaseSelected(regionbaseActions.key(action));
289 }
290 
291 void QnlyView::performRegionBase()
292 {
293  QMap<QString, QString> attributes;
294 
295  attributes["id"] = "rgbase" + QString::number(++nregionbases);
296 
297  emit regionBaseAdded((QString) QUuid::createUuid(), attributes);
298 }
299 
300 void QnlyView::addRegion(const QString regionUID,
301  const QString parentUID,
302  const QString regionbaseUID,
303  const QMap<QString, QString> attributes)
304 {
305  if (!regions.contains(regionUID) &&
306  regionbases.contains(regionbaseUID))
307  {
308  QnlyGraphicsRegion* region = new QnlyGraphicsRegion(switchMenu);
309 
310  if (regionUID.isEmpty())
311  region->setUid((QString) QUuid::createUuid());
312  else
313  region->setUid(regionUID);
314 
315  QnlyGraphicsRegion* parent = NULL;
316 
317  if (regions.contains(parentUID))
318  parent = regions[parentUID];
319 
320  QnlyGraphicsRegionBase* regionbase = regionbases[regionbaseUID];
321 
322  nregions++;
323 
324  addRegion(region, parent, regionbase, attributes);
325  }
326 }
327 
328 void QnlyView::removeRegion(const QString regionUID,
329  const QString regionbaseUID)
330 {
331  if (regions.contains(regionUID) && regionbases.contains(regionbaseUID))
332  {
333  removeRegion(regions[regionUID],
334  regionbases[regionbaseUID]);
335  }
336 }
337 
338 void QnlyView::changeRegion(const QString regionUID,
339  const QString regionbaseUID,
340  const QMap<QString, QString> attributes)
341 {
342  if (regions.contains(regionUID) && regionbases.contains(regionbaseUID))
343  {
344  changeRegion(regions[regionUID],
345  regionbases[regionbaseUID],
346  attributes);
347  }
348 }
349 
350 void QnlyView::selectRegion(const QString regionUID,
351  const QString regionbaseUID)
352 {
353  if (regions.contains(regionUID) && regionbases.contains(regionbaseUID))
354  {
355  selectRegion(regions[regionUID],
356  regionbases[regionbaseUID]);
357  }
358 }
359 
360 void QnlyView::addRegionBase(const QString regionbaseUID,
361  const QMap<QString, QString> attributes)
362 {
363  if (!regionbases.contains(regionbaseUID))
364  {
365  QnlyCanvas* canvas = new QnlyCanvas(this);
366 
367  QnlyGraphicsRegionBase* regionbase =
368  new QnlyGraphicsRegionBase(canvas, switchMenu);
369 
370  regionbase->setParent(canvas);
371 
372  canvas->setScene(regionbase);
373 
374  if (regionbaseUID.isEmpty())
375  {
376  regionbase->setUid((QString) QUuid::createUuid());
377  }
378  else{
379  regionbase->setUid(regionbaseUID);
380  }
381 
382  addRegionBase(regionbase, attributes);
383  }
384 }
385 
386 void QnlyView::removeRegionBase(const QString regionbaseUID)
387 {
388  if (regionbases.contains(regionbaseUID))
389  {
390  removeRegionBase(regionbases[regionbaseUID]);
391  }
392 }
393 
394 void QnlyView::changeRegionBase(const QString regionbaseUID,
395  const QMap<QString, QString> attributes)
396 {
397  if (regionbases.contains(regionbaseUID))
398  {
399  changeRegionBase(regionbases[regionbaseUID], attributes);
400  }
401 }
402 
403 void QnlyView::selectRegionBase(const QString regionbaseUID)
404 {
405  if (regionbases.contains(regionbaseUID))
406  {
407  selectRegionBase(regionbases[regionbaseUID]);
408  }
409 }
410 
411 void QnlyView::addRegion(QnlyGraphicsRegion* region,
412  QnlyGraphicsRegion* parent,
413  QnlyGraphicsRegionBase* regionBase,
414  const QMap<QString, QString> attributes)
415 {
416  if (region != NULL && regionBase != NULL)
417  {
418  qDebug() << "Adding Region" << attributes;
419 
420  regions[region->getUid()] = region;
421 
422  regionBase->addRegion(region,
423  parent,
424  attributes);
425  }
426 }
427 
428 void QnlyView::removeRegion(QnlyGraphicsRegion* region,
429  QnlyGraphicsRegionBase* regionBase)
430 {
431  if (region != NULL && regionBase != NULL)
432  {
433  qDebug() << "Region Removed!";
434 
435  foreach(QGraphicsItem* item, region->childItems())
436  {
437  QnlyGraphicsRegion* child = dynamic_cast<QnlyGraphicsRegion*> (item);
438 
439  if(item != NULL)
440  removeRegion(child, regionBase);
441  else
442  qWarning() << "Trying to remove an element that is not of the type QnlyGraphicsRegion " << __FILE__ << __LINE__;
443  }
444 
445  regions.remove(region->getUid());
446 
447  regionBase->removeRegion(region);
448 
449  // delete(region);
450  }
451 }
452 
453 
454 
455 void QnlyView::changeRegion(QnlyGraphicsRegion* region,
456  QnlyGraphicsRegionBase* regionBase,
457  const QMap<QString, QString> attributes)
458 {
459  if (region != NULL && regionBase != NULL)
460  {
461  regionBase->changeRegion(region, attributes);
462  }
463 }
464 
465 void QnlyView::selectRegion(QnlyGraphicsRegion* region,
466  QnlyGraphicsRegionBase* regionBase)
467 {
468  if (region != NULL && regionBase != NULL)
469  {
470  if (selectedRegion != NULL)
471  {
472  selectedRegion->setSelected(false);
473  }
474 
475  regionBase->selectRegion(region);
476 
477  selectedRegion = region;
478 
479  QWidget* parent = (QWidget*) regionBase->parent();
480 
481  setCurrentWidget(parent);
482  }
483 }
484 
485 void QnlyView::addRegionBase(QnlyGraphicsRegionBase* regionBase,
486  const QMap<QString, QString> attributes)
487 {
488  if (regionBase != NULL)
489  {
490  qDebug() << "RegionBase Added!";
491 
492  if (attributes.contains("id"))
493  regionBase->setId(attributes["id"]);
494 
495  if (attributes.contains("region"))
496  regionBase->setId(attributes["region"]);
497 
498  if (attributes.contains("device"))
499  regionBase->setId(attributes["device"]);
500 
501  QWidget* parent = (QWidget*) regionBase->parent();
502 
503  addWidget(parent);
504  setCurrentWidget(parent);
505 
506  regionbases[regionBase->getUid()] = regionBase;
507 
508  QAction* action = new QAction(this);
509  action->setText(regionBase->getId());
510 
511  switchMenu->addAction(action);
512 
513  action->setCheckable(true);
514  action->setEnabled(true);
515 
516  regionbaseActionGroup->addAction(action);
517 
518  action->trigger();
519 
520  regionbaseActions[regionBase->getUid()] = action;
521 
522  connect(regionBase, SIGNAL(regionbasePerformed()),
523  SLOT(performRegionBase()));
524 
525  connect(regionBase,
526  SIGNAL(regionAdditionRequested(QString,QString,QString
527  ,QMap<QString,QString>)),
528  SLOT(requestRegionAddition(QString,QString,QString
529  ,QMap<QString,QString>)));
530 
531  connect(regionBase,
532  SIGNAL(regionChangeRequested(QString,QString,QMap<QString,QString>)),
533  SLOT(requestRegionChange(QString,QString,QMap<QString,QString>)));
534 
535  connect(regionBase,
536  SIGNAL(regionSelectionRequested(QString,QString)),
537  SIGNAL(regionSelected(QString,QString)));
538 
539  connect(regionBase,
540  SIGNAL(regionBaseSelectionRequested(QString)),
541  SIGNAL(regionBaseSelected(QString)));
542 
543  connect(regionBase,
544  SIGNAL(regionBaseDeletionRequested(QString)),
545  SIGNAL(regionBaseRemoved(QString)));
546 
547  connect(regionBase,
548  SIGNAL(regionDeletionRequested(QString,QString)),
549  SIGNAL(regionRemoved(QString,QString)));
550 
551  connect(regionBase,
552  SIGNAL(mediaOverRegion(QString,QString)),
553  SIGNAL(mediaOverRegionAction(QString,QString)));
554 
555  regionBase->setGridVisible(gridVisibility);
556  connect(regionBase,
557  SIGNAL(gridVisibilityChanged(bool)),
558  SLOT(setGridVisible(bool)));
559 
560 
561  emit regionBaseSelected(regionBase->getUid());
562  }
563 }
564 
565 void QnlyView::removeRegionBase(QnlyGraphicsRegionBase* regionBase)
566 {
567  if (regionBase != NULL)
568  {
569  QAction* action = regionbaseActions[regionBase->getUid()];
570  switchMenu->removeAction(action);
571 
572  regionbaseActionGroup->removeAction(action);
573 
574  // delete(action);
575 
576  foreach(QGraphicsItem* item, regionBase->items())
577  {
578  if (item != regionBase->getBackgroundItem()) {
579  QnlyGraphicsRegion* child = dynamic_cast<QnlyGraphicsRegion *> (item);
580 
581  if (child != NULL)
582  {
583  regions.remove(child->getUid());
584  }
585  else
586  qWarning() << "Trying to remove an element that is not of the type QnlyGraphicsRegion " << __FILE__ << __LINE__;
587  }
588  }
589 
590  // delete (regionBase);
591 
592 
593  QWidget* parent = (QWidget*) regionBase->parent();
594 
595  removeWidget(parent);
596 
597  regionbases.remove(regionBase->getUid());
598 
599  if (currentWidget() != NULL)
600  {
601  QnlyGraphicsRegionBase* current =
602  (QnlyGraphicsRegionBase*) ((QGraphicsView*)currentWidget())->scene();
603 
604  emit regionBaseSelected(current->getUid());
605  }
606  }
607 }
608 
609 void QnlyView::changeRegionBase(QnlyGraphicsRegionBase* regionBase,
610  const QMap<QString, QString> attributes)
611 {
612  if (regionBase != NULL)
613  {
614  if (attributes.contains("id"))
615  {
616  regionBase->setId(attributes["id"]);
617 
618  QAction* action = regionbaseActions[regionBase->getUid()];
619  action->setText(attributes["id"]);
620  }
621 
622  if (attributes.contains("region"))
623  regionBase->setId(attributes["region"]);
624 
625  if (attributes.contains("device"))
626  regionBase->setId(attributes["device"]);
627  }
628 }
629 
630 void QnlyView::selectRegionBase(QnlyGraphicsRegionBase* regionBase)
631 {
632  if (regionBase != NULL)
633  {
634  QWidget* parent = (QWidget*) regionBase->parent();
635 
636  setCurrentWidget(parent);
637 
638  QAction* action = regionbaseActions[regionBase->getUid()];
639  action->setChecked(true);
640 
641  if (selectedRegion != NULL)
642  {
643  selectedRegion->setSelected(false);
644  }
645 
646  selectedRegionBase = regionBase;
647  }
648 }
649 
650 void QnlyView::setGridVisible(bool visible)
651 {
652  this->gridVisibility = visible;
653  foreach(QnlyGraphicsRegionBase *regionBase, regionbases.values())
654  {
655  regionBase->setGridVisible(visible);
656  }
657 }
658 
659 QnlyGraphicsRegionBase* QnlyView::getSelectedRegionBase()
660 {
661  return selectedRegionBase;
662 }
663 
664 void QnlyView::contextMenuEvent(QContextMenuEvent *event)
665 {
666  QStackedWidget::contextMenuEvent(event);
667 
668  if (!event->isAccepted())
669  {
670  contextMenu->exec(event->globalPos());
671 
672  event->accept();
673  }
674 }