@@ -61,9 +61,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
61
61
<< parts[b] << " \" " << std::endl; \
62
62
return ; \
63
63
}
64
-
65
- extern gui::IGUIEnvironment* guienv;
66
-
67
64
/*
68
65
GUIFormSpecMenu
69
66
*/
@@ -87,7 +84,7 @@ GUIFormSpecMenu::GUIFormSpecMenu(irr::IrrlichtDevice* dev,
87
84
m_form_src(fsrc),
88
85
m_text_dst(tdst),
89
86
m_ext_ptr(ext_ptr),
90
- m_font(guienv ->getSkin ()->getFont())
87
+ m_font(dev-> getGUIEnvironment () ->getSkin()->getFont())
91
88
{
92
89
current_keys_pending.key_down = false ;
93
90
current_keys_pending.key_up = false ;
@@ -375,15 +372,15 @@ void GUIFormSpecMenu::parseCheckbox(parserData* data,std::string element)
375
372
{
376
373
std::vector<std::string> parts = split (element,' ;' );
377
374
378
- if ((parts.size () == 3 ) || (parts.size () == 4 )) {
375
+ if ((parts.size () >= 3 ) || (parts.size () <= 5 )) {
379
376
std::vector<std::string> v_pos = split (parts[0 ],' ,' );
380
377
std::string name = parts[1 ];
381
378
std::string label = parts[2 ];
382
379
std::string selected = " " ;
383
-
384
- if (parts.size () = = 4 )
385
- selected = parts[3 ];
386
-
380
+
381
+ if (parts.size () > = 4 )
382
+ selected = parts[3 ];
383
+
387
384
MY_CHECKPOS (" checkbox" ,0 );
388
385
389
386
v2s32 pos = padding;
@@ -416,7 +413,8 @@ void GUIFormSpecMenu::parseCheckbox(parserData* data,std::string element)
416
413
if (spec.fname == data->focused_fieldname ) {
417
414
Environment->setFocus (e);
418
415
}
419
-
416
+ if (parts.size () >= 5 )
417
+ spec.tooltip = parts[4 ];
420
418
m_checkboxes.push_back (std::pair<FieldSpec,gui::IGUICheckBox*>(spec,e));
421
419
m_fields.push_back (spec);
422
420
return ;
@@ -501,7 +499,7 @@ void GUIFormSpecMenu::parseButton(parserData* data,std::string element,
501
499
{
502
500
std::vector<std::string> parts = split (element,' ;' );
503
501
504
- if (parts.size () == 4 ) {
502
+ if (parts.size () == 4 || parts. size () == 5 ) {
505
503
std::vector<std::string> v_pos = split (parts[0 ],' ,' );
506
504
std::vector<std::string> v_geom = split (parts[1 ],' ,' );
507
505
std::string name = parts[2 ];
@@ -542,7 +540,9 @@ void GUIFormSpecMenu::parseButton(parserData* data,std::string element,
542
540
if (spec.fname == data->focused_fieldname ) {
543
541
Environment->setFocus (e);
544
542
}
545
-
543
+ if (parts.size () >= 5 )
544
+ spec.tooltip = parts[4 ];
545
+
546
546
m_fields.push_back (spec);
547
547
return ;
548
548
}
@@ -1062,7 +1062,7 @@ void GUIFormSpecMenu::parseField(parserData* data,std::string element,
1062
1062
{
1063
1063
std::vector<std::string> parts = split (element,' ;' );
1064
1064
1065
- if (parts.size () == 3 ) {
1065
+ if (parts.size () == 3 || parts. size () == 4 ) {
1066
1066
parseSimpleField (data,parts);
1067
1067
return ;
1068
1068
}
@@ -1165,7 +1165,7 @@ void GUIFormSpecMenu::parseImageButton(parserData* data,std::string element,
1165
1165
{
1166
1166
std::vector<std::string> parts = split (element,' ;' );
1167
1167
1168
- if ((parts.size () == 5 ) || (parts.size () == 7 ) || (parts.size () == 8 )) {
1168
+ if ((( parts.size () >= 5 ) && (parts.size () <= 9 )) && (parts.size () != 6 )) {
1169
1169
std::vector<std::string> v_pos = split (parts[0 ],' ,' );
1170
1170
std::vector<std::string> v_geom = split (parts[1 ],' ,' );
1171
1171
std::string image_name = parts[2 ];
@@ -1182,20 +1182,18 @@ void GUIFormSpecMenu::parseImageButton(parserData* data,std::string element,
1182
1182
geom.X = (stof (v_geom[0 ]) * (float )spacing.X )-(spacing.X -imgsize.X );
1183
1183
geom.Y = (stof (v_geom[1 ]) * (float )spacing.Y )-(spacing.Y -imgsize.Y );
1184
1184
1185
- bool noclip = false ;
1185
+ bool noclip = false ;
1186
1186
bool drawborder = true ;
1187
-
1188
- if ((parts.size () >= 7 )) {
1187
+ std::string pressed_image_name = " " ;
1188
+
1189
+ if (parts.size () >= 7 ) {
1189
1190
if (parts[5 ] == " true" )
1190
1191
noclip = true ;
1191
-
1192
1192
if (parts[6 ] == " false" )
1193
1193
drawborder = false ;
1194
1194
}
1195
-
1196
- std::string pressed_image_name = " " ;
1197
-
1198
- if ((parts.size () == 8 )) {
1195
+
1196
+ if (parts.size () >= 8 ) {
1199
1197
pressed_image_name = parts[7 ];
1200
1198
}
1201
1199
@@ -1223,7 +1221,7 @@ void GUIFormSpecMenu::parseImageButton(parserData* data,std::string element,
1223
1221
video::ITexture *texture = 0 ;
1224
1222
video::ITexture *pressed_texture = 0 ;
1225
1223
texture = m_tsrc->getTexture (image_name);
1226
- if (parts. size () == 8 )
1224
+ if (pressed_image_name != " " )
1227
1225
pressed_texture = m_tsrc->getTexture (pressed_image_name);
1228
1226
else
1229
1227
pressed_texture = texture;
@@ -1233,6 +1231,8 @@ void GUIFormSpecMenu::parseImageButton(parserData* data,std::string element,
1233
1231
if (spec.fname == data->focused_fieldname ) {
1234
1232
Environment->setFocus (e);
1235
1233
}
1234
+ if (parts.size () >= 9 )
1235
+ spec.tooltip = parts[8 ];
1236
1236
1237
1237
e->setUseAlphaChannel (true );
1238
1238
e->setImage (texture);
@@ -1375,8 +1375,7 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data,std::string element)
1375
1375
spec.ftype = f_Button;
1376
1376
rect+=data->basepos -padding;
1377
1377
spec.rect =rect;
1378
- if (tooltip!=" " )
1379
- spec.tooltip =tooltip;
1378
+ spec.tooltip = tooltip;
1380
1379
m_fields.push_back (spec);
1381
1380
return ;
1382
1381
}
@@ -2051,24 +2050,33 @@ void GUIFormSpecMenu::drawMenu()
2051
2050
/*
2052
2051
Draw fields/buttons tooltips
2053
2052
*/
2054
- for (u32 i= 0 ; i<m_fields. size (); i++)
2055
- {
2056
- const FieldSpec &spec = m_fields[i];
2057
- if (spec. tooltip != " " )
2058
- {
2059
- core::rect<s32> rect = spec. rect ;
2060
- if (rect. isPointInside (m_pointer))
2061
- {
2053
+ gui::IGUIElement *hovered =
2054
+ Environment-> getRootGUIElement ()-> getElementFromPoint (m_pointer);
2055
+
2056
+ if (hovered != NULL ) {
2057
+ s32 id = hovered-> getID ();
2058
+ for (std::vector<FieldSpec>::iterator iter = m_fields. begin () ;
2059
+ iter != m_fields. end (); iter++) {
2060
+ if ( (iter-> fid == id) && (iter-> tooltip != " " ) ) {
2062
2061
m_tooltip_element->setVisible (true );
2063
2062
this ->bringToFront (m_tooltip_element);
2064
- m_tooltip_element->setText (narrow_to_wide (spec. tooltip ).c_str ());
2063
+ m_tooltip_element->setText (narrow_to_wide (iter-> tooltip ).c_str ());
2065
2064
s32 tooltip_x = m_pointer.X + 15 ;
2066
2065
s32 tooltip_y = m_pointer.Y + 15 ;
2067
2066
s32 tooltip_width = m_tooltip_element->getTextWidth () + 15 ;
2068
- s32 tooltip_height = m_tooltip_element->getTextHeight () + 5 ;
2067
+ if (tooltip_x + tooltip_width > (s32)screenSize.X )
2068
+ tooltip_x = (s32)screenSize.X - tooltip_width - 15 ;
2069
+ int lines_count = 1 ;
2070
+ size_t i = 0 ;
2071
+ while ((i = iter->tooltip .find (" \n " , i)) != std::string::npos) {
2072
+ lines_count++;
2073
+ i += 2 ;
2074
+ }
2075
+ s32 tooltip_height = m_tooltip_element->getTextHeight () * lines_count + 5 ;
2069
2076
m_tooltip_element->setRelativePosition (core::rect<s32>(
2070
2077
core::position2d<s32>(tooltip_x, tooltip_y),
2071
2078
core::dimension2d<s32>(tooltip_width, tooltip_height)));
2079
+ break ;
2072
2080
}
2073
2081
}
2074
2082
}
0 commit comments