Screenshot Gallery false false true macros_menu.examples>end("Examples").end ruby # @title Using the HTML browser dialog II: a screenshot gallery # # 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