summaryrefslogtreecommitdiffstats
path: root/include/vtuikit.h
blob: 09257345217a9e4026f38d2f9c8c64b005b4b886 (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
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// $Id$
#ifndef _VISIO_H
#define _VISIO_H

/*
 * vtuikit.h
 * piaip's new implementation of vtuikit
 * 
 * see vtuikit.c for license, usage, and introduction.
 */

#include "bbs.h"
#include "ansi.h"   // we need it.
#include "vtkbd.h"  // we usually use it
#include <limits.h>

// THEME DEFINITION ----------------------------------------------------
#define VCLR_HEADER     ANSI_COLOR(1;37;46) // was: TITLE_COLOR
#define VCLR_HEADER_MID     ANSI_COLOR(1;33;46)
#define VCLR_HEADER_RIGHT   ANSI_COLOR(1;37;46)
#define VCLR_HDR        ANSI_COLOR(1;37;46)
#define VCLR_FOOTER_CAPTION     ANSI_COLOR(0;34;46)
#define VCLR_FOOTER             ANSI_COLOR(0;30;47)
#define VCLR_FOOTER_QUOTE       ANSI_COLOR(0;31;47)
#define VCLR_ZA_CAPTION     ANSI_COLOR(1;37;42)
#define VCLR_MSG_FLOAT      ANSI_COLOR(1;33;46)
#define VCLR_MSG        ANSI_COLOR(1;36;44)
#define VCLR_PAUSE_PAD      ANSI_COLOR(1;34;44)
#define VCLR_PAUSE      ANSI_COLOR(1;37;44)

#define VCLR_INPUT_FIELD    ANSI_COLOR(0;7)

#define VMSG_PAUSE      " 請按任意鍵繼續 "
#define VMSG_PAUSE_PAD      "▄"
#define VMSG_MSG_FLOAT      " [按任意鍵繼續]"
#define VMSG_MSG_PREFIX     " ◆ "
#define VMSG_HDR_PREFIX     "【 "
#define VMSG_HDR_POSTFIX    " 】"

// CONSTANT DEFINITION -------------------------------------------------
#define VCOL_MAXW       (INT16_MAX)
#define VCOL_MAXPRI     (INT16_MAX)

#define VFILL_DEFAULT       (0x00)
// #define VFILL_NO_ANSI        VFILL_DEFAULT
#define VFILL_HAS_ANSI      (0x01)
// #define VVILL_LEFT_ALIGN VFILL_DEFAULT
#define VFILL_RIGHT_ALIGN   (0x02)
// #define VFILL_HAS_BORDER VFILL_DEFAULT
#define VFILL_NO_BORDER     (0x08)

#define VGET_DEFAULT        (0x00)
// #define VGET_DOECHO      (VGET_DEFAULT)
#define VGET_NOECHO     (0x01)
#define VGET_LOWERCASE      (0x02)
#define VGET_DIGITS     (0x04)
#define VGET_TRANSPARENT    (0x08)
#define VGET_ASCII_ONLY     (0x10)
#define VGET_PASSWORD       (VGET_NOECHO | VGET_ASCII_ONLY)

// DATATYPE DEFINITION -------------------------------------------------
typedef void *  VREFSCR;
typedef long    VREFCUR;

typedef short   VCOLW;
typedef short   VCOLPRI;

typedef struct VCOL {
    char *attr;     // default attribute
    VCOLW minw;     // minimal width
    VCOLW maxw;     // max width
    VCOLPRI pri;    // priority (higher expands first)

    struct {
    char has_ansi;      // field data have ANSI escapes
    char right_align;   // align output to right side
    char usewhole;      // draw entire column and prevent borders
    }   flags;

} VCOL;

#define VGETCB_NONE (0) // do nothing
#define VGETCB_NEXT (1) // skip to next event loop 
#define VGETCB_END  (2) // finish input
#define VGETCB_ABORT    (3) // clear buffer and finish

typedef struct {
    char    *buf;
    const int len;  // callbacks should not change this.
    int      icurr; // cursor position
    int      iend;  // buffer tail (= strlen(buf))
} VGET_RUNTIME;

typedef int (*VGET_FCALLBACK)(int key, VGET_RUNTIME *prt, void *instance);
typedef struct {
    VGET_FCALLBACK   peek;   // called immediately after key hit
    VGET_FCALLBACK   data;   // called before inserting character data
    VGET_FCALLBACK   post;   // called after every data inserted into buffer.
}   VGET_CALLBACKS;

// API DEFINITION ----------------------------------------------------

// curses flavor
void prints(const char *fmt, ...) GCC_CHECK_FORMAT(1,2);
void mvprints(int y, int x, const char *fmt, ...) GCC_CHECK_FORMAT(3,4);
void mvouts(int y, int x, const char *str);

// input history
int  InputHistoryAdd    (const char *s);
int  InputHistoryExists (const char *s);
void InputHistoryPrev   (char *s, int sz);
void InputHistoryNext   (char *s, int sz);

// v*: primitive rendering
void vpad   (int n, const char *pattern);       /// pad n fields by pattern
 int vgety  (void);                 /// return cursor position (y)
void vfill  (int n, int flags, const char *s);      /// fill n-width space with s
void vfillf (int n, int flags, const char *s, ...) GCC_CHECK_FORMAT(3,4); /// formatted version of vfill
void vbarlr (const char *l, const char *r);     /// draw a left-right expanded bar with (l,r)
void vbarf  (const char *s, ...)  GCC_CHECK_FORMAT(1,2); /// vbarlr with formatted input (\t splits (l,r)
void vshowmsg(const char *msg);             /// draw standard pause/message

// v*: input widgets
// int  vans(char *prompt); // prompt at bottom and return y/n in lower case.
 int vmsg   (const char *msg);                  /// draw standard pause/message and return input
 int vmsgf  (const char *fmt,...) GCC_CHECK_FORMAT(1,2);    /// formatted input of vmsg
 int vans   (const char *msg);                  /// prompt and return (lowercase) single byte input
 int vansf  (const char *fmt,...) GCC_CHECK_FORMAT(1,2);    /// formatted input of vans

// vget: (y, x, ...)
int vgets   (char *buf, int len, int flags);            /// input with edit box control
int vgetstr (char *buf, int len, int flags, const char *str);/// input with default value
int vget    (int y, int x, const char *prompt, char *buf, int len, int mode);
int vgetstring(char *_buf, int len, int flags, const char *defstr, const VGET_CALLBACKS *pcbs, void *instance);

// vs_*: formatted and themed virtual screen layout
// you cannot use ANSI escapes in these APIs.
void vs_header  (const char *title,   const char *mid, const char *right);  // vs_head, showtitle
void vs_hdr (const char *title);                        // vs_bar,  stand_title
void vs_footer  (const char *caption, const char *prompt);

void vs_rectangle_simple(int l, int t, int r, int b);   // draw a single line rectangle, not filling inside interior

// columned output
void vs_cols_layout (const VCOL* cols, VCOLW *ws, int n);   /// calculate VCOL to fit current screen in ws
void vs_cols        (const VCOL* cols, const VCOLW *ws, int n, ...);

// VREF: save and storing temporary objects (restore will also free object).
VREFSCR vscr_save   (void);
void    vscr_restore(VREFSCR);
VREFCUR vcur_save   (void);
void    vcur_restore(VREFCUR);

#endif // _VISIO_H