(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