Quantcast
local mod = StarTip:NewModule("Icons")
mod.name = "Icons"
mod.toggled = true
mod.defaultOff = true
local LibBuffer = LibStub("LibScriptableUtilsBuffer-1.0")
local LibCore = LibStub("LibScriptableLCDCore-1.0")
local LibTimer = LibStub("LibScriptableUtilsTimer-1.0")
local PluginUtils = LibStub("LibScriptablePluginUtils-1.0")
local WidgetIcon = LibStub("LibScriptableWidgetIcon-1.0")
local _G = _G
local GameTooltip = _G.GameTooltip
local StarTip = _G.StarTip
local UIParent = _G.UIParent
local textures = {}
local textures = {
[0] = "Interface\\Addons\\StarTip\\Media\\black.blp",
[1] = "Interface\\Addons\\StarTip\\Media\\white.blp",
[2] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-0.blp',
[3] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-1.blp',
[4] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-2.blp',
[5] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-3.blp',
[6] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-4.blp',
[7] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-5.blp',
[8] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-6.blp',
[9] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-7.blp',
[10] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-8.blp',
[11] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-9.blp',
[12] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-10.blp',
[13] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-11.blp',
[14] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-12.blp',
[15] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-13.blp',
[16] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-14.blp',
[17] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-15.blp',
[18] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-16.blp',
[19] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-17.blp',
[20] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-18.blp',
[21] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-19.blp',
[22] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-20.blp',
[23] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-21.blp',
[24] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-22.blp',
[25] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-23.blp',
[26] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-24.blp',
[27] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-25.blp',
[28] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-26.blp',
[29] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-27.blp',
[30] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-28.blp',
[31] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-29.blp',
[32] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-30.blp',
[33] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-31.blp',
[34] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-32.blp',
[35] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-33.blp',
[36] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-34.blp',
[37] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-35.blp',
[38] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-36.blp',
[39] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-37.blp',
[40] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-38.blp',
[41] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-39.blp',
[42] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-40.blp',
[43] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-41.blp',
[44] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-42.blp',
[45] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-43.blp',
[46] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-44.blp',
[47] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-45.blp',
[48] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-46.blp',
[49] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-47.blp',
[50] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-48.blp',
[51] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-49.blp',
[52] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-50.blp',
[53] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-51.blp',
[54] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-52.blp',
[55] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-53.blp',
[56] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-54.blp',
[57] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-55.blp',
[58] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-56.blp',
[59] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-57.blp',
[60] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-58.blp',
[61] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-59.blp',
[62] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-60.blp',
[63] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-61.blp',
[64] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-62.blp',
[65] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-63.blp',
[66] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-64.blp',
[67] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-65.blp',
[68] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-66.blp',
[69] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-67.blp',
[70] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-68.blp',
[71] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-69.blp',
[72] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-70.blp',
[73] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-71.blp',
[74] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-72.blp',
[75] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-73.blp',
[76] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-74.blp',
[77] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-75.blp',
[78] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-76.blp',
[79] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-77.blp',
[80] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-78.blp',
[81] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-79.blp',
[82] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-80.blp',
[83] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-81.blp',
[84] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-82.blp',
[85] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-83.blp',
[86] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-84.blp',
[87] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-85.blp',
[88] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-86.blp',
[89] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-87.blp',
[90] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-88.blp',
[91] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-89.blp',
[92] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-90.blp',
[93] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-91.blp',
[94] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-92.blp',
[95] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-93.blp',
[96] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-94.blp',
[97] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-95.blp',
[98] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-96.blp',
[99] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-97.blp',
[100] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-98.blp',
[101] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-99.blp',
[102] = 'Interface\\Addons\\StarTip\\Media\\gradient\\gradient-100.blp',
}

local environment = {}
local update

local options = {
}

local foo = 200
local defaults = {
	profile = {
		cols = 2,
		rows = 1,
		yres = 8,
		xres = 7,
		size = 15,
		update = 0,
		icons = {
			[1] = {
				["name"] = "Blob",
				["enabled"] = false,
				["bitmap"] = {
					["row1"] = ".....|.....|.....",
					["row2"] = ".....|.....|.***.",
					["row3"] = ".....|.***.|*...*",
					["row4"] = "..*..|.*.*.|*...*",
					["row5"] = ".....|.***.|*...*",
					["row6"] = ".....|.....|.***.",
					["row7"] = ".....|.....|.....",
					["row8"] = ".....|.....|....."
				},
				["speed"] = foo,
				["row"] = 1,
				["col"] = 1
			},
			[2] = {
				["enabled"] = false,
				["name"] = "EKG",
				["bitmap"] = {
					["row1"] = ".....|.....|.....|.....|.....|.....|.....|.....",
					["row2"] = ".....|....*|...*.|..*..|.*...|*....|.....|.....",
					["row3"] = ".....|....*|...*.|..*..|.*...|*....|.....|.....",
					["row4"] = ".....|....*|...**|..**.|.**..|**...|*....|.....",
					["row5"] = ".....|....*|...**|..**.|.**..|**...|*....|.....",
					["row6"] = ".....|....*|...*.|..*.*|.*.*.|*.*..|.*...|*....",
					["row7"] = "*****|*****|****.|***..|**..*|*..**|..***|.****",
					["row8"] = ".....|.....|.....|.....|.....|.....|.....|....."
				},
				["speed"] = foo,
				["row"] = 1,
				["col"] = 0
			},
			[3] = {
				["name"] = "Hearts",
				["enabled"] = false,
				["bitmap"] = {
					["row1"] = ".....|.....|.....|.....|.....|.....",
					["row2"] = ".*.*.|.....|.*.*.|.....|.....|.....",
					["row3"] = "*****|.*.*.|*****|.*.*.|.*.*.|.*.*.",
					["row4"] = "*****|.***.|*****|.***.|.***.|.***.",
					["row5"] = ".***.|.***.|.***.|.***.|.***.|.***.",
					["row6"] = ".***.|..*..|.***.|..*..|..*..|..*..",
					["row7"] = "..*..|.....|..*..|.....|.....|.....",
					["row8"] = ".....|.....|.....|.....|.....|....."
				},
				["speed"] = foo,
				["row"] = 0,
				["col"] = 1
			},
			[4] = {
				["name"] = "Heartbeat",
				["bitmap"] = {
					["row1"] = ".....|.....",
					["row2"] = ".*.*.|.*.*.",
					["row3"] = "*****|*.*.*",
					["row4"] = "*****|*...*",
					["row5"] = ".***.|.*.*.",
					["row6"] = ".***.|.*.*.",
					["row7"] = "..*..|..*..",
					["row8"] = ".....|....."
				},
				["speed"] = foo,
			},
			[5] = {
				["name"] = "Diamonds",
				["bitmap"] = {
					["row1"] = ".....|.....|.....|.....|..*..|.....|.....|.....",
					["row2"] = ".....|.....|.....|..*..|.*.*.|..*..|.....|.....",
					["row3"] = ".....|.....|..*..|.*.*.|*...*|.*.*.|..*..|.....",
					["row4"] = ".....|..*..|.*.*.|*...*|.....|*...*|.*.*.|..*..",
					["row5"] = ".....|.....|..*..|.*.*.|*...*|.*.*.|..*..|.....",
					["row6"] = ".....|.....|.....|..*..|.*.*.|..*..|.....|.....",
					["row7"] = ".....|.....|.....|.....|..*..|.....|.....|.....",
					["row8"] = ".....|.....|.....|.....|.....|.....|.....|....."
				},
				["speed"] = foo,
			},
			[6] = {
				["name"] = "Rain",
				["bitmap"] = {
					["row1"] = "...*.|.....|.....|.*...|....*|..*..|.....|*....",
					["row2"] = "*....|...*.|.....|.....|.*...|....*|..*..|.....",
					["row3"] = ".....|*....|...*.|.....|.....|.*...|....*|..*..",
					["row4"] = "..*..|.....|*....|...*.|.....|.....|.*...|....*",
					["row5"] = "....*|..*..|.....|*....|...*.|.....|.....|.*...",
					["row6"] = ".*...|....*|..*..|.....|*....|...*.|.....|.....",
					["row7"] = ".....|.*...|....*|..*..|.....|*....|...*.|.....",
					["row8"] = ".....|.....|.*...|....*|..*..|.....|*....|...*."
				},
				["speed"] = foo,
				["row"] = 0,
				["col"] = 0
			},
			[7] = {
				["name"] = "Squirrel",
				["bitmap"] = {
					["row1"] = ".....|.....|.....|.....|.....|.....",
					["row2"] = ".....|.....|.....|.....|.....|.....",
					["row3"] = ".....|.....|.....|.....|.....|.....",
					["row4"] = "**...|.**..|..**.|...**|....*|.....",
					["row5"] = "*****|*****|*****|*****|*****|*****",
					["row6"] = "...**|..**.|.**..|**...|*....|.....",
					["row7"] = ".....|.....|.....|.....|.....|.....",
					["row8"] = ".....|.....|.....|.....|.....|....."
				},
				["speed"] = foo,
			},
			[8] = {
				["enabled"] = true,
				["name"] = "Health",
				["bitmap"] = {
					["row1"] = ".....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|}",
					["row2"] = ".+++.|.+*+.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.***.|",
					["row3"] = "+++++|++*++|++**+|++***|++**.|++**.|++***|++***|++***|++***|++***|*****|*****|",
					["row4"] = "+++++|++*++|++*++|++*++|++***|++***|++***|++***|++***|++***|*****|*****|*****|",
					["row5"] = "+++++|+++++|+++++|+++++|+++++|+++**|+++**|++***|+****|*****|*****|*****|*****|",
					["row6"] = ".+++.|.+++.|.+++.|.+++.|.+++.|.+++.|.++*.|.+**.|.***.|.***.|.***.|.***.|.***.|",
					["row7"] = ".....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|",
					["row8"] = ".....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|"
				},
				["speed"] = 500,
				["script"] = [[
return Health(unit)
]],
				["max"] = [[
return MaxHealth(unit)
]],
				["min"] = [[
return 0
]],
				["fg_color"] = [[
return Health(unit)	/ MaxHealth(unit)
]],
				["row"] = 0,
				["col"] = 0
			},
			[9] = {
				["enabled"] = true,
				["name"] = "Power",
				["bitmap"] = {
					["row1"] = ".....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|}",
					["row2"] = ".+++.|.+*+.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.***.|",
					["row3"] = "+++++|++*++|++**+|++***|++**.|++**.|++***|++***|++***|++***|++***|*****|*****|",
					["row4"] = "+++++|++*++|++*++|++*++|++***|++***|++***|++***|++***|++***|*****|*****|*****|",
					["row5"] = "+++++|+++++|+++++|+++++|+++++|+++**|+++**|++***|+****|*****|*****|*****|*****|",
					["row6"] = ".+++.|.+++.|.+++.|.+++.|.+++.|.+++.|.++*.|.+**.|.***.|.***.|.***.|.***.|.***.|",
					["row7"] = ".....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|",
					["row8"] = ".....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|"
				},
				["speed"] = 500,
				["script"] = [[
return Power(unit)
]],
				["max"] = [[
return MaxPower(unit)
]],
				["min"] = [[
return 0
]],
				["fg_color"] = [[
return Power(unit) / MaxPower(unit)
]],
				["row"] = 0,
				["col"] = 1
			},

			[10] = {
				["enabled"] = false,
				["name"] = "Clock",
				["bitmap"] = {
					["row1"] = ".....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|",
					["row2"] = ".***.|.*+*.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.+++.|.+*+.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|",
					["row3"] = "*****|**+**|**++*|**+++|**++.|**++.|**+++|**+++|**+++|**+++|**+++|+++++|+++++|++*++|++**+|++***|++**.|++**.|++***|++***|++***|++***|++***|*****|",
					["row4"] = "*****|**+**|**+**|**+**|**+++|**+++|**+++|**+++|**+++|**+++|+++++|+++++|+++++|++*++|++*++|++*++|++***|++***|++***|++***|++***|++***|*****|*****|",
					["row5"] = "*****|*****|*****|*****|*****|***++|***++|**+++|*++++|+++++|+++++|+++++|+++++|+++++|+++++|+++++|+++++|+++**|+++**|++***|+****|*****|*****|*****|",
					["row6"] = ".***.|.***.|.***.|.***.|.***.|.***.|.**+.|.*++.|.+++.|.+++.|.+++.|.+++.|.+++.|.+++.|.+++.|.+++.|.+++.|.+++.|.++*.|.+**.|.***.|.***.|.***.|.***.|",
					["row7"] = ".....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|",
					["row8"] = ".....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|"
				},
				["speed"] = foo,
				["row"] = 0,
				["col"] = 0
			},
			[11] = {
				["name"] = "Wave",
				["bitmap"] = {
					["row1"] = "..**.|.**..|**...|*....|.....|.....|.....|.....|....*|...**",
					["row2"] = ".*..*|*..*.|..*..|.*...|*....|.....|.....|....*|...*.|..*..",
					["row3"] = "*....|....*|...*.|..*..|.*...|*....|....*|...*.|..*..|.*...",
					["row4"] = "*....|....*|...*.|..*..|.*...|*....|....*|...*.|..*..|.*...",
					["row5"] = "*....|....*|...*.|..*..|.*...|*....|....*|...*.|..*..|.*...",
					["row6"] = ".....|.....|....*|...*.|..*..|.*..*|*..*.|..*..|.*...|*....",
					["row7"] = ".....|.....|.....|....*|...**|..**.|.**..|**...|*....|.....",
					["row8"] = ".....|.....|.....|.....|.....|.....|.....|.....|.....|....."
				},
				["speed"] = foo,
			},
		}
	}
}

mod.defaults = defaults

local function checkUnit()
	if not UnitExists(StarTip.unit) then

	end
end

function mod:OnInitialize()
	self.db = StarTip.db:RegisterNamespace(self:GetName(), defaults)
	StarTip:SetOptionsDisabled(options, true)

	if self.db.profile.update > 0 then
		self.timer = LibTimer:New("Icons", 100, true, update)
	end

	self.unitTimer = LibTimer:New("Icons.unitTimer", 100, true, checkUnit)
end

local function copy(tbl)
	local newTbl = {}
	for k, v in pairs(tbl) do
		if type(v) == "table" then
			v = copy(v)
		end
		newTbl[k] = v
	end
	return newTbl
end

local draw
local function createIcons()
	if type(mod.icons) ~= "table" then mod.icons = {} end

	for k, icon in pairs(mod.db.profile.icons) do
		if icon.enabled then
			local icon = WidgetIcon:New(mod.core, "icon", copy(icon), icon.row or 0, icon.col or 0, icon.layer or 0, StarTip.db.profile.errorLevel, draw)
			icon:SetupChars()
			tinsert(mod.icons, icon)
		end
	end
end

function mod:OnEnable()
	self.core = LibCore:New(mod, StarTip.core.environment, "StarTip.Icons", {["StarTip.Icons"] = {}}, nil, StarTip.db.profile.errorLevel)
	self.core.lcd = {LCOLS=self.db.profile.cols, LROWS=self.db.profile.rows, XRES=self.db.profile.xres, YRES=self.db.profile.yres, specialChars = {}}

	self.buffer = LibBuffer:New("Icons", self.core.lcd.LCOLS * self.core.lcd.LROWS * self.core.lcd.YRES * self.core.lcd.XRES, 0, StarTip.db.profile.errorLevel)

	StarTip:SetOptionsDisabled(options, false)
	createIcons()
	-- no need to start the timer
end

function mod:OnDisable()
	StarTip:SetOptionsDisabled(options, true)
	if self.timer then
		self.timer:Stop()
	end
	if self.core then
		self.core:Del()
	end
end

function mod:GetOptionsbleh()
	for i, icon in ipairs(self.db.profile.icons) do
		options.icons.args["Icon"..i] = {
			enabled = {
				name = "Enabled",
				type = "toggle",
				get = function() return icon.enabled end,
				set = function(info, val) icon.enabled = val end,
				order = 1
			},
			speed = {
				name = "Speed",
				type = "input",
				pattern = "%d",
				get = function() return icon.speed end,
				set = function(info, val) icon.speed = val end,
				order = 2
			},
			bitmap = {
				name = "Bitmap",
				type = "input",
				multiline = true,
				width = "full",
				get = function() return icon.bitmap end,
				set = function(info, val) icon.bitmap = val end,
				order = 3
			}
		}
	end
	return options
end

function mod:ClearIcons()
	for k, widget in pairs(mod.icons) do
		widget:Del()
	end
	wipe(mod.icons)
end

function draw(widget)
	local lcd = widget.visitor.lcd

	local row = widget.row
	local col = widget.col
	local layer = widget.layer
	local n = row * lcd.YRES * lcd.LCOLS + col * lcd.XRES

	local icon = widget.icon


	local chr = lcd.specialChars[widget.start + widget.index]

	for y = 0 , lcd.YRES - 1 do
		local mask = bit.lshift(1, lcd.XRES)
		for x = 0, lcd.XRES - 1 do
			local n = (row * lcd.YRES + y) * lcd.LCOLS * lcd.XRES + col * lcd.XRES + x
			--local n = (row + y) * lcd.LCOLS * lcd.XRES + col + x
			mask = bit.rshift(mask, 1)
			if bit.band(chr[y + 1], mask) == 0 then
				if widget.bg_color then
					mod.buffer.buffer[n] = floor(widget.bg.r * 100) + 2
				else
					mod.buffer.buffer[n] = 0
				end
			else
				if widget.fg_color then
					mod.buffer.buffer[n] = floor(widget.fg.r * 100) + 2
				else
					mod.buffer.buffer[n] = 1
				end
			end
		end
	end

	update()
end

function update()
	local lcd = mod.core.lcd
	local text1 = format('|T%s:%d|t', textures[0], mod.db.profile.size or 10)
	local buffers = {}
	for row = 0, lcd.LROWS - 1 do
		for col = 0, lcd.LCOLS - 1 do
			for y = 0, lcd.YRES - 1 do
				for x = 0, lcd.XRES - 1 do
					local n = (row * lcd.YRES + y) * lcd.LCOLS * lcd.XRES + col * lcd.XRES + x
					--local n = (row + y) * lcd.LCOLS * lcd.XRES + col + x
					local color = mod.buffer.buffer[n] or 0
					local text = format('|T%s:%d|t', textures[color] or textures[0], mod.db.profile.size or 10)
					if not buffers[row * lcd.YRES + y] then
						buffers[row * lcd.YRES + y] = LibBuffer:New("tmp.icon", lcd.LCOLS * lcd.XRES, text1)
					end
					buffers[row * lcd.YRES + y]:Replace(col * lcd.XRES + x, text)
					--StarTip.leftLines[row * lcd.YRES + y]:SetText(mod.lines[row * lcd.YRES])
				end
			end
		end
	end

	for row = 0, lcd.LROWS * lcd.YRES - 1 do
		--buffers[row]:Replace(lcd.LCOLS, StarTip.leftLines[row + 2]:GetText() or "")
	end

	for row = 0, lcd.LROWS - 1 do
		for col = 0, lcd.LCOLS do
			for y = 0, lcd.YRES - 1 do
				for x = 0, lcd.XRES - 1 do
					local n = (row * lcd.YRES + y) * lcd.LCOLS * lcd.XRES + col * lcd.XRES + x
					--local n = (row + y) * lcd.LCOLS * lcd.XRES + col + x
					if row * lcd.YRES + y + 2 > GameTooltip:NumLines() then
						GameTooltip:AddDoubleLine(' ', ' ')
					end

					StarTip.leftLines[row * lcd.YRES + y + 2]:SetText(buffers[row * lcd.YRES + y]:AsString())
				end
			end
		end
	end

	if UnitExists(StarTip.unit) then
		GameTooltip:Show()
	end

	for k, buffer in pairs(buffers) do
		buffer:Del()
	end
end

function mod:SetUnit()
	first = true
	for k, icon in pairs(self.icons or {}) do
		icon:Start()
	end
	if self.timer then
		self.timer:Start()
	end
	mod.lines = mod.lines or {}
	wipe(mod.lines)
	for i = 0, mod.core.lcd.LCOLS * mod.core.lcd.YRES do
		mod.lines[i] = StarTip.leftLines[i + 1]:GetText()
	end
	self.unitTimer:Start()
end

function mod:OnHide()
	for k, icon in pairs(self.icons or {}) do
		icon:Stop()
	end
	if self.timer then
		self.timer:Stop()
	end

	self.unitTimer:Stop()
end