diff -r e461deddc942 -r ec1491bb5acc hedgewars/uChat.pas --- a/hedgewars/uChat.pas Fri Apr 27 11:19:23 2018 -0400 +++ b/hedgewars/uChat.pas Tue May 15 16:55:37 2018 +0200 @@ -35,7 +35,7 @@ procedure TextInput(var event: TSDL_TextInputEvent); implementation -uses uInputHandler, uTypes, uVariables, uCommands, uUtils, uTextures, uRender, uIO, uScript, uRenderUtils; +uses uConsts, uInputHandler, uTypes, uVariables, uCommands, uUtils, uTextures, uRender, uIO, uScript, uRenderUtils, uStore, Math; const MaxStrIndex = 27; MaxInputStrLen = 200; @@ -93,8 +93,14 @@ ); -const Padding = 2; - ClHeight = 2 * Padding + 16; // font height +const PaddingFactor = (1/6); // relative to font size + +var Padding, ClHeight: integer; + LastChatScaleValue, LastUIScaleValue: real; + SkipNextInput: boolean; + +procedure UpdateInputLinePrefix(); forward; +procedure UpdateCursorCoords(); forward; // relevant for UTF-8 handling function IsFirstCharByte(c: char): boolean; inline; @@ -113,26 +119,95 @@ selectedPos:= -1; end; +procedure AdjustToUIScale(); +var fntSize: integer; +begin + // don't do anything if no change + if (ChatScaleValue = LastChatScaleValue) and (UIScaleValue = LastUIScaleValue) then + exit; + + LastChatScaleValue:= ChatScaleValue; + LastUIScaleValue:= UIScaleValue; + + // determine font size - note: +0.1 to because I don't trust float inaccuracy combined with floor + fntSize:= max(1, floor(UIScaleValue * ChatScaleValue * Fontz[fnt16].Height + 0.1)); + + if Fontz[fntChat].Height <> fntSize then + begin + // adjust associated heights + Fontz[fntChat].Height:= fntSize; + Fontz[CJKfntChat].Height:= fntSize; + // reload if initialized already + if Fontz[fntChat].Handle <> nil then + LoadFont(fntChat); + if Fontz[CJKfntChat].Handle <> nil then + LoadFont(CJKfntChat); + end; + + // adjust line height etc. + Padding:= max(1, floor(PaddingFactor * fntSize + 0.1)); + ClHeight:= 2 * Padding + fntSize; + + // clear cache of already rendered lines + ReloadLines(); + UpdateInputLinePrefix(); + UpdateCursorCoords(); +end; + +procedure ChatSizeInc(); +begin +// TODO cChatMinScaleLevel, cChatSizeDelta (probably half of cZoomDelta) +// TODO always - effectively -- increase font by 1px? +if ChatScaleValue < cMinZoomLevel then + begin + ChatScaleValue:= ChatScaleValue + cZoomDelta; + AdjustToUIScale(); + end; +end; + +procedure ChatSizeDec(); +begin +// TODO cChatMaxScaleLevel, cChatSizeDelta (probably half of cZoomDelta) +// TODO always - effectively -- increase font by 1px? +if ChatScaleValue > cMaxZoomLevel then + begin + ChatScaleValue:= ChatScaleValue - cZoomDelta; + AdjustToUIScale(); + end; +end; + +procedure chatSizeReset(); +begin +ChatScaleValue:= cDefaultChatScaleLevel; +AdjustToUIScale(); +end; + +function GetChatFont(str: shortstring): THWFONT; +begin + GetChatFont:= CheckCJKFont(ansistring(str), fntChat); +end; + procedure UpdateCursorCoords(); var font: THWFont; str : shortstring; coff, soff: LongInt; begin + AdjustToUIScale(); + if cursorPos = selectedPos then ResetSelection(); // calculate cursor offset str:= InputStr.s; - font:= CheckCJKFont(ansistring(str), fnt16); + font:= GetChatFont(str); // get only substring before cursor to determine length // SetLength(str, cursorPos); // makes pas2c unhappy str[0]:= char(cursorPos); // get render size of text TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(str), @coff, nil); - - cursorX:= 2 + coff; + cursorX:= Padding + coff; // calculate selection width on screen if selectedPos >= 0 then @@ -170,7 +245,7 @@ FreeAndNilTexture(cl.Tex); -font:= CheckCJKFont(ansistring(str), fnt16); +font:= GetChatFont(str); // get render size of text TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(str), @cl.Width, nil); @@ -199,7 +274,7 @@ if strSurface <> nil then tmpSurface:= SDL_ConvertSurface(strSurface, resSurface^.format, 0); SDL_FreeSurface(strSurface); //SDL_UpperBlit(strSurface, nil, resSurface, @dstrect); -if tmpSurface <> nil then copyToXY(tmpSurface, resSurface, Padding, Padding); +if tmpSurface <> nil then copyToXY(tmpSurface, resSurface, Padding, 2); SDL_FreeSurface(tmpSurface); cl.Tex:= Surface2Tex(resSurface, false); @@ -244,8 +319,8 @@ procedure ReloadLines; var i: LongWord; begin - if InputStr.s <> '' then - SetLine(InputStr, InputStr.s, true); + // also reload empty input line (as chat size/scaling might have changed) + //if InputStr.s <> '' then SetLine(InputStr, InputStr.s, true); for i:= 0 to MaxStrIndex do for i:= 0 to MaxStrIndex do if Strs[i].s <> '' then begin @@ -293,6 +368,8 @@ selRect: TSDL_Rect; c: char; begin +AdjustToUIScale(); + ChatReady:= true; // maybe move to somewhere else? if ChatHidden and (not showAll) then @@ -323,12 +400,12 @@ begin // draw cursor if ((RealTicks - LastKeyPressTick) and 512) < 256 then - DrawLineOnScreen(left + cursorX, top + 2, left + cursorX, top + ClHeight - 2, 2.0, $00, $FF, $FF, $FF); + DrawLineOnScreen(left + cursorX, top + Padding, left + cursorX, top + ClHeight - Padding, 2.0, $00, $FF, $FF, $FF); end else // draw selection begin - selRect.y:= top + 2; - selRect.h:= clHeight - 4; + selRect.y:= top + Padding; + selRect.h:= clHeight - 2 * Padding; if selectionDx < 0 then begin selRect.x:= left + cursorX + selectionDx; @@ -972,7 +1049,7 @@ // ignore me!!! end; // TODO: figure out how to determine those keys better - SDL_SCANCODE_a: + SDL_SCANCODE_b: begin // select all if ctrlonly then @@ -1008,6 +1085,33 @@ DeleteSelected(); end end; + // make chat bigger + SDL_SCANCODE_KP_PLUS, SDL_SCANCODE_EQUALS: + begin + if ctrl then + begin + ChatSizeInc(); + SkipNextInput:= true; + end; + end; + // make chat smaller + SDL_SCANCODE_KP_MINUS, SDL_SCANCODE_MINUS: + begin + if ctrl then + begin + ChatSizeDec(); + SkipNextInput:= true; + end; + end; + // revert chat size to default + SDL_SCANCODE_KP_0, SDL_SCANCODE_0: + begin + if ctrl then + begin + ChatSizeReset(); + SkipNextInput:= true; + end; + end; end; end; @@ -1016,16 +1120,25 @@ l: byte; isl: integer; begin + if SkipNextInput then + begin + SkipNextInput:= false; + exit; + end; + DeleteSelected(); + s:= ''; l:= 0; // fetch all bytes of character/input while event.text[l] <> #0 do begin - s[l + 1]:= event.text[l]; - inc(l) + if Length(s) < 255 then + begin + s[l + 1]:= event.text[l]; + inc(l) + end end; - if l > 0 then begin isl:= Length(InputStr.s); @@ -1141,6 +1254,10 @@ ChatHidden:= false; firstDraw:= true; + LastChatScaleValue:= 0; + LastUIScaleValue:= 0; + SkipNextInput:= true; + InputLinePrefix.Tex:= nil; UpdateInputLinePrefix(); inputStr.s:= '';