• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

rocs/VisualEditor

  • sources
  • kde-4.14
  • kdeedu
  • rocs
  • VisualEditor
GraphVisualEditor.cpp
Go to the documentation of this file.
1 /*
2  This file is part of Rocs.
3  Copyright 2008-2011 Tomaz Canabrava <tomaz.canabrava@gmail.com>
4  Copyright 2008 Ugo Sangiori <ugorox@gmail.com>
5  Copyright 2011-2012 Andreas Cord-Landwehr <cola@uni-paderborn.de>
6 
7  This program is free software; you can redistribute it and/or
8  modify it under the terms of the GNU General Public License as
9  published by the Free Software Foundation; either version 2 of
10  the License, or (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20 
21 #include "GraphVisualEditor.h"
22 #include "Scene/GraphScene.h"
23 #include "Scene/DataItem.h"
24 #include "Scene/PointerItem.h"
25 
26 #include "Document.h"
27 #include "DataStructure.h"
28 #include "Data.h"
29 #include "Pointer.h"
30 #include <CoreTypes.h>
31 #include "Interface/EditorToolbar.h"
32 
33 #include "Actions/PropertiesDialogAction.h"
34 #include "Actions/AlignAction.h"
35 
36 #include <KLocale>
37 #include <QVBoxLayout>
38 #include <QGraphicsItem>
39 #include <KDebug>
40 #include <KComboBox>
41 #include <QGraphicsView>
42 #include <QLabel>
43 #include <QPainter>
44 #include <QSlider>
45 #include <QSpacerItem>
46 #include <QToolButton>
47 #include <QFrame>
48 #include <DocumentManager.h>
49 #include <KPushButton>
50 #include <QButtonGroup>
51 #include <QLayout>
52 #include <KActionCollection>
53 
54 // load catalog for library
55 static const KCatalogLoader loader("rocsvisualeditor");
56 
57 
58 // class GraphVisualEditorPrivate
59 class GraphVisualEditorPrivate
60 {
61 public:
62  GraphVisualEditorPrivate()
63  : _editorToolbar(0)
64  {
65  _scene = 0;
66  _document = 0;
67  }
68 
69  ~GraphVisualEditorPrivate()
70  { }
71 
72  GraphScene *_scene;
73  EditorToolbar *_editorToolbar;
74 
75  KComboBox *_documentSelectorCombo;
76  QToolButton *_documentPropertiesButton;
77  KComboBox *_dataStructureSelectorCombo;
78  QToolButton *_dataStructurePropertiesButton;
79  KPushButton *_removeDataStructureButton;
80 
81  QSlider *_zoomSlider;
82  Document *_document;
83  DataStructurePtr _dataStructure;
84 
85  QGraphicsView *_graphicsView;
86 };
87 
88 
89 GraphVisualEditor::GraphVisualEditor(QWidget *parent)
90  : QWidget(parent)
91  , d(new GraphVisualEditorPrivate())
92 {
93  setupWidgets();
94 }
95 
96 GraphVisualEditor::~GraphVisualEditor()
97 {
98  // d-pointer is scoped pointer and need not to be deleted
99 }
100 
101 GraphVisualEditor * GraphVisualEditor::_self = 0;
102 
103 GraphVisualEditor * GraphVisualEditor::self()
104 {
105  if (!_self) {
106  _self = new GraphVisualEditor(0);
107  }
108  return _self;
109 }
110 
111 void GraphVisualEditor::resizeEvent(QResizeEvent *event)
112 {
113  Q_UNUSED(event);
114  // resize whiteboard to editor size
115  d->_scene->resize();
116 }
117 
118 void GraphVisualEditor::setupWidgets()
119 {
120  QVBoxLayout *vLayout = new QVBoxLayout();
121  vLayout->setContentsMargins(0, 0, 0, 0);
122  d->_scene = new GraphScene(this);
123  d->_graphicsView = new QGraphicsView(this);
124  d->_graphicsView->setRenderHints(QPainter::Antialiasing);
125  d->_graphicsView->setOptimizationFlags(QGraphicsView::DontAdjustForAntialiasing);
126  d->_graphicsView->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
127  d->_graphicsView->setScene(d->_scene);
128 
129  // add controls for graph scene
130  d->_zoomSlider = new QSlider(Qt::Horizontal, this);
131  d->_zoomSlider->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
132  d->_zoomSlider->setMaximum(100);
133  d->_zoomSlider->setMinimum(-100);
134  updateZoomSlider(d->_scene->zoomFactor());
135 
136  // at first setup document does not exists
137  // this is later set when MainWindow::setActiveDocument() is called
138  PropertiesDialogAction *propertiesAction = new PropertiesDialogAction(i18nc("@action:button", "Properties"), DocumentManager::self().activeDocument(), this);
139  d->_documentPropertiesButton = new QToolButton(this);
140  d->_documentPropertiesButton->setDefaultAction(propertiesAction);
141  d->_documentPropertiesButton->setIcon(KIcon("document-properties"));
142 
143  // scene controls for top line
144  vLayout->addWidget(sceneToolbar());
145  vLayout->addWidget(d->_graphicsView);
146  setLayout(vLayout);
147 
148  // listen for document manager changes
149  connect(&DocumentManager::self(), SIGNAL(documentRemoved(Document*)),
150  this, SLOT(releaseDocument()));
151  connect(&DocumentManager::self(), SIGNAL(documentListChanged()),
152  this, SLOT(updateGraphDocumentList()));
153 }
154 
155 QWidget * GraphVisualEditor::sceneToolbar()
156 {
157  QWidget *sceneControls = new QWidget(this);
158 
159  // document selection
160  d->_documentSelectorCombo = new KComboBox(this);
161  d->_documentSelectorCombo->setMinimumWidth(100);
162  sceneControls->setLayout(new QHBoxLayout(this));
163  sceneControls->layout()->addWidget(new QLabel(i18nc("@label:listbox", "Graph Document:")));
164  sceneControls->layout()->addWidget(d->_documentSelectorCombo);
165  sceneControls->layout()->addWidget(d->_documentPropertiesButton);
166 
167  // control separator
168  QFrame* separator = new QFrame(this);
169  separator->setFrameStyle(QFrame::VLine);
170  sceneControls->layout()->addWidget(separator);
171 
172  // data structure selection
173  sceneControls->layout()->addWidget(new QLabel(i18n("Data Structure:"), this));
174  d->_dataStructureSelectorCombo = new KComboBox(this);
175  d->_dataStructureSelectorCombo->setMinimumWidth(100);
176  sceneControls->layout()->addWidget(d->_dataStructureSelectorCombo);
177  d->_dataStructurePropertiesButton = new QToolButton(this);
178  d->_dataStructurePropertiesButton->setMaximumWidth(24);
179  d->_dataStructurePropertiesButton->setIcon(KIcon("document-properties"));
180  sceneControls->layout()->addWidget(d->_dataStructurePropertiesButton);
181  // create add data structure button
182  KPushButton* addDataStructureButton = new KPushButton(this);
183  addDataStructureButton->setIcon(KIcon("rocsnew"));
184  addDataStructureButton->setToolTip(i18nc("@info:tooltip", "Add a new data structure."));
185  addDataStructureButton->setMaximumWidth(24);
186  sceneControls->layout()->addWidget(addDataStructureButton);
187  // create remove data structure button
188  d->_removeDataStructureButton = new KPushButton(this);
189  d->_removeDataStructureButton->setIcon(KIcon("rocsdelete"));
190  d->_removeDataStructureButton->setToolTip(i18nc("@info:tooltip", "Remove selected data structure."));
191  d->_removeDataStructureButton->setMaximumWidth(24);
192  sceneControls->layout()->addWidget(d->_removeDataStructureButton);
193 
194  QSpacerItem *spacerItem = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
195  sceneControls->layout()->addItem(spacerItem);
196  sceneControls->layout()->addWidget(d->_zoomSlider);
197 
198  // connections for buttons
199  connect(d->_documentSelectorCombo, SIGNAL(activated(int)),
200  &DocumentManager::self(), SLOT(changeDocument(int)));
201  connect(addDataStructureButton, SIGNAL(clicked()),
202  this, SLOT(addDataStructure()));
203  connect(d->_removeDataStructureButton, SIGNAL(clicked()),
204  this, SLOT(removeDataStructure()));
205 
206  // add connections for zoom slider
207  connect(d->_zoomSlider, SIGNAL(valueChanged(int)),
208  this, SLOT(zoomTo(int)));
209  connect(d->_scene, SIGNAL(zoomFactorChanged(qreal)),
210  this, SLOT(updateZoomSlider(qreal)));
211 
212  return sceneControls;
213 }
214 
215 void GraphVisualEditor::updateGraphDocumentList()
216 {
217  d->_documentSelectorCombo->clear();
218  foreach(Document* document, DocumentManager::self().documentList()) {
219  d->_documentSelectorCombo->addItem(document->name());
220  }
221 }
222 
223 void GraphVisualEditor::setActiveDocument()
224 {
225  if (d->_document != 0 && d->_document != DocumentManager::self().activeDocument()) {
226  disconnect(d->_document);
227  d->_document->disconnect(d->_dataStructureSelectorCombo);
228  releaseDocument();
229  }
230  d->_document = DocumentManager::self().activeDocument();
231  d->_scene->setActiveDocument();
232 
233  // set button for document properties
234  if (d->_documentPropertiesButton->defaultAction()) {
235  d->_documentPropertiesButton->defaultAction()->deleteLater();
236  PropertiesDialogAction *propertiesAction = new PropertiesDialogAction(i18nc("@action:button", "Properties"),
237  d->_document,
238  this);
239  d->_documentPropertiesButton->setDefaultAction(propertiesAction);
240  d->_documentPropertiesButton->setIcon(KIcon("document-properties"));
241  }
242  updateDataStructureList();
243 
244  connect(d->_dataStructureSelectorCombo, SIGNAL(activated(int)),
245  d->_document, SLOT(setActiveDataStructure(int)));
246  connect(d->_document, SIGNAL(activeDataStructureChanged(DataStructurePtr)),
247  this, SLOT(updateActiveDataStructure(DataStructurePtr)));
248  connect(d->_document, SIGNAL(dataStructureCreated(DataStructurePtr)),
249  this, SLOT(updateDataStructureList()));
250  connect(d->_document, SIGNAL(dataStructureCreated(DataStructurePtr)),
251  d->_scene, SLOT(createItems(DataStructurePtr)));
252  connect(d->_document, SIGNAL(dataStructureListChanged()),
253  this, SLOT(updateDataStructureList()));
254 
255  // Graphical Data Structure Editor toolbar
256  d->_editorToolbar->setActiveDocument(d->_document);
257 }
258 
259 void GraphVisualEditor::releaseDocument()
260 {
261  if (!d->_document) {
262  return;
263  }
264  d->_scene->clear();
265  foreach(DataStructurePtr ds, d->_document->dataStructures()) {
266  ds->disconnect(this);
267  }
268  d->_document->disconnect(this);
269  d->_document = 0;
270 }
271 
272 void GraphVisualEditor::setupActions(KActionCollection* collection)
273 {
274  // create editor toolbar
275  if (d->_editorToolbar == 0) {
276  d->_editorToolbar = new EditorToolbar(this);
277  }
278  d->_editorToolbar->setup(d->_scene, collection);
279 
280  // create alignment menu
281  collection->addAction("align-hbottom", new AlignAction(i18nc("@action:intoolbar Alignment", "Base"), AlignAction::Bottom, d->_scene));
282  collection->addAction("align-hcenter", new AlignAction(i18nc("@action:intoolbar Alignment", "Center"), AlignAction::HCenter, d->_scene));
283  collection->addAction("align-htop", new AlignAction(i18nc("@action:intoolbar Alignment", "Top"), AlignAction::Top, d->_scene));
284  collection->addAction("align-vleft", new AlignAction(i18nc("@action:intoolbar Alignment", "Left"), AlignAction::Left, d->_scene));
285  collection->addAction("align-vcenter", new AlignAction(i18nc("@action:intoolbar Alignment", "Center"), AlignAction::VCenter, d->_scene));
286  collection->addAction("align-vright", new AlignAction(i18nc("@action:intoolbar Alignment", "Right"), AlignAction::Right, d->_scene));
287  collection->addAction("align-circle", new AlignAction(i18nc("@action:intoolbar Alignment", "Circle"), AlignAction::Circle, d->_scene));
288  collection->addAction("align-tree", new AlignAction(i18nc("@action:intoolbar Alignment", "Minimize Crossing Edges"), AlignAction::MinCutTree, d->_scene));
289 }
290 
291 void GraphVisualEditor::updateActiveDataStructure(DataStructurePtr g)
292 {
293  d->_dataStructure = g;
294  d->_scene->setActiveGraph(g);
295 
296  // set property to edit current data structure
297  PropertiesDialogAction *dsProperty = new PropertiesDialogAction(i18nc("@action:button", "Properties"),
298  DocumentManager::self().activeDocument()->activeDataStructure(),
299  this);
300  d->_dataStructurePropertiesButton->defaultAction()->deleteLater();
301  d->_dataStructurePropertiesButton->setDefaultAction(dsProperty);
302 }
303 
304 void GraphVisualEditor::updateDataStructureList()
305 {
306  d->_dataStructureSelectorCombo->clear();
307  foreach(DataStructurePtr ds, DocumentManager::self().activeDocument()->dataStructures()) {
308  d->_dataStructureSelectorCombo->addItem(ds->name());
309  }
310  d->_dataStructureSelectorCombo->setCurrentIndex(d->_document->dataStructures().indexOf(d->_document->activeDataStructure()));
311 
312  // set property to edit current data structure
313  PropertiesDialogAction *dsProperty = new PropertiesDialogAction(i18nc("@action:button", "Properties"),
314  DocumentManager::self().activeDocument()->activeDataStructure(),
315  this);
316  d->_dataStructurePropertiesButton->defaultAction()->deleteLater();
317  d->_dataStructurePropertiesButton->setDefaultAction(dsProperty);
318 }
319 
320 void GraphVisualEditor::addDataStructure()
321 {
322  DocumentManager::self().activeDocument()->addDataStructure();
323  d->_removeDataStructureButton->setEnabled(true);
324 }
325 
326 void GraphVisualEditor::removeDataStructure()
327 {
328  DocumentManager::self().activeDocument()->activeDataStructure()->remove();
329  if (DocumentManager::self().activeDocument()->dataStructures().isEmpty()) {
330  d->_removeDataStructureButton->setDisabled(true);
331  }
332 }
333 
334 QList<DataItem*> GraphVisualEditor::selectedNodes() const
335 {
336  QList<DataItem*> tmpList;
337  QList<QGraphicsItem*> l = d->_scene->selectedItems();
338  foreach(QGraphicsItem * i, l) {
339  if (qgraphicsitem_cast<DataItem*>(i)) {
340  tmpList.append(qgraphicsitem_cast<DataItem*>(i));
341  }
342  }
343  return tmpList;
344 }
345 
346 void GraphVisualEditor::updateZoomSlider(qreal zoomFactor)
347 {
348  int sliderValue = 100*(zoomFactor-1);
349  d->_zoomSlider->setToolTip(i18nc("@info:tooltip current zoom factor for graph editor", "Zoom: %1\%", zoomFactor*100));
350  d->_zoomSlider->setValue(sliderValue);
351 }
352 
353 void GraphVisualEditor::zoomTo(int sliderValue)
354 {
355  qreal zoomFactor = sliderValue/100.0 + 1;
356  d->_scene->zoomTo(zoomFactor);
357 }
QWidget::layout
QLayout * layout() const
QSpacerItem
QResizeEvent
QWidget
GraphVisualEditor::releaseDocument
void releaseDocument()
Definition: GraphVisualEditor.cpp:259
PropertiesDialogAction
Definition: PropertiesDialogAction.h:31
QLayout::setContentsMargins
void setContentsMargins(int left, int top, int right, int bottom)
GraphVisualEditor::removeDataStructure
void removeDataStructure()
Definition: GraphVisualEditor.cpp:326
GraphVisualEditor::setActiveDocument
void setActiveDocument()
Definition: GraphVisualEditor.cpp:223
QLayout::addItem
virtual void addItem(QLayoutItem *item)=0
EditorToolbar
This class provides hand actions to be performed at the graphics scene.
Definition: EditorToolbar.h:38
AlignAction::Bottom
Definition: AlignAction.h:34
GraphVisualEditor::self
static GraphVisualEditor * self()
Definition: GraphVisualEditor.cpp:103
AlignAction::Right
Definition: AlignAction.h:34
AlignAction::VCenter
Definition: AlignAction.h:34
QHBoxLayout
GraphVisualEditor::setupActions
void setupActions(KActionCollection *collection)
Setup actions of visual graph editor and adds them to contributed action collection collection...
Definition: GraphVisualEditor.cpp:272
QGraphicsItem
QFrame::setFrameStyle
void setFrameStyle(int style)
GraphScene.h
QObject::disconnect
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
QSlider
GraphVisualEditor::addDataStructure
void addDataStructure()
Definition: GraphVisualEditor.cpp:320
GraphVisualEditor::selectedNodes
QList< DataItem * > selectedNodes() const
Definition: GraphVisualEditor.cpp:334
EditorToolbar.h
PointerItem.h
GraphVisualEditor.h
GraphVisualEditor::zoomTo
void zoomTo(int sliderValue)
Definition: GraphVisualEditor.cpp:353
PropertiesDialogAction.h
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, QFlags< Qt::AlignmentFlag > alignment)
QList::append
void append(const T &value)
AlignAction::Left
Definition: AlignAction.h:34
QWidget::setLayout
void setLayout(QLayout *layout)
GraphScene
Definition: GraphScene.h:38
AlignAction::Top
Definition: AlignAction.h:34
AlignAction::MinCutTree
Definition: AlignAction.h:34
AlignAction::Circle
Definition: AlignAction.h:34
AlignAction
Definition: AlignAction.h:29
GraphVisualEditor
Singelton class that provides a whiteboard for interactions with data structures. ...
Definition: GraphVisualEditor.h:50
QVBoxLayout
GraphVisualEditor::updateGraphDocumentList
void updateGraphDocumentList()
Updates selector combobox for graph documents.
Definition: GraphVisualEditor.cpp:215
QList
QLayout::addWidget
void addWidget(QWidget *w)
QToolButton
QFrame
GraphVisualEditor::updateActiveDataStructure
void updateActiveDataStructure(DataStructurePtr g)
Reflect currently active data structure in graph scene and graph editor toolbar.
Definition: GraphVisualEditor.cpp:291
QWidget::QWidget
QWidget(QWidget *parent, QFlags< Qt::WindowType > f)
DataItem.h
GraphVisualEditor::updateZoomSlider
void updateZoomSlider(qreal zoomFactor)
Definition: GraphVisualEditor.cpp:346
loader
static const KCatalogLoader loader("rocsvisualeditor")
AlignAction::HCenter
Definition: AlignAction.h:34
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QLabel
GraphVisualEditor::resizeEvent
void resizeEvent(QResizeEvent *event)
re-implementation of resize event to also setup the graph scene
Definition: GraphVisualEditor.cpp:111
QGraphicsView
AlignAction.h
GraphVisualEditor::updateDataStructureList
void updateDataStructureList()
Definition: GraphVisualEditor.cpp:304
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:16:27 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

rocs/VisualEditor

Skip menu "rocs/VisualEditor"
  • Main Page
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal