1 // Copyright (C) 2012-2019 The VPaint Developers.
2 // See the COPYRIGHT file at the top-level directory of this distribution
3 // and at https://github.com/dalboris/vpaint/blob/master/COPYRIGHT
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16
17 #include "Timeline.h"
18 #include "Scene.h"
19 #include "SceneObject.h"
20 #include <QKeyEvent>
21
22 #include "VectorAnimationComplex/VAC.h"
23 #include "VectorAnimationComplex/InbetweenFace.h"
24 #include "Background/Background.h"
25
26 #include <QtDebug>
27
28 #include "XmlStreamReader.h"
29 #include "XmlStreamWriter.h"
30
31 #include "OpenGL.h"
32 #include "Global.h"
33
34 #include "SaveAndLoad.h"
35
36 #include <QToolBar>
37
38 #include "Layer.h"
39
Scene()40 Scene::Scene() :
41 activeLayerIndex_(-1),
42 left_(0),
43 top_(0),
44 width_(1280),
45 height_(720)
46 {
47 indexHovered_ = -1;
48 }
49
createDefaultScene()50 Scene * Scene::createDefaultScene()
51 {
52 Scene * res = new Scene();
53 Layer * layer = res->createLayer(tr("Layer 1"));
54 layer->background()->setColor(Qt::white);
55 return res;
56 }
57
left() const58 double Scene::left() const
59 {
60 return left_;
61 }
62
top() const63 double Scene::top() const
64 {
65 return top_;
66 }
67
width() const68 double Scene::width() const
69 {
70 return width_;
71 }
72
height() const73 double Scene::height() const
74 {
75 return height_;
76 }
77
setLeft(double x)78 void Scene::setLeft(double x)
79 {
80 left_ = x;
81 emitChanged();
82 }
83
setTop(double y)84 void Scene::setTop(double y)
85 {
86 top_ = y;
87 emitChanged();
88 }
89
setWidth(double w)90 void Scene::setWidth(double w)
91 {
92 width_ = w;
93 emitChanged();
94 }
95
setHeight(double h)96 void Scene::setHeight(double h)
97 {
98 height_ = h;
99 emitChanged();
100 }
101
setCanvasDefaultValues()102 void Scene::setCanvasDefaultValues()
103 {
104 left_ = 0;
105 top_ = 0;
106 width_ = 1280;
107 height_ = 720;
108
109 // Don't emit changed on purpose
110 }
111
copyFrom(Scene * other)112 void Scene::copyFrom(Scene * other)
113 {
114 // XXX We should also copy canvas properties
115
116 // Block signals
117 blockSignals(true);
118
119 // Reset to default
120 clear(true);
121
122 // Copy layers
123 foreach(Layer * layer, other->layers_)
124 addLayer_(layer->clone(), true);
125 activeLayerIndex_ = other->activeLayerIndex_;
126
127 // Reset hovered
128 indexHovered_ = -1;
129
130 // Unblock signals
131 blockSignals(false);
132
133 // Emit signals
134 emit needUpdatePicking();
135 emitChanged();
136 emit selectionChanged();
137 emit layerAttributesChanged();
138 }
139
clear(bool silent)140 void Scene::clear(bool silent)
141 {
142 // Block signals
143 blockSignals(true);
144
145 // Delete all layers
146 foreach(Layer * layer, layers_)
147 delete layer;
148 layers_.clear();
149 activeLayerIndex_ = -1;
150
151 // XXX Shouldn't this clear left/top/width/height too?
152
153 // Unblock signals
154 blockSignals(false);
155
156 // Emit signals
157 if(!silent)
158 {
159 emitChanged();
160 emit needUpdatePicking();
161 emit selectionChanged();
162 emit layerAttributesChanged();
163 }
164 }
165
~Scene()166 Scene::~Scene()
167 {
168 clear(true);
169 }
170
171 // ----------------------- Save and Load -------------------------
172
save(QTextStream & out)173 void Scene::save(QTextStream & out)
174 {
175 // XXX Deprecated
176 /*
177 out << Save::newField("SceneObjects");
178 out << "\n" << Save::indent() << "[";
179 Save::incrIndent();
180 foreach(Layer * layer, layers_)
181 {
182 out << Save::openCurlyBrackets();
183 layer->vac()->save(out);
184 out << Save::closeCurlyBrackets();
185 }
186 Save::decrIndent();
187 out << "\n" << Save::indent() << "]";
188 */
189 }
190
exportSVG(Time t,QTextStream & out)191 void Scene::exportSVG(Time t, QTextStream & out)
192 {
193 // Export Layers
194 foreach(Layer * layer, layers_)
195 {
196 layer->background()->exportSVG(
197 t.frame(), out, left(), top(), width(), height());
198 layer->exportSVG(t, out);
199 }
200 }
201
read(QTextStream & in)202 void Scene::read(QTextStream & in)
203 {
204 // XXX Deprecated
205 /*
206 clear(true);
207
208 QString field;
209 QString bracket;
210 field = Read::field(in);
211 Read::skipBracket(in); // [
212 while(Read::string(in) == "{")
213 {
214 addLayer(SceneObject::read(in), true);
215 Read::skipBracket(in); // }
216 }
217 // if here, last read string == ]
218
219
220 VectorAnimationComplex::VAC * vac = activeLayer();
221 if(vac)
222 {
223 connect(vac,SIGNAL(selectionChanged()),this,SIGNAL(selectionChanged()));
224 }
225
226 emit changed();
227 emit needUpdatePicking();
228 emit selectionChanged();
229 */
230 }
231
writeAllLayers(XmlStreamWriter & xml)232 void Scene::writeAllLayers(XmlStreamWriter & xml)
233 {
234 foreach(Layer * layer, layers_)
235 {
236 xml.writeStartElement("layer");
237 layer->write(xml);
238 xml.writeEndElement();
239 }
240 }
241
readOneLayer(XmlStreamReader & xml)242 void Scene::readOneLayer(XmlStreamReader & xml)
243 {
244 // Precondition: XML element "layer" just opened
245
246 // XXX Remove this
247 blockSignals(true);
248
249 Layer * layer = new Layer();
250 layer->read(xml);
251 addLayer_(layer, true);
252
253 // XXX Remove these: only emit once after finishing to read the file
254 blockSignals(false);
255 emit needUpdatePicking();
256 emit changed();
257 emit selectionChanged();
258 emit layerAttributesChanged();
259 }
260
readCanvas(XmlStreamReader & xml)261 void Scene::readCanvas(XmlStreamReader & xml)
262 {
263 setCanvasDefaultValues();
264
265 // Canvas
266 if(xml.attributes().hasAttribute("position"))
267 {
268 QString stringPos = xml.attributes().value("position").toString();
269 QStringList list = stringPos.split(" ");
270 setLeft(list[0].toDouble());
271 setTop(list[1].toDouble());
272 }
273 if(xml.attributes().hasAttribute("size"))
274 {
275 QString stringsize = xml.attributes().value("size").toString();
276 QStringList list = stringsize.split(" ");
277 setWidth(list[0].toDouble());
278 setHeight(list[1].toDouble());
279 }
280
281 xml.skipCurrentElement();
282 }
283
writeCanvas(XmlStreamWriter & xml)284 void Scene::writeCanvas(XmlStreamWriter & xml)
285 {
286 xml.writeAttribute("position", QString().setNum(left()) + " " + QString().setNum(top()));
287 xml.writeAttribute("size", QString().setNum(width()) + " " + QString().setNum(height()));
288 }
289
relativeRemap(const QDir & oldDir,const QDir & newDir)290 void Scene::relativeRemap(const QDir & oldDir, const QDir & newDir)
291 {
292 foreach(Layer * layer, layers_)
293 {
294 layer->background()->relativeRemap(oldDir, newDir);
295 }
296 }
297
298 // ----------------------- Drawing the scene -------------------------
299
300 // XXX Refactor this: move it to View. Even better, have a Canvas and
301 // CanvasRenderer class
drawCanvas(ViewSettings &)302 void Scene::drawCanvas(ViewSettings & /*viewSettings*/)
303 {
304 double x = left();
305 double y = top();
306 double w = width();
307 double h = height();
308
309 if(global()->showCanvas())
310 {
311 // Out-of-canvas background color
312 glClearColor(0.8f, 0.8f, 0.8f, 1.0f);
313 glClear(GL_COLOR_BUFFER_BIT);
314
315 // Canvas border
316 glColor4d(0.0, 0.0, 0.0, 1.0);
317 glLineWidth(3.0);
318 glBegin(GL_LINE_LOOP);
319 {
320 glVertex2d(x,y);
321 glVertex2d(x+w,y);
322 glVertex2d(x+w,y+h);
323 glVertex2d(x,y+h);
324 }
325 glEnd();
326
327 // Canvas color
328 glColor4d(1.0, 1.0, 1.0, 1.0);
329 glBegin(GL_QUADS);
330 {
331 glVertex2d(x,y);
332 glVertex2d(x+w,y);
333 glVertex2d(x+w,y+h);
334 glVertex2d(x,y+h);
335 }
336 glEnd();
337 }
338 else
339 {
340 // Canvas color
341 glColor4d(1.0, 1.0, 1.0, 1.0);
342 glClear(GL_COLOR_BUFFER_BIT);
343 }
344 }
345
draw(Time time,ViewSettings & viewSettings)346 void Scene::draw(Time time, ViewSettings & viewSettings)
347 {
348 // Draw layers
349 foreach(Layer * layer, layers_)
350 {
351 layer->draw(time, viewSettings);
352 }
353 }
354
drawPick(Time time,ViewSettings & viewSettings)355 void Scene::drawPick(Time time, ViewSettings & viewSettings)
356 {
357 // Find which layer to pick
358 Layer * layer = activeLayer();
359 int index = -1;
360 for(int i=0; i<layers_.size(); i++)
361 {
362 if (layers_[i] == layer)
363 {
364 index = i;
365 break;
366 }
367 }
368
369 // Draw picking information
370 if (index >= 0)
371 {
372 Picking::setIndex(index);
373 layer->drawPick(time, viewSettings);
374 }
375 }
376
377
378 // ---------------- Highlighting and Selecting -----------------------
379
380 // No need to emit changed() or needUpdatePicking() here, since highlighting and selecting
381 // is trigerred by View or View3D, and hence they can decide themselves what do they
382 // need to update
383
setHoveredObject(Time time,int index,int id)384 void Scene::setHoveredObject(Time time, int index, int id)
385 {
386 setNoHoveredObject();
387 indexHovered_ = index;
388 layers_[index]->setHoveredObject(time, id);
389 }
390
setNoHoveredObject()391 void Scene::setNoHoveredObject()
392 {
393 if(indexHovered_ != -1)
394 {
395 layers_[indexHovered_]->setNoHoveredObject();
396 indexHovered_ = -1;
397 }
398 }
399
select(Time time,int index,int id)400 void Scene::select(Time time, int index, int id)
401 {
402 layers_[index]->select(time, id);
403 }
404
deselect(Time time,int index,int id)405 void Scene::deselect(Time time, int index, int id)
406 {
407 layers_[index]->deselect(time, id);
408 }
409
toggle(Time time,int index,int id)410 void Scene::toggle(Time time, int index, int id)
411 {
412 layers_[index]->toggle(time, id);
413 }
414
deselectAll(Time time)415 void Scene::deselectAll(Time time)
416 {
417 foreach(Layer * layer, layers_)
418 layer->deselectAll(time);
419 }
420
deselectAll()421 void Scene::deselectAll()
422 {
423 foreach(Layer * layer, layers_)
424 layer->deselectAll();
425 }
426
invertSelection()427 void Scene::invertSelection()
428 {
429 foreach(Layer * layer, layers_)
430 layer->invertSelection();
431 }
432
selectAllInFrame()433 void Scene::selectAllInFrame()
434 {
435 Layer * layer = activeLayer();
436 if(layer)
437 {
438 layer->vac()->selectAllAtTime(global()->activeTime());
439 }
440 }
441
selectAllInAnimation()442 void Scene::selectAllInAnimation()
443 {
444 Layer * layer = activeLayer();
445 if(layer)
446 {
447 layer->vac()->selectAll();
448 }
449 }
450
selectConnected()451 void Scene::selectConnected()
452 {
453 Layer * layer = activeLayer();
454 if(layer)
455 {
456 layer->vac()->selectConnected();
457 }
458 }
459
selectClosure()460 void Scene::selectClosure()
461 {
462 Layer * layer = activeLayer();
463 if(layer)
464 {
465 layer->vac()->selectClosure();
466 }
467 }
468
selectVertices()469 void Scene::selectVertices()
470 {
471 Layer * layer = activeLayer();
472 if(layer)
473 {
474 layer->vac()->selectVertices();
475 }
476 }
477
selectEdges()478 void Scene::selectEdges()
479 {
480 Layer * layer = activeLayer();
481 if(layer)
482 {
483 layer->vac()->selectEdges();
484 }
485 }
486
selectFaces()487 void Scene::selectFaces()
488 {
489 Layer * layer = activeLayer();
490 if(layer)
491 {
492 layer->vac()->selectFaces();
493 }
494 }
495
deselectVertices()496 void Scene::deselectVertices()
497 {
498 Layer * layer = activeLayer();
499 if(layer)
500 {
501 layer->vac()->deselectVertices();
502 }
503 }
504
deselectEdges()505 void Scene::deselectEdges()
506 {
507 Layer * layer = activeLayer();
508 if(layer)
509 {
510 layer->vac()->deselectEdges();
511 }
512 }
513
deselectFaces()514 void Scene::deselectFaces()
515 {
516 Layer * layer = activeLayer();
517 if(layer)
518 {
519 layer->vac()->deselectFaces();
520 }
521 }
522
keyPressEvent(QKeyEvent * event)523 void Scene::keyPressEvent(QKeyEvent *event)
524 {
525 event->ignore();
526 }
527
keyReleaseEvent(QKeyEvent * event)528 void Scene::keyReleaseEvent(QKeyEvent *event)
529 {
530 event->ignore();
531 }
532
addLayer_(Layer * layer,bool silent)533 void Scene::addLayer_(Layer * layer, bool silent)
534 {
535 layers_ << layer;
536 if (activeLayerIndex_ < 0) {
537 activeLayerIndex_ = 0;
538 }
539
540 connect(layer, SIGNAL(changed()), this, SIGNAL(changed()));
541 connect(layer, SIGNAL(checkpoint()), this, SIGNAL(checkpoint()));
542 connect(layer, SIGNAL(needUpdatePicking()), this, SIGNAL(needUpdatePicking()));
543 connect(layer, SIGNAL(selectionChanged()), this, SIGNAL(selectionChanged()));
544 connect(layer, SIGNAL(layerAttributesChanged()), this, SIGNAL(layerAttributesChanged()));
545
546 if(!silent)
547 {
548 emitChanged();
549 emit needUpdatePicking();
550 emit layerAttributesChanged();
551 }
552 }
553
populateToolBar(QToolBar * toolBar)554 void Scene::populateToolBar(QToolBar * toolBar)
555 {
556 VectorAnimationComplex::VAC::populateToolBar(toolBar, this);
557 }
558
deleteSelectedCells()559 void Scene::deleteSelectedCells()
560 {
561 Layer * layer = activeLayer();
562 if(layer)
563 {
564 layer->vac()->deleteSelectedCells();
565 }
566 }
567
test()568 void Scene::test()
569 {
570 Layer * layer = activeLayer();
571 if(layer)
572 {
573 layer->vac()->test();
574 }
575 }
576
smartDelete()577 void Scene::smartDelete()
578 {
579 Layer * layer = activeLayer();
580 if(layer)
581 {
582 layer->vac()->smartDelete();
583 }
584 }
585
numLayers() const586 int Scene::numLayers() const
587 {
588 return layers_.size();
589 }
590
layer(int i) const591 Layer* Scene::layer(int i) const
592 {
593 if (0 <= i && i < numLayers())
594 {
595 return layers_[i];
596 }
597 else
598 {
599 return nullptr;
600 }
601 }
602
setActiveLayer(int i)603 void Scene::setActiveLayer(int i)
604 {
605 if(i != activeLayerIndex_ && 0 <= i && i < numLayers())
606 {
607 deselectAll();
608
609 activeLayerIndex_ = i;
610
611 emitChanged();
612 emit needUpdatePicking();
613 emit layerAttributesChanged();
614 }
615 }
616
activeLayer() const617 Layer * Scene::activeLayer() const
618 {
619 return layer(activeLayerIndex_);
620 }
621
activeLayerIndex() const622 int Scene::activeLayerIndex() const
623 {
624 return activeLayerIndex_;
625 }
626
activeVAC() const627 VectorAnimationComplex::VAC * Scene::activeVAC() const
628 {
629 Layer * layer = activeLayer();
630 return layer ? layer->vac() : nullptr;
631 }
632
activeBackground() const633 Background * Scene::activeBackground() const
634 {
635 Layer * layer = activeLayer();
636 return layer ? layer->background() : nullptr;
637 }
638
createLayer()639 Layer * Scene::createLayer()
640 {
641 return createLayer(tr("Layer %1").arg(numLayers() + 1));
642 }
643
createLayer(const QString & name)644 Layer * Scene::createLayer(const QString & name)
645 {
646 // Create new layer, add it on top for now
647 Layer * layer = new Layer(name);
648 addLayer_(layer, true);
649
650 // Move above active layer, or keep last if no active layer
651 int newActiveLayerIndex = layers_.size() - 1;
652 if (0 <= activeLayerIndex_ && activeLayerIndex_ < newActiveLayerIndex - 1)
653 {
654 newActiveLayerIndex = activeLayerIndex_ + 1;
655 for (int i = layers_.size() - 1; i > newActiveLayerIndex; --i)
656 {
657 layers_[i] = layers_[i-1];
658 }
659 layers_[newActiveLayerIndex] = layer;
660 }
661
662 // Set as active
663 activeLayerIndex_ = newActiveLayerIndex;
664
665 // Emit signals
666 emitChanged();
667 emit needUpdatePicking();
668 emit layerAttributesChanged();
669
670 return layer;
671 }
672
moveActiveLayerUp()673 void Scene::moveActiveLayerUp()
674 {
675 int i = activeLayerIndex_;
676 if(0 <= i && i < numLayers() - 1)
677 {
678 // Swap out layers
679 int j = i + 1;
680 std::swap(layers_[i], layers_[j]);
681
682 // Set new active index.
683 // Note: we don't call setActiveLayer(j) to avoid calling deselectAll().
684 activeLayerIndex_ = j;
685
686 // Emit signals. Note: it may be tempting to think that updating
687 // picking is unnecessary (because the pickable cells haven't moved),
688 // however the picking image data contains the layer index which has
689 // changed, and therefore this picking image needs to be re-rendered.
690 emitChanged();
691 emit needUpdatePicking();
692 emit layerAttributesChanged();
693 }
694 }
695
moveActiveLayerDown()696 void Scene::moveActiveLayerDown()
697 {
698 int i = activeLayerIndex_;
699 if(0 < i && i < numLayers())
700 {
701 // Swap out layers
702 int j = i - 1;
703 std::swap(layers_[i], layers_[j]);
704
705 // Set new active index.
706 // Note: we don't call setActiveLayer(j) to avoid calling deselectAll().
707 activeLayerIndex_ = j;
708
709 // Emit signals. Note: it may be tempting to think that updating
710 // picking is unnecessary (because the pickable cells haven't moved),
711 // however the picking image data contains the layer index which has
712 // changed, and therefore this picking image needs to be re-rendered.
713 emitChanged();
714 emit needUpdatePicking();
715 emit layerAttributesChanged();
716 }
717 }
718
destroyActiveLayer()719 void Scene::destroyActiveLayer()
720 {
721 int i = activeLayerIndex_;
722 if(0 <= i && i < numLayers())
723 {
724 deselectAll();
725
726 Layer * toBeDestroyedLayer = layers_[i];
727 layers_.removeAt(i);
728
729 // Set as active the layer below, unless it was the bottom-most layer
730 // or the only layer in the scene.
731 if (numLayers() == 0)
732 {
733 // no more layers
734 activeLayerIndex_ = -1;
735 }
736 else if (activeLayerIndex_ == 0)
737 {
738 // was the bottom-most layer
739 activeLayerIndex_ = 0;
740 }
741 else
742 {
743 // had layer below
744 --activeLayerIndex_;
745 }
746
747 delete toBeDestroyedLayer;
748
749 emitChanged();
750 emit needUpdatePicking();
751 emit layerAttributesChanged();
752 }
753 }
754
createInbetweenFace()755 VectorAnimationComplex::InbetweenFace * Scene::createInbetweenFace()
756 {
757 Layer * layer = activeLayer();
758 if(layer)
759 {
760 return layer->vac()->newInbetweenFace(
761 QList<VectorAnimationComplex::AnimatedCycle>(),
762 QSet<VectorAnimationComplex::KeyFace*>(),
763 QSet<VectorAnimationComplex::KeyFace*>());
764 }
765 else
766 {
767 return nullptr;
768 }
769 }
770
cut(VectorAnimationComplex::VAC * & clipboard)771 void Scene::cut(VectorAnimationComplex::VAC* & clipboard)
772 {
773 Layer * layer = activeLayer();
774 if(layer)
775 {
776 layer->vac()->cut(clipboard);
777 }
778 }
779
copy(VectorAnimationComplex::VAC * & clipboard)780 void Scene::copy(VectorAnimationComplex::VAC* & clipboard)
781 {
782 Layer * layer = activeLayer();
783 if(layer)
784 {
785 layer->vac()->copy(clipboard);
786 }
787 }
788
paste(VectorAnimationComplex::VAC * & clipboard)789 void Scene::paste(VectorAnimationComplex::VAC* & clipboard)
790 {
791 Layer * layer = activeLayer();
792 if(layer)
793 {
794 layer->vac()->paste(clipboard);
795 }
796 }
797
motionPaste(VectorAnimationComplex::VAC * & clipboard)798 void Scene::motionPaste(VectorAnimationComplex::VAC* & clipboard)
799 {
800 Layer * layer = activeLayer();
801 if(layer)
802 {
803 layer->vac()->motionPaste(clipboard);
804 }
805 }
806
createFace()807 void Scene::createFace()
808 {
809 Layer * layer = activeLayer();
810 if(layer)
811 {
812 layer->vac()->createFace();
813 }
814 }
815
addCyclesToFace()816 void Scene::addCyclesToFace()
817 {
818 Layer * layer = activeLayer();
819 if(layer)
820 {
821 layer->vac()->addCyclesToFace();
822 }
823 }
824
removeCyclesFromFace()825 void Scene::removeCyclesFromFace()
826 {
827 Layer * layer = activeLayer();
828 if(layer)
829 {
830 layer->vac()->removeCyclesFromFace();
831 }
832 }
833
changeColor()834 void Scene::changeColor()
835 {
836 Layer * layer = activeLayer();
837 if(layer)
838 {
839 layer->vac()->changeColor();
840 }
841 }
raise()842 void Scene::raise()
843 {
844 Layer * layer = activeLayer();
845 if(layer)
846 {
847 layer->vac()->raise();
848 }
849 }
850
lower()851 void Scene::lower()
852 {
853 Layer * layer = activeLayer();
854 if(layer)
855 {
856 layer->vac()->lower();
857 }
858 }
859
raiseToTop()860 void Scene::raiseToTop()
861 {
862 Layer * layer = activeLayer();
863 if(layer)
864 {
865 layer->vac()->raiseToTop();
866 }
867 }
868
lowerToBottom()869 void Scene::lowerToBottom()
870 {
871 Layer * layer = activeLayer();
872 if(layer)
873 {
874 layer->vac()->lowerToBottom();
875 }
876 }
877
altRaise()878 void Scene::altRaise()
879 {
880 Layer * layer = activeLayer();
881 if(layer)
882 {
883 layer->vac()->altRaise();
884 }
885 }
886
altLower()887 void Scene::altLower()
888 {
889 Layer * layer = activeLayer();
890 if(layer)
891 {
892 layer->vac()->altLower();
893 }
894 }
895
altRaiseToTop()896 void Scene::altRaiseToTop()
897 {
898 Layer * layer = activeLayer();
899 if(layer)
900 {
901 layer->vac()->altRaiseToTop();
902 }
903 }
904
altLowerToBottom()905 void Scene::altLowerToBottom()
906 {
907 Layer * layer = activeLayer();
908 if(layer)
909 {
910 layer->vac()->altLowerToBottom();
911 }
912 }
913
changeEdgeWidth()914 void Scene::changeEdgeWidth()
915 {
916 Layer * layer = activeLayer();
917 if(layer)
918 {
919 layer->vac()->changeEdgeWidth();
920 }
921 }
922
glue()923 void Scene::glue()
924 {
925 Layer * layer = activeLayer();
926 if(layer)
927 {
928 layer->vac()->glue();
929 }
930 }
931
unglue()932 void Scene::unglue()
933 {
934 Layer * layer = activeLayer();
935 if(layer)
936 {
937 layer->vac()->unglue();
938 }
939 }
940
uncut()941 void Scene::uncut()
942 {
943 Layer * layer = activeLayer();
944 if(layer)
945 {
946 layer->vac()->uncut();
947 }
948 }
949
inbetweenSelection()950 void Scene::inbetweenSelection()
951 {
952 Layer * layer = activeLayer();
953 if(layer)
954 {
955 layer->vac()->inbetweenSelection();
956 }
957 }
958
keyframeSelection()959 void Scene::keyframeSelection()
960 {
961 Layer * layer = activeLayer();
962 if(layer)
963 {
964 layer->vac()->keyframeSelection();
965 }
966 }
967
resetCellsToConsiderForCutting()968 void Scene::resetCellsToConsiderForCutting()
969 {
970 Layer * layer = activeLayer();
971 if(layer)
972 {
973 layer->vac()->resetCellsToConsiderForCutting();
974 }
975 }
976
updateCellsToConsiderForCutting()977 void Scene::updateCellsToConsiderForCutting()
978 {
979 Layer * layer = activeLayer();
980 if(layer)
981 {
982 layer->vac()->updateCellsToConsiderForCutting();
983 }
984 }
985