Files
TeslaRel410/sda4/BRIEF/MACROS/DLG_LIST.CB
T
CydandClaude Fable 5 db7745fcd0 sda4: commit the Glaze developer hard-drive dump
Un-ignored: the dev drive is the ground truth the restoration and
emulator work constantly reference (DPL3/LIBDPL + VRENDER i860 renderer
source, BT/RP live+dev game trees, VGL_LABS pod boot, scene/audio
content). Kept in-repo for the pod-owner community.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 19:41:15 -05:00

220 lines
5.5 KiB
Plaintext

/*
** BRIEF -- Basic Reconfigurable Interactive Editing Facility
**
**
** dlg_list.cb:
**
** This file contains all BRIEF macros for managing dialog box lists.
*/
#include <dialog.h>
#include <dlg.h>
/*
** _list_next, _list_prev:
**
** Moves the mark from one button to the next or previous button
** on a list. Lists do not wrap.
*/
void _list_next ()
{
raise_anchor ();
save_position ();
search_fwd ("{\\t\\c[~\\t]}|\\n", TRUE);
restore_position (at_eol ());
_list_highlight ();
}
void _list_prev ()
{
int col,
len;
raise_anchor ();
inq_position (NULL, col);
/*
** If we move past the beginning of the list when we move two
** columns left, there is no previous button. If we are still
** in the list, we are at the end of the previous button.
** All we have to do is move one past the previous tab character.
** This we do in 2 steps because we have to read, starting at
** the beginning of the list.
*/
if ((len = (col -= 2) - _dialog_col) > 0)
{
move_abs (0, _dialog_col);
move_rel (0, rindex (read (len), "\t"));
}
_list_highlight ();
}
/*
** _list_highlight:
**
** Highlights the list button where the cursor is. Also, since
** this function is called by all the functions that change the value
** of a list, calls the action function with that code.
*/
void _list_highlight ()
{
string value;
int len = index (value = read (), "\t") - 2;
move_rel (0, len);
drop_anchor ();
move_rel (0, 0 - len);
execute_macro (_dialog_action_func, DIALOG_ALTER_LIST, _dialog_row, substr (value, 1, len+1));
}
/*
** _list_home, _list_end:
**
** Moves the highlight to the first or last button on a list.
*/
void _list_home ()
{
move_abs (0, _dialog_col);
_list_next ();
}
void _list_end ()
{
end_of_line ();
_list_prev ();
}
/*
** _list_go:
**
** Reads a character (that was just inserted; _list_go is
** called as a type 0 registered macro) from the buffer and deletes
** it, then looks for a matching button before the end of the list.
** If there is none, looks for one starting with the first item.
** If there is still none, stays put. (If a button is found,
** _list_go moves to it and highlights it.)
**
** Note that alphabetic keys pressed will only find buttons
** beginning with the upper case versions of the letters.
*/
void _list_go (int key)
{
int col,
offset;
string pattern;
raise_anchor ();
sprintf (pattern, "%c", key);
pattern = "\t" + upper (pattern);
if (offset = index (read (), pattern))
move_rel (0, offset);
else
{
save_position ();
move_abs (0, _dialog_col);
if (offset = index (read (), pattern))
move_rel (0, offset);
else
beep ();
restore_position (!offset);
}
_list_highlight ();
}
/*
** _list_button:
**
** Returns the text of the current list button, excluding any
** surrounding parentheses or tabs.
*/
string _list_button ()
{
string button = read ();
returns (substr (button, 1, index (button, "\t") - 1));
}
/*
** _is_list_
**
** Determine if the given line and column position is in
** a dialog manager list. Called by mouse_dialog to determin
** if the user clicked in a list.
**
** Input:
** Current buffer equal _dialog_disp_buf
** buf_line - the line position of a click.
** buf_col - the column position of the click
**
** Returns
** TRUE if a list entry was clicked on. Returns FALSE
** if a list was not clicked on OR if a tab in a list was
** clicked on OR if the () in a list was clicked on. Returns
** with the current buffer equal to _dialog_disp_buf. In
** _dialog_data_buf the position is the beginning of the line
** of the line containing the list control that was clicked on.
**
*/
int _is_list( int buf_line, int buf_col )
{
int list_left, len;
string ctrl_string, temp, list_text;
/* Are there any lists specified for the line that the user clicked on?? */
set_buffer (_dialog_data_buf); // switch to the data buffer
top_of_buffer();
sprintf( ctrl_string,
"list[ \t]@([ \t]@%d[ \t]@,[ \t]@[0-9]*[ \t]@)", buf_line );
while ( search_fwd( ctrl_string, TRUE, FALSE ) ) {
/*
** Yes - there are list(s) specified for this line.
** See if the position was in this one
*/
temp = read(); // get the control spec for the list
/*
** Extract the text of the list. Compute the length of
** text without any leading or trailing ().
** Note: The first entry in the
** list is placed at the list's starting position.
*/
list_text = substr( temp,index( temp, "\"")+1);
len = strlen( list_text ) - 2; // dont include trailing " and \n
if ( rindex( list_text, ")") == len ) len--;
if ( index( list_text, "(") == 1 ) {
len--;
list_text = substr( list_text, 2 ); // delete leading (
}
list_left = atoi( substr( temp, (index(temp,",")+1) ) );
if ( list_left <= buf_col && buf_col <= (list_left+len-1) ) {
beginning_of_line(); // beginning of line of the control spec
/*
** Found the clicked on list, make sure an entry and not
** a tab was clicked on. If a () was clicked on just ignore it
*/
set_buffer( _dialog_disp_buf );
temp = read(1); // get the char under the mouse cursor.
if ( temp != "\t" &&
temp != "(" && temp != ")" ) {
return( TRUE );
}
break; // exit the search
}
move_rel( 1,0); // move to next entry in the information buffer
}
set_buffer( _dialog_disp_buf );
return( FALSE );
}