(svn r9023) [cpp_gui] -Add: ImageButton and ImageButton2 cpp_gui
authorKUDr
Tue, 06 Mar 2007 13:06:38 +0000
branchcpp_gui
changeset 6290 8078f7a3c8a0
parent 6289 be3d8bd9fb02
child 6291 5c589fa2078e
(svn r9023) [cpp_gui] -Add: ImageButton and ImageButton2
-Add: Widget::DrawSprite() method that accepts sprite coordinates in the widget space instead of window space
src/widget.cpp
src/widget/widget.h
src/widget/widget_base.cpp
src/widget/widget_button_img.cpp
src/widget/widget_button_img2.cpp
src/widget/widget_resizebox.cpp
src/widget/widget_stickybox.cpp
src/widget/widget_types.h
--- a/src/widget.cpp	Sun Mar 04 22:36:22 2007 +0000
+++ b/src/widget.cpp	Tue Mar 06 13:06:38 2007 +0000
@@ -208,7 +208,7 @@
 
 			/* show different image when clicked for WWT_IMGBTN_2 */
 			if ((wi->type & WWT_MASK) == WWT_IMGBTN_2 && clicked) img++;
-			DrawSprite(img, PAL_NONE, r.left + 1 + clicked, r.top + 1 + clicked);
+			::DrawSprite(img, PAL_NONE, r.left + 1 + clicked, r.top + 1 + clicked);
 			goto draw_default;
 		}
 
@@ -360,11 +360,11 @@
 
 			clicked = ((flags4 & (WF_SCROLL_UP | WF_HSCROLL)) == (WF_SCROLL_UP | WF_HSCROLL));
 			DrawFrameRect(r.left, r.top, r.left + 9, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
-			DrawSprite(SPR_ARROW_LEFT, PAL_NONE, r.left + 1 + clicked, r.top + 1 + clicked);
+			::DrawSprite(SPR_ARROW_LEFT, PAL_NONE, r.left + 1 + clicked, r.top + 1 + clicked);
 
 			clicked = ((flags4 & (WF_SCROLL_DOWN | WF_HSCROLL)) == (WF_SCROLL_DOWN | WF_HSCROLL));
 			DrawFrameRect(r.right-9, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
-			DrawSprite(SPR_ARROW_RIGHT, PAL_NONE, r.right - 8 + clicked, r.top + 1 + clicked);
+			::DrawSprite(SPR_ARROW_RIGHT, PAL_NONE, r.right - 8 + clicked, r.top + 1 + clicked);
 
 			c1 = _colour_gradient[wi->color&0xF][3];
 			c2 = _colour_gradient[wi->color&0xF][7];
@@ -422,7 +422,7 @@
 
 			clicked = !!(flags4 & WF_STICKY);
 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
-			DrawSprite((clicked) ? SPR_PIN_UP : SPR_PIN_DOWN, PAL_NONE, r.left + 2 + clicked, r.top + 3 + clicked);
+			::DrawSprite((clicked) ? SPR_PIN_UP : SPR_PIN_DOWN, PAL_NONE, r.left + 2 + clicked, r.top + 3 + clicked);
 			break;
 		}
 
@@ -431,7 +431,7 @@
 
 			clicked = !!(flags4 & WF_SIZING);
 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
-			DrawSprite(SPR_WINDOW_RESIZE, PAL_NONE, r.left + 3 + clicked, r.top + 3 + clicked);
+			::DrawSprite(SPR_WINDOW_RESIZE, PAL_NONE, r.left + 3 + clicked, r.top + 3 + clicked);
 			break;
 		}
 
--- a/src/widget/widget.h	Sun Mar 04 22:36:22 2007 +0000
+++ b/src/widget/widget.h	Tue Mar 06 13:06:38 2007 +0000
@@ -132,6 +132,7 @@
 	static /*static*/ void FillRect(const Rect16 &rc, int color);
 	static void DrawFrameRect(int left, int top, int right, int bottom, int ctab, FrameFlags flags);
 	void DrawFrameRect(int ctab, FrameFlags flags);
+	void DrawSprite(SpriteID img, SpriteID pal, const Point16 &local_pos);
 
 	virtual BaseWindow* GetWindow();
 	virtual Widget* WidgetFromPt(const Point16 &pt);
--- a/src/widget/widget_base.cpp	Sun Mar 04 22:36:22 2007 +0000
+++ b/src/widget/widget_base.cpp	Tue Mar 06 13:06:38 2007 +0000
@@ -215,6 +215,13 @@
 	DrawFrameRect(Left(), Top(), Right(), Bottom(), ctab, flags);
 }
 
+void Widget::DrawSprite(SpriteID img, SpriteID pal, const Point16 &local_pos)
+{
+	Point16 window_space_pos = TopLeft() + local_pos;
+	::DrawSprite(img, pal, window_space_pos.x, window_space_pos.y);
+}
+
+
 /*virtual*/ BaseWindow* Widget::GetWindow()
 {
 	if (m_container != NULL) {
--- a/src/widget/widget_button_img.cpp	Sun Mar 04 22:36:22 2007 +0000
+++ b/src/widget/widget_button_img.cpp	Tue Mar 06 13:06:38 2007 +0000
@@ -18,4 +18,13 @@
 #include "window_events.hpp"
 #include "widget_types.h"
 
+namespace gui {
 
+/*virtual*/ void ImageButton::OnPaint(EvtPaint &e)
+{
+	DrawBackground(e);
+	Point16 pos = m_sprite_offset + (m_pushed ? Point16(3, 3) : Point16(2, 2));
+	DrawSprite(m_sprite, PAL_NONE, pos);
+}
+
+} // namespace gui
--- a/src/widget/widget_button_img2.cpp	Sun Mar 04 22:36:22 2007 +0000
+++ b/src/widget/widget_button_img2.cpp	Tue Mar 06 13:06:38 2007 +0000
@@ -18,4 +18,17 @@
 #include "window_events.hpp"
 #include "widget_types.h"
 
+namespace gui {
 
+/*virtual*/ void ImageButton2::OnPaint(EvtPaint &e)
+{
+	DrawBackground(e);
+	if (m_pushed) {
+		DrawSprite(m_sprite_pushed, PAL_NONE, m_sprite_offset_pushed + Point(3, 3));
+	} else {
+		DrawSprite(m_sprite, PAL_NONE, m_sprite_offset + Point(2, 2));
+	}
+}
+
+} // namespace gui
+
--- a/src/widget/widget_resizebox.cpp	Sun Mar 04 22:36:22 2007 +0000
+++ b/src/widget/widget_resizebox.cpp	Tue Mar 06 13:06:38 2007 +0000
@@ -59,7 +59,7 @@
 
 	DrawBackground(ev);
 	bool sizing = m_ticket_sizing.IsActive();
-	DrawSprite(SPR_WINDOW_RESIZE, PAL_NONE, Left() + 3 + sizing, Top() + 3 + sizing);
+	DrawSprite(SPR_WINDOW_RESIZE, PAL_NONE, sizing ? Point16(4, 4) : Point16(3, 3));
 	ev.SetHandled();
 }
 
--- a/src/widget/widget_stickybox.cpp	Sun Mar 04 22:36:22 2007 +0000
+++ b/src/widget/widget_stickybox.cpp	Tue Mar 06 13:06:38 2007 +0000
@@ -31,13 +31,13 @@
 	super::OnCreate(ev);
 }
 
-/*virtual*/ void StickyBox::OnPaint(EvtPaint &ev)
-{
-	assert(Size() == Point16(DEFAULT_WIDTH, DEFAULT_HEIGHT));
-
-	DrawBackground(ev);
-	DrawSprite(m_pushed ? SPR_PIN_UP : SPR_PIN_DOWN, PAL_NONE, Left() + 2 + m_pushed, Top() + 3 + m_pushed);
-}
+///*virtual*/ void StickyBox::OnPaint(EvtPaint &ev)
+//{
+//	assert(Size() == Point16(DEFAULT_WIDTH, DEFAULT_HEIGHT));
+//
+//	DrawBackground(ev);
+//	DrawSprite(m_pushed ? SPR_PIN_UP : SPR_PIN_DOWN, PAL_NONE, Left() + 2 + m_pushed, Top() + 3 + m_pushed);
+//}
 
 /*virtual*/ void StickyBox::OnLeftClick(EvtLeftClick &ev)
 {
--- a/src/widget/widget_types.h	Sun Mar 04 22:36:22 2007 +0000
+++ b/src/widget/widget_types.h	Tue Mar 06 13:06:38 2007 +0000
@@ -57,6 +57,50 @@
 	/*virtual*/ void OnLeftButtonDown(EvtLeftButtonDown &ev);
 };
 
+struct ImageButton : public Button {
+	typedef Button super;
+
+protected:
+	SpriteID m_sprite;
+	Point16  m_sprite_offset;
+
+public:
+	ImageButton()
+		: Button()
+		, m_sprite(0)
+	{}
+
+	ImageButton(CompositeWidget *container, WidgetId id, FeatureFlags feature_flags, byte color, const Rect16 &rect, StringID tooltips, SpriteID sprite, Point16 sprite_offset)
+		: Button(container, id, feature_flags, color, rect, tooltips)
+		, m_sprite(sprite)
+		, m_sprite_offset(sprite_offset)
+	{}
+
+	/*virtual*/ void OnPaint(EvtPaint &ev);
+};
+
+struct ImageButton2 : public ImageButton {
+	typedef ImageButton super;
+
+protected:
+	SpriteID m_sprite_pushed;
+	Point16  m_sprite_offset_pushed;
+
+public:
+	ImageButton2()
+		: ImageButton()
+		, m_sprite_pushed(0)
+	{}
+
+	ImageButton2(CompositeWidget *container, WidgetId id, FeatureFlags feature_flags, byte color, const Rect16 &rect, StringID tooltips, SpriteID sprite, Point16 sprite_offset, SpriteID sprite_pushed, Point16 sprite_offset_pushed)
+		: ImageButton(container, id, feature_flags, color, rect, tooltips, sprite, sprite_offset)
+		, m_sprite_pushed(sprite_pushed)
+		, m_sprite_offset_pushed(sprite_offset_pushed)
+	{}
+
+	/*virtual*/ void OnPaint(EvtPaint &ev);
+};
+
 struct TextButton : public Button {
 	typedef Button super;
 
@@ -96,23 +140,23 @@
 	/*virtual*/ void OnLeftClick(EvtLeftClick &ev);
 };
 
-struct StickyBox : public Button {
-	typedef Button super;
+struct StickyBox : public ImageButton2 {
+	typedef ImageButton2 super;
 
 	static const int16 DEFAULT_WIDTH  = 12;
 	static const int16 DEFAULT_HEIGHT = 14;
 
 public:
 	StickyBox()
-		: Button()
+		: ImageButton2()
 	{}
 
 	StickyBox(CompositeWidget *container)
-		: Button(container, -103, FF_TOGGLE_BUTTON, container->m_color, Rect16(), STR_STICKY_BUTTON)
+		: ImageButton2(container, -103, FF_TOGGLE_BUTTON, container->m_color, Rect16(), STR_STICKY_BUTTON, SPR_PIN_DOWN, Point(0, 1), SPR_PIN_UP, Point(0, 1))
 	{}
 
 	/*virtual*/ void OnCreate(EvtCreate &ev);
-	/*virtual*/ void OnPaint(EvtPaint &ev);
+//	/*virtual*/ void OnPaint(EvtPaint &ev);
 	/*virtual*/ void OnLeftClick(EvtLeftClick &ev);
 };