diff options
| author | Simon Robertshaw <simon@hardwired.org.uk> | 2013-03-24 12:24:17 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2013-03-24 12:24:17 (GMT) |
| commit | 9b5b85f9b01cbda7ef9a7ec2a15b2a35630a5b9d (patch) | |
| tree | ac7d040253b459ce102e476cb19ab59e3cfa90d7 /src/gui/interface/DropDown.cpp | |
| parent | 6bf98ccdca39936a3c51367862eed7c49f8786ec (diff) | |
| parent | bdc69f31c0be94191015838886bdcc2bc67f1acb (diff) | |
| download | powder-9b5b85f9b01cbda7ef9a7ec2a15b2a35630a5b9d.zip powder-9b5b85f9b01cbda7ef9a7ec2a15b2a35630a5b9d.tar.gz | |
Merge branch 'reorganisation' of github.com:FacialTurd/The-Powder-Toy
Diffstat (limited to 'src/gui/interface/DropDown.cpp')
| -rw-r--r-- | src/gui/interface/DropDown.cpp | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/src/gui/interface/DropDown.cpp b/src/gui/interface/DropDown.cpp new file mode 100644 index 0000000..f1dda7c --- /dev/null +++ b/src/gui/interface/DropDown.cpp @@ -0,0 +1,197 @@ +#include <iostream> +#include "gui/Style.h" +#include "Button.h" +#include "DropDown.h" + +namespace ui { + +class ItemSelectedAction; +class DropDownWindow: public ui::Window { + friend class ItemSelectedAction; + Appearance appearance; + DropDown * dropDown; + std::vector<Button> buttons; + bool isMouseInside; +public: + 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, 1+dropDown->options.size()*16)), + dropDown(dropDown), + appearance(dropDown->Appearance) + { + int currentY = 1; + for(int i = 0; i < dropDown->options.size(); i++) + { + Button * tempButton = new Button(Point(1, currentY), Point(Size.X-2, 16), dropDown->options[i].first); + tempButton->Appearance = appearance; + if(i) + tempButton->Appearance.Border = ui::Border(0, 1, 1, 1); + tempButton->SetActionCallback(new ItemSelectedAction(this, dropDown->options[i].first)); + AddComponent(tempButton); + currentY += 16; + } + } + virtual void OnDraw() + { + Graphics * g = ui::Engine::Ref().g; + g->clearrect(Position.X, Position.Y, Size.X, Size.Y); + } + 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]); + } + } + virtual void OnTryExit(ExitMethod method) + { + ui::Engine::Ref().CloseWindow(); + SelfDestruct(); + } + virtual ~DropDownWindow() {} +}; + +DropDown::DropDown(Point position, Point size): + Component(position, size), + isMouseInside(false), + optionIndex(-1), + callback(NULL) +{ +} + +void DropDown::OnMouseClick(int x, int y, unsigned int button) +{ + DropDownWindow * newWindow = new DropDownWindow(this); + ui::Engine::Ref().ShowWindow(newWindow); +} + +void DropDown::Draw(const Point& screenPos) +{ + if(!drawn) + { + if(optionIndex!=-1) + TextPosition(options[optionIndex].first); + drawn = true; + } + Graphics * g = ui::Engine::Ref().g; + Point Position = screenPos; + + ui::Colour textColour = Appearance.TextInactive; + ui::Colour borderColour = Appearance.BorderInactive; + ui::Colour backgroundColour = Appearance.BackgroundInactive; + + if (isMouseInside) + { + textColour = Appearance.TextHover; + borderColour = Appearance.BorderHover; + backgroundColour = Appearance.BackgroundHover; + } + else + { + textColour = Appearance.TextInactive; + borderColour = Appearance.BorderInactive; + backgroundColour = Appearance.BackgroundInactive; + } + + g->fillrect(Position.X-1, Position.Y-1, Size.X+2, Size.Y+2, backgroundColour.Red, backgroundColour.Green, backgroundColour.Blue, backgroundColour.Alpha); + g->drawrect(Position.X, Position.Y, Size.X, Size.Y, borderColour.Red, borderColour.Green, borderColour.Blue, borderColour.Alpha); + if(optionIndex!=-1) + g->drawtext(Position.X+textPosition.X, Position.Y+textPosition.Y, options[optionIndex].first, textColour.Red, textColour.Green, textColour.Blue, textColour.Alpha); +} + +void DropDown::OnMouseEnter(int x, int y) +{ + isMouseInside = true; +} + +void DropDown::OnMouseLeave(int x, int y) +{ + isMouseInside = false; +} + std::pair<std::string, int> DropDown::GetOption() + { + if(optionIndex!=-1) + { + return options[optionIndex]; + } + return std::pair<std::string, int>("", -1); + } + + void DropDown::SetOption(std::string option) + { + for(int i = 0; i < options.size(); i++) + { + if(options[i].first == option) + { + optionIndex = i; + TextPosition(options[optionIndex].first); + return; + } + } + } + void DropDown::SetOption(int option) + { + for(int i = 0; i < options.size(); i++) + { + if(options[i].second == option) + { + optionIndex = i; + TextPosition(options[optionIndex].first); + 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) + { + if(i == optionIndex) + optionIndex = -1; + options.erase(options.begin()+i); + goto start; + } + } + } + void DropDown::SetOptions(std::vector<std::pair<std::string, int> > options) + { + this->options = options; + } + + +DropDown::~DropDown() { + if(callback) + delete callback; +} + +} /* namespace ui */ |
