2010-04-01 09:53:07 +02:00
// ==============================================================
// This file is part of Glest (www.glest.org)
//
2011-12-14 08:40:48 +01:00
// Copyright (C) 2001-2008 Martiño Figueroa
2010-04-01 09:53:07 +02:00
//
2010-12-21 06:07:10 +01:00
// You can redistribute this code 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
2010-04-01 09:53:07 +02:00
// License, or (at your option) any later version
// ==============================================================
# include "components.h"
# include <algorithm>
# include "metrics.h"
# include "core_data.h"
# include "platform_util.h"
2010-05-31 21:57:10 +02:00
# include "util.h"
2010-09-09 00:37:24 +02:00
# include "conversion.h"
2011-04-05 22:19:25 +02:00
# include "lang.h"
2017-02-04 21:33:18 +01:00
# include "gen_uuid.h"
//#include <cxxabi.h>
2010-04-01 09:53:07 +02:00
# include "leak_dumper.h"
using namespace std ;
2010-05-31 21:57:10 +02:00
using namespace Shared : : Util ;
2010-04-01 09:53:07 +02:00
namespace Glest { namespace Game {
// =====================================================
// class GraphicComponent
// =====================================================
float GraphicComponent : : anim = 0.f ;
float GraphicComponent : : fade = 0.f ;
const float GraphicComponent : : animSpeed = 0.02f ;
const float GraphicComponent : : fadeSpeed = 0.01f ;
2012-06-01 07:26:01 +02:00
// WHITE
Vec3f GraphicComponent : : customTextColor = Vec3f ( 1.0 , 1.0 , 1.0 ) ;
2010-04-01 09:53:07 +02:00
2010-09-09 00:37:24 +02:00
std : : map < std : : string , std : : map < std : : string , GraphicComponent * > > GraphicComponent : : registeredGraphicComponentList ;
2017-10-10 04:09:36 +02:00
GraphicComponent : : GraphicComponent ( const std : : string & containerName , const std : : string & objName , bool registerControl ) {
2017-01-30 20:20:01 +01:00
this - > containerName = containerName ;
this - > instanceName = " " ;
2017-02-04 21:33:18 +01:00
if ( containerName = = " " | | objName = = " " ) {
//char szBuf[8096]="";
//snprintf(szBuf,8096,"Control not properly registered Container [%s] Control [%s]\n",containerName.c_str(),objName.c_str());
//throw megaglest_runtime_error(szBuf);
}
if ( objName ! = " " & & registerControl ) {
2010-09-09 00:37:24 +02:00
registerGraphicComponent ( containerName , objName ) ;
}
2017-02-04 21:33:18 +01:00
else {
this - > instanceName = objName ;
}
this - > fontCallbackName = objName + " _ " + getNewUUD ( ) ;
CoreData : : getInstance ( ) . registerFontChangedCallback ( this - > getFontCallbackName ( ) , this ) ;
2010-09-11 08:08:50 +02:00
enabled = true ;
editable = true ;
visible = true ;
2011-03-23 06:49:38 +01:00
x = 0 ;
y = 0 ;
w = 0 ;
h = 0 ;
text = " " ;
font = NULL ;
2011-06-10 05:09:19 +02:00
font3D = NULL ;
2013-06-13 03:37:15 +02:00
textNativeTranslation = " " ;
2010-04-01 09:53:07 +02:00
}
2017-02-04 21:33:18 +01:00
string GraphicComponent : : getNewUUD ( ) {
char uuid_str [ 38 ] ;
get_uuid_string ( uuid_str , sizeof ( uuid_str ) ) ;
return string ( uuid_str ) ;
}
2017-01-30 20:20:01 +01:00
GraphicComponent : : ~ GraphicComponent ( ) {
2017-02-04 21:33:18 +01:00
CoreData : : getInstance ( ) . unRegisterFontChangedCallback ( this - > getFontCallbackName ( ) ) ;
2017-01-30 20:20:01 +01:00
}
2010-09-09 23:07:39 +02:00
void GraphicComponent : : clearRegisteredComponents ( std : : string containerName ) {
if ( containerName = = " " ) {
GraphicComponent : : registeredGraphicComponentList . clear ( ) ;
}
else {
GraphicComponent : : registeredGraphicComponentList [ containerName ] . clear ( ) ;
}
2010-09-09 02:05:12 +02:00
}
2010-10-10 08:35:50 +02:00
void GraphicComponent : : clearRegisterGraphicComponent ( std : : string containerName , std : : string objName ) {
GraphicComponent * obj = findRegisteredComponent ( containerName , objName ) ;
if ( obj ) {
GraphicComponent : : registeredGraphicComponentList [ containerName ] . erase ( objName ) ;
}
}
void GraphicComponent : : clearRegisterGraphicComponent ( std : : string containerName , std : : vector < std : : string > objNameList ) {
2013-11-19 07:14:06 +01:00
for ( int idx = 0 ; idx < ( int ) objNameList . size ( ) ; + + idx ) {
2010-10-10 08:35:50 +02:00
GraphicComponent : : clearRegisterGraphicComponent ( containerName , objNameList [ idx ] ) ;
}
}
2010-09-09 00:37:24 +02:00
void GraphicComponent : : registerGraphicComponent ( std : : string containerName , std : : string objName ) {
2017-02-04 21:33:18 +01:00
// unregistered old name if we have been renamed
if ( this - > getInstanceName ( ) ! = " " ) {
//printf("RENAME Register Callback detected calling: Control old [%s] new [%s]\n",this->getInstanceName().c_str(),objName.c_str());
clearRegisterGraphicComponent ( this - > containerName , this - > getInstanceName ( ) ) ;
}
else {
//printf("NEW Register Callback detected calling: Control container [%s] name [%s]\n",containerName.c_str(),objName.c_str());
}
if ( containerName = = " " | | objName = = " " ) {
//char szBuf[8096]="";
//snprintf(szBuf,8096,"Control not properly registered Container [%s] Control [%s]\n",this->containerName.c_str(),objName.c_str());
//throw megaglest_runtime_error(szBuf);
}
2017-01-30 20:20:01 +01:00
this - > containerName = containerName ;
this - > instanceName = objName ;
2010-09-09 00:37:24 +02:00
registeredGraphicComponentList [ containerName ] [ objName ] = this ;
2010-12-21 06:07:10 +01:00
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] registered [%s] [%s] count = %d\n",__FILE__,__FUNCTION__,__LINE__,containerName.c_str(),instanceName.c_str(),registeredGraphicComponentList[containerName].size());
2010-09-09 00:37:24 +02:00
}
2017-01-30 20:20:01 +01:00
void GraphicComponent : : registerGraphicComponentOnlyFontCallbacks ( std : : string containerName , std : : string objName ) {
2017-02-04 21:33:18 +01:00
if ( this - > getInstanceName ( ) ! = " " ) {
//printf("(FONT ONLY) RENAME Register Callback detected calling: Control old [%s] new [%s]\n",this->getInstanceName().c_str(),objName.c_str());
clearRegisterGraphicComponent ( this - > containerName , this - > getInstanceName ( ) ) ;
}
else {
//printf("(FONT ONLY) NEW Register Callback detected calling: Control container [%s] name [%s]\n",containerName.c_str(),objName.c_str());
}
if ( containerName = = " " | | objName = = " " ) {
//char szBuf[8096]="";
//snprintf(szBuf,8096,"Control not properly registered Container [%s] Control [%s]\n",this->containerName.c_str(),objName.c_str());
//throw megaglest_runtime_error(szBuf);
}
2017-01-30 20:20:01 +01:00
this - > containerName = containerName ;
this - > instanceName = objName ;
}
2010-09-09 00:37:24 +02:00
GraphicComponent * GraphicComponent : : findRegisteredComponent ( std : : string containerName , std : : string objName ) {
GraphicComponent * result = NULL ;
std : : map < std : : string , std : : map < std : : string , GraphicComponent * > > : : iterator iterFind1 = GraphicComponent : : registeredGraphicComponentList . find ( containerName ) ;
if ( iterFind1 ! = GraphicComponent : : registeredGraphicComponentList . end ( ) ) {
std : : map < std : : string , GraphicComponent * > : : iterator iterFind2 = iterFind1 - > second . find ( objName ) ;
if ( iterFind2 ! = iterFind1 - > second . end ( ) ) {
result = iterFind2 - > second ;
}
}
return result ;
}
void GraphicComponent : : applyAllCustomProperties ( std : : string containerName ) {
2019-11-12 01:29:25 +01:00
Config & config = Config : : getInstance ( ) ;
if ( config . getBool ( " CustomPropertiesUsageAllowed " , " false " ) = = false ) {
return ;
}
2010-09-09 00:37:24 +02:00
std : : map < std : : string , std : : map < std : : string , GraphicComponent * > > : : iterator iterFind1 = GraphicComponent : : registeredGraphicComponentList . find ( containerName ) ;
if ( iterFind1 ! = GraphicComponent : : registeredGraphicComponentList . end ( ) ) {
for ( std : : map < std : : string , GraphicComponent * > : : iterator iterFind2 = iterFind1 - > second . begin ( ) ;
2011-09-01 01:10:43 +02:00
iterFind2 ! = iterFind1 - > second . end ( ) ; + + iterFind2 ) {
2010-09-09 00:37:24 +02:00
iterFind2 - > second - > applyCustomProperties ( containerName ) ;
}
}
}
void GraphicComponent : : applyCustomProperties ( std : : string containerName ) {
if ( instanceName ! = " " ) {
2019-11-12 01:29:25 +01:00
Config & config = Config : : getInstance ( ) ;
if ( config . getBool ( " CustomPropertiesUsageAllowed " , " false " ) = = false ) {
return ;
}
2010-09-09 00:37:24 +02:00
std : : map < std : : string , std : : map < std : : string , GraphicComponent * > > : : iterator iterFind1 = GraphicComponent : : registeredGraphicComponentList . find ( containerName ) ;
if ( iterFind1 ! = GraphicComponent : : registeredGraphicComponentList . end ( ) ) {
std : : map < std : : string , GraphicComponent * > : : iterator iterFind2 = iterFind1 - > second . find ( instanceName ) ;
if ( iterFind2 ! = iterFind1 - > second . end ( ) ) {
2011-04-05 22:19:25 +02:00
//string languageToken = config.getString("Lang");
string languageToken = Lang : : getInstance ( ) . getLanguage ( ) ;
2010-09-09 08:42:39 +02:00
2010-09-09 00:37:24 +02:00
//if(dynamic_cast<GraphicButton *>(iterFind2->second) != NULL) {
GraphicComponent * ctl = dynamic_cast < GraphicComponent * > ( iterFind2 - > second ) ;
2010-09-09 08:42:39 +02:00
// First check default overrides
2010-09-09 00:37:24 +02:00
ctl - > x = config . getInt ( containerName + " _ " + iterFind2 - > first + " _x " , intToStr ( ctl - > x ) . c_str ( ) ) ;
ctl - > y = config . getInt ( containerName + " _ " + iterFind2 - > first + " _y " , intToStr ( ctl - > y ) . c_str ( ) ) ;
ctl - > w = config . getInt ( containerName + " _ " + iterFind2 - > first + " _w " , intToStr ( ctl - > w ) . c_str ( ) ) ;
ctl - > h = config . getInt ( containerName + " _ " + iterFind2 - > first + " _h " , intToStr ( ctl - > h ) . c_str ( ) ) ;
2011-10-04 22:18:57 +02:00
ctl - > visible = config . getBool ( containerName + " _ " + iterFind2 - > first + " _visible " , boolToStr ( ctl - > visible ) . c_str ( ) ) ;
2010-09-09 08:42:39 +02:00
// Now check language specific overrides
ctl - > x = config . getInt ( containerName + " _ " + iterFind2 - > first + " _x_ " + languageToken , intToStr ( ctl - > x ) . c_str ( ) ) ;
ctl - > y = config . getInt ( containerName + " _ " + iterFind2 - > first + " _y_ " + languageToken , intToStr ( ctl - > y ) . c_str ( ) ) ;
ctl - > w = config . getInt ( containerName + " _ " + iterFind2 - > first + " _w_ " + languageToken , intToStr ( ctl - > w ) . c_str ( ) ) ;
ctl - > h = config . getInt ( containerName + " _ " + iterFind2 - > first + " _h_ " + languageToken , intToStr ( ctl - > h ) . c_str ( ) ) ;
2011-10-04 22:18:57 +02:00
ctl - > visible = config . getBool ( containerName + " _ " + iterFind2 - > first + " _visible_ " + languageToken , boolToStr ( ctl - > visible ) . c_str ( ) ) ;
2010-09-09 00:37:24 +02:00
}
}
}
}
2010-09-09 23:07:39 +02:00
bool GraphicComponent : : saveAllCustomProperties ( std : : string containerName ) {
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] registered [%s] count = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , containerName . c_str ( ) , registeredGraphicComponentList [ containerName ] . size ( ) ) ;
2019-11-12 01:29:25 +01:00
Config & config = Config : : getInstance ( ) ;
if ( config . getBool ( " CustomPropertiesSaveAllowed " , " false " ) = = false ) {
return false ;
}
2010-09-09 23:07:39 +02:00
bool foundPropertiesToSave = false ;
std : : map < std : : string , std : : map < std : : string , GraphicComponent * > > : : iterator iterFind1 = GraphicComponent : : registeredGraphicComponentList . find ( containerName ) ;
if ( iterFind1 ! = GraphicComponent : : registeredGraphicComponentList . end ( ) ) {
for ( std : : map < std : : string , GraphicComponent * > : : iterator iterFind2 = iterFind1 - > second . begin ( ) ;
2011-09-01 01:10:43 +02:00
iterFind2 ! = iterFind1 - > second . end ( ) ; + + iterFind2 ) {
2010-09-09 23:07:39 +02:00
bool saved = iterFind2 - > second - > saveCustomProperties ( containerName ) ;
foundPropertiesToSave = ( saved | | foundPropertiesToSave ) ;
}
}
if ( foundPropertiesToSave = = true ) {
Config & config = Config : : getInstance ( ) ;
config . save ( ) ;
}
return foundPropertiesToSave ;
}
bool GraphicComponent : : saveCustomProperties ( std : : string containerName ) {
bool savedChange = false ;
if ( instanceName ! = " " ) {
2019-11-12 01:29:25 +01:00
Config & config = Config : : getInstance ( ) ;
if ( config . getBool ( " CustomPropertiesSaveAllowed " , " false " ) = = false ) {
return false ;
}
2010-09-09 23:07:39 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] looking for [%s] [%s] \n " , __FILE__ , __FUNCTION__ , __LINE__ , containerName . c_str ( ) , instanceName . c_str ( ) ) ;
std : : map < std : : string , std : : map < std : : string , GraphicComponent * > > : : iterator iterFind1 = GraphicComponent : : registeredGraphicComponentList . find ( containerName ) ;
if ( iterFind1 ! = GraphicComponent : : registeredGraphicComponentList . end ( ) ) {
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] looking for [%s] \n " , __FILE__ , __FUNCTION__ , __LINE__ , instanceName . c_str ( ) ) ;
std : : map < std : : string , GraphicComponent * > : : iterator iterFind2 = iterFind1 - > second . find ( instanceName ) ;
if ( iterFind2 ! = iterFind1 - > second . end ( ) ) {
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] FOUND [%s] \n " , __FILE__ , __FUNCTION__ , __LINE__ , instanceName . c_str ( ) ) ;
//string languageToken = config.getString("Lang");
//if(dynamic_cast<GraphicButton *>(iterFind2->second) != NULL) {
GraphicComponent * ctl = dynamic_cast < GraphicComponent * > ( iterFind2 - > second ) ;
// First check default overrides
config . setInt ( containerName + " _ " + iterFind2 - > first + " _x " , ctl - > x ) ;
config . setInt ( containerName + " _ " + iterFind2 - > first + " _y " , ctl - > y ) ;
config . setInt ( containerName + " _ " + iterFind2 - > first + " _w " , ctl - > w ) ;
config . setInt ( containerName + " _ " + iterFind2 - > first + " _h " , ctl - > h ) ;
savedChange = true ;
// Now check language specific overrides
//ctl->x = config.getInt(containerName + "_" + iterFind2->first + "_x_" + languageToken, intToStr(ctl->x).c_str());
//ctl->y = config.getInt(containerName + "_" + iterFind2->first + "_y_" + languageToken, intToStr(ctl->y).c_str());
//ctl->w = config.getInt(containerName + "_" + iterFind2->first + "_w_" + languageToken, intToStr(ctl->w).c_str());
//ctl->h = config.getInt(containerName + "_" + iterFind2->first + "_h_" + languageToken, intToStr(ctl->h).c_str());
//}
}
}
}
return savedChange ;
}
2017-01-30 20:20:01 +01:00
void GraphicComponent : : setFont ( Font2D * font ) {
this - > font = font ;
if ( this - > font ! = NULL ) {
this - > font2DUniqueId = font - > getFontUniqueId ( ) ;
}
else {
this - > font2DUniqueId = " " ;
}
}
void GraphicComponent : : setFont3D ( Font3D * font ) {
this - > font3D = font ;
if ( this - > font3D ! = NULL ) {
this - > font3DUniqueId = font - > getFontUniqueId ( ) ;
}
else {
this - > font3DUniqueId = " " ;
}
}
void GraphicComponent : : FontChangedCallback ( std : : string fontUniqueId , Font * font ) {
2017-02-04 21:33:18 +01:00
//printf("In FontChanged for [%s] font [%p] Control 2D [%s] 3D [%s]\n", fontUniqueId.c_str(),font,this->font2DUniqueId.c_str(),this->font3DUniqueId.c_str());
2017-01-30 20:20:01 +01:00
if ( fontUniqueId ! = " " ) {
if ( fontUniqueId = = this - > font2DUniqueId ) {
if ( font ! = NULL ) {
this - > font = ( Font2D * ) font ;
}
else {
this - > font = NULL ;
}
}
else if ( fontUniqueId = = this - > font3DUniqueId ) {
if ( font ! = NULL ) {
this - > font3D = ( Font3D * ) font ;
}
else {
this - > font3D = NULL ;
}
}
}
}
2011-10-25 20:39:11 +02:00
void GraphicComponent : : reloadFonts ( ) {
2017-01-30 20:20:01 +01:00
setFont ( CoreData : : getInstance ( ) . getMenuFontNormal ( ) ) ;
setFont3D ( CoreData : : getInstance ( ) . getMenuFontNormal3D ( ) ) ;
2011-10-25 20:39:11 +02:00
}
void GraphicComponent : : reloadFontsForRegisterGraphicComponents ( std : : string containerName ) {
std : : map < std : : string , std : : map < std : : string , GraphicComponent * > > : : iterator iterFind1 = GraphicComponent : : registeredGraphicComponentList . find ( containerName ) ;
if ( iterFind1 ! = GraphicComponent : : registeredGraphicComponentList . end ( ) ) {
for ( std : : map < std : : string , GraphicComponent * > : : iterator iterFind2 = iterFind1 - > second . begin ( ) ;
iterFind2 ! = iterFind1 - > second . end ( ) ; + + iterFind2 ) {
GraphicComponent * ctl = dynamic_cast < GraphicComponent * > ( iterFind2 - > second ) ;
if ( ctl ) {
ctl - > reloadFonts ( ) ;
}
}
}
}
2010-09-09 08:42:39 +02:00
void GraphicComponent : : init ( int x , int y , int w , int h ) {
2010-04-01 09:53:07 +02:00
this - > x = x ;
this - > y = y ;
this - > w = w ;
this - > h = h ;
2011-10-25 20:39:11 +02:00
reloadFonts ( ) ;
2010-04-01 09:53:07 +02:00
enabled = true ;
}
2019-10-18 22:22:07 +02:00
bool GraphicComponent : : eventMouseWheel ( int x , int y , int zDelta ) {
2019-10-19 00:14:45 +02:00
return mouseMove ( x , y ) ;
2019-10-18 22:22:07 +02:00
}
2010-04-01 09:53:07 +02:00
2010-09-11 08:08:50 +02:00
bool GraphicComponent : : mouseMove ( int x , int y ) {
if ( this - > getVisible ( ) = = false ) {
return false ;
}
2010-12-21 06:07:10 +01:00
return
2010-04-01 09:53:07 +02:00
x > this - > x & &
y > this - > y & &
x < this - > x + w & &
y < this - > y + h ;
}
bool GraphicComponent : : mouseClick ( int x , int y ) {
2010-09-11 08:08:50 +02:00
if ( getVisible ( ) & & getEnabled ( ) & & getEditable ( ) )
2010-05-20 01:23:42 +02:00
return mouseMove ( x , y ) ;
else
return false ;
2010-04-01 09:53:07 +02:00
}
void GraphicComponent : : update ( ) {
fade + = fadeSpeed ;
anim + = animSpeed ;
if ( fade > 1.f ) fade = 1.f ;
if ( anim > 1.f ) anim = 0.f ;
}
void GraphicComponent : : resetFade ( ) {
fade = 0.f ;
}
// =====================================================
// class GraphicLabel
// =====================================================
const int GraphicLabel : : defH = 20 ;
const int GraphicLabel : : defW = 70 ;
2017-10-10 04:09:36 +02:00
GraphicLabel : : GraphicLabel ( const std : : string & containerName , const std : : string & objName , bool registerControl ) :
2017-02-04 21:33:18 +01:00
GraphicComponent ( containerName , objName , registerControl ) {
2011-10-02 04:14:05 +02:00
centered = false ;
wordWrap = false ;
centeredW = - 1 ;
centeredH = 1 ;
2013-10-25 21:35:10 +02:00
editable = false ;
2012-07-26 08:27:00 +02:00
editModeEnabled = false ;
maxEditWidth = - 1 ;
2012-07-26 17:26:59 +02:00
maxEditRenderWidth = - 1 ;
2014-12-15 01:07:25 +01:00
renderBackground = false ;
backgroundColor = Vec4f ( 0.2f , 0.2f , 0.2f , 0.6f ) ;
2012-10-22 21:38:28 +02:00
isPassword = false ;
2013-10-27 17:13:27 +01:00
texture = NULL ;
2011-10-02 04:14:05 +02:00
}
2011-04-16 20:53:57 +02:00
void GraphicLabel : : init ( int x , int y , int w , int h , bool centered , Vec3f textColor , bool wordWrap ) {
2010-04-01 09:53:07 +02:00
GraphicComponent : : init ( x , y , w , h ) ;
this - > centered = centered ;
2011-03-26 14:40:22 +01:00
this - > textColor = textColor ;
2011-04-16 20:53:57 +02:00
this - > wordWrap = wordWrap ;
2010-04-01 09:53:07 +02:00
}
2012-07-26 09:06:12 +02:00
bool GraphicLabel : : mouseMove ( int x , int y ) {
if ( this - > getVisible ( ) = = false ) {
return false ;
}
int useWidth = w ;
if ( text . length ( ) > 0 & & font3D ! = NULL ) {
2012-09-22 22:13:57 +02:00
float lineWidth = ( font3D - > getTextHandler ( ) - > Advance ( text . c_str ( ) ) * Shared : : Graphics : : Font : : scaleFontValue ) ;
2012-07-26 09:06:12 +02:00
useWidth = ( int ) lineWidth ;
}
2013-10-25 21:35:10 +02:00
if ( editable & & useWidth < getMaxEditRenderWidth ( ) ) {
useWidth = getMaxEditRenderWidth ( ) ;
}
2012-07-26 09:06:12 +02:00
return
x > this - > x & &
y > this - > y & &
x < this - > x + useWidth & &
y < this - > y + h ;
}
2011-10-02 04:14:05 +02:00
bool GraphicLabel : : getCenteredW ( ) const {
bool result = ( centered | | centeredW = = 1 ) ;
return result ;
}
2017-10-10 05:21:14 +02:00
//void GraphicLabel::setCenteredW(bool centered) {
// centeredW = (centered ? 1 : 0);
//}
2011-10-02 04:14:05 +02:00
bool GraphicLabel : : getCenteredH ( ) const {
bool result = ( centered | | centeredH = = 1 ) ;
return result ;
}
2017-10-10 05:21:14 +02:00
//void GraphicLabel::setCenteredH(bool centered) {
// centeredH = (centered ? 1 : 0);
//}
2011-10-02 04:14:05 +02:00
2010-04-01 09:53:07 +02:00
// =====================================================
// class GraphicButton
// =====================================================
const int GraphicButton : : defH = 22 ;
const int GraphicButton : : defW = 90 ;
2017-10-10 04:09:36 +02:00
GraphicButton : : GraphicButton ( const std : : string & containerName , const std : : string & objName , bool registerControl ) :
2017-02-04 21:33:18 +01:00
GraphicComponent ( containerName , objName , registerControl ) {
2017-01-30 20:20:01 +01:00
2011-03-25 11:11:16 +01:00
lighted = false ;
2014-12-21 13:33:46 +01:00
alwaysLighted = false ;
2011-04-16 20:53:57 +02:00
useCustomTexture = false ;
2011-03-25 11:11:16 +01:00
customTexture = NULL ;
}
2010-04-01 09:53:07 +02:00
void GraphicButton : : init ( int x , int y , int w , int h ) {
GraphicComponent : : init ( x , y , w , h ) ;
lighted = false ;
}
bool GraphicButton : : mouseMove ( int x , int y ) {
2010-09-11 08:08:50 +02:00
if ( this - > getVisible ( ) = = false ) {
return false ;
}
bool b = GraphicComponent : : mouseMove ( x , y ) ;
2010-04-01 09:53:07 +02:00
lighted = b ;
return b ;
}
// =====================================================
// class GraphicListBox
// =====================================================
const int GraphicListBox : : defH = 22 ;
const int GraphicListBox : : defW = 140 ;
2017-10-10 04:09:36 +02:00
GraphicListBox : : GraphicListBox ( const std : : string & containerName , const std : : string & objName )
2017-02-04 21:33:18 +01:00
: GraphicComponent ( containerName , objName ) , graphButton1 ( containerName , objName + " _button1 " ) ,
graphButton2 ( containerName , objName + " _button2 " ) {
2011-12-02 17:07:59 +01:00
selectedItemIndex = 0 ;
lighted = false ;
2013-10-24 01:11:18 +02:00
leftControlled = false ;
2011-12-02 17:07:59 +01:00
}
2011-04-13 00:20:41 +02:00
void GraphicListBox : : init ( int x , int y , int w , int h , Vec3f textColor ) {
2010-04-01 09:53:07 +02:00
GraphicComponent : : init ( x , y , w , h ) ;
2011-04-13 00:20:41 +02:00
this - > textColor = textColor ;
2019-10-04 15:06:07 +02:00
graphButton1 . init ( x , y , h , h ) ;
graphButton2 . init ( x + w - h , y , h , h ) ;
2010-04-01 09:53:07 +02:00
graphButton1 . setText ( " < " ) ;
graphButton2 . setText ( " > " ) ;
selectedItemIndex = - 1 ;
2011-04-13 00:20:41 +02:00
lighted = false ;
2010-12-21 06:07:10 +01:00
}
2010-04-01 09:53:07 +02:00
2013-06-13 03:37:15 +02:00
const string & GraphicListBox : : getTextNativeTranslation ( ) {
2013-06-15 03:43:44 +02:00
if ( this - > translated_items . empty ( ) = = true | |
2013-06-13 03:37:15 +02:00
this - > selectedItemIndex < 0 | |
2013-11-19 07:14:06 +01:00
this - > selectedItemIndex > = ( int ) this - > translated_items . size ( ) | |
2013-06-13 03:37:15 +02:00
this - > items . size ( ) ! = this - > translated_items . size ( ) ) {
return this - > text ;
}
else {
return this - > translated_items [ this - > selectedItemIndex ] ;
}
}
2010-04-01 09:53:07 +02:00
//queryes
2013-06-13 03:37:15 +02:00
void GraphicListBox : : pushBackItem ( string item , string translated_item ) {
2010-04-01 09:53:07 +02:00
items . push_back ( item ) ;
2013-06-13 03:37:15 +02:00
translated_items . push_back ( translated_item ) ;
2010-04-01 09:53:07 +02:00
setSelectedItemIndex ( 0 ) ;
}
2019-10-04 15:06:07 +02:00
void GraphicListBox : : clearItems ( ) {
items . clear ( ) ;
translated_items . clear ( ) ;
selectedItemIndex = - 1 ;
setText ( " " ) ;
}
2013-06-13 03:37:15 +02:00
void GraphicListBox : : setItems ( const vector < string > & items , const vector < string > translated_items ) {
2010-12-21 06:07:10 +01:00
this - > items = items ;
2013-06-13 03:37:15 +02:00
this - > translated_items = translated_items ;
2011-12-26 07:29:14 +01:00
if ( items . empty ( ) = = false ) {
setSelectedItemIndex ( 0 ) ;
}
else {
selectedItemIndex = - 1 ;
setText ( " " ) ;
}
2010-04-01 09:53:07 +02:00
}
2010-04-29 09:59:44 +02:00
void GraphicListBox : : setSelectedItemIndex ( int index , bool errorOnMissing ) {
2013-11-19 07:14:06 +01:00
if ( errorOnMissing = = true & & ( index < 0 | | index > = ( int ) items . size ( ) ) ) {
2013-06-20 21:18:29 +02:00
char szBuf [ 8096 ] = " " ;
2013-06-21 00:51:28 +02:00
snprintf ( szBuf , 8096 , " Index not found in listbox name: [%s] value index: %d size: %lu " , this - > instanceName . c_str ( ) , index , ( unsigned long ) items . size ( ) ) ;
2013-06-20 21:18:29 +02:00
throw megaglest_runtime_error ( szBuf ) ;
2013-06-15 02:31:51 +02:00
}
2010-04-01 09:53:07 +02:00
selectedItemIndex = index ;
setText ( getSelectedItem ( ) ) ;
}
2013-10-24 01:11:18 +02:00
void GraphicListBox : : setLeftControlled ( bool leftControlled ) {
if ( this - > leftControlled ! = leftControlled ) {
this - > leftControlled = leftControlled ;
if ( leftControlled = = true ) {
graphButton2 . setX ( x + graphButton1 . getW ( ) - 4 ) ;
graphButton2 . setH ( graphButton2 . getH ( ) - 4 ) ;
graphButton2 . setW ( graphButton2 . getW ( ) - 4 ) ;
graphButton1 . setH ( graphButton1 . getH ( ) - 4 ) ;
graphButton1 . setW ( graphButton1 . getW ( ) - 4 ) ;
graphButton2 . setY ( graphButton2 . getY ( ) + 2 ) ;
graphButton1 . setY ( graphButton1 . getY ( ) + 2 ) ;
}
else {
graphButton2 . setX ( x + w - graphButton2 . getW ( ) + 4 ) ;
graphButton2 . setH ( graphButton2 . getH ( ) + 4 ) ;
graphButton2 . setW ( graphButton2 . getW ( ) + 4 ) ;
graphButton1 . setH ( graphButton1 . getH ( ) + 4 ) ;
graphButton1 . setW ( graphButton1 . getW ( ) + 4 ) ;
graphButton2 . setY ( graphButton2 . getY ( ) - 2 ) ;
graphButton1 . setY ( graphButton1 . getY ( ) - 2 ) ;
}
}
}
2013-05-31 21:32:20 +02:00
void GraphicListBox : : setX ( int x ) {
this - > x = x ;
graphButton1 . setX ( x ) ;
2013-10-24 01:11:18 +02:00
if ( leftControlled = = true ) {
graphButton2 . setX ( x + graphButton1 . getW ( ) ) ;
}
else {
graphButton2 . setX ( x + w - graphButton2 . getW ( ) ) ;
}
2013-05-31 21:32:20 +02:00
}
2010-12-27 01:59:57 +01:00
void GraphicListBox : : setY ( int y ) {
this - > y = y ;
graphButton1 . setY ( y ) ;
graphButton2 . setY ( y ) ;
}
2010-04-22 01:13:39 +02:00
void GraphicListBox : : setEditable ( bool editable ) {
graphButton1 . setEditable ( editable ) ;
graphButton2 . setEditable ( editable ) ;
2010-04-29 01:59:37 +02:00
GraphicComponent : : setEditable ( editable ) ;
2010-04-22 01:13:39 +02:00
}
2011-09-07 18:55:49 +02:00
bool GraphicListBox : : hasItem ( string item ) const {
bool result = false ;
vector < string > : : const_iterator iter = find ( items . begin ( ) , items . end ( ) , item ) ;
if ( iter ! = items . end ( ) ) {
result = true ;
}
return result ;
}
2010-04-29 09:59:44 +02:00
void GraphicListBox : : setSelectedItem ( string item , bool errorOnMissing ) {
2010-12-21 06:07:10 +01:00
vector < string > : : iterator iter ;
2010-04-01 09:53:07 +02:00
iter = find ( items . begin ( ) , items . end ( ) , item ) ;
2010-04-29 09:59:44 +02:00
if ( iter = = items . end ( ) ) {
if ( errorOnMissing = = true ) {
2013-11-19 07:14:06 +01:00
for ( int idx = 0 ; idx < ( int ) items . size ( ) ; idx + + ) {
2011-12-28 05:46:36 +01:00
SystemFlags : : OutputDebug ( SystemFlags : : debugError , " In [%s::%s Line: %d] \n instanceName [%s] idx = %d items[idx] = [%s] \n " , extractFileFromDirectoryPath ( __FILE__ ) . c_str ( ) , __FUNCTION__ , __LINE__ , instanceName . c_str ( ) , idx , items [ idx ] . c_str ( ) ) ;
2010-05-31 21:57:10 +02:00
}
2013-06-20 21:18:29 +02:00
char szBuf [ 8096 ] = " " ;
snprintf ( szBuf , 8096 , " Value not found in listbox name: [%s] value: %s " , this - > instanceName . c_str ( ) , item . c_str ( ) ) ;
throw megaglest_runtime_error ( szBuf ) ;
2010-04-29 09:59:44 +02:00
}
2010-04-01 09:53:07 +02:00
}
else {
setSelectedItemIndex ( iter - items . begin ( ) ) ;
}
}
2010-12-21 06:07:10 +01:00
2010-04-01 09:53:07 +02:00
bool GraphicListBox : : mouseMove ( int x , int y ) {
2010-09-11 08:08:50 +02:00
if ( this - > getVisible ( ) = = false ) {
return false ;
}
return
2010-12-21 06:07:10 +01:00
graphButton1 . mouseMove ( x , y ) | |
2010-04-01 09:53:07 +02:00
graphButton2 . mouseMove ( x , y ) ;
}
2012-10-15 09:44:44 +02:00
bool GraphicListBox : : mouseClick ( int x , int y , string advanceToItemStartingWith ) {
2010-09-11 08:08:50 +02:00
if ( this - > getVisible ( ) = = false ) {
return false ;
}
2012-10-15 09:44:44 +02:00
if ( ! items . empty ( ) ) {
2010-04-01 09:53:07 +02:00
bool b1 = graphButton1 . mouseClick ( x , y ) ;
bool b2 = graphButton2 . mouseClick ( x , y ) ;
2012-10-15 09:44:44 +02:00
if ( b1 ) {
bool bFound = false ;
if ( advanceToItemStartingWith ! = " " ) {
2012-10-16 00:56:49 +02:00
for ( int i = selectedItemIndex - 1 ; i > = 0 ; - - i ) {
2013-10-29 20:11:36 +01:00
string item = items [ i ] ;
2013-11-19 07:14:06 +01:00
if ( ( int ) translated_items . size ( ) > i ) item = translated_items [ i ] ;
2012-10-15 09:44:44 +02:00
if ( StartsWith ( toLower ( item ) , toLower ( advanceToItemStartingWith ) ) = = true ) {
bFound = true ;
selectedItemIndex = i ;
break ;
}
}
2012-10-15 10:28:00 +02:00
if ( bFound = = false ) {
2013-11-02 12:04:52 +01:00
for ( int i = ( int ) items . size ( ) - 1 ; i > = selectedItemIndex ; - - i ) {
2013-10-29 20:11:36 +01:00
string item = items [ i ] ;
2013-11-19 07:14:06 +01:00
if ( ( int ) translated_items . size ( ) > i ) item = translated_items [ i ] ;
2012-10-15 10:28:00 +02:00
//printf("Trying to match [%s] with item [%s]\n",advanceToItemStartingWith.c_str(),item.c_str());
if ( StartsWith ( toLower ( item ) , toLower ( advanceToItemStartingWith ) ) = = true ) {
bFound = true ;
selectedItemIndex = i ;
break ;
}
}
}
2012-10-15 09:44:44 +02:00
}
if ( bFound = = false ) {
selectedItemIndex - - ;
}
2010-04-01 09:53:07 +02:00
if ( selectedItemIndex < 0 ) {
2013-11-02 12:04:52 +01:00
selectedItemIndex = ( int ) items . size ( ) - 1 ;
2010-04-01 09:53:07 +02:00
}
}
2012-10-15 09:44:44 +02:00
else if ( b2 ) {
bool bFound = false ;
if ( advanceToItemStartingWith ! = " " ) {
2013-11-19 07:14:06 +01:00
for ( int i = selectedItemIndex + 1 ; i < ( int ) items . size ( ) ; + + i ) {
2013-10-29 20:11:36 +01:00
string item = items [ i ] ;
2013-11-19 07:14:06 +01:00
if ( ( int ) translated_items . size ( ) > i ) item = translated_items [ i ] ;
2012-10-15 09:44:44 +02:00
//printf("Trying to match [%s] with item [%s]\n",advanceToItemStartingWith.c_str(),item.c_str());
if ( StartsWith ( toLower ( item ) , toLower ( advanceToItemStartingWith ) ) = = true ) {
bFound = true ;
selectedItemIndex = i ;
break ;
}
}
2012-10-15 10:28:00 +02:00
if ( bFound = = false ) {
2012-10-16 00:56:49 +02:00
for ( int i = 0 ; i < = selectedItemIndex ; + + i ) {
2013-10-29 20:11:36 +01:00
string item = items [ i ] ;
2013-11-19 07:14:06 +01:00
if ( ( int ) translated_items . size ( ) > i ) item = translated_items [ i ] ;
2012-10-15 10:28:00 +02:00
//printf("Trying to match [%s] with item [%s]\n",advanceToItemStartingWith.c_str(),item.c_str());
if ( StartsWith ( toLower ( item ) , toLower ( advanceToItemStartingWith ) ) = = true ) {
bFound = true ;
selectedItemIndex = i ;
break ;
}
}
}
2012-10-15 09:44:44 +02:00
}
if ( bFound = = false ) {
selectedItemIndex + + ;
}
2013-11-19 07:14:06 +01:00
if ( selectedItemIndex > = ( int ) items . size ( ) ) {
2010-04-01 09:53:07 +02:00
selectedItemIndex = 0 ;
}
}
setText ( getSelectedItem ( ) ) ;
return b1 | | b2 ;
}
return false ;
}
2019-10-05 22:41:21 +02:00
// =====================================================
// class GraphicComboBox
// =====================================================
const int GraphicComboBox : : defH = 22 ;
const int GraphicComboBox : : defW = 140 ;
GraphicComboBox : : GraphicComboBox ( const std : : string & containerName , const std : : string & objName )
: GraphicComponent ( containerName , objName ) , dropDownButton ( containerName , objName + " _button " ) {
selectedItemIndex = 0 ;
lighted = false ;
}
void GraphicComboBox : : init ( int x , int y , int w , int h , Vec3f textColor ) {
GraphicComponent : : init ( x , y , w , h ) ;
this - > textColor = textColor ;
dropDownButton . init ( x + w - h , y , h , h ) ;
dropDownButton . setText ( " v " ) ;
popupLineCount = 15 ;
popupButtonHeight = 20 ;
int scrollBarLength = popupLineCount * popupButtonHeight ;
int popupYpos = y + h ;
if ( y > 200 ) popupYpos = y - scrollBarLength ;
scrollBar . init ( x + w - h , popupYpos , false , scrollBarLength , 20 ) ;
scrollBar . setVisibleSize ( popupLineCount ) ;
scrollBar . setVisibleStart ( 0 ) ;
scrollBar . setLighted ( false ) ;
scrollBar . setVisible ( true ) ;
2019-10-06 02:21:16 +02:00
setPopupLineCount ( popupLineCount ) ;
2019-10-05 22:41:21 +02:00
selectedItemIndex = - 1 ;
popupShowing = false ;
lighted = false ;
preselectedItemIndex = - 1 ;
}
2019-10-06 02:21:16 +02:00
void GraphicComboBox : : setPopupLineCount ( int popupLineCount ) {
this - > popupLineCount = popupLineCount ;
int scrollBarLength = popupLineCount * popupButtonHeight ;
int popupYpos = getY ( ) + getH ( ) ;
if ( y > 200 ) popupYpos = y - scrollBarLength ;
scrollBar . setY ( popupYpos ) ;
scrollBar . setLength ( scrollBarLength ) ;
scrollBar . setVisibleSize ( popupLineCount ) ;
}
2019-10-05 22:41:21 +02:00
const string & GraphicComboBox : : getTextNativeTranslation ( int index ) {
if ( this - > translated_items . empty ( ) = = true | |
index < 0 | |
index > = ( int ) this - > translated_items . size ( ) | |
this - > items . size ( ) ! = this - > translated_items . size ( ) ) {
return this - > text ;
}
else {
return this - > translated_items [ index ] ;
}
}
const string & GraphicComboBox : : getTextNativeTranslation ( ) {
return getTextNativeTranslation ( this - > selectedItemIndex ) ;
}
//queryes
void GraphicComboBox : : pushBackItem ( string item , string translated_item ) {
items . push_back ( item ) ;
translated_items . push_back ( translated_item ) ;
setSelectedItemIndex ( 0 ) ;
createButton ( item ) ;
}
void GraphicComboBox : : clearItems ( ) {
clearButtons ( ) ;
items . clear ( ) ;
translated_items . clear ( ) ;
selectedItemIndex = - 1 ;
setText ( " " ) ;
}
GraphicButton * GraphicComboBox : : createButton ( string item ) {
GraphicButton * button = new GraphicButton ( ) ;
button - > init ( getX ( ) , scrollBar . getY ( ) , getW ( ) - scrollBar . getW ( ) , getPopupButtonHeight ( ) ) ;
button - > setText ( item ) ;
button - > setUseCustomTexture ( true ) ;
button - > setCustomTexture ( CoreData : : getInstance ( ) . getCustomTexture ( ) ) ;
popupButtons . push_back ( button ) ;
scrollBar . setElementCount ( ( int ) popupButtons . size ( ) ) ;
layoutButtons ( ) ;
return button ;
}
void GraphicComboBox : : layoutButtons ( ) {
if ( scrollBar . getElementCount ( ) ! = 0 ) {
int keyButtonsYBase = scrollBar . getY ( ) + scrollBar . getLength ( ) ; ;
for ( int i = scrollBar . getVisibleStart ( ) ;
i < = scrollBar . getVisibleEnd ( ) ; + + i ) {
if ( i > = ( int ) popupButtons . size ( ) ) {
char szBuf [ 8096 ] = " " ;
snprintf ( szBuf , 8096 , " i >= popupButtons.size(), i = %d, popupButtons.size() = %d " , i , ( int ) popupButtons . size ( ) ) ;
throw megaglest_runtime_error ( szBuf ) ;
}
popupButtons [ i ] - > setY ( keyButtonsYBase - getPopupButtonHeight ( ) * ( i + 1
- scrollBar . getVisibleStart ( ) ) ) ;
}
}
}
void GraphicComboBox : : clearButtons ( ) {
while ( ! popupButtons . empty ( ) ) {
delete popupButtons . back ( ) ;
popupButtons . pop_back ( ) ;
}
scrollBar . setElementCount ( 0 ) ;
}
void GraphicComboBox : : setItems ( const vector < string > & items , const vector < string > translated_items ) {
clearItems ( ) ;
this - > items = items ;
this - > translated_items = translated_items ;
if ( items . empty ( ) = = false ) {
setSelectedItemIndex ( 0 ) ;
}
else {
selectedItemIndex = - 1 ;
setText ( " " ) ;
}
for ( int idx = 0 ; idx < ( int ) items . size ( ) ; idx + + ) {
createButton ( this - > items [ idx ] ) ;
}
}
void GraphicComboBox : : setSelectedItemIndex ( int index , bool errorOnMissing ) {
if ( errorOnMissing = = true & & ( index < 0 | | index > = ( int ) items . size ( ) ) ) {
char szBuf [ 8096 ] = " " ;
snprintf ( szBuf , 8096 , " Index not found in listbox name: [%s] value index: %d size: %lu " , this - > instanceName . c_str ( ) , index , ( unsigned long ) items . size ( ) ) ;
throw megaglest_runtime_error ( szBuf ) ;
}
selectedItemIndex = index ;
preselectedItemIndex = index ;
setText ( getSelectedItem ( ) ) ;
}
void GraphicComboBox : : setX ( int x ) {
this - > x = x ;
dropDownButton . setX ( x + w ) ;
}
void GraphicComboBox : : setY ( int y ) {
this - > y = y ;
dropDownButton . setY ( y ) ;
}
void GraphicComboBox : : setEditable ( bool editable ) {
dropDownButton . setEditable ( editable ) ;
GraphicComponent : : setEditable ( editable ) ;
}
bool GraphicComboBox : : hasItem ( string item ) const {
bool result = false ;
vector < string > : : const_iterator iter = find ( items . begin ( ) , items . end ( ) , item ) ;
if ( iter ! = items . end ( ) ) {
result = true ;
}
return result ;
}
void GraphicComboBox : : setSelectedItem ( string item , bool errorOnMissing ) {
vector < string > : : iterator iter ;
iter = find ( items . begin ( ) , items . end ( ) , item ) ;
if ( iter = = items . end ( ) ) {
if ( errorOnMissing = = true ) {
for ( int idx = 0 ; idx < ( int ) items . size ( ) ; idx + + ) {
SystemFlags : : OutputDebug ( SystemFlags : : debugError , " In [%s::%s Line: %d] \n instanceName [%s] idx = %d items[idx] = [%s] \n " , extractFileFromDirectoryPath ( __FILE__ ) . c_str ( ) , __FUNCTION__ , __LINE__ , instanceName . c_str ( ) , idx , items [ idx ] . c_str ( ) ) ;
}
char szBuf [ 8096 ] = " " ;
snprintf ( szBuf , 8096 , " Value not found in listbox name: [%s] value: %s " , this - > instanceName . c_str ( ) , item . c_str ( ) ) ;
throw megaglest_runtime_error ( szBuf ) ;
}
}
else {
setSelectedItemIndex ( iter - items . begin ( ) ) ;
}
}
void GraphicComboBox : : togglePopupVisibility ( ) {
if ( popupShowing = = true ) {
popupShowing = false ;
scrollBar . setVisible ( false ) ;
}
else {
popupShowing = true ;
scrollBar . setVisible ( true ) ;
layoutButtons ( ) ;
}
}
2019-10-18 22:22:07 +02:00
bool GraphicComboBox : : eventMouseWheel ( int x , int y , int zDelta ) {
if ( popupShowing = = true ) {
2019-10-19 00:14:45 +02:00
scrollBar . eventMouseWheel ( x , y , zDelta , true ) ;
2019-10-18 22:22:07 +02:00
layoutButtons ( ) ;
mouseMoveOverButtons ( x , y ) ;
return true ;
} else
2019-10-05 22:41:21 +02:00
return false ;
2019-10-18 22:22:07 +02:00
}
bool GraphicComboBox : : mouseMoveOverButtons ( int x , int y ) {
2019-10-05 22:41:21 +02:00
bool result = false ;
if ( popupShowing ) {
bool foundMouseOver = false ;
for ( int i = scrollBar . getVisibleStart ( ) ; i < = scrollBar . getVisibleEnd ( ) ; + + i ) {
if ( popupButtons [ i ] - > mouseMove ( x , y ) ) {
foundMouseOver = true ;
result = true ;
setPreselectedItemIndex ( i ) ;
layoutButtons ( ) ;
}
if ( ! foundMouseOver ) {
setPreselectedItemIndex ( getSelectedItemIndex ( ) ) ;
}
}
}
2019-10-18 22:22:07 +02:00
return result ;
}
bool GraphicComboBox : : mouseMove ( int x , int y ) {
if ( this - > getVisible ( ) = = false ) {
return false ;
}
bool scrollbarResult = scrollBar . mouseMove ( x , y ) ;
bool buttonResult = dropDownButton . mouseMove ( x , y ) ;
return scrollbarResult | | buttonResult | | mouseMoveOverButtons ( x , y ) ; ;
2019-10-05 22:41:21 +02:00
}
bool GraphicComboBox : : mouseClick ( int x , int y ) {
if ( this - > getVisible ( ) = = false ) {
return false ;
}
if ( ! items . empty ( ) ) {
bool returnValue = true ;
if ( dropDownButton . mouseClick ( x , y ) & & selectedItemIndex > = 0 ) {
scrollBar . setVisibleStart ( selectedItemIndex ) ;
popupButtons [ selectedItemIndex ] - > setLighted ( true ) ;
togglePopupVisibility ( ) ;
}
else if ( scrollBar . mouseClick ( x , y ) ) {
layoutButtons ( ) ;
returnValue = false ;
}
else if ( popupShowing ) {
returnValue = false ;
for ( int i = scrollBar . getVisibleStart ( ) ;
i < = scrollBar . getVisibleEnd ( ) ; + + i ) {
if ( popupButtons [ i ] - > mouseClick ( x , y ) ) {
setSelectedItemIndex ( i ) ;
layoutButtons ( ) ;
togglePopupVisibility ( ) ;
returnValue = true ;
}
}
if ( returnValue = = false ) {
returnValue = true ;
togglePopupVisibility ( ) ;
setPreselectedItemIndex ( selectedItemIndex ) ;
}
}
else {
returnValue = false ;
}
return returnValue ;
}
return false ;
}
bool GraphicComboBox : : mouseDown ( int x , int y ) {
if ( scrollBar . mouseDown ( x , y ) ) {
layoutButtons ( ) ;
return true ;
}
return false ;
}
void GraphicComboBox : : mouseUp ( int x , int y ) {
scrollBar . mouseUp ( x , y ) ;
}
2010-04-01 09:53:07 +02:00
// =====================================================
// class GraphicMessageBox
// =====================================================
2014-12-18 01:11:06 +01:00
const int GraphicMessageBox : : defH = 280 ;
2010-04-01 09:53:07 +02:00
const int GraphicMessageBox : : defW = 350 ;
2017-10-10 04:09:36 +02:00
GraphicMessageBox : : GraphicMessageBox ( const std : : string & containerName , const std : : string & objName ) :
2017-02-04 21:33:18 +01:00
GraphicComponent ( containerName , objName ) {
2012-02-19 18:37:53 +01:00
header = " " ;
2012-11-09 00:54:43 +01:00
autoWordWrap = true ;
2011-12-02 17:07:59 +01:00
}
2012-02-19 18:37:53 +01:00
GraphicMessageBox : : ~ GraphicMessageBox ( ) {
2012-10-06 21:01:13 +02:00
removeButtons ( ) ;
}
void GraphicMessageBox : : removeButtons ( ) {
2012-02-19 18:37:53 +01:00
while ( ! buttons . empty ( ) ) {
delete buttons . back ( ) ;
buttons . pop_back ( ) ;
}
2010-09-11 18:14:03 +02:00
}
2012-02-19 18:37:53 +01:00
void GraphicMessageBox : : init ( const string & button1Str , const string & button2Str , int newWidth , int newHeight ) {
init ( button1Str , newWidth , newHeight ) ;
2012-10-06 21:01:13 +02:00
addButton ( button2Str ) ;
2010-09-11 18:14:03 +02:00
}
2012-02-19 18:37:53 +01:00
void GraphicMessageBox : : init ( const string & button1Str , int newWidth , int newHeight ) {
2012-02-19 18:49:33 +01:00
init ( newWidth , newHeight ) ;
2012-10-06 21:01:13 +02:00
removeButtons ( ) ;
addButton ( button1Str ) ;
2012-02-19 18:49:33 +01:00
}
2017-01-30 20:20:01 +01:00
void GraphicMessageBox : : init ( int newWidth , int newHeight ) {
setFont ( CoreData : : getInstance ( ) . getMenuFontNormal ( ) ) ;
setFont3D ( CoreData : : getInstance ( ) . getMenuFontNormal3D ( ) ) ;
2011-11-23 09:00:09 +01:00
h = ( newHeight > = 0 ? newHeight : defH ) ;
w = ( newWidth > = 0 ? newWidth : defW ) ;
2010-12-21 06:07:10 +01:00
2010-04-01 09:53:07 +02:00
const Metrics & metrics = Metrics : : getInstance ( ) ;
2012-02-19 18:37:53 +01:00
x = ( metrics . getVirtualW ( ) - w ) / 2 ;
y = ( metrics . getVirtualH ( ) - h ) / 2 ;
}
void GraphicMessageBox : : addButton ( const string & buttonStr , int width , int height ) {
2017-02-04 21:33:18 +01:00
GraphicButton * newButton = new GraphicButton ( containerName , instanceName + " _Button_ " + buttonStr ) ;
2012-02-19 18:37:53 +01:00
newButton - > init ( 0 , 0 ) ;
newButton - > setText ( buttonStr ) ;
if ( width ! = - 1 ) {
newButton - > setW ( width ) ;
}
if ( height ! = - 1 ) {
newButton - > setH ( height ) ;
}
buttons . push_back ( newButton ) ;
alignButtons ( ) ;
}
void GraphicMessageBox : : alignButtons ( ) {
int currXPos = 0 ;
int totalbuttonListLength = 0 ;
int buttonOffset = 5 ;
for ( int i = 0 ; i < getButtonCount ( ) ; i + + ) {
GraphicButton * button = getButton ( i ) ;
totalbuttonListLength + = button - > getW ( ) ;
}
totalbuttonListLength + = ( getButtonCount ( ) - 1 ) * buttonOffset ;
currXPos = x + w / 2 - totalbuttonListLength / 2 ;
for ( int i = 0 ; i < getButtonCount ( ) ; i + + ) {
GraphicButton * button = getButton ( i ) ;
button - > setY ( y + 25 ) ;
button - > setX ( currXPos ) ;
currXPos + = button - > getW ( ) + buttonOffset ;
}
}
void GraphicMessageBox : : setX ( int x ) {
this - > x = x ;
alignButtons ( ) ;
}
2010-04-01 09:53:07 +02:00
2012-02-19 18:37:53 +01:00
void GraphicMessageBox : : setY ( int y ) {
this - > y = y ;
alignButtons ( ) ;
2010-04-01 09:53:07 +02:00
}
bool GraphicMessageBox : : mouseMove ( int x , int y ) {
2012-02-19 18:37:53 +01:00
if ( this - > getVisible ( ) = = false ) {
2010-09-11 08:08:50 +02:00
return false ;
}
2012-02-19 18:37:53 +01:00
for ( int i = 0 ; i < getButtonCount ( ) ; i + + ) {
if ( getButton ( i ) - > mouseMove ( x , y ) ) {
return true ;
}
}
return false ;
2010-04-01 09:53:07 +02:00
}
bool GraphicMessageBox : : mouseClick ( int x , int y ) {
2012-02-19 18:37:53 +01:00
if ( this - > getVisible ( ) = = false ) {
2010-09-11 08:08:50 +02:00
return false ;
}
2012-02-19 18:37:53 +01:00
for ( int i = 0 ; i < getButtonCount ( ) ; i + + ) {
if ( getButton ( i ) - > mouseClick ( x , y ) ) {
return true ;
}
2010-04-01 09:53:07 +02:00
}
2012-02-19 18:37:53 +01:00
return false ;
2010-04-01 09:53:07 +02:00
}
bool GraphicMessageBox : : mouseClick ( int x , int y , int & clickedButton ) {
2012-02-19 18:37:53 +01:00
if ( this - > getVisible ( ) = = false ) {
2010-09-11 08:08:50 +02:00
return false ;
}
2012-02-19 18:37:53 +01:00
for ( int i = 0 ; i < getButtonCount ( ) ; i + + ) {
if ( getButton ( i ) - > mouseClick ( x , y ) ) {
clickedButton = i ;
2010-04-01 09:53:07 +02:00
return true ;
}
}
return false ;
}
2010-12-27 01:59:57 +01:00
// =====================================================
// class GraphicLine
// =====================================================
const int GraphicLine : : defH = 5 ;
const int GraphicLine : : defW = 1000 ;
2017-10-10 04:09:36 +02:00
GraphicLine : : GraphicLine ( const std : : string & containerName , const std : : string & objName )
2011-12-02 17:07:59 +01:00
: GraphicComponent ( containerName , objName ) {
horizontal = false ;
}
2010-12-27 01:59:57 +01:00
void GraphicLine : : init ( int x , int y , int w , int h ) {
GraphicComponent : : init ( x , y , w , h ) ;
horizontal = true ;
}
// =====================================================
// class GraphicCheckBox
// =====================================================
const int GraphicCheckBox : : defH = 22 ;
const int GraphicCheckBox : : defW = 22 ;
2017-10-10 04:09:36 +02:00
GraphicCheckBox : : GraphicCheckBox ( const std : : string & containerName , const std : : string & objName )
2011-12-02 17:07:59 +01:00
: GraphicComponent ( containerName , objName ) {
value = false ;
lighted = false ;
}
2010-12-27 01:59:57 +01:00
void GraphicCheckBox : : init ( int x , int y , int w , int h ) {
GraphicComponent : : init ( x , y , w , h ) ;
value = true ;
lighted = false ;
}
bool GraphicCheckBox : : mouseMove ( int x , int y ) {
if ( this - > getVisible ( ) = = false ) {
return false ;
}
bool b = GraphicComponent : : mouseMove ( x , y ) ;
lighted = b ;
return b ;
}
bool GraphicCheckBox : : mouseClick ( int x , int y ) {
bool result = GraphicComponent : : mouseClick ( x , y ) ;
2013-11-19 07:14:06 +01:00
if ( result = = true ) {
if ( value ) {
2010-12-27 01:59:57 +01:00
value = false ;
2013-11-19 07:14:06 +01:00
}
else {
2010-12-27 01:59:57 +01:00
value = true ;
2013-11-19 07:14:06 +01:00
}
}
2010-12-27 01:59:57 +01:00
return result ;
}
2010-12-31 18:16:49 +01:00
// =====================================================
// class GraphicScrollBar
// =====================================================
const int GraphicScrollBar : : defThickness = 20 ;
const int GraphicScrollBar : : defLength = 200 ;
2017-10-10 04:09:36 +02:00
GraphicScrollBar : : GraphicScrollBar ( const std : : string & containerName , const std : : string & objName )
2011-12-02 17:07:59 +01:00
: GraphicComponent ( containerName , objName ) {
lighted = false ;
2012-11-02 21:07:50 +01:00
activated = false ;
2011-12-02 17:07:59 +01:00
horizontal = false ;
elementCount = 0 ;
visibleSize = 0 ;
visibleStart = 0 ;
// position on component for renderer
visibleCompPosStart = 0 ;
visibleCompPosEnd = 0 ;
}
2010-12-31 18:16:49 +01:00
void GraphicScrollBar : : init ( int x , int y , bool horizontal , int length , int thickness ) {
GraphicComponent : : init ( x , y , horizontal ? length : thickness , horizontal ? thickness : length ) ;
this - > horizontal = horizontal ;
this - > elementCount = 1 ;
this - > visibleSize = 1 ;
this - > visibleStart = 0 ;
2011-09-01 01:10:43 +02:00
this - > visibleCompPosStart = 0 ;
this - > visibleCompPosEnd = length ;
2012-11-02 21:07:50 +01:00
activated = false ;
lighted = false ;
2010-12-31 18:16:49 +01:00
}
bool GraphicScrollBar : : mouseDown ( int x , int y ) {
2019-10-05 22:41:21 +02:00
bool result = false ;
2010-12-31 18:16:49 +01:00
if ( getVisible ( ) & & getEnabled ( ) & & getEditable ( ) )
{
2014-12-16 00:56:26 +01:00
if ( activated & & elementCount > 0 )
2010-12-31 18:16:49 +01:00
{
if ( elementCount > visibleSize ) {
int pos ;
if ( horizontal ) {
pos = x - this - > x ;
}
else {
// invert the clicked point ( y is from bottom to top normally )
pos = getLength ( ) - ( y - this - > y ) ;
}
float partSize = ( float ) getLength ( ) / ( float ) elementCount ;
float visiblePartSize = partSize * ( float ) visibleSize ;
float startPos = ( ( float ) pos ) - visiblePartSize / 2 ;
visibleStart = startPos / partSize ;
setVisibleStart ( visibleStart ) ;
2019-10-05 22:41:21 +02:00
result = true ;
2010-12-31 18:16:49 +01:00
}
}
}
2019-10-05 22:41:21 +02:00
return result ;
2010-12-31 18:16:49 +01:00
}
2012-11-02 21:07:50 +01:00
void GraphicScrollBar : : mouseUp ( int x , int y ) {
activated = false ;
lighted = false ;
}
2010-12-31 18:16:49 +01:00
void GraphicScrollBar : : setVisibleStart ( int vs ) {
visibleStart = vs ;
if ( visibleStart > elementCount - visibleSize ) {
visibleStart = elementCount - visibleSize ;
}
if ( visibleStart < 0 ) {
visibleStart = 0 ;
}
2014-12-16 04:44:26 +01:00
float partSize = 0.f ;
if ( elementCount > 0 ) {
partSize = ( float ) getLength ( ) / ( float ) elementCount ;
}
2010-12-31 18:16:49 +01:00
visibleCompPosStart = visibleStart * partSize ;
visibleCompPosEnd = visibleStart * partSize + visibleSize * partSize ;
if ( visibleCompPosEnd > getLength ( ) ) {
visibleCompPosEnd = getLength ( ) ;
}
if ( ! horizontal ) {
// invert the display ( y is from bottom to top normally )
visibleCompPosStart = getLength ( ) - visibleCompPosStart ;
visibleCompPosEnd = getLength ( ) - visibleCompPosEnd ;
}
}
void GraphicScrollBar : : setElementCount ( int elementCount ) {
this - > elementCount = elementCount ;
setVisibleStart ( getVisibleStart ( ) ) ;
}
void GraphicScrollBar : : setVisibleSize ( int visibleSize ) {
this - > visibleSize = visibleSize ;
setVisibleStart ( getVisibleStart ( ) ) ;
}
bool GraphicScrollBar : : mouseClick ( int x , int y ) {
bool result = GraphicComponent : : mouseClick ( x , y ) ;
2012-11-02 21:07:50 +01:00
if ( result ) {
activated = true ;
lighted = true ;
2010-12-31 18:16:49 +01:00
mouseDown ( x , y ) ;
2012-11-02 21:07:50 +01:00
}
return result ;
2010-12-31 18:16:49 +01:00
}
2019-10-19 00:14:45 +02:00
bool GraphicScrollBar : : eventMouseWheel ( int x , int y , int zDelta ) {
return eventMouseWheel ( x , y , zDelta , false ) ;
}
bool GraphicScrollBar : : eventMouseWheel ( int x , int y , int zDelta , bool ignorePos ) {
if ( ignorePos | | GraphicComponent : : mouseMove ( x , y ) ) {
int newVisibleStart = this - > getVisibleStart ( ) - zDelta / 60 ;
if ( newVisibleStart < 0 )
newVisibleStart = 0 ;
if ( newVisibleStart > this - > getLength ( ) - this - > getVisibleSize ( ) )
newVisibleStart = this - > getLength ( ) - this - > getVisibleSize ( ) ;
this - > setVisibleStart ( newVisibleStart ) ;
return true ;
}
return false ;
}
2010-12-31 18:16:49 +01:00
bool GraphicScrollBar : : mouseMove ( int x , int y ) {
2012-11-06 01:20:48 +01:00
if ( this - > getVisible ( ) = = false ) {
return false ;
}
2012-11-02 21:07:50 +01:00
bool inScrollBar = GraphicComponent : : mouseMove ( x , y ) ;
if ( activated ) {
lighted = true ;
} else {
lighted = inScrollBar ;
2010-12-31 18:16:49 +01:00
}
2012-11-02 21:07:50 +01:00
return inScrollBar ;
2010-12-31 18:16:49 +01:00
}
2011-09-01 01:10:43 +02:00
int GraphicScrollBar : : getLength ( ) const {
2010-12-31 18:16:49 +01:00
return horizontal ? getW ( ) : getH ( ) ;
}
2017-10-10 08:09:52 +02:00
//int GraphicScrollBar::getThickness() const {
// return horizontal?getH():getW();
//}
2010-12-31 18:16:49 +01:00
2012-03-16 02:10:32 +01:00
void GraphicScrollBar : : arrangeComponents ( vector < GraphicComponent * > & gcs ) {
if ( getElementCount ( ) ! = 0 ) {
for ( int i = getVisibleStart ( ) ; i < = getVisibleEnd ( ) ; + + i ) {
if ( horizontal ) {
gcs [ i ] - > setX ( getX ( ) + getLength ( ) - gcs [ i ] - > getW ( ) - gcs [ i ] - > getW ( ) * ( i - getVisibleStart ( ) ) ) ;
}
else {
gcs [ i ] - > setY ( getY ( ) + getLength ( ) - gcs [ i ] - > getH ( ) - gcs [ i ] - > getH ( ) * ( i - getVisibleStart ( ) ) ) ;
}
}
}
}
2011-09-21 08:51:28 +02:00
// ===========================================================
// class PopupMenu
// ===========================================================
const int PopupMenu : : defH = 240 ;
const int PopupMenu : : defW = 350 ;
2017-10-10 04:09:36 +02:00
PopupMenu : : PopupMenu ( const std : : string & containerName , const std : : string & objName ) :
GraphicComponent ( containerName , objName , false ) {
2017-02-04 21:33:18 +01:00
registerGraphicComponentOnlyFontCallbacks ( containerName , objName ) ;
2011-09-21 08:51:28 +02:00
h = defH ;
w = defW ;
}
PopupMenu : : ~ PopupMenu ( ) {
}
void PopupMenu : : init ( string menuHeader , std : : vector < string > menuItems ) {
header = menuHeader ;
2017-01-30 20:20:01 +01:00
setFont ( CoreData : : getInstance ( ) . getMenuFontNormal ( ) ) ;
setFont3D ( CoreData : : getInstance ( ) . getMenuFontNormal3D ( ) ) ;
2011-09-21 08:51:28 +02:00
buttons . clear ( ) ;
const Metrics & metrics = Metrics : : getInstance ( ) ;
x = ( metrics . getVirtualW ( ) - w ) / 2 ;
y = ( metrics . getVirtualH ( ) - h ) / 2 ;
2011-10-04 02:50:43 +02:00
int textHeight = GraphicButton : : defH ;
int textHeightSpacing = 6 ;
2011-09-21 08:51:28 +02:00
int maxButtonWidth = - 1 ;
for ( unsigned int i = 0 ; i < menuItems . size ( ) ; + + i ) {
int currentButtonWidth = - 1 ;
2012-09-22 22:13:57 +02:00
if ( font3D ! = NULL & & Shared : : Graphics : : Font : : forceLegacyFonts = = false ) {
2011-09-21 08:51:28 +02:00
FontMetrics * fontMetrics = font3D - > getMetrics ( ) ;
2011-09-27 07:29:57 +02:00
if ( fontMetrics ) {
currentButtonWidth = fontMetrics - > getTextWidth ( menuItems [ i ] ) ;
}
2011-09-21 08:51:28 +02:00
}
2011-09-27 07:29:57 +02:00
else if ( font ) {
2011-09-21 08:51:28 +02:00
FontMetrics * fontMetrics = font - > getMetrics ( ) ;
2011-09-27 07:29:57 +02:00
if ( fontMetrics ) {
currentButtonWidth = fontMetrics - > getTextWidth ( menuItems [ i ] ) ;
}
2011-09-21 08:51:28 +02:00
}
if ( maxButtonWidth < 0 | | currentButtonWidth > maxButtonWidth ) {
2011-10-04 02:50:43 +02:00
maxButtonWidth = currentButtonWidth + textHeightSpacing ;
2011-09-21 08:51:28 +02:00
}
}
2011-10-04 02:50:43 +02:00
int yStartOffset = y + h - ( textHeight * 2 ) ;
if ( maxButtonWidth > = w ) {
w = maxButtonWidth + textHeightSpacing ;
x = ( metrics . getVirtualW ( ) - w ) / 2 ;
}
int offsetH = ( yStartOffset - y ) ;
2013-11-02 12:04:52 +01:00
int maxH = ( offsetH + ( ( ( int ) menuItems . size ( ) - 1 ) * ( textHeight + textHeightSpacing ) ) ) ;
2011-10-04 02:50:43 +02:00
if ( maxH > = h ) {
h = maxH ;
y = ( metrics . getVirtualH ( ) - h ) / 2 ;
yStartOffset = y + h - ( textHeight * 2 ) ;
}
2011-09-21 08:51:28 +02:00
for ( unsigned int i = 0 ; i < menuItems . size ( ) ; + + i ) {
2017-02-04 21:33:18 +01:00
GraphicButton button ( containerName , instanceName + " _Popup_Button_ " + menuItems [ i ] , false ) ;
button . registerGraphicComponentOnlyFontCallbacks ( containerName , instanceName + " _Popup_Button_ " + menuItems [ i ] ) ;
2011-10-04 02:50:43 +02:00
button . init ( x + ( w - maxButtonWidth ) / 2 , yStartOffset - ( i * ( textHeight + textHeightSpacing ) ) ) ;
2011-09-21 08:51:28 +02:00
button . setText ( menuItems [ i ] ) ;
button . setW ( maxButtonWidth ) ;
buttons . push_back ( button ) ;
}
}
void PopupMenu : : setX ( int x ) {
this - > x = x ;
for ( unsigned int i = 0 ; i < buttons . size ( ) ; + + i ) {
GraphicButton & button = buttons [ i ] ;
button . init ( x + ( w - GraphicButton : : defW ) / 4 , y + 25 + ( i * 25 ) ) ;
}
}
void PopupMenu : : setY ( int y ) {
this - > y = y ;
for ( unsigned int i = 0 ; i < buttons . size ( ) ; + + i ) {
GraphicButton & button = buttons [ i ] ;
button . init ( x + ( w - GraphicButton : : defW ) / 4 , y + 25 + ( i * 25 ) ) ;
}
}
bool PopupMenu : : mouseMove ( int x , int y ) {
if ( this - > getVisible ( ) = = false ) {
return false ;
}
for ( unsigned int i = 0 ; i < buttons . size ( ) ; + + i ) {
GraphicButton & button = buttons [ i ] ;
if ( button . mouseMove ( x , y ) ) {
return true ;
}
}
return false ;
}
bool PopupMenu : : mouseClick ( int x , int y ) {
if ( this - > getVisible ( ) = = false ) {
return false ;
}
for ( unsigned int i = 0 ; i < buttons . size ( ) ; + + i ) {
GraphicButton & button = buttons [ i ] ;
if ( button . mouseClick ( x , y ) ) {
return true ;
}
}
return false ;
}
std : : pair < int , string > PopupMenu : : mouseClickedMenuItem ( int x , int y ) {
std : : pair < int , string > result ;
for ( unsigned int i = 0 ; i < buttons . size ( ) ; + + i ) {
GraphicButton & button = buttons [ i ] ;
if ( button . mouseClick ( x , y ) ) {
result . first = i ;
result . second = buttons [ i ] . getText ( ) ;
break ;
}
}
return result ;
}
2010-12-31 18:16:49 +01:00
2010-04-01 09:53:07 +02:00
} } //end namespace