---------------------------------------------------------------------------------------
-- NxFav - Favorites window
-- Copyright 2008-2012 Carbon Based Creations, LLC
---------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------
-- Carbonite - Addon for World of Warcraft(tm)
-- Copyright 2007-2012 Carbon Based Creations, LLC
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
---------------------------------------------------------------------------------------
--------
function Nx.Fav:Init()
self.Folders = Nx.GetFav()
--[[
local def = { "Default", "Quests" }
for k, name in ipairs (def) do
local found
for k, folder in ipairs (self.Folders) do
if folder["T"] == "F" then
if folder["Name"] == name then
found = true
end
end
end
if not found then
local folder = self:AddFolder (name)
end
end
--]]
self.NoteIcons = { "Star", "Circle", "Diamond", "Triangle", "Moon", "Square", "Cross", "Skull" }
end
function Nx.Fav:GetIconInline (index)
local file = "Interface\\TargetingFrame\\UI-RaidTargetingIcon_" .. index
return format ("|T%s:16|t", file)
end
function Nx.Fav:GetIconFile (index)
return "Interface\\TargetingFrame\\UI-RaidTargetingIcon_" .. index
end
--------
-- Create favorites window
function Nx.Fav:Create()
self.Side = 1
-- Create Window
local win = Nx.Window:Create ("NxFav", 240, nil, nil, 1)
self.Win = win
win.Frm.NxInst = self
win:CreateButtons (true, true)
win:SetTitleLineH (18)
win:SetTitleXOff (220)
win:InitLayoutData (nil, -.23, -.25, -.54, -.5)
win.Frm:SetToplevel (true)
win:Show (false)
tinsert (UISpecialFrames, win.Frm:GetName())
-- Buttons
local bw, bh = win:GetBorderSize()
local but = Nx.Button:Create (win.Frm, "Txt64B", "Record", nil, bw + 1, -bh, "TOPLEFT", 44, 20, self.But_OnRecord, self)
self.RecBut = but
local but = Nx.Button:Create (win.Frm, "Txt64", "Up", nil, bw + 48, -bh, "TOPLEFT", 40, 20, self.But_OnUp, self)
local but = Nx.Button:Create (but.Frm, "Txt64", "Down", nil, 42, 0, "TOPLEFT", 40, 20, self.But_OnDown, self)
Nx.Button:Create (but.Frm, "Txt64", "Delete Item", nil, 54, 0, "TOPLEFT", 72, 20, self.But_OnItemDel, self)
-- Folder List
Nx.List:SetCreateFont ("FontM", 16)
local list = Nx.List:Create ("FavF", 0, 0, 1, 1, win.Frm)
self.List = list
list:SetUser (self, self.OnListEvent)
list:SetLineHeight (4)
list:ColumnAdd ("", 1, 20)
list:ColumnAdd ("Name", 2, 900)
win:Attach (list.Frm, 0, .3, 0, 1)
-- Item List
Nx.List:SetCreateFont ("FontM", 16)
local list = Nx.List:Create ("FavI", 0, 0, 1, 1, win.Frm)
self.ItemList = list
list:SetUser (self, self.OnItemListEvent)
list:SetLineHeight (2)
list:ColumnAdd ("", 1, 17)
list:ColumnAdd ("Type", 2, 90)
list:ColumnAdd ("Value", 3, 250)
list:ColumnAdd ("Location", 4, 900)
win:Attach (list.Frm, .3, 1, 0, 1) -- 18, 1 with editbox
-- Filter Edit Box
-- self.EditBox = Nx.EditBox:Create (win.Frm, self, self.OnEditBox, 30)
-- win:Attach (self.EditBox.Frm, .3, 1, 0, 18)
--
self:CreateMenu()
--
self:Update()
self.List:FullUpdate()
end
--------
function Nx.Fav:But_OnRecord (but)
self:SetRecord (but:GetPressed())
end
function Nx.Fav:SetRecord (on)
local but = self.RecBut
if on then
if self.CurFav then
self.Recording = self.CurFav
self.RecAlphaAnim = 1000
Nx.Timer:Start ("FavRec", 0, self, self.RecordAnimTimer)
but:SetPressed (true)
else
Nx.prt ("Select a favorite before recording")
but:SetPressed (false)
end
else
self.Recording = nil
but:SetAlpha (1)
but:SetPressed (false)
end
end
function Nx.Fav:RecordAnimTimer()
if self.Recording then
local a = (self.RecAlphaAnim - 35) % 1000
self.RecAlphaAnim = a
self.RecBut:SetAlpha (abs (a - 500) / 1000 + .5)
return .05
end
end
function Nx.Fav:But_OnUp()
self:MoveCur (true)
end
function Nx.Fav:But_OnDown()
self:MoveCur()
end
function Nx.Fav:MoveCur (low)
if self.Side == 1 then
local item = self.CurFavOrFolder
if item then
local parent = self:GetParent (item)
Nx.Util_TMoveItem (parent, item, low)
local i = self:FindListI (item)
if i > 0 then
self.List:Select (i + 1) -- Add one for "Root" entry
end
end
else
local fav = self.CurFav
if fav and self.CurItemI then
local i = Nx.Util_TMoveI (fav, self.CurItemI, low)
if i then
self.CurItemI = i
self.ItemList:Select (i)
end
end
end
self:Update()
end
function Nx.Fav:But_OnItemDel()
local fav = self.CurFav
if fav and self.CurItemI then
if fav[self.CurItemI] then
tremove (fav, self.CurItemI)
end
end
self:Update()
end
--------
-- Create menu
function Nx.Fav:CreateMenu()
local menu = Nx.Menu:Create (self.List.Frm, 250)
self.Menu = menu
menu:AddItem (0, "Add Folder", self.Menu_OnAddFolder, self)
menu:AddItem (0, "Add Favorite", self.Menu_OnAddFavorite, self)
menu:AddItem (0, "")
menu:AddItem (0, "Rename", self.Menu_OnRename, self)
menu:AddItem (0, "Cut", self.Menu_OnCut, self)
menu:AddItem (0, "Copy", self.Menu_OnCopy, self)
menu:AddItem (0, "Paste", self.Menu_OnPaste, self)
local function func()
Nx.Opts:Open ("Favorites")
end
menu:AddItem (0, "")
menu:AddItem (0, "Options...", func)
local menu = Nx.Menu:Create (self.List.Frm, 250)
self.ItemMenu = menu
menu:AddItem (0, "Add Comment", self.IMenu_OnAddComment, self)
menu:AddItem (0, "")
menu:AddItem (0, "Rename", self.IMenu_OnRename, self)
menu:AddItem (0, "Cut", self.IMenu_OnCut, self)
menu:AddItem (0, "Copy", self.IMenu_OnCopy, self)
menu:AddItem (0, "Paste", self.IMenu_OnPaste, self)
menu:AddItem (0, "")
menu:AddItem (0, "Set Icon", self.IMenu_OnSetIcon, self)
end
function Nx.Fav:Menu_OnAddFolder (item)
local function func (str, self)
self:AddFolder (str, self.CurFolder)
self:Update()
end
Nx:ShowEditBox ("Name", "", self, func)
end
function Nx.Fav:Menu_OnAddFavorite (item)
local function func (str, self)
self:AddFavorite (str, self.CurFolder)
self:Update()
end
Nx:ShowEditBox ("Name", "", self, func)
end
function Nx.Fav:Menu_OnRename (item)
local function func (str, self)
if self.CurFavOrFolder then
self.CurFavOrFolder["Name"] = str
self:Update()
end
end
if self.CurFavOrFolder then
local name = self.CurFavOrFolder["Name"]
Nx:ShowEditBox ("Name", name, self, func)
end
end
function Nx.Fav:Menu_OnCut()
local item = self.CurFavOrFolder
if item then
local parent = self:GetParent (item)
for i, it in ipairs (parent) do
if it == item then
tremove (parent, i)
self.CopyBuf = item
self:Update()
end
end
self:SelectCur()
end
end
function Nx.Fav:Menu_OnCopy()
local item = self.CurFavOrFolder
if item then
self.CopyBuf = Nx.Util_TCopyRecurse (item)
end
end
function Nx.Fav:Menu_OnPaste()
if not self.CopyBuf then
Nx.prt ("Nothing to paste")
return
end
if type (self.CopyBuf) ~= "table" then
Nx.prt ("Can't paste that on the left side")
return
end
local new = Nx.Util_TCopyRecurse (self.CopyBuf)
local item = self.CurFav
if item then
local parent = self:GetParent (item)
local i = Nx.Util_TFindItemI (parent, item)
tinsert (parent, i, new)
else
tinsert (self.CurFolder, 1, new)
end
self:Update()
self:SelectCur()
end
--------
function Nx.Fav:IMenu_OnAddComment()
local function func (str, self)
local s = self:CreateItem ("", 0, str)
self:AddItem (self.CurFav, self.CurItemI, s)
end
Nx:ShowEditBox ("Name", "", self, func)
end
function Nx.Fav:IMenu_OnRename()
local function func (str, self)
if self.CurFavOrFolder then
self:SetItemName (self.CurItemI, str)
self:Update()
end
end
local typ, name = self:GetItemTypeName (self.CurItemI)
Nx:ShowEditBox ("Name", name, self, func)
end
function Nx.Fav:IMenu_OnCut()
local fav = self.CurFav
if fav and self.CurItemI then
if fav[self.CurItemI] then
self.CopyBuf = fav[self.CurItemI]
tremove (fav, self.CurItemI)
end
end
self:Update()
end
function Nx.Fav:IMenu_OnCopy()
local fav = self.CurFav
if fav then
self.CopyBuf = fav[self.CurItemI]
end
end
function Nx.Fav:IMenu_OnPaste()
if not self.CopyBuf then
Nx.prt ("Nothing to paste")
return
end
if type (self.CopyBuf) ~= "string" then
Nx.prt ("Can't paste that on the right side")
return
end
local fav = self.CurFav
if fav then
local i = min (self.CurItemI, #fav) + 1
tinsert (fav, i, self.CopyBuf)
end
self:Update()
end
function Nx.Fav:IMenu_OnSetIcon()
Nx.DropDown:Start (self, self.SetIconAccept)
for i, name in ipairs (self.NoteIcons) do
local iconStr = self:GetIconInline (i)
local s = format ("%s %s", iconStr, name)
Nx.DropDown:Add (s, false)
end
Nx.DropDown:Show (self.Win.Frm)
end
function Nx.Fav:SetIconAccept (name, sel)
local fav = self.CurFav
local index = self.CurItemI
if fav and index then
local item = fav[index]
local typ, flags, name, data = self:ParseItem (item)
flags = strbyte (flags) - 35
if typ == "N" then
local icon, id, x, y = self:ParseItemNote (data)
fav[index] = self:CreateItem ("N", flags, name, sel, id, x, y)
self:Update()
end
end
end
--------
-- Show or hide
function Nx:NXFavKeyToggleShow()
Nx.Fav:ToggleShow()
end
--------
-- Show or hide
function Nx.Fav:ToggleShow()
Nx.Sec:ValidateMsg()
end
--------
-- Show or hide window
function Nx.Fav:ToggleShow_()
if not self.Win then
self:Create()
end
self.Win:Show (not self.Win:IsShown())
if self.Win:IsShown() then
self:Update()
end
end
--------
-- Handle item list filter edit box
function Nx.Fav:OnEditBox (editbox, message)
if message == "Changed" then
self:Update()
end
end
--------
-- On list events
function Nx.Fav:OnListEvent (eventName, sel, val2, click)
-- Nx.prt ("Guide list event "..eventName)
local data = self.List:ItemGetData (sel)
if not data then
self.CurFolder = self.Folders
self.CurFav = nil
else
if data["T"] == "F" then
self.CurFolder = data
self.CurFav = nil
else
self.CurFolder = self:GetParent (data)
self.CurFav = data
self:SelectItems (1)
end
end
self.CurFavOrFolder = data -- This is nil if root
self.Side = 1
if eventName == "select" or eventName == "mid" or eventName == "menu" then
if eventName == "menu" then
self.Menu:Open()
end
self:Update()
elseif eventName == "button" then -- Button icon
self.List:Select (sel)
if data then
if data["Hide"] then
data["Hide"] = nil
else
data["Hide"] = true
end
self:Update()
end
end
end
--------
-- On item list events
function Nx.Fav:OnItemListEvent (eventName, sel, val2, click)
-- Nx.prt ("List event "..eventName)
local list = self.ItemList
local item = list:ItemGetData (sel)
self.CurItemI = sel
self.Side = 2
if eventName == "select" or eventName == "mid" or eventName == "menu" then
if eventName == "menu" then
self.ItemMenu:Show (self.CurFav and true or -1)
self.ItemMenu:Open()
end
elseif eventName == "button" then -- Button icon
local flags = val2 and 1 or 0 -- Pressed
self:SetItemFlags (sel, 0xfe, flags)
end
self:SelectItems (sel)
self:Update()
end
--------
-- Update Fav
function Nx.Fav:Update()
self.Draw = false -- Force map to update icons
local Nx = Nx
if not self.Win then
return
end
-- List
local list = self.List
list:Empty()
list:ItemAdd()
list:ItemSet (2, "|cff808080Root")
self.FavCnt = 0
self:UpdateFolder (self.Folders, 1)
list:Update()
-- Right side list
self:UpdateItems()
-- Title
self.Win:SetTitle (format ("Favorites: %s", self.FavCnt))
end
function Nx.Fav:UpdateFolder (folder, level)
local list = self.List
local hide = folder["Hide"]
if level > 1 then
list:ItemAdd (folder)
local space = strrep (" ", level - 1)
list:ItemSet (2, format ("%s%s", space, folder["Name"]))
list:ItemSetButton ("QuestHdr", hide)
end
if not hide then
local space = strrep (" ", level)
for index, item in ipairs (folder) do
local typ = item["T"]
local name = item["Name"]
if typ == "F" then
self:UpdateFolder (item, level + 1)
else
self.FavCnt = self.FavCnt + 1
list:ItemAdd (item)
list:ItemSet (2, format ("%s|cffdfdfdf%s", space, name))
if self.FavToSelect == item then
self.FavToSelect = nil
list:Select (list:ItemGetNum())
end
end
end
end
end
function Nx.Fav:UpdateItems (selectI)
local list = self.ItemList
if not list then
return
end
list:Empty()
if self.CurFav then
for index, str in ipairs (self.CurFav) do
local typ, flags, name, data = self:ParseItem (str)
list:ItemAdd (item)
list:ItemSetButton ("Chk", bit.band (strbyte (flags) - 35, 1) > 0)
if typ == "" then -- Comment
list:ItemSet (3, format ("|cffa0a0a0-- %s", name))
elseif typ == "N" then -- Note
local icon, id, x, y = self:ParseItemNote (data)
icon = self:GetIconInline (icon)
id = Nx.MapIdToName[id] or "?"
list:ItemSet (2, "Note:")
list:ItemSet (3, format ("%s %s", icon, name))
list:ItemSet (4, format ("|cff80ef80(%s %.1f %.1f)", id, x, y))
elseif typ == "T" or typ == "t" then -- Target
local typName = typ == "T" and "Target 1st" or "Target"
local mapId, x, y = self:ParseItemTarget (data)
local mapName = Nx.MapIdToName[mapId] or "?"
list:ItemSet (2, format ("%s:", typName))
list:ItemSet (3, format ("%s", name))
list:ItemSet (4, format ("|cff80ef80(%s %.1f %.1f)", mapName, x, y))
end
end
end
if selectI then
list:Select (selectI)
end
list:Update()
end
--------
-- Select current favorite
function Nx.Fav:SelectCur()
self.List:SendUserSelect()
self:SelectItems (1)
end
--------
-- Get the parent of the item
-- (item, folder to start search or nil for root)
function Nx.Fav:GetParent (item, folder)
folder = folder or self.Folders
for _, it in ipairs (folder) do
if it == item then
return folder
end
local typ = it["T"]
if typ == "F" then
local v = self:GetParent (item, it)
if v then
return v
end
end
end
end
--------
-- Find a folder by name
-- (name)
function Nx.Fav:FindFolder (name, parent)
parent = parent or self.Folders
for _, item in ipairs (parent) do
if item["T"] == "F" then
if item["Name"] == name then
return item
end
end
end
end
--------
-- Find a favorite by a variable name
-- (name)
function Nx.Fav:FindFav (val, varName, parent)
parent = parent or self.Folders
for _, item in ipairs (parent) do
if item["T"] == nil then
if item[varName] == val then
return item
end
end
end
end
--------
--
-- (item)
function Nx.Fav:OpenFoldersToFav (item, folder)
folder = folder or self.Folders
for index, it in ipairs (folder) do
if it == item then
return index
end
if it["T"] == "F" then
index = self:OpenFoldersToFav (item, it)
if index then -- Found?
it["Hide"] = nil
return index
end
end
end
end
--------
-- Find the index where an item would be in list
-- (item)
function Nx.Fav:FindListI (item, folder, index)
folder = folder or self.Folders
index = index or 1
for _, it in ipairs (folder) do
if it == item then
return index
end
index = index + 1
if it["T"] == "F" then
if not it["Hide"] then
index = self:FindListI (item, it, index)
if index > 0 then -- Found?
return index
end
index = -index
end
end
end
return -index -- Failed
end
function Nx.Fav:AddFolder (name, parent, index)
local folder = {}
folder["Name"] = name
folder["T"] = "F"
parent = parent or self.Folders
if parent then
index = index or #parent + 1
tinsert (parent, index, folder)
end
return folder
end
function Nx.Fav:AddFavorite (name, parent, index)
local fav = {}
fav["Name"] = name
parent = parent or self.Folders
if parent then
index = index or #parent + 1
tinsert (parent, index, fav)
end
return fav
end
function Nx.Fav:AddItem (fav, index, item)
-- Nx.prt ("Fav AddItem %s #%s %s", fav["Name"], index or "nil", item)
if fav then
local i = max (min (index or 999999, #fav), 0) + 1
tinsert (fav, i, item)
self:SelectItems (i)
end
end
function Nx.Fav:CreateItem (typ, flags, name, p1, p2, p3, p4)
flags = flags + 35
name = gsub (name, "[~^]", "")
name = gsub (name, "\n", " ")
if typ == "" then -- Comment
return format ("~%c~%s", flags, name)
elseif typ == "N" then -- Note
local id = Nx.MapIdToNxzone[p2]
s = self:MakeXY (p3, p4)
return format ("N~%c~%s~%c%02x%s", flags, name, p1 + 35, id, s)
elseif typ == "T" or typ == "t" then -- Target
local id = Nx.MapIdToNxzone[p1]
s = self:MakeXY (p2, p3)
return format ("%s~%c~%s~%02x%s", typ, flags, name, id, s)
end
end
function Nx.Fav:MakeXY (x, y)
local s = Nx:PackXY (x, y % 100)
return s .. strchar (floor (y / 100) + 35) -- Add dungeon level to end
end
function Nx.Fav:ParseItem (item)
if item then
return strsplit ("~", item) -- Type~Flags (# based)~Name~Data
end
end
function Nx.Fav:ParseItemNote (data)
local iconI = strbyte (data, 1) - 35
local zone = tonumber (strsub (data, 2, 3), 16)
local id = Nx.NxzoneToMapId[zone]
local x = tonumber (strsub (data, 4, 6), 16) / 4090 * 100
local y = tonumber (strsub (data, 7, 9), 16) / 4090 * 100
local dLvl = (strbyte (data, 10) or 35) - 35
return iconI, id, x, y + dLvl * 100
end
function Nx.Fav:ParseItemTarget (data)
local zone = tonumber (strsub (data, 1, 2), 16)
local id = Nx.NxzoneToMapId[zone]
local x = tonumber (strsub (data, 3, 5), 16) / 4090 * 100
local y = tonumber (strsub (data, 6, 8), 16) / 4090 * 100
local dLvl = (strbyte (data, 9) or 35) - 35
return id, x, y + dLvl * 100
end
function Nx.Fav:GetItemTypeName (index)
local fav = self.CurFav
if fav then
local typ, flags, name = strsplit ("~", fav[index])
return typ, name
end
end
function Nx.Fav:SetItemFlags (index, mask, orFlags)
local fav = self.CurFav
if fav then
local typ, flags, name, data = strsplit ("~", fav[index])
flags = bit.bor (bit.band (strbyte (flags) - 35, mask), orFlags) + 35
if data then
fav[index] = format ("%s~%c~%s~%s", typ, flags, name, data)
else
fav[index] = format ("%s~%c~%s", typ, flags, name)
end
end
end
function Nx.Fav:SetItemName (index, name)
name = gsub (name, "[~^]", "")
name = gsub (name, "\n", " ")
local fav = self.CurFav
if fav then
local typ, flags, _, data = strsplit ("~", fav[index])
if data then
fav[index] = format ("%s~%s~%s~%s", typ, flags, name, data)
else
fav[index] = format ("%s~%s~%s", typ, flags, name)
end
end
end
--------
-- Select items in item list
function Nx.Fav:SelectItems (index)
if self.CurFav then
if self.Recording ~= self.CurFav then
self:SetRecord (false)
end
self.CurItemI = min (index, #self.CurFav)
self:UpdateItems (self.CurItemI)
self:UpdateTargets()
end
end
-------------------------------------------------------------------------------
function Nx.Fav:Record (typ, name, id, x, y)
if self.InUpdateTarget then
return
end
local fav = self.Recording
self.RecId = id
self.RecX = x
self.RecY = y
if typ == "Note" then
local function func (name, self)
local fav = self.Recording or self:GetNoteFav (self.RecId)
local s = self:CreateItem ("N", 0, name, 1, self.RecId, self.RecX, self.RecY)
self:AddItem (fav, self.CurItemI, s)
self:Update()
end
Nx:ShowEditBox ("Name", name, self, func)
elseif typ == "TargetS" then -- Start
local fav = self.Recording
if fav then
local s = self:CreateItem ("T", 0, name, self.RecId, self.RecX, self.RecY)
self:AddItem (fav, self.CurItemI, s)
self:Update()
end
elseif typ == "Target" then
local fav = self.Recording
if fav then
local s = self:CreateItem ("t", 0, name, self.RecId, self.RecX, self.RecY)
self:AddItem (fav, self.CurItemI, s)
self:Update()
end
end
end
function Nx.Fav:GetNoteFav (mapId)
local notes = self:FindFolder ("Notes")
if not notes then
notes = self:AddFolder ("Notes")
end
local name = Nx.Map:IdToName (mapId)
local fav = self:FindFav (name, "Name", notes)
if not fav then
fav = self:AddFavorite (name, notes)
fav["ID"] = mapId
sort (notes, function (a, b) return a["Name"] < b["Name"] end)
end
return fav
end
function Nx.Fav:SetNoteAtStr (str)
local words = {}
local quote
local strDone
local curStr = ""
for s in gmatch (str, ".") do
-- Nx.prt ("%s", s)
if s == quote then
quote = false
strDone = true
elseif not quote and (s == '"' or s == "'") then
quote = s
elseif s == ' ' and not quote then
strDone = true
else
curStr = curStr .. s
end
if strDone then
if #curStr > 0 then
tinsert (words, curStr)
end
strDone = false
curStr = ""
end
end
if #curStr > 0 then
tinsert (words, curStr)
end
--
local map = Nx.Map:GetMap (1)
local mId = map.RMapId
local zx, zy = map.PlyrRZX, map.PlyrRZY
if #words > 1 then
mId, zx, zy = map:ParseTargetStr (table.concat (words, " ", 2))
end
if mId then
local fav = self.Recording or self:GetNoteFav (mId)
local s = self:CreateItem ("N", 0, words[1] or "", 1, mId, zx, zy)
self:AddItem (fav, nil, s)
self:Update()
end
end
--------
-- Show note in window
function Nx.Fav:ShowIconNote (icon)
local fav, index = Nx.Map:GetIconFavData (icon)
self:OpenFoldersToFav (fav)
self.FavToSelect = fav
self.CurFolder = self:GetParent (fav)
self.CurFav = fav
self.CurItemI = index
self.CurFavOrFolder = fav
if not (self.Win and self.Win:IsShown()) then
self:ToggleShow()
if not self.Win then -- Not validated?
return
end
else
self:Update()
end
self:SelectItems (index)
end
function Nx.Fav:UpdateTargets()
local shown = self.Win and self.Win:IsShown()
if self.CurFav and self.CurItemI and (self.Recording or shown) then
self.InUpdateTarget = true
local map = Nx.Map:GetMap (1)
local keep
for n = self.CurItemI, #self.CurFav do
local str = self.CurFav[n]
local typ, flags, name, data = self:ParseItem (str)
if typ == "T" then
if n ~= self.CurItemI then -- Another 1st target?
break
end
local mapId, x, y = self:ParseItemTarget (data)
map:SetTargetXY (mapId, x, y, name, keep)
keep = true
elseif typ == "t" then
local mapId, x, y = self:ParseItemTarget (data)
map:SetTargetXY (mapId, x, y, name, keep)
keep = true
else
break
end
end
if keep then -- Had a target?
map:GotoPlayer()
end
self.InUpdateTarget = false
end
end
--------
--
function Nx.Fav:UpdateIcons()
local Quest = Nx.Quest
local Map = Nx.Map
local map = Map:GetMap (1)
if self.CurFav and self.CurItemI then
map:InitIconType ("!Fav2", "WP", "", 21, 21)
local str = self.CurFav[self.CurItemI]
local typ, flags, name, data = self:ParseItem (str)
if typ == "N" then
local icon, mapId, x, y = self:ParseItemNote (data)
icon = self:GetIconFile (icon)
local wx, wy = Map:GetWorldPos (mapId, x, y)
local icon = map:AddIconPt ("!Fav2", wx, wy, nil, icon)
map:SetIconTip (icon, "Note: " .. name)
map:SetIconFavData (icon, self.CurFav, self.CurItemI)
map:SetIconTypeAlpha ("!Fav2", abs ((GetTime() * 100 % 100 - 50) / 50))
end
else
map:ClearIconType ("!Fav2")
end
local mapId = map.MapId
local draw = map.ScaleDraw > .3 and map.GOpts["MapShowNotes"]
if mapId == self.DrawMapId and draw == self.Draw then
return
end
self.DrawMapId = mapId
self.Draw = draw
map:InitIconType ("!Fav", "WP", "", 17, 17)
-- map:SetIconTypeAlpha ("!Fav", map.GOpts["MapIconFavAlpha"])
if not draw then
return
end
local cont = map:IdToContZone (mapId)
-- Nx.prt ("mapid %s, cont %s", mapId, cont)
if cont > 0 and cont < 9 then
local notes = self:FindFolder ("Notes")
if notes then
local fav = self:FindFav (mapId, "ID", notes)
if fav then
for n, str in ipairs (fav) do
local typ, flags, name, data = self:ParseItem (str)
if typ == "N" then
local icon, _, x, y = self:ParseItemNote (data)
icon = self:GetIconFile (icon)
local wx, wy = Map:GetWorldPos (mapId, x, y)
local icon = map:AddIconPt ("!Fav", wx, wy, nil, icon)
map:SetIconTip (icon, "Note: " .. name)
map:SetIconFavData (icon, fav, n)
end
end
end
end
end
end
-------------------------------------------------------------------------------
function Nx.Fav:CartImportNotes()
local notes = Cartographer_Notes
local pois
if notes then
local db = notes["db"]
if db then
local account = db["account"]
if account then
pois = account["pois"]
end
end
end
if not pois then
Nx.prt ("Cartographer notes missing")
return
end
local getXY = notes["getXY"]
if not getXY then
Nx.prt ("Cartographer getXY missing")
return
end
local importCnt = 0
for zName, zData in pairs (pois) do
if type (zData) == "table" then
for id, data in pairs (zData) do
local mId = Nx.MapNameToId[zName]
if not mId then
Nx.prt ("Unknown zone %s", zName)
else
importCnt = importCnt + 1
local x, y = getXY (id)
local iconStr = data["icon"]
local name = data["title"] or iconStr or "" -- Use icon text if missing
local icon = 1
for i, iName in ipairs (self.NoteIcons) do
if iName == iconStr then
icon = i
end
end
local fav = self:GetNoteFav (mId)
local s = self:CreateItem ("N", 0, name, icon, mId, x * 100, y * 100)
self:AddItem (fav, nil, s)
Nx.prt ("Import %s %s %s %s %s", name, zName, mId, x, y)
end
end
end
end
Nx.prt ("Imported %s notes", importCnt)
self:Update()
end
-------------------------------------------------------------------------------
-- EOF