;/ =========================== ;/ = TextEx-Module.pbi = ;/ =========================== ;/ ;/ [ PB V5.7x / 64Bit / All OS / DPI ] ;/ ;/ Extented TextGadget (e.g. gradient background / multiline / automatic size adjustment) ;/ ;/ © 2019 Thorsten1867 (03/2019) ;/ ; Last Update: ;{ ===== MIT License ===== ; ; Copyright (c) 2019 Thorsten Hoeppner ; ; Permission is hereby granted, free of charge, to any person obtaining a copy ; of this software and associated documentation files (the "Software"), to deal ; in the Software without restriction, including without limitation the rights ; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ; copies of the Software, and to permit persons to whom the Software is ; furnished to do so, subject to the following conditions: ; ; The above copyright notice and this permission notice shall be included in all ; copies or substantial portions of the Software. ; ; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ; SOFTWARE. ;} ;{ _____TextEx - Commands _____ ; TextEx::Gadget() - similar to 'TextGadget()' ; TextEx::GetColor() - similar to 'GetGadgetColor()' ; TextEx::GetText() - similar to 'GetGadgetText()' ; TextEx::SetColor() - similar to 'SetGadgetColor()' ; TextEx::SetFont() - similar to 'SetGadgetFont()' ; TextEx::SetText() - similar to 'SetGadgetText()' ; TextEx::SetAutoResizeFlags() - [#MoveX|#MoveY|#ResizeWidth|#ResizeHeight] ;} ;- =========================================================================== ;- DeclareModule ;- =========================================================================== DeclareModule TextEx #Left = 0 EnumerationBinary #Center = #PB_Text_Center #Right = #PB_Text_Right #Gradient #AutoResize #MultiLine #Border = #PB_Text_Border EndEnumeration EnumerationBinary #MoveX #MoveY #ResizeWidth #ResizeHeight EndEnumeration Enumeration 1 #FrontColor #BackColor #GradientColor #BorderColor EndEnumeration Declare Gadget(GID.i, X.i, Y.i, Width.i, Height.i, Text.s, Flags.i=#False, Window.i=#False) Declare.i GetColor(GID.i, ColorType.i) Declare.s GetText(GID.i) Declare SetColor(GID.i, ColorType.i, Value.i) Declare SetFont(GID.i, FontID.i) Declare SetText(GID.i, Text.s) Declare SetAutoResizeFlags(GID.i, Flags.i) EndDeclareModule Module TextEx EnableExplicit ;- ============================================================================ ;- Module - Constants / Structures ;- ============================================================================ Structure TextEx_Size_Structure ;{ TextEx()\Size\... X.f Y.f Width.f Height.f winWidth.f winHeight.f Flags.i EndStructure ;} Structure TextEx_Color_Structure ;{ TextEx()\Color\... Front.i Back.i Gradient.i Border.i EndStructure ;} Structure TextEx_Structure ;{ TextEx()\... Window.i CanvasID.i FontID.i Text.s Flags.i Size.TextEx_Size_Structure Color.TextEx_Color_Structure EndStructure ;} Global NewMap TextEx.TextEx_Structure() Global DesktopDPI.i ;- ============================================================================ ;- Module - Internal ;- ============================================================================ Procedure.f dpiX(Num.i) ProcedureReturn DesktopScaledX(Num) EndProcedure Procedure.f dpiY(Num.i) ProcedureReturn DesktopScaledY(Num) EndProcedure ;- __________ Drawing __________ Procedure.i BlendColor_(Color1.i, Color2.i, Scale.i=50) Define.i R1, G1, B1, R2, G2, B2 Define.f Blend = Scale / 100 R1 = Red(Color1): G1 = Green(Color1): B1 = Blue(Color1) R2 = Red(Color2): G2 = Green(Color2): B2 = Blue(Color2) ProcedureReturn RGB((R1*Blend) + (R2 * (1-Blend)), (G1*Blend) + (G2 * (1-Blend)), (B1*Blend) + (B2 * (1-Blend))) EndProcedure Procedure.f GetOffsetX_(Text.s, OffsetX.f) If TextEx()\Flags & #Center ProcedureReturn (TextEx()\Size\Width - TextWidth(Text)) / 2 ElseIf TextEx()\Flags & #Right ProcedureReturn TextEx()\Size\Width - TextWidth(Text) - OffsetX Else ProcedureReturn OffsetX EndIf EndProcedure Procedure Draw_() Define.f textY, textX, OffsetX Define.i TextHeight, Rows, r Define.s Text If StartDrawing(CanvasOutput(TextEx()\CanvasID)) ;{ _____ Background _____ If TextEx()\Flags & #Gradient DrawingMode(#PB_2DDrawing_Gradient) FrontColor(TextEx()\Color\Back) BackColor(TextEx()\Color\Gradient) LinearGradient(0, 0, TextEx()\Size\Width, TextEx()\Size\Height) Box(0, 0, TextEx()\Size\Width, TextEx()\Size\Height) OffsetX = dpiX(5) Else DrawingMode(#PB_2DDrawing_Default) Box(0, 0, TextEx()\Size\Width, TextEx()\Size\Height, TextEx()\Color\Back) EndIf ;} ;{ _____ Text _____ If TextEx()\FontID : DrawingFont(TextEx()\FontID) : EndIf TextHeight = TextHeight(TextEx()\Text) DrawingMode(#PB_2DDrawing_Transparent) If TextEx()\Flags & #MultiLine Rows = CountString(TextEx()\Text, #LF$) + 1 textY = (TextEx()\Size\Height - (TextHeight * Rows)) / 2 For r = 1 To Rows Text = StringField(TextEx()\Text, r, #LF$) textX = GetOffsetX_(Text, OffsetX) DrawText(textX, textY, Text, TextEx()\Color\Front) textY + TextHeight Next Else textY = (TextEx()\Size\Height - TextHeight) / 2 textX = GetOffsetX_(TextEx()\Text, OffsetX) DrawText(textX, textY, TextEx()\Text, TextEx()\Color\Front) EndIf ;} ;{ _____ Border ____ If TextEx()\Flags & #Border DrawingMode(#PB_2DDrawing_Outlined) If TextEx()\Color\Border = #PB_Default If TextEx()\Flags & #Gradient Box(0, 0, TextEx()\Size\Width, TextEx()\Size\Height, BlendColor_(TextEx()\Color\Back, TextEx()\Color\Gradient, 20)) Else Box(0, 0, TextEx()\Size\Width, TextEx()\Size\Height, BlendColor_(TextEx()\Color\Back, TextEx()\Color\Front)) EndIf Else Box(0, 0, TextEx()\Size\Width, TextEx()\Size\Height, BlendColor_(TextEx()\Color\Back, TextEx()\Color\Border)) EndIf EndIf ;} StopDrawing() EndIf EndProcedure ;- __________ Events __________ Procedure _ResizeHandler() Define.i GadgetID = EventGadget() If FindMapElement(TextEx(), Str(GadgetID)) TextEx()\Size\Width = dpiX(GadgetWidth(GadgetID)) TextEx()\Size\Height = dpiY(GadgetHeight(GadgetID)) Draw_() EndIf EndProcedure Procedure _ResizeWindowHandler() Define.f X, Y, Width, Height Define.f OffSetX, OffSetY ForEach TextEx() If IsGadget(TextEx()\CanvasID) If TextEx()\Flags & #AutoResize If IsWindow(TextEx()\Window) OffSetX = WindowWidth(TextEx()\Window) - TextEx()\Size\winWidth OffsetY = WindowHeight(TextEx()\Window) - TextEx()\Size\winHeight TextEx()\Size\winWidth = WindowWidth(TextEx()\Window) TextEx()\Size\winHeight = WindowHeight(TextEx()\Window) If TextEx()\Size\Flags X = #PB_Ignore : Y = #PB_Ignore : Width = #PB_Ignore : Height = #PB_Ignore If TextEx()\Size\Flags & #MoveX : X = GadgetX(TextEx()\CanvasID) + OffSetX : EndIf If TextEx()\Size\Flags & #MoveY : Y = GadgetY(TextEx()\CanvasID) + OffSetY : EndIf If TextEx()\Size\Flags & #ResizeWidth : Width = GadgetWidth(TextEx()\CanvasID) + OffSetX : EndIf If TextEx()\Size\Flags & #ResizeHeight : Height = GadgetHeight(TextEx()\CanvasID) + OffSetY : EndIf ResizeGadget(TextEx()\CanvasID, X, Y, Width, Height) Else ResizeGadget(TextEx()\CanvasID, #PB_Ignore, #PB_Ignore, GadgetWidth(TextEx()\CanvasID) + OffSetX, GadgetHeight(TextEx()\CanvasID) + OffsetY) EndIf Draw_() EndIf EndIf EndIf Next EndProcedure ;- ========================================================================== ;- Module - Declared Procedures ;- ========================================================================== Procedure SetAutoResizeFlags(GID.i, Flags.i) If FindMapElement(TextEx(), Str(GID)) TextEx()\Size\Flags = Flags EndIf EndProcedure Procedure SetColor(GID.i, ColorType.i, Color.i) If FindMapElement(TextEx(), Str(GID)) Select ColorType Case #FrontColor TextEx()\Color\Front = Color Case #BackColor TextEx()\Color\Back = Color Case #BorderColor TextEx()\Color\Border = Color Case #GradientColor TextEx()\Color\Gradient = Color EndSelect Draw_() EndIf EndProcedure Procedure.i GetColor(GID.i, ColorType.i) If FindMapElement(TextEx(), Str(GID)) Select ColorType Case #FrontColor ProcedureReturn TextEx()\Color\Front Case #BackColor ProcedureReturn TextEx()\Color\Back Case #BorderColor ProcedureReturn TextEx()\Color\Border Case #GradientColor ProcedureReturn TextEx()\Color\Gradient EndSelect EndIf EndProcedure Procedure SetFont(GID.i, FontID.i) If FindMapElement(TextEx(), Str(GID)) TextEx()\FontID = FontID Draw_() EndIf EndProcedure Procedure SetText(GID.i, Text.s) If FindMapElement(TextEx(), Str(GID)) TextEx()\Text = Text Draw_() EndIf EndProcedure Procedure.s GetText(GID.i) If FindMapElement(TextEx(), Str(GID)) ProcedureReturn TextEx()\Text EndIf EndProcedure Procedure Gadget(GID.i, X.i, Y.i, Width.i, Height.i, Text.s, Flags.i=#False, Window.i=#False) Define Result.i DesktopDPI = dpiY(100) Result = CanvasGadget(GID, X, Y, Width, Height) If Result If GID = #PB_Any : GID = Result : EndIf X = dpiX(X) Y = dpiY(Y) Width = dpiX(Width) Height = dpiY(Height) If AddMapElement(TextEx(), Str(GID)) TextEx()\CanvasID = GID If IsWindow(Window) TextEx()\Window = Window Else TextEx()\Window = GetActiveWindow() EndIf TextEx()\Size\X = X TextEx()\Size\Y = Y TextEx()\Size\Width = Width TextEx()\Size\Height = Height TextEx()\Text = Text TextEx()\Color\Front = $000000 TextEx()\Color\Gradient = $C0C0C0 TextEx()\Color\Border = #PB_Default CompilerSelect #PB_Compiler_OS ;{ window background color (if possible) CompilerCase #PB_OS_Windows TextEx()\Color\Back = GetSysColor_(#COLOR_MENU) CompilerCase #PB_OS_MacOS TextEx()\Color\Back = $EDEDED CompilerCase #PB_OS_Linux TextEx()\Color\Back = $EDEDED CompilerEndSelect ;} TextEx()\Flags = Flags BindGadgetEvent(TextEx()\CanvasID, @_ResizeHandler(), #PB_EventType_Resize) If Flags & #AutoResize If IsWindow(Window) TextEx()\Size\winWidth = WindowWidth(Window) TextEx()\Size\winHeight = WindowHeight(Window) BindEvent(#PB_Event_SizeWindow, @_ResizeWindowHandler(), Window) EndIf EndIf Draw_() EndIf EndIf ProcedureReturn GID EndProcedure EndModule ;- ======== Module - Example ======== CompilerIf #PB_Compiler_IsMainFile #Window = 0 #Text = 1 #Font = 1 LoadFont(#Font, "Arial", 11, #PB_Font_Bold) If OpenWindow(#Window, 0, 0, 180, 60, "Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget) TextEx::Gadget(#Text, 5, 5, 170, 50, "Gradient Background", TextEx::#Center|TextEx::#Border|TextEx::#Gradient|TextEx::#AutoResize|TextEx::#MultiLine) TextEx::SetColor(#Text, TextEx::#FrontColor, $FFFFFF) TextEx::SetColor(#Text, TextEx::#BackColor, $DEC4B0) TextEx::SetColor(#Text, TextEx::#GradientColor, $783C0A) TextEx::SetFont(#Text, FontID(#Font)) ;TextEx::SetText(#Text, "Row 1" + #LF$ + "Row 2") TextEx::SetAutoResizeFlags(#Text, TextEx::#MoveY|TextEx::#ResizeWidth) Repeat Event = WaitWindowEvent() Until Event = #PB_Event_CloseWindow EndIf CompilerEndIf ; IDE Options = PureBasic 5.70 LTS (Windows - x64) ; CursorPosition = 7 ; Folding = MAAA9 ; EnableXP