summaryrefslogtreecommitdiff
path: root/gmod/ui_checkbox.h
blob: 50cad1c6751b54e414f2e366a9c503373662c495 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#pragma once
#include "ui_base_item.h"

namespace ui
{
	class c_checkbox : public base_item {
	public:
		c_checkbox( int x, int y, const char* txt, bool* setting ) :
			base_item( x, y, 16, 16, txt ), m_setting( setting ) { }

		virtual bool is_hovered( ) override {
			if ( m_disabled ) return false;

			int mouse_x, mouse_y;
			ui_get_cursor_pos( mouse_x, mouse_y );

			int rel_x = get_relative_x( );
			int rel_y = get_relative_y( );

			return mouse_x >= rel_x && mouse_x <= rel_x + m_width
				&& mouse_y >= rel_y && mouse_y <= rel_y + m_height;
		}

		inline void render_checkbox( const int& x, const int& y ) {
			clr_t col = ui_get_bg_col( );
			if ( is_hovered( ) ) {
				col = *m_setting ? ui_get_accent_col( ) * 0.8f : ui_get_bg_col( ) * 1.3f;
			}
			else if ( *m_setting ) {
				col = ui_get_accent_col( );
			}

			ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) );
			ui_draw_rect( x + 1, y + 1, m_width - 2, m_height - 2, col );

			//ui_draw_outlined_rect( x, y, m_width, m_height, ui_get_accent_col( ) );
		}

		inline void input( ) {
			bool mouse_presesed = g_input.is_key_pressed( KEYS_MOUSE1 );

			if ( is_hovered( ) && mouse_presesed ) {
				if ( !m_mouse_held ) {
					*m_setting = !*m_setting;
				}
				m_mouse_held = true;
			}
			else {
				m_mouse_held = false;
			}
		}

		virtual void render( ) override {
			int x = get_relative_x( );
			int y = get_relative_y( );

			render_checkbox( x, y );
			input( );


			ui_draw_string( x + m_width + 6, y + 2, false, ui_get_text_col( ), m_text );
		}

	protected:
		bool* m_setting;
		bool m_mouse_held{ };
	};
}