Macro file: screenshots.lym

This example employs the HTML browser dialog to implement a simple screenshot gallery: by clicking on the "Add screenshot" item in the toolbar, a screenshot is taken and placed in the HTML browser window. Each screenshot will be represented by a thumbnail image and a screen-size image. The browser will display the thumbnails together with a link that will put the viewer to the original location. By clicking on the thumbnail image, the enlarged version is shown in the browser window.
module Examples
class Screenshot
def initialize( index, view )
@index = index
@small_file = "screenshot.small.#{@index}.png"
@large_file = "screenshot.large.#{@index}.png"
view.save_image( @small_file, 80, 60 )
view.save_image( @large_file, 800, 600 )
@box = view.box
end
def box
return @box
end
def html_snippet
s = ""
l = sprintf( "%.3f", @box.left.to_s )
r = sprintf( "%.3f", @box.right.to_s )
b = sprintf( "%.3f", @box.bottom.to_s )
t = sprintf( "%.3f", @box.top.to_s )
s += "<a style=\"font-size:10px\" href=\"int:navigate?#{@index}\">#{l},#{b} <br/>"
s += "#{r},#{t}</a><br/>"
s += "<a href=\"int:enlarged?#{@large_file}\"><img src=\"file:#{@small_file}\" width=\"80\" height=\"60\"/></a>"
return s
end
end
class ScreenshotBrowser < RBA::BrowserDialog
def initialize
@browser_source = ScreenshotServer.new
self.set_source( @browser_source )
self.set_home( "int:index" )
self.show
end
def add
@browser_source.add
self.show
self.load( "int:index" )
self.reload
end
end
class ScreenshotServer < RBA::BrowserSource
def initialize
@screenshots = []
end
def add
view = RBA::Application::instance.main_window.current_view
if view != nil
@screenshots.push( Screenshot.new( @screenshots.size, view ) )
end
end
def get( url )
url = url.sub( /^int:/, "" )
if url == "index"
return self.index
elsif url =~ /^enlarged\?(.*)/
return enlarged( $1 )
elsif url =~ /^navigate\?(.*)/
navigate( $1.to_i )
end
return ""
end
def navigate( index )
view = RBA::Application::instance.main_window.current_view
if view != nil
view.zoom_box( @screenshots[index].box )
end
end
def enlarged( img )
return "<a href=\"int:index\">Index Page</a><br/><img src=\"file:#{img}\"/>"
end
def index
r = []
r.push( "<html><h1>Screenshot gallery</h1><p><p>" )
r.push( "<table>" )
r.push( "<tr>" )
n = 0
@screenshots.each { |s|
r.push( "<td>" )
r.push( s.html_snippet )
r.push( "</td>" )
n += 1
if n % 5 == 0
r.push( "</tr><tr>" )
end
}
r.push( "</tr>" )
r.push( "</table>" )
return r.join( "" )
end
end
# ------------------------------------------------------------------
# Declare and register the menu items
app = RBA::Application::instance
mw = app.main_window
menu = mw.menu
@screenshot_browser = nil
@add_screenshot_action = RBA::Action::new
@add_screenshot_action.title = "Add Screenshot"
@add_screenshot_action.on_triggered do
@screenshot_browser ||= ScreenshotBrowser.new
@screenshot_browser.add
end
@show_gallery_action = RBA::Action::new
@show_gallery_action.title = "Show Gallery"
@show_gallery_action.on_triggered do
@screenshot_browser && @screenshot_browser.show
end
menu.insert_separator( "@toolbar.end", "tb_sep" )
menu.insert_item( "@toolbar.end", "add_screenshot", @add_screenshot_action )
menu.insert_item( "@toolbar.end", "show_gallery", @show_gallery_action )
end