Page 1 of 1
Timed "Warning" Labels.
Posted: Sat Mar 03, 2012 8:21 pm
by kevutian
This function will provide Mudlet users with easy access to "warning" style labels.
The function currently accepts two arguments, label name and label text. The function is called as standard, i.e.
It currently accepts two concurrent labels, with the second receiving a 75 pixel offset.
function visWarning(name, text)
local width, height = getMainWindowSize() -- Get our current window dimensions
local strLen = text:len() -- Find the character length of our "warning"
if windowExists == false then -- Does a warning window already exist?
createLabel(name, (width / 2) - 300, (height / 2) - 100, 250, 150, 1)
resizeWindow(name, strLen * 25, 70)
moveWindow(name, (width - (strLen * 25)) / 2, (height / 2) - 100) -- Dynamically place the window dependent on the length of our "warning"
windowExists = true
else
moveWindow(name, (width - (strLen * 25)) / 2, (height / 2) - 175)
end
setBackgroundColor(name, 255, 51, 51, 200)
echo(name, [[<p style="font-size:35px"><b><center><font color="white"> ]] .. text .. [[</font></center></b></p>]])
showWindow(name)
tempTimer(3, [[hideWindow("]] .. name .. [[");windowExists = false]]) -- Remove the window after 3 seconds
resetFormat()
end
As always, this code is provided, "as-is" - Should there be any glaring issues, please do report them on this thread.
Thanks, and enjoy!
Re: Timed "Warning" Labels.
Posted: Sun Mar 04, 2012 1:15 am
by chris
It looks cool. Here are some suggestions for it:
visWarning(text) -> would make a random label id and raise the raise (so no need to define the label name)
raiseWarning('label') -> would recall a priorly made label
Re: Timed "Warning" Labels.
Posted: Sat Nov 10, 2012 11:38 pm
by kevutian
Ahh, thanks for the feedback. Never even noticed you commented on here.
I actually already implemented the random id element. I'll get onto the recall at some point.
function visWarn(text)
local width, height = getMainWindowSize()
local strLen = text:len()
local pre = function () local hex = { "a", "b", "c", "d", "e", "f" } return tostring(hex[math.random(#hex)] .. hex[math.random(#hex)] .. math.random(999, 9999)) end
local label = pre()
tmp.labels[label] = text
createLabel(label, (width / 2) - 300, (height / 2) - 100, 250, 150, 1)
setLabelStyleSheet(label, [[
color: #333;
border: 2px solid #555;
border-radius: 11px;
padding: 5px;
background: qradialgradient(cx: 0.3, cy: -0.4,
fx: 0.3, fy: -0.4,
radius: 1.35, stop: 0 #fff, stop: 1 #888);
min-width: 80px;
]])
resizeWindow(label, strLen * 25, 70)
local offsetTable = { 100, 200, 300 }
local tabLen, offset = countTable(tmp.labels), 100
if countTable(tmp.labels) == 1 then
moveWindow(label, (width - (strLen * 25)) / 2, (height / 2) - offset)
else
moveWindow(label, (width - (strLen * 25)) / 2, (height / 2) - offsetTable[tabLen])
end
setBackgroundColor(label, 255, 51, 51, 200)
echo(label, [[<p style="font-size:35px"><b><center><font color="blue"> ]] .. text .. [[</font></center></b></p>]])
showWindow(label)
tempTimer(5, [[hideWindow(next(tmp.labels));keyRemove(tmp.labels, next(tmp.labels))]])
resetFormat()
end
countTable():
function countTable(tbl)
local c = 0
for k, v in pairs(tbl) do
c = c + 1
end
return c
end
keyRemove():
function keyRemove(tbl, key)
local element = tbl[key]
tbl[key] = nil
return element
end
Re: Timed "Warning" Labels.
Posted: Sun Dec 09, 2012 10:00 pm
by Delrayne
I suggest that they be made see through, or at least given the option to make them see through.
Re: Timed "Warning" Labels.
Posted: Mon Dec 10, 2012 12:32 pm
by kevutian
Sure thing. I'll get on that today.
Re: Timed "Warning" Labels.
Posted: Sat Dec 22, 2012 8:11 am
by Delrayne
Any update on the transparent labels?
Re: Timed "Warning" Labels.
Posted: Sun Jul 14, 2013 6:20 am
by kevutian
Oh, sorry. I just happened upon this thread, heh.
Here's the latest code for them. It's composed of two parts; a function and a global timer.
Function:
--- Display high visibility warning labels.
-- For each string passed, this function will display a highly visible, timed warning label.
-- You may specify how long the label will remain by passing an optional second argument.
-- @param text The text to display.
-- @param duration How long the label should remain.
-- @usage visWarn("I am a warning label.", 3)
-- @usage visWarn("I am a warning label.")
function visWarn(text, duration)
local width, height = getMainWindowSize()
local strLen = text:len()
local label = rndStr(8, "%l%d")
tmp.labels[label] = {label = label, text = text, duration = (duration or 5)}
createLabel(label, 0, 0, 0, 0, 1)
setLabelStyleSheet(label, [[
background-color: #333300;
border: 5px double #339900;
border-radius: 12px;
color: #ff99ff;
font-size: 12px;
font-family: Zekton;
font-style: normal;
padding: 3px;
]])
resizeWindow(label, strLen * 25, 70)
local tabLen, offset = countTable(tmp.labels), 100
local topPos = (height / 2.0) - (tabLen * 75)
if topPos > 0 then
moveWindow(label, (width - (strLen * 18)) / 3, topPos)
end
echo(label, [[<p style="font-size:35px"><b><center><font color="yellow"> ]] .. text .. [[</font></center></b></p>]])
if topPos > 0 then
showWindow(label)
table.insert(tmp.displayedLabels, label)
else
hideWindow(label)
table.insert(tmp.labelQueue, label)
end
resetFormat()
end
And the timer function:
function viswarn_loop()
if not tmp.labels then return end
local toHide = {}
local needRedraw = false
for index, label in pairs(tmp.displayedLabels) do
tmp.labels[label].duration = tmp.labels[label].duration - 0.5
if tmp.labels[label].duration <= 0 then
toHide[label] = true
needRedraw = true
end
end
for i = 1, #(tmp.displayedLabels) do
if not tmp.displayedLabels[i] then break end
if toHide[tmp.displayedLabels[i]] then
hideWindow(tmp.displayedLabels[i])
tmp.labels[tmp.displayedLabels[i]] = nil
table.remove(tmp.displayedLabels, i)
i = i - 1
end
end
local width, height = getMainWindowSize()
if needRedraw or (#(tmp.displayedLabels) == 0 and #(tmp.labelQueue) > 0) then
local brk = false
local iter = 1
while not brk do
local topPos = (height / 1.5) - ((iter) * 75)
if tmp.displayedLabels[iter] then
local label = tmp.displayedLabels[iter]
moveWindow(label, (width - (#(tmp.labels[label].text) * 25)) / 3, topPos)
elseif topPos >= 0 and #(tmp.labelQueue) > 0 then
local label = table.remove(tmp.labelQueue, 1)
table.insert(tmp.displayedLabels, label)
moveWindow(label, (width - (#(tmp.labels[label].text) * 25)) / 3, topPos)
showWindow(label)
else
brk = true
break;
end
iter = iter + 1
end
end
end
Enjoy
Re: Timed "Warning" Labels.
Posted: Tue Jul 16, 2013 6:42 am
by Akaya
This isn't working for me. Pasted the two functions into two separate scripts on a fresh profile then tried running the example usage listed in the first script. Is this the proper way to do so?
Re: Timed "Warning" Labels.
Posted: Fri Aug 16, 2013 11:00 am
by phasma
Oh? What's the problem? Have a precise error for me? These should simply 'just work' but should they not, it's almost certainly nothing more than a missing table declaration.