emscripten/tests/box2d/glui/glui_commandline.cpp

198 строки
5.2 KiB
C++

/****************************************************************************
GLUI User Interface Toolkit
---------------------------
glui_commandline.cpp - GLUI_CommandLine control class
--------------------------------------------------
Copyright (c) 1998 Paul Rademacher, 2005 William Baxter
This library is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
This program is -not- in the public domain.
*****************************************************************************/
#include "glui.h"
#include "glui_internal.h"
/****************************** GLUI_CommandLine::GLUI_CommandLine() **********/
GLUI_CommandLine::GLUI_CommandLine( GLUI_Node *parent, const char *name,
void *data, int id, GLUI_CB cb )
{
common_init();
set_name( name );
data_type = GLUI_EDITTEXT_TEXT;
ptr_val = data;
user_id = id;
callback = cb;
live_type = GLUI_LIVE_TEXT;
parent->add_control( this );
init_live();
}
/****************************** GLUI_CommandLine::key_handler() **********/
int GLUI_CommandLine::key_handler( unsigned char key,int modifiers )
{
int ret;
if ( NOT glui )
return false;
if ( debug )
dump( stdout, "-> CMD_TEXT KEY HANDLER" );
if ( key == 13 ) { /* RETURN */
commit_flag = true;
}
ret = Super::key_handler( key, modifiers );
if ( debug )
dump( stdout, "<- CMD_TEXT KEY HANDLER" );
return ret;
}
/****************************** GLUI_CommandLine::deactivate() **********/
void GLUI_CommandLine::deactivate( void )
{
// if the commit_flag is set, add the current command to
// history and call deactivate as normal
// Trick deactivate into calling callback if and only if commit_flag set.
// A bit subtle, but deactivate checks that orig_text and text
// are the same to decide whether or not to call the callback.
// Force them to be different for commit, and the same for no commit.
if (commit_flag) {
add_to_history(text.c_str());
orig_text = "";
Super::deactivate( );
set_text( "" );
commit_flag = false;
}
else {
orig_text = text;
}
}
/**************************** GLUI_CommandLine::special_handler() **********/
int GLUI_CommandLine::special_handler( int key,int modifiers )
{
if ( NOT glui )
return false;
if ( debug )
printf( "CMD_TEXT SPECIAL:%d - mod:%d subs:%d/%d ins:%d sel:%d/%d\n",
key, modifiers, substring_start, substring_end,insertion_pt,
sel_start, sel_end );
if ( key == GLUT_KEY_UP ) // PREVIOUS HISTORY
{
scroll_history(-1);
}
else if ( key == GLUT_KEY_DOWN ) // NEXT HISTORY
{
scroll_history(+1);
}
else {
return Super::special_handler( key, modifiers );
}
return false;
}
/**************************** GLUI_CommandLine::scroll_history() ********/
void GLUI_CommandLine::scroll_history( int direction )
{
recall_history(curr_hist + direction);
}
/**************************** GLUI_CommandLine::recall_history() ********/
void GLUI_CommandLine::recall_history( int hist_num )
{
if (hist_num < oldest_hist OR
hist_num > newest_hist OR
hist_num == curr_hist)
return;
// Commit the current text first before we blow it away!
if (curr_hist == newest_hist) {
get_history_str(newest_hist) = text;
}
curr_hist = hist_num;
set_text(get_history_str(curr_hist));
sel_end = sel_start = insertion_pt = (int)text.length();
update_and_draw_text();
}
/**************************** GLUI_CommandLine::add_to_history() ********/
void GLUI_CommandLine::add_to_history( const char *cmd )
{
if (cmd[0]=='\0') return; // don't add if it's empty
curr_hist = newest_hist;
get_history_str(newest_hist) = text;
newest_hist = ++curr_hist;
if ( newest_hist >= HIST_SIZE )
{
// bump oldest off the list
hist_list.erase(hist_list.begin());
hist_list.push_back("");
oldest_hist++;
}
}
/**************************** GLUI_CommandLine::reset_history() ********/
void GLUI_CommandLine::reset_history( void )
{
oldest_hist = newest_hist = curr_hist = 0;
}
/*************************************** GLUI_CommandLine::dump() **************/
void GLUI_CommandLine::dump( FILE *out, const char *name )
{
fprintf( out,
"%s (commandline@%p): ins_pt:%d subs:%d/%d sel:%d/%d len:%d\n",
name, this,
insertion_pt, substring_start, substring_end, sel_start, sel_end,
(int)text.length());
}