summaryrefslogtreecommitdiff
path: root/src/gui/colourpicker/ColourPickerActivity.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/colourpicker/ColourPickerActivity.cpp')
-rw-r--r--src/gui/colourpicker/ColourPickerActivity.cpp309
1 files changed, 309 insertions, 0 deletions
diff --git a/src/gui/colourpicker/ColourPickerActivity.cpp b/src/gui/colourpicker/ColourPickerActivity.cpp
new file mode 100644
index 0000000..a7ac239
--- /dev/null
+++ b/src/gui/colourpicker/ColourPickerActivity.cpp
@@ -0,0 +1,309 @@
+#include <algorithm>
+#include <iomanip>
+#include "ColourPickerActivity.h"
+#include "gui/interface/Textbox.h"
+#include "gui/interface/Label.h"
+#include "gui/interface/Keys.h"
+#include "gui/game/Tool.h"
+#include "gui/Style.h"
+#include "Format.h"
+#include "gui/game/GameModel.h"
+
+ColourPickerActivity::ColourPickerActivity(ui::Colour initialColour, ColourPickedCallback * callback) :
+ WindowActivity(ui::Point(-1, -1), ui::Point(266, 175)),
+ currentHue(0),
+ currentSaturation(0),
+ currentValue(0),
+ mouseDown(false),
+ valueMouseDown(false),
+ callback(callback)
+{
+
+ class ColourChange : public ui::TextboxAction
+ {
+ ColourPickerActivity * a;
+ public:
+ ColourChange(ColourPickerActivity * a) : a(a) {}
+
+ void TextChangedCallback(ui::Textbox * sender)
+ {
+ int r, g, b, alpha;
+ r = format::StringToNumber<int>(a->rValue->GetText());
+ g = format::StringToNumber<int>(a->gValue->GetText());
+ b = format::StringToNumber<int>(a->bValue->GetText());
+ alpha = format::StringToNumber<int>(a->aValue->GetText());
+ if (r > 255)
+ r = 255;
+ if (g > 255)
+ g = 255;
+ if (b > 255)
+ b = 255;
+ if (alpha > 255)
+ alpha = 255;
+
+ RGB_to_HSV(r, g, b, &a->currentHue, &a->currentSaturation, &a->currentValue);
+ a->currentAlpha = alpha;
+ a->UpdateTextboxes(r, g, b, alpha);
+ }
+ };
+
+ rValue = new ui::Textbox(ui::Point(5, Size.Y-23), ui::Point(30, 17), "255");
+ rValue->SetActionCallback(new ColourChange(this));
+ rValue->SetLimit(3);
+ rValue->SetInputType(ui::Textbox::Number);
+ AddComponent(rValue);
+
+ gValue = new ui::Textbox(ui::Point(40, Size.Y-23), ui::Point(30, 17), "255");
+ gValue->SetActionCallback(new ColourChange(this));
+ gValue->SetLimit(3);
+ gValue->SetInputType(ui::Textbox::Number);
+ AddComponent(gValue);
+
+ bValue = new ui::Textbox(ui::Point(75, Size.Y-23), ui::Point(30, 17), "255");
+ bValue->SetActionCallback(new ColourChange(this));
+ bValue->SetLimit(3);
+ bValue->SetInputType(ui::Textbox::Number);
+ AddComponent(bValue);
+
+ aValue = new ui::Textbox(ui::Point(110, Size.Y-23), ui::Point(30, 17), "255");
+ aValue->SetActionCallback(new ColourChange(this));
+ aValue->SetLimit(3);
+ aValue->SetInputType(ui::Textbox::Number);
+ AddComponent(aValue);
+
+ hexValue = new::ui::Label(ui::Point(150, Size.Y-23), ui::Point(53, 17), "0xFFFFFFFF");
+ AddComponent(hexValue);
+
+ class OkayAction: public ui::ButtonAction
+ {
+ ColourPickerActivity * a;
+ public:
+ OkayAction(ColourPickerActivity * a) : a(a) { }
+ void ActionCallback(ui::Button * sender)
+ {
+ int Red, Green, Blue;
+ Red = format::StringToNumber<int>(a->rValue->GetText());
+ Green = format::StringToNumber<int>(a->gValue->GetText());
+ Blue = format::StringToNumber<int>(a->bValue->GetText());
+ ui::Colour col(Red, Green, Blue, a->currentAlpha);
+ if(a->callback)
+ a->callback->ColourPicked(col);
+ a->Exit();
+ }
+ };
+
+ ui::Button * doneButton = new ui::Button(ui::Point(Size.X-45, Size.Y-23), ui::Point(40, 17), "Done");
+ doneButton->SetActionCallback(new OkayAction(this));
+ AddComponent(doneButton);
+ SetOkayButton(doneButton);
+
+ RGB_to_HSV(initialColour.Red, initialColour.Green, initialColour.Blue, &currentHue, &currentSaturation, &currentValue);
+ currentAlpha = initialColour.Alpha;
+ UpdateTextboxes(initialColour.Red, initialColour.Green, initialColour.Blue, initialColour.Alpha);
+}
+
+void ColourPickerActivity::UpdateTextboxes(int r, int g, int b, int a)
+{
+ rValue->SetText(format::NumberToString<int>(r));
+ gValue->SetText(format::NumberToString<int>(g));
+ bValue->SetText(format::NumberToString<int>(b));
+ aValue->SetText(format::NumberToString<int>(a));
+ std::stringstream hex;
+ hex << std::hex << "0x" << std::setfill('0') << std::setw(2) << std::uppercase << a << std::setw(2) << r << std::setw(2) << g << std::setw(2) << b;
+ hexValue->SetText(hex.str());
+}
+void ColourPickerActivity::OnTryExit(ExitMethod method)
+{
+ Exit();
+}
+
+void ColourPickerActivity::OnMouseMove(int x, int y, int dx, int dy)
+{
+ if(mouseDown)
+ {
+ x -= Position.X+5;
+ y -= Position.Y+5;
+
+ currentHue = (float(x)/float(255))*359.0f;
+ currentSaturation = 255-(y*2);
+
+ if(currentSaturation > 255)
+ currentSaturation = 255;
+ if(currentSaturation < 0)
+ currentSaturation = 0;
+ if(currentHue > 359)
+ currentHue = 359;
+ if(currentHue < 0)
+ currentHue = 0;
+ }
+
+ if(valueMouseDown)
+ {
+ x -= Position.X+5;
+ y -= Position.Y+5;
+
+ currentValue = x;
+
+ if(currentValue > 255)
+ currentValue = 255;
+ if(currentValue < 0)
+ currentValue = 0;
+ }
+
+ if(mouseDown || valueMouseDown)
+ {
+ int cr, cg, cb;
+ HSV_to_RGB(currentHue, currentSaturation, currentValue, &cr, &cg, &cb);
+ UpdateTextboxes(cr, cg, cb, currentAlpha);
+ }
+}
+
+void ColourPickerActivity::OnMouseDown(int x, int y, unsigned button)
+{
+ x -= Position.X+5;
+ y -= Position.Y+5;
+ if(x >= 0 && x < 256 && y >= 0 && y <= 128)
+ {
+ mouseDown = true;
+ currentHue = (float(x)/float(255))*359.0f;
+ currentSaturation = 255-(y*2);
+
+ if(currentSaturation > 255)
+ currentSaturation = 255;
+ if(currentSaturation < 0)
+ currentSaturation = 0;
+ if(currentHue > 359)
+ currentHue = 359;
+ if(currentHue < 0)
+ currentHue = 0;
+ }
+
+ if(x >= 0 && x < 256 && y >= 132 && y <= 142)
+ {
+ valueMouseDown = true;
+ currentValue = x;
+
+ if(currentValue > 255)
+ currentValue = 255;
+ if(currentValue < 0)
+ currentValue = 0;
+ }
+
+ if(mouseDown || valueMouseDown)
+ {
+ int cr, cg, cb;
+ HSV_to_RGB(currentHue, currentSaturation, currentValue, &cr, &cg, &cb);
+ UpdateTextboxes(cr, cg, cb, currentAlpha);
+ }
+}
+
+void ColourPickerActivity::OnMouseUp(int x, int y, unsigned button)
+{
+ if(mouseDown || valueMouseDown)
+ {
+ int cr, cg, cb;
+ HSV_to_RGB(currentHue, currentSaturation, currentValue, &cr, &cg, &cb);
+ UpdateTextboxes(cr, cg, cb, currentAlpha);
+ }
+
+ if(mouseDown)
+ {
+ mouseDown = false;
+ x -= Position.X+5;
+ y -= Position.Y+5;
+
+ currentHue = (float(x)/float(255))*359.0f;
+ currentSaturation = 255-(y*2);
+
+ if(currentSaturation > 255)
+ currentSaturation = 255;
+ if(currentSaturation < 0)
+ currentSaturation = 0;
+ if(currentHue > 359)
+ currentHue = 359;
+ if(currentHue < 0)
+ currentHue = 0;
+ }
+
+ if(valueMouseDown)
+ {
+ valueMouseDown = false;
+
+ x -= Position.X+5;
+ y -= Position.Y+5;
+
+ currentValue = x;
+
+ if(currentValue > 255)
+ currentValue = 255;
+ if(currentValue < 0)
+ currentValue = 0;
+ }
+}
+
+
+void ColourPickerActivity::OnDraw()
+{
+ Graphics * g = ui::Engine::Ref().g;
+ //g->clearrect(Position.X-2, Position.Y-2, Size.X+3, Size.Y+3);
+ g->fillrect(Position.X-2, Position.Y-2, Size.X+3, Size.Y+3, 0, 0, 0, currentAlpha);
+ g->drawrect(Position.X, Position.Y, Size.X, Size.Y, 255, 255, 255, 255);
+
+ g->drawrect(Position.X+4, Position.Y+4, 258, 130, 180, 180, 180, 255);
+
+ g->drawrect(Position.X+4, Position.Y+4+4+128, 258, 12, 180, 180, 180, 255);
+
+
+ int offsetX = Position.X+5;
+ int offsetY = Position.Y+5;
+
+
+ //draw color square
+ int lastx = -1, currx = 0;
+ for(int saturation = 0; saturation <= 255; saturation+=2)
+ {
+ for(int hue = 0; hue <= 359; hue++)
+ {
+ currx = clamp_flt(hue, 0, 359)+offsetX;
+ if (currx == lastx)
+ continue;
+ lastx = currx;
+ int cr = 0;
+ int cg = 0;
+ int cb = 0;
+ HSV_to_RGB(hue, 255-saturation, currentValue, &cr, &cg, &cb);
+ g->blendpixel(currx, (saturation/2)+offsetY, cr, cg, cb, currentAlpha);
+ }
+ }
+
+ //draw brightness bar
+ for(int value = 0; value <= 255; value++)
+ for(int i = 0; i < 10; i++)
+ {
+ int cr = 0;
+ int cg = 0;
+ int cb = 0;
+ HSV_to_RGB(currentHue, currentSaturation, value, &cr, &cg, &cb);
+
+ g->blendpixel(value+offsetX, i+offsetY+127+5, cr, cg, cb, currentAlpha);
+ }
+
+ //draw color square pointer
+ int currentHueX = clamp_flt(currentHue, 0, 359);
+ int currentSaturationY = ((255-currentSaturation)/2);
+ g->xor_line(offsetX+currentHueX, offsetY+currentSaturationY-5, offsetX+currentHueX, offsetY+currentSaturationY-1);
+ g->xor_line(offsetX+currentHueX, offsetY+currentSaturationY+1, offsetX+currentHueX, offsetY+currentSaturationY+5);
+ g->xor_line(offsetX+currentHueX-5, offsetY+currentSaturationY, offsetX+currentHueX-1, offsetY+currentSaturationY);
+ g->xor_line(offsetX+currentHueX+1, offsetY+currentSaturationY, offsetX+currentHueX+5, offsetY+currentSaturationY);
+
+ //draw brightness bar pointer
+ int currentValueX = restrict_flt(currentValue, 0, 254);
+ g->xor_line(offsetX+currentValueX, offsetY+4+128, offsetX+currentValueX, offsetY+13+128);
+ g->xor_line(offsetX+currentValueX+1, offsetY+4+128, offsetX+currentValueX+1, offsetY+13+128);
+}
+
+ColourPickerActivity::~ColourPickerActivity() {
+ if(callback)
+ delete callback;
+}
+