klayout/testdata/ruby/layMenuTest.rb

543 lines
15 KiB
Ruby

# encoding: UTF-8
# KLayout Layout Viewer
# Copyright (C) 2006-2024 Matthias Koefferlein
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
if !$:.member?(File::dirname($0))
$:.push(File::dirname($0))
end
load("test_prologue.rb")
class LAYMenuTest_TestClass < TestBase
def test_0
if !RBA.constants.member?(:Action)
return
end
a = RBA::Action::new
b = a.dup
a.shortcut = "Shift+F1"
assert_equal(a.shortcut, "Shift+F1")
assert_equal(a.effective_shortcut, "Shift+F1")
assert_equal(b.shortcut, "")
assert_equal(b.effective_shortcut, "")
a.default_shortcut = "X"
assert_equal(a.default_shortcut, "X")
assert_equal(a.shortcut, "Shift+F1")
assert_equal(a.effective_shortcut, "Shift+F1")
a.shortcut = ""
assert_equal(a.default_shortcut, "X")
assert_equal(a.shortcut, "")
assert_equal(a.effective_shortcut, "X")
a.shortcut = RBA::Action::NoKeyBound
assert_equal(a.default_shortcut, "X")
assert_equal(a.shortcut, "none")
assert_equal(a.effective_shortcut, "")
a.shortcut = ""
assert_equal(a.is_visible?, true)
a.hidden = false
a.visible = false
assert_equal(a.is_visible?, false)
assert_equal(a.is_hidden?, false)
assert_equal(a.is_effective_visible?, false)
assert_equal(a.effective_shortcut, "X")
a.hidden = false
a.visible = true
assert_equal(a.is_visible?, true)
assert_equal(a.is_hidden?, false)
assert_equal(a.is_effective_visible?, true)
assert_equal(a.effective_shortcut, "X")
a.hidden = true
a.visible = true
assert_equal(a.is_visible?, true)
assert_equal(a.is_hidden?, true)
assert_equal(a.is_effective_visible?, false)
assert_equal(a.effective_shortcut, "")
end
def test_1
if !RBA.constants.member?(:Application)
return
end
app = RBA::Application.instance
mw = app.main_window
menu = mw.menu
app.set_config( "ruler-templates", "" )
def item_str( menu )
def collect_children(space, menu, item)
res = "#{space}#{item}\n"
menu.items(item).each { |child| res += collect_children(" #{space}", menu, child) }
return res;
end
res = ""
menu.items("").each { |item| res += collect_children("", menu, item) }
return res
end
# since the menu is somewhat dynamic, this is not really a good idea
# (in addition, the menu depends on the mode - editable or not)
if false
assert_equal( item_str(menu), <<RESULT )
file_menu
...
@hcp_context_menu.save_as
RESULT
end
menu.delete_item("@toolbar.partial")
menu.delete_item("@toolbar.instance")
menu.delete_item("@toolbar.polygon")
menu.delete_item("@toolbar.box")
menu.delete_item("@toolbar.path")
menu.delete_item("@toolbar.text")
menu.delete_item("@hcp_context_menu")
menu.delete_item("@lcp_context_menu")
menu.delete_item("help_group")
menu.delete_item("tools_menu")
menu.delete_item("edit_menu")
menu.delete_item("file_menu.reader_options")
menu.delete_item("file_menu.session_group")
menu.delete_item("file_menu.restore_session")
menu.delete_item("file_menu.save_session")
menu.delete_item("zoom_menu")
$a1 = RBA::Action::new
$a1.title = "New title"
$a1.icon_text = "X"
$a1.shortcut = "Shift+Ctrl+F7"
menu.insert_menu( "end", "my_menu", "My menu" )
menu.insert_item( "my_menu.end", "new_item", $a1 )
menu.insert_item( "file_menu.begin", "new_item_1", $a1 )
menu.insert_separator( "file_menu.#3", "sep" )
menu.insert_item( "file_menu.#3", "new_item_2", $a1 )
assert_equal( menu.action("my_menu").title, "My menu" )
if false # disabled because hard to keep updated
assert_equal( item_str(menu), <<RESULT )
file_menu
file_menu.new_item_1
file_menu.new_layout
file_menu.new_panel
file_menu.new_item_2
file_menu.sep
file_menu.post_new_group
file_menu.open
file_menu.open_same_panel
file_menu.open_new_panel
file_menu.close
file_menu.clone
file_menu.reload
file_menu.pull_in
file_menu.open_recent_group
file_menu.open_recent_menu
file_menu.import_group
file_menu.import_menu
file_menu.import_menu.import_gerber_menu
file_menu.import_menu.import_gerber_menu.import_gerber_new
file_menu.import_menu.import_gerber_menu.import_gerber_new_free
file_menu.import_menu.import_gerber_menu.import_gerber_open
file_menu.import_menu.import_gerber_menu.import_gerber_recent
file_menu.import_menu.import_stream
file_menu.import_menu.import_lef
file_menu.import_menu.import_def
file_menu.save_group
file_menu.save
file_menu.save_as
file_menu.setup_group
file_menu.setup
file_menu.misc_group
file_menu.screenshot
file_menu.layout_props
file_menu.layer_group
file_menu.load_layer_props
file_menu.save_layer_props
file_menu.exit_group
file_menu.exit
bookmark_menu
bookmark_menu.goto_bookmark_menu
bookmark_menu.bookmark_view
bookmark_menu.bookmark_mgm_group
bookmark_menu.manage_bookmarks
bookmark_menu.load_bookmarks
bookmark_menu.save_bookmarks
help_menu
help_menu.about
@toolbar
@toolbar.select
@toolbar.move
@toolbar.ruler
my_menu
my_menu.new_item
RESULT
end
assert_equal( menu.is_valid?( "file_menu.#0" ), true )
assert_equal( menu.is_valid?( "fill_menu" ), false )
assert_equal( menu.is_menu?( "fill_menu" ), false )
assert_equal( menu.is_menu?( "file_menu" ), true )
assert_equal( menu.is_menu?( "file_menu.#0" ), false )
assert_equal( menu.is_separator?( "fill_menu" ), false )
assert_equal( menu.is_separator?( "file_menu.#0" ), false )
assert_equal( menu.is_separator?( "file_menu.sep" ), true )
assert_equal( menu.action( "file_menu.#0" ).title, "New title" )
assert_equal( menu.action( "file_menu.#0" ).shortcut, "Shift+Ctrl+F7" )
assert_equal( menu.action( "file_menu.#3" ).icon_text, "X" )
assert_equal( menu.action( "my_menu.new_item" ).is_visible?, true )
assert_equal( menu.action( "file_menu.#3" ).is_checked?, false )
assert_equal( menu.action( "my_menu.new_item" ).is_enabled?, true )
$a1.visible = false
assert_equal( menu.action( "my_menu.new_item" ).is_visible?, false )
assert_equal( menu.action( "my_menu.new_item" ).is_checked?, false )
assert_equal( menu.action( "my_menu.new_item" ).is_enabled?, true )
$a1.checked = true
assert_equal( menu.action( "file_menu.#3" ).is_visible?, false )
assert_equal( menu.action( "file_menu.#3" ).is_checked?, false )
assert_equal( menu.action( "file_menu.#3" ).is_checkable?, false )
assert_equal( menu.action( "file_menu.#3" ).is_enabled?, true )
$a1.checked = false
$a1.checkable = true;
assert_equal( menu.action( "my_menu.new_item" ).is_visible?, false )
assert_equal( menu.action( "my_menu.new_item" ).is_checked?, false )
assert_equal( menu.action( "my_menu.new_item" ).is_checkable?, true )
assert_equal( menu.action( "my_menu.new_item" ).is_enabled?, true )
$a1.checked = true
assert_equal( menu.action( "file_menu.#0" ).is_checked?, true )
$a1.enabled = false
assert_equal( menu.action( "my_menu.new_item" ).is_visible?, false )
assert_equal( menu.action( "my_menu.new_item" ).is_checked?, true )
assert_equal( menu.action( "my_menu.new_item" ).is_enabled?, false )
$a1.visible = true
assert_equal( menu.action( "my_menu.new_item" ).is_visible?, true )
assert_equal( menu.action( "my_menu.new_item" ).is_checked?, true )
assert_equal( menu.action( "my_menu.new_item" ).is_enabled?, false )
$a1.enabled = true
assert_equal( menu.action( "my_menu.new_item" ).is_visible?, true )
assert_equal( menu.action( "my_menu.new_item" ).is_checked?, true )
assert_equal( menu.action( "my_menu.new_item" ).is_enabled?, true )
end
if RBA.constants.member?(:Action)
class MenuHandler < RBA::Action
def initialize( t, k, &action )
self.title = t
self.shortcut = k
@action = action
end
def triggered
@action.call( self )
end
private
@action
end
end
def test_2
if !RBA.constants.member?(:Application)
return
end
app = RBA::Application.instance
mw = app.main_window
menu = mw.menu
triggered = false
f7_handler = MenuHandler.new( "Ruby Test", "F7" ) {
triggered = true
}
# This makes the application crash
$f7_handler = f7_handler
menu.insert_item("file_menu.begin", "new_item", f7_handler)
menu.action("file_menu.#0").trigger
assert_equal( triggered, true )
triggered = false
menu.insert_item("help_menu.end", "new_item_copy", menu.action("file_menu.#0") )
menu.action("help_menu.new_item_copy").trigger
assert_equal( triggered, true )
end
def test_3
if !RBA.constants.member?(:AbstractMenu)
return
end
map = RBA::AbstractMenu::unpack_key_binding("'path.a':X;'path.b':''")
assert_equal(map["path.a"], "X")
assert_equal(map["path.b"], "")
assert_equal(map["path.c"], nil)
map2 = RBA::AbstractMenu::unpack_key_binding(RBA::AbstractMenu::pack_key_binding(map))
assert_equal(map == map2, true)
map = RBA::AbstractMenu::unpack_menu_items_hidden("'path.a':true;'path.b':false")
assert_equal(map["path.a"], true)
assert_equal(map["path.b"], false)
assert_equal(map["path.c"], nil)
map2 = RBA::AbstractMenu::unpack_menu_items_hidden(RBA::AbstractMenu::pack_menu_items_hidden(map))
assert_equal(map == map2, true)
end
def test_4
if !RBA.constants.member?(:Action)
return
end
action = RBA::Action::new
action.title = "title:n1"
menu = RBA::AbstractMenu::new
assert_equal(menu.action("s1.n1"), nil)
assert_equal(menu.action("s1"), nil)
menu.insert_menu("end", "s1", "submenu1")
menu.insert_menu("end", "s2", "submenu2")
menu.insert_item("s1.end", "n1", action)
menu.insert_item("s2.end", "n1", action)
assert_equal(menu.action("s1.n1") == action, true)
assert_equal(menu.action("s2.n1") == action, true)
menu._destroy
# proof of transfer of ownership
assert_equal(action._destroyed?, true)
end
def test_5
if !RBA.constants.member?(:Action)
return
end
action = RBA::Action::new
action.title = "title:n1"
menu = RBA::AbstractMenu::new
assert_equal(menu.action("s1.n1"), nil)
assert_equal(menu.action("s1"), nil)
menu.insert_menu("end", "s1", "submenu1")
menu.insert_menu("end", "s2", "submenu2")
menu.insert_item("s1.end", "n1", action)
menu.insert_item("s2.end", "n1", action)
menu.delete_item ("s2");
assert_equal(menu.action("s1.n1") == action, true)
assert_equal(menu.action("s2.n1") == nil, true)
menu._destroy
assert_equal(action._destroyed?, true)
end
def test_6
if !RBA.constants.member?(:Application)
return
end
app = RBA::Application.instance
mw = app.main_window
assert_equal(mw.get_key_bindings["file_menu.exit"], "Ctrl+Q")
# key bindings
mw.set_key_bindings({"file_menu.exit" => "F2"})
assert_equal(mw.get_key_bindings["file_menu.exit"], "F2")
mw.set_key_bindings({"file_menu.exit" => ""})
assert_equal(mw.get_key_bindings["file_menu.exit"], "")
mw.set_key_bindings(mw.get_default_key_bindings)
assert_equal(mw.get_key_bindings["file_menu.exit"], "Ctrl+Q")
mw.set_key_bindings({"file_menu.exit" => ""})
assert_equal(mw.get_key_bindings["file_menu.exit"], "")
# menu items hidden
assert_equal(mw.get_menu_items_hidden["file_menu.exit"], false)
mw.set_menu_items_hidden({"file_menu.exit" => true})
assert_equal(mw.get_menu_items_hidden["file_menu.exit"], true)
mw.set_menu_items_hidden(mw.get_default_menu_items_hidden)
assert_equal(mw.get_menu_items_hidden["file_menu.exit"], false)
mw.set_menu_items_hidden({"file_menu.exit" => true})
assert_equal(mw.get_menu_items_hidden["file_menu.exit"], true)
# reset for the next pass
mw.set_menu_items_hidden(mw.get_default_menu_items_hidden)
mw.set_key_bindings(mw.get_default_key_bindings)
end
if RBA.constants.member?(:Action)
class MyAction < RBA::Action
attr_accessor :dyn_visible, :dyn_enabled
def initialize
self.dyn_visible = true
self.dyn_enabled = true
end
def wants_visible
self.dyn_visible
end
def wants_enabled
self.dyn_enabled
end
end
def test_7
a = MyAction::new
assert_equal(a.is_effective_visible?, true)
a.hidden = true
assert_equal(a.is_effective_visible?, false)
a.hidden = false
assert_equal(a.is_effective_visible?, true)
a.visible = false
assert_equal(a.is_effective_visible?, false)
a.visible = true
assert_equal(a.is_effective_visible?, true)
a.dyn_visible = false
assert_equal(a.is_effective_visible?, false)
a.dyn_visible = true
assert_equal(a.is_effective_visible?, true)
assert_equal(a.is_effective_enabled?, true)
a.enabled = false
assert_equal(a.is_effective_enabled?, false)
a.enabled = true
assert_equal(a.is_effective_enabled?, true)
a.dyn_enabled = false
assert_equal(a.is_effective_enabled?, false)
a.dyn_enabled = true
assert_equal(a.is_effective_enabled?, true)
end
end
def test_8
if !RBA.constants.member?(:Action)
return
end
action = RBA::Action::new
action.title = "title:n1"
menu = RBA::AbstractMenu::new
assert_equal(menu.action("s1.n1"), nil)
assert_equal(menu.action("s1"), nil)
menu.insert_menu("end", "s1", "submenu1")
menu.insert_menu("end", "s2", "submenu2")
menu.insert_item("s1.end", "n1", action)
menu.insert_item("s1.end", "n2", action)
menu.insert_item("s2.end", "n1", action)
assert_equal(menu.action("s1.n1") == action, true)
assert_equal(menu.action("s1.n2") == action, true)
assert_equal(menu.action("s2.n1") == action, true)
assert_equal(menu.is_valid?("s1.n1"), true)
assert_equal(menu.is_valid?("s1.n2"), true)
assert_equal(menu.is_valid?("s2.n1"), true)
menu.clear_menu("s1")
assert_equal(menu.is_valid?("s1.n1"), false)
assert_equal(menu.is_valid?("s1.n2"), false)
assert_equal(menu.is_valid?("s2.n1"), true)
menu.clear_menu("s2")
assert_equal(menu.is_valid?("s1.n1"), false)
assert_equal(menu.is_valid?("s1.n2"), false)
assert_equal(menu.is_valid?("s2.n1"), false)
# proof of transfer of ownership
assert_equal(action._destroyed?, true)
menu._destroy
end
end
load("test_epilogue.rb")