Files
SLikeNet/Samples/Lobby2ClientGFx3.0/Resources/Classes/ScreenWithPageNavigator.as
2025-11-24 14:19:51 +05:30

272 lines
7.6 KiB
ActionScript

import mx.utils.Delegate;
import mx.transitions.easing.None;
import mx.transitions.Tween;
// This is an abstract class, and should be extended.
// It only has common functions that can be shared among screens with page navigation functionality
// The extended class still has to setup the list array properly and calling these functions at the right places
class ScreenWithPageNavigator extends Screen
{
private var mcPageNavigator:PageNavigator;
private var mCurrentPage:Number;
private var mMovieClipList:Array;
private var mEntriesPerPage:Number = 10;
private var mFirstEntryX:Number;
private var mFirstEntryY:Number;
private var mDeltaY:Number;
public function ScreenWithPageNavigator()
{
mCurrentPage = 0;
mScreenId = ScreenID.INVALID_ID;
mScreenTabId = ScreenTab.ID_INVALID;
mMovieClipList = new Array();
//extended class should reset these to different values in the constructor
mFirstEntryX = 0;
mFirstEntryY = 0;
mDeltaY = 0;
}
public function OnShow():Void
{
mcPageNavigator._x = 611;
mcPageNavigator.AddCallbacks( Delegate.create( this, NextPage ), Delegate.create( this, PreviousPage ) );
}
public function OnMoveClipListUpdated():Void
{
mcPageNavigator.SetTotalPages( Math.ceil( mMovieClipList.length / mEntriesPerPage ) );
}
public function GoToPage( _page ):Void
{
mcPageNavigator.GoToPage( _page );
}
public function NextPage():Void
{
ShowPage( mCurrentPage + 1);
}
public function PreviousPage():Void
{
ShowPage( mCurrentPage - 1 );
}
public function ShowPage( _page:Number ):Void
{
if ( ( _page - 1 ) * mEntriesPerPage <= mMovieClipList.length && _page != mCurrentPage )
{
if ( mCurrentPage > 0 )
{
HidePage( mCurrentPage );
mCurrentPage = _page;
}
else
{
ConsoleWindow.Trace("Showing page " + _page);
mCurrentPage = _page;
TogglePageVisibility( mCurrentPage, true );
}
}
}
public function HidePage( _page:Number ):Void
{
if ( ( _page-1 ) * mEntriesPerPage <= mMovieClipList.length )
{
ConsoleWindow.Trace("Hiding page " + _page);
TogglePageVisibility( _page, false );
}
}
private function RefreshPage():Void
{
//TogglePageVisibility( mCurrentPage, true );
InstantShowPage();
}
private function InstantShowPage():Void
{
var startIndex:Number = mCurrentPage * mEntriesPerPage - ( mEntriesPerPage );
var endIndex:Number = startIndex + mEntriesPerPage;
for ( var i:Number = 0; i < mEntriesPerPage; i++ )
{
var mcEntry:MovieClip = mMovieClipList[startIndex+i];
if ( !mcEntry )
{
break;
}
mcEntry._visible = true;
mcEntry._x = mFirstEntryX;
mcEntry._y = mFirstEntryY + (i) * (mcEntry._height + mDeltaY);
OnShowMovieClipEntry( mcEntry );
}
}
private var mLastTime:Number;
private var mCurEntryIndex:Number;
private var mFirstEntryIndex:Number;
private var mEntryVisibleState:Boolean;
private function TogglePageVisibility( _page:Number, _visibleState:Boolean ):Void
{
mcPageNavigator.Disable();
ConsoleWindow.Trace(this + ".TogglePageVisibility()..." + _visibleState);
mLastTime = getTimer();
mFirstEntryIndex = _page * mEntriesPerPage - ( mEntriesPerPage );
mEntryVisibleState = _visibleState;
mCurEntryIndex = 0;
onEnterFrame = OnTick;
}
private function OnTick():Void
{
var now:Number = getTimer();
var delta:Number = now - mLastTime;
//ConsoleWindow.Trace("OnTick, delta = " + delta);
//for ( var i:Number = 0; i < mEntriesPerPage; i++ )
if( delta > 100 )
{
ToggleEntryVisibility();
mLastTime = now;
}
}
private function ToggleEntryVisibility():Void
{
//ConsoleWindow.Trace(this + ".ToggleEntryVisibility(), mEntryVisibleState = " + mEntryVisibleState);
if( mCurEntryIndex < mEntriesPerPage )
{
var mcEntry:MovieClip = mMovieClipList[mFirstEntryIndex+mCurEntryIndex];
if ( !mcEntry )
{
ConsoleWindow.Trace("Entry not found.");
RemoveOnTick();
return;
}
mcEntry._visible = true;
if ( mEntryVisibleState )
{
//ConsoleWindow.Trace("Showing entry: " + mcEntry);
mcEntry._x = mFirstEntryX;// + 500;
mcEntry._y = mFirstEntryY + (mCurEntryIndex) * (mcEntry._height + mDeltaY);
//new Tween( mcEntry, "_x", None.easeNone, mFirstEntryX-200, mFirstEntryX, .3, true );
new Tween( mcEntry, "_alpha", None.easeNone, 0, 100, .3, true );
OnShowMovieClipEntry( mcEntry );
}
else
{
var tween_handler:Tween = new Tween( mcEntry, "_alpha", None.easeNone, 100, 0, .3, true );
//ConsoleWindow.Trace("Hiding entry: " + mcEntry);
//ConsoleWindow.Trace("Hiding tween_handler: " + tween_handler);
tween_handler.onMotionFinished = function()
{
this.obj._visible = false;
}
//OnHideMovieClipEntry( mcEntry );
}
mCurEntryIndex++;
return;
}
RemoveOnTick();
}
public function RemoveOnTick():Void
{
onEnterFrame = null;
if ( !mEntryVisibleState )
{
ConsoleWindow.Trace("Finished hiding previous page, showing current page: " + mCurrentPage);
TogglePageVisibility( mCurrentPage, true );
}
else
{
mcPageNavigator.Enable();
}
}
//override this in extended class to show/hide specific movieclips within mcEntry
private function OnShowMovieClipEntry( mcEntry:MovieClip, index:Number ):Void
{
mcEntry.mcLine._visible = ( index != 0 );
}
private function OnHideMovieClipEntry( mcEntry:MovieClip ):Void
{
}
private function OnFinishedHidingEntry( mcEntry:MovieClip ):Void
{
}
private function RemoveEntryFromList( _entry:MovieClip, _list:Array, bInstantRefresh:Boolean ):Void
{
var index:Number = -1;
var length = mMovieClipList.length;
for ( var i:Number = 0; i < length; i++ )
{
var entry:MovieClip = mMovieClipList[i];
//ConsoleWindow.Trace("entry = " + entry);
if ( entry == _entry )
{
index = i;
break;
}
}
if ( index >= 0 )
{
mMovieClipList.splice( index, 1 );
_entry.removeMovieClip();
if ( bInstantRefresh )
{
InstantShowPage();
}
else
{
mFirstEntryIndex = mCurrentPage * mEntriesPerPage - ( mEntriesPerPage );
mCurEntryIndex = index - mFirstEntryIndex;
ConsoleWindow.Trace("Entry removed. mFirstEntryIndex = " + mFirstEntryIndex + " mCurEntryIndex = " + mCurEntryIndex);
for ( var n:Number = mCurEntryIndex; n < mEntriesPerPage; n++ )
{
var mcEntry:MovieClip = mMovieClipList[mFirstEntryIndex + n];
if ( n == mEntriesPerPage - 1 )
{
mcEntry._visible = true;
mcEntry._x = mFirstEntryX;
mcEntry._y = mFirstEntryY + (n+1) * (mcEntry._height + mDeltaY);
new Tween( mcEntry, "_alpha", None.easeNone, 0, 100, .3, true );
}
var targetY:Number = mFirstEntryY + (n) * (mcEntry._height + mDeltaY);
new Tween( mcEntry, "_y", None.easeNone, mcEntry._y, targetY, .3, true );
}
}
OnMoveClipListUpdated();
}
else
{
ConsoleWindow.Trace("WARNING! RemoveEntryFromList(), can't find the right entry to remove! entry = " + _entry);
}
mFirstEntryIndex = mCurrentPage * mEntriesPerPage - ( mEntriesPerPage );
//User deleted all the entries on the current page, manually show previous page
if ( mFirstEntryIndex >= mMovieClipList.length && mCurrentPage > 1 )
{
mcPageNavigator.PreviousPage();
}
//ConsoleWindow.Trace( " mFirstEntryIndex = " + mFirstEntryIndex + " mMovieClipList.length = " + mMovieClipList.length);
}
}