Browser example
false
false
true
macros_menu.examples>end("Examples").end
ruby
# @title Using the HTML browser dialog - a location browser
#
# The HTML browser dialog is very handy to implement simple user interfaces based on
# HTML code and a client/server scheme. This setup is similar to that of
# the HTTP client/server pair.
# The \BrowserDialog object acts as a HTML browser and a \BrowserSource
# object is used to deliver the HTML code for that browser.
#
# In the HTML browser, each link that uses the "int:" scheme is
# resolved by asking the BrowserSource object for the data for that URL.
# This scheme can be used to build user interfaces in the same way a
# web application would implement a simple user interface.
#
# In addition to simply delivering data, the BrowserSource object may
# perform actions on the KLayout API, such as zooming to a certain location,
# opening files, etc. This enables a new class of applications based on
# HTML and direct interaction with the application core.
#
# The example given here employs this technique to implement a simple
# location browser: given a set of three locations, the user can browse
# to one of these locations by clicking the link.
# To try this application, load a layout and use "Browser example"
# from the "Tools/Example" menu.
module Examples
# ---------------------------------------------------------------------------
# The HTML browser object
class Browser < RBA::BrowserDialog
def open
@browser_source = Server.new(self)
self.set_source(@browser_source)
self.show
end
def closed
@browser_source.close
@browser_source = nil
end
end
# ---------------------------------------------------------------------------
# The data provider for the browser
class Server < RBA::BrowserSource
# set up the data provider
def initialize(browser)
# this is an arbitrary list of locations to go to
@boxes = [ RBA::DBox::new(-10.0, 110.0, 10.0, 130.0),
RBA::DBox::new(10.0, 100.0, 12.0, 103.0),
RBA::DBox::new(22.0, -10.0, 23.0, -11.0) ]
@marker = nil
@visited = []
@boxes.size.times { @visited.push(false) }
@browser = browser
end
# on close, destroy the marker
def close
if @marker != nil
@marker.destroy
end
@marker = nil
end
# reimplementation of the data provider's main function
def get( url )
if url =~ /^int:zoom_to\?(\d+)/
# navigate to the specified position
navigate($1.to_i)
# deliver nothing - this will make the browser not reload a new page here
return ""
else
# deliver the index page
return self.index
end
end
# deliver the index page
def index
r = "<html><h1>Locations to select</h1><p><p>"
@boxes.size.times do |index|
if @visited[index]
# visited locations are shown in red color
r += "<a style=\"color:#ff0000\" href=\"int:zoom_to?#{index}\">Zoom to location " + @boxes[index].to_s + "</a><p>"
else
r += "<a href=\"int:zoom_to?#{index}\">Zoom to location " + @boxes[index].to_s + "</a></b><p>"
end
end
return r
end
# go to a certain location
def navigate(loc_index)
if loc_index < @boxes.size
# mark this location as visited
@visited[loc_index] = true
# place the marker on the current view. If no view is opened, this may be nil!
view = RBA::Application::instance.main_window.current_view
if view != nil
# zoom to the specified position (put 10 micron space around that location to
# get the displayed rectangle)
box = @boxes[loc_index]
view.zoom_box(box.enlarged(RBA::DPoint::new(10.0, 10.0)))
# before creating a new marker, delete the current marker unless it was destroyed already
# (this is a recommended safty measure)
if @marker != nil && !@marker.destroyed
@marker.destroy
end
# create a new marker that shows the box selected
@marker = RBA::Marker::new(view)
@marker.set_box(box)
end
# force a reload of the page (necessary, since the color of the links may have changed)
@browser.reload
end
end
end
# ---------------------------------------------------------------------------
# Open the browser
# Destroy any existing one
@browser && @browser._destroy
# Create a new one and open it
@browser = Browser.new
@browser.open
end