Fixed joystick/keyboard GUI handling.
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/trunk/supertuxkart@1341 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
parent
b3ab2d474d
commit
9218c15a18
@ -1225,66 +1225,60 @@ WidgetManager::decrease_scroll_speed(const bool fast)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//FIXME: find_left_widget() doesn't works properly yet
|
|
||||||
/** find_left_widget() returns the closest widget to the left of START_WGT.
|
/** find_left_widget() returns the closest widget to the left of START_WGT.
|
||||||
|
* We use the center of the widgets as the reference points; then, we
|
||||||
|
* filter any widget that is not to the left, and favor the ones that are
|
||||||
|
* closest in the Y-axis. If there is only one widget that is closest in the
|
||||||
|
* Y-axis, we pick that one as the closest, but if there is more than one
|
||||||
|
* widget with the same vertical distance, we have to break the tie by
|
||||||
|
* choosing the one closest in the X-axis.
|
||||||
*/
|
*/
|
||||||
int WidgetManager::find_left_widget(const int START_WGT) const
|
int WidgetManager::find_left_widget(const int START_WGT) const
|
||||||
{
|
{
|
||||||
const int NUM_WIDGETS = m_widgets.size();
|
const int NUM_WIDGETS = m_widgets.size();
|
||||||
int closest_wgt = WGT_NONE;
|
int closest_wgt = WGT_NONE;
|
||||||
int closest_dist = user_config->m_width;
|
int closest_x_dist = user_config->m_width;
|
||||||
|
int closest_y_dist = user_config->m_height;
|
||||||
|
|
||||||
|
const int START_WGT_Y_CENTER = m_widgets[START_WGT].widget->m_y +
|
||||||
|
m_widgets[START_WGT].widget->m_height / 2;
|
||||||
|
const int START_WGT_X_CENTER = m_widgets[START_WGT].widget->m_x +
|
||||||
|
m_widgets[START_WGT].widget->m_width / 2;
|
||||||
|
|
||||||
|
int curr_wgt_x_center, curr_wgt_y_center;
|
||||||
|
int x_dist, y_dist;
|
||||||
|
|
||||||
for( int i = 0; i < NUM_WIDGETS; ++i )
|
for( int i = 0; i < NUM_WIDGETS; ++i )
|
||||||
{
|
{
|
||||||
if(!(m_widgets[i].active)) continue;
|
if(!(m_widgets[i].active)) continue;
|
||||||
|
|
||||||
if( m_widgets[i].widget->m_x + m_widgets[i].widget->m_width < m_widgets[START_WGT].widget->m_x + m_widgets[START_WGT].widget->m_width)
|
curr_wgt_y_center = m_widgets[i].widget->m_y + m_widgets[i].widget->m_height / 2;
|
||||||
|
curr_wgt_x_center = m_widgets[i].widget->m_x + m_widgets[i].widget->m_width / 2;
|
||||||
|
|
||||||
|
x_dist = START_WGT_X_CENTER - curr_wgt_x_center;
|
||||||
|
y_dist = abs( curr_wgt_y_center - START_WGT_Y_CENTER );
|
||||||
|
|
||||||
|
//Filter out all widgets that are not to the left and choose the
|
||||||
|
//widget that is closest in the Y-axis
|
||||||
|
if( x_dist > 0 && y_dist <= closest_y_dist )
|
||||||
{
|
{
|
||||||
const int START_WGT_Y_CENTER = m_widgets[START_WGT].widget->m_y + m_widgets[START_WGT].widget->m_height / 2;
|
closest_y_dist = y_dist;
|
||||||
const int START_WGT_X_CENTER = m_widgets[START_WGT].widget->m_x + m_widgets[START_WGT].widget->m_width / 2;
|
|
||||||
const int CURR_WGT_Y_CENTER = m_widgets[i].widget->m_y + m_widgets[i].widget->m_height / 2;
|
|
||||||
const int CURR_WGT_X_CENTER = m_widgets[i].widget->m_x + m_widgets[i].widget->m_width / 2;
|
|
||||||
|
|
||||||
const int X_DIST = START_WGT_X_CENTER - CURR_WGT_X_CENTER;
|
//If this is the first widget with this vertical distance, pick
|
||||||
if( X_DIST > abs(CURR_WGT_Y_CENTER - START_WGT_Y_CENTER ))
|
//it as the current closest widget
|
||||||
|
if( y_dist != closest_y_dist )
|
||||||
{
|
{
|
||||||
if( closest_dist > X_DIST )
|
closest_x_dist = user_config->m_width; //Reset the distance
|
||||||
{
|
closest_wgt = i;
|
||||||
closest_dist = X_DIST;
|
}
|
||||||
closest_wgt = i;
|
//If there is more than one widget with the same vertical
|
||||||
}
|
//distance, choose the one that is closest in the X-axis
|
||||||
|
else if( x_dist <= closest_x_dist )
|
||||||
|
{
|
||||||
|
closest_x_dist = x_dist;
|
||||||
|
closest_wgt = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
//Check if the widget with the id i is to the left of the start widget.
|
|
||||||
//To do so, simply checking if the X position of the i widget is smaller
|
|
||||||
//than the start widget(divides the screen in a left and right blocks),
|
|
||||||
//and that the distance between the two widgets in the X axis is bigger
|
|
||||||
//than the distance in the Y axis(so that widgets on top and the
|
|
||||||
//bottom are ignored).
|
|
||||||
if( m_widgets[i].widget->m_x <= m_widgets[START_WGT].widget->m_x &&
|
|
||||||
m_widgets[START_WGT].widget->m_x - m_widgets[i].widget->m_x >=
|
|
||||||
abs(m_widgets[START_WGT].widget->m_y - m_widgets[i].widget->m_y ))
|
|
||||||
{
|
|
||||||
//FIXME: instead of using plib's routines, we should use functions
|
|
||||||
//that works on integers that don't depend on external libraries.
|
|
||||||
sgVec2 a;
|
|
||||||
a[0] = m_widgets[START_WGT].widget->m_x;
|
|
||||||
a[1] = m_widgets[START_WGT].widget->m_y;
|
|
||||||
|
|
||||||
sgVec2 b;
|
|
||||||
b[0] = m_widgets[i].widget->m_x;
|
|
||||||
b[1] = m_widgets[i].widget->m_y;
|
|
||||||
//Now that we know that the i widget is to the left, we have
|
|
||||||
//to find if it's the closest one.
|
|
||||||
if( closest_dist * closest_dist > sgDistanceSquaredVec2( a,b ) )
|
|
||||||
{
|
|
||||||
closest_dist = (int)sgDistanceSquaredVec2( a,b );
|
|
||||||
closest_wgt = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return closest_wgt;
|
return closest_wgt;
|
||||||
@ -1297,63 +1291,44 @@ int WidgetManager::find_right_widget(const int START_WGT) const
|
|||||||
{
|
{
|
||||||
const int NUM_WIDGETS = m_widgets.size();
|
const int NUM_WIDGETS = m_widgets.size();
|
||||||
int closest_wgt = WGT_NONE;
|
int closest_wgt = WGT_NONE;
|
||||||
int closest_dist = user_config->m_width;
|
int closest_x_dist = user_config->m_width;
|
||||||
|
int closest_y_dist = user_config->m_height;
|
||||||
|
|
||||||
|
const int START_WGT_Y_CENTER = m_widgets[START_WGT].widget->m_y +
|
||||||
|
m_widgets[START_WGT].widget->m_height / 2;
|
||||||
|
const int START_WGT_X_CENTER = m_widgets[START_WGT].widget->m_x +
|
||||||
|
m_widgets[START_WGT].widget->m_width / 2;
|
||||||
|
|
||||||
|
int curr_wgt_x_center, curr_wgt_y_center;
|
||||||
|
int x_dist, y_dist;
|
||||||
|
|
||||||
for( int i = 0; i < NUM_WIDGETS; ++i )
|
for( int i = 0; i < NUM_WIDGETS; ++i )
|
||||||
{
|
{
|
||||||
if(!(m_widgets[i].active)) continue;
|
if(!(m_widgets[i].active)) continue;
|
||||||
|
|
||||||
//Check if the widget with the id i is on top of the start widget.
|
curr_wgt_y_center = m_widgets[i].widget->m_y + m_widgets[i].widget->m_height / 2;
|
||||||
//First it is checked if the y value of the i widget is higher than
|
curr_wgt_x_center = m_widgets[i].widget->m_x + m_widgets[i].widget->m_width / 2;
|
||||||
//the start widget(remember that for the widget manager a higher
|
|
||||||
//value means that it is more on top). Then we add more precision:
|
//Notice that the order of this substraction is the *only* difference
|
||||||
//if the vertical distance of the center of the two widgets is
|
//from the find_left_widget() function
|
||||||
//smaller than the horizontal distance between the center of the two
|
x_dist = curr_wgt_x_center - START_WGT_X_CENTER;
|
||||||
//widgets, then the i widget is definitely on top of the START_WGT
|
y_dist = abs( curr_wgt_y_center - START_WGT_Y_CENTER );
|
||||||
//widget.
|
|
||||||
if( m_widgets[i].widget->m_x > m_widgets[START_WGT].widget->m_x )
|
if( x_dist > 0 && y_dist <= closest_y_dist )
|
||||||
{
|
{
|
||||||
const int START_WGT_Y_CENTER = m_widgets[START_WGT].widget->m_y + m_widgets[START_WGT].widget->m_height / 2;
|
closest_y_dist = y_dist;
|
||||||
const int START_WGT_X_CENTER = m_widgets[START_WGT].widget->m_x + m_widgets[START_WGT].widget->m_width / 2;
|
|
||||||
const int CURR_WGT_Y_CENTER = m_widgets[i].widget->m_y + m_widgets[i].widget->m_height / 2;
|
|
||||||
const int CURR_WGT_X_CENTER = m_widgets[i].widget->m_x + m_widgets[i].widget->m_width / 2;
|
|
||||||
|
|
||||||
const int X_DIST = CURR_WGT_X_CENTER - START_WGT_X_CENTER;
|
if( y_dist != closest_y_dist )
|
||||||
if( X_DIST > abs(CURR_WGT_Y_CENTER - START_WGT_Y_CENTER ))
|
|
||||||
{
|
{
|
||||||
if( closest_dist > X_DIST )
|
closest_x_dist = user_config->m_width;
|
||||||
{
|
closest_wgt = i;
|
||||||
closest_dist = X_DIST;
|
}
|
||||||
closest_wgt = i;
|
else if( x_dist <= closest_x_dist )
|
||||||
}
|
{
|
||||||
|
closest_x_dist = x_dist;
|
||||||
|
closest_wgt = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
//Check if the widget with the id i is to the right of the start widget.
|
|
||||||
if( m_widgets[i].widget->m_x >= m_widgets[START_WGT].widget->m_x &&
|
|
||||||
m_widgets[i].widget->m_x - m_widgets[START_WGT].widget->m_x >=
|
|
||||||
abs(m_widgets[START_WGT].widget->m_y - m_widgets[i].widget->m_y ))
|
|
||||||
{
|
|
||||||
//FIXME: instead of using plib's routines, we should use functions
|
|
||||||
//that works on integers that don't depend on external libraries.
|
|
||||||
sgVec2 a;
|
|
||||||
a[0] = m_widgets[START_WGT].widget->m_x;
|
|
||||||
a[1] = m_widgets[START_WGT].widget->m_y;
|
|
||||||
|
|
||||||
sgVec2 b;
|
|
||||||
b[0] = m_widgets[i].widget->m_x;
|
|
||||||
b[1] = m_widgets[i].widget->m_y;
|
|
||||||
|
|
||||||
//Check if the widget found is closer than the closest
|
|
||||||
//widget we have found
|
|
||||||
if( closest_dist * closest_dist > sgDistanceSquaredVec2( a,b ) )
|
|
||||||
{
|
|
||||||
closest_dist = (int)sgDistanceSquaredVec2( a,b );
|
|
||||||
closest_wgt = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return closest_wgt;
|
return closest_wgt;
|
||||||
@ -1367,35 +1342,46 @@ int WidgetManager::find_top_widget(const int START_WGT) const
|
|||||||
{
|
{
|
||||||
const int NUM_WIDGETS = m_widgets.size();
|
const int NUM_WIDGETS = m_widgets.size();
|
||||||
int closest_wgt = WGT_NONE;
|
int closest_wgt = WGT_NONE;
|
||||||
int closest_dist = user_config->m_height;
|
int closest_x_dist = user_config->m_width;
|
||||||
for(int i = 0; i < NUM_WIDGETS; ++i)
|
int closest_y_dist = user_config->m_height;
|
||||||
|
|
||||||
|
const int START_WGT_Y_CENTER = m_widgets[START_WGT].widget->m_y +
|
||||||
|
m_widgets[START_WGT].widget->m_height / 2;
|
||||||
|
const int START_WGT_X_CENTER = m_widgets[START_WGT].widget->m_x +
|
||||||
|
m_widgets[START_WGT].widget->m_width / 2;
|
||||||
|
|
||||||
|
int curr_wgt_x_center, curr_wgt_y_center;
|
||||||
|
int x_dist, y_dist;
|
||||||
|
|
||||||
|
for( int i = 0; i < NUM_WIDGETS; ++i )
|
||||||
{
|
{
|
||||||
if(!(m_widgets[i].active)) continue;
|
if(!(m_widgets[i].active)) continue;
|
||||||
|
|
||||||
//Check if the widget with the ID i is on top of the start widget.
|
curr_wgt_y_center = m_widgets[i].widget->m_y + m_widgets[i].widget->m_height / 2;
|
||||||
//First it is checked if the y value of the i widget is higher than
|
curr_wgt_x_center = m_widgets[i].widget->m_x + m_widgets[i].widget->m_width / 2;
|
||||||
//the start widget(remember that for the widget manager a higher
|
|
||||||
//value means that it closer to the top of the screen). Then we add
|
y_dist = curr_wgt_y_center - START_WGT_Y_CENTER;
|
||||||
//more precision: if the vertical distance of the center of the two
|
x_dist = abs( curr_wgt_x_center - START_WGT_X_CENTER );
|
||||||
//widgets is smaller than the horizontal distance between the center
|
|
||||||
//of the two widgets, then the i widget is definitely on top of the
|
//Filter out all widgets that are not on top and choose the
|
||||||
//START_WGT widget.
|
//widget that is closest in the X-axis
|
||||||
if( m_widgets[i].widget->m_y > m_widgets[START_WGT].widget->m_y )
|
if( y_dist > 0 && x_dist <= closest_x_dist )
|
||||||
{
|
{
|
||||||
const int START_WGT_Y_CENTER = m_widgets[START_WGT].widget->m_y + m_widgets[START_WGT].widget->m_height / 2;
|
closest_x_dist = x_dist;
|
||||||
const int START_WGT_X_CENTER = m_widgets[START_WGT].widget->m_x + m_widgets[START_WGT].widget->m_width / 2;
|
|
||||||
const int CURR_WGT_Y_CENTER = m_widgets[i].widget->m_y + m_widgets[i].widget->m_height / 2;
|
|
||||||
const int CURR_WGT_X_CENTER = m_widgets[i].widget->m_x + m_widgets[i].widget->m_width / 2;
|
|
||||||
|
|
||||||
const int Y_DIST = CURR_WGT_Y_CENTER - START_WGT_Y_CENTER;
|
//If this is the first widget with this vertical distance, pick
|
||||||
if( Y_DIST > abs(CURR_WGT_X_CENTER - START_WGT_X_CENTER ))
|
//it as the current closest widget
|
||||||
|
if( x_dist != closest_x_dist )
|
||||||
{
|
{
|
||||||
if( closest_dist > Y_DIST )
|
closest_y_dist = user_config->m_height;
|
||||||
{
|
closest_wgt = i;
|
||||||
closest_dist = Y_DIST;
|
}
|
||||||
closest_wgt = i;
|
//If there is more than one widget with the same horizontal
|
||||||
}
|
//distance, choose the one that is closest in the Y-axis
|
||||||
|
else if( y_dist <= closest_y_dist )
|
||||||
|
{
|
||||||
|
closest_y_dist = y_dist;
|
||||||
|
closest_wgt = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1411,27 +1397,42 @@ int WidgetManager::find_bottom_widget(const int START_WGT) const
|
|||||||
{
|
{
|
||||||
const int NUM_WIDGETS = m_widgets.size();
|
const int NUM_WIDGETS = m_widgets.size();
|
||||||
int closest_wgt = WGT_NONE;
|
int closest_wgt = WGT_NONE;
|
||||||
int closest_dist = user_config->m_height;
|
int closest_x_dist = user_config->m_width;
|
||||||
for(int i = 0; i < NUM_WIDGETS; ++i)
|
int closest_y_dist = user_config->m_height;
|
||||||
|
|
||||||
|
const int START_WGT_Y_CENTER = m_widgets[START_WGT].widget->m_y +
|
||||||
|
m_widgets[START_WGT].widget->m_height / 2;
|
||||||
|
const int START_WGT_X_CENTER = m_widgets[START_WGT].widget->m_x +
|
||||||
|
m_widgets[START_WGT].widget->m_width / 2;
|
||||||
|
|
||||||
|
int curr_wgt_x_center, curr_wgt_y_center;
|
||||||
|
int x_dist, y_dist;
|
||||||
|
|
||||||
|
for( int i = 0; i < NUM_WIDGETS; ++i )
|
||||||
{
|
{
|
||||||
if(!(m_widgets[i].active)) continue;
|
if(!(m_widgets[i].active)) continue;
|
||||||
|
|
||||||
if( m_widgets[i].widget->m_y + m_widgets[i].widget->m_height < m_widgets[START_WGT].widget->m_y + m_widgets[START_WGT].widget->m_height)
|
curr_wgt_y_center = m_widgets[i].widget->m_y + m_widgets[i].widget->m_height / 2;
|
||||||
|
curr_wgt_x_center = m_widgets[i].widget->m_x + m_widgets[i].widget->m_width / 2;
|
||||||
|
|
||||||
|
//Notice that the order of this substraction is the *only* difference
|
||||||
|
//from the find_top_widget() function
|
||||||
|
y_dist = START_WGT_Y_CENTER - curr_wgt_y_center;
|
||||||
|
x_dist = abs( curr_wgt_x_center - START_WGT_X_CENTER );
|
||||||
|
|
||||||
|
if( y_dist > 0 && x_dist <= closest_x_dist )
|
||||||
{
|
{
|
||||||
const int START_WGT_Y_CENTER = m_widgets[START_WGT].widget->m_y + m_widgets[START_WGT].widget->m_height / 2;
|
closest_x_dist = x_dist;
|
||||||
const int START_WGT_X_CENTER = m_widgets[START_WGT].widget->m_x + m_widgets[START_WGT].widget->m_width / 2;
|
|
||||||
const int CURR_WGT_Y_CENTER = m_widgets[i].widget->m_y + m_widgets[i].widget->m_height / 2;
|
|
||||||
const int CURR_WGT_X_CENTER = m_widgets[i].widget->m_x + m_widgets[i].widget->m_width / 2;
|
|
||||||
|
|
||||||
const int Y_DIST = START_WGT_Y_CENTER - CURR_WGT_Y_CENTER;
|
if( x_dist != closest_x_dist )
|
||||||
if( Y_DIST > abs(CURR_WGT_X_CENTER - START_WGT_X_CENTER ))
|
|
||||||
{
|
{
|
||||||
if( closest_dist > Y_DIST )
|
closest_y_dist = user_config->m_height;
|
||||||
{
|
closest_wgt = i;
|
||||||
closest_dist = Y_DIST;
|
}
|
||||||
closest_wgt = i;
|
else if( y_dist <= closest_y_dist )
|
||||||
}
|
{
|
||||||
|
closest_y_dist = y_dist;
|
||||||
|
closest_wgt = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user