Lephisto/src/gui_button.cpp

81 lines
1.6 KiB
C++

#include "libs.h"
#include "gui.h"
#define BUTTON_SIZE 16
namespace Gui {
Button::Button(void) {
m_isPressed = false;
m_eventMask = EVENT_MOUSEDOWN | EVENT_MOUSEUP | EVENT_MOUSEMOTION;
SetSize(BUTTON_SIZE, BUTTON_SIZE);
}
bool Button::OnMouseDown(MouseButtonEvent* e) {
if(e->button == 1) {
m_isPressed = true;
onPress.emit();
/* Wait for mouse release, regardless of where on screen. */
_m_release = RawEvents::onMouseUp.connect(sigc::mem_fun(this, &Button::OnRawMouseUp));
}
return false;
}
bool Button::OnMouseUp(MouseButtonEvent* e) {
if((e->button == 1) && m_isPressed) {
m_isPressed = false;
onClick.emit();
}
return false;
}
void Button::OnActivate(void) {
/* Activated by keyboard shortcut. */
m_isPressed = true;
onPress.emit();
_m_kbrelease = RawEvents::onKeyUp.connect(sigc::mem_fun(this, &Button::OnRawKeyUp));
}
void Button::OnRawKeyUp(SDL_KeyboardEvent* e) {
if(e->keysym.sym == m_shortcut.sym) {
m_isPressed = false;
onRelease.emit();
onClick.emit();
_m_kbrelease.disconnect();
}
}
void Button::OnRawMouseUp(MouseButtonEvent* e) {
if(e->button == 1) {
m_isPressed = false;
_m_release.disconnect();
onRelease.emit();
}
}
void SolidButton::GetSizeRequested(float size[2]) {
size[0] = size[1] = BUTTON_SIZE;
}
void TransparentButton::GetSizeRequested(float size[2]) {
size[0] = size[1] = BUTTON_SIZE;
}
void SolidButton::Draw(void) {
float size[2];
GetSize(size);
if(IsPressed()) {
Theme::DrawIndent(size);
} else {
Theme::DrawOutdent(size);
}
}
void TransparentButton::Draw(void) {
float size[2];
GetSize(size);
Theme::DrawHollowRect(size);
}