class Rabbit::Renderer::Display::ClutterEmbed

Attributes

filename[RW]

Public Class Methods

new(canvas) click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 63
def initialize(canvas)
  @recreate_id = nil
  @need_reload_theme = false
  super
  @filename = nil
  init_clutter_embed
end
priority() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 40
def priority
  0
end

Public Instance Methods

attach_to(window, container=nil) click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 211
def attach_to(window, container=nil)
  super

  init_menu
  add_widgets_to_container(@container)
  widget.show
  attach_menu(@window)
  attach_key(@window)
end
cache_all_slides() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 246
def cache_all_slides
end
clear_slide() click to toggle source
Calls superclass method
# File lib/rabbit/renderer/display/clutter-embed.rb, line 82
def clear_slide
  super
  redraw
end
detach() click to toggle source
Calls superclass method Rabbit::Renderer::Display::Base#detach
# File lib/rabbit/renderer/display/clutter-embed.rb, line 221
def detach
  detach_key(@window)
  detach_menu(@window)
  widget.hide
  unless @window.destroyed?
    remove_widgets_from_container(@container)
  end

  super
end
display?() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 198
def display?
  true
end
index_mode_off() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 170
def index_mode_off
  restore_cursor(:index)
end
index_mode_on() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 165
def index_mode_on
  keep_cursor(:index)
  update_cursor(nil, true)
end
post_apply_theme() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 99
def post_apply_theme
  recreate_actors
end
post_fullscreen() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 87
def post_fullscreen
  update_cursor(:blank, true)
end
post_iconify() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 96
def post_iconify
end
post_move(old_index, index) click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 103
def post_move(old_index, index)
  update_title
  update_menu

  old_actor = retrieve_actor(old_index)
  old_actor.hide if old_actor
  actor = retrieve_actor(index)
  if actor and !hiding?
    actor.content.set_size(actor.width, actor.height)
    actor.show
    actor.raise_top
    if old_actor
      transition = @canvas.slides[index].transition
      transition_method = "transition_#{transition}"
      if transition and respond_to?(transition_method, true)
        send(transition_method, old_actor, actor, old_index, index)
      end
    end
  end
end
post_move_in_slide(old_index, index) click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 124
def post_move_in_slide(old_index, index)
  actor = retrieve_actor(nil, old_index)
  actor.hide if actor
  actor = retrieve_actor(nil, index)
  if actor and !hiding?
    actor.content.set_size(actor.width, actor.height)
    actor.show
    actor.raise_top
  end
end
post_parse() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 138
def post_parse
  clear_button_handler
  update_title
  update_menu
  if @need_reload_theme
    @need_reload_theme = false
    reload_theme
  end
end
post_to_pixbuf(canceled) click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 162
def post_to_pixbuf(canceled)
end
post_toggle_index_mode() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 151
def post_toggle_index_mode
  recreate_actors
end
post_unfullscreen() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 91
def post_unfullscreen
  update_cursor(nil, true)
  update_menu
end
pre_parse() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 135
def pre_parse
end
pre_to_pixbuf(slide_size) click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 155
def pre_to_pixbuf(slide_size)
end
pre_toggle_index_mode() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 148
def pre_toggle_index_mode
end
redraw() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 75
def redraw
  actor = current_actor
  # TODO: We need more work for periodical redraw
  actor.content.invalidate if actor
  widget.queue_draw
end
reload_theme(&callback) click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 202
def reload_theme(&callback)
  if @canvas.applying?
    @need_reload_theme = true
  else
    callback ||= Utils.process_pending_events_proc
    @canvas.activate("ReloadTheme", &callback)
  end
end
reset_adjustment() click to toggle source
Calls superclass method
# File lib/rabbit/renderer/display/clutter-embed.rb, line 232
def reset_adjustment
  super
  @actors.each do |slide_actors|
    slide_actors.each do |actor|
      actor.x = 0
      actor.y = 0
      actor.set_scale(1, 1)
      actor.set_rotation(Clutter::X_AXIS, 0, 0, 0, 0)
      actor.set_rotation(Clutter::Y_AXIS, 0, 0, 0, 0)
      actor.set_rotation(Clutter::Z_AXIS, 0, 0, 0, 0)
    end
  end
end
to_pixbufing(i) click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 158
def to_pixbufing(i)
  true
end
toggle_blackout() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 186
def toggle_blackout
  super
  if blackouting?
    @stage.color = Clutter::Color.parse("black")
    current_actor.hide
  else
    reset_stage_color
    current_actor.show
  end
  redraw
end
toggle_whiteout() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 174
def toggle_whiteout
  super
  if whiteouting?
    @stage.color = Clutter::Color.parse("white")
    current_actor.hide
  else
    reset_stage_color
    current_actor.show
  end
  redraw
end
widget() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 71
def widget
  @embed
end

Private Instance Methods

add_widgets_to_container(container) click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 250
def add_widgets_to_container(container)
  container.add(@embed)
end
configured(x, y, w, h) click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 326
def configured(x, y, w, h)
  super
  recreate_actors
end
configured_after(widget, event) click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 337
def configured_after(widget, event)
  @real_width = event.width
  @real_height = event.height
  @size_dirty = true
  reload_theme if @drawable
  false
end
current_actor() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 466
def current_actor
  retrieve_actor
end
depth() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 293
def depth
  @embed.window.depth
end
draw_nth_slide(index=nil, index_in_slide=nil) click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 297
def draw_nth_slide(index=nil, index_in_slide=nil)
  index ||= @canvas.current_index
  slide = @canvas.slides[index]
  if slide
    old_index_in_slide = slide.drawing_index
    slide.drawing_index = index_in_slide if index_in_slide
    begin
      slide.draw(@canvas, true)
      slide.draw(@canvas, false)
    ensure
      slide.drawing_index = old_index_in_slide
    end
  end
end
grab() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 528
def grab
  @embed.grab_add
  Gdk.pointer_grab(@embed.window, false,
                   Gdk::EventMask::BUTTON_PRESS_MASK |
                   Gdk::EventMask::BUTTON_RELEASE_MASK |
                   Gdk::EventMask::SCROLL_MASK |
                   Gdk::EventMask::POINTER_MOTION_MASK,
                   nil, nil,
                   Gdk::CURRENT_TIME)
end
init_clutter_embed() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 268
def init_clutter_embed
  @embed = ClutterGtk::Embed.new
  @embed.can_focus = true
  @stage = @embed.stage
  reset_stage_color
  set_map
  set_draw
  set_configure_event_after

  event_mask = Gdk::EventMask::BUTTON_PRESS_MASK
  event_mask |= Gdk::EventMask::BUTTON_RELEASE_MASK
  event_mask |= Gdk::EventMask::BUTTON1_MOTION_MASK
  event_mask |= Gdk::EventMask::BUTTON2_MOTION_MASK
  event_mask |= Gdk::EventMask::BUTTON3_MOTION_MASK
  @embed.add_events(event_mask)
  set_key_press_event(@embed)
  set_button_event(@embed)
  set_motion_notify_event
  set_scroll_event
end
init_color() click to toggle source
Calls superclass method
# File lib/rabbit/renderer/display/clutter-embed.rb, line 258
def init_color
  super
  init_engine_color
end
init_dpi() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 263
def init_dpi
  @x_dpi = ScreenInfo.screen_x_resolution
  @y_dpi = ScreenInfo.screen_y_resolution
end
pointer() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 544
def pointer
  window, x, y, mask = @embed.window.pointer
  [x, y, mask]
end
recreate_actors() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 470
def recreate_actors
  if @recreate_id
    GLib::Source.remove(@recreate_id)
    @recreate_id = nil
  end

  index = nil
  index_in_slide = 0
  @actors = []
  @stage.remove_all
  @recreate_id = GLib::Idle.add do
    i = index || @canvas.current_index
    slide_actors = @actors[i] || []
    actor = slide_actors[index_in_slide]
    slide = @canvas.slides[i]
    if actor.nil?
      canvas = Clutter::Canvas.new
      canvas.signal_connect(:draw, i, index_in_slide) do |_, context, _width, _height, _i, _index_in_slide|
        init_context(context)
        draw_nth_slide(_i, _index_in_slide)
        finish_context
      end
      actor = Clutter::Actor.new
      actor.instance_variable_set(:@c, canvas)
      actor.content = canvas
      actor.set_size(@real_width, @real_height)
      @actors[i] ||= []
      @actors[i][index_in_slide] = actor
      @stage.add_child(actor)
      current_index_in_slide = index_in_slide == slide.drawing_index
      if index.nil? and current_index_in_slide and !hiding?
        canvas.set_size(@real_width, @real_height)
        actor.show
        actor.raise_top
        Utils.process_pending_events_proc.call
      else
        actor.hide
      end
    end

    slide = @canvas.slides[i]
    if slide and slide.last?(index_in_slide)
      index = -1 if index.nil?
      index += 1
      index_in_slide = 0
      have_next = index < @canvas.slide_size
    else
      index_in_slide += 1
      have_next = true
    end

    unless have_next
      @recreate_id = nil
    end
    have_next
  end
end
remove_widgets_from_container(container) click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 254
def remove_widgets_from_container(container)
  container.remove(@embed)
end
reset_stage_color() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 289
def reset_stage_color
  @stage.color = Clutter::Color.parse("black")
end
retrieve_actor(index=nil, index_in_slide=nil) click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 453
def retrieve_actor(index=nil, index_in_slide=nil)
  index ||= index || @canvas.current_index
  slide_actors = @actors[index]
  return nil if slide_actors.nil?

  if index_in_slide.nil?
    slide = @canvas.slides[index]
    return nil if slide.nil?
    index_in_slide = slide.drawing_index
  end
  slide_actors[index_in_slide]
end
set_configure_event_after() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 331
def set_configure_event_after
  @embed.signal_connect_after("configure_event") do |widget, event|
    configured_after(widget, event)
  end
end
set_draw() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 319
def set_draw
  @embed.signal_connect("draw") do |widget, context|
    reload_source
    false
  end
end
set_map() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 312
def set_map
  @embed.signal_connect("map") do |widget, event|
    set_drawable(widget.window)
    false
  end
end
set_motion_notify_event() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 345
def set_motion_notify_event
  @embed.signal_connect("motion_notify_event") do |widget, event|
    call_hook_procs(@motion_notify_hook_procs, event)
  end

  begin_x = nil
  begin_y = nil
  prev_x = nil
  prev_y = nil
  start_time = nil
  handled = false
  scale = 1.0
  axis_x = 0.5
  axis_y = 0.5

  add_button_press_hook do |event|
    handled = false
    start_time = event.time
    begin_x = prev_x = event.x
    begin_y = prev_y = event.y
    false
  end

  add_motion_notify_hook do |event|
    state = event.state
    if state.button2_mask?
      handled = true
      processed = true
      x = event.x.to_f
      y = event.y.to_f
      w = width.to_f
      h = height.to_f

      actor = current_actor
      if state.control_mask?
        scale += (y - prev_y) / (h / 4)
        actor.x = (actor.width / 2) * (1 - scale)
        actor.y = (actor.height / 2) * (1 - scale)
        actor.set_scale(scale, scale)
      elsif state.shift_mask?
        angle_x, = actor.get_rotation(Clutter::X_AXIS)
        angle_y, = actor.get_rotation(Clutter::Y_AXIS)
        angle_z, = actor.get_rotation(Clutter::Z_AXIS)

        delta_x = prev_x - x
        delta_y = y - prev_y
        if delta_x.abs < 3 or delta_y.abs < 3
          if delta_y.abs > delta_x.abs
            angle_x += delta_y
          else
            angle_y += delta_x
          end
        else
          delta_z = Math.sqrt(delta_x ** 2 + delta_y ** 2)
          delta_z *= (delta_x / delta_x) * (delta_y / delta_y)
          angle_z += delta_z
        end

        actor.set_rotation(Clutter::X_AXIS, angle_x,
                           0,
                           actor.height * axis_y,
                           0)
        actor.set_rotation(Clutter::Y_AXIS, angle_y,
                           actor.width * axis_x,
                           0,
                           0)
        actor.set_rotation(Clutter::Z_AXIS, angle_z,
                           actor.width * axis_x,
                           actor.height * axis_y,
                           0)
      else
        processed = false
      end

      if processed and event.time > start_time + 100
        start_time = event.time
      end
    end

    prev_x = x
    prev_y = y

    false
  end

  add_button_release_hook do |event, last_button_press_event|
    handled
  end
end
set_scroll_event() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 435
def set_scroll_event
  @embed.signal_connect("scroll_event") do |widget, event|
    handled = call_hook_procs(@scroll_hook_procs, event)
    unless handled
      handled = true
      case event.direction
      when Gdk::ScrollDirection::UP
        @canvas.activate("PreviousSlide")
      when Gdk::ScrollDirection::DOWN
        @canvas.activate("NextSlide")
      else
        handled = false
      end
    end
    handled
  end
end
transition_small_and_slide_out(old_actor, actor, old_index, index) click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 574
def transition_small_and_slide_out(old_actor, actor, old_index, index)
  old_actor.show
  old_actor.raise_top

  n = 180
  half = 90
  scale = 1
  GLib::Timeout.add(1000 / n) do
    if n > half
      old_actor.x = (old_actor.width / 2) * (1 - scale)
      old_actor.y = (old_actor.height / 2) * (1 - scale)
      old_actor.set_scale(scale, scale)
      scale -= 0.5 / half
    else
      delta = old_actor.width / half
      delta *= -1 if old_index < index
      old_actor.x += delta
    end
    n -= 1
    if n.zero?
      old_actor.hide
      old_actor.x = 0
      old_actor.y = 0
      old_actor.set_scale(1, 1)
      actor.show
    end
    not n.zero?
  end
end
transition_turn_over(old_actor, actor, old_index, index) click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 549
def transition_turn_over(old_actor, actor, old_index, index)
  old_actor.show
  old_actor.raise_top

  n = 90
  if old_index > index
    angle_sign = -1
    x = old_actor.width
  else
    angle_sign = 1
    x = 0
  end
  GLib::Timeout.add(1000 / n) do
    angle = (n - 90) * angle_sign
    old_actor.set_rotation(Clutter::Y_AXIS, angle, x, 0, 0)
    n -= 1
    if n.zero?
      old_actor.hide
      old_actor.set_rotation(Clutter::Y_AXIS, 0, 0, 0, 0)
      actor.show
    end
    not n.zero?
  end
end
ungrab() click to toggle source
# File lib/rabbit/renderer/display/clutter-embed.rb, line 539
def ungrab
  @embed.grab_remove
  Gdk.pointer_ungrab(Gdk::CURRENT_TIME)
end