The-Powder-Toy/src/interface/DropDown.cpp

172 lines
4.7 KiB
C++
Raw Normal View History

2012-04-17 09:56:57 -05:00
/*
* DropDown.cpp
*
* Created on: Apr 16, 2012
* Author: Simon
*/
2012-05-13 14:00:22 -05:00
#include <iostream>
#include "Button.h"
2012-04-17 09:56:57 -05:00
#include "DropDown.h"
namespace ui {
2012-05-13 14:00:22 -05:00
class ItemSelectedAction;
2012-04-17 09:56:57 -05:00
class DropDownWindow: public ui::Window {
2012-05-13 14:00:22 -05:00
friend class ItemSelectedAction;
2012-04-17 09:56:57 -05:00
Colour background, activeBackground;
Colour border, activeBorder;
Colour text, activeText;
2012-05-13 14:00:22 -05:00
DropDown * dropDown;
std::vector<Button> buttons;
2012-04-17 09:56:57 -05:00
bool isMouseInside;
public:
2012-05-13 14:00:22 -05:00
class ItemSelectedAction: public ButtonAction
{
DropDownWindow * window;
std::string option;
public:
ItemSelectedAction(DropDownWindow * window, std::string option): window(window), option(option) { }
virtual void ActionCallback(ui::Button *sender)
{
ui::Engine::Ref().CloseWindow();
window->setOption(option);
window->SelfDestruct();
}
};
DropDownWindow(DropDown * dropDown):
Window(ui::Point(dropDown->Position.X+dropDown->GetParentWindow()->Position.X-5, dropDown->Position.Y+dropDown->GetParentWindow()->Position.Y-3), ui::Point(dropDown->Size.X+10, dropDown->options.size()*13)),
dropDown(dropDown),
2012-04-17 09:56:57 -05:00
background(background),
2012-05-13 14:00:22 -05:00
activeBackground(dropDown->activeBackground),
border(dropDown->border),
activeBorder(dropDown->activeBorder),
text(dropDown->text),
activeText(dropDown->activeText)
2012-04-17 09:56:57 -05:00
{
2012-05-13 14:00:22 -05:00
int currentY = 0;
for(int i = 0; i < dropDown->options.size(); i++)
{
Button * tempButton = new Button(Point(0, currentY), Point(Size.X, 14), dropDown->options[i].first);
tempButton->SetActionCallback(new ItemSelectedAction(this, dropDown->options[i].first));
AddComponent(tempButton);
currentY += 13;
}
2012-04-17 09:56:57 -05:00
}
virtual void OnDraw()
{
Graphics * g = ui::Engine::Ref().g;
g->fillrect(Position.X, Position.Y, Size.X, Size.Y, background.Red, background.Green, background.Blue, 255);
g->drawrect(Position.X, Position.Y, Size.X, Size.Y, border.Red, border.Green, border.Blue, 255);
}
2012-05-13 14:00:22 -05:00
void setOption(std::string option)
{
dropDown->SetOption(option);
if(dropDown->callback)
{
int optionIndex = 0;
for(optionIndex = 0; optionIndex < dropDown->options.size(); optionIndex++)
{
if(option == dropDown->options[optionIndex].first)
break;
}
dropDown->callback->OptionChanged(dropDown, dropDown->options[optionIndex]);
}
}
2012-04-17 09:56:57 -05:00
virtual ~DropDownWindow() {}
};
DropDown::DropDown(Point position, Point size):
Component(position, size),
2012-05-13 14:00:22 -05:00
isMouseInside(false),
optionIndex(-1)
2012-04-17 09:56:57 -05:00
{
2012-05-13 14:00:22 -05:00
background = activeBackground = Colour(0, 0, 0);
activeText = text = activeBackground = border = activeBorder = Colour(255, 255, 255);
2012-04-17 09:56:57 -05:00
}
void DropDown::OnMouseClick(int x, int y, unsigned int button)
{
2012-05-13 14:00:22 -05:00
DropDownWindow * newWindow = new DropDownWindow(this);
ui::Engine().Ref().ShowWindow(newWindow);
2012-04-17 09:56:57 -05:00
}
void DropDown::Draw(const Point& screenPos)
{
Graphics * g = ui::Engine::Ref().g;
Point Position = screenPos;
if(isMouseInside)
{
g->fillrect(Position.X-1, Position.Y-1, Size.X+2, Size.Y+2, activeBackground.Red, activeBackground.Green, activeBackground.Blue, 255);
g->drawrect(Position.X, Position.Y, Size.X, Size.Y, activeBorder.Red, activeBorder.Green, activeBorder.Blue, 255);
2012-05-13 14:00:22 -05:00
if(optionIndex!=-1)
g->drawtext(Position.X, Position.Y+1, options[optionIndex].first, activeText.Red, activeText.Green, activeText.Blue, 255);
2012-04-17 09:56:57 -05:00
//g->drawtext(Position.X+textPosition.X, Position.Y+textPosition.Y+1, displayText, activeText.Red, activeText.Green, activeText.Blue, 255);
}
else
{
g->fillrect(Position.X, Position.Y, Size.X, Size.Y, background.Red, background.Green, background.Blue, 255);
g->drawrect(Position.X, Position.Y, Size.X, Size.Y, border.Red, border.Green, border.Blue, 255);
2012-05-13 14:00:22 -05:00
if(optionIndex!=-1)
g->drawtext(Position.X, Position.Y+1, options[optionIndex].first, text.Red, text.Green, text.Blue, 255);
2012-04-17 09:56:57 -05:00
//g->drawtext(Position.X+textPosition.X, Position.Y+textPosition.Y+1, displayText, text.Red, text.Green, text.Blue, 255);
}
}
2012-05-13 14:00:22 -05:00
void DropDown::SetOption(std::string option)
{
for(int i = 0; i < options.size(); i++)
{
if(options[i].first == option)
{
optionIndex = i;
return;
}
}
}
void DropDown::SetOption(int option)
{
for(int i = 0; i < options.size(); i++)
{
if(options[i].second == option)
{
optionIndex = i;
return;
}
}
}
void DropDown::AddOption(std::pair<std::string, int> option)
{
for(int i = 0; i < options.size(); i++)
{
if(options[i] == option)
return;
}
options.push_back(option);
}
void DropDown::RemoveOption(std::string option)
{
start:
for(int i = 0; i < options.size(); i++)
{
if(options[i].first == option)
{
options.erase(options.begin()+i);
goto start;
}
}
}
void DropDown::SetOptions(std::vector<std::pair<std::string, int> > options)
{
this->options = options;
}
2012-04-17 09:56:57 -05:00
DropDown::~DropDown() {
2012-05-13 14:00:22 -05:00
if(callback)
delete callback;
2012-04-17 09:56:57 -05:00
}
} /* namespace ui */