64 lines
2 KiB
Plaintext
64 lines
2 KiB
Plaintext
|
(local lume (require :lib.lume))
|
||
|
(local style (require :core.style))
|
||
|
(local common (require :core.common))
|
||
|
(local View (require :core.view))
|
||
|
|
||
|
(local SlideshowView (View:extend))
|
||
|
(fn SlideshowView.parse [slides]
|
||
|
(var style nil)
|
||
|
(icollect [_ slide (ipairs slides)]
|
||
|
(icollect [_ elem (ipairs slide)]
|
||
|
(match (type elem)
|
||
|
:table (do (set style elem) nil)
|
||
|
:string (lume.merge style {:text elem})))))
|
||
|
|
||
|
(fn SlideshowView.new [self slides]
|
||
|
(SlideshowView.super.new self)
|
||
|
(set self.slides slides)
|
||
|
(set self.islide 1)
|
||
|
(set self.ielem 0)
|
||
|
(self:advance))
|
||
|
|
||
|
(fn SlideshowView.next-slide [self]
|
||
|
(set self.islide (if (= self.islide (length self.slides)) 1 (+ self.islide 1)))
|
||
|
(set self.ielem 0)
|
||
|
(self:advance))
|
||
|
|
||
|
(fn SlideshowView.prev-slide [self]
|
||
|
(set self.islide (if (= self.islide 1) (length self.slides) (- self.islide 1)))
|
||
|
(set self.ielem (+ 1 (length (. self.slides self.islide))))
|
||
|
(self:back))
|
||
|
|
||
|
(fn SlideshowView.ielemNext [self ielem di]
|
||
|
(let [slide (. self.slides self.islide)
|
||
|
elem (. slide ielem)]
|
||
|
(when elem
|
||
|
(if elem.pause-after ielem
|
||
|
(self:ielemNext (+ ielem di) di)))))
|
||
|
|
||
|
(fn SlideshowView.advance [self]
|
||
|
(let [ielemNext (self:ielemNext (+ self.ielem 1) 1)]
|
||
|
(if ielemNext (set self.ielem ielemNext)
|
||
|
(self:next-slide))))
|
||
|
|
||
|
(fn SlideshowView.back [self]
|
||
|
(let [ielemNext (self:ielemNext (- self.ielem 1) -1)]
|
||
|
(if ielemNext (set self.ielem ielemNext)
|
||
|
(self:prev-slide))))
|
||
|
|
||
|
(fn SlideshowView.render-element [self element y]
|
||
|
(let [x (+ self.position.x
|
||
|
(match element.justify
|
||
|
:center (/ (- self.size.x (element.font:get_width element.text)) 2)
|
||
|
:left style.padding.x))]
|
||
|
(renderer.draw_text element.font element.text x y element.color)
|
||
|
(+ y (* style.padding.y 2) (element.font:get_height))))
|
||
|
|
||
|
(fn SlideshowView.draw [self]
|
||
|
(self:draw_background style.background)
|
||
|
(var y (+ style.padding.y self.position.y))
|
||
|
(each [ielem element (ipairs (. self.slides self.islide)) :until (> ielem self.ielem)]
|
||
|
(set y (self:render-element element y))))
|
||
|
|
||
|
SlideshowView
|