Files
2018-07-17 14:15:37 +02:00

171 lines
3.6 KiB
ActionScript

import elements.BaseGuiElement;
import elements.GuiMarkupText;
export MarkupTooltip, setMarkupTooltip;
export addLazyMarkupTooltip;
class MarkupTooltip : MarkupRenderer, ITooltip {
float Delay = 0.5f;
bool visible = false;
bool Persist = false;
bool FollowMouse = true;
bool Lazy = false;
bool LazyUpdate = true;
bool StaticPosition = false;
double lastUpdate = -INFINITY;
vec2i offset(12, 0);
int Width = 250;
int Padding = 10;
SkinStyle background = SS_Tooltip;
recti lastpos;
string lastText;
bool wrapAroundElement = true;
MarkupTooltip(const string& txt, int width = 250, float delay = 0.5f, bool persist = false, bool followMouse = true) {
super();
parseTree(txt);
visible = txt.length != 0;
lastText = txt;
Width = width;
Delay = delay;
Persist = persist;
FollowMouse = followMouse;
}
MarkupTooltip(int width = 250, float delay = 0.5f, bool persist = false, bool followMouse = true) {
super();
Width = width;
Delay = delay;
Persist = persist;
Lazy = true;
FollowMouse = followMouse;
}
void update(const Skin@ skin, IGuiElement@ elem) {
if(Lazy) {
update(elem);
lastUpdate = frameTime;
}
}
void set_text(const string& txt) {
visible = txt.length != 0;
if(txt == lastText)
return;
lastText = txt;
parseTree(txt);
}
void set_width(int w) {
Width = w;
}
float get_delay() {
return Delay;
}
bool get_persist() {
return Persist;
}
void show(const Skin@ skin, IGuiElement@ elem) {
if(Lazy)
update(elem);
visible = lastText.length != 0;
}
void hide(const Skin@ skin, IGuiElement@ elem) {
if(Lazy)
clear();
visible = false;
}
void update(IGuiElement@ elem) {
string tt;
while(elem !is null && tt.length == 0) {
tt = elem.tooltip;
@elem = elem.parent;
}
text = tt;
}
void clear() override {
lastText = "";
MarkupRenderer::clear();
}
void draw(const Skin@ skin, IGuiElement@ elem) {
if(Lazy && LazyUpdate) {
if(lastUpdate < frameTime - 0.2) {
update(elem);
lastUpdate = frameTime;
}
}
if(!visible)
return;
int prevHeight = height;
vec2i size(Width, height + Padding * 2);
vec2i pos;
if(StaticPosition) {
pos = offset;
}
else if(FollowMouse) {
pos = mousePos + offset;
if(wrapAroundElement) {
if(pos.x + size.x >= screenSize.x) {
pos = mousePos - offset;
pos.x -= size.x;
}
if(pos.y + size.y > screenSize.y)
pos.y = screenSize.y - size.y;
}
}
else {
recti elemPos = elem.absolutePosition;
pos = vec2i(elemPos.botRight.x, elemPos.topLeft.y) + offset;
if(pos.x + size.x >= screenSize.x) {
if(wrapAroundElement) {
pos = elemPos.topLeft - offset;
pos.x -= size.x;
}
else {
pos.x = screenSize.x - size.x;
}
}
if(pos.y + size.y > screenSize.y)
pos.y = screenSize.y - size.y;
}
//Draw the background
recti absPos = recti_area(pos, size);
skin.draw(background, SF_Normal, absPos);
//Draw the markup
draw(skin, absPos.padded(Padding));
if(height != prevHeight)
draw(skin, elem);
}
};
void setMarkupTooltip(BaseGuiElement@ ele, const string& tooltip, bool hoverStyle = true, int width = 250) {
MarkupTooltip@ obj = cast<MarkupTooltip>(ele.tooltipObject);
if(obj is null) {
@ele.tooltipObject = MarkupTooltip(tooltip, width, hoverStyle ? 0.f : 0.5f, hoverStyle);
}
else {
obj.width = width;
obj.Persist = hoverStyle;
obj.text = tooltip;
}
}
MarkupTooltip@ addLazyMarkupTooltip(BaseGuiElement@ ele, bool hoverStyle = true, int width = 250, bool update = false) {
MarkupTooltip tt(width, hoverStyle ? 0.f : 0.5f, hoverStyle);
tt.Lazy = true;
tt.LazyUpdate = update;
@ele.tooltipObject = tt;
return tt;
}