diff options
author | Yohann Ferreira <bertram@cegetel.net> | 2005-02-22 15:14:29 +0000 |
---|---|---|
committer | Yohann Ferreira <bertram@cegetel.net> | 2005-02-22 15:14:29 +0000 |
commit | a6e60bef83d9b845ffba6de9fe71ca1afd277166 (patch) | |
tree | fa9ea8339ab44bf0f51c681ef138e65805936d6b | |
parent | 032a97e40be8369526811f67a9e7fa5561365461 (diff) | |
download | mana-client-a6e60bef83d9b845ffba6de9fe71ca1afd277166.tar.gz mana-client-a6e60bef83d9b845ffba6de9fe71ca1afd277166.tar.bz2 mana-client-a6e60bef83d9b845ffba6de9fe71ca1afd277166.tar.xz mana-client-a6e60bef83d9b845ffba6de9fe71ca1afd277166.zip |
Rewrote Progress Bars. They'll be fully working soon.
-rw-r--r-- | src/gui/progressbar.cpp | 233 | ||||
-rw-r--r-- | src/gui/progressbar.h | 34 | ||||
-rw-r--r-- | src/gui/status.cpp | 10 |
3 files changed, 93 insertions, 184 deletions
diff --git a/src/gui/progressbar.cpp b/src/gui/progressbar.cpp index cc12c247..7a520332 100644 --- a/src/gui/progressbar.cpp +++ b/src/gui/progressbar.cpp @@ -23,21 +23,58 @@ #include "progressbar.h" #include "gui.h" +#include "../resources/resourcemanager.h" -// To draw primitives without dependencies -void DrawPixel(SDL_Surface * screen, int x, int y, Uint8 R, Uint8 G, Uint8 B); -void DrawLine(SDL_Surface * screen, int x1, int y1, int x2, int y2, unsigned char Red, unsigned char Green, unsigned char Blue); - - -ProgressBar::ProgressBar(float progress, int x, int y, int width, unsigned char red, unsigned green, unsigned char blue) +ProgressBar::ProgressBar(float progress, int x, int y, int width, int height, unsigned char red, unsigned green, unsigned char blue) : +gcn::Widget() { setProgress(progress); Red = red; Green = green; Blue = blue; - X = x; - Y = y; - Width = width; + setX(x); + setY(y); + setWidth(width); + setHeight(height); + + // Load dialog title bar image + ResourceManager *resman = ResourceManager::getInstance(); + Image *dBorders = resman->getImage("core/graphics/gui/vscroll_grey.png"); + dBackground = resman->getImage("core/graphics/gui/bg_quad_dis.png"); + + dTopBorder = dBorders->getSubImage(4, 0, 3, 4); + dLeftBorder = dBorders->getSubImage(0, 4, 4, 10); + dRightBorder = dBorders->getSubImage(7, 4, 4, 10); + dBottomBorder = dBorders->getSubImage(4, 15, 3, 4); + + dTopLeftBorder = dBorders->getSubImage(0, 0, 4, 4); + dTopRightBorder = dBorders->getSubImage(7, 0, 4, 4); + dBottomRightBorder = dBorders->getSubImage(7, 15, 4, 4); + dBottomLeftBorder = dBorders->getSubImage(0, 15, 4, 4); + + dBackground->setAlpha(1.0f); + + dTopBorder->setAlpha(1.0f); + dBottomBorder->setAlpha(1.0f); + dLeftBorder->setAlpha(1.0f); + dRightBorder->setAlpha(1.0f); + + dTopLeftBorder->setAlpha(1.0f); + dTopRightBorder->setAlpha(1.0f); + dBottomLeftBorder->setAlpha(1.0f); + dBottomRightBorder->setAlpha(1.0f); + + // The color bar + ColorBar = SDL_CreateRGBSurface(SDL_SWSURFACE, width-8, height-8, 32, + red, green, blue, 160); + +} + +ProgressBar::~ProgressBar() +{ + #ifndef USE_OPENGL + SDL_FreeSurface(ColorBar); + #endif } void ProgressBar::draw(gcn::Graphics *graphics) @@ -45,38 +82,38 @@ void ProgressBar::draw(gcn::Graphics *graphics) #ifndef USE_OPENGL int absx, absy; getAbsolutePosition(absx, absy); - - // We're modifying pixels so we have to lock the screen. - SDL_LockSurface(screen); - - // outer bar - DrawLine(screen, absx+X+PROGRESSBAR_HEIGHT, absy+Y, absx+X+Width, absy+Y, abs(Red-70), abs(Green-70), abs(Blue-70)); - DrawLine(screen, absx+X, absy+Y+PROGRESSBAR_HEIGHT, absx+X+Width-PROGRESSBAR_HEIGHT, absy+Y+PROGRESSBAR_HEIGHT, abs(Red-70), abs(Green-70), abs(Blue-70)); - DrawLine(screen, absx+X+PROGRESSBAR_HEIGHT, absy+Y, absx+X, absy+Y+PROGRESSBAR_HEIGHT, abs(Red-70), abs(Green-70), abs(Blue-70)); - DrawLine(screen, absx+X+Width, absy+Y, absx+X+Width-PROGRESSBAR_HEIGHT, absy+Y+PROGRESSBAR_HEIGHT, abs(Red-70), abs(Green-70), abs(Blue-70)); - - // Shadow of outer bar - DrawLine(screen, absx+X+1, absy+Y+PROGRESSBAR_HEIGHT+1, absx+X+Width-PROGRESSBAR_HEIGHT, absy+Y+PROGRESSBAR_HEIGHT+1, 20, 20, 20); - DrawLine(screen, absx+X+Width+1, absy+Y, absx+X+Width-PROGRESSBAR_HEIGHT+1, absy+Y+PROGRESSBAR_HEIGHT, 20, 20, 20); - - // Inner bar - int Temp = 0; + // We're drawing the bar itself first + // Background + dBackground->drawPattern(screen, absx+4, absy+4, getWidth()-8, getHeight()-8); + // The corners + dTopLeftBorder->draw(screen, absx, absy); + dTopRightBorder->draw(screen, absx+getWidth()-4, absy); + dBottomLeftBorder->draw(screen, absx, absy+getHeight()-4); + dBottomRightBorder->draw(screen, absx+getWidth()-4, absy+getHeight()-4); - for(int i = 1; i < PROGRESSBAR_HEIGHT; i++) + // The borders + dTopBorder->drawPattern(screen, absx+4, absy, getWidth()-8, 4); + dBottomBorder->drawPattern(screen, absx+4, absy+getHeight()-4, getWidth()-8, 4); + dLeftBorder->drawPattern(screen, absx, absy+4, 4, getHeight()-8); + dRightBorder->drawPattern(screen, absx+getWidth()-4, absy+4, 4, getHeight()-8); + + // And then, we color the bar to show the progress + SDL_Rect srcRect, destRect; + destRect.x = absx+4; + destRect.y = absy+4; + srcRect.x = 0; + srcRect.y = 0; + srcRect.w = getWidth(); + srcRect.h = getHeight(); + + if ( ColorBar ) { - Temp = absx+X+int(float(Width)*progress)-i-1; - if (Temp < (absx + X + PROGRESSBAR_HEIGHT + 1 - i)) Temp = (absx + X + PROGRESSBAR_HEIGHT + 1 - i); - DrawLine(screen, absx + X + PROGRESSBAR_HEIGHT + 1 - i, absy+Y+i, Temp, absy+Y+i, Red, Green, Blue); + if ( ColorBar->w < (srcRect.w)) srcRect.w=ColorBar->w; + if ( ColorBar->h < (srcRect.h)) srcRect.h=ColorBar->h; + SDL_BlitSurface(ColorBar, &srcRect, screen, &destRect); } - // Shadow of inner bar - Temp = absx+X+int(float(Width)*progress)-2; - if ( Temp < (absx+X+PROGRESSBAR_HEIGHT+1) ) Temp = absx+X+PROGRESSBAR_HEIGHT; - DrawLine(screen, absx+X+PROGRESSBAR_HEIGHT+1, absy+Y+1, Temp, absy+Y+1, abs(Red-40), abs(Green-40), abs(Blue-40)); - DrawLine(screen, absx+X+PROGRESSBAR_HEIGHT, absy+Y+1, absx+X+2, absy+Y+PROGRESSBAR_HEIGHT-1, abs(Red-40), abs(Green-40), abs(Blue-40)); - - SDL_UnlockSurface(screen); #endif } @@ -89,127 +126,3 @@ float ProgressBar::getProgress() { return progress; } - - // This function draws a pixel on the screen depending on the resolution etc... - void DrawPixel(SDL_Surface * screen, int x, int y, Uint8 R, Uint8 G, Uint8 B) -{ - Uint32 color = SDL_MapRGB(screen->format, R, G, B); - if ( (x >= screen->w) || (x < 0) ) - return; - if ( (y >= screen->h) || (y < 0) ) - return; - - switch (screen->format->BytesPerPixel) - { - case 1: // Pour 8 BPP - { - Uint8 *bufp; - bufp = (Uint8 *) screen->pixels + y * screen ->pitch + x; - *bufp = color; - } - break; - - case 2: // 15 ou 16 BPP - { - Uint16 * bufp; - bufp = (Uint16 *)screen->pixels + y * screen->pitch/2 + x; - *bufp = color; - } - break; - - case 3: // 24 BPP - { - Uint8 *bufp; - bufp = (Uint8 *)screen->pixels + y * screen->pitch + x * 3; - - if (SDL_BYTEORDER == SDL_LIL_ENDIAN) - { - bufp[0] = color; - bufp[1] = color >> 8; - bufp[2] = color >> 16; - } else { - bufp[2] = color; - bufp[1] = color >> 8; - bufp[0] = color >> 16; - } - } - break; - - case 4: // 32 BPP, the most useful ! - { - Uint32 *bufp; - bufp = (Uint32 *)screen->pixels + y * screen->pitch/4 + x; - *bufp = color; - } - break; - } -} // End of DrawPixel - -// Draw A line. -void DrawLine(SDL_Surface * screen, int x1, int y1, int x2, int y2, unsigned char Red, unsigned char Green, unsigned char Blue) -{ - float a, b, Temp_x1, Temp_x2, Temp_y1, Temp_y2; - - Temp_x1 = x1; - Temp_x2 = x2; - Temp_y1 = y1; - Temp_y2 = y2; - - if ( (x1-x2) != 0) - { - a=(Temp_y1-Temp_y2)/(Temp_x1-Temp_x2); // the a in y=ax+b - } - else // The line is vertical - { - if ( y1 < y2) - { - for (int Y=y1; Y<=y2; Y++) - { - DrawPixel(screen, x1, Y, Red, Green, Blue); - } - } - else - { - for (int Y=y2; Y<=y1; Y++) - { - DrawPixel(screen, x1, Y, Red, Green, Blue); - } - } - - return; - } - - b=y1-a*x1; - - if ( x1 < x2) - { - for (int X = x1; X <= x2; X++) - { - DrawPixel(screen, X, int(a*X+b), Red, Green, Blue); - } - } - else - { - for (int X = x2; X <= x1; X++) - { - DrawPixel(screen, X, int(a*X+b), Red, Green, Blue); - } - } - - if ( y1 < y2) - { - for (int Y = y1; Y <= y2; Y++) - { - if (a != 0) DrawPixel(screen, int((Y-b)/a), Y, Red, Green, Blue); - } - } - else - { - for (int Y = y2; Y <= y1; Y++) - { - if (a != 0) DrawPixel(screen, int((Y-b)/a), Y, Red, Green, Blue); - } - } - -} // End of DrawLine - diff --git a/src/gui/progressbar.h b/src/gui/progressbar.h index 88bd08cc..22161995 100644 --- a/src/gui/progressbar.h +++ b/src/gui/progressbar.h @@ -25,7 +25,8 @@ #define __PROGRESSBAR_H__ #include <guichan.hpp> -#define PROGRESSBAR_HEIGHT 7 +#include "../resources/image.h" + /** * A progress bar. * @@ -37,10 +38,15 @@ class ProgressBar : public gcn::Widget { * Constructor, initializes the progress with the given value. */ ProgressBar(float progress = 0.0f, int x = 0, int y = 0, - int width = 40, unsigned char red = 150, unsigned green = 150, + int width = 40, int height = 7, unsigned char red = 150, unsigned green = 150, unsigned char blue = 150); /** + * Destructor + */ + ~ProgressBar(); + + /** * Draws the progress bar. */ void draw(gcn::Graphics *graphics); @@ -66,26 +72,16 @@ class ProgressBar : public gcn::Widget { Red = MyRed; Green = MyGreen; Blue = MyBlue; }; - int getHeight() { - return PROGRESSBAR_HEIGHT; - }; - - int getWidth() { - return Width; - }; - - int getX() { - return X; - }; - - int getY() { - return Y; - }; - private: float progress; unsigned char Red, Green, Blue; - int X, Y, Width; + // Bar Images + Image *dBackground; + Image *dTopLeftBorder, *dTopRightBorder, *dBottomLeftBorder, *dBottomRightBorder; + Image *dLeftBorder, *dRightBorder, *dTopBorder, *dBottomBorder; + #ifndef USE_OPENGL + SDL_Surface *ColorBar; + #endif }; #endif diff --git a/src/gui/status.cpp b/src/gui/status.cpp index ac587a01..b31ef4e8 100644 --- a/src/gui/status.cpp +++ b/src/gui/status.cpp @@ -57,17 +57,17 @@ StatusWindow::StatusWindow(): hp->setPosition(WIN_BORDER, WIN_BORDER); sp->setPosition(WIN_BORDER, hp->getY() + hp->getHeight() + CONTROLS_SEPARATOR); - healthBar = new ProgressBar(1.0f, WIN_BORDER + hp->getWidth() + CONTROLS_SEPARATOR, WIN_BORDER + 3, 80, 0, 255, 0); + healthBar = new ProgressBar(1.0f, WIN_BORDER + hp->getWidth() + CONTROLS_SEPARATOR, WIN_BORDER, 80, 15, 0, 255, 0); hpValue->setPosition(healthBar->getX() + healthBar->getWidth() + 2*CONTROLS_SEPARATOR, WIN_BORDER); manaBar = new ProgressBar(1.0f, WIN_BORDER + sp->getWidth() + CONTROLS_SEPARATOR, - hp->getY() + hp->getHeight() + CONTROLS_SEPARATOR + 3, 80, 0, 0, 255); + hp->getY() + hp->getHeight() + CONTROLS_SEPARATOR, 80, 15, 0, 0, 255); spValue->setPosition(manaBar->getX() + manaBar->getWidth() + 2*CONTROLS_SEPARATOR, hp->getY() + hp->getHeight() + CONTROLS_SEPARATOR); gp->setPosition(170, WIN_BORDER); expLabel->setPosition(WIN_BORDER, sp->getY() + sp->getHeight() + CONTROLS_SEPARATOR); jobExpLabel->setPosition(spValue->getX(), sp->getY() + sp->getHeight() + CONTROLS_SEPARATOR); - xpBar = new ProgressBar(1.0f, WIN_BORDER, expLabel->getY() + expLabel->getHeight() + CONTROLS_SEPARATOR, 70, 12, 194, 255); - jobXpBar = new ProgressBar(1.0f, spValue->getX(), jobExpLabel->getY() + jobExpLabel->getHeight() + CONTROLS_SEPARATOR, 70, 200, 0, 0); + xpBar = new ProgressBar(1.0f, WIN_BORDER, expLabel->getY() + expLabel->getHeight() + CONTROLS_SEPARATOR, 70, 15, 12, 194, 255); + jobXpBar = new ProgressBar(1.0f, spValue->getX(), jobExpLabel->getY() + jobExpLabel->getHeight() + CONTROLS_SEPARATOR, 70, 15, 200, 0, 0); statsButton->setPosition(WIN_BORDER, xpBar->getY() + xpBar->getHeight() + 2*CONTROLS_SEPARATOR); skillsButton->setPosition(statsButton->getX() + statsButton->getWidth() + CONTROLS_SEPARATOR, statsButton->getY()); @@ -139,7 +139,7 @@ void StatusWindow::update() (int)char_info->job_xp, (int)char_info->jobXpForNextLevel); jobExpLabel->setCaption(tempstr); jobExpLabel->adjustSize(); - + if (char_info->hp < int(char_info->max_hp / 3)) { healthBar->setColor(255, 0, 0); // Red |