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