unit UScreenPopup; interface uses UMenu, SDL, UMusic, math, UFiles, SysUtils, UThemes, UHelp, gl, glu; type TScreenPopupCheck = class(TMenu) 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 ShowPopup(msg: String); function Draw: boolean; override; end; 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: String); function Draw: boolean; override; end; TRect = record left, right, top, bottom: integer; end; TLine = record fX, fY, tX, tY: integer; end; TText = record X, Y: integer; Style: integer; Size: real; Italic: boolean; text: string; end; TResLine = record Y: integer; H: integer; lines: array of TLine; texts: array of TText; end; TScreenPopupHelp = class(TMenu) private TextsGFX: array of TResLine; msg: TTextResult; Rect: TRect; max_high: real; step: double; barH: double; procedure DrawTable; procedure DrawLine(line, index, Y: integer); procedure DrawText(line, index, Y: integer); procedure DrawScroll(X, Y, W, H: integer; pos, len: double); 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(); function Draw: boolean; override; end; var // ISelections: Array of String; SelectValue: Integer; implementation uses Classes, TextGL, UGraphic, USongs, UMain, UIni, UTexture, ULanguage, UParty, UPlaylist, UDisplay; function TScreenPopupCheck.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; begin Result := true; If (PressedDown) Then begin // Key Down case PressedKey of SDLK_Q: begin Result := false; end; SDLK_ESCAPE, SDLK_BACKSPACE : begin Display.CheckOK:=False; Display.NextScreenWithCheck:=NIL; Visible:=False; Result := false; end; SDLK_RETURN: begin case Interaction of 0: begin //Hack to Finish Singscreen correct on Exit with Q Shortcut if (Display.NextScreenWithCheck = NIL) then begin if (Display.ActualScreen = @ScreenSing) then ScreenSing.Finish else if (Display.ActualScreen = @ScreenSingModi) then ScreenSingModi.Finish; end; //Hack to load faulty songs in main screen if (Display.NextScreenWithCheck = NIL) then begin if (Display.ActualScreen = @ScreenMain) and (ScreenMain.ShowNumErrors) then begin Ini.LoadFaultySongs_temp := 1; Songs.LoadSongList(); UGraphic.UnLoadScreens(); UGraphic.LoadScreens( true ); ScreenSong.Refresh(true); PlaylistMan.LoadPlayLists; ScreenMain.ShowNumErrors := false; FadeTo(@ScreenMain); end else Display.CheckOK:=True; end else Display.CheckOK:=True; end; 1: begin Display.CheckOK:=False; Display.NextScreenWithCheck:=NIL; if (Display.ActualScreen = @ScreenMain) and (ScreenMain.ShowNumErrors) then ScreenMain.ShowNumErrors := false; end; end; Visible:=False; Result := false; end; SDLK_DOWN: InteractNext; SDLK_UP: InteractPrev; SDLK_RIGHT: InteractNext; SDLK_LEFT: InteractPrev; end; end; end; constructor TScreenPopupCheck.Create; var I: integer; begin inherited Create; AddBackground(Theme.CheckPopup.Background.Tex); AddButton(Theme.CheckPopup.Button1); if (Length(Button[0].Text) = 0) then AddButtonText(14, 20, 'Button 1'); AddButton(Theme.CheckPopup.Button2); if (Length(Button[1].Text) = 0) then AddButtonText(14, 20, 'Button 2'); AddText(Theme.CheckPopup.TextCheck); for I := 0 to High(Theme.CheckPopup.Static) do AddStatic(Theme.CheckPopup.Static[I]); for I := 0 to High(Theme.CheckPopup.Text) do AddText(Theme.CheckPopup.Text[I]); Interaction := 0; end; function TScreenPopupCheck.Draw: boolean; begin inherited Draw; end; procedure TScreenPopupCheck.onShow; begin end; procedure TScreenPopupCheck.ShowPopup(msg: String); begin Interaction := 0; //Reset Interaction Visible := True; //Set Visible 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; begin Result := true; If (PressedDown) Then begin // Key Down case PressedKey of SDLK_Q: begin Result := false; end; SDLK_ESCAPE, SDLK_BACKSPACE : begin Visible:=False; Result := false; end; SDLK_RETURN: begin Visible:=False; Result := false; end; SDLK_DOWN: InteractNext; SDLK_UP: InteractPrev; SDLK_RIGHT: InteractNext; SDLK_LEFT: InteractPrev; 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; begin end; procedure TScreenPopupError.ShowPopup(msg: String); begin Interaction := 0; //Reset Interaction Visible := True; //Set Visible Text[0].Text:=msg; Button[0].Visible := True; Button[0].Text[0].Text := 'OK'; end; // Help popup function TScreenPopupHelp.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; var pos: double; begin Result := true; If (PressedDown) Then begin // Key Down pos := Help.GetScrollPos(); case PressedKey of SDLK_TAB, SDLK_ESCAPE, SDLK_BACKSPACE : begin Visible:=False; if (Help.GetHelpID() = ScreenSing.GetHelpID()) then ScreenSing.Pause; Result := false; end; SDLK_RETURN: begin Visible:=False; Result := false; end; SDLK_DOWN: begin InteractNext; if pos<(1-step) then Help.SetScrollPos(pos+step) else if pos>0 then Help.SetScrollPos(1); end; SDLK_UP: begin InteractPrev; if pos>step then Help.SetScrollPos(pos-step) else if pos>0 then Help.SetScrollPos(0); end; SDLK_RIGHT: InteractNext; SDLK_LEFT: InteractPrev; end; end; end; constructor TScreenPopupHelp.Create; begin inherited Create; AddButton(Theme.HelpPopup.Button1); if (Length(Button[0].Text) = 0) then AddButtonText(14, 20, 'Button 1'); Button[0].Visible := false; Interaction := 0; end; function TScreenPopupHelp.Draw: boolean; var abs: real; begin inherited Draw; if step<1 then abs := 20 else abs := 5; //Background: glEnable(GL_BLEND); glbegin(gl_quads); glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.left-5, Rect.top-5); glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.right+abs, Rect.top-5); glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.right+abs, Rect.bottom+5); glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.left-5, Rect.bottom+5); glEnd; glDisable(GL_BLEND); glScissor(Rect.left-1, ScreenH-Rect.bottom-1, Rect.right-Rect.left+2, Rect.bottom-Rect.top+2); glScissor(round((Rect.left-1)*(ScreenW/Screens)/RenderW+(ScreenW/Screens)*(ScreenAct-1)), round((RenderH-Rect.bottom-1)*ScreenH/RenderH), round((Rect.right-Rect.left+2)*(ScreenW/Screens)/RenderW), round((Rect.bottom-Rect.top+2)*ScreenH/RenderH)); glEnable(GL_SCISSOR_TEST); DrawTable(); glDisable(GL_SCISSOR_TEST); if step<1 then DrawScroll(Rect.right+5, Rect.top, 10, Rect.bottom-Rect.top, Help.GetScrollPos(), barH); end; procedure TScreenPopupHelp.onShow; begin end; procedure TScreenPopupHelp.onHide; begin end; procedure TScreenPopupHelp.ShowPopup(); var I, J, K: integer; line: integer; SL: TStringList; tempStr: String; KeyEnd: integer; Style: integer; Size: real; Italic: boolean; fieldh: integer; tline: integer; countline:integer; procedure AddLine(l, i, fX, fY, tX, tY: integer); begin TextsGFX[l].lines[i].fX := fX; TextsGFX[l].lines[i].fY := fY; TextsGFX[l].lines[i].tX := tX; TextsGFX[l].lines[i].tY := tY; end; procedure NewLine(h, lines: integer); begin inc(line); tline := -1; SetLength(TextsGFX, line+1); TextsGFX[line].H := h; TextsGFX[line].Y := TextsGFX[line-1].Y + TextsGFX[line-1].H; SetLength(TextsGFX[line].lines, lines); end; procedure NewText(X, Y: integer); begin inc(tline); SetLength(TextsGFX[line].texts, tline+1); TextsGFX[line].texts[tline].X := X; TextsGFX[line].texts[tline].Y := Y; TextsGFX[line].texts[tline].Style := Style; TextsGFX[line].texts[tline].Size := Size; TextsGFX[line].texts[tline].Italic := Italic; end; begin Interaction := 0; //Reset Interaction Visible := True; //Set Visible SetLength(TextsGFX, 0); line := 0; tline := -1; Style := 1; Size := 7; Italic := false; SetFontStyle(Style); SetFontSize(Size); SetFontItalic(Italic); Rect.left := 25; Rect.right := 770; Rect.top := 25; Rect.bottom := 575; KeyEnd := round((Rect.right - Rect.left)*0.4); fieldh := 22; msg := Help.GetHelpStr(); //Title SetLength(TextsGFX, 1); TextsGFX[line].H := round(fieldh/4); TextsGFX[line].Y := Rect.top; SetLength(TextsGFX[line].lines, 3); AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y); AddLine(line, 1, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H); AddLine(line, 2, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H); NewLine(fieldh*2, 2); AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H); AddLine(line, 1, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H); NewText(Rect.left + 5, TextsGFX[line].Y + 2); TextsGFX[line].texts[tline].Size:=12; TextsGFX[line].texts[tline].text := Language.Translate('MSG_HELP_TITLE') + ': ' + msg.Title; NewLine(round(fieldh/4), 3); AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y); AddLine(line, 1, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H); AddLine(line, 2, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H); //Description Style := 1; SetFontStyle(Style); SL:=TStringList.Create; try ExtractStrings([' '], [], PChar(msg.Description), SL); if SL.Count>0 then begin NewLine(round(fieldh/4), 3); AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y); AddLine(line, 1, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H); AddLine(line, 2, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H); NewLine(fieldh, 2); AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H); AddLine(line, 1, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H); NewText(Rect.left + 5, TextsGFX[line].Y + 2); end; tempStr := ''; for I := 0 to SL.Count-1 do begin if glTextWidth(PChar(tempStr + SL[I] + ' ')) <= (Rect.right - Rect.left - 10) then begin if I= offset-20) then begin for J := 0 to Length(TextsGFX[I].lines) - 1 do DrawLine(I, J, offset); for J := 0 to Length(TextsGFX[I].texts) - 1 do DrawText(I, J, offset); h := h + TextsGFX[I].H; end; inc(I); end; end; procedure TScreenPopupHelp.DrawLine(line, index, Y: integer); begin glColor4f(1, 1, 1, 1); glLineWidth(2); glBegin(GL_LINES); glVertex2f(TextsGFX[line].lines[index].fX, TextsGFX[line].lines[index].fY - Y); glVertex2f(TextsGFX[line].lines[index].tX, TextsGFX[line].lines[index].tY - Y); glEnd; end; procedure TScreenPopupHelp.DrawText(line, index, Y: integer); begin glColor4f(1, 1, 1, 1); SetFontStyle(TextsGFX[line].texts[index].Style); SetFontItalic(TextsGFX[line].texts[index].Italic); SetFontSize(TextsGFX[line].texts[index].Size); SetFontPos (TextsGFX[line].texts[index].X, TextsGFX[line].texts[index].Y - Y); glPrint(PChar(TextsGFX[line].texts[index].text)); end; procedure TScreenPopupHelp.DrawScroll(X, Y, W, H: integer; pos, len: double); var fY, tY: double; begin glColor4f(1, 1, 1, 1); glLineWidth(1); glBegin(GL_LINE_LOOP); glVertex2f(X, Y); glVertex2f(X+W, Y); glVertex2f(X+W, Y+H); glVertex2f(X, Y+H); glEnd; fY := Y+(H-H*len)*Pos; tY := fY+H*len; if tY+0.001>=Y+H then tY := Y+H; glBegin(GL_QUADS); glVertex2f(X, fY); glVertex2f(X+W, fY); glVertex2f(X+W, tY); glVertex2f(X, tY); glEnd; end; end.