/* * 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 : OBUTTCUS.CPP //Description : Custom Button Object #include #include #include #include #include #include ButtonCustom customButton1; //-------- Begin of function ButtonCustom::ButtonCustom -------// // ButtonCustom::ButtonCustom() : custom_para(NULL, 0) { init_flag = 0; enable_flag = 0; button_key = 0; } //--------- End of function ButtonCustom::ButtonCustom -------// //-------- Begin of function ButtonCustom::create -------// // // x1, y1, x2, y2 = coordination of the button // funcPtr = function to be called when need to paint // funcPara = applicated defined integer // [char] 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) // [char] defIsPushed = default pushed_flag : 1-Pushed, 0-Non-pushed // (default : 0) // void ButtonCustom::create( int pX1, int pY1, int pX2, int pY2, ButtonCustomFP funcPtr, ButtonCustomPara funcPara, char elasticFlag, char defIsPushed) { init_flag = 1; //--------- set button size --------// x1 = pX1; y1 = pY1; x2 = pX2; y2 = pY2; //------ set button parameters -----// body_fp = funcPtr; custom_para = funcPara; elastic_flag = elasticFlag; pushed_flag = defIsPushed; enable_flag = 1; } //--------- End of function ButtonCustom::create --------// //----------- Begin of function ButtonCustom::paint -----------// // // [int] defIsPushed = default pushed_flag : 1-Pushed, 0-Non-pushed // (default : pushed_flag) // [int] repaintBody = parameter passed to body_fp, (default 0) // void ButtonCustom::paint(int defIsPushed, int repaintBody) { 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 -------// (*body_fp)(this, repaintBody); //--------------------------------------// if( !vga.use_back_buf ) mouse.show_area(); } //---------- End of function ButtonCustom::paint -----------// //-------- Begin of function ButtonCustom::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 ButtonCustom::detect(unsigned keyCode1, unsigned keyCode2, int detectRight, int suspendPop) { int rc=0; if( !init_flag || !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 ButtonCustom::detect -------------// //-------- Begin of function ButtonCustom::hide -----------// // // Disable and hide the button. // void ButtonCustom::hide() { if( !init_flag ) return; vga.blt_buf( x1, y1, x2, y2, 0 ); enable_flag=0; } //----------- End of function ButtonCustom::hide -------------// //----------- Begin of function ButtonCustom::disp_text_button_func -------------// // // a custom function to disp button with text only // // button->custom_para.ptr is the pointer of char // void ButtonCustom::disp_text_button_func(ButtonCustom *button, int repaintBody) { int x1 = button->x1; int y1 = button->y1; int x2 = button->x2; int y2 = button->y2; // modify x1,y1, x2,y2 to the button body if( button->pushed_flag ) { vga.d3_panel2_down(x1, y1, x2, y2); x1++; y1++; } else { vga.d3_panel2_up(button->x1, button->y1, button->x2, button->y2); x2--; y2--; } // put name font_bible.center_put(x1, y1, x2, y2, (char *)button->custom_para.ptr ); } //----------- End of function ButtonCustom::disp_text_button_func -------------// // ............................................................ //-------- Begin of function ButtonCustomGroup::ButtonCustomGroup -------// ButtonCustomGroup::ButtonCustomGroup(int buttonNum) { button_pressed = 0; button_num = buttonNum; button_array = new ButtonCustom[buttonNum]; } //---------- End of function ButtonCustomGroup::ButtonCustomGroup -------// //----------- Begin of function ButtonCustomGroup::~ButtonCustomGroup -----------// // ButtonCustomGroup::~ButtonCustomGroup() { delete[] button_array; } //-------------- End of function ButtonCustomGroup::~ButtonCustomGroup ----------// //--------- Begin of function ButtonCustomGroup::paint ----------// // // Paint all buttons in this button nation. // // [int] buttonPressed = the default pressed button // (default no change to button_pressed) // void ButtonCustomGroup::paint(int buttonPressed) { int i; if( buttonPressed >= 0 ) button_pressed = buttonPressed; for( i=0 ; i -1 - if no button pressed // >=0 - the record no. of the button pressed // int ButtonCustomGroup::detect() { int i; for( i=0 ; i buttonId = Id. of the button. // void ButtonCustomGroup::push(int buttonId, int paintFlag) { int i; button_pressed = buttonId; if( paintFlag ) for( i=0 ; i buttonId = Id. of the button, start from 0 // ButtonCustom& ButtonCustomGroup::operator[](int buttonId) { err_when( buttonId<0 || buttonId >= button_num ); return button_array[buttonId]; } //----------- End of function ButtonCustomGroup::operator[] ----------//