--// =============================================================================

--- Colorbars module

--- Colorbar fields.
-- Inherits from Control.
-- @see control.Control
-- @table Colorbars
-- @tparam {r, g, b, a} color color table, (default {1, 1, 1, 1})
-- @tparam {func1, func2, ...} OnChange listener functions for color changes, (default {})
Colorbars = Control:Inherit{
	classname = "colorbars",
	color     = {1, 1, 1, 1},

	defaultWidth = 100,
	defaultHeight = 20,

	OnChange = {},
}

local this = Colorbars
local inherited = this.inherited

--// =============================================================================

--- Sets the new color
-- @tparam {r, g, b, a} c color table
function Colorbars:SetColor(c)
	self:CallListeners(self.OnChange, c)
	self.value = c
	self:Invalidate()
end

--// =============================================================================

local GL_LINE_LOOP = GL.LINE_LOOP
local GL_LINES = GL.LINES
local glPushMatrix = gl.PushMatrix
local glPopMatrix  = gl.PopMatrix
local glTranslate  = gl.Translate
local glVertex   = gl.Vertex
local glRect     = gl.Rect
local glColor    = gl.Color
local glBeginEnd = gl.BeginEnd

function Colorbars:DrawControl()
	local barswidth  = self.width - (self.height + 4)

	local color = self.color
	local step = self.height/7

	--bars
	local rX1, rY1, rX2, rY2 = 0, 0*step, color[1]*barswidth, 1*step
	local gX1, gY1, gX2, gY2 = 0, 2*step, color[2]*barswidth, 3*step
	local bX1, bY1, bX2, bY2 = 0, 4*step, color[3]*barswidth, 5*step
	local aX1, aY1, aX2, aY2 = 0, 6*step, (color[4] or 1)*barswidth, 7*step

	glColor(1, 0, 0, 1)
	glRect(rX1, rY1, rX2, rY2)

	glColor(0, 1, 0, 1)
	glRect(gX1, gY1, gX2, gY2)

	glColor(0, 0, 1, 1)
	glRect(bX1, bY1, bX2, bY2)

	glColor(1, 1, 1, 1)
	glRect(aX1, aY1, aX2, aY2)

	glColor(self.color)
	glRect(barswidth + 2, self.height, self.width - 2, 0)

	gl.BeginEnd(GL.TRIANGLE_STRIP, theme.DrawBorder_, barswidth + 2, 0, self.width - barswidth - 4, self.height, 1, self.borderColor, self.borderColor2)
end

--// =============================================================================

function Colorbars:HitTest()
	return self
end

function Colorbars:MouseDown(x, y)
	local step = self.height/7
	local yp = y/step
	local r  = yp%2
	local barswidth = self.width - (self.height + 4)

	if (x <= barswidth) and (r <= 1) then
		local barIdx = (yp-r)/2 + 1
		local newvalue = x/barswidth
		if (newvalue > 1) then
			newvalue = 1
		elseif (newvalue < 0) then
			newvalue = 0
		end
		self.color[barIdx] = newvalue
		self:SetColor(self.color)
		return self
	end
end

function Colorbars:MouseMove(x, y, dx, dy, button)
	if (button == 1) then
		return self:MouseDown(x, y)
	end
end

--// =============================================================================
