Добавлен Unryze,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
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
Скриншоты
Превью
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Unryze
Теперь настройка всего фрейма делается через Jass код, ввиду удаления стандартного темплейта.