From ffacf8e8e266263679dfcba525dbcd2c65a54ad2 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Tue, 13 Sep 2016 18:35:27 +1000 Subject: [PATCH] Launcher: Start work on nicer text input widgets. --- Launcher2/Gui/Screens/DirectConnectScreen.cs | 2 +- Launcher2/Gui/Screens/LauncherInputScreen.cs | 2 +- .../Gui/Screens/MainScreen.Classicube.cs | 2 +- Launcher2/Gui/Screens/UpdatesScreen.cs | 6 +-- Launcher2/Gui/Views/IView.cs | 4 +- Launcher2/Gui/Views/ResourcesView.cs | 2 +- Launcher2/Gui/Views/ServersView.cs | 10 ++--- Launcher2/Gui/Widgets/LauncherButtonWidget.cs | 1 + Launcher2/Gui/Widgets/LauncherInputWidget.cs | 40 ++++++++++++++----- Launcher2/LauncherWindow.Background.cs | 12 +++--- Launcher2/LauncherWindow.cs | 4 ++ 11 files changed, 57 insertions(+), 28 deletions(-) diff --git a/Launcher2/Gui/Screens/DirectConnectScreen.cs b/Launcher2/Gui/Screens/DirectConnectScreen.cs index 4d6ed78f9..aa9a2e853 100644 --- a/Launcher2/Gui/Screens/DirectConnectScreen.cs +++ b/Launcher2/Gui/Screens/DirectConnectScreen.cs @@ -43,7 +43,7 @@ namespace Launcher.Gui.Screens { void SetStatus( string text ) { LauncherLabelWidget widget = (LauncherLabelWidget)widgets[5]; - game.ClearArea( widget.X, widget.Y, widget.Width, widget.Height ); + game.ResetArea( widget.X, widget.Y, widget.Width, widget.Height ); widget.SetDrawData( drawer, text, inputFont, Anchor.Centre, Anchor.Centre, 0, 100 ); RedrawWidget( widget ); } diff --git a/Launcher2/Gui/Screens/LauncherInputScreen.cs b/Launcher2/Gui/Screens/LauncherInputScreen.cs index 7a24ee2eb..c6f481207 100644 --- a/Launcher2/Gui/Screens/LauncherInputScreen.cs +++ b/Launcher2/Gui/Screens/LauncherInputScreen.cs @@ -114,7 +114,7 @@ namespace Launcher.Gui.Screens { protected virtual void RedrawLastInput() { if( curInput.Width > curInput.ButtonWidth ) - game.ClearArea( curInput.X, curInput.Y, curInput.Width, curInput.Height ); + game.ResetArea( curInput.X, curInput.Y, curInput.Width, curInput.Height ); using( drawer ) { drawer.SetBitmap( game.Framebuffer ); diff --git a/Launcher2/Gui/Screens/MainScreen.Classicube.cs b/Launcher2/Gui/Screens/MainScreen.Classicube.cs index f75a478ad..92a48b5ce 100644 --- a/Launcher2/Gui/Screens/MainScreen.Classicube.cs +++ b/Launcher2/Gui/Screens/MainScreen.Classicube.cs @@ -43,7 +43,7 @@ namespace Launcher.Gui.Screens { lastStatus = text; LauncherLabelWidget widget = (LauncherLabelWidget)widgets[3]; - game.ClearArea( widget.X, widget.Y, widget.Width, widget.Height ); + game.ResetArea( widget.X, widget.Y, widget.Width, widget.Height ); widget.SetDrawData( drawer, text, inputFont, Anchor.Centre, Anchor.Centre, 0, 20 ); RedrawWidget( widget ); game.Dirty = true; diff --git a/Launcher2/Gui/Screens/UpdatesScreen.cs b/Launcher2/Gui/Screens/UpdatesScreen.cs index b0ac0c137..6f1836600 100644 --- a/Launcher2/Gui/Screens/UpdatesScreen.cs +++ b/Launcher2/Gui/Screens/UpdatesScreen.cs @@ -75,9 +75,9 @@ namespace Launcher.Gui.Screens { task.Exception = null; LauncherWidget w = widgets[view.devIndex - 1]; - game.ClearArea( w.X, w.Y, w.Width, w.Height ); + game.ResetArea( w.X, w.Y, w.Width, w.Height ); w = widgets[view.relIndex - 1]; - game.ClearArea( w.X, w.Y, w.Width, w.Height ); + game.ResetArea( w.X, w.Y, w.Width, w.Height ); game.RedrawBackground(); Resize(); } @@ -107,7 +107,7 @@ namespace Launcher.Gui.Screens { view.gameOpen = CheckClientInstances(); view.SetWarning(); LauncherWidget widget = widgets[view.statusIndex]; - game.ClearArea( widget.X, widget.Y, widget.Width, widget.Height ); + game.ResetArea( widget.X, widget.Y, widget.Width, widget.Height ); RedrawWidget( widgets[view.statusIndex] ); if( view.gameOpen ) return; diff --git a/Launcher2/Gui/Views/IView.cs b/Launcher2/Gui/Views/IView.cs index 59dc2c16c..12a3152c5 100644 --- a/Launcher2/Gui/Views/IView.cs +++ b/Launcher2/Gui/Views/IView.cs @@ -41,12 +41,12 @@ namespace Launcher.Gui.Views { } if( buttons == 0 ) return; - using( FastBitmap dst = new FastBitmap( game.Framebuffer, true, false ) ) { + using( FastBitmap bmp = game.LockBits() ) { for( int i = 0; i < widgets.Length; i++ ) { if( widgets[i] == null ) continue; LauncherButtonWidget button = widgets[i] as LauncherButtonWidget; if( button != null ) - button.RedrawBackground( dst ); + button.RedrawBackground( bmp ); } } } diff --git a/Launcher2/Gui/Views/ResourcesView.cs b/Launcher2/Gui/Views/ResourcesView.cs index d605f3395..23981a321 100644 --- a/Launcher2/Gui/Views/ResourcesView.cs +++ b/Launcher2/Gui/Views/ResourcesView.cs @@ -20,7 +20,7 @@ namespace Launcher.Gui.Views { const int boxWidth = 190 * 2, boxHeight = 70 * 2; public override void DrawAll() { - using( FastBitmap bmp = new FastBitmap( game.Framebuffer, true, false ) ) { + using( FastBitmap bmp = game.LockBits() ) { drawer.SetBitmap( game.Framebuffer ); Rectangle r = new Rectangle( 0, 0, bmp.Width, bmp.Height ); Drawer2DExt.Clear( bmp, r, clearCol ); diff --git a/Launcher2/Gui/Views/ServersView.cs b/Launcher2/Gui/Views/ServersView.cs index e4b3dff0c..66a512c8a 100644 --- a/Launcher2/Gui/Views/ServersView.cs +++ b/Launcher2/Gui/Views/ServersView.cs @@ -59,9 +59,9 @@ namespace Launcher.Gui.Views { } void DrawBackground() { - using( FastBitmap dst = new FastBitmap( game.Framebuffer, true, false ) ) { - game.ClearArea( 0, 0, game.Width, tableY, dst ); - DrawTableBackground( dst ); + using( FastBitmap bmp = game.LockBits() ) { + game.ResetArea( 0, 0, game.Width, tableY, bmp ); + DrawTableBackground( bmp ); } } @@ -73,7 +73,7 @@ namespace Launcher.Gui.Views { FastColour col = LauncherTableView.backGridCol; Drawer2DExt.Clear( dst, rec, col ); } else { - game.ClearArea( rec.X, rec.Y, rec.Width, rec.Height, dst ); + game.ResetArea( rec.X, rec.Y, rec.Width, rec.Height, dst ); } } @@ -101,7 +101,7 @@ namespace Launcher.Gui.Views { } internal void RedrawTable() { - using( FastBitmap dst = new FastBitmap( game.Framebuffer, true, false ) ) + using( FastBitmap dst = game.LockBits() ) DrawTableBackground( dst ); LauncherTableWidget table = (LauncherTableWidget)widgets[tableIndex]; table.ClampIndex(); diff --git a/Launcher2/Gui/Widgets/LauncherButtonWidget.cs b/Launcher2/Gui/Widgets/LauncherButtonWidget.cs index 586e6c9ed..6ce9a8a0d 100644 --- a/Launcher2/Gui/Widgets/LauncherButtonWidget.cs +++ b/Launcher2/Gui/Widgets/LauncherButtonWidget.cs @@ -78,6 +78,7 @@ namespace Launcher.Gui.Widgets { FastColour foreCol = Active ? LauncherSkin.ButtonForeActiveCol : LauncherSkin.ButtonForeCol; FastColour top = Expand( foreCol, 8 ), bottom = Expand( foreCol, -8 ); Gradient.Vertical( dst, rect, top, bottom ); + } } diff --git a/Launcher2/Gui/Widgets/LauncherInputWidget.cs b/Launcher2/Gui/Widgets/LauncherInputWidget.cs index ae28c3fec..19be2ee2b 100644 --- a/Launcher2/Gui/Widgets/LauncherInputWidget.cs +++ b/Launcher2/Gui/Widgets/LauncherInputWidget.cs @@ -59,21 +59,43 @@ namespace Launcher.Gui.Widgets { public override void Redraw( IDrawer2D drawer ) { string text = Text; if( Password ) text = new String( '*', text.Length ); - DrawTextArgs args = new DrawTextArgs( text, font, true ); + DrawTextArgs args = new DrawTextArgs( "&0" + text, font, false ); Size size = drawer.MeasureSize( ref args ); Width = Math.Max( ButtonWidth, size.Width + 15 ); - textHeight = size.Height; - args.SkipPartsCheck = true; + textHeight = size.Height; + args.SkipPartsCheck = true; if( Window.Minimised ) return; - FastColour col = Active ? new FastColour( 240, 240, 240 ) : new FastColour( 180, 180, 180 ); - drawer.Clear( col, X + 1, Y, Width - 2, 2 ); - drawer.Clear( col, X + 1, Y + Height - 2, Width - 2, 2 ); - drawer.Clear( col, X, Y + 1, 2, Height - 2 ); - drawer.Clear( col, X + Width - 2, Y + 1, 2, Height - 2 ); - drawer.Clear( FastColour.Black, X + 2, Y + 2, Width - 4, Height - 4 ); + DrawBorders( drawer ); + DrawText( drawer, args ); + } + + static FastColour borderIn = new FastColour( 165, 142, 168 ); + static FastColour borderOut = new FastColour( 97, 81, 110 ); + const int border = 1; + + void DrawBorders( IDrawer2D drawer ) { + FastColour col = borderOut; + if( Active ) { + drawer.Clear( col, X, Y, Width, border ); + drawer.Clear( col, X, Y + Height - border, Width, border ); + drawer.Clear( col, X, Y, border, Height ); + drawer.Clear( col, X + Width - border, Y, border, Height ); + } else { + //Window.ResetArea( X, Y, Width, + } + col = borderIn; + drawer.Clear( col, X + border, Y + border, Width - border * 2, border ); + drawer.Clear( col, X + border, Y + Height - border * 2, Width - border * 2, border ); + drawer.Clear( col, X + border, Y + border, border, Height - border * 2 ); + drawer.Clear( col, X + Width - border * 2, Y + border, border, Height - border * 2 ); + + drawer.Clear( FastColour.White, X + 2, Y + 2, Width - 4, Height - 4 ); + } + + void DrawText( IDrawer2D drawer, DrawTextArgs args ) { if( Text.Length != 0 || HintText == null ) { int y = Y + 2 + (Height - textHeight) / 2; drawer.DrawText( ref args, X + 5, y ); diff --git a/Launcher2/LauncherWindow.Background.cs b/Launcher2/LauncherWindow.Background.cs index 939f63e81..2933a75c5 100644 --- a/Launcher2/LauncherWindow.Background.cs +++ b/Launcher2/LauncherWindow.Background.cs @@ -97,7 +97,7 @@ namespace Launcher { ClearTile( 0, 48, Width, Height - 48, 0, dst ); } } else { - ClearArea( 0, 0, Width, Height ); + ResetArea( 0, 0, Width, Height ); } DrawTitle(); @@ -121,12 +121,14 @@ namespace Launcher { } } - public void ClearArea( int x, int y, int width, int height ) { - using( FastBitmap dst = new FastBitmap( Framebuffer, true, false ) ) - ClearArea( x, y, width, height, dst ); + /// Redraws the specified region with the background pixels. + public void ResetArea( int x, int y, int width, int height ) { + using( FastBitmap dst = LockBits() ) + ResetArea( x, y, width, height, dst ); } - public void ClearArea( int x, int y, int width, int height, FastBitmap dst ) { + /// Redraws the specified region with the background pixels. + public void ResetArea( int x, int y, int width, int height, FastBitmap dst ) { if( ClassicBackground && terrainPixels != null ) { ClearTile( x, y, width, height, 0, dst ); } else { diff --git a/Launcher2/LauncherWindow.cs b/Launcher2/LauncherWindow.cs index df2cce517..a6e3edd2d 100644 --- a/Launcher2/LauncherWindow.cs +++ b/Launcher2/LauncherWindow.cs @@ -234,5 +234,9 @@ namespace Launcher { if( !OpenTK.Configuration.RunningOnMacOS ) return false; return key == Key.Q && (lastKey == Key.WinLeft || lastKey == Key.WinRight); } + + public FastBitmap LockBits() { + return new FastBitmap( Framebuffer, true, false ); + } } }