Skip to content

Commit 95aba97

Browse files
committed
Merge pull request #214 from JewrassicPark/develop
Adding animations
2 parents 86946f7 + d132dfe commit 95aba97

File tree

3 files changed

+320
-1
lines changed

3 files changed

+320
-1
lines changed

src/PhpPresentation/Slide.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@ class Slide implements ComparableInterface, ShapeContainerInterface
8686
* @var \PhpOffice\PhpPresentation\Slide\Transition
8787
*/
8888
private $slideTransition;
89+
90+
/**
91+
*
92+
* @var \PhpOffice\PhpPresentation\Slide\Animation
93+
*/
94+
private $animations = array();
8995

9096
/**
9197
* Hash index
@@ -540,4 +546,27 @@ public function setIsVisible($value = true)
540546
$this->isVisible = (bool)$value;
541547
return $this;
542548
}
549+
550+
/**
551+
* Add an animation to the slide
552+
*
553+
* @param \PhpOffice\PhpPresentation\Slide\Animation
554+
* @return \PhpOffice\PhpPresentation\Slide\Animation
555+
*/
556+
public function addAnimation($animation)
557+
{
558+
$this->animations[] = $animation;
559+
return $animation;
560+
}
561+
562+
/**
563+
* Get collection of animations
564+
*
565+
* @return \PhpOffice\PhpPresentation\Slide\Animation
566+
*/
567+
568+
public function getAnimations()
569+
{
570+
return $this->animations;
571+
}
543572
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
namespace PhpOffice\PhpPresentation\Slide;
3+
4+
class Animation
5+
{
6+
private $shapeCollection = array();
7+
8+
public function __construct()
9+
{
10+
11+
}
12+
13+
public function addShape($shape)
14+
{
15+
$this->shapeCollection[] = $shape;
16+
17+
return $shape;
18+
}
19+
20+
public function getShapeCollection()
21+
{
22+
return $this->shapeCollection;
23+
}
24+
}

src/PhpPresentation/Writer/PowerPoint2007/PptSlides.php

Lines changed: 267 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@ public function writeSlide(Slide $pSlide)
476476
$objWriter->endElement();
477477

478478
// Loop shapes
479-
$shapeId = 0;
479+
$shapeId = 1;
480480
$shapes = $pSlide->getShapeCollection();
481481
foreach ($shapes as $shape) {
482482
// Increment $shapeId
@@ -514,6 +514,272 @@ public function writeSlide(Slide $pSlide)
514514
if (!is_null($pSlide->getTransition())) {
515515
$this->writeTransition($objWriter, $pSlide->getTransition());
516516
}
517+
$shapeId = 1;
518+
$shapes = $pSlide->getShapeCollection();
519+
520+
$animations = $pSlide->getAnimations();
521+
522+
if (count($animations) > 0) {
523+
524+
$hashToIdMap = array();
525+
526+
foreach ($shapes as $shape) {
527+
$shapeId += 1;
528+
$hash = $shape->getHashCode();
529+
$hashToIdMap[$hash] = $shapeId;
530+
}
531+
532+
$animationIds = array();
533+
534+
foreach ($animations as $animation) {
535+
$shapesInAnimation = $animation->getShapeCollection();
536+
foreach ($shapesInAnimation as $shape) {
537+
$hash = $shape->getHashCode();
538+
$animationIds[] = $hashToIdMap[$hash];
539+
}
540+
}
541+
542+
$idCount = 1;
543+
544+
$objWriter->startElement('p:timing');
545+
546+
$objWriter->startElement('p:tnLst');
547+
548+
$objWriter->startElement('p:par');
549+
550+
$objWriter->startElement('p:cTn');
551+
$objWriter->writeAttribute('id', $idCount);
552+
$idCount += 1;
553+
$objWriter->writeAttribute('dur', 'indefinite');
554+
$objWriter->writeAttribute('restart', 'never');
555+
$objWriter->writeAttribute('nodeType', 'tmRoot');
556+
557+
$objWriter->startElement('p:childTnLst');
558+
559+
$objWriter->startElement('p:seq');
560+
$objWriter->writeAttribute('concurrent', '1');
561+
$objWriter->writeAttribute('nextAc', 'seek');
562+
563+
$objWriter->startElement('p:cTn');
564+
$objWriter->writeAttribute('id', $idCount);
565+
$idCount += 1;
566+
$objWriter->writeAttribute('dur', 'indefinite');
567+
$objWriter->writeAttribute('nodeType', 'mainSeq');
568+
569+
$objWriter->startElement("p:childTnLst");
570+
571+
//each animation has multiple shapes
572+
foreach ($animations as $animation) {
573+
574+
$objWriter->startElement("p:par");
575+
576+
$objWriter->startElement("p:cTn");
577+
$objWriter->writeAttribute("id", $idCount);
578+
$idCount += 1;
579+
$objWriter->writeAttribute("fill", "hold");
580+
581+
$objWriter->startElement('p:stCondLst');
582+
583+
$objWriter->startElement('p:cond');
584+
$objWriter->writeAttribute("delay", "indefinite");
585+
$objWriter->endElement();
586+
587+
$objWriter->endElement();
588+
589+
$objWriter->startElement("p:childTnLst");
590+
591+
$objWriter->startElement("p:par");
592+
593+
$objWriter->startElement("p:cTn");
594+
$objWriter->writeAttribute("id", $idCount);
595+
$idCount += 1;
596+
$objWriter->writeAttribute("fill", "hold");
597+
598+
$objWriter->startElement('p:stCondLst');
599+
600+
$objWriter->startElement('p:cond');
601+
$objWriter->writeAttribute("delay", "0");
602+
$objWriter->endElement();
603+
604+
$objWriter->endElement();
605+
606+
$objWriter->startElement("p:childTnLst");
607+
608+
$shapesInAnimation = $animation->getShapeCollection();
609+
610+
$firstInAni = true;
611+
612+
foreach ($shapesInAnimation as $shape) {
613+
$hash = $shape->getHashCode();
614+
$shapeId = $hashToIdMap[$hash];
615+
616+
$objWriter->startElement("p:par");
617+
618+
$objWriter->startElement("p:cTn");
619+
$objWriter->writeAttribute("id", $idCount);
620+
$idCount += 1;
621+
$objWriter->writeAttribute("presetID", "1");
622+
$objWriter->writeAttribute("presetClass", "entr");
623+
$objWriter->writeAttribute("fill", "hold");
624+
$objWriter->writeAttribute("presetSubtype", "0");
625+
$objWriter->writeAttribute("grpId", "0");
626+
627+
$nodeType = $firstInAni ? "clickEffect" : "withEffect";
628+
629+
$objWriter->writeAttribute("nodeType", $nodeType);
630+
631+
$objWriter->startElement("p:stCondLst");
632+
633+
$objWriter->startElement("p:cond");
634+
$objWriter->writeAttribute("delay", "0");
635+
$objWriter->endElement();
636+
637+
$objWriter->endElement();
638+
639+
$objWriter->startElement("p:childTnLst");
640+
641+
$objWriter->startElement("p:set");
642+
643+
$objWriter->startElement("p:cBhvr");
644+
645+
$objWriter->startElement("p:cTn");
646+
$objWriter->writeAttribute("id", $idCount);
647+
$idCount += 1;
648+
$objWriter->writeAttribute("dur", "1");
649+
$objWriter->writeAttribute("fill", "hold");
650+
651+
$objWriter->startElement("p:stCondLst");
652+
653+
$objWriter->startElement("p:cond");
654+
$objWriter->writeAttribute("delay", "0");
655+
$objWriter->endElement();
656+
657+
$objWriter->endElement();
658+
659+
660+
661+
$objWriter->endElement();
662+
663+
$objWriter->startElement("p:tgtEl");
664+
665+
$objWriter->startElement("p:spTgt");
666+
//shape id
667+
$objWriter->writeAttribute("spid", $shapeId);
668+
$objWriter->endElement();
669+
670+
$objWriter->endElement();
671+
672+
$objWriter->startElement("p:attrNameLst");
673+
674+
$objWriter->writeElement("p:attrName", "style.visibility");
675+
676+
$objWriter->endElement();
677+
678+
$objWriter->endElement();
679+
680+
$objWriter->startElement("p:to");
681+
682+
$objWriter->startElement("p:strVal");
683+
$objWriter->writeAttribute("val", "visible");
684+
$objWriter->endElement();
685+
686+
$objWriter->endElement();
687+
688+
$objWriter->endElement();
689+
690+
$objWriter->endElement(); //end child tn lst
691+
692+
$objWriter->endElement(); //end ctn
693+
694+
$objWriter->endElement();
695+
696+
$firstInAni = false;
697+
}
698+
699+
700+
$objWriter->endElement(); //end child lst
701+
702+
$objWriter->endElement(); //end ctn
703+
704+
$objWriter->endElement(); //end par
705+
706+
707+
$objWriter->endElement(); //end childtnlist
708+
709+
$objWriter->endElement(); //end ctn
710+
711+
$objWriter->endElement(); //end par
712+
713+
}
714+
715+
716+
$objWriter->endElement();
717+
718+
$objWriter->endElement();
719+
720+
///prevCondLst
721+
$objWriter->startElement("p:prevCondLst");
722+
723+
$objWriter->startElement('p:cond');
724+
$objWriter->writeAttribute('evt', 'onPrev');
725+
$objWriter->writeAttribute('delay', '0');
726+
727+
$objWriter->startElement('p:tgtEl');
728+
729+
$objWriter->writeElement('p:sldTgt', null);
730+
731+
$objWriter->endElement();
732+
733+
$objWriter->endElement();
734+
735+
$objWriter->endElement();
736+
737+
//nextCondLst
738+
$objWriter->startElement("p:nextCondLst");
739+
740+
$objWriter->startElement('p:cond');
741+
$objWriter->writeAttribute('evt', 'onNext');
742+
$objWriter->writeAttribute('delay', '0');
743+
744+
$objWriter->startElement('p:tgtEl');
745+
746+
$objWriter->writeElement('p:sldTgt', null);
747+
748+
$objWriter->endElement();
749+
750+
$objWriter->endElement();
751+
752+
$objWriter->endElement();
753+
754+
$objWriter->endElement(); //end p:seq
755+
756+
$objWriter->endElement(); //end p:childTnLst
757+
758+
$objWriter->endElement(); //end ctn
759+
760+
$objWriter->endElement(); //end par
761+
762+
$objWriter->endElement(); //end tnLst
763+
764+
$objWriter->startElement('p:bldLst');
765+
766+
//add in ids of all shapes in this slides animations
767+
768+
foreach ($animationIds as $id) {
769+
$objWriter->startElement('p:bldP');
770+
$objWriter->writeAttribute("spid", $id);
771+
$objWriter->writeAttribute('grpId', 0);
772+
$objWriter->endELement();
773+
}
774+
775+
776+
$objWriter->endElement(); // end bldLst
777+
778+
$objWriter->endElement(); //end timing
779+
780+
$objWriter->endElement();
781+
}
782+
517783

518784
$objWriter->endElement();
519785

0 commit comments

Comments
 (0)