summaryrefslogtreecommitdiffstats
path: root/include/visio.h
blob: aafcd0afac51356df0137ef7d1fda836603613f8 (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
// $Id$
#ifndef _VISIO_H
#define _VISIO_H

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

#include "bbs.h"
#include "ansi.h"   // we need 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_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 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)

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

typedef short   VCOLW;
typedef struct {
    char *attr;     // default attribute
    VCOLW minw;     // minimal width
    VCOLW maxw;     // max width

    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;

typedef int (*VGET_CALLBACK)(char *buf, int *pcurr, int len, void *ptr);
typedef struct {
    VGET_CALLBACK   peek;   // called immediately after key hit
    VGET_CALLBACK   accept; // called before inserting character data
    // ... ?
}   VGET_EXTENSION;

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

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

// input history
int  InputHistoryAdd (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);

// 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);

// 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