aboutsummaryrefslogtreecommitdiffstats
path: root/src/ui/root.c
blob: 26ca0ac9c29e6d1a947883e62dca86ef1c8ccf24 (plain) (blame)
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
#include <assert.h>

#include "ui.internal.h"

/* top margin for menu bar */
#define UI__ROOT_MARGIN_TOP    (1)

/* bottom margin for status bar */
#define UI__ROOT_MARGIN_BOTTOM (1)

#define UI__ROOT_MARGIN_LEFT   (0)
#define UI__ROOT_MARGIN_RIGHT  (0)

const char *ui__status_text = NULL;

WINDOW *ui__root_place_content_window(struct ui_window_root *root)
{
  int maxy, maxx;
  int begy, begx;
  getmaxyx(root->super.cwindow, maxy, maxx);
  getbegyx(root->super.cwindow, begy, begx);

  begy += UI__ROOT_MARGIN_TOP;
  maxy -= UI__ROOT_MARGIN_TOP + UI__ROOT_MARGIN_BOTTOM;

  begx += UI__ROOT_MARGIN_LEFT;
  begx -= UI__ROOT_MARGIN_LEFT + UI__ROOT_MARGIN_RIGHT;

  return newwin(maxy, maxx, begy, begx);
}

void ui__root_draw_proc(struct ui_window_base *base)
{
  struct ui_window_root *root = ui__cast(root, base);

  attron(A_REVERSE);
  mvwhline(base->cwindow, 0, 0, ' ', getmaxx(base->cwindow));
  mvwhline(base->cwindow, getmaxy(base->cwindow)-1, 0, ' ', getmaxx(base->cwindow));

  if (ui__status_text) {
    mvwprintw(base->cwindow, getmaxy(base->cwindow)-1, 1, "Status: %s", ui__status_text);
  }

  attroff(A_REVERSE);

  wnoutrefresh(base->cwindow);

  if (root->content) {
    ui__call_draw_proc(root->content);
  }

  if (root->floating) {
    ui__call_draw_proc(root->floating);
  }

  doupdate();
}

void ui__root_layout_proc(struct ui_window_base *base)
{
  struct ui_window_root *root = ui__cast(root, base);

  if (root->content) {
    delwin(root->content->cwindow);
    root->content->cwindow = ui__root_place_content_window(root);
    ui__call_layout_proc(root->content);
  }
}

void ui__root_set_content(struct ui_window_root *root, struct ui_window_base *window)
{
  assert(!window->parent);
  assert(!window->cwindow);
  assert(!root->content);

  window->cwindow = ui__root_place_content_window(root);
  root->content = window;
  window->parent = ui__cast(base, root);
}