AutoSize() for text gadgets - Cross Platform
Posted: Thu Dec 18, 2014 2:51 pm
A function to auto-size text gadgets using native PureBasic functions. The text gadget is either shrunk to the closest longest word or phrase in the caption, or is expanded to the longest word in the caption. Works with left, right and centre alignments. Tested and working on Windows and OSX, and should also work on Linux.
Includes a ready-to-use demo to test with customisable captions, and selectable fonts, sizes and text alignments:There is a minor inaccuracy when the gadget is expanded - if the initial gadget size is smaller than any word in the caption, and has to expand, it sometimes adds an additional blank line. If anyone knows what's causing this, please update the code. No known issues otherwise.
Thank you.
Includes a ready-to-use demo to test with customisable captions, and selectable fonts, sizes and text alignments:
Code: Select all
;========================================================
; AutoSize() for automatically sizing text gadgets -
; expands the width of an undersized text gadget to
; fit the longest word in the caption, or shrinks an
; oversized text gadget to the width of the longest
; possible phrase in the caption - height corresponds
;
; for Windows, OSX (and Linux?)
;
; tested with PureBasic v5.31 on Windows 8.1 Pro (x64)
; and PureBasic v5.2 on on OSX 10.7.5 (x64)
;
; by TI-994A - free to use, improve, share...
;
; 18th December 2014
;========================================================
;==============================================================================================
; fully cross-platform, self-contained text gadget auto-sizing function - just pop-in and call
;==============================================================================================
Procedure AutoSize(gadgetNo)
Shared alignFlag
gadgetWt = GadgetWidth(gadgetNo)
gadgetHt = GadgetHeight(gadgetNo, #PB_Gadget_RequiredSize)
gadgetText.s = (ReplaceString(Trim(GetGadgetText(gadgetNo)), " ", " ")) + " "
tempGadget = TextGadget(#PB_Any, -1000, -1000, gadgetWt, gadgetHt, "", alignFlag)
SetGadgetFont(tempGadget, GetGadgetFont(gadgetNo))
HideGadget(tempGadget, 1)
For textIndex = 1 To CountString(gadgetText, " ")
If alignFlag = #PB_Text_Right
SetGadgetText(tempGadget, " " + StringField(gadgetText, textIndex, " "))
Else
SetGadgetText(tempGadget, StringField(gadgetText, textIndex, " "))
EndIf
textIndexWidth = GadgetWidth(tempGadget, #PB_Gadget_RequiredSize)
If textIndexWidth > gadgetWt
gadgetWt = textIndexWidth
expanded = 1
EndIf
Next textIndex
If Not expanded
textIndexWidth = 0
For textIndex = 1 To CountString(gadgetText, " ")
SetGadgetText(tempGadget, spacer$ + StringField(gadgetText, textIndex, " "))
currentStringWidth = GadgetWidth(tempGadget, #PB_Gadget_RequiredSize) - 2
textIndexWidth + currentStringWidth
If textIndexWidth => gadgetWt
If textIndexWidth - currentStringWidth > maxWidth
maxWidth = textIndexWidth - currentStringWidth
EndIf
If textIndexWidth > gadgetWt
spacer$ = " "
Else
spacer$ = ""
EndIf
If alignFlag = #PB_Text_Right
SetGadgetText(tempGadget, " " + StringField(gadgetText, textIndex, " "))
Else
SetGadgetText(tempGadget, StringField(gadgetText, textIndex, " "))
EndIf
textIndexWidth = GadgetWidth(tempGadget, #PB_Gadget_RequiredSize) - 2
Else
spacer$ = " "
EndIf
Next textIndex
If textIndexWidth > maxWidth
maxWidth = textIndexWidth
EndIf
If maxWidth
gadgetWt = maxWidth + 2
EndIf
EndIf
spacer$ = ""
textIndexWidth = 0
For textIndex = 1 To CountString(gadgetText, " ")
SetGadgetText(tempGadget, spacer$ + StringField(gadgetText, textIndex, " "))
textIndexWidth + GadgetWidth(tempGadget, #PB_Gadget_RequiredSize) - 2
If textIndexWidth => gadgetWt
If textIndexWidth > gadgetWt
spacer$ = " "
Else
spacer$ = ""
EndIf
If textIndex = CountString(gadgetText, " ")
lines + 2
Else
lines + 1
EndIf
If alignFlag = #PB_Text_Right
spacer$ = " "
SetGadgetText(tempGadget, " " + StringField(gadgetText, textIndex, " "))
Else
SetGadgetText(tempGadget, StringField(gadgetText, textIndex, " "))
EndIf
If textIndexWidth > gadgetWt
textIndexWidth = GadgetWidth(tempGadget, #PB_Gadget_RequiredSize) - 2
Else
textIndexWidth = 0
EndIf
Else
spacer$ = " "
If textIndex = CountString(gadgetText, " ")
lines + 1
EndIf
EndIf
Next textIndex
gadgetHt * lines
ResizeGadget(gadgetNo, #PB_Ignore, #PB_Ignore, gadgetWt, gadgetHt)
SetGadgetText(gadgetNo, Trim(gadgetText))
FreeGadget(tempGadget)
EndProcedure
;==============================================================================================
;===========
; demo code
;===========
Enumeration
#window1
#label1
#label2
#label3
#label4
#textDemo
#left
#centre
#right
#fontName
#fontSize
#maxWidth
#results
#sample
#set
#font1
#enterKey
EndEnumeration
Declare updateTextGadget()
wFlags = #PB_Window_SystemMenu | #PB_Window_ScreenCentered
OpenWindow(#window1, #PB_Any, #PB_Any, 700, 600, "AutoSize TextGadget", wFlags)
AddKeyboardShortcut(#window1, #PB_Shortcut_Return, #enterKey)
TextGadget(#label1, 30, 20, 150, 20, "Select Font:")
TextGadget(#label2, 190, 20, 50, 20, "Font Size:")
TextGadget(#label3, 250, 20, 40, 20, "Width:")
TextGadget(#label4, 30, 70, 200, 20, "Sample Caption:")
ComboBoxGadget(#fontName, 30, 40, 150, 20)
AddGadgetItem(#fontName, -1, "Arial")
AddGadgetItem(#fontName, -1, "Book Antiqua")
AddGadgetItem(#fontName, -1, "Century Gothic")
AddGadgetItem(#fontName, -1, "Lucida Console")
AddGadgetItem(#fontName, -1, "Tahoma")
AddGadgetItem(#fontName, -1, "Trebuchet MS")
AddGadgetItem(#fontName, -1, "Times New Roman")
SetGadgetState(#fontName, 6)
ComboBoxGadget(#fontSize, 190, 40, 50, 20)
AddGadgetItem(#fontSize, -1, "10")
AddGadgetItem(#fontSize, -1, "20")
AddGadgetItem(#fontSize, -1, "30")
AddGadgetItem(#fontSize, -1, "40")
AddGadgetItem(#fontSize, -1, "50")
AddGadgetItem(#fontSize, -1, "60")
SetGadgetState(#fontSize, 4)
StringGadget(#maxWidth, 250, 40, 40, 23, "300")
OptionGadget(#left, 30, 120, 80, 25, " left align")
OptionGadget(#centre, 120, 120, 80, 25, " centre text")
OptionGadget(#right, 222, 120, 80, 25, " right align")
SetGadgetState(#left, 1)
StringGadget(#sample, 30, 90, 200, 23, "A rose by any other name would smell as sweet.")
ButtonGadget(#set, 240, 90, 50, 23, "SET")
ListViewGadget(#results, 30, 170, 260, 400)
LoadFont(#font1, GetGadgetText(#fontName), Val(GetGadgetText(#fontSize)))
TextGadget(#textDemo, 350, 20, Val(GetGadgetText(#maxWidth)), 10, GetGadgetText(#sample))
SetGadgetFont(#textDemo, FontID(#font1))
SetGadgetColor(#textDemo, #PB_Gadget_BackColor, RGB(120, 0, 0))
SetGadgetColor(#textDemo, #PB_Gadget_FrontColor, RGB(220, 220, 0))
updateTextGadget()
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
appQuit = 1
Case #PB_Event_Menu
updateTextGadget()
Case #PB_Event_Gadget
Select EventGadget()
Case #set, #fontName, #fontSize
updateTextGadget()
Case #left, #centre, #right
Select EventGadget()
Case #left
alignFlag = 0
Case #centre
alignFlag = #PB_Text_Center
Case #right
alignFlag = #PB_Text_Right
EndSelect
updateTextGadget()
EndSelect
EndSelect
Until appQuit = 1
Procedure updateTextGadget()
Shared alignFlag
Static currentAlignment
If currentAlignment <> alignFlag
TextGadget(#textDemo, 350, 20, Val(GetGadgetText(#maxWidth)), 10, GetGadgetText(#sample), alignFlag)
SetGadgetColor(#textDemo, #PB_Gadget_BackColor, RGB(120, 0, 0))
SetGadgetColor(#textDemo, #PB_Gadget_FrontColor, RGB(220, 220, 0))
currentAlignment = alignFlag
EndIf
init = 1
fontName.s = GetGadgetText(#fontName)
fontSize = Val(GetGadgetText(#fontSize))
LoadFont(#font1, fontName, fontSize)
SetGadgetFont(#textDemo, FontID(#font1))
SetGadgetText(#textDemo, Trim(GetGadgetText(#sample)))
ResizeGadget(#textDemo, #PB_Ignore, #PB_Ignore, Val(GetGadgetText(#maxWidth)), #PB_Ignore)
AddGadgetItem(#results, 0, "initialised size: " + Str(GadgetWidth(#textDemo)) + " x " + Str(GadgetHeight(#textDemo)))
AddGadgetItem(#results, 1, "font: " + GetGadgetText(#fontName) + " @ " + GetGadgetText(#fontSize) + " points")
AutoSize(#textDemo)
AddGadgetItem(#results, 2, "--> AutoSized to: " + Str(GadgetWidth(#textDemo)) + " x " + Str(GadgetHeight(#textDemo)))
AddGadgetItem(#results, 3, " ")
SetGadgetState(#results, 2)
ExamineDesktops()
If GadgetWidth(#textDemo) > 320
wWidth = GadgetWidth(#textDemo) + 380
If wWidth > DesktopWidth(0)
wWidth = DesktopWidth(0) - 100
EndIf
Else
wWidth = 700
EndIf
If GadgetHeight(#textDemo) > 520
wHeight = GadgetHeight(#textDemo) + 40
If wHeight > DesktopHeight(0)
wHeight = DesktopHeight(0) - 100
EndIf
lHeight = wHeight - 200
Else
wHeight = 600
lHeight = 400
EndIf
winX = (DesktopWidth(0) - wWidth) / 2
winY = (DesktopHeight(0) - wHeight) / 2
ResizeWindow(#window1, winX, winY, wWidth, wHeight)
ResizeGadget(#results, #PB_Ignore, #PB_Ignore, #PB_Ignore, lHeight)
EndProcedure
Thank you.
