added console search

This commit is contained in:
myT 2022-04-29 21:18:50 +02:00
parent 866b93ef5e
commit 3f189e58be
5 changed files with 113 additions and 1 deletions

View file

@ -4,6 +4,11 @@ See the end of this file for known issues.
DD Mmm 20 - 1.53
add: /searchconsole begins a new console search
press ctrl-F when the console is down to bring up the command
press (shift-)F3 to find the next match going up or down
just like in cmdlist/cvarlist/etc, * will match any amount of characters
add: r_ignoreShaderSortKey <0|1> (default: 0) ignores the shader sort key of transparent surfaces
instead, it sorts by depth and original registration order only
this is a work-around for broken maps like bones_fkd_b4 (grates drawn in front of simple items)

View file

@ -42,6 +42,7 @@ static cvar_t* con_drawHelp;
X(Cmd, "4FA7BD", qfalse, "RGB color of command names") \
X(Value, "E5BC39", qfalse, "RGB color of variable values") \
X(Help, "ABC1C6", qfalse, "RGB color of help text") \
X(Search, "FFFF00", qfalse, "RGB color of search result marker") \
X(HL, "303033FF", qtrue, help_con_colHL)
#define COLOR_LIST_ITEM( Name, Default, HasAlpha, Help ) \
@ -93,6 +94,10 @@ struct console_t {
int helpLines; // line count
qbool helpDraw;
float helpXAdjust;
char searchPattern[256];
qbool searchLineIndex;
qbool searchStarted;
};
static console_t con;
@ -104,6 +109,8 @@ static console_t con;
int g_console_field_width = CONSOLE_WIDTH;
static void Con_BeginSearch_f();
static qbool IsValidHexChar( char c )
{
return
@ -411,7 +418,8 @@ static const cmdTableItem_t con_cmds[] =
{ "messagemode3", Con_MessageMode3_f, NULL, "chat with the player being aimed at" },
{ "messagemode4", Con_MessageMode4_f, NULL, "chat with the last attacker" },
{ "clear", Con_Clear_f, NULL, "clears the console" },
{ "condump", Con_Dump_f, NULL, "dumps console history to a text file" }
{ "condump", Con_Dump_f, NULL, "dumps console history to a text file" },
{ "searchconsole", Con_BeginSearch_f, NULL, help_searchconsole }
};
@ -805,6 +813,11 @@ static void Con_DrawSolidConsole( float frac )
SCR_DrawChar( 1 + con.xadjust + j * con.cw, 1 + y, con.cw, con.ch, (text[j] & 0xFF) );
}
if ((row % con.totallines) == con.searchLineIndex) {
re.SetColor( colSearch );
SCR_DrawChar( con.xadjust - con.cw, y, con.cw, con.ch, 141 );
}
re.SetColor( colText );
for (int j = 0; j < con.linewidth; ++j) {
if ((text[j] >> 8) != color) {
@ -940,3 +953,72 @@ void Con_Close()
con.finalFrac = 0; // none visible
con.displayFrac = 0;
}
static void Con_BeginSearch_f()
{
if ( Cmd_Argc() != 2 ) {
Com_Printf( "usage: %s search_pattern\n", Cmd_Argv(0) );
return;
}
Q_strncpyz( con.searchPattern, Cmd_Argv(1), sizeof(con.searchPattern) );
con.searchLineIndex = con.current;
con.searchStarted = qtrue;
Con_ContinueSearch( qtrue );
}
void Con_ContinueSearch( qbool forward )
{
if ( !con.searchStarted )
return;
// end is 1 past the end
int incr, start, end;
if ( forward ) {
// bottom-up
incr = -1;
start = con.searchLineIndex + con.totallines - 1;
end = start - con.totallines;
} else {
// top-down
incr = 1;
start = con.searchLineIndex + 1;
end = start + con.totallines;
}
char rawText[256];
assert( sizeof(rawText) > con.linewidth );
rawText[con.linewidth] = '\0';
for ( int l = start; l != end; l += incr ) {
const int line = l % con.totallines;
const short* const coloredText = &con.text[line * con.linewidth];
for ( int i = 0; i < con.linewidth; i++ ) {
rawText[i] = coloredText[i] & 0xFF;
}
for ( int x = con.linewidth - 1; x >= 0; x-- ) {
if ( rawText[x] == ' ' ) {
rawText[x] = '\0';
} else {
break;
}
}
// ignore all "searchconsole" calls
if ( rawText[0] == ']' &&
(rawText[1] == '/' || rawText[1] == '\\') &&
Q_strncmp(rawText + 2, "searchconsole ", 14) == 0) {
continue;
}
if ( Com_Filter( con.searchPattern, rawText ) ) {
con.searchLineIndex = line;
const int display = con.searchLineIndex + con.totallines + 1;
if ( display > con.display || display <= con.display - con.rowsVisible )
con.display = display;
return;
}
}
}

View file

@ -595,6 +595,19 @@ static void Console_Key( int key )
return;
}
// ctrl-f begins a new search
if ( keys[K_CTRL].down && tolower(key) == 'f' ) {
Q_strncpyz( g_consoleField.buffer, "\\searchconsole ", sizeof( g_consoleField.buffer ) );
g_consoleField.cursor = strlen( g_consoleField.buffer );
return;
}
// (shift-)f3 finds the next (or previous) match
if ( key == K_F3 ) {
Con_ContinueSearch( !keys[K_SHIFT].down );
return;
}
// pass to the normal editline routine
Field_KeyDownEvent( &g_consoleField, key );
}

View file

@ -444,6 +444,7 @@ void Con_ScrollPages( int pages ); // positive means down
void Con_Top();
void Con_Bottom();
void Con_Close();
void Con_ContinueSearch( qbool forward );
const float* ConsoleColorFromChar( char ccode );

View file

@ -135,3 +135,14 @@ S_COLOR_VAL " 2 " S_COLOR_HELP "= On in debug builds only"
"Set this CVar before connecting to a server to join through a proxy.\n" \
"It works with /" S_COLOR_CMD "connect" S_COLOR_HELP ", /" S_COLOR_CMD "reconnect" S_COLOR_HELP " and the server browser UI.\n" \
"Set it to an empty string to not use a proxy server."
#define help_searchconsole \
"begins a new console search\n" \
"Press ctrl-F when the console is down to bring up the command.\n" \
"Press (shift-)F3 to find the next match going up or down.\n" \
"The star character (*) will match 0, 1 or more characters.\n" \
"\n" \
" Argument Matches\n" \
"Example: init lines starting with 'init'\n" \
"Example: *init lines containing 'init'\n" \
"Example: >*net lines starting with '>' AND containing 'net'"