summaryrefslogtreecommitdiff
path: root/src/gui/interface/Button.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/interface/Button.cpp')
-rw-r--r--src/gui/interface/Button.cpp237
1 files changed, 237 insertions, 0 deletions
diff --git a/src/gui/interface/Button.cpp b/src/gui/interface/Button.cpp
new file mode 100644
index 0000000..3f08153
--- /dev/null
+++ b/src/gui/interface/Button.cpp
@@ -0,0 +1,237 @@
+#include <iostream>
+#include "gui/interface/Button.h"
+#include "graphics/Graphics.h"
+#include "Engine.h"
+#include "Misc.h"
+
+namespace ui {
+
+Button::Button(Point position, Point size, std::string buttonText, std::string toolTip):
+ Component(position, size),
+ ButtonText(buttonText),
+ isMouseInside(false),
+ isButtonDown(false),
+ isTogglable(false),
+ toggle(false),
+ actionCallback(NULL),
+ Enabled(true),
+ toolTip(toolTip)
+{
+ TextPosition();
+}
+
+void Button::TextPosition()
+{
+ buttonDisplayText = ButtonText;
+ if(buttonDisplayText.length())
+ {
+ if(Graphics::textwidth((char *)buttonDisplayText.c_str()) > Size.X - (Appearance.icon? 22 : 0))
+ {
+ int position = Graphics::textwidthx((char *)buttonDisplayText.c_str(), Size.X - (Appearance.icon? 38 : 22));
+ buttonDisplayText = buttonDisplayText.erase(position, buttonDisplayText.length()-position);
+ buttonDisplayText += "...";
+ }
+ }
+
+ Component::TextPosition(buttonDisplayText);
+}
+
+void Button::SetIcon(Icon icon)
+{
+ Appearance.icon = icon;
+ TextPosition();
+}
+
+void Button::SetText(std::string buttonText)
+{
+ ButtonText = buttonText;
+ TextPosition();
+}
+
+void Button::SetTogglable(bool togglable)
+{
+ toggle = false;
+ isTogglable = togglable;
+}
+
+bool Button::GetTogglable()
+{
+ return isTogglable;
+}
+
+TPT_NO_INLINE bool Button::GetToggleState()
+{
+ return toggle;
+}
+
+TPT_NO_INLINE void Button::SetToggleState(bool state)
+{
+ toggle = state;
+}
+
+void Button::Draw(const Point& screenPos)
+{
+ if(!drawn)
+ {
+ TextPosition();
+ drawn = true;
+ }
+ Graphics * g = ui::Engine::Ref().g;
+ Point Position = screenPos;
+ ui::Colour bgColour(0, 0, 0);
+
+ ui::Colour textColour = Appearance.TextInactive;
+ ui::Colour borderColour = Appearance.BorderInactive;
+ ui::Colour backgroundColour = Appearance.BackgroundInactive;
+
+ if(Enabled)
+ {
+ if(isButtonDown || (isTogglable && toggle))
+ {
+ textColour = Appearance.TextActive;
+ borderColour = Appearance.BorderActive;
+ backgroundColour = Appearance.BackgroundActive;
+ }
+ else if (isMouseInside)
+ {
+ textColour = Appearance.TextHover;
+ borderColour = Appearance.BorderHover;
+ backgroundColour = Appearance.BackgroundHover;
+ }
+ else
+ {
+ textColour = Appearance.TextInactive;
+ borderColour = Appearance.BorderInactive;
+ backgroundColour = Appearance.BackgroundInactive;
+ }
+ }
+ else
+ {
+ textColour = Appearance.TextDisabled;
+ borderColour = Appearance.BorderDisabled;
+ backgroundColour = Appearance.BackgroundDisabled;
+ }
+
+ bgColour = Appearance.BackgroundInactive;
+ g->fillrect(Position.X+1, Position.Y+1, Size.X-2, Size.Y-2, backgroundColour.Red, backgroundColour.Green, backgroundColour.Blue, backgroundColour.Alpha);
+ if(Appearance.Border == 1)
+ g->drawrect(Position.X, Position.Y, Size.X, Size.Y, borderColour.Red, borderColour.Green, borderColour.Blue, borderColour.Alpha);
+ else
+ {
+ if(Appearance.Border.Top)
+ g->draw_line(Position.X, Position.Y, Position.X+Size.X-1, Position.Y, borderColour.Red, borderColour.Green, borderColour.Blue, borderColour.Alpha);
+ if(Appearance.Border.Bottom)
+ g->draw_line(Position.X, Position.Y+Size.Y-1, Position.X+Size.X-1, Position.Y+Size.Y-1, borderColour.Red, borderColour.Green, borderColour.Blue, borderColour.Alpha);
+ if(Appearance.Border.Left)
+ g->draw_line(Position.X, Position.Y, Position.X, Position.Y+Size.Y-1, borderColour.Red, borderColour.Green, borderColour.Blue, borderColour.Alpha);
+ if(Appearance.Border.Right)
+ g->draw_line(Position.X+Size.X-1, Position.Y, Position.X+Size.X-1, Position.Y+Size.Y-1, borderColour.Red, borderColour.Green, borderColour.Blue, borderColour.Alpha);
+ }
+ g->drawtext(Position.X+textPosition.X, Position.Y+textPosition.Y, buttonDisplayText, textColour.Red, textColour.Green, textColour.Blue, textColour.Alpha);
+
+ bool iconInvert = (backgroundColour.Blue + (3*backgroundColour.Green) + (2*backgroundColour.Red))>544?true:false;
+
+ if(Appearance.icon)
+ {
+ if(Enabled)
+ if(isButtonDown || (isTogglable && toggle))
+ {
+ g->draw_icon(Position.X+iconPosition.X, Position.Y+iconPosition.Y, Appearance.icon, 255, iconInvert);
+ }
+ else
+ {
+ g->draw_icon(Position.X+iconPosition.X, Position.Y+iconPosition.Y, Appearance.icon, 255, iconInvert);
+ }
+ else
+ g->draw_icon(Position.X+iconPosition.X, Position.Y+iconPosition.Y, Appearance.icon, 180, iconInvert);
+ }
+}
+
+void Button::OnMouseUnclick(int x, int y, unsigned int button)
+{
+ if(button == 1)
+ {
+ if(isButtonDown)
+ {
+ isButtonDown = false;
+ DoAction();
+ }
+ }
+ else if(button == 3)
+ {
+ if(isAltButtonDown)
+ {
+ isAltButtonDown = false;
+ DoAltAction();
+ }
+ }
+}
+
+void Button::OnMouseClick(int x, int y, unsigned int button)
+{
+ if(!Enabled)
+ return;
+ if(button == 1)
+ {
+ if(isTogglable)
+ {
+ toggle = !toggle;
+ }
+ isButtonDown = true;
+ }
+ else if(button == 3)
+ {
+ isAltButtonDown = true;
+ }
+}
+
+void Button::OnMouseEnter(int x, int y)
+{
+ isMouseInside = true;
+ if(!Enabled)
+ return;
+ if(actionCallback)
+ actionCallback->MouseEnterCallback(this);
+ if(toolTip.length()>0 && GetParentWindow())
+ {
+ GetParentWindow()->ToolTip(this, ui::Point(x, y), toolTip);
+ }
+}
+
+
+void Button::OnMouseLeave(int x, int y)
+{
+ isMouseInside = false;
+ isButtonDown = false;
+}
+
+void Button::DoAction()
+{
+ if(!Enabled)
+ return;
+ if(actionCallback)
+ actionCallback->ActionCallback(this);
+}
+
+void Button::DoAltAction()
+{
+ if(!Enabled)
+ return;
+ if(actionCallback)
+ actionCallback->AltActionCallback(this);
+}
+
+void Button::SetActionCallback(ButtonAction * action)
+{
+ if(actionCallback)
+ delete actionCallback;
+ actionCallback = action;
+}
+
+Button::~Button()
+{
+ if(actionCallback)
+ delete actionCallback;
+}
+
+} /* namespace ui */