📄 menu.wgt
字号:
# $Id: menu.wgt,v 1.13 2002/11/03 08:19:37 cgavin Exp $
##############################################################################
#
# Visual TCL - A cross-platform application development environment
#
# Copyright (C) 2001 Damon Courtney
#
# Description file for Tk Widget
#
# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
##############################################################################
#
Class Menu
Lib core
Icon icon_menu.gif
TreeLabel @vTcl::widgets::core::menu::getWidgetTreeLabel
DefaultValues -background
NewOption -menuspecial "menu" menuspecial
NewOption -tearoff "tearoff" boolean "0 1"
NewOption -postcommand "post cmd" command
NewOption -tearoffcommand "tearoff cmd" command
NewOption -title "title" type
DumpCmd vTcl::widgets::core::menu::dumpCmd
DumpInfoCmd vTcl::widgets::core::menu::dumpInfoCmd
DeleteCmd vTcl::widgets::core::menu::deleteMenu
GetImagesCmd vTcl::widgets::core::menu::getImagesCmd
GetFontsCmd vTcl::widgets::core::menu::getFontsCmd
namespace eval vTcl::widgets::core::menu {
proc getWidgetTreeLabel {target} {
set components [split $target .]
# let's see if the parent is a menu
set size [llength $components]
# parent is at least a toplevel
if {$size <= 3} {
return "Menu"
}
set parent [lrange $components 0 [expr $size - 2] ]
set parent [join $parent .]
# puts "parent is $parent"
if { [vTcl:get_class $parent 1] != "menu" } {
return "Menu"
}
for {set i 0} {$i <= [$parent index end]} {incr i} {
if { [$parent type $i] != "cascade" } {
continue
}
set menuwindow [$parent entrycget $i -menu]
if {$menuwindow == $target} {
return [$parent entrycget $i -label]
}
}
return "Menu"
}
proc deleteMenu {m} {
# this will be used later
set editor [::menu_edit::is_open_existing_editor $m]
::menu_edit::delete_menu_recurse $m
# well, this is not enough to destroy the menu itself,
# we better tell its parent that it's not there as well
set items [split $m .]
set items [lrange $items 0 [expr [llength $items] - 2] ]
set parent [join $items .]
# now, let's see if the parent contains the child menu (should)
set class [vTcl:get_class $parent]
if {$class == "Toplevel"} then {
# it's a toplevel, just removes its menu
$parent configure -menu ""
# closes any open menu editor for this menu
if {$editor != ""} {
destroy $editor}
return
}
if {$class != "Menu"} then return
set last [$parent index end]
for {set i 0} {$i <= $last} {incr i} {
set mtype [$parent type $i]
if {$mtype != "cascade"} then continue
set submenu [$parent entrycget $i -menu]
if {$submenu == $m} then {
# this is the one
$parent delete $i
break
}
}
# now, we will refresh any possibly open menu editor
if {$editor != ""} {
::menu_edit::refreshes_existing_editor $editor
}
}
proc getOption {target option} {
set result {}
set size [$target index end]
if {[vTcl:streq $size "none"]} { return {} }
for {set i 0} {$i <= $size} {incr i} {
if {![catch {$target entrycget $i $option} value]} {
lappend result $value
}
}
return $result
}
proc getImagesCmd {target} {
return [getOption $target -image]
}
proc getFontsCmd {target} {
return [getOption $target -font]
}
proc dumpCmd {target basename} {
## discard temporary items
if {[string first .# $target] >= 0} {
return ""
}
global vTcl basenames
## first dump the menu widget
set result [vTcl:dump_widget_opt $target $basename]
## any entries in the menu?
set entries [$target index end]
if {$entries == "none"} {return $result}
## then all its submenus
for {set index 0} {$index <= $entries} {incr index} {
set conf [$target entryconf $index]
set type [$target type $index]
switch $type {
tearoff {}
cascade {
## to allow option translation
set pairs [vTcl:get_subopts_special $conf $target]
append result "$vTcl(tab)$basename add $type \\\n"
append result "[vTcl:clean_pairs $pairs]\n"
set sitevariable "site_[llength [split $target .]]_0"
append result "$vTcl(tab)"
append result "set $sitevariable [vTcl:base_name $target]\n"
set basenames($target) \$$sitevariable
## dump menu recursively
set childMenu [$target entrycget $index -menu]
set childBasename [vTcl:base_name $childMenu]
append result [dumpCmd $childMenu $childBasename]
catch {unset basenames($target)}
}
default {
# to allow option translation
set pairs [vTcl:get_subopts_special $conf $target]
append result "$vTcl(tab)$basename add $type \\\n"
append result "[vTcl:clean_pairs $pairs]\n"
}
}
}
return $result
}
proc dumpInfoCmd {target basename} {
## discard temporary items
if {[string first .# $target] >= 0} {
return ""
}
global vTcl basenames classes
## first dump the menu widget info
set result [vTcl:dump:widget_info $target $basename]
## any entries in the menu?
set entries [$target index end]
if {$entries == "none"} {return $result}
## then all its submenus
for {set index 0} {$index <= $entries} {incr index} {
set conf [$target entryconf $index]
set type [$target type $index]
switch $type {
cascade {
set sitevariable "site_[llength [split $target .]]_0"
append result "$vTcl(tab)"
append result "set $sitevariable [vTcl:base_name $target]\n"
set basenames($target) \$$sitevariable
## dump menu recursively
set childMenu [$target entrycget $index -menu]
set childBasename [vTcl:base_name $childMenu]
set childClass [vTcl:get_class $childMenu]
append result [$classes($childClass,dumpInfoCmd) $childMenu $childBasename]
catch {unset basenames($target)}
}
default {
}
}
}
return $result
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -