summaryrefslogtreecommitdiff
path: root/fw/fe310/eos/eve/screen/view.c
blob: d6e9ede2a0d26738fb92d3155a4c61785483fa8d (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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <stdlib.h>
#include <string.h>

#include "eve.h"
#include "eve_kbd.h"
#include "eve_font.h"

#include "window.h"

void eve_view_init(EVEView *view, EVEWindow *window, eve_view_draw_t draw, eve_view_touch_t touch, eve_view_uievt_t uievt, void *param) {
    view->draw = draw;
    view->touch = touch;
    view->uievt = uievt;
    view->param = param;
    view->window = window;
    view->color_bg = 0x000000;
    view->color_fg = 0xffffff;
    window->view = view;
}

void eve_view_set_color_bg(EVEView *view, uint8_t r, uint8_t g, uint8_t b) {
    view->color_bg = (r << 16) | (g << 8) | b;
}

void eve_view_set_color_fg(EVEView *view, uint8_t r, uint8_t g, uint8_t b) {
    view->color_fg = (r << 16) | (g << 8) | b;
}

uint8_t eve_view_clear(EVEView *view, uint8_t tag0, uint8_t tag_opt) {
    EVEWindow *win_scroll = NULL;
    EVEWindow *window = view->window;
    uint8_t _tag;

    win_scroll = eve_window_scroll(window->root, &_tag);
    eve_cmd_dl(CLEAR_COLOR_RGBC(view->color_bg));
    eve_cmd_dl(COLOR_RGBC(view->color_fg));
    if (win_scroll == window) {
        view->tag = _tag;
        eve_touch_set_opt(view->tag, tag_opt);
        eve_cmd_dl(TAG(view->tag));
        eve_cmd_dl(CLEAR_TAG(view->tag));
    } else if (win_scroll) {
        view->tag = EVE_NOTAG;
        eve_cmd_dl(TAG(view->tag));
        eve_cmd_dl(CLEAR_TAG(view->tag));
    } else {
        view->tag = tag0;
        if (tag0 != EVE_NOTAG) {
            eve_touch_set_opt(tag0, tag_opt);
            eve_cmd_dl(CLEAR_TAG(tag0));
            tag0++;
        }
    }
    eve_cmd_dl(CLEAR(1,1,1));
    return tag0;
}

int eve_view_uievt_push(EVEView *view, uint16_t evt, void *param) {
    if (view->uievt) return view->uievt(view, evt, param);
    return 0;
}

int eve_view_uievt_push_gest(EVEView *view, uint16_t evt, EVETouch *touch, uint16_t t_evt, uint8_t tag0) {
    if (view->uievt) {
        EVEUIEvtTouch param;

        param.touch = touch;
        param.evt = t_evt;
        param.tag0 = tag0;
        return view->uievt(view, evt, &param);
    }
    return 0;
}

void eve_stack_init(EVEViewStack *stack) {
    memset(stack, 0, sizeof(EVEViewStack));
}

void eve_stack_create_view(EVEViewStack *stack, EVEWindow *window, eve_view_constructor_t constructor) {
    int rv;

    stack->dirty = 1;
    if (stack->level < EVE_VIEW_SIZE_STACK - 1) {
        stack->constructor[stack->level] = constructor;
        stack->level++;
        rv = constructor(window, stack);
        if (rv) eve_stack_back(stack, window);
    }
}

void eve_stack_back(EVEViewStack *stack, EVEWindow *window) {
    eve_view_constructor_t constructor;
    int rv = 1;

    stack->dirty = 1;
    while ((stack->level > 1) && rv) {
        stack->level--;
        constructor = stack->constructor[stack->level - 1];
        rv = constructor(window, stack);
    }
}

eve_view_constructor_t eve_stack_get(EVEViewStack *stack) {
    if (stack->level) return stack->constructor[stack->level - 1];
    return NULL;
}