Fixed widget scrolling and removed font aligment option.

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/trunk/supertuxkart@1328 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
cosmosninja 2007-12-09 17:58:51 +00:00
parent 7e68fd5ddf
commit 6bd0861ad4
20 changed files with 267 additions and 180 deletions

View File

@ -43,7 +43,7 @@ ConfigControls::ConfigControls()
const bool SHOW_RECT = true;
const bool SHOW_TEXT = true;
widget_manager->set_initial_rect_state(SHOW_RECT, WGT_AREA_ALL, WGT_TRANS_BLACK);
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED, Font::ALIGN_CENTER, Font::ALIGN_CENTER );
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED );
widget_manager->insert_column();
widget_manager->add_wgt( WTOK_TITLE, 60, 7 );

View File

@ -57,7 +57,7 @@ ConfigDisplay::ConfigDisplay()
const bool SHOW_RECT = true;
const bool SHOW_TEXT = true;
widget_manager->set_initial_rect_state(SHOW_RECT, WGT_AREA_ALL, WGT_TRANS_BLACK);
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED, Font::ALIGN_CENTER, Font::ALIGN_CENTER );
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED );
widget_manager->insert_column();
widget_manager->add_wgt( WTOK_TITLE, 40, 7);

View File

@ -39,7 +39,7 @@ ConfigSound::ConfigSound()
const bool SHOW_RECT = true;
const bool SHOW_TEXT = true;
widget_manager->set_initial_rect_state(SHOW_RECT, WGT_AREA_ALL, WGT_TRANS_BLACK);
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED, Font::ALIGN_CENTER, Font::ALIGN_CENTER );
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED );
widget_manager->insert_column();
widget_manager->add_wgt(WTOK_TITLE, 40, 7);

View File

@ -69,13 +69,14 @@ CreditsMenu::CreditsMenu()
widget_manager->set_initial_activation_state( true );
widget_manager->set_initial_rect_state(SHOW_RECT, WGT_AREA_ALL, WGT_TRANS_BLACK);
widget_manager->set_initial_text_state(SHOW_TEXT, "", TEXT_SIZE, Font::ALIGN_CENTER, Font::ALIGN_CENTER);
widget_manager->set_initial_text_state(SHOW_TEXT, "", TEXT_SIZE );
widget_manager->add_wgt( WTOK_CREDITS, 100, 93);
widget_manager->set_wgt_text( WTOK_CREDITS, credits_text );
widget_manager->set_wgt_text_x_alignment( WTOK_CREDITS, Font::ALIGN_LEFT );
//FIXME: maybe I should make scroll names more consistent
widget_manager->enable_wgt_scroll( WTOK_CREDITS );
widget_manager->set_wgt_y_scroll_pos( WTOK_CREDITS, WGT_SCROLL_START_BOTTOM );
widget_manager->set_wgt_y_scroll_speed( WTOK_CREDITS, -0.25f );
widget_manager->break_line();
widget_manager->add_wgt( WTOK_QUIT, 40, 7);

View File

@ -38,7 +38,7 @@ Difficulty::Difficulty()
const bool SHOW_RECT = true;
const bool SHOW_TEXT = true;
widget_manager->set_initial_rect_state(SHOW_RECT, WGT_AREA_ALL, WGT_TRANS_BLACK);
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED, Font::ALIGN_CENTER, Font::ALIGN_CENTER );
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED );
widget_manager->insert_column();
widget_manager->add_wgt(WTOK_TITLE, 60, 7);

View File

@ -67,8 +67,7 @@ Font::~Font()
// -----------------------------------------------------------------------------
void Font::Print(const char *text, int size,
FontAlignType fontalign_x, int x,
FontAlignType fontalign_y, int y,
int x, int y,
int red, int green, int blue,
float scale_x, float scale_y,
int left, int right, int top, int bottom, bool doShadow)
@ -83,33 +82,25 @@ void Font::Print(const char *text, int size,
m_fnt->getBBox(text, sz, 0, &l, &r, &b, &t);
const int W = (int)((r-l+0.99));
const int H = (int)((t-b+0.99));
if(fontalign_x == ALIGN_CENTER)
if(x==CENTER_OF_SCREEN)
{
if(x==CENTER_OF_SCREEN)
{
if(left ==-1) left = 0;
if(right==-1) right = user_config->m_width-1;
int width = right-left+1;
x = (width - W)/2 + left;
}
else
{
x -= W/2;
}
if(left ==-1) left = 0;
if(right==-1) right = user_config->m_width-1;
int width = right-left+1;
x = (width - W)/2 + left;
}
if(fontalign_y == ALIGN_CENTER)
if(y==CENTER_OF_SCREEN)
{
if(y==CENTER_OF_SCREEN)
{
if(top == -1) top = user_config->m_height-1;
if(bottom == -1) bottom = 0;
int height = top-bottom+1;
y = (height - H)/2 + bottom;
}
else
{
y-=H/2;
}
if(top == -1) top = user_config->m_height-1;
if(bottom == -1) bottom = 0;
int height = top-bottom+1;
y = (height - H)/2 + bottom;
}
else
{
y -= H/2;
}
m_text_out->begin();

View File

@ -31,8 +31,6 @@ private:
fntRenderer *m_text_out;
public:
// Align right and top are not supported yet
enum FontAlignType {ALIGN_LEFT, ALIGN_CENTER, ALIGN_BOTTOM};
const static int CENTER_OF_SCREEN=-1;
enum FontSize {SMALL=18, MEDIUM=24, LARGE=30 };
Font(const char* fontname);
@ -46,56 +44,57 @@ public:
// The actual main function which does everything
// ----------------------------------------------
void Print( const char *text, int size,
FontAlignType fontalign_x, int x,
FontAlignType fontalign_y, int y,
void Print( const char *text, int size,
int x, int y,
int red=255, int green=255, int blue=255,
float scale_x=1.0f, float scale_y=1.0f,
int left=-1, int right=-1, int top=-1, int bottom=-1,
bool doShadow=false);
void Print( std::string const &text, int size,
FontAlignType fontalign_x, int x,
FontAlignType fontalign_y, int y,
void Print( std::string const &text, int size,
int x, int y,
int red=255, int green=255, int blue=255,
float scale_x=1.0f, float scale_y=1.0f,
int left=-1, int right=-1, int top=-1, int bottom=-1,
bool doShadow=false)
{
Print(text.c_str(), size, fontalign_x, x, fontalign_y, y,
Print(text.c_str(), size, x, y,
red, green, blue, scale_x, scale_y, left, right, top, bottom,
doShadow);
}
#if 0
// Convenience functions to reduce the number of parameters
// --------------------------------------------------------
void Print( const std::string &text, int size, int x, int y,
int red=255, int green=255, int blue=255,
int left=-1, int right=-1, int top=-1, int bottom=-1)
{
Print(text, size, ALIGN_LEFT, x, ALIGN_BOTTOM, y,
Print(text, size, x, y,
red, green, blue, 1.0f, 1.0f,
left, right, top, bottom);
}
#endif
void PrintShadow(const char *text, int size,
FontAlignType fontalign_x, int x,
FontAlignType fontalign_y, int y,
int x, int y,
int red=255, int green=255, int blue=255,
float scale_x=1.0f, float scale_y=1.0f,
int left=-1, int right=-1, int top=-1, int bottom=-1)
{
Print(text, size, fontalign_x, x, fontalign_y, y,
Print(text, size, x, y,
red, green, blue, scale_x, scale_y,
left, right, top, bottom, true);
}
#if 0
void PrintShadow(const char *text, int size, int x, int y,
int red=255, int green=255, int blue=255,
int left=-1, int right=-1, int top=-1, int bottom=-1)
{
Print(text, size, ALIGN_LEFT, x, ALIGN_BOTTOM, y,
Print(text, size, x, y,
red, green, blue, 1.0f, 1.0f,
left, right, top, bottom, true);
}
#endif
};
int init_fonts();

View File

@ -37,7 +37,7 @@ GameMode::GameMode()
const bool SHOW_RECT = true;
const bool SHOW_TEXT = true;
widget_manager->set_initial_rect_state(SHOW_RECT, WGT_AREA_ALL, WGT_TRANS_BLACK);
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED, Font::ALIGN_CENTER, Font::ALIGN_CENTER );
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED );
widget_manager->insert_column();
widget_manager->add_wgt(WTOK_TITLE, 50, 7);

View File

@ -47,7 +47,7 @@ GrandPrixSelect::GrandPrixSelect()
const bool SHOW_RECT = true;
const bool SHOW_TEXT = true;
widget_manager->set_initial_rect_state(SHOW_RECT, WGT_AREA_ALL, WGT_TRANS_BLACK);
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED, Font::ALIGN_CENTER, Font::ALIGN_CENTER );
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED );
widget_manager->insert_column();
widget_manager->add_wgt(WTOK_TITLE, 40, 7);

View File

@ -155,7 +155,7 @@ void HelpMenu::switch_to_first_screen()
const WidgetFontSize TEXT_SIZE = WGT_FNT_SML;
widget_manager->set_initial_rect_state( SHOW_RECT, WGT_AREA_ALL, WGT_TRANS_BLACK );
widget_manager->set_initial_text_state( SHOW_TEXT, "", TEXT_SIZE, Font::ALIGN_CENTER, Font::ALIGN_CENTER );
widget_manager->set_initial_text_state( SHOW_TEXT, "", TEXT_SIZE );
/*Help header*/
widget_manager->add_wgt(WTOK_MSG1, 50, 7);
@ -262,7 +262,7 @@ void HelpMenu::switch_to_second_screen()
const bool SHOW_RECT = true;
const WidgetFontSize TEXT_SIZE = WGT_FNT_SML;
widget_manager->set_initial_rect_state( SHOW_RECT, WGT_AREA_ALL, WGT_TRANS_BLACK );
widget_manager->set_initial_text_state( false, "", TEXT_SIZE, Font::ALIGN_CENTER, Font::ALIGN_CENTER );
widget_manager->set_initial_text_state( false, "", TEXT_SIZE );
widget_manager->add_wgt(WTOK_MSG6, 100, 8);
widget_manager->set_wgt_text(WTOK_MSG6,

View File

@ -41,7 +41,7 @@ MainMenu::MainMenu()
const bool SHOW_TEXT = true;
widget_manager->set_initial_activation_state(true);
widget_manager->set_initial_rect_state(SHOW_RECT, WGT_AREA_ALL, WGT_TRANS_BLACK);
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED, Font::ALIGN_CENTER, Font::ALIGN_CENTER );
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED );
widget_manager->insert_column();
widget_manager->add_wgt(WTOK_SINGLE, 25, 7);

View File

@ -72,7 +72,7 @@ PlayerControls::PlayerControls(int whichPlayer):
const bool SHOW_RECT = true;
const bool SHOW_TEXT = true;
widget_manager->set_initial_rect_state(SHOW_RECT, WGT_AREA_ALL, WGT_TRANS_BLACK);
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED, Font::ALIGN_CENTER, Font::ALIGN_CENTER );
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED );
widget_manager->add_wgt( WTOK_TITLE, 60, 7);
sprintf(m_heading, _("Choose your controls, %s"),

View File

@ -800,8 +800,7 @@ void RaceGUI::drawAllMessages(Kart* player_kart, int offset_x, int offset_y,
if( msg.m_kart && msg.m_kart!=player_kart) continue;
font_race->Print( msg.m_message.c_str(), msg.m_font_size,
Font::ALIGN_CENTER, Font::CENTER_OF_SCREEN,
Font::ALIGN_BOTTOM, y,
Font::CENTER_OF_SCREEN, y,
msg.m_red, msg.m_green, msg.m_blue,
ratio_x, ratio_y,
offset_x, offset_x+(int)(user_config->m_width*ratio_x));
@ -849,18 +848,18 @@ void RaceGUI::drawStatusText (const RaceSetup& raceSetup, const float dt)
switch (world->m_ready_set_go)
{
case 2: font_race->PrintShadow(_("Ready!"), 90,
Font::ALIGN_CENTER, Font::CENTER_OF_SCREEN,
Font::ALIGN_CENTER, Font::CENTER_OF_SCREEN,
Font::CENTER_OF_SCREEN,
Font::CENTER_OF_SCREEN,
230, 170, 160);
break;
case 1: font_race->PrintShadow(_("Set!"), 90,
Font::ALIGN_CENTER, Font::CENTER_OF_SCREEN,
Font::ALIGN_CENTER, Font::CENTER_OF_SCREEN,
Font::CENTER_OF_SCREEN,
Font::CENTER_OF_SCREEN,
230, 230, 160);
break;
case 0: font_race->PrintShadow(_("Go!"), 90,
Font::ALIGN_CENTER, Font::CENTER_OF_SCREEN,
Font::ALIGN_CENTER, Font::CENTER_OF_SCREEN,
Font::CENTER_OF_SCREEN,
Font::CENTER_OF_SCREEN,
100, 210, 100);
break;
} // switch
@ -878,8 +877,8 @@ void RaceGUI::drawStatusText (const RaceSetup& raceSetup, const float dt)
if(world->getPlayerKart(i)->earlyStartPenalty())
{
font_race->PrintShadow(_("Penalty time!!"), 80,
Font::ALIGN_CENTER, Font::CENTER_OF_SCREEN,
Font::ALIGN_BOTTOM, 200, 200, 10, 10);
Font::CENTER_OF_SCREEN, 200,
200, 10, 10);
} // if penalty
} // for i < getNumPlayers
} // if not RACE_PHASE

View File

@ -44,7 +44,7 @@ RaceMenu::RaceMenu()
const bool SHOW_RECT = true;
const bool SHOW_TEXT = true;
widget_manager->set_initial_rect_state(SHOW_RECT, WGT_AREA_ALL, WGT_TRANS_BLACK);
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED, Font::ALIGN_CENTER, Font::ALIGN_CENTER );
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED );
widget_manager->add_wgt(WTOK_PAUSE, 30, 7);
widget_manager->set_wgt_text(WTOK_PAUSE, _("Paused"));

View File

@ -45,7 +45,7 @@ RaceResultsGUI::RaceResultsGUI()
const bool SHOW_RECT = true;
const bool SHOW_TEXT = true;
widget_manager->set_initial_rect_state(SHOW_RECT, WGT_AREA_ALL, WGT_TRANS_BLACK);
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED, Font::ALIGN_CENTER, Font::ALIGN_CENTER );
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_MED );
widget_manager->add_wgt(WTOK_TITLE, 60, 7);
widget_manager->set_wgt_text(WTOK_TITLE, _("Result"));
widget_manager->break_line();

View File

@ -68,7 +68,7 @@ TrackSel::TrackSel()
const bool SHOW_TEXT = true;
widget_manager->set_initial_activation_state(true);
widget_manager->set_initial_rect_state(SHOW_RECT, WGT_AREA_ALL, WGT_TRANS_BLACK);
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_SML, Font::ALIGN_CENTER, Font::ALIGN_CENTER );
widget_manager->set_initial_text_state(SHOW_TEXT, "", WGT_FNT_SML );
for (size_t i = 0; i != track_manager->getTrackCount(); i += 2)
{
widget_manager->add_wgt( WTOK_TRACK0 + i, 40, 7);
@ -81,7 +81,7 @@ TrackSel::TrackSel()
//FIXME: Right now, the image and the author's name is not controlled by the widget manager.
#if 0
widget_manager->set_initial_rect_state(false, WGT_AREA_ALL, WGT_TRANS_BLACK);
widget_manager->set_initial_text_state(false, "", WGT_FNT_MED, Font::ALIGN_CENTER, Font::ALIGN_CENTER );
widget_manager->set_initial_text_state(false, "", WGT_FNT_MED );
widget_manager->set_initial_activation_state(false);
widget_manager->add_wgt( WidgetManager::WGT_NONE, 100, 5);
widget_manager->break_line();
@ -174,8 +174,7 @@ void TrackSel::update(float dt)
// glCallList(m_rect);
glPopMatrix();
font_gui->Print(TRACK->getDescription(), WGT_FNT_MED,
Font::ALIGN_CENTER, -1,
Font::ALIGN_BOTTOM, 10);
Font::CENTER_OF_SCREEN, 10);
glDisable(GL_BLEND);
glMatrixMode(GL_PROJECTION);
glPopMatrix();

View File

@ -28,6 +28,8 @@
#include <cmath>
#include <iostream>
const int Widget::MAX_SCROLL = 1000000;
const float Widget::MAX_TEXT_SCALE = 1.2f;
const float Widget::MIN_TEXT_SCALE = 1.0f;
@ -73,8 +75,8 @@ Widget::Widget
m_width(WIDTH_), m_height(HEIGHT_),
m_rect_list(0),
m_round_corners(WGT_AREA_ALL),
/*m_scroll_pos_x(0),*/ m_scroll_pos_y(0),
/*m_scroll_speed_x(0),*/ m_scroll_speed_y(0),
m_scroll_pos_x(0), m_scroll_pos_y(0),
m_scroll_speed_x(0), m_scroll_speed_y(0.0f),
m_text_scale(1.0f)
{
}
@ -101,8 +103,7 @@ void Widget::update(const float DELTA)
if(m_text_scale < MIN_TEXT_SCALE) m_text_scale = MIN_TEXT_SCALE;
}
/*Handle on/off features*/
//Draw widget
/*Start handling of on/off features*/
if(m_enable_texture)
{
glEnable(GL_TEXTURE_2D);
@ -142,7 +143,8 @@ void Widget::update(const float DELTA)
//text when there are multiple lines. Hopefully this work around will
//be removed when we move away from plib; the scrolling and the other
//text handling should be cleaned. Also, for some reason, different
//positions are needed if the text is centered. Sorry for the mess.
//positions are needed if the text is centered, and on top of that,
//it's not 100% exact. Sorry for the mess.
size_t line_end = 0;
int lines = 0;
@ -152,66 +154,114 @@ void Widget::update(const float DELTA)
++lines;
} while( line_end != std::string::npos );
/* Handle preset scrolling positions */
// In the Y-axis, a scroll position of 0 leaves the text centered, and
// positive values lowers the text, and negatives (obviously) raise the
// text, in the X-axis, a position of 0 leaves the text aligned to the
// left; positive values move to the right and negative
// values to the left.
float left, right, bottom, top;
font_gui->getBBox(m_text.c_str(), m_text_size, false, &left, &right, &bottom, &top);
int text_width = (int)(right - left + 0.99);
const int Y_LIMIT = lines * m_text_size + m_height;
//A work around for yet another bug with multilines: we get the wrong
//width when using multilines.
if( text_width > m_width )
{
text_width = m_width;
}
//Y-axis preset positions
if( m_scroll_pos_y == WGT_SCROLL_START_TOP )
{
m_scroll_pos_y = Y_LIMIT / 2 - m_height;
}
else if( m_scroll_pos_y == WGT_SCROLL_START_BOTTOM )
{
m_scroll_pos_y = Y_LIMIT / 2;
}
else if( m_scroll_pos_y == WGT_SCROLL_CENTER )
{
m_scroll_pos_y = 0;
}
else if( m_scroll_pos_y == WGT_SCROLL_END_TOP )
{
m_scroll_pos_y = -Y_LIMIT / 2;
}
else if( m_scroll_pos_y == WGT_SCROLL_END_BOTTOM )
{
m_scroll_pos_y = -Y_LIMIT / 2 + m_height;
}
else if( m_scroll_pos_y > MAX_SCROLL )
{
std::cerr << "WARNING: text position too high to scroll!.\n";
}
else if( m_scroll_pos_y < -MAX_SCROLL )
{
std::cerr << "WARNING: text position too low to scroll!.\n";
}
//X-axis preset positions
if( m_scroll_pos_x == WGT_SCROLL_START_LEFT )
{
m_scroll_pos_x = 0;
}
else if( m_scroll_pos_x == WGT_SCROLL_START_RIGHT )
{
m_scroll_pos_x = m_width;
}
else if( m_scroll_pos_x == WGT_SCROLL_CENTER )
{
m_scroll_pos_x = (m_width - text_width) / 2;
}
else if( m_scroll_pos_x == WGT_SCROLL_END_LEFT )
{
m_scroll_pos_x = -text_width;
}
else if( m_scroll_pos_x == WGT_SCROLL_END_RIGHT )
{
m_scroll_pos_x = -text_width + m_width;
}
else if( m_scroll_pos_x > MAX_SCROLL )
{
std::cerr << "WARNING: text position is too much to the right to " <<
"scroll!.\n";
}
else if( m_scroll_pos_x < -MAX_SCROLL )
{
std::cerr << "WARNING: text position is too much to the left to " <<
"to scroll!.\n";
}
if(m_enable_scroll)
{
//TODO: constrain speed to sane values
/*m_scroll_pos_x += m_scroll_speed_x;*/
m_scroll_pos_x += m_scroll_speed_x;
m_scroll_pos_y += m_scroll_speed_y;
if( m_text_y_alignment == Font::ALIGN_CENTER )
//Y-axis wrapping
if(m_scroll_pos_y * 2 > Y_LIMIT)
{
const int LIMIT = lines * m_text_size + m_height;
if(m_scroll_pos_y * 2 > LIMIT)
{
m_scroll_pos_y = -LIMIT / 2;
}
else if(-m_scroll_pos_y * 2 > LIMIT)
{
m_scroll_pos_y = LIMIT / 2;
}
m_scroll_pos_y = WGT_SCROLL_END_TOP;
}
else if( m_text_y_alignment == Font::ALIGN_BOTTOM )
else if(-m_scroll_pos_y * 2 > Y_LIMIT)
{
const int TEXT_HEIGHT = lines * m_text_size;
if(m_scroll_pos_y > TEXT_HEIGHT / 2)
{
m_scroll_pos_y = -m_height - (TEXT_HEIGHT) / 2;
}
else if(m_scroll_pos_y < - m_height - TEXT_HEIGHT / 2)
{
m_scroll_pos_y = TEXT_HEIGHT / 2 + m_text_size;
}
m_scroll_pos_y = WGT_SCROLL_START_BOTTOM;
}
/*
float left, right;
font_gui->getBBox(m_text.c_str(), m_text_size, false, &left, &right, NULL, NULL);
const int TEXT_WIDTH = (int)(right - left) / m_text_size;
//X-axis wrapping
if(m_scroll_pos_x > m_width )
{
m_scroll_pos_x = WGT_SCROLL_END_LEFT;
}
else if(m_scroll_pos_x < -text_width )
{
m_scroll_pos_x = WGT_SCROLL_START_RIGHT;
}
if( m_text_x_alignment == Font::ALIGN_CENTER )
{
const int LIMIT = TEXT_WIDTH + m_width;
if(m_scroll_pos_x * 2 > LIMIT)
{
m_scroll_pos_x = -LIMIT / 2;
}
else if(-m_scroll_pos_x * 2 > LIMIT)
{
m_scroll_pos_x = LIMIT / 2;
}
}
else if( m_text_x_alignment == Font::ALIGN_LEFT )
{
if(m_scroll_pos_x > TEXT_WIDTH / 2)
{
m_scroll_pos_x = -m_width - (TEXT_WIDTH) / 2;
}
else if(m_scroll_pos_x < - m_width - TEXT_WIDTH / 2)
{
m_scroll_pos_x = TEXT_WIDTH / 2 + m_text_size;
}
}
*/
}
if(m_enable_text)
@ -222,14 +272,10 @@ void Widget::update(const float DELTA)
std::cerr << "(Did you set the text?)\n";
}
int x_pos = m_x;// + m_scroll_pos_x;
int y_pos = m_y - m_scroll_pos_y + ((lines - 1 )* m_text_size) / 2;
int x_pos = m_x + (int)m_scroll_pos_x;
int y_pos = m_y - (int)m_scroll_pos_y + ((lines - 1 )* m_text_size) / 2;
if( m_text_x_alignment == Font::ALIGN_CENTER ) x_pos += m_width / 2;
if( m_text_y_alignment == Font::ALIGN_CENTER )
{
y_pos += m_height / 2;
}
y_pos += m_height / 2;
size_t line_start = 0;
bool draw;
@ -262,7 +308,7 @@ void Widget::update(const float DELTA)
if( draw )
{
font_gui->Print(m_text.substr(line_start, line_end - line_start).c_str(), m_text_size,
m_text_x_alignment, x_pos, m_text_y_alignment, y_pos,
x_pos, y_pos,
255, 255, 255, m_text_scale, m_text_scale);
}
@ -425,7 +471,7 @@ void Widget::resize_to_text()
font_gui->getBBox(m_text.c_str(), m_text_size, false, &left, &right, &bottom, &top);
const int TEXT_WIDTH = (int)(right - left);
const int TEXT_HEIGHT = (int)(bottom - top);
const int TEXT_HEIGHT = (int)(top - bottom);
if( TEXT_WIDTH > m_width ) m_width = TEXT_WIDTH;
if( TEXT_HEIGHT > m_height ) m_height = TEXT_HEIGHT;

View File

@ -50,6 +50,24 @@ enum WidgetArea //One of the uses of this, is for rounded corners
WGT_AREA_ALL = (WGT_AREA_TOP | WGT_AREA_BOT)
};
//The lowest scroll values here must be bigger or lower than
//Widget::MAX_SCROLL
enum WidgetScrollPos
{
//For the X axis
WGT_SCROLL_START_LEFT = 2000001,
WGT_SCROLL_START_RIGHT = 2000002,
WGT_SCROLL_END_LEFT = -2000001,
WGT_SCROLL_END_RIGHT = -2000002,
//For the Y axis
WGT_SCROLL_START_TOP = 1000001,
WGT_SCROLL_START_BOTTOM = 1000002,
WGT_SCROLL_END_TOP = -1000001,
WGT_SCROLL_END_BOTTOM = -1000002,
//Works for both axis
WGT_SCROLL_CENTER = 3000000
};
//I suggest that you do not use the white or light colors for the rects in
//most cases, because they don't have lighter versions that can be used to
//highlight those rects and then revert them, for example, when you select a
@ -86,6 +104,9 @@ extern const GLfloat WGT_LIGHT_TRANS_BLUE [4];
class Widget
{
//The only class that can access the Widget class is WidgetManager;
//they are meant to always be used together, and the widgets should only
//be used through the WidgetManager class.
friend class WidgetManager;
/* Basic widget properties that will always be used. */
@ -107,15 +128,14 @@ class Widget
bool m_enable_text;
std::string m_text;
WidgetFontSize m_text_size;
Font::FontAlignType m_text_x_alignment;
Font::FontAlignType m_text_y_alignment;
static const int MAX_SCROLL;
bool m_enable_scroll;
/* int m_scroll_pos_x;*/
int m_scroll_pos_y;
/* int m_scroll_speed_x;*/
int m_scroll_speed_y;
float m_scroll_pos_x;
float m_scroll_pos_y;
float m_scroll_speed_x;
float m_scroll_speed_y;
/* Delta time dependant features, these deactivate after a certain time,
* and are dependant on the delta time. They have animations. */

View File

@ -80,13 +80,11 @@ bool WidgetManager::add_wgt
new_id.widget->m_enable_text = m_default_show_text;
new_id.widget->m_text.assign(m_default_text);
new_id.widget->m_text_size = m_default_text_size;
new_id.widget->m_text_x_alignment = m_default_text_x_alignment;
new_id.widget->m_text_y_alignment = m_default_text_y_alignment;
new_id.widget->m_enable_scroll = m_default_enable_scroll;
/* new_id.widget->m_scroll_pos_x = m_default_scroll_x_pos;*/
new_id.widget->m_scroll_pos_x = m_default_scroll_x_pos;
new_id.widget->m_scroll_pos_y = m_default_scroll_y_pos;
/* new_id.widget->m_scroll_speed_x = m_default_scroll_x_speed;*/
new_id.widget->m_scroll_speed_x = m_default_scroll_x_speed;
new_id.widget->m_scroll_speed_y = m_default_scroll_y_speed;
m_elems.push_back(WidgetElement(ET_WGT, m_widgets.size()));
@ -730,32 +728,28 @@ void WidgetManager::set_initial_text_state
(
const bool SHOW,
const std::string TEXT,
const WidgetFontSize SIZE,
const Font::FontAlignType X_ALIGN,
const Font::FontAlignType Y_ALIGN
const WidgetFontSize SIZE
)
{
m_default_show_text = SHOW;
m_default_text = TEXT;
m_default_text_size = SIZE;
m_default_text_x_alignment = X_ALIGN;
m_default_text_y_alignment = Y_ALIGN;
}
//-----------------------------------------------------------------------------
void WidgetManager::set_initial_scroll_state
(
const bool ENABLE,
/* const int X_POS,*/
const int X_POS,
const int Y_POS,
/* const int X_SPEED,*/
const int X_SPEED,
const int Y_SPEED
)
{
m_default_enable_scroll = ENABLE;
/* m_default_scroll_x_pos = X_POS;*/
m_default_scroll_x_pos = X_POS;
m_default_scroll_y_pos = Y_POS;
/* m_default_scroll_x_speed = X_SPEED;*/
m_default_scroll_x_speed = X_SPEED;
m_default_scroll_y_speed = Y_SPEED;
}
@ -771,12 +765,10 @@ void WidgetManager::restore_default_states()
m_default_show_text = false;
m_default_text = "";
m_default_text_size = WGT_FNT_MED;
m_default_text_x_alignment = Font::ALIGN_CENTER;
m_default_text_y_alignment = Font::ALIGN_CENTER;
m_default_enable_scroll = false;
/* m_default_scroll_x_pos = 0;*/
m_default_scroll_y_pos = 0;
/* m_default_scroll_x_speed = 0;*/
m_default_scroll_x_pos = WGT_SCROLL_CENTER;
m_default_scroll_y_pos = WGT_SCROLL_CENTER;
m_default_scroll_x_speed = 0;
m_default_scroll_y_speed = 0;
}
@ -972,6 +964,7 @@ void WidgetManager::hide_wgt_text( const int TOKEN )
}*/
//-----------------------------------------------------------------------------
/*
void WidgetManager::set_wgt_text_x_alignment( const int TOKEN, const Font::FontAlignType ALIGN )
{
const int ID = find_id(TOKEN);
@ -982,9 +975,9 @@ void WidgetManager::set_wgt_text_x_alignment( const int TOKEN, const Font::FontA
"an unnamed widget with token " << TOKEN << '\n';
}
}
*/
//-----------------------------------------------------------------------------
void WidgetManager::set_wgt_text_y_alignment( const int TOKEN, const Font::FontAlignType ALIGN )
/*void WidgetManager::set_wgt_text_y_alignment( const int TOKEN, const Font::FontAlignType ALIGN )
{
const int ID = find_id(TOKEN);
if( ID != WGT_NONE ) m_widgets[ID].widget->m_text_y_alignment = ALIGN;
@ -993,7 +986,7 @@ void WidgetManager::set_wgt_text_y_alignment( const int TOKEN, const Font::FontA
std::cerr << "WARNING: tried to set the Y alignment of text of " <<
"an unnamed widget with token " << TOKEN << '\n';
}
}
}*/
//-----------------------------------------------------------------------------
void WidgetManager::enable_wgt_scroll( const int TOKEN )
@ -1020,16 +1013,46 @@ void WidgetManager::disable_wgt_scroll( const int TOKEN )
}
//-----------------------------------------------------------------------------
/*void WidgetManager::set_wgt_x_scroll_pos( const int TOKEN, const int POS )
void WidgetManager::set_wgt_x_scroll_pos
(
const int TOKEN,
const WidgetScrollPos POS
)
{
if( POS == WGT_SCROLL_START_TOP || POS == WGT_SCROLL_START_BOTTOM ||
POS == WGT_SCROLL_END_TOP || POS == WGT_SCROLL_END_BOTTOM )
{
std::cerr << "WARNING: tried to set the X scroll position to a " <<
"position for the Y axis, on widget with token " << TOKEN <<
'\n';
return;
}
const int ID = find_id(TOKEN);
if( ID != WGT_NONE ) m_widgets[ID].widget->m_scroll_pos_x = POS;
else std::cerr << "Tried to set the X scroll position of an unnamed widget with token " << TOKEN << '\n';
}*/
else
{
std::cerr << "WARNING: tried to set the X scroll position of an " <<
"unnamed widget with token " << TOKEN << '\n';
}
}
//-----------------------------------------------------------------------------
void WidgetManager::set_wgt_y_scroll_pos( const int TOKEN, const int POS )
void WidgetManager::set_wgt_y_scroll_pos
(
const int TOKEN,
const WidgetScrollPos POS
)
{
if( POS == WGT_SCROLL_START_LEFT || POS == WGT_SCROLL_START_RIGHT ||
POS == WGT_SCROLL_END_LEFT || POS == WGT_SCROLL_END_RIGHT )
{
std::cerr << "WARNING: tried to set the Y scroll position to a " <<
"position for the X axis, on widget with token " << TOKEN <<
'\n';
return;
}
const int ID = find_id(TOKEN);
if( ID != WGT_NONE ) m_widgets[ID].widget->m_scroll_pos_y = POS;
else
@ -1040,15 +1063,19 @@ void WidgetManager::set_wgt_y_scroll_pos( const int TOKEN, const int POS )
}
//-----------------------------------------------------------------------------
/*void WidgetManager::set_wgt_x_scroll_speed( const int TOKEN, const int SPEED )
void WidgetManager::set_wgt_x_scroll_speed( const int TOKEN, const float SPEED )
{
const int ID = find_id(TOKEN);
if( ID != WGT_NONE ) m_widgets[ID].widget->m_scroll_speed_x = SPEED;
else std::cerr << "Tried to set the X scroll speed of an unnamed widget with token " << TOKEN << '\n';
}*/
else
{
std::cerr << "WARNING: tried to set the X scroll speed of an " <<
"unnamed widget with token " << TOKEN << '\n';
}
}
//-----------------------------------------------------------------------------
void WidgetManager::set_wgt_y_scroll_speed( const int TOKEN, const int SPEED )
void WidgetManager::set_wgt_y_scroll_speed( const int TOKEN, const float SPEED )
{
const int ID = find_id(TOKEN);
if( ID != WGT_NONE ) m_widgets[ID].widget->m_scroll_speed_y = SPEED;

View File

@ -97,13 +97,11 @@ class WidgetManager
bool m_default_show_text;
std::string m_default_text;
WidgetFontSize m_default_text_size;
Font::FontAlignType m_default_text_x_alignment;
Font::FontAlignType m_default_text_y_alignment;
bool m_default_enable_scroll;
/* int m_default_scroll_x_pos;*/
int m_default_scroll_x_pos;
int m_default_scroll_y_pos;
/* int m_default_scroll_x_speed;*/
int m_default_scroll_x_speed;
int m_default_scroll_y_speed;
bool is_column_break( const int BREAK_POST ) const;
@ -169,11 +167,16 @@ public:
(
const bool SHOW,
const std::string TEXT,
const WidgetFontSize SIZE,
const Font::FontAlignType X_ALIGN,
const Font::FontAlignType Y_ALIGN
const WidgetFontSize SIZE
);
void set_initial_scroll_state
(
const bool ENABLE,
const int X_POS,
const int Y_POS,
const int X_SPEED,
const int Y_SPEED
);
void set_initial_scroll_state(const bool ENABLE, /*const int X_POS,*/ const int Y_POS, /*const int X_SPEED, */const int Y_SPEED );
void restore_default_states();
void activate_wgt(const int TOKEN);
@ -197,15 +200,17 @@ public:
void show_wgt_text( const int TOKEN );
void hide_wgt_text( const int TOKEN );
// void toggle_wgt_text( const int TOKEN );
void set_wgt_text_x_alignment( const int TOKEN, const Font::FontAlignType ALIGN );
void set_wgt_text_y_alignment( const int TOKEN, const Font::FontAlignType ALIGN );
//FIXME: change to enable_wgt_scrolling, since it enables or disables
//FIXME: maybe all that enabling the scrolling should do, is to allow
//players to lower/raise it?
//only the scrolling movement, not setting the scrolling position.
void enable_wgt_scroll( const int TOKEN );
void disable_wgt_scroll( const int TOKEN );
/* void set_wgt_x_scroll_pos( const int TOKEN, const int POS );*/
void set_wgt_y_scroll_pos( const int TOKEN, const int POS );
/* void set_wgt_x_scroll_speed( const int TOKEN, const int SPEED );*/
void set_wgt_y_scroll_speed( const int TOKEN, const int SPEED );
void set_wgt_x_scroll_pos( const int TOKEN, const WidgetScrollPos POS );
void set_wgt_y_scroll_pos( const int TOKEN, const WidgetScrollPos POS );
void set_wgt_x_scroll_speed( const int TOKEN, const float SPEED );
void set_wgt_y_scroll_speed( const int TOKEN, const float SPEED );
/* Activated widget features. */
void pulse_wgt( const int TOKEN ) const;