summaryrefslogtreecommitdiff
path: root/gmod/ui_menu.h
blob: 53a17a097a08ecdad0fedeffca8a996876ef9036 (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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#pragma once
#include "ui_base_item.h"

namespace ui
{
	class c_menu : public base_item {
	public:
		c_menu( int start_x, int start_y, int width,
			int height, const char* name, const char* right_text = nullptr ) :
			base_item( start_x, start_y, width, height, name ),
			m_right_text( right_text ) { }

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

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

			return mouse_x >= m_x && mouse_x <= m_x + w( )
				&& mouse_y >= m_y && mouse_y <= m_y + 19;
		}

		virtual int y( ) const override {
			return m_y + 19;
		}

		inline void input( ) {
			int mouse_x, mouse_y;
			ui_get_cursor_pos( mouse_x, mouse_y );
			bool mouse_clicked = g_input.is_key_pressed( KEYS_MOUSE1 );

			if ( is_hovered( ) ) {
				m_mouse_held = true;
			}

			if ( !mouse_clicked ) {
				m_mouse_held = is_hovered( );
			}

			if ( m_mouse_held && !mouse_clicked ) {
				m_drag_offset_y = mouse_y - m_y;
				m_drag_offset_x = mouse_x - m_x;
			}

			if ( m_mouse_held && mouse_clicked ) {
				m_x = mouse_x - m_drag_offset_x;
				m_y = mouse_y - m_drag_offset_y;
			}
		}

		virtual void render( ) override {
			constexpr auto top_height = 19;

			input( );

			//draw a c00l shadow
			ui_draw_outlined_rect( m_x, m_y + 1, m_width + 1, m_height, clr_t( 0, 0, 0, 166 ) );

			ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, ui_get_bg_col( ) * 1.2f );
			if( is_hovered( ) ) {
				ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, clr_t( 61, 61, 61 ) );
			}

			for( int i{ }; i < 8; ++i ) {
				clr_t col = ui_get_bg_col( ) * ( 0.72f + i * 0.04f );
				ui_draw_rect( m_x, m_y + i + top_height - 1, m_width, m_height - i * 2 - top_height + 1, col );
			}
			ui_draw_outlined_rect( m_x, m_y, m_width, m_height, ui_get_accent_col( ) );

			if( m_right_text ) {
				ui_draw_string( m_x + 5, m_y + 4, false, ui_get_text_col( ), m_text );
				
				int width, height;
				ui_get_text_size( width, height, m_right_text );

				ui_draw_string( m_x + m_width - 5 - width, m_y + 4, false, ui_get_text_col( ), m_right_text );
			}
			else {
				ui_draw_string( m_x + m_width / 2, m_y + 4, true, ui_get_text_col( ), m_text );
			}
		}

	protected:
		int m_drag_offset_x{ };
		int m_drag_offset_y{ };
		bool m_mouse_held{ };
		const char* m_right_text{ };
	};
}