summaryrefslogtreecommitdiff
path: root/src/gui/view.cpp
blob: d053f998b42a3564270f86bf5caf39124400bdba (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
#include "base.h"
#include "../util/profiler.h"

void gui_view_draw_fn( void* ptr ) { _profiled
  GUI_VIEW* view = (GUI_VIEW*)ptr;

  I32 x = gui_relx( view );
  I32 y = gui_rely( view );

  gui_draw_push_clip( x, y, view->w, view->h );
  view->children.each( fn( GUI_BASE** childptr ) {
    GUI_BASE* child = *childptr;
    if( !child->enabled ) return;

    if( child->draw_fn ) child->draw_fn( child );
    else dlog( "gui_view_draw_fn(): child %p no draw_fn\n", child );
  } );
  gui_draw_pop_clip();
}

void gui_view_input_fn( void* ptr ) {
  GUI_VIEW* view = (GUI_VIEW*)ptr;

  if( view->initheld ) {
    U8 m1 = gui_mbutton_down( 0 );
    if( m1 )
      return;

    view->initheld = 0;
  }

  gui_base_input_fn( view );
}

GUI_VIEW* gui_view( I32 x, I32 y, I32 w, I32 h ) {
  GUI_VIEW* view = new GUI_VIEW;
  view->x = x;
  view->y = y;
  view->xbound = view->w = w;
  view->ybound = view->h = h;
  strcpy( view->name, "BASE_VIEW" );

  view->draw_fn = gui_view_draw_fn;
  view->input_fn = gui_view_input_fn;

  view->initheld = 1;

  GUI_VIEW* curview = gui_get_view();
  if( !curview ) {
    view->parent = gui_get_window();
    gui_get_window()->children.push( view );
  }
  else {
    view->parent = curview;
    curview->children.push( view );
  }

  gui_set_view( view );
  return view;
}