https://www.cnblogs.com/yeungchie/
使用 deRegUserTriggers()
可以用來配置:當開啟一個新視窗時,自動整合自定義的選單、工具欄等等。
格式如下:
deRegUserTriggers(
t_viewType
[ s_appTrigger
[ s_menuTrigger
[ s_postInstallTrigger ] ] ]
) => t / nil
ViewType 判斷
首先,viewType 在不同版本的 Virtuoso 可能存在差異,比如 maskLayoutGXL 高版本中可能已經取消。因此在註冊前可以先判斷一下當前型別是否可以獲取到資訊。
給不存在的 viewType 註冊會報 Error 。
viewType = "maskLayoutGXL"
when( appInfo = deGetAppInfo( viewType )
; 判斷 appInfo 為真再進行下一步操作。
)
TrigList 判斷
第二步,再判斷是否已經註冊過,重複註冊會報 Warning 。
上一步返回的 appInfo
是一個 DPL ,通過檢視 userMenuTrigList
或 userPostInstallTrigList
可以判斷相應的程式是否已經註冊過。
上面兩個 TrigList 返回的是一個已經註冊的子程式的 symbol 名組成的 list 。
假設已經定義了一個用於自動整合工具欄的子程式 autoPlaceToolbar
:
unless( member( 'autoPlaceToolbar appInfo->userPostInstallTrigList )
; 當程式名不存在(未註冊)的時候再執行註冊
deRegUserTriggers( winType nil nil 'autoPlaceToolbar )
)
Toolbar 整合例程
- 註冊 toolbar place 的子程式需要寫在
s_postInstallTrigger
位置。 - 在
hiPlaceToolbar()
之後需要多加一句hiShowToolbar()
。這是因為同一視窗在切換 viewType 時,可能會讓 toolbar 隱藏。( 就挺無語的 ... ) - 目標視窗要從輸入變數中獲取:
arg->window
,不要使用hiGetCurrentWindow()
,某些情況下可能會導致 toolbar 整合到錯誤的視窗去。 - 檢視
hiGetWindowToolbars()
,判斷 toolbar 是否已經存在。 hiPlaceToolbar()
和deManageToolbar()
不要同時使用,會衝突。
下面是一個自動整合 toolbar的例子:
Place
先寫好了一個 toolbar 變數:
ycToolbar
procedure( ycAutoPlaceToolbar( \@optional arg( list( nil 'window hiGetCurrentWindow())) "l" )
prog(( win toolbars )
boundp( 'ycToolbar ) || return()
win = arg->window || return()
toolbars = hiGetWindowToolbars( win )
unless( member( ycToolbar toolbars )
hiPlaceToolbar( win ycToolbar 'left )
)
hiShowToolbar( ycToolbar )
return( t )
)
); ycAutoPlaceToolbar
RegTrigger
foreach( viewType list( "maskLayout" "maskLayoutXL" "maskLayoutGXL" )
let(( appInfo )
when( appInfo = deGetAppInfo( viewType )
unless( member( 'ycAutoPlaceToolbar appInfo->userPostInstallTrigList )
deRegUserTriggers( viewType nil nil 'ycAutoPlaceToolbar )
)
)
)
); RegTrigger