From 5bf0ebf274fef28811ab952338bd261bd1dd0fa8 Mon Sep 17 00:00:00 2001
From: b1indy <b1indy@b956fd51-792f-4845-bead-9b4dfca2ff2c>
Date: Thu, 3 May 2007 00:19:52 +0000
Subject: added "popups" to ask for confirmation when leaving party mode or
 game or to display messages (like minor errors) still ugly, needs some theme
 work

git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@157 b956fd51-792f-4845-bead-9b4dfca2ff2c
---
 Game/Code/Classes/UGraphic.pas             |  11 +-
 Game/Code/Classes/UMain.pas                |   9 +-
 Game/Code/Classes/UThemes.pas              |  28 ++++
 Game/Code/Menu/UDisplay.pas                |  40 +++++-
 Game/Code/Menu/UMenu.pas                   |  19 ++-
 Game/Code/Screens/UScreenMain.pas          |  10 +-
 Game/Code/Screens/UScreenPartyNewRound.pas |   2 +-
 Game/Code/Screens/UScreenPopup.pas         | 204 ++++++++++++++++++++++++-----
 Game/Code/UltraStar.dpr                    |   3 +-
 Languages/English.ini                      |   6 +-
 Languages/readme.txt                       |   7 +-
 Themes/Deluxe.ini                          | 163 ++++++++++++++++++++++-
 12 files changed, 449 insertions(+), 53 deletions(-)

diff --git a/Game/Code/Classes/UGraphic.pas b/Game/Code/Classes/UGraphic.pas
index 39eea53d..8b17a73d 100644
--- a/Game/Code/Classes/UGraphic.pas
+++ b/Game/Code/Classes/UGraphic.pas
@@ -9,7 +9,8 @@ uses
   UScreenEdit, UScreenEditConvert, UScreenEditHeader, UScreenOpen, UThemes, USkins, UScreenSongMenu, UScreenSongJumpto,
   {Party Screens} UScreenSingModi, UScreenPartyNewRound, UScreenPartyScore, UScreenPartyOptions, UScreenPartyWin, UScreenPartyPlayer,
   {Stats Screens} UScreenStatMain, UScreenStatDetail,
-  {CreditsScreen} UScreenCredits;
+  {CreditsScreen} UScreenCredits,
+  {Popup for errors, etc.} UScreenPopup;
 
 type
   TRecR = record
@@ -71,6 +72,10 @@ var
   //CreditsScreen
   ScreenCredits: TScreenCredits;
 
+  //popup mod
+  ScreenPopupCheck: TScreenPopupCheck;
+  ScreenPopupError: TScreenPopupError;
+
   //Notes
   Tex_Left:       array[0..6] of TTexture;
   Tex_Mid:        array[0..6] of TTexture;
@@ -433,6 +438,10 @@ begin
   Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen SongMenu', 3); Log.BenchmarkStart(3);
   ScreenSongJumpto :=         TScreenSongJumpto.Create;
   Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen SongJumpto', 3); Log.BenchmarkStart(3);
+  ScreenPopupCheck := TScreenPopupCheck.Create;
+  Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Popup (Check)', 3); Log.BenchmarkStart(3);
+  ScreenPopupError := TScreenPopupError.Create;
+  Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Popup (Error)', 3); Log.BenchmarkStart(3);
   ScreenPartyNewRound :=    TScreenPartyNewRound.Create;
   Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen PartyNewRound', 3); Log.BenchmarkStart(3);
   ScreenPartyScore :=       TScreenPartyScore.Create;
diff --git a/Game/Code/Classes/UMain.pas b/Game/Code/Classes/UMain.pas
index c9002a36..69eca419 100644
--- a/Game/Code/Classes/UMain.pas
+++ b/Game/Code/Classes/UMain.pas
@@ -2,7 +2,7 @@ unit UMain;
 
 interface
 uses SDL, UGraphic, UMusic, URecord, UTime, SysUtils, UDisplay, UIni, ULog, ULyrics, UScreenSing,
-  OpenGL12, zlportio {you can disable it and all PortWriteB calls}, ULCD, ULight, UThemes;
+  OpenGL12, zlportio {you can disable it and all PortWriteB calls}, ULCD, ULight, UThemes{, UScreenPopup};
 
 type
   TPlayer = record
@@ -112,7 +112,7 @@ begin
     CheckEvents;
 
     // display
-    Display.Draw;
+    done:=not Display.Draw;
     SwapBuffers;
 
     // light
@@ -156,6 +156,11 @@ Begin
         End; // With}
       SDL_KEYDOWN:
         begin
+          // popup hack... if there is a visible popup then let it handle input instead of underlying screen
+          // shoud be done in a way to be sure the topmost popup has preference (maybe error, then check)
+          if ScreenPopupError <> NIL then if ScreenPopupError.Visible then ScreenPopupError.ParseInput(Event.key.keysym.sym, Event.key.keysym.unicode, True) else
+          if ScreenPopupCheck <> NIL then if ScreenPopupCheck.Visible then ScreenPopupCheck.ParseInput(Event.key.keysym.sym, Event.key.keysym.unicode, True) else
+          // end of popup hack
           if (Not Display.ActualScreen^.ParseInput(Event.key.keysym.sym, Event.key.keysym.unicode, True)) then
 //        if (Not Display.ActualScreen^.ParseInput(Event.key.keysym.scancode, True)) then
             done := true; // exit game
diff --git a/Game/Code/Classes/UThemes.pas b/Game/Code/Classes/UThemes.pas
index 6004502e..ee88ca9c 100644
--- a/Game/Code/Classes/UThemes.pas
+++ b/Game/Code/Classes/UThemes.pas
@@ -460,6 +460,19 @@ type
     ButtonExit:           TThemeButton;
   end;
 
+  //Error- and Check-Popup
+  TThemeError = class(TThemeBasic)
+    Button1: TThemeButton;
+    TextError: TThemeText;
+  end;
+
+  TThemeCheck = class(TThemeBasic)
+    Button1: TThemeButton;
+    Button2: TThemeButton;
+    TextCheck: TThemeText;
+  end;
+
+
   //ScreenSong Menue
   TThemeSongMenu = class(TThemeBasic)
     Button1: TThemeButton;
@@ -656,6 +669,9 @@ type
     OptionsThemes:    TThemeOptionsThemes;
     OptionsRecord:    TThemeOptionsRecord;
     OptionsAdvanced:  TThemeOptionsAdvanced;
+    //error and check popup
+    ErrorPopup:       TThemeError;
+    CheckPopup:       TThemeCheck;
     //ScreenSong extensions
     SongMenu:         TThemeSongMenu;
     SongJumpto:       TThemeSongJumpTo;
@@ -750,6 +766,9 @@ begin
   OptionsRecord := TThemeOptionsRecord.Create;
   OptionsAdvanced := TThemeOptionsAdvanced.Create;
 
+  ErrorPopup := TThemeError.Create;
+  CheckPopup := TThemeCheck.Create;
+
   SongMenu := TThemeSongMenu.Create;
   SongJumpto := TThemeSongJumpto.Create;
   //Party Screens
@@ -1157,6 +1176,15 @@ begin
       ThemeLoadSelect       (OptionsAdvanced.SelectAskbeforeDel, 'OptionsAdvancedSelectAskbeforeDel');
       ThemeLoadButton       (OptionsAdvanced.ButtonExit, 'OptionsAdvancedButtonExit');
 
+      //error and check popup
+      ThemeLoadBasic (ErrorPopup, 'ErrorPopup');
+      ThemeLoadButton(ErrorPopup.Button1, 'ErrorPopupButton1');
+      ThemeLoadText  (ErrorPopup.TextError,'ErrorPopupText');
+      ThemeLoadBasic (CheckPopup, 'CheckPopup');
+      ThemeLoadButton(CheckPopup.Button1, 'CheckPopupButton1');
+      ThemeLoadButton(CheckPopup.Button2, 'CheckPopupButton2');
+      ThemeLoadText(CheckPopup.TextCheck , 'CheckPopupText');
+
       //Song Menu
       ThemeLoadBasic (SongMenu, 'SongMenu');
       ThemeLoadButton(SongMenu.Button1, 'SongMenuButton1');
diff --git a/Game/Code/Menu/UDisplay.pas b/Game/Code/Menu/UDisplay.pas
index 19266414..428cc6c7 100644
--- a/Game/Code/Menu/UDisplay.pas
+++ b/Game/Code/Menu/UDisplay.pas
@@ -2,12 +2,15 @@ unit UDisplay;
 
 interface
 
-uses Windows, SDL, UMenu, OpenGL12, SysUtils, dialogs;
+uses Windows, SDL, UMenu, OpenGL12, SysUtils;
 
 type
   TDisplay = class
     ActualScreen:     PMenu;
     NextScreen:       PMenu;
+    //popup hack
+    NextScreenWithCheck: Pmenu;
+    CheckOK: Boolean;
 
     h_DC:     HDC;
     h_RC:     HGLRC;
@@ -45,6 +48,11 @@ var i: integer;
 begin
   inherited Create;
 
+  //popup hack
+  CheckOK:=False;
+  NextScreen:=NIL;
+  NextScreenWithCheck:=NIL;
+
   // fade mod
   myfade:=0;
 
@@ -75,10 +83,6 @@ begin
     canFade:=False;
   end;
   FreeMem(pTexData);
-  if not canFade then begin
-    showmessage('Fehler beim Initialisieren der Fading-Textur... Fading deaktiviert');
-    doFade:=False;
-  end
   // end
 end;
 
@@ -120,9 +124,26 @@ begin
     if S = 2 then TimeSkip := 0 else;
     glViewPort((S-1) * ScreenW div Screens, 0, ScreenW div Screens, ScreenH);
 
+    //popup hack
+    // check was successful... move on
+    if CheckOK then
+      if assigned (NextScreenWithCheck)then
+      begin
+        NextScreen:=NextScreenWithCheck;
+        NextScreenWithCheck := NIL;
+        CheckOk:=False;
+      end
+    else
+      Result:=False;
+    //end popup hack
+
 //    ActualScreen.SetAnimationProgress(1);
     if not assigned (NextScreen) then begin
-      Result := ActualScreen.Draw;
+      ActualScreen.Draw;
+      //popup mod
+      if ScreenPopupError <> NIL then if ScreenPopupError.Visible then ScreenPopupError.Draw else
+      if ScreenPopupCheck <> NIL then if ScreenPopupCheck.Visible then ScreenPopupCheck.Draw;
+      //popup end
       // fade mod
       myfade:=0;
       if (Ini.ScreenFade=1) and canFade then
@@ -133,6 +154,11 @@ begin
     end
     else
     begin
+      // check if we had an initialization error (canfade=false, dofade=true)
+      if doFade and not canFade then begin
+        doFade:=False; //disable fading
+        ScreenPopupError.ShowPopup(['Error initializing','fade texture','','fading','disabled']); //show error message
+      end;
       if doFade and canFade then
       begin
         // fade mod
@@ -146,7 +172,7 @@ begin
           if glGetError <> GL_NO_ERROR then
           begin
             canFade := False;
-            showmessage('Fehler beim Kopieren der Fade-Textur... Fading deaktiviert');
+            ScreenPopupError.ShowPopup(['Error copying','fade texture','','fading','disabled']); //show error message
           end;
           glViewPort((S-1) * ScreenW div Screens, 0, ScreenW div Screens, ScreenH);
           NextScreen.onShow;
diff --git a/Game/Code/Menu/UMenu.pas b/Game/Code/Menu/UMenu.pas
index 4ad8270a..c9d3c726 100644
--- a/Game/Code/Menu/UMenu.pas
+++ b/Game/Code/Menu/UMenu.pas
@@ -12,7 +12,7 @@ type
   TMenu = class
     protected
       ButtonPos:      Integer;
-      
+
       Interactions:   array of TInteract;
       SelInteraction: integer;
       Button:         array of TButton;
@@ -29,7 +29,7 @@ type
       mY:         integer; // mouse Y
 
       Fade:       integer; // fade type
-      ShowFinish: boolean; // true if there is no fade 
+      ShowFinish: boolean; // true if there is no fade
 
 
       destructor Destroy; override;
@@ -47,7 +47,7 @@ type
 
       procedure PrepareButtonCollections(const Collections: AThemeButtonCollection);
       procedure AddButtonCollection(const ThemeCollection: TThemeButtonCollection; Const Num: Byte);
-      
+
       // background
       procedure AddBackground(Name: string);
 
@@ -68,7 +68,7 @@ type
       function AddText(X, Y, W: real; Style: integer; Size, ColR, ColG, ColB: real; Align: integer; Tekst: string): integer; overload;
 
       // button
-      Procedure SetButtonLength(Length: Cardinal); //Function that Set Length of Button Array in one Step instead of register new Memory for every Button 
+      Procedure SetButtonLength(Length: Cardinal); //Function that Set Length of Button Array in one Step instead of register new Memory for every Button
       function AddButton(ThemeButton: TThemeButton): integer; overload;
       function AddButton(X, Y, W, H: real; Name: String): integer; overload;
       function AddButton(X, Y, W, H: real; Name, Format, Typ: String; Reflection: Boolean): integer; overload;
@@ -107,6 +107,8 @@ type
 //      function AddWidget(X, Y : UInt16; WidgetSrc : PSDL_Surface): Int16;
 //      procedure ClearWidgets(MinNumber : Int16);
       procedure FadeTo(Screen: PMenu);
+      //popup hack
+      procedure CheckFadeTo(Screen: PMenu; msg: String);
 
       function DrawBG: boolean; virtual;
       function DrawFG: boolean; virtual;
@@ -873,6 +875,15 @@ begin
   Display.NextScreen := Screen;
 end;
 
+//popup hack
+procedure TMenu.CheckFadeTo(Screen: PMenu; msg: String);
+begin
+  Display.Fade := 0;
+  Display.NextScreenWithCheck := Screen;
+  Display.CheckOK:=False;
+  ScreenPopupCheck.ShowPopup(msg);
+end;
+
 procedure TMenu.AddButtonText(AddX, AddY: real; AddText: string);
 begin
   AddButtonText(AddX, AddY, 1, 1, 1, AddText);
diff --git a/Game/Code/Screens/UScreenMain.pas b/Game/Code/Screens/UScreenMain.pas
index 78c98218..f339fa04 100644
--- a/Game/Code/Screens/UScreenMain.pas
+++ b/Game/Code/Screens/UScreenMain.pas
@@ -55,7 +55,9 @@ begin
 
       SDLK_ESCAPE :
         begin
-          Result := False;
+          //popup hack
+          CheckFadeTo(NIL,'MSG_QUIT_USDX');
+//          Result := False;
         end;
 
       SDLK_C:
@@ -116,7 +118,7 @@ begin
             Music.PlayStart;
             FadeTo(@ScreenStatMain);
           end;
-          
+
           //Editor
           if Interaction = 3 then begin
             Music.PlayStart;
@@ -131,7 +133,9 @@ begin
 
           //Exit
           if Interaction = 5 then begin
-            Result := false;
+            //popup hack
+            CheckFadeTo(NIL,'MSG_QUIT_USDX');
+//            Result := false;
           end;
         end;
       // Up and Down could be done at the same time,
diff --git a/Game/Code/Screens/UScreenPartyNewRound.pas b/Game/Code/Screens/UScreenPartyNewRound.pas
index 22f76218..894e96d2 100644
--- a/Game/Code/Screens/UScreenPartyNewRound.pas
+++ b/Game/Code/Screens/UScreenPartyNewRound.pas
@@ -86,7 +86,7 @@ begin
       SDLK_ESCAPE :
         begin
           Music.PlayBack;
-          FadeTo(@ScreenMain);
+          CheckFadeTo(@ScreenMain,'MSG_END_PARTY');
         end;
 
       SDLK_RETURN:
diff --git a/Game/Code/Screens/UScreenPopup.pas b/Game/Code/Screens/UScreenPopup.pas
index 41279197..25f647a2 100644
--- a/Game/Code/Screens/UScreenPopup.pas
+++ b/Game/Code/Screens/UScreenPopup.pas
@@ -3,10 +3,10 @@ unit UScreenPopup;
 interface
 
 uses
-  UMenu, SDL, UMusic, UPliki, SysUtils, UThemes, dialogs, Messages;
+  UMenu, SDL, UMusic, UPliki, SysUtils, UThemes;
 
 type
-  TScreenPopup = class(TMenu)
+  TScreenPopupCheck = class(TMenu)
     private
       CurMenu: Byte; //Num of the cur. Shown Menu
     public
@@ -15,24 +15,35 @@ type
       constructor Create; override;
       function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
       procedure onShow; override;
-      procedure ShowPopup(sPopup: Byte);
+      procedure ShowPopup(msg: String);
       function Draw: boolean; override;
   end;
 
-const
-  PU_Error = 1;
+type
+  TScreenPopupError = class(TMenu)
+    private
+      CurMenu: Byte; //Num of the cur. Shown Menu
+    public
+      Visible: Boolean; //Whether the Menu should be Drawn
 
+      constructor Create; override;
+      function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+      procedure onShow; override;
+      procedure onHide; override;
+      procedure ShowPopup(msg: array of String);
+      function Draw: boolean; override;
+  end;
 
 var
-  ISelections: Array of String;
+//  ISelections: Array of String;
   SelectValue: Integer;
 
 
 implementation
 
-uses UGraphic, UMain, UIni, UTexture, ULanguage, UParty, UPlaylist;
+uses UGraphic, UMain, UIni, UTexture, ULanguage, UParty, UPlaylist, UDisplay;
 
-function TScreenPopup.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+function TScreenPopupCheck.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
   function IsVisible: Boolean;
   begin
     Result := True;
@@ -81,6 +92,15 @@ begin
 
       SDLK_RETURN:
         begin
+          case Interaction of
+          0: begin
+               Display.CheckOK:=True;
+             end;
+          1: begin
+               Display.CheckOK:=False;
+               Display.NextScreenWithCheck:=NIL;
+             end;
+          end;
           Visible:=False;
           Result := false;
         end;
@@ -100,13 +120,11 @@ begin
     end;
 end;
 
-constructor TScreenPopup.Create;
+constructor TScreenPopupCheck.Create;
 var
   I:    integer;
 begin
   inherited Create;
-  SetLength(ISelections, 1);
-  ISelections[0] := 'Dummy';
 
   AddBackground(Theme.CheckPopup.Background.Tex);
 
@@ -129,37 +147,161 @@ begin
   Interaction := 0;
 end;
 
-function TScreenPopup.Draw: boolean;
+function TScreenPopupCheck.Draw: boolean;
 begin
   inherited Draw;
 end;
 
-procedure TScreenPopup.onShow;
+procedure TScreenPopupCheck.onShow;
 begin
 
 end;
 
-procedure TScreenPopup.ShowPopup(sPopup: Byte);
+procedure TScreenPopupCheck.ShowPopup(msg: String);
 begin
   Interaction := 0; //Reset Interaction
   Visible := True;  //Set Visible
-  Case sPopup of
-    PU_Error:
-      begin
-        Text[0].Text := 'Wirklich beenden?';{Language.Translate('SONG_MENU_NAME_MAIN');}
-
-        Button[0].Visible := True;
-        Button[1].Visible := True;
-//        Button[2].Visible := True;
-//        Button[3].Visible := True;
-//        SelectsS[0].Visible := False;
-
-        Button[0].Text[0].Text := 'JA';
-        Button[1].Text[0].Text := 'NEIN';
-//        Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_ADD');
-//        Button[3].Text[0].Text := Language.Translate('SONG_MENU_EDIT');
-      end;
+
+  Text[0].Text := Language.Translate(msg);
+
+  Button[0].Visible := True;
+  Button[1].Visible := True;
+
+  Button[0].Text[0].Text := Language.Translate('SONG_MENU_YES');
+  Button[1].Text[0].Text := Language.Translate('SONG_MENU_NO');
+end;
+
+// error popup
+
+function TScreenPopupError.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+  function IsVisible: Boolean;
+  begin
+    Result := True;
+    if (Interactions[Interaction].Typ = 0) then
+    begin
+      Result := Button[Interactions[Interaction].Num].Visible;
+    end
+    else if (Interactions[Interaction].Typ = 1) then
+    begin
+      //Result := Selects[Interactions[Interaction].Num].Visible;
+    end
+    else if (Interactions[Interaction].Typ = 3) then
+    begin
+      Result := SelectsS[Interactions[Interaction].Num].Visible;
+    end;
+  end;
+
+  Procedure SelectNext;
+  begin
+    repeat
+      InteractNext;
+    until IsVisible;
+  end;
+
+  Procedure SelectPrev;
+  begin
+    repeat
+      InteractPrev;
+    until IsVisible;
   end;
+begin
+  Result := true;
+  If (PressedDown) Then
+  begin // Key Down
+
+    case PressedKey of
+      SDLK_Q:
+        begin
+          Result := false;
+        end;
+
+      SDLK_ESCAPE :
+        begin
+          Result := false;
+        end;
+
+      SDLK_RETURN:
+        begin
+          Visible:=False;
+          Result := false;
+        end;
+
+      SDLK_DOWN:    SelectNext;
+      SDLK_UP:      SelectPrev;
+
+      SDLK_RIGHT: SelectNext;
+      SDLK_LEFT: SelectPrev;
+    end;
+  end
+  else // Key Up
+    case PressedKey of
+      SDLK_RETURN :
+        begin
+        end;
+    end;
+end;
+
+constructor TScreenPopupError.Create;
+var
+  I:    integer;
+begin
+  inherited Create;
+
+  AddBackground(Theme.CheckPopup.Background.Tex);
+
+  AddButton(Theme.ErrorPopup.Button1);
+  if (Length(Button[0].Text) = 0) then
+    AddButtonText(14, 20, 'Button 1');
+
+  AddText(Theme.ErrorPopup.TextError);
+
+  for I := 0 to High(Theme.ErrorPopup.Static) do
+    AddStatic(Theme.ErrorPopup.Static[I]);
+
+  for I := 0 to High(Theme.ErrorPopup.Text) do
+    AddText(Theme.ErrorPopup.Text[I]);
+
+  Interaction := 0;
+end;
+
+function TScreenPopupError.Draw: boolean;
+begin
+  inherited Draw;
+end;
+
+procedure TScreenPopupError.onShow;
+begin
+
+end;
+
+procedure TScreenPopupError.onHide;
+var i: integer;
+begin
+  for i:=0 to high(Text) do
+    Text[i].Text:='';
+end;
+
+procedure TScreenPopupError.ShowPopup(msg: array of String);
+var i: integer;
+begin
+  Interaction := 0; //Reset Interaction
+  Visible := True;  //Set Visible
+
+  //dirty hack... Text[0] is invisible for some strange reason
+  for i:=1 to high(Text) do
+    if i-1 <= high(msg) then
+    begin
+      Text[i].Visible:=True;
+      Text[i].Text := msg[i-1];
+    end
+    else
+    begin
+      Text[i].Visible:=False;
+    end;
+
+  Button[0].Visible := True;
+
+  Button[0].Text[0].Text := 'OK';
 end;
 
-end.
\ No newline at end of file
+end.
diff --git a/Game/Code/UltraStar.dpr b/Game/Code/UltraStar.dpr
index b7466d84..5f19c1d4 100644
--- a/Game/Code/UltraStar.dpr
+++ b/Game/Code/UltraStar.dpr
@@ -82,6 +82,7 @@ uses
   UScreenStatMain in 'Screens\UScreenStatMain.pas',
   UScreenStatDetail in 'Screens\UScreenStatDetail.pas',
   UScreenCredits in 'Screens\UScreenCredits.pas',
+  UScreenPopup in 'Screens\UScreenPopup.pas',
 
   //------------------------------
   //Includes - Screens PartyMode
@@ -313,4 +314,4 @@ begin
   if Ini.LPT = 2 then Light.TurnOff;
 
   Log.Free;
-end.
\ No newline at end of file
+end.
diff --git a/Languages/English.ini b/Languages/English.ini
index 972e4ce4..f9ebaa9c 100644
--- a/Languages/English.ini
+++ b/Languages/English.ini
@@ -151,6 +151,7 @@ SONG_MENU_PLAYLIST_NEW_UNNAMED=Unnamed
 
 SONG_MENU_NAME_PLAYLIST_DEL=Really Delete?
 SONG_MENU_YES=Yes
+SONG_MENU_NO=No
 
 SONG_MENU_NAME_PLAYLIST_LOAD=Open Playlist
 SONG_MENU_PLAYLIST_LOAD=open
@@ -223,4 +224,7 @@ STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx sung
 
 STAT_DESC_BANDS=Most popular Bands
 STAT_DESC_BANDS_REVERSED=Least popular Bands
-STAT_FORMAT_BANDS=%0:s \n %1:dx Sung
\ No newline at end of file
+STAT_FORMAT_BANDS=%0:s \n %1:dx Sung
+
+MSG_QUIT_USDX=Leave UltraStar?
+MSG_END_PARTY=End Party Mode?
\ No newline at end of file
diff --git a/Languages/readme.txt b/Languages/readme.txt
index 3c710036..247539bc 100644
--- a/Languages/readme.txt
+++ b/Languages/readme.txt
@@ -71,6 +71,7 @@ SONG_MENU_PLAYLIST_NEW_UNNAMED=Unnamed
 
 SONG_MENU_NAME_PLAYLIST_DEL=Really Delete?
 SONG_MENU_YES=Yes
+SONG_MENU_NO=No
 
 SONG_MENU_NAME_PLAYLIST_LOAD=Open Playlist
 SONG_MENU_PLAYLIST_LOAD=open
@@ -146,4 +147,8 @@ STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx sung
 
 STAT_DESC_BANDS=Most popular Bands
 STAT_DESC_BANDS_REVERSED=Least popular Bands
-STAT_FORMAT_BANDS=%0:s \n %1:dx Sung
\ No newline at end of file
+STAT_FORMAT_BANDS=%0:s \n %1:dx Sung
+
+#Messages for Popup Message Boxes
+MSG_QUIT_USDX=Leave UltraStar?
+MSG_END_PARTY=End Party Mode?
\ No newline at end of file
diff --git a/Themes/Deluxe.ini b/Themes/Deluxe.ini
index f278491d..6e4376aa 100644
--- a/Themes/Deluxe.ini
+++ b/Themes/Deluxe.ini
@@ -27,6 +27,8 @@ GrayLight = 191 191 191
 Gray = 127 127 127
 GrayDark = 63 63 63
 Black = 0 0 0
+GrayPopup = 51 51 51
+
 
 [Loading]
 Texts =2
@@ -6272,4 +6274,163 @@ ColG = 0.3
 ColB = 0.3
 Font = 0
 Size = 8
-Text=
\ No newline at end of file
+Text=
+
+[CheckPopup]
+Texts=1
+Statics=1
+
+[CheckPopupButton1]
+X = 294
+Y = 280
+W = 100
+H = 25
+Tex =Rectangle
+Color =LightBlue
+DColor = DarkBlue
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=JA
+Align=1
+Z=1
+
+[CheckPopupButton2]
+X = 426
+Y = 280
+W = 100
+H = 25
+Tex =Rectangle
+Color =LightBlue
+DColor = DarkBlue
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton2Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=NEIN
+Align=1
+Z=1
+
+[CheckPopupText]
+X =400
+Y =125
+Color=White
+Font =0
+Size =14
+Text=blabla
+Align=1
+Z=1
+
+[CheckPopupStatic1]
+Tex =SongMenuBG
+X =250
+Y =120
+W =300
+H =200
+Z =1
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[ErrorPopup]
+Texts=1
+Statics=1
+
+[ErrorPopupButton1]
+X = 350
+Y = 280
+W = 100
+H = 25
+Tex =Rectangle
+Color =LightBlue
+DColor = DarkBlue
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[ErrorPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=OK
+Align=1
+Z=1
+
+[ErrorPopupText1]
+X =400
+Y =125
+Color=White
+Font =0
+Size =14
+Text=error text line 1
+Align=1
+Z=1
+
+[ErrorPopupText2]
+X =400
+Y =150
+Color=White
+Font =0
+Size =14
+Text=error text line 2
+Align=1
+Z=1
+
+[ErrorPopupText3]
+X =400
+Y =175
+Color=White
+Font =0
+Size =14
+Text=error text line 3
+Align=1
+Z=1
+
+[ErrorPopupText4]
+X =400
+Y =200
+Color=White
+Font =0
+Size =14
+Text=error text line 4
+Align=1
+Z=1
+
+[ErrorPopupText5]
+X =400
+Y =225
+Color=White
+Font =0
+Size =14
+Text=error text line 5
+Align=1
+Z=1
+
+[ErrorPopupStatic1]
+Tex =SongMenuBG
+X =250
+Y =120
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
\ No newline at end of file
-- 
cgit v1.2.3