/*
* Seven Kingdoms: Ancient Adversaries
*
* Copyright 1997,1998 Enlight Software Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
//Filename : OBUTT3D.CPP
//Description : 3D Button Object
#include
#include
#include
#include
#include
#include
//---------- define static vars ----------//
static char save_back_buf[BUTTON_ACTION_WIDTH * BUTTON_ACTION_HEIGHT];
//-------- Begin of function Button3D::Button3D -------//
//
Button3D::Button3D()
{
init_flag = 0;
enable_flag = 0;
button_key = 0;
}
//--------- End of function Button3D::Button3D -------//
//-------- Begin of function Button3D::create -------//
//
// Create BUTTON_TYPE_SHELL button.
//
// create(,,,,)
//
// x1, y1 = coordination of the button
// buttonStyle = style id. of the button
// buttonName = name of the button
// [int] elasticFlag= Whether the button is elastic
// Elastic button will pop up immediately when button release
// Non-elastic button will remain pushed until pop() is called
// (default : 1)
// [int] defIsPushed = default pushed_flag : 1-Pushed, 0-Non-pushed
// (default : 0)
//
void Button3D::create(int pX1, int pY1, char buttonStyle,
char* buttonName, char elasticFlag, char defIsPushed)
{
init_flag = 1;
//------ get the button bitmap ------//
char buttonFileName[] = "BUTUP_A";
buttonFileName[6] = buttonStyle; // up button bitmap
button_up_ptr = image_button.get_ptr(buttonFileName);
buttonFileName[3] = 'D'; // down button bitmap
buttonFileName[4] = 'N';
button_down_ptr = image_button.get_ptr(buttonFileName);
buttonFileName[3] = 'D'; // disabled button bitmap
buttonFileName[4] = 'S';
button_disabled_ptr = image_button.get_ptr(buttonFileName);
//--------- set button size --------//
short* iconPtr = (short*) button_up_ptr;
x1 = pX1;
y1 = pY1;
x2 = x1+ *iconPtr++ - 1;
y2 = y1+ *iconPtr - 1;
//------ set button parameters -----//
button_type = BUTTON_TYPE_SHELL;
button_style = buttonStyle;
elastic_flag = elasticFlag;
pushed_flag = defIsPushed;
enable_flag = 1;
err_when( strlen(buttonName) > 8 );
strcpy( help_code, buttonName );
icon_ptr = image_button.get_ptr(buttonName);
}
//--------- End of function Button3D::create --------//
//-------- Begin of function Button3D::create -------//
//
// Create BUTTON_TYPE_BITMAP button.
//
void Button3D::create(int pX1, int pY1, char* upButtonName,
char* downButtonName, char elasticFlag, char defIsPushed)
{
init_flag = 1;
//--------- set button size --------//
button_up_ptr = image_button.get_ptr(upButtonName);
button_down_ptr = image_button.get_ptr(downButtonName);
err_when( !button_up_ptr );
err_when( !button_down_ptr );
x1 = pX1;
y1 = pY1;
x2 = x1+ *((short*)button_up_ptr) - 1;
y2 = y1+ *((short*)(button_up_ptr)+1) - 1;
//------ set button parameters -----//
button_type = BUTTON_TYPE_BITMAP;
elastic_flag = elasticFlag;
pushed_flag = defIsPushed;
enable_flag = 1;
err_when( strlen(upButtonName) > 8 );
strcpy( help_code, upButtonName );
}
//--------- End of function Button3D::create --------//
//-------- Begin of function Button3D::update_bitmap -------//
//
// Update the bitmap of the button and repaint the button.
//
void Button3D::update_bitmap(char* buttonName)
{
err_when( strlen(buttonName) > 8 );
strcpy( help_code, buttonName );
icon_ptr = image_button.get_ptr(buttonName);
paint();
}
//--------- End of function Button3D::update_bitmap --------//
//-------- Begin of function Button3D::set_help_code -------//
//
void Button3D::set_help_code(char* helpCode)
{
strncpy( help_code, helpCode, HELP_CODE_LEN );
help_code[HELP_CODE_LEN] = NULL;
}
//--------- End of function Button3D::set_help_code --------//
//----------- Begin of function Button3D::paint -----------//
//
// [int] defIsPushed = default pushed_flag : 1-Pushed, 0-Non-pushed
// (default : pushed_flag)
//
void Button3D::paint(int defIsPushed)
{
if( !init_flag )
return;
if( !vga.use_back_buf )
mouse.hide_area(x1, y1, x2, y2 );
if( defIsPushed >= 0 )
pushed_flag = defIsPushed;
//------ display the button button -------//
if( button_type == BUTTON_TYPE_SHELL && icon_ptr )
{
int tx = x1 + ((x2-x1+1) - *((short*)icon_ptr))/2;
int ty = y1 + ((y2-y1+1) - *((short*)icon_ptr+1))/2;
tx -= 2;
ty -= 3;
//----------------------------------//
if( enable_flag )
{
if( pushed_flag )
Vga::active_buf->put_bitmap_trans_decompress( x1, y1, button_down_ptr );
else
Vga::active_buf->put_bitmap_trans_decompress( x1, y1, button_up_ptr );
Vga::active_buf->put_bitmap_trans_decompress( tx, ty, (char*) icon_ptr ); // 0 means not clear background
}
else // button disabled
{
//--- put it on the back buffer, darken it and blt it back to the front buffer ---//
if( !vga.use_back_buf )
vga_back.read_bitmap( x1, y1, x1+BUTTON_ACTION_WIDTH-1, y1+BUTTON_ACTION_HEIGHT-1, save_back_buf );
//------ display and darken ----//
vga_back.put_bitmap_trans_decompress( x1, y1, button_up_ptr );
vga_back.put_bitmap_trans_decompress( tx, ty, (char*) icon_ptr ); // 0 means not clear background
vga_back.adjust_brightness( x1+1, y1+1, x1+BUTTON_ACTION_WIDTH-4, y1+BUTTON_ACTION_HEIGHT-2, -5 );
//--- blt the button from the back to the front and restore the back buf ---//
if( !vga.use_back_buf )
{
vga.blt_buf( x1, y1, x1+BUTTON_ACTION_WIDTH-1, y1+BUTTON_ACTION_HEIGHT-1, 0 );
vga_back.put_bitmap( x1, y1, save_back_buf );
}
}
}
else if( button_type == BUTTON_TYPE_BITMAP )
{
if( pushed_flag )
Vga::active_buf->put_bitmap_trans_decompress( x1, y1, button_down_ptr );
else
Vga::active_buf->put_bitmap_trans_decompress( x1, y1, button_up_ptr );
}
//--------------------------------------//
if( !vga.use_back_buf )
mouse.show_area();
}
//---------- End of function Button3D::paint -----------//
//-------- Begin of function Button3D::detect -----------//
//
// Detect whether the button has been pressed,
// if so, act correspondly.
// Check for left mouse button only
//
// [unsigned] keyCode1 = if the specified key is pressed, emulate button pressed
// (default : 0)
//
// [unsigned] keyCode2 = if the specified key is pressed, emulate button pressed
// (default : 0)
//
// [int] detectRight = whether also detect the right button or not
// (default : 0)
//
// [int] suspendPop = don't pop up the button even it should
// (defalut : 0)
//
// Return : 1 - if left mouse button pressed
// 2 - if right mouse button pressed
// 3 - the key is pressed (only when keyCode is specified)
// 0 - if not
//
int Button3D::detect(unsigned keyCode1, unsigned keyCode2, int detectRight, int suspendPop)
{
int rc=0;
if( !init_flag )
return 0;
help.set_help( x1, y1, x2, y2, help_code );
if( !enable_flag )
return 0;
//---------------------------------------------//
if( mouse.any_click(x1,y1,x2,y2,LEFT_BUTTON) )
rc=1;
else if( detectRight && mouse.any_click(x1,y1,x2,y2,RIGHT_BUTTON) )
rc=2;
else if(mouse.key_code)
{
unsigned mouseKey=mouse.key_code;
if( mouseKey >= 'a' && mouseKey <= 'z' ) // non-case sensitive comparsion
mouseKey -= 32; // convert from lower case to upper case
if( mouseKey == keyCode1 || mouseKey == keyCode2 || mouseKey == button_key )
{
rc=3;
}
}
if( !rc )
return 0;
//----- paint the button with pressed shape ------//
#define PRESSED_TIMEOUT_SECONDS 1 // 1 seconds
DWORD timeOutTime = m.get_time()+PRESSED_TIMEOUT_SECONDS*1000;
if( elastic_flag )
{
if( !pushed_flag )
paint(1);
while( (rc==1 && mouse.left_press) || (rc==2 && mouse.right_press) )
{
sys.yield();
mouse.get_event();
if( m.get_time() >= timeOutTime )
break;
}
if( elastic_flag )
paint(0);
}
else // inelastic_flag button
{
if( suspendPop )
pushed_flag = 1;
else
pushed_flag = !pushed_flag;
paint(pushed_flag);
while( (rc==1 && mouse.left_press) || (rc==2 && mouse.right_press) )
{
sys.yield();
mouse.get_event();
if( m.get_time() >= timeOutTime )
break;
}
}
return rc;
}
//----------- End of function Button3D::detect -------------//
//-------- Begin of function Button3D::hide -----------//
//
// Disable and hide the button.
//
void Button3D::hide()
{
if( !init_flag )
return;
vga.blt_buf( x1, y1, x2, y2, 0 );
enable_flag=0;
}
//----------- End of function Button3D::hide -------------//