class Rabbit::Canvas
Constants
- INTERNAL_DPI
Attributes
actions[R]
allotted_time[W]
comment_theme[RW]
comments[R]
font_resolution_ratio[RW]
last_modified[R]
logger[R]
max_n_comments[RW]
migemo_dictionary_name[RW]
migemo_dictionary_search_path[RW]
output_html[RW]
output_index_html[RW]
renderer[R]
rss_base_uri[RW]
saved_image_base_name[W]
saved_image_type[RW]
source_filename[RW]
use_gl[W]
Public Class Methods
new(logger, renderer)
click to toggle source
# File lib/rabbit/canvas.rb, line 157 def initialize(logger, renderer) @logger = logger @frame = NullFrame.new @theme_name = nil @saved_image_base_name = nil @saved_image_type = "png" @processing = false @quitted = false @parse_request_queue = [] @apply_theme_request_queue = [] @auto_redraw_timer = nil @output_html = false @rss_base_uri = nil @source_filename = nil @migemo_dictionary_search_path = [] @migemo_dictionary_name = nil @limit_time = nil @use_gl = false @font_resolution_ratio = 1 @max_n_comments = 100 @allotted_time = nil @comment_theme = nil clear @renderer = renderer.new(self) @actions = Action.action_group(self) end
Public Instance Methods
<<(slide)
click to toggle source
# File lib/rabbit/canvas.rb, line 323 def <<(slide) slide.index = slides.size slides << slide end
action(name)
click to toggle source
# File lib/rabbit/canvas.rb, line 639 def action(name) act = @actions.get_action(name) if act act else logger.warn(_("Unknown action: %s") % name) false end end
activate(name, &block)
click to toggle source
# File lib/rabbit/canvas.rb, line 629 def activate(name, &block) act = action(name) if act and act.sensitive? act.activate(&block) true else false end end
allotted_time()
click to toggle source
# File lib/rabbit/canvas.rb, line 658 def allotted_time time = @allotted_time if time.nil? and title_slide time = title_slide.allotted_time if time.nil? start_time = title_slide.start_time end_time = title_slide.end_time if start_time and end_time start_time = Time.parse(start_time) end_time = Time.parse(end_time) time = end_time - start_time end end end Utils.ensure_time(time) end
append_comment(comment)
click to toggle source
# File lib/rabbit/canvas.rb, line 612 def append_comment(comment) @comments << comment @comments.shift if @comments.size > @max_n_comments @on_comment_callbacks.each do |name, callback| begin callback.call(comment) rescue logger.error($!) end end true end
apply_theme(name=nil, &block)
click to toggle source
# File lib/rabbit/canvas.rb, line 328 def apply_theme(name=nil, &block) _apply_theme(name, Object.new.__id__, &block) end
apply_timer()
click to toggle source
# File lib/rabbit/canvas.rb, line 687 def apply_timer return unless title_slide start_time = title_slide.start_time end_time = title_slide.end_time return if start_time.nil? return if end_time.nil? start_time = Time.parse(start_time) end_time = Time.parse(end_time) return unless (start_time..end_time).cover?(Time.now) @allotted_time = end_time - start_time @limit_time = end_time end
applying?()
click to toggle source
# File lib/rabbit/canvas.rb, line 192 def applying? not @apply_theme_request_queue.empty? end
attach_to(frame, window, container=nil, &block)
click to toggle source
# File lib/rabbit/canvas.rb, line 209 def attach_to(frame, window, container=nil, &block) @frame = frame if frame @renderer.attach_to(window, container, &block) if window end
cache_all_slides()
click to toggle source
# File lib/rabbit/canvas.rb, line 571 def cache_all_slides process do @renderer.cache_all_slides end end
change_current_index(new_index) { || ... }
click to toggle source
# File lib/rabbit/canvas.rb, line 295 def change_current_index(new_index) mode = @index_mode if mode index = @index_current_index @index_current_index = new_index else index = @current_index @current_index = new_index end if 0 <= current_index and current_index < slide_size yield end ensure if mode @index_current_index = index else @current_index = index end end
current_index()
click to toggle source
# File lib/rabbit/canvas.rb, line 287 def current_index if @index_mode @index_current_index else @current_index end end
current_slide()
click to toggle source
# File lib/rabbit/canvas.rb, line 277 def current_slide slide = slides[current_index] if slide slide else move_to_first slides.first end end
delete_on_comment_proc_by_name(name)
click to toggle source
# File lib/rabbit/canvas.rb, line 606 def delete_on_comment_proc_by_name(name) @on_comment_callbacks.reject! do |callback_name, callback| callback_name == name end end
detach()
click to toggle source
# File lib/rabbit/canvas.rb, line 214 def detach @frame = NullFrame.new @renderer.detach end
each(&block)
click to toggle source
# File lib/rabbit/canvas.rb, line 319 def each(&block) slides.each(&block) end
find_slide(pattern)
click to toggle source
# File lib/rabbit/canvas.rb, line 254 def find_slide(pattern) slides.find {|slide| slide.match?(pattern)} end
first_slide?()
click to toggle source
# File lib/rabbit/canvas.rb, line 543 def first_slide? current_index.zero? end
font_resolution()
click to toggle source
# File lib/rabbit/canvas.rb, line 703 def font_resolution INTERNAL_DPI * @font_resolution_ratio end
front(public_level=nil)
click to toggle source
# File lib/rabbit/canvas.rb, line 205 def front(public_level=nil) Front.new(self, public_level) end
full_path(path)
click to toggle source
# File lib/rabbit/canvas.rb, line 395 def full_path(path) @source and @source.full_path(path) end
fullscreened()
click to toggle source
# File lib/rabbit/canvas.rb, line 429 def fullscreened @renderer.post_fullscreen end
have_next?()
click to toggle source
# File lib/rabbit/canvas.rb, line 565 def have_next? return true if have_next_slide? return !current_slide.last? if current_slide false end
have_next_slide?()
click to toggle source
# File lib/rabbit/canvas.rb, line 561 def have_next_slide? slide_size - 1 > current_index end
have_previous?()
click to toggle source
# File lib/rabbit/canvas.rb, line 555 def have_previous? return true if have_previous_slide? return !current_slide.first? if current_slide false end
have_previous_slide?()
click to toggle source
# File lib/rabbit/canvas.rb, line 551 def have_previous_slide? 0 < current_index end
iconified()
click to toggle source
# File lib/rabbit/canvas.rb, line 437 def iconified @renderer.post_iconify end
index_mode?()
click to toggle source
# File lib/rabbit/canvas.rb, line 506 def index_mode? @index_mode end
last_slide?()
click to toggle source
# File lib/rabbit/canvas.rb, line 547 def last_slide? slide_size.zero? or current_index == (slide_size - 1) end
merge_theme(name)
click to toggle source
# File lib/rabbit/canvas.rb, line 336 def merge_theme(name) unless @slides.empty? manager = Theme::Manager.new(self) manager.apply(name) @renderer.post_apply_theme end end
move_to_first()
click to toggle source
# File lib/rabbit/canvas.rb, line 498 def move_to_first move_to_if_can(0) end
move_to_if_can(index)
click to toggle source
# File lib/rabbit/canvas.rb, line 459 def move_to_if_can(index) if index and 0 <= index and index < slide_size move_to(index) end current_index end
move_to_last()
click to toggle source
# File lib/rabbit/canvas.rb, line 502 def move_to_last move_to(slide_size - 1) end
move_to_next_if_can()
click to toggle source
# File lib/rabbit/canvas.rb, line 466 def move_to_next_if_can slide = current_slide if slide and !slide.last? old_index = slide.drawing_index slide.move_to_next Action.update_status(self) @renderer.post_move_in_slide(old_index, slide.drawing_index) else move_to_next_slide_if_can end end
move_to_next_slide_if_can()
click to toggle source
# File lib/rabbit/canvas.rb, line 478 def move_to_next_slide_if_can move_to_if_can(current_index + 1) end
move_to_previous_if_can()
click to toggle source
# File lib/rabbit/canvas.rb, line 482 def move_to_previous_if_can slide = current_slide if slide and !slide.first? old_index = slide.drawing_index slide.move_to_previous Action.update_status(self) @renderer.post_move_in_slide(old_index, slide.drawing_index) else move_to_previous_slide_if_can end end
move_to_previous_slide_if_can()
click to toggle source
# File lib/rabbit/canvas.rb, line 494 def move_to_previous_slide_if_can move_to_if_can(current_index - 1) end
need_reload_source?()
click to toggle source
# File lib/rabbit/canvas.rb, line 391 def need_reload_source? !@processing and @source and @source.modified? end
next_slide()
click to toggle source
# File lib/rabbit/canvas.rb, line 315 def next_slide slides[current_index + 1] end
on_comment(name, &callback)
click to toggle source
# File lib/rabbit/canvas.rb, line 602 def on_comment(name, &callback) @on_comment_callbacks << [name, callback] end
parse(source=nil, callback=nil) { |$!| ... }
click to toggle source
# File lib/rabbit/canvas.rb, line 348 def parse(source=nil, callback=nil, &block) id = Object.new.__id__ @parse_request_queue.push(id) @source = source || @source begin index = current_index current_allotted_time = allotted_time keep_index do @renderer.pre_parse clear Parser.parse(self, @source) new_allotted_time = allotted_time reset_timer if new_allotted_time != current_allotted_time apply_timer set_current_index(index) reload_theme do if @parse_request_queue.last != id raise ParseFinish end callback.call if callback end @renderer.post_parse index = current_index end set_current_index(index) rescue ParseFinish rescue ParseError, UnsupportedFormatError if block_given? yield($!) else logger.warn($!.message) end ensure @parse_request_queue.delete_if {|x| x == id} end end
parsing?()
click to toggle source
# File lib/rabbit/canvas.rb, line 188 def parsing? not @parse_request_queue.empty? end
post_terminal()
click to toggle source
# File lib/rabbit/canvas.rb, line 445 def post_terminal @renderer.post_terminal end
pre_terminal()
click to toggle source
# File lib/rabbit/canvas.rb, line 441 def pre_terminal @renderer.pre_terminal end
print(&block)
click to toggle source
# File lib/rabbit/canvas.rb, line 423 def print(&block) process do @renderer.print(&block) end end
processing?()
click to toggle source
# File lib/rabbit/canvas.rb, line 577 def processing? @processing end
quit()
click to toggle source
# File lib/rabbit/canvas.rb, line 200 def quit @quitted = true @frame.quit end
quitted?()
click to toggle source
# File lib/rabbit/canvas.rb, line 184 def quitted? @quitted end
reload_source(callback=nil, &block)
click to toggle source
# File lib/rabbit/canvas.rb, line 385 def reload_source(callback=nil, &block) if need_reload_source? parse(nil, callback, &block) end end
reload_theme(&block)
click to toggle source
# File lib/rabbit/canvas.rb, line 344 def reload_theme(&block) apply_theme(@theme_name, &block) end
reset_timer()
click to toggle source
# File lib/rabbit/canvas.rb, line 683 def reset_timer @limit_time = nil end
rest_time()
click to toggle source
# File lib/rabbit/canvas.rb, line 679 def rest_time @limit_time ? @limit_time - Time.now : nil end
save_as_image()
click to toggle source
# File lib/rabbit/canvas.rb, line 409 def save_as_image process do generator = HTML::Generator.new(self, saved_image_base_name, @saved_image_type, @output_html, @output_index_html, @rss_base_uri) generator.pdf_filename = filename if /\.pdf\z/i =~ filename.to_s generator.source_filename = @source_filename generator.save end end
saved_image_base_name()
click to toggle source
# File lib/rabbit/canvas.rb, line 449 def saved_image_base_name if @saved_image_base_name base_name = @saved_image_base_name.encode("UTF-8") else base_name = Filename.sanitize(title) end base_name << "-index" if index_mode? base_name end
slide_index(pattern)
click to toggle source
# File lib/rabbit/canvas.rb, line 258 def slide_index(pattern) slides.each_with_index do |slide, i| return i if slide.match?(pattern) end nil end
slide_indexes(pattern)
click to toggle source
# File lib/rabbit/canvas.rb, line 265 def slide_indexes(pattern) indexes = [] slides.each_with_index do |slide, i| indexes << i if slide.match?(pattern) end indexes end
slide_size()
click to toggle source
# File lib/rabbit/canvas.rb, line 273 def slide_size slides.size end
slide_text(index=current_index)
click to toggle source
# File lib/rabbit/canvas.rb, line 239 def slide_text(index=current_index) return "" if slides.empty? slide = slides[index] return "" if slide.nil? slide.text.strip end
slide_title(index=current_index)
click to toggle source
# File lib/rabbit/canvas.rb, line 228 def slide_title(index=current_index) return "" if slides.empty? slide = slides[index] return title if slide.nil? if slide.is_a?(Element::TitleSlide) slide.title else "#{title}: #{slide.title}" end end
slides()
click to toggle source
# File lib/rabbit/canvas.rb, line 246 def slides if @index_mode @index_slides else @slides end end
source()
click to toggle source
# File lib/rabbit/canvas.rb, line 539 def source @source.read end
source_force_modified(force_modified) { |source| ... }
click to toggle source
# File lib/rabbit/canvas.rb, line 532 def source_force_modified(force_modified) prev = @source.force_modified @source.force_modified = force_modified yield @source @source.force_modified = prev end
start_auto_redraw_timer(interval)
click to toggle source
# File lib/rabbit/canvas.rb, line 581 def start_auto_redraw_timer(interval) stop_auto_redraw_timer timer = GLib::Timeout.add(interval * 1000) do if quitted? @auto_redraw_timer = nil GLib::Source::REMOVE else activate("Redraw") GLib::Source::CONTINUE end end @auto_redraw_timer = timer end
start_timer(limit)
click to toggle source
# File lib/rabbit/canvas.rb, line 675 def start_timer(limit) @limit_time = Time.now + limit end
stop_auto_redraw_timer()
click to toggle source
# File lib/rabbit/canvas.rb, line 595 def stop_auto_redraw_timer if @auto_redraw_timer GLib::Source.remove(@auto_redraw_timer) @auto_redraw_timer = nil end end
theme_name()
click to toggle source
# File lib/rabbit/canvas.rb, line 332 def theme_name @theme_name || default_theme || "default" end
title()
click to toggle source
# File lib/rabbit/canvas.rb, line 219 def title ts = title_slide if ts ts.title else "Rabbit" end end
title_slide()
click to toggle source
# File lib/rabbit/canvas.rb, line 625 def title_slide @slides.find{|x| x.is_a?(Element::TitleSlide)} end
tmp_dir_name()
click to toggle source
# File lib/rabbit/canvas.rb, line 399 def tmp_dir_name @source and @source.tmp_dir_name end
to_pixbuf(i)
click to toggle source
# File lib/rabbit/canvas.rb, line 403 def to_pixbuf(i) move_to_if_can(i) current_slide.flush @renderer.to_pixbuf(current_slide) end
toggle_index_mode()
click to toggle source
# File lib/rabbit/canvas.rb, line 510 def toggle_index_mode @renderer.pre_toggle_index_mode process do if @index_mode @index_mode = false @renderer.index_mode_off else update_index_slides @index_mode = true @renderer.index_mode_on end modified end @renderer.post_toggle_index_mode end
unfullscreened()
click to toggle source
# File lib/rabbit/canvas.rb, line 433 def unfullscreened @renderer.post_unfullscreen end
update_index_slides()
click to toggle source
# File lib/rabbit/canvas.rb, line 526 def update_index_slides if @index_slides.empty? @index_slides = Element::IndexSlide.make_index_slides(self) end end
use_gl?()
click to toggle source
# File lib/rabbit/canvas.rb, line 196 def use_gl? @use_gl end
with_index_mode(new_value) { || ... }
click to toggle source
# File lib/rabbit/canvas.rb, line 649 def with_index_mode(new_value) current_index_mode = @index_mode @index_mode = new_value update_index_slides if @index_mode yield ensure @index_mode = current_index_mode end
Private Instance Methods
_apply_theme(name, id, &block)
click to toggle source
# File lib/rabbit/canvas.rb, line 708 def _apply_theme(name, id, &block) @theme_name = name if name _theme_name = name || theme_name if _theme_name and not @slides.empty? @apply_theme_request_queue.push(id) success = false index_mode = @index_mode begin Action.update_status(self) clear_theme clear_index_slides manager = Theme::Manager.new(self) do if @apply_theme_request_queue.last != id raise ApplyFinish end block.call if block end manager.apply(_theme_name) @renderer.post_apply_theme success = true rescue ApplyFinish ensure @apply_theme_request_queue.delete_if {|x| x == id} Action.update_status(self) end activate("ToggleIndexMode") if success and index_mode end end
clear()
click to toggle source
# File lib/rabbit/canvas.rb, line 756 def clear clear_comments stop_auto_redraw_timer clear_slides clear_index_slides modified end
clear_comments()
click to toggle source
# File lib/rabbit/canvas.rb, line 764 def clear_comments @comments = [] @on_comment_callbacks = [] end
clear_index_slides()
click to toggle source
# File lib/rabbit/canvas.rb, line 774 def clear_index_slides activate("ToggleIndexMode") if @index_mode @index_current_index = 0 @index_slides = [] end
clear_slides()
click to toggle source
# File lib/rabbit/canvas.rb, line 769 def clear_slides @current_index = 0 @slides = [] end
clear_theme()
click to toggle source
# File lib/rabbit/canvas.rb, line 780 def clear_theme @font_resolution_ratio = 1 @slides.each do |slide| slide.clear_theme end @renderer.clear_theme modified end
default_theme()
click to toggle source
# File lib/rabbit/canvas.rb, line 799 def default_theme ts = title_slide ts and ts.theme end
keep_index() { || ... }
click to toggle source
# File lib/rabbit/canvas.rb, line 789 def keep_index index_mode = @index_mode index = @current_index index_index = @index_current_index yield @current_index = index @index_current_index = index_index @index_mode = index_mode end
modified()
click to toggle source
# File lib/rabbit/canvas.rb, line 752 def modified @last_modified = Time.now end
move_to(index)
click to toggle source
# File lib/rabbit/canvas.rb, line 812 def move_to(index) old_index = current_index set_current_index(index) Action.update_status(self) @renderer.post_move(old_index, current_index) end
process() { || ... }
click to toggle source
# File lib/rabbit/canvas.rb, line 737 def process if @processing @logger.info(_("Processing...")) return end begin @processing = true Action.update_status(self) yield ensure @processing = false Action.update_status(self) end end
set_current_index(new_index)
click to toggle source
# File lib/rabbit/canvas.rb, line 804 def set_current_index(new_index) if @index_mode @index_current_index = new_index else @current_index = new_index end end