From df4aa2be604e750bfa9d18bc3262390e64f3163c Mon Sep 17 00:00:00 2001
From: Niels Martin Hansen <nielsm@aegisub.org>
Date: Mon, 24 Nov 2008 14:05:46 +0000
Subject: [PATCH] Add a small arrow next to the vertical spectrum (third
 dimension) in the colour picker, to make it easier to find the cursor in some
 cases.

Originally committed to SVN as r2483.
---
 aegisub/dialog_colorpicker.cpp | 74 +++++++++++++++++++++++-----------
 aegisub/dialog_colorpicker.h   |  2 +-
 2 files changed, 52 insertions(+), 24 deletions(-)

diff --git a/aegisub/dialog_colorpicker.cpp b/aegisub/dialog_colorpicker.cpp
index 7b2b1ea3a..64278411e 100644
--- a/aegisub/dialog_colorpicker.cpp
+++ b/aegisub/dialog_colorpicker.cpp
@@ -62,31 +62,39 @@
 #endif
 
 
-ColorPickerSpectrum::ColorPickerSpectrum(wxWindow *parent, wxWindowID id, wxBitmap *_background, int xx, int yy, PickerDirection _direction)
-: wxControl(parent, id, wxDefaultPosition, wxDefaultSize, STATIC_BORDER_FLAG), x(xx), y(yy), background(_background), direction(_direction)
+static const int spectrum_horz_vert_arrow_size = 4;
+
+ColorPickerSpectrum::ColorPickerSpectrum(wxWindow *parent, wxWindowID id, wxBitmap *_background, int xx, int yy, PickerDirection _direction, wxSize _size)
+: wxControl(parent, id, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE), x(xx), y(yy), background(_background), direction(_direction)
 {
-	// empty
+	_size.x += 2;
+	_size.y += 2;
+
+	if (direction == Vert) _size.x += spectrum_horz_vert_arrow_size + 1;
+	if (direction == Horz) _size.y += spectrum_horz_vert_arrow_size + 1;
+
+	SetClientSize(_size);
+	SetMinSize(GetSize());
 }
 
 void ColorPickerSpectrum::GetXY(int &xx, int &yy)
 {
 	xx = x;
 	yy = y;
-	Refresh(false);
 }
 
 void ColorPickerSpectrum::SetXY(int xx, int yy)
 {
 	x = xx;
 	y = yy;
-	Refresh(false);
+	Refresh(true);
 }
 
 void ColorPickerSpectrum::SetBackground(wxBitmap *new_background)
 {
 	if (background == new_background) return;
 	background = new_background;
-	Refresh(false);
+	Refresh(true);
 }
 
 BEGIN_EVENT_TABLE(ColorPickerSpectrum, wxControl)
@@ -104,30 +112,54 @@ void ColorPickerSpectrum::OnPaint(wxPaintEvent &evt)
 
 	wxMemoryDC memdc;
 	memdc.SelectObject(*background);
-	dc.Blit(0, 0, background->GetWidth(), background->GetHeight(), &memdc, 0, 0);
+	dc.Blit(1, 1, background->GetWidth(), background->GetHeight(), &memdc, 0, 0);
+
+	wxPen invpen(*wxWHITE, 3);
+	invpen.SetCap(wxCAP_BUTT);
+	wxPen blkpen(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT), 1);
+	blkpen.SetCap(wxCAP_BUTT);
+
+	wxPoint arrow[3];
 
-	wxPen pen(dc.GetPen());
-	pen.SetWidth(3);
-	pen.SetStyle(wxSOLID);
-	pen.SetCap(wxCAP_BUTT);
-	pen.SetColour(255, 255, 255);
 	dc.SetLogicalFunction(wxXOR);
-	dc.SetPen(pen);
+	dc.SetPen(invpen);
 	switch (direction) {
 		case HorzVert:
 			// Make a little cross
-			dc.DrawLine(x-5, y, x+6, y);
-			dc.DrawLine(x, y-5, x, y+6);
+			dc.DrawLine(x-4, y+1, x+7, y+1);
+			dc.DrawLine(x+1, y-4, x+1, y+7);
 			break;
 		case Horz:
 			// Make a vertical line stretching all the way across
-			dc.DrawLine(x, 0, x, GetClientSize().y);
+			dc.DrawLine(x+1, 1, x+1, background->GetHeight()+1);
+			// Points for arrow
+			arrow[0] = wxPoint(x+1, background->GetHeight()+2);
+			arrow[1] = wxPoint(x+1-spectrum_horz_vert_arrow_size, background->GetHeight()+2+spectrum_horz_vert_arrow_size);
+			arrow[2] = wxPoint(x+1+spectrum_horz_vert_arrow_size, background->GetHeight()+2+spectrum_horz_vert_arrow_size);
 			break;
 		case Vert:
 			// Make a horizontal line stretching all the way across
-			dc.DrawLine(0, y, GetClientSize().x, y);
+			dc.DrawLine(1, y+1, background->GetWidth()+1, y+1);
+			// Points for arrow
+			arrow[0] = wxPoint(background->GetWidth()+2, y+1);
+			arrow[1] = wxPoint(background->GetWidth()+2+spectrum_horz_vert_arrow_size, y+1-spectrum_horz_vert_arrow_size);
+			arrow[2] = wxPoint(background->GetWidth()+2+spectrum_horz_vert_arrow_size, y+1+spectrum_horz_vert_arrow_size);
 			break;
 	}
+
+	if (direction == Horz || direction == Vert) {
+		// Arrow pointing at current point
+		dc.SetLogicalFunction(wxCOPY);
+		dc.SetPen(*wxTRANSPARENT_PEN);
+		dc.SetBrush(*wxBLACK_BRUSH);
+		dc.DrawPolygon(3, arrow);
+	}
+
+	// Border around the spectrum
+	dc.SetLogicalFunction(wxCOPY);
+	dc.SetPen(blkpen);
+	dc.SetBrush(*wxTRANSPARENT_BRUSH);
+	dc.DrawRectangle(0, 0, background->GetWidth()+2, background->GetHeight()+2);
 }
 
 void ColorPickerSpectrum::OnMouse(wxMouseEvent &evt)
@@ -483,12 +515,8 @@ DialogColorPicker::DialogColorPicker(wxWindow *parent, wxColour initial_color)
 
 	// Create the controls for the dialog
 	wxSizer *spectrum_box = new wxStaticBoxSizer(wxVERTICAL, this, _("Colour spectrum"));
-	spectrum = new ColorPickerSpectrum(this, SELECTOR_SPECTRUM, 0, -1, -1, ColorPickerSpectrum::HorzVert);
-	spectrum->SetClientSize(256, 256);
-	spectrum->SetMinSize(spectrum->GetSize());
-	slider = new ColorPickerSpectrum(this, SELECTOR_SLIDER, 0, -1, -1, ColorPickerSpectrum::Vert);
-	slider->SetClientSize(wxSize(slider_width, 256));
-	slider->SetMinSize(slider->GetSize());
+	spectrum = new ColorPickerSpectrum(this, SELECTOR_SPECTRUM, 0, -1, -1, ColorPickerSpectrum::HorzVert, wxSize(256, 256));
+	slider = new ColorPickerSpectrum(this, SELECTOR_SLIDER, 0, -1, -1, ColorPickerSpectrum::Vert, wxSize(slider_width, 256));
 	wxString modes[] = { _("RGB/R"), _("RGB/G"), _("RGB/B"), _("HSL/L"), _("HSV/H") };
 	colorspace_choice = new wxChoice(this, SELECTOR_MODE, wxDefaultPosition, wxDefaultSize, 5, modes);
 
diff --git a/aegisub/dialog_colorpicker.h b/aegisub/dialog_colorpicker.h
index 00b02420f..62fd1a196 100644
--- a/aegisub/dialog_colorpicker.h
+++ b/aegisub/dialog_colorpicker.h
@@ -64,7 +64,7 @@ private:
 	void OnMouse(wxMouseEvent &evt);
 
 public:
-	ColorPickerSpectrum(wxWindow *parent, wxWindowID id, wxBitmap *_background, int xx, int yy, PickerDirection _direction);
+	ColorPickerSpectrum(wxWindow *parent, wxWindowID id, wxBitmap *_background, int xx, int yy, PickerDirection _direction, wxSize _size);
 
 	void GetXY(int &xx, int &yy);
 	void SetXY(int xx, int yy);
-- 
GitLab