Class: Presently::DisplayView

Inherits:
Live::View
  • Object
show all
Defined in:
lib/presently/display_view.rb

Overview

The audience-facing display view that renders the current slide full-screen.

Connects to the PresentationController as a listener and updates whenever the slide changes. Pushes the current state on WebSocket reconnect.

Instance Method Summary collapse

Constructor Details

#initialize(id = Live::Element.unique_id, data = {}, controller: nil) ⇒ DisplayView

Initialize a new display view.



19
20
21
22
23
# File 'lib/presently/display_view.rb', line 19

def initialize(id = Live::Element.unique_id, data = {}, controller: nil)
	super(id, data)
	@controller = controller
	@slide_renderer = SlideRenderer.new(css_class: "slide current", templates: controller&.templates)
end

Instance Method Details

#bind(page) ⇒ Object

Bind this view to a page and register as a listener. Immediately pushes the current state to the client.



28
29
30
31
32
# File 'lib/presently/display_view.rb', line 28

def bind(page)
	super
	@controller.add_listener(self)
	self.update!
end

#closeObject

Close this view and unregister as a listener.



35
36
37
38
# File 'lib/presently/display_view.rb', line 35

def close
	@controller.remove_listener(self)
	super
end

#handle(event) ⇒ Object

Handle an event from the client.



47
48
49
50
51
52
53
54
# File 'lib/presently/display_view.rb', line 47

def handle(event)
	case event.dig(:detail, :action)
	when "next"
		@controller.advance!
	when "previous"
		@controller.retreat!
	end
end

#render(builder) ⇒ Object

Render the display view.



58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/presently/display_view.rb', line 58

def render(builder)
	slide = @controller.current_slide
	return unless slide
	
	builder.tag(:div, class: "display", data: {transition: slide.transition}) do
		builder.tag(:div, class: "slide-container") do
			@slide_renderer.render(builder, slide)
		end
		
		builder.tag(:div, class: "slide-counter") do
			builder.text("#{@controller.current_index + 1} / #{@controller.slide_count}")
		end
	end
end

#slide_changed!Object

Called by the controller when the slide changes.



41
42
43
# File 'lib/presently/display_view.rb', line 41

def slide_changed!
	self.update!
end