Mercurial > wow > reaction
comparison modules/Action.lua @ 121:fb6c3a642ae3
Added proper vehicle bar support. The exit-vehicle button is a little kludgy, needs to be cleaned up later.
| author | Flick <flickerstreak@gmail.com> |
|---|---|
| date | Mon, 09 Feb 2009 19:02:58 +0000 |
| parents | fb48811a8736 |
| children | 729232aeeb5e |
comparison
equal
deleted
inserted
replaced
| 120:320a93c5f72c | 121:fb6c3a642ae3 |
|---|---|
| 191 type = "toggle", | 191 type = "toggle", |
| 192 width = "double", | 192 width = "double", |
| 193 set = "SetMindControl", | 193 set = "SetMindControl", |
| 194 get = "GetMindControl", | 194 get = "GetMindControl", |
| 195 }, | 195 }, |
| 196 vehicle = { | |
| 197 name = L["Vehicle Support"], | |
| 198 desc = L["When on a vehicle, map the first 6 buttons of this bar to the vehicle actions. The vehicle-exit button is mapped to the 7th button. Pitch controls are not supported."], | |
| 199 order = 6, | |
| 200 type = "toggle", | |
| 201 width = "double", | |
| 202 get = "GetVehicle", | |
| 203 set = "SetVehicle", | |
| 204 }, | |
| 196 actions = { | 205 actions = { |
| 197 name = L["Edit Action IDs"], | 206 name = L["Edit Action IDs"], |
| 198 order = 6, | 207 order = 7, |
| 199 type = "group", | 208 type = "group", |
| 200 inline = true, | 209 inline = true, |
| 201 args = { | 210 args = { |
| 202 method = { | 211 method = { |
| 203 name = L["Assign"], | 212 name = L["Assign"], |
| 315 local f = self.bar:GetFrame() | 324 local f = self.bar:GetFrame() |
| 316 for _, b in ipairs(self.btns) do | 325 for _, b in ipairs(self.btns) do |
| 317 b:Refresh() | 326 b:Refresh() |
| 318 end | 327 end |
| 319 f:SetAttribute("mindcontrol",self.config.mindcontrol) | 328 f:SetAttribute("mindcontrol",self.config.mindcontrol) |
| 329 f:SetAttribute("vehicle",self.config.vehicle) | |
| 320 f:Execute( | 330 f:Execute( |
| 321 [[ | 331 [[ |
| 322 doMindControl = self:GetAttribute("mindcontrol") | 332 doMindControl = self:GetAttribute("mindcontrol") |
| 333 doVehicle = self:GetAttribute("vehicle") | |
| 323 control:ChildUpdate() | 334 control:ChildUpdate() |
| 324 ]]) | 335 ]]) |
| 325 | 336 |
| 326 f:SetAttribute("_onstate-mindcontrol", | 337 f:SetAttribute("_onstate-mc", |
| 327 -- function _onstate-mindcontrol(self, stateid, newstate) | 338 -- function _onstate-mc(self, stateid, newstate) |
| 328 [[ | 339 [[ |
| 340 local oldMcVehicleState = mcVehicleState | |
| 341 mcVehicleState = newstate | |
| 329 control:ChildUpdate() | 342 control:ChildUpdate() |
| 343 if oldMcVehicleState == "vehicle" or mcVehicleState == "vehicle" then | |
| 344 control:ChildUpdate("vehicle") | |
| 345 end | |
| 330 ]]) | 346 ]]) |
| 331 RegisterStateDriver(f, "mindcontrol", "[bonusbar:5] mc; none") | 347 RegisterStateDriver(f, "mc", "[target=vehicle,exists] vehicle; [bonusbar:5] mc; none") |
| 348 | |
| 332 self:UpdateButtonLock() | 349 self:UpdateButtonLock() |
| 333 end | 350 end |
| 334 | 351 |
| 335 function Handle:Destroy() | 352 function Handle:Destroy() |
| 336 for _,b in pairs(self.btns) do | 353 for _,b in pairs(self.btns) do |
| 434 return self.config.mindcontrol | 451 return self.config.mindcontrol |
| 435 end | 452 end |
| 436 | 453 |
| 437 function Handle:SetMindControl(info, value) | 454 function Handle:SetMindControl(info, value) |
| 438 self.config.mindcontrol = value | 455 self.config.mindcontrol = value |
| 456 self:Refresh() | |
| 457 end | |
| 458 | |
| 459 function Handle:GetVehicle() | |
| 460 return self.config.vehicle | |
| 461 end | |
| 462 | |
| 463 function Handle:SetVehicle(info, value) | |
| 464 self.config.vehicle = value | |
| 439 self:Refresh() | 465 self:Refresh() |
| 440 end | 466 end |
| 441 | 467 |
| 442 function Handle:GetActionEditMethod() | 468 function Handle:GetActionEditMethod() |
| 443 return self.editMethod or 0 | 469 return self.editMethod or 0 |
| 756 end | 782 end |
| 757 | 783 |
| 758 ------ Button class ------ | 784 ------ Button class ------ |
| 759 local frameRecycler = { } | 785 local frameRecycler = { } |
| 760 local trash = CreateFrame("Frame") | 786 local trash = CreateFrame("Frame") |
| 761 local OnUpdate, KBAttach, GetHotkey | 787 local OnUpdate, GetActionName, GetHotkey |
| 762 do | 788 do |
| 763 local ATTACK_BUTTON_FLASH_TIME = ATTACK_BUTTON_FLASH_TIME | 789 local ATTACK_BUTTON_FLASH_TIME = ATTACK_BUTTON_FLASH_TIME |
| 764 local IsActionInRange = IsActionInRange | 790 local IsActionInRange = IsActionInRange |
| 765 | 791 |
| 766 function OnUpdate(frame, elapsed) | 792 function OnUpdate(frame, elapsed) |
| 797 frame.rangeTimer = 0.1 | 823 frame.rangeTimer = 0.1 |
| 798 end | 824 end |
| 799 end | 825 end |
| 800 end | 826 end |
| 801 | 827 |
| 802 local function GetActionName(f) | 828 function GetActionName(f) |
| 803 local b = f and f._reactionButton | 829 local b = f and f._reactionButton |
| 804 if b then | 830 if b then |
| 805 return format("%s:%s", b.bar:GetName(), b.idx) | 831 return format("%s:%s", b.bar:GetName(), b.idx) |
| 806 end | 832 end |
| 807 end | 833 end |
| 808 | 834 |
| 809 function GetHotkey(f) | 835 function GetHotkey(f) |
| 810 return KB:ToShortKey(GetBindingKey(format("CLICK %s:LeftButton",f:GetName()))) | 836 return KB:ToShortKey(GetBindingKey(format("CLICK %s:LeftButton",f:GetName()))) |
| 811 end | |
| 812 | |
| 813 local function kb_onEnter( self ) | |
| 814 if ReAction:GetKeybindMode() then | |
| 815 KB:Set(self) | |
| 816 end | |
| 817 end | |
| 818 | |
| 819 function KBAttach( button ) | |
| 820 if not button.kbHooked then | |
| 821 button.kbHooked = true | |
| 822 local f = button:GetFrame() | |
| 823 f:HookScript("OnEnter", kb_onEnter) | |
| 824 f.GetActionName = GetActionName | |
| 825 f.GetHotkey = GetHotkey | |
| 826 end | |
| 827 end | 837 end |
| 828 | 838 |
| 829 -- This is a bit hokey : install a bare hook on ActionButton_UpdateHotkey because | 839 -- This is a bit hokey : install a bare hook on ActionButton_UpdateHotkey because |
| 830 -- even though it's secure it's never called in a way that can cause taint. This is | 840 -- even though it's secure it's never called in a way that can cause taint. This is |
| 831 -- for performance reasons to avoid having to hook frame:OnEvent securely. | 841 -- for performance reasons to avoid having to hook frame:OnEvent securely. |
| 892 | 902 |
| 893 f:SetAttribute("action", config.actionID) | 903 f:SetAttribute("action", config.actionID) |
| 894 f:SetAttribute("default-action", config.actionID) | 904 f:SetAttribute("default-action", config.actionID) |
| 895 -- install mind control actions for all buttons just for simplicity | 905 -- install mind control actions for all buttons just for simplicity |
| 896 if self.idx <= 12 then | 906 if self.idx <= 12 then |
| 897 f:SetAttribute("mindcontrol-action", 120 + self.idx) | 907 f:SetAttribute("mc-action", 120 + self.idx) |
| 898 end | 908 end |
| 909 | |
| 910 -- set a tooltip onEnter | |
| 911 f:SetScript("OnEnter", | |
| 912 function(frame) | |
| 913 if ReAction:GetKeybindMode() then | |
| 914 KB:Set(frame) | |
| 915 elseif frame.vehicleExitMode then | |
| 916 GameTooltip_AddNewbieTip(frame, LEAVE_VEHICLE, 1.0, 1.0, 1.0, nil); | |
| 917 else | |
| 918 ActionButton_SetTooltip(frame) | |
| 919 end | |
| 920 end) | |
| 899 | 921 |
| 900 -- set a _childupdate handler, called within the header's context | 922 -- set a _childupdate handler, called within the header's context |
| 901 f:SetAttribute("_childupdate", | 923 f:SetAttribute("_childupdate", |
| 902 -- function _childupdate(self, snippetid, message) | 924 -- function _childupdate(self, snippetid, message) |
| 903 [[ | 925 [[ |
| 904 local action = "default-action" | 926 local action = "default-action" |
| 905 if doMindControl and GetBonusBarOffset() == 5 then | 927 if (doVehicle and mcVehicleState == "vehicle") or |
| 906 action = "mindcontrol-action" | 928 (doMindControl and mcVehicleState == "mc") then |
| 929 action = "mc-action" | |
| 907 elseif page and state and page[state] then | 930 elseif page and state and page[state] then |
| 908 action = "action-"..page[state] | 931 action = "action-"..page[state] |
| 909 end | 932 end |
| 933 | |
| 910 local value = self:GetAttribute(action) | 934 local value = self:GetAttribute(action) |
| 911 if value then | 935 if value then |
| 912 self:SetAttribute("action",value) | 936 self:SetAttribute("action",value) |
| 913 end | 937 end |
| 914 ]]) | 938 ]]) |
| 939 | |
| 940 -- Install a handler for the 7th button (only) to show/hide a | |
| 941 -- vehicle exit button. This is more than a little bit hack-ish and | |
| 942 -- will be replaced in the next iteration with the reimplementation | |
| 943 -- of action button functionality. | |
| 944 if idx == 7 then | |
| 945 local barFrame = bar:GetFrame() | |
| 946 function barFrame:ShowVehicleExit(show) | |
| 947 local tx = f.vehicleExitTexture | |
| 948 if show then | |
| 949 if not tx then | |
| 950 tx = f:CreateTexture(nil,"ARTWORK") | |
| 951 tx:SetAllPoints() | |
| 952 -- copied from Blizzard/VehicleMenuBar.lua SkinsData | |
| 953 tx:SetTexture("Interface\\Vehicles\\UI-Vehicles-Button-Exit-Up") | |
| 954 tx:SetTexCoord(0.140625, 0.859375, 0.140625, 0.859375) | |
| 955 f.vehicleExitTexture = tx | |
| 956 end | |
| 957 tx:Show() | |
| 958 f.vehicleExitMode = true | |
| 959 elseif tx then | |
| 960 tx:SetTexCoord(0,1,0,1) | |
| 961 tx:Hide() | |
| 962 f.vehicleExitMode = false | |
| 963 end | |
| 964 end | |
| 965 | |
| 966 f:SetAttribute("macrotext","/run VehicleExit()") | |
| 967 f:SetAttribute("_childupdate-vehicle", | |
| 968 -- function _childupdate-vehicle(self, snippetid, message) | |
| 969 [[ | |
| 970 local show = (mcVehicleState == "vehicle") | |
| 971 if show then | |
| 972 self:SetAttribute("type","macro") | |
| 973 self:SetAttribute("showgrid",self:GetAttribute("showgrid")+1) | |
| 974 self:Show() | |
| 975 else | |
| 976 self:SetAttribute("type","action") | |
| 977 local showgrid = self:GetAttribute("showgrid") | |
| 978 showgrid = showgrid - 1 | |
| 979 if showgrid < 0 then showgrid = 0 end | |
| 980 self:SetAttribute("showgrid",self:GetAttribute("showgrid")-1) | |
| 981 if showgrid <= 0 then | |
| 982 self:Hide() | |
| 983 end | |
| 984 end | |
| 985 control:CallMethod("ShowVehicleExit",show) | |
| 986 ]]) | |
| 987 end | |
| 915 | 988 |
| 916 -- install drag wrappers to lock buttons | 989 -- install drag wrappers to lock buttons |
| 917 bar:GetFrame():WrapScript(f, "OnDragStart", | 990 bar:GetFrame():WrapScript(f, "OnDragStart", |
| 918 -- OnDragStart(self, button, kind, value, ...) | 991 -- OnDragStart(self, button, kind, value, ...) |
| 919 [[ | 992 [[ |
| 952 local f = self.frame | 1025 local f = self.frame |
| 953 f:UnregisterAllEvents() | 1026 f:UnregisterAllEvents() |
| 954 f:Hide() | 1027 f:Hide() |
| 955 f:SetParent(UIParent) | 1028 f:SetParent(UIParent) |
| 956 f:ClearAllPoints() | 1029 f:ClearAllPoints() |
| 1030 f:SetAttribute("_childupdate",nil) | |
| 1031 f:SetAttribute("_childupdate-vehicle",nil) | |
| 957 if self.name then | 1032 if self.name then |
| 958 frameRecycler[self.name] = f | 1033 frameRecycler[self.name] = f |
| 959 end | 1034 end |
| 960 if self.config.actionID then | 1035 if self.config.actionID then |
| 961 IDAlloc:Release(self.config.actionID) | 1036 IDAlloc:Release(self.config.actionID) |
| 1109 end | 1184 end |
| 1110 end | 1185 end |
| 1111 | 1186 |
| 1112 function Button:SetKeybindMode( mode ) | 1187 function Button:SetKeybindMode( mode ) |
| 1113 if mode then | 1188 if mode then |
| 1114 KBAttach( self ) | 1189 self.frame.GetActionName = GetActionName |
| 1190 self.frame.GetHotkey = GetHotkey | |
| 1115 -- set the border for all buttons to the keybind-enable color | 1191 -- set the border for all buttons to the keybind-enable color |
| 1116 self.border:SetVertexColor(KB:GetColorKeyBoundMode()) | 1192 self.border:SetVertexColor(KB:GetColorKeyBoundMode()) |
| 1117 self.border:Show() | 1193 self.border:Show() |
| 1118 elseif IsEquippedAction(self:GetActionID()) then | 1194 elseif IsEquippedAction(self:GetActionID()) then |
| 1119 self.border:SetVertexColor(0, 1.0, 0, 0.35) -- from ActionButton.lua | 1195 self.border:SetVertexColor(0, 1.0, 0, 0.35) -- from ActionButton.lua |
