[ Skill ] 圖形化元件在註冊 User Trigger 時需要注意的事情

YEUNGCHIE發表於2021-12-01

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 ,通過檢視 userMenuTrigListuserPostInstallTrigList 可以判斷相應的程式是否已經註冊過。

上面兩個 TrigList 返回的是一個已經註冊的子程式的 symbol 名組成的 list 。

假設已經定義了一個用於自動整合工具欄的子程式 autoPlaceToolbar

unless( member( 'autoPlaceToolbar appInfo->userPostInstallTrigList )
  ; 當程式名不存在(未註冊)的時候再執行註冊
  deRegUserTriggers( winType  nil nil 'autoPlaceToolbar )
)

Toolbar 整合例程

  1. 註冊 toolbar place 的子程式需要寫在 s_postInstallTrigger 位置。
  2. hiPlaceToolbar() 之後需要多加一句 hiShowToolbar() 。這是因為同一視窗在切換 viewType 時,可能會讓 toolbar 隱藏。( 就挺無語的 ... )
  3. 目標視窗要從輸入變數中獲取:arg->window,不要使用 hiGetCurrentWindow(),某些情況下可能會導致 toolbar 整合到錯誤的視窗去。
  4. 檢視 hiGetWindowToolbars() ,判斷 toolbar 是否已經存在。
  5. 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

相關文章