00001 //=============================================================================
00002 // WindowConsole - console replacer to implement UWindow UI System
00003 //=============================================================================
00004 class WindowConsole extends Console;
00005
00006 var UWindowRootWindow Root;
00007 var() config string RootWindow;
00008
00009 var float OldClipX;
00010 var float OldClipY;
00011 var bool bCreatedRoot;
00012 var float MouseX;
00013 var float MouseY;
00014
00015 var class<UWindowConsoleWindow> ConsoleClass;
00016 var config float MouseScale;
00017 var config bool ShowDesktop;
00018 var config bool bShowConsole;
00019 var bool bBlackout;
00020 var bool bUWindowType;
00021
00022 var bool bUWindowActive;
00023 var bool bQuickKeyEnable;
00024 var bool bLocked;
00025 var bool bLevelChange;
00026 var string OldLevel;
00027 var globalconfig byte ConsoleKey;
00028
00029 var config EInputKey UWindowKey;
00030
00031 var UWindowConsoleWindow ConsoleWindow;
00032
00033 function ResetUWindow()
00034 {
00035 if(Root != None)
00036 Root.Close();
00037 Root = None;
00038 bCreatedRoot = False;
00039 ConsoleWindow = None;
00040 bShowConsole = False;
00041 CloseUWindow();
00042 }
00043
00044 event bool KeyEvent( EInputKey Key, EInputAction Action, FLOAT Delta )
00045 {
00046 local byte k;
00047 k = Key;
00048 switch(Action)
00049 {
00050 case IST_Press:
00051 switch(k)
00052 {
00053 case EInputKey.IK_Escape:
00054 if (bLocked)
00055 return true;
00056
00057 bQuickKeyEnable = False;
00058 LaunchUWindow();
00059 return true;
00060 case ConsoleKey:
00061 if (bLocked)
00062 return true;
00063
00064 bQuickKeyEnable = True;
00065 LaunchUWindow();
00066 if(!bShowConsole)
00067 ShowConsole();
00068 return true;
00069 }
00070 break;
00071 }
00072
00073 return False;
00074 //!! because of ConsoleKey
00075 //!! return Super.KeyEvent(Key, Action, Delta);
00076 }
00077
00078 function ShowConsole()
00079 {
00080 bShowConsole = true;
00081 if(bCreatedRoot)
00082 ConsoleWindow.ShowWindow();
00083 }
00084
00085 function HideConsole()
00086 {
00087 ConsoleLines = 0;
00088 bShowConsole = false;
00089 if (ConsoleWindow != None)
00090 ConsoleWindow.HideWindow();
00091 }
00092
00093 event Tick( float Delta )
00094 {
00095 Super.Tick(Delta);
00096
00097 if(bLevelChange && Root != None && string(Viewport.Actor.Level) != OldLevel)
00098 {
00099 OldLevel = string(Viewport.Actor.Level);
00100 // if this is Entry, we could be falling through to another level...
00101 if(Viewport.Actor.Level != Viewport.Actor.GetEntryLevel())
00102 bLevelChange = False;
00103 Root.NotifyAfterLevelChange();
00104 }
00105 }
00106
00107 state UWindow
00108 {
00109 event Tick( float Delta )
00110 {
00111 Global.Tick(Delta);
00112 if(Root != None)
00113 Root.DoTick(Delta);
00114 }
00115
00116 event PostRender( canvas Canvas )
00117 {
00118 if( bTimeDemo )
00119 {
00120 TimeDemoCalc();
00121 TimeDemoRender( Canvas );
00122 }
00123
00124 if(Root != None)
00125 Root.bUWindowActive = True;
00126 RenderUWindow( Canvas );
00127 }
00128
00129 event bool KeyType( EInputKey Key )
00130 {
00131 if (Root != None)
00132 Root.WindowEvent(WM_KeyType, None, MouseX, MouseY, Key);
00133 return True;
00134 }
00135
00136 event bool KeyEvent( EInputKey Key, EInputAction Action, FLOAT Delta )
00137 {
00138 local byte k;
00139 k = Key;
00140
00141 switch (Action)
00142 {
00143 case IST_Release:
00144 switch (k)
00145 {
00146 case EInputKey.IK_LeftMouse:
00147 if(Root != None)
00148 Root.WindowEvent(WM_LMouseUp, None, MouseX, MouseY, k);
00149 break;
00150 case EInputKey.IK_RightMouse:
00151 if(Root != None)
00152 Root.WindowEvent(WM_RMouseUp, None, MouseX, MouseY, k);
00153 break;
00154 case EInputKey.IK_MiddleMouse:
00155 if(Root != None)
00156 Root.WindowEvent(WM_MMouseUp, None, MouseX, MouseY, k);
00157 break;
00158 default:
00159 if(Root != None)
00160 Root.WindowEvent(WM_KeyUp, None, MouseX, MouseY, k);
00161 break;
00162 }
00163 break;
00164
00165 case IST_Press:
00166 switch (k)
00167 {
00168 case EInputKey.IK_F9: // Screenshot
00169 return Global.KeyEvent(Key, Action, Delta);
00170 break;
00171 case ConsoleKey:
00172 if (bShowConsole)
00173 {
00174 HideConsole();
00175 if(bQuickKeyEnable)
00176 CloseUWindow();
00177 }
00178 else
00179 {
00180 if(Root.bAllowConsole)
00181 ShowConsole();
00182 else
00183 Root.WindowEvent(WM_KeyDown, None, MouseX, MouseY, k);
00184 }
00185 break;
00186 case EInputKey.IK_Escape:
00187 if(Root != None)
00188 Root.CloseActiveWindow();
00189 break;
00190 case EInputKey.IK_LeftMouse:
00191 if(Root != None)
00192 Root.WindowEvent(WM_LMouseDown, None, MouseX, MouseY, k);
00193 break;
00194 case EInputKey.IK_RightMouse:
00195 if(Root != None)
00196 Root.WindowEvent(WM_RMouseDown, None, MouseX, MouseY, k);
00197 break;
00198 case EInputKey.IK_MiddleMouse:
00199 if(Root != None)
00200 Root.WindowEvent(WM_MMouseDown, None, MouseX, MouseY, k);
00201 break;
00202 default:
00203 if(Root != None)
00204 Root.WindowEvent(WM_KeyDown, None, MouseX, MouseY, k);
00205 break;
00206 }
00207 break;
00208 case IST_Axis:
00209 switch (Key)
00210 {
00211 case IK_MouseX:
00212 MouseX = MouseX + (MouseScale * Delta);
00213 break;
00214 case IK_MouseY:
00215 MouseY = MouseY - (MouseScale * Delta);
00216 break;
00217 }
00218 default:
00219 break;
00220 }
00221
00222 return true;
00223 }
00224
00225 Begin:
00226 }
00227
00228 function ToggleUWindow()
00229 {
00230 }
00231
00232 function LaunchUWindow()
00233 {
00234 local int i;
00235
00236 Viewport.bSuspendPrecaching = True;
00237 bUWindowActive = !bQuickKeyEnable;
00238 Viewport.bShowWindowsMouse = True;
00239
00240 if(bQuickKeyEnable)
00241 bNoDrawWorld = False;
00242 else
00243 {
00244 if(Viewport.Actor.Level.NetMode == NM_Standalone)
00245 Viewport.Actor.SetPause( True );
00246 bNoDrawWorld = ShowDesktop;
00247 }
00248 if(Root != None)
00249 Root.bWindowVisible = True;
00250
00251 GotoState('UWindow');
00252 }
00253
00254 function CloseUWindow()
00255 {
00256 if(!bQuickKeyEnable)
00257 Viewport.Actor.SetPause( False );
00258
00259 bNoDrawWorld = False;
00260 bQuickKeyEnable = False;
00261 bUWindowActive = False;
00262 Viewport.bShowWindowsMouse = False;
00263
00264 if(Root != None)
00265 Root.bWindowVisible = False;
00266 GotoState('');
00267 Viewport.bSuspendPrecaching = False;
00268 }
00269
00270 function CreateRootWindow(Canvas Canvas)
00271 {
00272 local int i;
00273
00274 if(Canvas != None)
00275 {
00276 OldClipX = Canvas.ClipX;
00277 OldClipY = Canvas.ClipY;
00278 }
00279 else
00280 {
00281 OldClipX = 0;
00282 OldClipY = 0;
00283 }
00284
00285 Log("Creating root window: "$RootWindow);
00286
00287 Root = New(None) class<UWindowRootWindow>(DynamicLoadObject(RootWindow, class'Class'));
00288
00289 Root.BeginPlay();
00290 Root.WinTop = 0;
00291 Root.WinLeft = 0;
00292
00293 if(Canvas != None)
00294 {
00295 Root.WinWidth = Canvas.ClipX / Root.GUIScale;
00296 Root.WinHeight = Canvas.ClipY / Root.GUIScale;
00297 Root.RealWidth = Canvas.ClipX;
00298 Root.RealHeight = Canvas.ClipY;
00299 }
00300 else
00301 {
00302 Root.WinWidth = 0;
00303 Root.WinHeight = 0;
00304 Root.RealWidth = 0;
00305 Root.RealHeight = 0;
00306 }
00307
00308 Root.ClippingRegion.X = 0;
00309 Root.ClippingRegion.Y = 0;
00310 Root.ClippingRegion.W = Root.WinWidth;
00311 Root.ClippingRegion.H = Root.WinHeight;
00312
00313 Root.Console = Self;
00314
00315 Root.bUWindowActive = bUWindowActive;
00316
00317 Root.Created();
00318 bCreatedRoot = True;
00319
00320 // Create the console window.
00321 ConsoleWindow = UWindowConsoleWindow(Root.CreateWindow(ConsoleClass, 100, 100, 200, 200));
00322 if(!bShowConsole)
00323 HideConsole();
00324
00325 UWindowConsoleClientWindow(ConsoleWindow.ClientArea).TextArea.AddText(" ");
00326 for (I=0; I<4; I++)
00327 UWindowConsoleClientWindow(ConsoleWindow.ClientArea).TextArea.AddText(MsgText[I]);
00328 }
00329
00330 function RenderUWindow( canvas Canvas )
00331 {
00332 local UWindowWindow NewFocusWindow;
00333
00334 Canvas.bNoSmooth = True;
00335 Canvas.Z = 1;
00336 Canvas.Style = 1;
00337 Canvas.DrawColor.r = 255;
00338 Canvas.DrawColor.g = 255;
00339 Canvas.DrawColor.b = 255;
00340
00341 if(Viewport.bWindowsMouseAvailable && Root != None)
00342 {
00343 MouseX = Viewport.WindowsMouseX/Root.GUIScale;
00344 MouseY = Viewport.WindowsMouseY/Root.GUIScale;
00345 }
00346
00347 if(!bCreatedRoot)
00348 CreateRootWindow(Canvas);
00349
00350 Root.bWindowVisible = True;
00351 Root.bUWindowActive = bUWindowActive;
00352 Root.bQuickKeyEnable = bQuickKeyEnable;
00353
00354 if(Canvas.ClipX != OldClipX || Canvas.ClipY != OldClipY)
00355 {
00356 OldClipX = Canvas.ClipX;
00357 OldClipY = Canvas.ClipY;
00358
00359 Root.WinTop = 0;
00360 Root.WinLeft = 0;
00361 Root.WinWidth = Canvas.ClipX / Root.GUIScale;
00362 Root.WinHeight = Canvas.ClipY / Root.GUIScale;
00363
00364 Root.RealWidth = Canvas.ClipX;
00365 Root.RealHeight = Canvas.ClipY;
00366
00367 Root.ClippingRegion.X = 0;
00368 Root.ClippingRegion.Y = 0;
00369 Root.ClippingRegion.W = Root.WinWidth;
00370 Root.ClippingRegion.H = Root.WinHeight;
00371
00372 Root.Resized();
00373 }
00374
00375 if(MouseX > Root.WinWidth) MouseX = Root.WinWidth;
00376 if(MouseY > Root.WinHeight) MouseY = Root.WinHeight;
00377 if(MouseX < 0) MouseX = 0;
00378 if(MouseY < 0) MouseY = 0;
00379
00380
00381 // Check for keyboard focus
00382 NewFocusWindow = Root.CheckKeyFocusWindow();
00383
00384 if(NewFocusWindow != Root.KeyFocusWindow)
00385 {
00386 Root.KeyFocusWindow.KeyFocusExit();
00387 Root.KeyFocusWindow = NewFocusWindow;
00388 Root.KeyFocusWindow.KeyFocusEnter();
00389 }
00390
00391
00392 Root.MoveMouse(MouseX, MouseY);
00393 Root.WindowEvent(WM_Paint, Canvas, MouseX, MouseY, 0);
00394 if(bUWindowActive || bQuickKeyEnable)
00395 Root.DrawMouse(Canvas);
00396 }
00397
00398 event Message( PlayerReplicationInfo PRI, coerce string Msg, name N )
00399 {
00400 local string OutText;
00401
00402 Super.Message( PRI, Msg, N );
00403
00404 if ( Viewport.Actor == None )
00405 return;
00406
00407 if( Msg!="" )
00408 {
00409 if (( MsgType[TopLine] == 'Say' ) || ( MsgType[TopLine] == 'TeamSay' ))
00410 OutText = MsgPlayer[TopLine].PlayerName$": "$MsgText[TopLine];
00411 else
00412 OutText = MsgText[TopLine];
00413 if (ConsoleWindow != None)
00414 UWindowConsoleClientWindow(ConsoleWindow.ClientArea).TextArea.AddText(OutText);
00415 }
00416 }
00417
00418 event AddString( coerce string Msg )
00419 {
00420 Super.AddString( Msg );
00421
00422 if( Msg!="" )
00423 {
00424 if (ConsoleWindow != None)
00425 UWindowConsoleClientWindow(ConsoleWindow.ClientArea).TextArea.AddText(Msg);
00426 }
00427 }
00428
00429 function UpdateHistory()
00430 {
00431 // Update history buffer.
00432 History[HistoryCur++ % MaxHistory] = TypedStr;
00433 if( HistoryCur > HistoryBot )
00434 HistoryBot++;
00435 if( HistoryCur - HistoryTop >= MaxHistory )
00436 HistoryTop = HistoryCur - MaxHistory + 1;
00437 }
00438
00439 function HistoryUp()
00440 {
00441 if( HistoryCur > HistoryTop )
00442 {
00443 History[HistoryCur % MaxHistory] = TypedStr;
00444 TypedStr = History[--HistoryCur % MaxHistory];
00445 }
00446 }
00447
00448 function HistoryDown()
00449 {
00450 History[HistoryCur % MaxHistory] = TypedStr;
00451 if( HistoryCur < HistoryBot )
00452 TypedStr = History[++HistoryCur % MaxHistory];
00453 else
00454 TypedStr="";
00455 }
00456
00457 function NotifyLevelChange()
00458 {
00459 Super.NotifyLevelChange();
00460 bLevelChange = True;
00461 if(Root != None)
00462 Root.NotifyBeforeLevelChange();
00463 }
00464
00465 defaultproperties
00466 {
00467 RootWindow="UWindow.UWindowRootWindow"
00468 ConsoleClass=Class'UWindow.UWindowConsoleWindow'
00469 MouseScale=0.600000
00470 ConsoleKey=192
00471 }
|