@@ -44,7 +44,6 @@ local screenWidth, screenHeight = guiGetScreenSize()
44
44
addEventHandler (' onClientResourceStart' , resourceRoot ,
45
45
function ()
46
46
triggerServerEvent (' onLoadedAtClient' , resourceRoot , localPlayer )
47
- InitDialogs ()
48
47
setTimer (checkTextLabels , 500 , 0 )
49
48
end ,
50
49
false
@@ -1623,56 +1622,110 @@ function TogglePlayerClock(toggle)
1623
1622
setPlayerHudComponentVisible (' clock' , toggle )
1624
1623
end
1625
1624
1626
- function createListDialog ()
1627
- listDialog = nil
1628
- listWindow = guiCreateWindow (screenWidth / 2 - 541 / 2 ,screenHeight / 2 - 352 / 2 ,541 ,352 ," " ,false )
1629
- guiWindowSetMovable (listWindow ,false )
1630
- guiWindowSetSizable (listWindow ,false )
1631
- listGrid = guiCreateGridList (0.0 , 0.1 , 1.0 , 0.8 ,true ,listWindow )
1632
- guiGridListSetSelectionMode (listGrid ,2 )
1633
- guiGridListSetScrollBars (listGrid , true , true )
1634
- guiGridListSetSortingEnabled (listGrid , false )
1635
- -- listColumn = guiGridListAddColumn(listGrid, "List", 0.85)
1636
- listButton1 = guiCreateButton (10 ,323 ,256 ,20 ," " ,false ,listWindow )
1637
- listButton2 = guiCreateButton (281 ,323 ,256 ,20 ," " ,false ,listWindow )
1638
- guiSetVisible (listWindow , false )
1639
- addEventHandler (" onClientGUIClick" , listButton1 , OnListDialogButton1Click , false )
1640
- addEventHandler (" onClientGUIClick" , listButton2 , OnListDialogButton2Click , false )
1625
+ function createListDialog (titleText , message , button1txt , button2txt )
1626
+ if listWindow ~= nil then
1627
+ removeEventHandler (" onClientGUIClick" , getRootElement (), OnListDialogButton1Click ) -- Remove handlers so they are not registered more than once
1628
+ removeEventHandler (" onClientGUIClick" , getRootElement (), OnListDialogButton2Click )
1629
+ destroyElement (listWindow ) -- Assuming inputWindow is the parent of everything, it should remove the whole hierarchy
1630
+ end
1631
+
1632
+ listDialog = nil
1633
+ listWindow = guiCreateWindow (screenWidth / 2 - 541 / 2 ,screenHeight / 2 - 352 / 2 ,541 ,352 , titleText , false )
1634
+ guiWindowSetMovable (listWindow ,false )
1635
+ guiWindowSetSizable (listWindow ,false )
1636
+ listGrid = guiCreateGridList (0.0 , 0.1 , 1.0 , 0.8 ,true ,listWindow )
1637
+ guiGridListSetSelectionMode (listGrid ,2 )
1638
+ guiGridListSetScrollBars (listGrid , true , true )
1639
+ guiGridListSetSortingEnabled (listGrid , false )
1640
+ -- listColumn = guiGridListAddColumn(listGrid, "List", 0.85)
1641
+
1642
+ local xpos = 0.0
1643
+ if # button1txt == 0 or # button2txt == 0 then
1644
+ xpos = 0.40 -- Center
1645
+ end
1646
+
1647
+ listButton1 = guiCreateButton (xpos ~= 0.0 and xpos or 0.3 , 0.9 , 0.15 , 0.1 , button1txt ,true ,listWindow )
1648
+ listButton2 = guiCreateButton (xpos ~= 0.0 and xpos or 0.5 , 0.9 , 0.15 , 0.1 , button2txt ,true ,listWindow )
1649
+
1650
+ if # button1txt == 0 then
1651
+ guiSetVisible (listButton1 , false )
1652
+ end
1653
+ if # button2txt == 0 then
1654
+ guiSetVisible (listButton2 , false )
1655
+ end
1656
+
1657
+ guiSetVisible (listWindow , false )
1658
+ addEventHandler (" onClientGUIClick" , listButton1 , OnListDialogButton1Click , false )
1659
+ addEventHandler (" onClientGUIClick" , listButton2 , OnListDialogButton2Click , false )
1660
+ return listGrid
1641
1661
end
1642
1662
1643
- function createInputDialog ()
1663
+ function createInputDialog (titleText , message , button1txt , button2txt )
1664
+ if inputWindow ~= nil then
1665
+ removeEventHandler (" onClientGUIClick" , getRootElement (), OnInputDialogButton1Click ) -- Remove handlers so they are not registered more than once
1666
+ removeEventHandler (" onClientGUIClick" , getRootElement (), OnInputDialogButton2Click )
1667
+ destroyElement (inputWindow ) -- Assuming inputWindow is the parent of everything, it should remove the whole hierarchy
1668
+ end
1644
1669
inputDialog = nil
1645
- inputWindow = guiCreateWindow (screenWidth / 2 - 541 / 2 ,screenHeight / 2 - 352 / 2 ,541 ,352 ," " , false )
1670
+ inputWindow = guiCreateWindow (screenWidth / 2 - 541 / 2 ,screenHeight / 2 - 352 / 2 ,541 ,352 , titleText , false )
1646
1671
guiWindowSetMovable (listWindow ,false )
1647
1672
guiWindowSetSizable (listWindow ,false )
1648
- inputLabel = guiCreateLabel (0.1 , 0.1 , 1.0 , 0.8 , " " , true , inputWindow )
1649
- inputEdit = guiCreateEdit (0.0 , 0.7 , 1.0 , 0.1 ," " ,true ,inputWindow )
1650
- inputButton1 = guiCreateButton (0.3 , 0.9 , 0.15 , 0.1 ," " ,true ,inputWindow ) -- x, y, width, height
1651
- inputButton2 = guiCreateButton (0.5 , 0.9 , 0.15 , 0.1 ," " ,true ,inputWindow )
1673
+ inputLabel = guiCreateColoredLabel (0.1 , 0.1 , 1.0 , 0.8 , message , inputWindow , true )
1674
+ inputEdit = guiCreateEdit (0.0 , 0.7 , 1.0 , 0.1 , " " , true , inputWindow )
1675
+
1676
+ local xpos = 0.0
1677
+ if # button1txt == 0 or # button2txt == 0 then
1678
+ xpos = 0.40 -- Center
1679
+ end
1680
+
1681
+ inputButton1 = guiCreateButton (xpos ~= 0.0 and xpos or 0.3 , 0.9 , 0.15 , 0.1 , button1txt , true ,inputWindow ) -- x, y, width, height
1682
+ inputButton2 = guiCreateButton (xpos ~= 0.0 and xpos or 0.5 , 0.9 , 0.15 , 0.1 , button2txt , true ,inputWindow )
1683
+
1684
+ if # button1txt == 0 then
1685
+ guiSetVisible (inputButton1 , false )
1686
+ end
1687
+ if # button2txt == 0 then
1688
+ guiSetVisible (inputButton2 , false )
1689
+ end
1690
+
1652
1691
guiSetVisible (inputWindow , false )
1653
1692
addEventHandler (" onClientGUIClick" , inputButton1 , OnInputDialogButton1Click , false )
1654
1693
addEventHandler (" onClientGUIClick" , inputButton2 , OnInputDialogButton2Click , false )
1655
1694
end
1656
1695
1657
- function createMessageDialog ()
1696
+ function createMessageDialog (titleText , message , button1txt , button2txt )
1697
+ if msgWindow ~= nil then
1698
+ removeEventHandler (" onClientGUIClick" , getRootElement (), OnMessageDialogButton1Click ) -- Remove handlers so they are not registered more than once
1699
+ removeEventHandler (" onClientGUIClick" , getRootElement (), OnMessageDialogButton2Click )
1700
+ destroyElement (msgWindow ) -- Assuming msgWindow is the parent of everything, it should remove the whole hierarchy
1701
+ end
1702
+
1658
1703
msgDialog = nil
1659
- msgWindow = guiCreateWindow (screenWidth / 2 - 541 / 2 ,screenHeight / 2 - 352 / 2 ,541 ,352 ," " , false )
1704
+ msgWindow = guiCreateWindow (screenWidth / 2 - 541 / 2 ,screenHeight / 2 - 352 / 2 ,541 ,352 , titleText , false )
1660
1705
guiWindowSetMovable (msgWindow ,false )
1661
1706
guiWindowSetSizable (msgWindow ,false )
1662
- msgLabel = guiCreateLabel (0.0 , 0.1 , 1.0 , 0.7 , " " , true , msgWindow )
1663
- msgButton1 = guiCreateButton (0.3 , 0.9 , 0.15 , 0.1 ," " ,true ,msgWindow ) -- x, y, width, height
1664
- msgButton2 = guiCreateButton (0.5 , 0.9 , 0.15 , 0.1 ," " ,true ,msgWindow )
1707
+ msgLabel = guiCreateColoredLabel (0.1 , 0.1 , 1.0 , 0.7 , message , msgWindow , true )
1708
+
1709
+ local xpos = 0.0
1710
+ if # button1txt == 0 or # button2txt == 0 then
1711
+ xpos = 0.40 -- Center
1712
+ end
1713
+
1714
+ msgButton1 = guiCreateButton (xpos ~= 0.0 and xpos or 0.3 , 0.9 , 0.15 , 0.1 , button1txt ,true ,msgWindow ) -- x, y, width, height
1715
+ msgButton2 = guiCreateButton (xpos ~= 0.0 and xpos or 0.5 , 0.9 , 0.15 , 0.1 , button2txt ,true ,msgWindow )
1716
+
1717
+ if # button1txt == 0 then
1718
+ guiSetVisible (msgButton1 , false )
1719
+ end
1720
+ if # button2txt == 0 then
1721
+ guiSetVisible (msgButton2 , false )
1722
+ end
1723
+
1665
1724
guiSetVisible (msgWindow , false )
1666
1725
addEventHandler (" onClientGUIClick" , msgButton1 , OnMessageDialogButton1Click , false )
1667
1726
addEventHandler (" onClientGUIClick" , msgButton2 , OnMessageDialogButton2Click , false )
1668
1727
end
1669
1728
1670
- function InitDialogs ()
1671
- createListDialog ()
1672
- createInputDialog ()
1673
- createMessageDialog ()
1674
- end
1675
-
1676
1729
function clearListItem ()
1677
1730
guiGridListRemoveColumn (listGrid , listColumn ) -- First remove the default column
1678
1731
local colAmount = guiGridListGetColumnCount (listGrid )
@@ -1745,34 +1798,92 @@ function OnMessageDialogButton2Click( button, state )
1745
1798
end
1746
1799
end
1747
1800
1801
+ -- Originally by UAEpro from here: https://forum.mtasa.com/topic/33149-colorcodes-in-labels/?tab=comments#comment-335358
1802
+ function guiCreateColoredLabel (ax , ay , bx , by ,str , parent , relative ) -- x, y, width, height
1803
+ if not relative then
1804
+ relative = true
1805
+ end
1806
+
1807
+ local scrollpane = guiCreateScrollPane (ax ,ay ,bx ,by ,relative ,parent )
1808
+ -- outputConsole('main string:' .. str)
1809
+
1810
+ local pat = " (.-)#(%x%x%x%x%x%x)"
1811
+ local s , e , cap , col = str :find (pat , 1 )
1812
+ local last = 1
1813
+ local labels = {}
1814
+ local incy = 0
1815
+ local incx = 0
1816
+ while s do
1817
+
1818
+ if cap == " " and col then r ,g ,b = tonumber (" 0x" .. col :sub (1 , 2 )), tonumber (" 0x" .. col :sub (3 , 4 )), tonumber (" 0x" .. col :sub (5 , 6 )) end
1819
+ if (s ~= 1 ) or cap ~= " " then
1820
+ -- outputConsole('guiCreateColoredLabel: ' .. cap)
1821
+
1822
+ lbl = guiCreateLabel (ax + incx , ay + incy , 1.0 , by , cap , relative , scrollpane )
1823
+ guiLabelSetHorizontalAlign (lbl , " left" )
1824
+ table.insert (labels , lbl )
1825
+ if (r == nil ) then r = 255 end
1826
+ if (g == nil ) then g = 255 end
1827
+ if (b == nil ) then b = 255 end
1828
+ guiLabelSetColor (lbl ,r ,g ,b )
1829
+ r ,g ,b = tonumber (" 0x" .. col :sub (1 , 2 )), tonumber (" 0x" .. col :sub (3 , 4 )), tonumber (" 0x" .. col :sub (5 , 6 ))
1830
+
1831
+ local match = cap :find (" \n " )
1832
+ if match ~= nil then
1833
+ local xtxtsize , ytxtsize = guiGetSize (lbl , true ) -- not relative
1834
+ incy = incy + (ytxtsize / 8 ) -- We found a /n so send it further down on the next line
1835
+ incx = 0 -- Don't add spaces on new lines
1836
+ -- outputConsole('found a new line')
1837
+ else
1838
+ if r ~= 255 or g ~= 255 or b ~= 255 then -- It's colored so separate it
1839
+ incy = 0
1840
+ local xsize , ysize = guiGetSize (scrollpane , false ) -- not relative
1841
+ incx = incx + (guiLabelGetTextExtent ( lbl ) / xsize ) -- Make space for the next word, relative to the parent width
1842
+ -- outputConsole('Separating string')
1843
+ else
1844
+ incy = 0
1845
+ incx = 0
1846
+ end
1847
+ end
1848
+ end
1849
+ last = e + 1
1850
+ s , e , cap , col = str :find (pat , last )
1851
+ end
1852
+ if (last <= # str ) then
1853
+ cap = str :sub (last )
1854
+ lbl2 = guiCreateLabel (ax + incx , ay + incy , 1.0 , by , cap , relative , scrollpane )
1855
+ table.insert (labels , lbl2 )
1856
+ guiLabelSetColor (lbl2 ,r ,g ,b )
1857
+ end
1858
+ return labels
1859
+ end
1860
+
1861
+ -- replace colors
1862
+ function colorizeString (string )
1863
+ return string :gsub (" (=?{[0-9A-Fa-f]*})" ,
1864
+ function (colorMatches )
1865
+ colorMatches = colorMatches :gsub (" [{}]+" , " " ) -- replace the curly brackets with nothing
1866
+ colorMatches = ' #' .. colorMatches -- Append to the beginning
1867
+ return colorMatches
1868
+ end )
1869
+ end
1748
1870
1749
1871
function ShowPlayerDialog (dialogid , dialogtype , caption , info , button1 , button2 )
1872
+ showCursor (true )
1750
1873
if dialogtype == 0 then
1751
- guiSetText (msgButton1 , button1 )
1752
- guiSetText (msgButton2 , button2 )
1753
- guiSetText (msgWindow , caption )
1754
- guiSetText (msgLabel , info )
1874
+ createMessageDialog (caption , colorizeString (info ), button1 , button2 )
1755
1875
guiSetVisible (msgWindow , true )
1756
1876
msgDialog = dialogid
1757
- showCursor (true )
1758
1877
elseif dialogtype == 1 or dialogtype == 3 then
1759
- guiSetText (inputButton1 , button1 )
1760
- guiSetText (inputButton2 , button2 )
1761
- guiSetText (inputWindow , caption )
1762
- guiSetText (inputEdit , " " )
1878
+ createInputDialog (caption , colorizeString (info ), button1 , button2 )
1763
1879
guiEditSetMasked (inputEdit , dialogtype == 3 )
1764
- guiSetText (inputLabel , info )
1765
1880
guiSetVisible (inputWindow , true )
1766
1881
inputDialog = dialogid
1767
- showCursor (true )
1768
1882
elseif dialogtype == 2 or dialogtype == 4 or dialogtype == 5 then -- DIALOG_STYLE_LIST, DIALOG_STYLE_TABLIST, DIALOG_STYLE_TABLIST_HEADER
1769
1883
-- Setup the UI
1770
- guiSetText (listButton1 , button1 )
1771
- guiSetText (listButton2 , button2 )
1772
- guiSetText (listWindow , caption )
1884
+ createListDialog (caption , colorizeString (info ), button1 , button2 )
1773
1885
guiSetVisible (listWindow , true )
1774
1886
listDialog = dialogid
1775
- showCursor (true )
1776
1887
-- Done
1777
1888
1778
1889
-- Process each
0 commit comments