summaryrefslogtreecommitdiff
path: root/tex/context/base/mkxl/scrn-hlp.mklx
blob: 9f0c5dbdd078e4822f75e434feeebdf017c1a7ac (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
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
155
156
157
158
159
160
%D \module
%D   [       file=scrn-hlp,
%D        version=1998.10.10,
%D          title=\CONTEXT\ Screen Macros,
%D       subtitle=Help (Experimental),
%D         author={Hans Hagen \& Ton Otten},
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

\writestatus{loading}{ConTeXt Screen Macros / Help popups}

%D As this functionality was in the core and as I don't know how often it is used,
%D we'll keep it around. However, it is upgraded and usage has changed a bit. We
%D also use some \LUA\ magic in order to avoid multiple passes.

\registerctxluafile{scrn-hlp}{}

%D Using help boils down to plugging the placement macro someplace visible, like:
%D
%D \starttyping
%D \setuptexttexts[\centerbox{\placehelp}]
%D \stoptyping
%D
%D When this is done, the following should work out okay:
%D
%D \starttyping
%D test \helptext{word}{tip top 1 is somewhat longer} test
%D test \helptext{word}{tip top 2} test
%D
%D \starthelptext[oeps]
%D \input tufte
%D \stophelptext
%D
%D test test \showhelp{some help}[oeps] test
%D test test \button[location=depth]{\helpsignal{oeps}OEPS}[oeps] test
%D
%D test test \button[location=depth]{next}[page(2)] test
%D
%D \page
%D
%D test \helptext{word}{tip top one} test
%D test \helptext{word}{tip top two} test
%D \stoptyping
%D
%D Currently you need to use the signal in custom macros but that might change at
%D some point.

\unprotect

% also status

\newbox    \b_scrn_help_box
\newinteger\c_scrn_help_n

\definesystemattribute[help][public]

\installcorenamespace{popuphelp}

\installframedcommandhandler \??popuphelp {help} \??popuphelp

\setuphelp
  [\c!frame=\v!off,
   \c!align=\v!normal,
   \c!background=\v!color,
   \c!backgroundcolor=gray]

\appendtoks
    \frozen\instance\protected\edefcsname        \currenthelp\endcsname{\scrn_help_argument{\currenthelp}}%
    \frozen\instance\protected\edefcsname\e!start\currenthelp\endcsname{\scrn_help_start   {\currenthelp}}%
    \frozen\instance\protected\edefcsname\e!stop \currenthelp\endcsname{\scrn_help_stop                  }%
\to \everydefinehelp

\mutable\lettonothing\currenthelpreference
\mutable\lettonothing\currenthelpname

\protected\def\scrn_help_argument#category%
  {\def\currenthelp{#category}%
   \global\advanceby\c_scrn_help_n\plusone
   \edef\currenthelpname{help:\number\c_scrn_help_n}%
   \doifelselocation\scrn_help_argument_indeed\scrn_help_argument_ignore}

\tolerant\def\scrn_help_argument_indeed[#reference]#:#text#target%
  {\edef\currenthelpreference{#reference}%
   \dontleavehmode \hbox \bgroup
     \dontcomplain
     \setbox\b_scrn_help_box\hbox{\strut#text}%
     \scrn_help_register{#target}%
   \egroup % can be usernode instead
   \goto
     {\helpsignal{\number\c_scrn_help_n}#target}%
     [\helpaction{\number\c_scrn_help_n}]}

\tolerant\def\scrn_help_argument_ignore[#reference]#:#text#target%
  {#target}

\tolerant\protected\def\scrn_help_start#category#spacer[#reference]%
  {\global\advanceby\c_scrn_help_n\plusone
   \edef\currenthelp{#category}%
   \edef\currenthelpreference{#reference}%
   \edef\currenthelpname{help:\number\c_scrn_help_n}%
   \grabbufferdatadirect\currenthelp{\e!start\currenthelp}{\e!stop\currenthelp}}

\protected\def\scrn_help_stop
  {\iflocation
     \scrn_help_register{\getbuffer[\currenthelp]}%
   \fi}

\def\scrn_help_register#text%
  {\setbox\b_scrn_help_box\hbox{\inheritedhelpframed{#text}}% \hpack ?
   \definesymbol
     [\currenthelpname]
     [\copy\b_scrn_help_box]%
   \definefieldbody
     [\currenthelpname]
     [\c!type=push,
      \c!width=\wd\b_scrn_help_box,
      \c!height=\ht\b_scrn_help_box,
      \c!depth=\dp\b_scrn_help_box,
      \c!option=\v!hidden,
      \c!clickin=action(hide{\currenthelpname}),
      \c!closepage=action(hide{\currenthelpname}),
      \c!values=\currenthelpname]%
   \setbox\b_scrn_help_box\hbox
     {\fieldbody[\currenthelpname]}%
   \clf_registerhelp
     number \c_scrn_help_n
     name   {\currenthelpreference}%
     box    \b_scrn_help_box
   \relax}

\permanent\protected\def\doifelsehelp
  {\ifcase\c_scrn_help_n
     \expandafter\firstoftwoarguments
   \else
     \expandafter\secondoftwoarguments
   \fi}

\aliased\let\doifhelpelse\doifelsehelp

\permanent\protected\def\placehelp % was \helpdata
  {\ifinpagebody\ifcase\c_scrn_help_n\else
     \clf_collecthelp\normalpagebox
   \fi\fi}

\permanent\def\helpreference#category{\clf_helpreference{#category}} % could be public implementors
\permanent\def\helpaction   #category{\clf_helpaction   {#category}} % could be public implementors

\permanent\protected\def\helpsignal#category%
  {\hbox attr \helpattribute \helpreference{#category}{}}

\permanent\protected\def\showhelp#target[#category]%
  {\goto{\helpsignal{#category}#target}[#category]}

\definehelp[\v!helptext]

\protect \endinput