diff options
| author | Simon Robertshaw <simon@hardwired.org.uk> | 2013-03-22 14:14:17 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2013-03-22 14:14:17 (GMT) |
| commit | 9abe51526cac2634af0541c3de69834dd30e9f78 (patch) | |
| tree | 6ae4deadfe00a83094b9d288d8c11d8ce823577a /src/gui/interface/DropDown.cpp | |
| parent | 2c311b9a36a88fadd96f3d39acb1ab2590835d81 (diff) | |
| download | powder-9abe51526cac2634af0541c3de69834dd30e9f78.zip powder-9abe51526cac2634af0541c3de69834dd30e9f78.tar.gz | |
Move all GUI source files into gui/
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..4c1d761 --- /dev/null +++ b/src/gui/interface/DropDown.cpp @@ -0,0 +1,197 @@ +#include <iostream> +#include "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 */ |
