class Rabbit::InfoWindow

Public Class Methods

new(canvas) click to toggle source
# File lib/rabbit/info-window.rb, line 36
def initialize(canvas)
  @canvas = canvas
  @window = nil
  @timer_id = nil
  @note_area = nil
  init_hook_handler
  init_key_handler
  init_button_handler
  init_scroll_handler
end

Public Instance Methods

hide() click to toggle source
# File lib/rabbit/info-window.rb, line 55
def hide
  return unless showing?
  detach_menu(@window)
  detach_key(@window)
  each do |canvas|
    canvas.detach
  end
  @window.signal_handler_disconnect(@window_destroy_id)
  @window.destroy
  @window = @window_destroy_id = nil
  @canvas_widgets = @grid = nil
  GLib::Source.remove(@timer_id) if @timer_id
  @timer_id = nil
  @previous_canvas = @current_canvas = @next_canvas = nil
end
index_mode_off() click to toggle source
# File lib/rabbit/info-window.rb, line 91
def index_mode_off
  return unless showing?
  toggle_index_mode
end
index_mode_on() click to toggle source
# File lib/rabbit/info-window.rb, line 86
def index_mode_on
  return unless showing?
  toggle_index_mode
end
moved() click to toggle source
# File lib/rabbit/info-window.rb, line 75
def moved
  return unless showing?
  update
end
parsed() click to toggle source
# File lib/rabbit/info-window.rb, line 80
def parsed
  return unless showing?
  update_source
  update
end
show(width=nil, height=nil) click to toggle source
# File lib/rabbit/info-window.rb, line 47
def show(width=nil, height=nil)
  init_gui(width, height)
  @window.show_all
  update_source
  toggle_index_mode if @canvas.index_mode?
  adjust_slide
end
showing?() click to toggle source
# File lib/rabbit/info-window.rb, line 71
def showing?
  !@window.nil?
end

Private Instance Methods

adjust_slide() click to toggle source
# File lib/rabbit/info-window.rb, line 346
def adjust_slide
  base_index = @canvas.current_index
  @previous_canvas.move_to_if_can([base_index - 1, 0].max)
  @current_canvas.move_to_if_can(base_index)
  @current_canvas.current_slide.drawing_index =
    @canvas.current_slide.drawing_index
  @next_canvas.move_to_if_can([base_index + 1, @canvas.slide_size - 1].min)
end
draw_text_as_large_as_possible(area, context, markupped_text, options={}) click to toggle source
# File lib/rabbit/info-window.rb, line 262
def draw_text_as_large_as_possible(area,
                                   context,
                                   markupped_text,
                                   options={})
  return if markupped_text.nil?

  area_width = area.window.width
  area_height = area.window.height

  layout = context.create_pango_layout
  layout.context.resolution = @canvas.font_resolution
  attributes, text = Pango.parse_markup(markupped_text)
  layout.text = text
  layout.attributes = attributes
  layout.width = area_width * Pango::SCALE
  layout.wrap = :word_char
  layout.alignment = options[:alignment] if options.key?(:alignment)

  layout.justify = options[:justify] if options.key?(:justify)
  set_as_large_as_font_description(layout, area_height)

  context.update_pango_layout(layout)
  context.show_pango_layout(layout)
end
each(&block) click to toggle source
# File lib/rabbit/info-window.rb, line 361
def each(&block)
  [@previous_canvas, @current_canvas, @next_canvas].each(&block)
end
init_canvas() click to toggle source
# File lib/rabbit/info-window.rb, line 102
def init_canvas
  @current_canvas = make_canvas
  @previous_canvas = make_canvas
  @next_canvas = make_canvas
end
init_canvas_widgets() click to toggle source
# File lib/rabbit/info-window.rb, line 224
def init_canvas_widgets
  @canvas_widgets = Gtk::Box.new(:horizontal)
  @current_canvas.attach_to(nil, @window, @canvas_widgets)
  @next_canvas.attach_to(nil, @window, @canvas_widgets)
end
init_gui(width, height) click to toggle source
# File lib/rabbit/info-window.rb, line 97
def init_gui(width, height)
  init_canvas
  init_window(width, height)
end
init_note_area() click to toggle source
# File lib/rabbit/info-window.rb, line 242
def init_note_area
  @note_area = Gtk::DrawingArea.new
  @note_area.signal_connect("draw") do |area, context|
    draw_text_as_large_as_possible(area, context, note_text)
    Gdk::Event::PROPAGATE
  end
end
init_timer_area() click to toggle source
# File lib/rabbit/info-window.rb, line 230
def init_timer_area
  @timer_area = Gtk::DrawingArea.new
  @timer_area.signal_connect("draw") do |area, context|
    context.set_source_rgb(1, 0, 0) if rest_time and rest_time < 0
    draw_text_as_large_as_possible(area,
                                   context,
                                   timer_text,
                                   alignment: :center)
    Gdk::Event::PROPAGATE
  end
end
init_widgets() click to toggle source
# File lib/rabbit/info-window.rb, line 140
def init_widgets
  init_timer_area
  @grid = Gtk::Grid.new
  @grid.column_homogeneous = true
  @grid.row_homogeneous = true

  base_width = 1
  base_height = 1
  @current_canvas.attach_to(nil, @window, @grid) do |container, widget|
    container.attach(widget,
                     base_width,
                     0,
                     base_width * 2,
                     base_height * 2)
  end

  @previous_canvas.attach_to(nil, @window, @grid) do |container, widget|
    container.attach(widget,
                     0,
                     base_height * 2,
                     base_width,
                     base_height)
  end
  @next_canvas.attach_to(nil, @window, @grid) do |container, widget|
    container.attach(widget,
                     base_width * 3,
                     base_height * 2,
                     base_width,
                     base_height)
  end

  @grid.attach(@timer_area,
               base_width,
               base_height * 2,
               base_width * 2,
               base_height)

  @grid.show
end
init_widgets_on_note_mode() click to toggle source
# File lib/rabbit/info-window.rb, line 180
def init_widgets_on_note_mode
  init_timer_area
  init_note_area
  @grid = Gtk::Grid.new
  @grid.column_homogeneous = true
  @grid.row_homogeneous = true

  base_width = 1
  base_height = 4
  @previous_canvas.attach_to(nil, @window, @grid) do |container, widget|
    container.attach(widget,
                     0,
                     0,
                     base_width,
                     base_height)
  end
  @current_canvas.attach_to(nil, @window, @grid) do |container, widget|
    container.attach(widget,
                     base_width,
                     0,
                     base_width * 2,
                     base_height)
  end
  @next_canvas.attach_to(nil, @window, @grid) do |container, widget|
    container.attach(widget,
                     base_width * 3,
                     0,
                     base_width,
                     base_height)
  end

  @grid.attach(@note_area,
               0,
               base_height,
               base_width * 4,
               base_height)
  @grid.attach(@timer_area,
               0,
               base_height * 2,
               base_width * 4,
               1)
  @grid.show
end
init_window(width, height) click to toggle source
# File lib/rabbit/info-window.rb, line 113
def init_window(width, height)
  @window = Gtk::Window.new
  @window_destroy_id = @window.signal_connect("destroy") do
    @canvas.activate("ToggleInfoWindow")
    Gdk::Event::PROPAGATE
  end
  @window.title = _("%s: Information window") % @canvas.title
  @window.set_default_size(width, height) if width and height
  if on_note_mode?
    init_widgets_on_note_mode
  else
    init_widgets
  end
  init_menu
  attach_key(@window)
  attach_menu(@window)
  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
  @window.add_events(event_mask)
  set_button_event(@window)
  set_scroll_event(@window)
  @window.add(@grid)
end
make_canvas() click to toggle source
# File lib/rabbit/info-window.rb, line 108
def make_canvas
  DependencyCanvas.new(@canvas, @canvas.logger,
                       Renderer::Display::DrawingAreaViewOnly)
end
note_text() click to toggle source
# File lib/rabbit/info-window.rb, line 256
def note_text
  note = @canvas.current_slide["note"]
  return note if note.nil?
  note.gsub(/\\n/, "\n")
end
on_note_mode?() click to toggle source
# File lib/rabbit/info-window.rb, line 365
def on_note_mode?
  @canvas.slides.any? {|slide| slide["note"]}
end
reload_theme() click to toggle source
# File lib/rabbit/info-window.rb, line 339
def reload_theme
  @canvas.reload_theme
  each do |canvas|
    canvas.reload_theme
  end
end
rest_time() click to toggle source
# File lib/rabbit/info-window.rb, line 315
def rest_time
  @canvas.rest_time || @canvas.allotted_time
end
set_as_large_as_font_description(layout, max_height) click to toggle source
# File lib/rabbit/info-window.rb, line 287
def set_as_large_as_font_description(layout, max_height)
  family = "Sans"
  size = 14
  last_font_description = nil
  loop do
    font_description = Pango::FontDescription.new("#{family} #{size}")
    layout.font_description = font_description
    layout_height = layout.pixel_size[1]
    break if layout_height > max_height
    last_font_description = font_description
    size = [size * 1.2, size + 5].min
  end
  last_font_description ||= Pango::FontDescription.new("#{family} #{size}")
  layout.font_description = last_font_description
end
start_timer() click to toggle source
# File lib/rabbit/info-window.rb, line 303
def start_timer
  @timer_id = GLib::Timeout.add(1000) do
    if showing? and @canvas.rest_time
      @timer_area.queue_draw
      GLib::Source::CONTINUE
    else
      @timer_id = nil
      GLib::Source::REMOVE
    end
  end
end
timer_text() click to toggle source
# File lib/rabbit/info-window.rb, line 319
def timer_text
  if rest_time
    "%s%02d:%02d" % Utils.split_number_to_minute_and_second(rest_time)
  else
    _("unlimited")
  end
end
toggle_index_mode() click to toggle source
# File lib/rabbit/info-window.rb, line 355
def toggle_index_mode
  each do |canvas|
    canvas.toggle_index_mode
  end
end
update() click to toggle source
# File lib/rabbit/info-window.rb, line 250
def update
  start_timer if @timer_id.nil?
  @note_area.queue_draw if @note_area
  adjust_slide
end
update_source() click to toggle source
# File lib/rabbit/info-window.rb, line 327
def update_source
  each do |canvas|
    source = Source::Memory.new("UTF-8", @canvas.logger)
    @canvas.source_force_modified(true) do |original_source|
      source.source = original_source.read
      source.base = original_source.base
      source.extension = original_source.extension
    end
    canvas.parse(source)
  end
end