mirror of
https://bitbucket.org/CPMADevs/cnq3
synced 2024-11-26 22:11:51 +00:00
added console search
This commit is contained in:
parent
866b93ef5e
commit
3f189e58be
5 changed files with 113 additions and 1 deletions
|
@ -4,6 +4,11 @@ See the end of this file for known issues.
|
||||||
|
|
||||||
DD Mmm 20 - 1.53
|
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
|
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
|
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)
|
this is a work-around for broken maps like bones_fkd_b4 (grates drawn in front of simple items)
|
||||||
|
|
|
@ -42,6 +42,7 @@ static cvar_t* con_drawHelp;
|
||||||
X(Cmd, "4FA7BD", qfalse, "RGB color of command names") \
|
X(Cmd, "4FA7BD", qfalse, "RGB color of command names") \
|
||||||
X(Value, "E5BC39", qfalse, "RGB color of variable values") \
|
X(Value, "E5BC39", qfalse, "RGB color of variable values") \
|
||||||
X(Help, "ABC1C6", qfalse, "RGB color of help text") \
|
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)
|
X(HL, "303033FF", qtrue, help_con_colHL)
|
||||||
|
|
||||||
#define COLOR_LIST_ITEM( Name, Default, HasAlpha, Help ) \
|
#define COLOR_LIST_ITEM( Name, Default, HasAlpha, Help ) \
|
||||||
|
@ -93,6 +94,10 @@ struct console_t {
|
||||||
int helpLines; // line count
|
int helpLines; // line count
|
||||||
qbool helpDraw;
|
qbool helpDraw;
|
||||||
float helpXAdjust;
|
float helpXAdjust;
|
||||||
|
|
||||||
|
char searchPattern[256];
|
||||||
|
qbool searchLineIndex;
|
||||||
|
qbool searchStarted;
|
||||||
};
|
};
|
||||||
|
|
||||||
static console_t con;
|
static console_t con;
|
||||||
|
@ -104,6 +109,8 @@ static console_t con;
|
||||||
int g_console_field_width = CONSOLE_WIDTH;
|
int g_console_field_width = CONSOLE_WIDTH;
|
||||||
|
|
||||||
|
|
||||||
|
static void Con_BeginSearch_f();
|
||||||
|
|
||||||
static qbool IsValidHexChar( char c )
|
static qbool IsValidHexChar( char c )
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
|
@ -411,7 +418,8 @@ static const cmdTableItem_t con_cmds[] =
|
||||||
{ "messagemode3", Con_MessageMode3_f, NULL, "chat with the player being aimed at" },
|
{ "messagemode3", Con_MessageMode3_f, NULL, "chat with the player being aimed at" },
|
||||||
{ "messagemode4", Con_MessageMode4_f, NULL, "chat with the last attacker" },
|
{ "messagemode4", Con_MessageMode4_f, NULL, "chat with the last attacker" },
|
||||||
{ "clear", Con_Clear_f, NULL, "clears the console" },
|
{ "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) );
|
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 );
|
re.SetColor( colText );
|
||||||
for (int j = 0; j < con.linewidth; ++j) {
|
for (int j = 0; j < con.linewidth; ++j) {
|
||||||
if ((text[j] >> 8) != color) {
|
if ((text[j] >> 8) != color) {
|
||||||
|
@ -940,3 +953,72 @@ void Con_Close()
|
||||||
con.finalFrac = 0; // none visible
|
con.finalFrac = 0; // none visible
|
||||||
con.displayFrac = 0;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -595,6 +595,19 @@ static void Console_Key( int key )
|
||||||
return;
|
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
|
// pass to the normal editline routine
|
||||||
Field_KeyDownEvent( &g_consoleField, key );
|
Field_KeyDownEvent( &g_consoleField, key );
|
||||||
}
|
}
|
||||||
|
|
|
@ -444,6 +444,7 @@ void Con_ScrollPages( int pages ); // positive means down
|
||||||
void Con_Top();
|
void Con_Top();
|
||||||
void Con_Bottom();
|
void Con_Bottom();
|
||||||
void Con_Close();
|
void Con_Close();
|
||||||
|
void Con_ContinueSearch( qbool forward );
|
||||||
const float* ConsoleColorFromChar( char ccode );
|
const float* ConsoleColorFromChar( char ccode );
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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" \
|
"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" \
|
"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."
|
"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'"
|
||||||
|
|
Loading…
Reference in a new issue