This was all working fine. It was originally based on your tutorial. Things went screwy when I tried to change the parent class to panel instead of window in an attempt to get rid of the cross arrow move cursor. Because I docked mine right instead of making it movable.
Here is the GUI xml. When I signed in today, the gui editor window shows that this prototype now inherits GUIPanel, still the same results though.
<createControlType inheritFrom='_panel' class='UL_B_CharacterSelectionWindow' type='UL_B_CharacterSelectionWindow' description='UL Base Character Selection Window' treePath='' name="UL_B_CharacterSelectionWindow" dockMode="RIGHT" texture="\GUI\UL-Interface1.png" ignoreMouseEvents="true" inheritDisabledState="false" inheritSelectedState="false" inheritHoveringState="false">
<size x="500" y="637"/>
<defaultStatePresentation>
<color a="1"/>
<position x="492" y="300"/>
<size x="531.805725098" y="183.130706787"/>
</defaultStatePresentation>
<disabledStatePresentation>
<position x="492" y="300"/>
<size x="531.805725098" y="183.130706787"/>
</disabledStatePresentation>
<hoverStatePresentation>
<position x="492" y="300"/>
<size x="531.805725098" y="183.130706787"/>
</hoverStatePresentation>
<selectedStatePresentation>
<position x="492" y="300"/>
<size x="531.805725098" y="183.130706787"/>
</selectedStatePresentation>
<selectedDisabledStatePresentation>
<position x="492" y="300"/>
<size x="531.805725098" y="183.130706787"/>
</selectedDisabledStatePresentation>
<selectedHoverStatePresentation>
<position x="492" y="300"/>
<size x="531.805725098" y="183.130706787"/>
</selectedHoverStatePresentation>
<_panel name="buttons" dockMode="BOTTOM" insertBefore="scrollable">
<size x="500" y="100"/>
<defaultStatePresentation>
<color a="0"/>
</defaultStatePresentation>
<disabledStatePresentation>
<color a="0"/>
</disabledStatePresentation>
<hoverStatePresentation>
<color a="0"/>
</hoverStatePresentation>
<selectedStatePresentation>
<color a="0"/>
</selectedStatePresentation>
<selectedDisabledStatePresentation>
<color a="0"/>
</selectedDisabledStatePresentation>
<selectedHoverStatePresentation>
<color a="0"/>
</selectedHoverStatePresentation>
<UL_B_Button name="loginButton" inheritHoveringState="false">
<size x="100" y="50"/>
<selectedHoverStatePresentation>
<color r="1" g="1" b="1" a="1"/>
</selectedHoverStatePresentation>
<set name='UL_B_CharacterSelectionWindow.buttons.loginButton.text' attribute='text' value="Enter World"/>
</UL_B_Button>
<UL_B_Button name="createButton" inheritHoveringState="false">
<position x="110"/>
<size x="100" y="50"/>
<selectedHoverStatePresentation>
<color r="1" g="1" b="1" a="1"/>
</selectedHoverStatePresentation>
<set name='UL_B_CharacterSelectionWindow.buttons.createButton.text' attribute='text' value="Create New Character"/>
</UL_B_Button>
<UL_B_Button name="deleteButton" inheritHoveringState="false">
<position x="110" y="50"/>
<size x="100" y="50"/>
<selectedHoverStatePresentation>
<color r="1" g="1" b="1" a="1"/>
</selectedHoverStatePresentation>
<set name='UL_B_CharacterSelectionWindow.buttons.deleteButton.text' attribute='text' value="Delete Character"/>
</UL_B_Button>
<UL_B_Button name="exitButton" inheritHoveringState="false">
<position y="50"/>
<size x="100" y="50"/>
<selectedHoverStatePresentation>
<color r="1" g="1" b="1" a="1"/>
</selectedHoverStatePresentation>
<set name='UL_B_CharacterSelectionWindow.buttons.exitButton.text' attribute='text' value="Exit Game"/>
</UL_B_Button>
</_panel>
<set name='UL_B_CharacterSelectionWindow.scrollable' attribute='ignoreMouseEvents' value="false"/>
<set name="UL_B_CharacterSelectionWindow.scrollable.scrollbar.corner">
<set name='UL_B_CharacterSelectionWindow.scrollable.scrollbar.corner' attribute='opacity' value="0"/>
<set name='UL_B_CharacterSelectionWindow.scrollable.scrollbar.corner' attribute='opacityModifier' value="0"/>
<defaultStatePresentation>
<color r="1" g="1" b="1" a="0"/>
</defaultStatePresentation>
<disabledStatePresentation>
<color a="0"/>
</disabledStatePresentation>
<hoverStatePresentation>
<color a="0"/>
</hoverStatePresentation>
<selectedStatePresentation>
<color a="0"/>
</selectedStatePresentation>
<selectedDisabledStatePresentation>
<color a="0"/>
</selectedDisabledStatePresentation>
<selectedHoverStatePresentation>
<color a="0"/>
</selectedHoverStatePresentation>
</set>
<set name="UL_B_CharacterSelectionWindow.scrollable.clientarea">
<defaultStatePresentation>
<color r="1" g="1" b="1" a="0"/>
</defaultStatePresentation>
<hoverStatePresentation>
<color a="0"/>
</hoverStatePresentation>
<set name='UL_B_CharacterSelectionWindow.scrollable.clientarea' attribute='ignoreMouseEvents' value="false"/>
</set>
<_panel name="_panel" dockMode="TOP">
<size x="500" y="50"/>
<defaultStatePresentation>
<color a="0"/>
</defaultStatePresentation>
<disabledStatePresentation>
<color a="0"/>
</disabledStatePresentation>
<hoverStatePresentation>
<color a="0"/>
</hoverStatePresentation>
<selectedStatePresentation>
<color a="0"/>
</selectedStatePresentation>
<selectedDisabledStatePresentation>
<color a="0"/>
</selectedDisabledStatePresentation>
<selectedHoverStatePresentation>
<color a="0"/>
</selectedHoverStatePresentation>
<_panel name="_panel" dockMode="RIGHT" opacity="0">
<size x="50" y="50"/>
</_panel>
<_label name="title" dockMode="RIGHT" text="Select Character" displayfont="LARGETEXT" dropShadowAlpha="1" justification="RIGHT">
<size x="500" y="50"/>
<defaultStatePresentation>
<color r="1" g="1" b="1"/>
</defaultStatePresentation>
</_label>
</_panel>
</createControlType>
Here is the class methods code:
public function Open( args as LookupList indexed by String of String ) as NodeRef of Class GUIControl
// typically args["names"] will contain a list of character names to populate the control
// additional information may be included depending on game specific implementations
//
// called from $CHARACTERSELECTIONSYSTEM._CSSInvokeGUI
$GUI._clearGUI()
var css = GetCharacterSelectionWindowClass()
css = CreateNodeFromPrototype( "UL_B_CharacterSelectionWindow" )
css.build = true
css.centerControlOver( 0 )
names as List of String
unmarshal names from args["names"]
css._cssPopulateNamesList( names )
//var loginButton = css._cssGetLoginButton()
//SetKeyboardFocus( loginButton )
// add a listener to CHARACTERSELECTIONSYSTEM
var listener = $CHARACTERSELECTIONSYSTEM.createNodeListener( css, false )
addAssociation( css, "base_hard_association", listener )
$CHARACTERSELECTIONSYSTEM.addListener( listener )
return css
.
method _cssPopulateNamesList( names as List of String )
var clientArea = me.getClientarea()
foreach child in clientArea.children
DestroyNode( child )
.
if names.length == 0
lbl as NodeRef of Class GUILabel = CreateNodeFromPrototype( "_label" )
lbl.text = "You have no characters!"
lbl.dockMode = FILL
lbl.justification = center
add back lbl to clientArea.children
else
char as NodeRef of Class GUIControl
foreach name in names
if name <> ""
char = createNodeFromPrototype("UL_B_CharacterSelectionName")
char.build = true
char.dockMode = TOP
lbl as NodeRef of Class GUILabel = FindGUIControlByName(char, "name")
lbl.text = name
add back char to clientArea.children
if clientArea.children.length == 1
char.selected = true
.
.
.
.
.
method EventRaised( obs as NodeRef of Class ObsSubject, data as NodeRef )
// NOTE The data passed in is "owned" by the observer pattern and will be deleted at
// when the notifications are complete. No listener should try to persist this
// data node rather it should copy the data if it needs it beyond script execution.
//
where data
is kindof eventObject
when data.eventType
is "CSSCHARACTERCREATED"
DestroyNode( me )
.
is "CSSCHARACTERSELECTED"
destroyNode( me )
.
is "CSSCHARACTERLISTRECEIVED"
me._cssPopulateNamesList( $CHARACTERSELECTIONSYSTEM._CSSGetCharacterList() )
.
is "CSSDELETECHARACTER"
me._cssPopulateNamesList( $CHARACTERSELECTIONSYSTEM._CSSGetCharacterList() )
.
is "CSSCONFIRMDELETECHARACTER"
println("Got delete confirmation event")
$CHARACTERSELECTIONSYSTEM._CSSRequestDeleteCharacter( me._cssGetSelectedCharacterName(), None )
.
default
println("Got event: " + data.eventType + " but I don't know what to do now?")
.
.
.
default
// unknown data node type, no clue how to handle this
.
.
.
method _OnButtonMouseClick(button as NodeRef of Class _GUIButton, args references Class GUIMouseEvent)
when button.name
is "loginButton"
// Tell the server to load normally or into a clean test area
//$CHARACTERSELECTIONSYSTEM._CSSRequestSetLoadInCleanTestArea( me._cssIsCleanChecked(), None )
var listener = $CHARACTERSELECTIONSYSTEM.createNodeListener( me, false )
$CHARACTERSELECTIONSYSTEM._CSSRequestSelectCharacter( me._cssGetSelectedCharacterName(), listener )
// Until chat buffering is set to false, no chat messages will be displayed in the
// chat panel or your game specific chat
$BASECLIENT._setChatBuffering( false )
.
is "createButton"
arguments as LookupList indexed by String of String
var listener = $CHARACTERSELECTIONSYSTEM.createNodeListener( me, false )
$CHARACTERSELECTIONSYSTEM._CSSRequestCreateCharacter( arguments, listener )
.
is "deleteButton"
if me._cssGetSelectedCharacterName() = ""
$ALERT._CleanModalAlert( "No character is selected." )
else
var listener = $CHARACTERSELECTIONSYSTEM.createNodeListener( me, false )
$CHARACTERSELECTIONSYSTEM.addListener( listener )
me._cssShowDeleteCharacterWarning( me._cssGetSelectedCharacterName() )
.
.
is "exitButton"
$BASECLIENT._Exit()
.
is "cancelDelete"
DestroyNode( button.rootParent() )
.
is "deleteConfirm"
$CHARACTERSELECTIONSYSTEM._CSSConfirmDeleteCharacter()
DestroyNode( button.rootParent() )
.
default
ScriptError( "Unknown button: " + button.name + "." )
.
.
.
method _cssGetSelectedCharacterName() as String
var clientArea = me.GetClientArea()
name as String
foreach child in clientArea.children
if child.selected
lbl as NodeRef of Class GUILabel = FindGUIControlByName( child, "name" )
name = lbl.text
break
.
.
return name
.
method _cssShowDeleteCharacterWarning( name as String )
warning as NodeRef of Class GUIControl = CreateNodeFromPrototype( "_cssDeleteCharacterWarning" )
warning.build = true
warning.name = "HE_DeleteCharacterWarning"
screen as Vector3 = GetViewPortSize()
warning.position.x = ( ( screen.x - warning.size.x ) / 2 )
warning.position.y = ( ( screen.y - warning.size.y ) / 2 )
var deleteButton = FindGUIControlByName( warning, "buttonpanel.deleteConfirm" )
if deleteButton != None
deleteButton._resetButtonText( " Yes " )
.
var cancelButton = FindGUIControlByName( warning, "buttonpanel.cancelDelete" )
if cancelButton != None
cancelButton._resetButtonText( " No " )
.
myLabel as NodeRef of Class GUILabel = FindGUIControlByName( warning, "scrollable.clientarea.text" )
myLabel.text = "WARNING!$RDo you wish to delete " + name + "?"
warning.createModalDialog( None )
.
method OnMouseClick(args references Class GUIMouseEvent)
target as NodeRef of Class GUIControl = args.source
when target.name
is "UL_B_CharacterSelectionName"
me.ClearSelectedName()
target.selected = true
.
.
.
method ClearSelectedName()
var clientArea = me.GetClientArea()
foreach child in clientArea.children
if child.selected = true
child.selected = false
.
.
.
method GetClientArea() as NodeRef of Class GUIControl
return FindGUIControlByName(me, "scrollable.clientarea")
.
function GetCharacterSelectionWindowClass() as NodeRef of Class UL_B_CharacterSelectionWindow
return FindGUIControlByName(None, "UL_B_CharacterSelectionWindow")
.