Mercurial > wow > askmrrobot
comparison Libs/AceGUI-3.0/AceGUI-3.0.lua @ 124:e31b02b24488
Updated for 8.0 pre-patch and BfA.
author | yellowfive |
---|---|
date | Tue, 17 Jul 2018 09:57:39 -0700 |
parents | 01b63b8ed811 |
children |
comparison
equal
deleted
inserted
replaced
123:7a6364917f86 | 124:e31b02b24488 |
---|---|
22 -- btn:SetCallback("OnClick", function() print("Click!") end) | 22 -- btn:SetCallback("OnClick", function() print("Click!") end) |
23 -- -- Add the button to the container | 23 -- -- Add the button to the container |
24 -- f:AddChild(btn) | 24 -- f:AddChild(btn) |
25 -- @class file | 25 -- @class file |
26 -- @name AceGUI-3.0 | 26 -- @name AceGUI-3.0 |
27 -- @release $Id: AceGUI-3.0.lua 1102 2013-10-25 14:15:23Z nevcairiel $ | 27 -- @release $Id: AceGUI-3.0.lua 1177 2018-06-25 12:12:48Z nevcairiel $ |
28 local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 34 | 28 local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 36 |
29 local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR) | 29 local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR) |
30 | 30 |
31 if not AceGUI then return end -- No upgrade needed | 31 if not AceGUI then return end -- No upgrade needed |
32 | 32 |
33 -- Lua APIs | 33 -- Lua APIs |
809 end | 809 end |
810 | 810 |
811 height = height + rowheight + 3 | 811 height = height + rowheight + 3 |
812 safecall(content.obj.LayoutFinished, content.obj, nil, height) | 812 safecall(content.obj.LayoutFinished, content.obj, nil, height) |
813 end) | 813 end) |
814 | |
815 -- Get alignment method and value. Possible alignment methods are a callback, a number, "start", "middle", "end", "fill" or "TOPLEFT", "BOTTOMRIGHT" etc. | |
816 local GetCellAlign = function (dir, tableObj, colObj, cellObj, cell, child) | |
817 local fn = cellObj and (cellObj["align" .. dir] or cellObj.align) | |
818 or colObj and (colObj["align" .. dir] or colObj.align) | |
819 or tableObj["align" .. dir] or tableObj.align | |
820 or "CENTERLEFT" | |
821 local child, cell, val = child or 0, cell or 0, nil | |
822 | |
823 if type(fn) == "string" then | |
824 fn = fn:lower() | |
825 fn = dir == "V" and (fn:sub(1, 3) == "top" and "start" or fn:sub(1, 6) == "bottom" and "end" or fn:sub(1, 6) == "center" and "middle") | |
826 or dir == "H" and (fn:sub(-4) == "left" and "start" or fn:sub(-5) == "right" and "end" or fn:sub(-6) == "center" and "middle") | |
827 or fn | |
828 val = (fn == "start" or fn == "fill") and 0 or fn == "end" and cell - child or (cell - child) / 2 | |
829 elseif type(fn) == "function" then | |
830 val = fn(child or 0, cell, dir) | |
831 else | |
832 val = fn | |
833 end | |
834 | |
835 return fn, max(0, min(val, cell)) | |
836 end | |
837 | |
838 -- Get width or height for multiple cells combined | |
839 local GetCellDimension = function (dir, laneDim, from, to, space) | |
840 local dim = 0 | |
841 for cell=from,to do | |
842 dim = dim + (laneDim[cell] or 0) | |
843 end | |
844 return dim + max(0, to - from) * (space or 0) | |
845 end | |
846 | |
847 --[[ Options | |
848 ============ | |
849 Container: | |
850 - columns ({col, col, ...}): Column settings. "col" can be a number (<= 0: content width, <1: rel. width, <10: weight, >=10: abs. width) or a table with column setting. | |
851 - space, spaceH, spaceV: Overall, horizontal and vertical spacing between cells. | |
852 - align, alignH, alignV: Overall, horizontal and vertical cell alignment. See GetCellAlign() for possible values. | |
853 Columns: | |
854 - width: Fixed column width (nil or <=0: content width, <1: rel. width, >=1: abs. width). | |
855 - min or 1: Min width for content based width | |
856 - max or 2: Max width for content based width | |
857 - weight: Flexible column width. The leftover width after accounting for fixed-width columns is distributed to weighted columns according to their weights. | |
858 - align, alignH, alignV: Overwrites the container setting for alignment. | |
859 Cell: | |
860 - colspan: Makes a cell span multiple columns. | |
861 - rowspan: Makes a cell span multiple rows. | |
862 - align, alignH, alignV: Overwrites the container and column setting for alignment. | |
863 ]] | |
864 AceGUI:RegisterLayout("Table", | |
865 function (content, children) | |
866 local obj = content.obj | |
867 obj:PauseLayout() | |
868 | |
869 local tableObj = obj:GetUserData("table") | |
870 local cols = tableObj.columns | |
871 local spaceH = tableObj.spaceH or tableObj.space or 0 | |
872 local spaceV = tableObj.spaceV or tableObj.space or 0 | |
873 local totalH = (content:GetWidth() or content.width or 0) - spaceH * (#cols - 1) | |
874 | |
875 -- We need to reuse these because layout events can come in very frequently | |
876 local layoutCache = obj:GetUserData("layoutCache") | |
877 if not layoutCache then | |
878 layoutCache = {{}, {}, {}, {}, {}, {}} | |
879 obj:SetUserData("layoutCache", layoutCache) | |
880 end | |
881 local t, laneH, laneV, rowspans, rowStart, colStart = unpack(layoutCache) | |
882 | |
883 -- Create the grid | |
884 local n, slotFound = 0 | |
885 for i,child in ipairs(children) do | |
886 if child:IsShown() then | |
887 repeat | |
888 n = n + 1 | |
889 local col = (n - 1) % #cols + 1 | |
890 local row = ceil(n / #cols) | |
891 local rowspan = rowspans[col] | |
892 local cell = rowspan and rowspan.child or child | |
893 local cellObj = cell:GetUserData("cell") | |
894 slotFound = not rowspan | |
895 | |
896 -- Rowspan | |
897 if not rowspan and cellObj and cellObj.rowspan then | |
898 rowspan = {child = child, from = row, to = row + cellObj.rowspan - 1} | |
899 rowspans[col] = rowspan | |
900 end | |
901 if rowspan and i == #children then | |
902 rowspan.to = row | |
903 end | |
904 | |
905 -- Colspan | |
906 local colspan = max(0, min((cellObj and cellObj.colspan or 1) - 1, #cols - col)) | |
907 n = n + colspan | |
908 | |
909 -- Place the cell | |
910 if not rowspan or rowspan.to == row then | |
911 t[n] = cell | |
912 rowStart[cell] = rowspan and rowspan.from or row | |
913 colStart[cell] = col | |
914 | |
915 if rowspan then | |
916 rowspans[col] = nil | |
917 end | |
918 end | |
919 until slotFound | |
920 end | |
921 end | |
922 | |
923 local rows = ceil(n / #cols) | |
924 | |
925 -- Determine fixed size cols and collect weights | |
926 local extantH, totalWeight = totalH, 0 | |
927 for col,colObj in ipairs(cols) do | |
928 laneH[col] = 0 | |
929 | |
930 if type(colObj) == "number" then | |
931 colObj = {[colObj >= 1 and colObj < 10 and "weight" or "width"] = colObj} | |
932 cols[col] = colObj | |
933 end | |
934 | |
935 if colObj.weight then | |
936 -- Weight | |
937 totalWeight = totalWeight + (colObj.weight or 1) | |
938 else | |
939 if not colObj.width or colObj.width <= 0 then | |
940 -- Content width | |
941 for row=1,rows do | |
942 local child = t[(row - 1) * #cols + col] | |
943 if child then | |
944 local f = child.frame | |
945 f:ClearAllPoints() | |
946 local childH = f:GetWidth() or 0 | |
947 | |
948 laneH[col] = max(laneH[col], childH - GetCellDimension("H", laneH, colStart[child], col - 1, spaceH)) | |
949 end | |
950 end | |
951 | |
952 laneH[col] = max(colObj.min or colObj[1] or 0, min(laneH[col], colObj.max or colObj[2] or laneH[col])) | |
953 else | |
954 -- Rel./Abs. width | |
955 laneH[col] = colObj.width < 1 and colObj.width * totalH or colObj.width | |
956 end | |
957 extantH = max(0, extantH - laneH[col]) | |
958 end | |
959 end | |
960 | |
961 -- Determine sizes based on weight | |
962 local scale = totalWeight > 0 and extantH / totalWeight or 0 | |
963 for col,colObj in pairs(cols) do | |
964 if colObj.weight then | |
965 laneH[col] = scale * colObj.weight | |
966 end | |
967 end | |
968 | |
969 -- Arrange children | |
970 for row=1,rows do | |
971 local rowV = 0 | |
972 | |
973 -- Horizontal placement and sizing | |
974 for col=1,#cols do | |
975 local child = t[(row - 1) * #cols + col] | |
976 if child then | |
977 local colObj = cols[colStart[child]] | |
978 local cellObj = child:GetUserData("cell") | |
979 local offsetH = GetCellDimension("H", laneH, 1, colStart[child] - 1, spaceH) + (colStart[child] == 1 and 0 or spaceH) | |
980 local cellH = GetCellDimension("H", laneH, colStart[child], col, spaceH) | |
981 | |
982 local f = child.frame | |
983 f:ClearAllPoints() | |
984 local childH = f:GetWidth() or 0 | |
985 | |
986 local alignFn, align = GetCellAlign("H", tableObj, colObj, cellObj, cellH, childH) | |
987 f:SetPoint("LEFT", content, offsetH + align, 0) | |
988 if child:IsFullWidth() or alignFn == "fill" or childH > cellH then | |
989 f:SetPoint("RIGHT", content, "LEFT", offsetH + align + cellH, 0) | |
990 end | |
991 | |
992 if child.DoLayout then | |
993 child:DoLayout() | |
994 end | |
995 | |
996 rowV = max(rowV, (f:GetHeight() or 0) - GetCellDimension("V", laneV, rowStart[child], row - 1, spaceV)) | |
997 end | |
998 end | |
999 | |
1000 laneV[row] = rowV | |
1001 | |
1002 -- Vertical placement and sizing | |
1003 for col=1,#cols do | |
1004 local child = t[(row - 1) * #cols + col] | |
1005 if child then | |
1006 local colObj = cols[colStart[child]] | |
1007 local cellObj = child:GetUserData("cell") | |
1008 local offsetV = GetCellDimension("V", laneV, 1, rowStart[child] - 1, spaceV) + (rowStart[child] == 1 and 0 or spaceV) | |
1009 local cellV = GetCellDimension("V", laneV, rowStart[child], row, spaceV) | |
1010 | |
1011 local f = child.frame | |
1012 local childV = f:GetHeight() or 0 | |
1013 | |
1014 local alignFn, align = GetCellAlign("V", tableObj, colObj, cellObj, cellV, childV) | |
1015 if child:IsFullHeight() or alignFn == "fill" then | |
1016 f:SetHeight(cellV) | |
1017 end | |
1018 f:SetPoint("TOP", content, 0, -(offsetV + align)) | |
1019 end | |
1020 end | |
1021 end | |
1022 | |
1023 -- Calculate total height | |
1024 local totalV = GetCellDimension("V", laneV, 1, #laneV, spaceV) | |
1025 | |
1026 -- Cleanup | |
1027 for _,v in pairs(layoutCache) do wipe(v) end | |
1028 | |
1029 safecall(obj.LayoutFinished, obj, nil, totalV) | |
1030 obj:ResumeLayout() | |
1031 end) |