src/widget/widget_button.cpp
author KUDr
Sun, 04 Mar 2007 22:36:22 +0000
branchcpp_gui
changeset 6289 be3d8bd9fb02
parent 6282 c5b92f2d924f
child 6301 e0251f797d59
permissions -rw-r--r--
(svn r9010) [cpp_gui] -Add: Sticky button widget
-Codechange: part of widget.h moved to separate file widget_types.h to minimize dependencies
6258
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
     1
/* $Id$ */
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
     2
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
     3
#include "../stdafx.h"
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
     4
#include <stdarg.h>
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
     5
#include "../openttd.h"
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
     6
#include "../debug.h"
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
     7
#include "../functions.h"
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
     8
#include "../map.h"
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
     9
#include "../player.h"
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
    10
#include "../window.h"
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
    11
#include "../gfx.h"
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
    12
#include "../viewport.h"
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
    13
#include "../console.h"
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
    14
#include "../variables.h"
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
    15
#include "../table/sprites.h"
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
    16
#include "../genworld.h"
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
    17
#include "../helpers.hpp"
6264
9fc3b5467396 (svn r8931) [cpp_gui] -Add: first OO widget type (TextButton) added only with basic functionality
KUDr
parents: 6258
diff changeset
    18
#include "window_events.hpp"
6289
be3d8bd9fb02 (svn r9010) [cpp_gui] -Add: Sticky button widget
KUDr
parents: 6282
diff changeset
    19
#include "widget_types.h"
6264
9fc3b5467396 (svn r8931) [cpp_gui] -Add: first OO widget type (TextButton) added only with basic functionality
KUDr
parents: 6258
diff changeset
    20
9fc3b5467396 (svn r8931) [cpp_gui] -Add: first OO widget type (TextButton) added only with basic functionality
KUDr
parents: 6258
diff changeset
    21
namespace gui {
9fc3b5467396 (svn r8931) [cpp_gui] -Add: first OO widget type (TextButton) added only with basic functionality
KUDr
parents: 6258
diff changeset
    22
6271
0ad100a98853 (svn r8958) [cpp_gui] -Add: Widget can now capture specified gui events
KUDr
parents: 6264
diff changeset
    23
void Button::OnCapturePressed(EvtMouseOver &e)
0ad100a98853 (svn r8958) [cpp_gui] -Add: Widget can now capture specified gui events
KUDr
parents: 6264
diff changeset
    24
{
6282
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    25
	BaseWindow *w = GetWindow();
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    26
	assert(w != NULL);
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    27
6271
0ad100a98853 (svn r8958) [cpp_gui] -Add: Widget can now capture specified gui events
KUDr
parents: 6264
diff changeset
    28
	if (_left_button_down) {
6282
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    29
		/* translate the global coordinates to our window space */
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    30
		Point16 pt_local = e.m_pt - w->TopLeft();
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    31
		/* determine the new button push state (is cursor inside button?) */
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    32
		bool pushed = (WidgetFromPt(pt_local) != NULL);
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    33
		/* did the push state change */
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    34
		if (pushed != m_pushed) {
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    35
			/* update button push state */
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    36
			m_pushed = pushed;
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    37
			Invalidate();
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    38
		}
6271
0ad100a98853 (svn r8958) [cpp_gui] -Add: Widget can now capture specified gui events
KUDr
parents: 6264
diff changeset
    39
		e.SetHandled();
0ad100a98853 (svn r8958) [cpp_gui] -Add: Widget can now capture specified gui events
KUDr
parents: 6264
diff changeset
    40
		return;
0ad100a98853 (svn r8958) [cpp_gui] -Add: Widget can now capture specified gui events
KUDr
parents: 6264
diff changeset
    41
	}
6282
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    42
	/* stop capturing mouse move events */
6271
0ad100a98853 (svn r8958) [cpp_gui] -Add: Widget can now capture specified gui events
KUDr
parents: 6264
diff changeset
    43
	m_ticket_pressed.Release();
0ad100a98853 (svn r8958) [cpp_gui] -Add: Widget can now capture specified gui events
KUDr
parents: 6264
diff changeset
    44
6282
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    45
	/* Issue OnLeftClick() event only if the button was pushed */
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    46
	if (m_pushed) {
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    47
		/* release button */
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    48
		m_pushed = false;
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    49
		Invalidate();
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    50
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    51
		/* issue click event */
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    52
		EvtLeftClick ev(e.m_pt - w->TopLeft());
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    53
		ev.m_widget = this;
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    54
		OnLeftClick(ev);
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    55
	}
6271
0ad100a98853 (svn r8958) [cpp_gui] -Add: Widget can now capture specified gui events
KUDr
parents: 6264
diff changeset
    56
}
0ad100a98853 (svn r8958) [cpp_gui] -Add: Widget can now capture specified gui events
KUDr
parents: 6264
diff changeset
    57
6264
9fc3b5467396 (svn r8931) [cpp_gui] -Add: first OO widget type (TextButton) added only with basic functionality
KUDr
parents: 6258
diff changeset
    58
/*virtual*/ void Button::DrawBackground(EvtPaint &ev)
9fc3b5467396 (svn r8931) [cpp_gui] -Add: first OO widget type (TextButton) added only with basic functionality
KUDr
parents: 6258
diff changeset
    59
{
9fc3b5467396 (svn r8931) [cpp_gui] -Add: first OO widget type (TextButton) added only with basic functionality
KUDr
parents: 6258
diff changeset
    60
	DrawFrameRect(m_color, m_pushed ? FR_LOWERED : FR_NONE);
9fc3b5467396 (svn r8931) [cpp_gui] -Add: first OO widget type (TextButton) added only with basic functionality
KUDr
parents: 6258
diff changeset
    61
}
9fc3b5467396 (svn r8931) [cpp_gui] -Add: first OO widget type (TextButton) added only with basic functionality
KUDr
parents: 6258
diff changeset
    62
6289
be3d8bd9fb02 (svn r9010) [cpp_gui] -Add: Sticky button widget
KUDr
parents: 6282
diff changeset
    63
/*virtual*/ void Button::OnLeftButtonDown(EvtLeftButtonDown &e)
6264
9fc3b5467396 (svn r8931) [cpp_gui] -Add: first OO widget type (TextButton) added only with basic functionality
KUDr
parents: 6258
diff changeset
    64
{
6289
be3d8bd9fb02 (svn r9010) [cpp_gui] -Add: Sticky button widget
KUDr
parents: 6282
diff changeset
    65
	if ((m_feature_flags & FF_TOGGLE_BUTTON) != FF_NONE) {
be3d8bd9fb02 (svn r9010) [cpp_gui] -Add: Sticky button widget
KUDr
parents: 6282
diff changeset
    66
		/* toggle button */
be3d8bd9fb02 (svn r9010) [cpp_gui] -Add: Sticky button widget
KUDr
parents: 6282
diff changeset
    67
		m_pushed = !m_pushed;
6282
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    68
6289
be3d8bd9fb02 (svn r9010) [cpp_gui] -Add: Sticky button widget
KUDr
parents: 6282
diff changeset
    69
		/* issue click event */
be3d8bd9fb02 (svn r9010) [cpp_gui] -Add: Sticky button widget
KUDr
parents: 6282
diff changeset
    70
		EvtLeftClick ev(e.m_pt);
be3d8bd9fb02 (svn r9010) [cpp_gui] -Add: Sticky button widget
KUDr
parents: 6282
diff changeset
    71
		ev.m_widget = this;
be3d8bd9fb02 (svn r9010) [cpp_gui] -Add: Sticky button widget
KUDr
parents: 6282
diff changeset
    72
		OnLeftClick(ev);
be3d8bd9fb02 (svn r9010) [cpp_gui] -Add: Sticky button widget
KUDr
parents: 6282
diff changeset
    73
	} else {
be3d8bd9fb02 (svn r9010) [cpp_gui] -Add: Sticky button widget
KUDr
parents: 6282
diff changeset
    74
		/* push button */
be3d8bd9fb02 (svn r9010) [cpp_gui] -Add: Sticky button widget
KUDr
parents: 6282
diff changeset
    75
		m_pushed = true;
be3d8bd9fb02 (svn r9010) [cpp_gui] -Add: Sticky button widget
KUDr
parents: 6282
diff changeset
    76
be3d8bd9fb02 (svn r9010) [cpp_gui] -Add: Sticky button widget
KUDr
parents: 6282
diff changeset
    77
		/* start capturing mouse move events */
be3d8bd9fb02 (svn r9010) [cpp_gui] -Add: Sticky button widget
KUDr
parents: 6282
diff changeset
    78
		m_ticket_pressed = CaptureEventsT(this, &Button::OnCapturePressed);
be3d8bd9fb02 (svn r9010) [cpp_gui] -Add: Sticky button widget
KUDr
parents: 6282
diff changeset
    79
	}
6282
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    80
	Invalidate();
6289
be3d8bd9fb02 (svn r9010) [cpp_gui] -Add: Sticky button widget
KUDr
parents: 6282
diff changeset
    81
	e.SetHandled();
6264
9fc3b5467396 (svn r8931) [cpp_gui] -Add: first OO widget type (TextButton) added only with basic functionality
KUDr
parents: 6258
diff changeset
    82
}
6258
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
    83
a2f86b8fd99b (svn r8801) [cpp_gui] -Codechange: few changes towards OO GUI:
KUDr
parents:
diff changeset
    84
6282
c5b92f2d924f (svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
KUDr
parents: 6271
diff changeset
    85
6264
9fc3b5467396 (svn r8931) [cpp_gui] -Add: first OO widget type (TextButton) added only with basic functionality
KUDr
parents: 6258
diff changeset
    86
}; // namespace gui