class Rabbit::Theme::Applier

Constants

NORMALIZED_HEIGHT
NORMALIZED_WIDTH

Those constants are meaningless. :p

Public Class Methods

new(theme, &callback) click to toggle source
Calls superclass method Rabbit::Theme::Searcher::new
# File lib/rabbit/theme/applier.rb, line 247
def initialize(theme, &callback)
  super()
  @theme = theme
  @callback = callback
  dirty_count_clean
  @match_cache = {}
  @current_target = nil
  class << slides
    def elements
      self
    end
  end
end

Public Instance Methods

[](name) click to toggle source
# File lib/rabbit/theme/applier.rb, line 332
def [](name)
  instance_variable_get("@#{name}")
end
apply_theme(name) click to toggle source
# File lib/rabbit/theme/applier.rb, line 261
def apply_theme(name)
  entry = find_theme(name)
  src = File.open(entry.theme_file, "r:utf-8") do |f|
    f.read
  end
  in_theme(entry) do
    instance_eval(normalize_source(src), entry.theme_file)
  end
end
font_size(size) click to toggle source
# File lib/rabbit/theme/applier.rb, line 307
def font_size(size)
  # TODO: Convert to point from pixel
  if wide_aspect_ratio?
    ((canvas.height * size) / normalized_height)
  else
    ((canvas.width * size) / normalized_width)
  end
end
make_container(ary) click to toggle source
# File lib/rabbit/theme/applier.rb, line 271
def make_container(ary)
  ElementContainer.new(self, ary)
end
normalized_height() click to toggle source
# File lib/rabbit/theme/applier.rb, line 287
def normalized_height
  NORMALIZED_HEIGHT / Canvas::INTERNAL_DPI
end
normalized_size(s) click to toggle source
# File lib/rabbit/theme/applier.rb, line 291
def normalized_size(s)
  if wide_aspect_ratio?
    normalized_y(s)
  else
    normalized_x(s)
  end
end
normalized_width() click to toggle source
# File lib/rabbit/theme/applier.rb, line 283
def normalized_width
  NORMALIZED_WIDTH / Canvas::INTERNAL_DPI
end
normalized_x(sx) click to toggle source
# File lib/rabbit/theme/applier.rb, line 299
def normalized_x(sx)
  ((sx / canvas.width.to_f) * normalized_width).ceil
end
normalized_y(sy) click to toggle source
# File lib/rabbit/theme/applier.rb, line 303
def normalized_y(sy)
  ((sy / canvas.height.to_f) * normalized_height).ceil
end
screen_size(n) click to toggle source
# File lib/rabbit/theme/applier.rb, line 316
def screen_size(n)
  if wide_aspect_ratio?
    screen_y(n)
  else
    screen_x(n)
  end
end
screen_x(nx) click to toggle source
# File lib/rabbit/theme/applier.rb, line 324
def screen_x(nx)
  ((canvas.width * nx) / normalized_width).ceil
end
screen_y(ny) click to toggle source
# File lib/rabbit/theme/applier.rb, line 328
def screen_y(ny)
  ((canvas.height * ny) / normalized_height).ceil
end
to_container(obj) click to toggle source
# File lib/rabbit/theme/applier.rb, line 275
def to_container(obj)
  if obj.is_a?(ElementContainer)
    obj
  else
    make_container([obj])
  end
end

Private Instance Methods

_match(current, *paths) click to toggle source
# File lib/rabbit/theme/applier.rb, line 477
def _match(current, *paths)
  last_path_index = paths.size - 1
  paths.each_with_index do |path, i|
    current = _match_with_cache(current, path, i == last_path_index) do
      current = ignore_wait_block(current) unless i == last_path_index
      if path.nil?
        slides
      elsif path == "**"
        all_sub_elements(current)
      else
        if path == "*"
          working = current # all OK
        else
          working = current.find_all do |element|
            path === element
          end
        end

        if i != last_path_index
          working.inject([]) do |result, elem|
            if elem.respond_to?(:elements)
              result + elem.elements
            else
              result << elem
            end
          end
        else
          working
        end

      end
    end
  end
  current
end
_match_with_cache(current, path, last_path) { || ... } click to toggle source
# File lib/rabbit/theme/applier.rb, line 513
def _match_with_cache(current, path, last_path)
  key = [current, path, last_path]
  @match_cache[key] ||= yield
  @match_cache[key]
end
activate(name, &block) click to toggle source
# File lib/rabbit/theme/applier.rb, line 422
def activate(name, &block)
  canvas.activate(name, &block)
end
add_gesture_action(sequence, action=Proc.new) click to toggle source
# File lib/rabbit/theme/applier.rb, line 418
def add_gesture_action(sequence, action=Proc.new)
  canvas.add_gesture_action(sequence, action)
end
all_sub_elements(element) click to toggle source
# File lib/rabbit/theme/applier.rb, line 519
def all_sub_elements(element)
  if element.respond_to?(:inject)
    if element.respond_to?(:elements)
      elems = element.elements
    else
      elems = element
    end
    elems.inject([]) do |result, elem|
      (result << elem) + all_sub_elements(elem)
    end
  else
    []
  end
end
base_directory() click to toggle source
# File lib/rabbit/theme/applier.rb, line 658
def base_directory
  canvas.full_path(".")
end
canvas() click to toggle source
# File lib/rabbit/theme/applier.rb, line 365
def canvas
  @theme.canvas
end
connect_key(keyval, modifier=nil, flags=nil, &block) click to toggle source
# File lib/rabbit/theme/applier.rb, line 622
def connect_key(keyval, modifier=nil, flags=nil, &block)
  modifier ||= Gdk::ModifierType.new
  flags ||= Gtk::AccelFlags::VISIBLE
  canvas.connect_key(keyval, modifier, flags, &block)
end
deprecated_method(current, deprecated) click to toggle source
# File lib/rabbit/theme/applier.rb, line 632
def deprecated_method(current, deprecated)
  format = _("%s is deprecated. Use %s instead.")
  message = format % [deprecated, current]
  warning(message)
end
dirtied() click to toggle source
Calls superclass method Rabbit::DirtyCount#dirtied
# File lib/rabbit/theme/applier.rb, line 617
def dirtied
  @callback.call if @callback
  super
end
disconnect_key(keyval, modifier=nil) click to toggle source
# File lib/rabbit/theme/applier.rb, line 628
def disconnect_key(keyval, modifier=nil)
  canvas.disconnect_key(keyval, modifier)
end
display?() click to toggle source
# File lib/rabbit/theme/applier.rb, line 377
def display?
  canvas.display?
end
draw_frame(*args, &block) click to toggle source
# File lib/rabbit/theme/applier.rb, line 570
def draw_frame(*args, &block)
  split_targets(args) do |targets, args|
    targets.draw_frame(*args, &block)
  end
end
draw_image_mark(*args, &block) click to toggle source
# File lib/rabbit/theme/applier.rb, line 556
def draw_image_mark(*args, &block)
  split_targets(args) do |targets, args|
    image_name, *args = args
    image_name = find_file(image_name)
    targets.draw_image_mark(image_name, *args, &block)
  end
end
draw_mark(*args, &block) click to toggle source
# File lib/rabbit/theme/applier.rb, line 550
def draw_mark(*args, &block)
  split_targets(args) do |targets, args|
    targets.draw_mark(*args, &block)
  end
end
draw_order(*args, &block) click to toggle source
# File lib/rabbit/theme/applier.rb, line 564
def draw_order(*args, &block)
  split_targets(args) do |targets, args|
    targets.draw_order(*args, &block)
  end
end
entity(key) click to toggle source
# File lib/rabbit/theme/applier.rb, line 646
def entity(key)
  Parser::Ext::Entity::TABLE[key]
end
find_font_family(target_name) click to toggle source
# File lib/rabbit/theme/applier.rb, line 430
def find_font_family(target_name)
  families = font_families.grep(/#{Regexp.escape(target_name)}/i)
  return nil if families.empty?
  if families.include?(target_name)
    target_name
  else
    families.first
  end
end
font_families() click to toggle source
# File lib/rabbit/theme/applier.rb, line 426
def font_families
  canvas.font_families.collect {|family| family.name}
end
ignore_wait_block(elements) click to toggle source
# File lib/rabbit/theme/applier.rb, line 534
def ignore_wait_block(elements)
  elements.inject([]) do |result, element|
    if element.is_a?(WaitBlock)
      result + ignore_wait_block(element.elements)
    else
      result + [element]
    end
  end
end
image_element(path, properties={}) click to toggle source
# File lib/rabbit/theme/applier.rb, line 650
def image_element(path, properties={})
  image = Parser::Ext::Image.make_image(canvas, path, properties)
  if image.nil?
    raise ImageFileDoesNotExistError.new(path)
  end
  image
end
image_load_path() click to toggle source
Calls superclass method Rabbit::Theme::Searcher#image_load_path
# File lib/rabbit/theme/applier.rb, line 666
def image_load_path
  super + [base_directory].compact
end
include_theme(name) click to toggle source
# File lib/rabbit/theme/applier.rb, line 349
def include_theme(name)
  begin
    apply_theme(name)
  rescue ThemeExit
    info($!.message) if $!.have_message?
  end
end
indent(*args, &block) click to toggle source
# File lib/rabbit/theme/applier.rb, line 544
def indent(*args, &block)
  split_targets(args) do |targets, args|
    targets.indent(*args, &block)
  end
end
logger() click to toggle source
# File lib/rabbit/theme/applier.rb, line 369
def logger
  canvas.logger
end
match(*paths, &block) click to toggle source
# File lib/rabbit/theme/applier.rb, line 456
def match(*paths, &block)
  dirty
  targets = _match(slides, *paths)
  return if targets.empty?

  begin
    @current_target = make_container(targets)
    block.call(@current_target)
  ensure
    @current_target = nil
  end
end
method_missing(meth, *args, &block) click to toggle source
Calls superclass method
# File lib/rabbit/theme/applier.rb, line 469
def method_missing(meth, *args, &block)
  if @current_target
    @current_target.__send__(meth, *args, &block)
  else
    super
  end
end
name() click to toggle source
# File lib/rabbit/theme/applier.rb, line 357
def name
  @theme.name
end
normalize_source(src) click to toggle source
# File lib/rabbit/theme/applier.rb, line 341
def normalize_source(src)
  src.gsub(/(?=^|\W)@(very_)?huge_(script_)?font_size(?=$|\W)/) do |x|
    x = "x"
    x *= 2 unless $1.nil?
    "@#{x}_large_#{$2}font_size"
  end
end
print?() click to toggle source
quartz?() click to toggle source
# File lib/rabbit/theme/applier.rb, line 452
def quartz?
  Utils.quartz?
end
set_background(color) click to toggle source
# File lib/rabbit/theme/applier.rb, line 393
def set_background(color)
  canvas.background = canvas.make_color(color)
end
set_background_image(filename) click to toggle source
# File lib/rabbit/theme/applier.rb, line 397
def set_background_image(filename)
  loader = ImageLoader.new(find_file(filename))
  canvas.background_image = loader.pixbuf
end
set_font_family(target, family=@font_family) click to toggle source
# File lib/rabbit/theme/applier.rb, line 440
def set_font_family(target, family=@font_family)
  target.prop_set("font_family", family) if family
end
set_font_resolution_ratio(ratio) click to toggle source
# File lib/rabbit/theme/applier.rb, line 444
def set_font_resolution_ratio(ratio)
  canvas.font_resolution_ratio = ratio
end
set_foreground(color) click to toggle source
# File lib/rabbit/theme/applier.rb, line 389
def set_foreground(color)
  canvas.foreground = canvas.make_color(color)
end
set_graffiti_color(color) click to toggle source
# File lib/rabbit/theme/applier.rb, line 410
def set_graffiti_color(color)
  canvas.graffiti_color = Renderer::Color.parse(color)
end
set_graffiti_line_width(line_width) click to toggle source
# File lib/rabbit/theme/applier.rb, line 414
def set_graffiti_line_width(line_width)
  canvas.graffiti_line_width = line_width
end
set_progress_background(color) click to toggle source
# File lib/rabbit/theme/applier.rb, line 406
def set_progress_background(color)
  canvas.progress_background = canvas.make_color(color)
end
set_progress_foreground(*color) click to toggle source
# File lib/rabbit/theme/applier.rb, line 402
def set_progress_foreground(*color)
  canvas.progress_foreground = canvas.make_color(*color)
end
slides() click to toggle source
# File lib/rabbit/theme/applier.rb, line 361
def slides
  @theme.slides
end
slides_per_page() click to toggle source
# File lib/rabbit/theme/applier.rb, line 385
def slides_per_page
  canvas.slides_per_page
end
span(attributes, content) click to toggle source
# File lib/rabbit/theme/applier.rb, line 642
def span(attributes, content)
  tag("span", attributes, content)
end
split_targets(args) { |to_container(targets), args| ... } click to toggle source
# File lib/rabbit/theme/applier.rb, line 576
def split_targets(args)
  if args.empty? or
      !(args.first.is_a?(Element::Base) or
        args.first.is_a?(ElementContainer))
    targets = @current_target
  else
    targets, *args = args
  end

  yield [to_container(targets), args]
end
start_auto_redraw_timer(interval) click to toggle source
# File lib/rabbit/theme/applier.rb, line 588
def start_auto_redraw_timer(interval)
  canvas.start_auto_redraw_timer(interval)
end
start_auto_reload_thread(interval) click to toggle source
# File lib/rabbit/theme/applier.rb, line 606
def start_auto_reload_thread(interval)
  deprecated_method("start_auto_redraw_timer",
                    "start_auto_reload_thread")
  start_auto_redraw_timer(interval)
end
start_auto_reload_timer(interval) click to toggle source

For backward compatibility

# File lib/rabbit/theme/applier.rb, line 596
def start_auto_reload_timer(interval)
  deprecated_method("start_auto_redraw_timer",
                    "start_auto_reload_timer")
  canvas.start_auto_redraw_timer(interval)
end
stop_auto_redraw_timer() click to toggle source
# File lib/rabbit/theme/applier.rb, line 591
def stop_auto_redraw_timer
  canvas.stop_auto_redraw_timer
end
stop_auto_reload_thread() click to toggle source
# File lib/rabbit/theme/applier.rb, line 611
def stop_auto_reload_thread
  deprecated_method("stop_auto_redraw_timer",
                    "stop_auto_reload_thread")
  stop_auto_redraw_timer
end
stop_auto_reload_timer() click to toggle source
# File lib/rabbit/theme/applier.rb, line 601
def stop_auto_reload_timer
  deprecated_method("stop_auto_redraw_timer",
                    "stop_auto_reload_timer")
  canvas.stop_auto_redraw_timer
end
tag(name, attributes, content) click to toggle source
# File lib/rabbit/theme/applier.rb, line 638
def tag(name, attributes, content)
  PangoMarkup.new(name, attributes, content).to_s
end
theme_exit(message=nil) click to toggle source
# File lib/rabbit/theme/applier.rb, line 381
def theme_exit(message=nil)
  raise ThemeExit.new(message)
end
theme_load_path() click to toggle source
Calls superclass method Rabbit::Theme::Searcher#theme_load_path
# File lib/rabbit/theme/applier.rb, line 662
def theme_load_path
  super + [base_directory].compact
end
wide_aspect_ratio?() click to toggle source
# File lib/rabbit/theme/applier.rb, line 337
def wide_aspect_ratio?
  (canvas.width / 4) > (canvas.height / 3)
end
windows?() click to toggle source
# File lib/rabbit/theme/applier.rb, line 448
def windows?
  Utils.windows?
end