Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Jass
Тип:
Алгоритм
Версия Warcraft:
UjAPI v1.1.14.215+

О системе

Относительно краткий пример создания ListBox фрейма используя UjAPI и Frame API.
Главным бонусом UjAPI в данной наработке является полноценный API специально добавленный для обработки ListBox фреймов, который позволяет просто на просто отказаться от fdf, а так же позволяет не только добавлять элементы, а так же удалять их. Зачем же нужны ListBox? Если Вы планируете создать допустим магазин с большим количеством предметов, или же лог квестов/инвентарь, но не хотите занимать весь экран, то ListBox как раз для вас.
Что же можно добавлять в листбокс? Практически что угодно, однако есть маленький нюанс. Создавать фрейм, который мы захотим затем "закрепить" в листбоксе обязательно требует указание родителя - сам листбокс при его создании, SetFrameParent к сожалению в данной ситуации нам не поможет и фрейм не будет "заточен" в листбоксе.
Событий у листбокса конечно же маловато внутри движка, а точнее: SELECTION_CHANGED (SELECTED/CLICKED), DOUBLE_CLICKED.
Данная система конечно же работает в онлайне и не вызывает десинха, иначе это не имело бы смысла.

Код

раскрыть
library API
    function B2S takes boolean flag returns string
        if flag then
            return "true"
        endif
        
        return "false"
    endfunction

    function B2I takes boolean flag returns integer
        if flag then
            return 1
        endif

        return 0
    endfunction

    // These leak trigger handle on each call, only use this to test things where you want to call TriggerSleepAction
    // since destroying returned trigger will skip sleep action.
    // <------
    function RunTriggeredCodeEx takes trigger t, code func returns trigger  
        if t == null then
            return null
        endif

        call ResetTrigger( t ) // simply resets Eval and Exec count
        call TriggerClear( t ) // probably a bad idea. :)
        call TriggerAddAction( t, func )
        call TriggerExecute( t )

        return t
    endfunction

    function RunTriggeredCode takes code func returns trigger
        return RunTriggeredCodeEx( CreateTrigger( ), func )
    endfunction
    // ------>
endlibrary

globals
    framehandle frm_ListBox = null
    boolean frameDebugMode = true
    boolean listBoxExItems = true
endglobals

function OnFrameEvent takes string eventName, boolean extraData returns nothing
    local player p = GetTriggerPlayer( )
    
    if frameDebugMode then
        if eventName != "" then
            call ConsolePrint( eventName + "\n" )
        endif
        
        if extraData then
            call ConsolePrint( "TriggerPlayerId = "   + I2S( GetPlayerId( p ) ) + "\n" )
            call ConsolePrint( "TriggerPlayer = "     + IntToHex( GetHandleId( GetTriggerPlayer( ) ) ) + "\n" )
            call ConsolePrint( "TriggerPlayerName = " + GetPlayerName( GetTriggerPlayer( ) ) + "\n" )
            call ConsolePrint( "TriggeringTrigger = " + IntToHex( GetHandleId( GetTriggeringTrigger( ) ) ) + "\n" )
            call ConsolePrint( "TriggerFrame = "      + IntToHex( GetHandleId( GetTriggerFrame( ) ) ) + "\n" )
            call ConsolePrint( "TriggerFrameEvent = " + I2S( GetHandleId( GetTriggerFrameEvent( ) ) ) + "\n" )
        endif
    endif

    set p = null
endfunction

function OnListBoxMenuChangeItem takes nothing returns nothing
    call OnFrameEvent( "OnListBoxMenuChangeItem", true )
    
    if frameDebugMode then
        call ConsolePrint( "GetTriggerFrameInteger = " + I2S( GetTriggerFrameInteger( ) ) + "\n" )
        call ConsolePrint( "GetTriggerFrameTargetFrame = " + IntToHex( GetHandleId( GetTriggerFrameTargetFrame( ) ) ) + "\n" )
    endif
endfunction

function OnListBoxTest takes integer contextId returns framehandle
    local integer i = 0
    local integer start = 'A'
    local framehandle frm = null
    local framehandle gameUI = GetOriginFrame( ORIGIN_FRAME_GAME_UI, 0 )
    local framehandle textFrame = null
    local framehandle listItemFrame = null
    local framehandle listScrollFrame = null
    local framehandle backDropFrame = null
    local trigger t = null
    local real itemHeight = .0

    set frm_ListBox = CreateFrameByType( "LISTBOX", "frm_ListBox123", gameUI, "", contextId )
    call ClearFrameAllPoints( frm_ListBox )
    call SetFrameRelativePoint( frm_ListBox, FRAMEPOINT_CENTER, gameUI, FRAMEPOINT_CENTER, .0, .0 )
    call SetFrameSize( frm_ListBox, .12, .15 )
    call SetFrameItemsBorder( frm_ListBox, .01 )
    call SetFrameItemsHeight( frm_ListBox, .02 )
    call SetFrameControlFlag( frm_ListBox, CONTROL_STYLE_HIGHLIGHT_FOCUS, true )
    call SetFrameBackdropTexture( frm_ListBox, 1, "UI\\widgets\\BattleNet\\bnet-tooltip-background.blp", true, true, "UI\\widgets\\BattleNet\\bnet-tooltip-border.blp", BORDER_FLAG_ALL, false )
    call SetFrameBorderSize( frm_ListBox, 1, .0125 )
    call SetFrameBackgroundSize( frm_ListBox, 1, .256 )
    call SetFrameBackgroundInsets( frm_ListBox, 1, .005, .005, .005, .005 )
    call AddFrameSlider( frm_ListBox )

    set itemHeight = GetFrameItemsHeight( frm_ListBox )
    set listScrollFrame = GetFrameChild( frm_ListBox, 2 )

    loop
        exitwhen i == 15

        if listBoxExItems then // Fancier items in listbox
            set backDropFrame = CreateFrameByType( "BACKDROP", "MyTestBackDrop", listScrollFrame, "", i )
            set listItemFrame = AddFrameListItem( frm_ListBox, "", backDropFrame )
            call SetFrameBackdropTexture( backDropFrame, 1, "UI\\widgets\\BattleNet\\bnet-tooltip-background.blp", true, true, "UI\\widgets\\BattleNet\\bnet-tooltip-border.blp", BORDER_FLAG_ALL, false )
            call SetFrameHeight( backDropFrame, .02 )
            call SetFrameBorderSize( backDropFrame, 1, .0125 )
            call SetFrameBackgroundSize( backDropFrame, 1, .128 )
            call SetFrameBackgroundInsets( backDropFrame, 1, .005, .005, .005, .005 )

            set textFrame = CreateFrameByType( "TEXT", "frm_ListBoxText", backDropFrame, "", i )
            call ClearFrameAllPoints( textFrame )
            //call SetFrameAbsolutePoint( textFrame, FRAMEPOINT_CENTER, .0, .0 )
            call SetFrameRelativePoint( textFrame, FRAMEPOINT_CENTER, backDropFrame, FRAMEPOINT_CENTER, .0, .0 )
            call SetFrameText( textFrame, IntToChar( start + i ) )
        else // Simpler items.
            set listItemFrame = AddFrameListItem( frm_ListBox, "KEKW " + I2S( i ), null )
        endif

        set i = i + 1
    endloop

    if false then

    else

    endif


    set t = CreateTrigger( )
    call TriggerRegisterFrameEvent( t, frm_ListBox, FRAMEEVENT_POPUPMENU_ITEM_CHANGED )
    call TriggerAddAction( t, function OnListBoxMenuChangeItem )

    set frm = null
    set gameUI = null
    set textFrame = null
    set listItemFrame = null
    set listScrollFrame = null
    set backDropFrame = null
    set t = null

    return frm_ListBox
endfunction

function OnInitSystemDelayed takes nothing returns nothing
    local framehandle frm = null
    call DestroyTimer( GetExpiredTimer( ) )
    call BJDebugMsg( "UjAPI Version: " + GetUjAPIVersion( ) )

    set frm = OnListBoxTest( 0 )
    set frm = null
endfunction

//===========================================================================
function InitTrig_ListBoxText takes nothing returns nothing
    //set gg_trg_ListBoxText = CreateTrigger(  )

    call FogEnable( false )
    call FogMaskEnable( false )
    call PanCameraToTimed( 0., 0., 0. )
    call EnableOperationLimit( false )
    call TimerStart( CreateTimer( ), .5, false, function OnInitSystemDelayed )    
endfunction

Скриншоты

Превью

`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
9 месяцев назад
0
Надо будет перенести завод в ужапи
0
20
6 месяцев назад
Отредактирован Unryze
0
Вышла новая версия!
Карта обновлена под UjAPI v1.0.37.137.
0
20
2 месяца назад
0
Вышла новая версия!
Карта обновлена под UjAPI v1.1.12.205.
Теперь настройка всего фрейма делается через Jass код, ввиду удаления стандартного темплейта.
0
20
1 день назад
0
Карта обновлена под UjAPI v1.1.14.215, добавлено событие выбора фреймов в ListBox.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.