Changeset - r9255:ef280ada2e0d
[Not reviewed]
master
0 1 0
rubidium - 16 years ago 2008-05-16 17:45:43
rubidium@openttd.org
(svn r13121) -Codechange: make a class of the PerformanceRatingDetailWindow.
1 file changed with 159 insertions and 163 deletions:
0 comments (0 inline, 0 general)
src/graph_gui.cpp
Show inline comments
 
@@ -935,196 +935,192 @@ void ShowCompanyLeagueTable()
 
/* PERFORMANCE RATING DETAIL */
 
/*****************************/
 

	
 
static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e)
 
{
 
	static PlayerID _performance_rating_detail_player = INVALID_PLAYER;
 
struct PerformanceRatingDetailWindow : Window {
 
	static PlayerID player;
 
	int timeout;
 

	
 
	PerformanceRatingDetailWindow(const WindowDesc *desc, WindowNumber window_number) : Window(desc, window_number)
 
	{
 
		/* Disable the players who are not active */
 
		for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
 
			this->SetWidgetDisabledState(i + 13, !GetPlayer(i)->is_active);
 
		}
 

	
 
		this->UpdatePlayerStats();
 

	
 
	switch (e->event) {
 
		case WE_PAINT: {
 
			byte x;
 
			uint16 y = 14;
 
			int total_score = 0;
 
			int color_done, color_notdone;
 
		if (player != INVALID_PLAYER) this->LowerWidget(player + 13);
 
		this->SetDirty();
 
	}
 

	
 
			/* Draw standard stuff */
 
			DrawWindowWidgets(w);
 
	void UpdatePlayerStats()
 
	{
 
		/* Update all player stats with the current data
 
		 * (this is because _score_info is not saved to a savegame) */
 
		Player *p;
 
		FOR_ALL_PLAYERS(p) {
 
			if (p->is_active) UpdateCompanyRatingAndValue(p, false);
 
		}
 

	
 
		this->timeout = DAY_TICKS * 5;
 

	
 
	}
 

	
 
			/* Check if the currently selected player is still active. */
 
			if (_performance_rating_detail_player == INVALID_PLAYER || !GetPlayer(_performance_rating_detail_player)->is_active) {
 
				if (_performance_rating_detail_player != INVALID_PLAYER) {
 
					/* Raise and disable the widget for the previous selection. */
 
					w->RaiseWidget(_performance_rating_detail_player + 13);
 
					w->DisableWidget(_performance_rating_detail_player + 13);
 
					w->SetDirty();
 
	virtual void OnPaint()
 
	{
 
		byte x;
 
		uint16 y = 14;
 
		int total_score = 0;
 
		int color_done, color_notdone;
 

	
 
		/* Draw standard stuff */
 
		DrawWindowWidgets(this);
 

	
 
					_performance_rating_detail_player = INVALID_PLAYER;
 
				}
 
		/* Check if the currently selected player is still active. */
 
		if (player == INVALID_PLAYER || !GetPlayer(player)->is_active) {
 
			if (player != INVALID_PLAYER) {
 
				/* Raise and disable the widget for the previous selection. */
 
				this->RaiseWidget(player + 13);
 
				this->DisableWidget(player + 13);
 
				this->SetDirty();
 

	
 
				for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
 
					if (GetPlayer(i)->is_active) {
 
						/* Lower the widget corresponding to this player. */
 
						w->LowerWidget(i + 13);
 
						w->SetDirty();
 
				player = INVALID_PLAYER;
 
			}
 

	
 
						_performance_rating_detail_player = i;
 
						break;
 
					}
 
			for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
 
				if (GetPlayer(i)->is_active) {
 
					/* Lower the widget corresponding to this player. */
 
					this->LowerWidget(i + 13);
 
					this->SetDirty();
 

	
 
					player = i;
 
					break;
 
				}
 
			}
 
		}
 

	
 
			/* If there are no active players, don't display anything else. */
 
			if (_performance_rating_detail_player == INVALID_PLAYER) break;
 
		/* If there are no active players, don't display anything else. */
 
		if (player == INVALID_PLAYER) return;
 

	
 
			/* Paint the player icons */
 
			for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
 
				if (!GetPlayer(i)->is_active) {
 
					/* Check if we have the player as an active player */
 
					if (!w->IsWidgetDisabled(i + 13)) {
 
						/* Bah, player gone :( */
 
						w->DisableWidget(i + 13);
 
		/* Paint the player icons */
 
		for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
 
			if (!GetPlayer(i)->is_active) {
 
				/* Check if we have the player as an active player */
 
				if (!this->IsWidgetDisabled(i + 13)) {
 
					/* Bah, player gone :( */
 
					this->DisableWidget(i + 13);
 

	
 
						/* We need a repaint */
 
						w->SetDirty();
 
					}
 
					continue;
 
					/* We need a repaint */
 
					this->SetDirty();
 
				}
 
				continue;
 
			}
 

	
 
				/* Check if we have the player marked as inactive */
 
				if (w->IsWidgetDisabled(i + 13)) {
 
					/* New player! Yippie :p */
 
					w->EnableWidget(i + 13);
 
					/* We need a repaint */
 
					w->SetDirty();
 
				}
 

	
 
				x = (i == _performance_rating_detail_player) ? 1 : 0;
 
				DrawPlayerIcon(i, i * 37 + 13 + x, 16 + x);
 
			/* Check if we have the player marked as inactive */
 
			if (this->IsWidgetDisabled(i + 13)) {
 
				/* New player! Yippie :p */
 
				this->EnableWidget(i + 13);
 
				/* We need a repaint */
 
				this->SetDirty();
 
			}
 

	
 
			/* The colors used to show how the progress is going */
 
			color_done = _colour_gradient[COLOUR_GREEN][4];
 
			color_notdone = _colour_gradient[COLOUR_RED][4];
 

	
 
			/* Draw all the score parts */
 
			for (ScoreID i = SCORE_BEGIN; i < SCORE_END; i++) {
 
				int val    = _score_part[_performance_rating_detail_player][i];
 
				int needed = _score_info[i].needed;
 
				int score  = _score_info[i].score;
 
			x = (i == player) ? 1 : 0;
 
			DrawPlayerIcon(i, i * 37 + 13 + x, 16 + x);
 
		}
 

	
 
				y += 20;
 
				/* SCORE_TOTAL has his own rulez ;) */
 
				if (i == SCORE_TOTAL) {
 
					needed = total_score;
 
					score = SCORE_MAX;
 
				} else {
 
					total_score += score;
 
				}
 

	
 
				DrawString(7, y, STR_PERFORMANCE_DETAIL_VEHICLES + i, TC_FROMSTRING);
 

	
 
				/* Draw the score */
 
				SetDParam(0, score);
 
				DrawStringRightAligned(107, y, SET_PERFORMANCE_DETAIL_INT, TC_FROMSTRING);
 

	
 
				/* Calculate the %-bar */
 
				x = Clamp(val, 0, needed) * 50 / needed;
 

	
 
				/* SCORE_LOAN is inversed */
 
				if (val < 0 && i == SCORE_LOAN) x = 0;
 
		/* The colors used to show how the progress is going */
 
		color_done = _colour_gradient[COLOUR_GREEN][4];
 
		color_notdone = _colour_gradient[COLOUR_RED][4];
 

	
 
				/* Draw the bar */
 
				if (x !=  0) GfxFillRect(112,     y - 2, 112 + x,  y + 10, color_done);
 
				if (x != 50) GfxFillRect(112 + x, y - 2, 112 + 50, y + 10, color_notdone);
 

	
 
				/* Calculate the % */
 
				x = Clamp(val, 0, needed) * 100 / needed;
 

	
 
				/* SCORE_LOAN is inversed */
 
				if (val < 0 && i == SCORE_LOAN) x = 0;
 

	
 
				/* Draw it */
 
				SetDParam(0, x);
 
				DrawStringCentered(137, y, STR_PERFORMANCE_DETAIL_PERCENT, TC_FROMSTRING);
 
		/* Draw all the score parts */
 
		for (ScoreID i = SCORE_BEGIN; i < SCORE_END; i++) {
 
			int val    = _score_part[player][i];
 
			int needed = _score_info[i].needed;
 
			int score  = _score_info[i].score;
 

	
 
				/* SCORE_LOAN is inversed */
 
				if (i == SCORE_LOAN) val = needed - val;
 

	
 
				/* Draw the amount we have against what is needed
 
				 * For some of them it is in currency format */
 
				SetDParam(0, val);
 
				SetDParam(1, needed);
 
				switch (i) {
 
					case SCORE_MIN_PROFIT:
 
					case SCORE_MIN_INCOME:
 
					case SCORE_MAX_INCOME:
 
					case SCORE_MONEY:
 
					case SCORE_LOAN:
 
						DrawString(167, y, STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY, TC_FROMSTRING);
 
						break;
 
					default:
 
						DrawString(167, y, STR_PERFORMANCE_DETAIL_AMOUNT_INT, TC_FROMSTRING);
 
				}
 
			y += 20;
 
			/* SCORE_TOTAL has his own rulez ;) */
 
			if (i == SCORE_TOTAL) {
 
				needed = total_score;
 
				score = SCORE_MAX;
 
			} else {
 
				total_score += score;
 
			}
 

	
 
			break;
 
		}
 
			DrawString(7, y, STR_PERFORMANCE_DETAIL_VEHICLES + i, TC_FROMSTRING);
 

	
 
			/* Draw the score */
 
			SetDParam(0, score);
 
			DrawStringRightAligned(107, y, SET_PERFORMANCE_DETAIL_INT, TC_FROMSTRING);
 

	
 
			/* Calculate the %-bar */
 
			x = Clamp(val, 0, needed) * 50 / needed;
 

	
 
			/* SCORE_LOAN is inversed */
 
			if (val < 0 && i == SCORE_LOAN) x = 0;
 

	
 
		case WE_CLICK:
 
			/* Check which button is clicked */
 
			if (IsInsideMM(e->we.click.widget, 13, 21)) {
 
				/* Is it no on disable? */
 
				if (!w->IsWidgetDisabled(e->we.click.widget)) {
 
					w->RaiseWidget(_performance_rating_detail_player + 13);
 
					_performance_rating_detail_player = (PlayerID)(e->we.click.widget - 13);
 
					w->LowerWidget(_performance_rating_detail_player + 13);
 
					w->SetDirty();
 
				}
 
			}
 
			break;
 
			/* Draw the bar */
 
			if (x !=  0) GfxFillRect(112,     y - 2, 112 + x,  y + 10, color_done);
 
			if (x != 50) GfxFillRect(112 + x, y - 2, 112 + 50, y + 10, color_notdone);
 

	
 
			/* Calculate the % */
 
			x = Clamp(val, 0, needed) * 100 / needed;
 

	
 
		case WE_CREATE: {
 
			Player *p2;
 
			/* SCORE_LOAN is inversed */
 
			if (val < 0 && i == SCORE_LOAN) x = 0;
 

	
 
			/* Disable the players who are not active */
 
			for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
 
				w->SetWidgetDisabledState(i + 13, !GetPlayer(i)->is_active);
 
			}
 
			/* Update all player stats with the current data
 
			 * (this is because _score_info is not saved to a savegame) */
 
			FOR_ALL_PLAYERS(p2) {
 
				if (p2->is_active) UpdateCompanyRatingAndValue(p2, false);
 
			}
 
			/* Draw it */
 
			SetDParam(0, x);
 
			DrawStringCentered(137, y, STR_PERFORMANCE_DETAIL_PERCENT, TC_FROMSTRING);
 

	
 
			/* SCORE_LOAN is inversed */
 
			if (i == SCORE_LOAN) val = needed - val;
 

	
 
			w->custom[0] = DAY_TICKS;
 
			w->custom[1] = 5;
 

	
 
			if (_performance_rating_detail_player != INVALID_PLAYER) w->LowerWidget(_performance_rating_detail_player + 13);
 
			w->SetDirty();
 

	
 
			break;
 
			/* Draw the amount we have against what is needed
 
				* For some of them it is in currency format */
 
			SetDParam(0, val);
 
			SetDParam(1, needed);
 
			switch (i) {
 
				case SCORE_MIN_PROFIT:
 
				case SCORE_MIN_INCOME:
 
				case SCORE_MAX_INCOME:
 
				case SCORE_MONEY:
 
				case SCORE_LOAN:
 
					DrawString(167, y, STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY, TC_FROMSTRING);
 
					break;
 
				default:
 
					DrawString(167, y, STR_PERFORMANCE_DETAIL_AMOUNT_INT, TC_FROMSTRING);
 
			}
 
		}
 

	
 
		case WE_TICK:
 
			if (_pause_game != 0) break;
 
	}
 

	
 
			/* Update the player score every 5 days */
 
			if (--w->custom[0] == 0) {
 
				w->custom[0] = DAY_TICKS;
 
				if (--w->custom[1] == 0) {
 
					Player *p2;
 
	virtual void OnClick(Point pt, int widget)
 
	{
 
		/* Check which button is clicked */
 
		if (IsInsideMM(widget, 13, 21)) {
 
			/* Is it no on disable? */
 
			if (!this->IsWidgetDisabled(widget)) {
 
				this->RaiseWidget(player + 13);
 
				player = (PlayerID)(widget - 13);
 
				this->LowerWidget(player + 13);
 
				this->SetDirty();
 
			}
 
		}
 
	}
 

	
 
					w->custom[1] = 5;
 
					FOR_ALL_PLAYERS(p2) {
 
						/* Skip if player is not active */
 
						if (p2->is_active) UpdateCompanyRatingAndValue(p2, false);
 
					}
 
					w->SetDirty();
 
				}
 
			}
 
	virtual void OnTick()
 
	{
 
		if (_pause_game != 0) return;
 

	
 
			break;
 
		/* Update the player score every 5 days */
 
		if (--this->timeout == 0) {
 
			this->UpdatePlayerStats();
 
			this->SetDirty();
 
		}
 
	}
 
}
 
};
 

	
 
PlayerID PerformanceRatingDetailWindow::player = INVALID_PLAYER;
 

	
 

	
 
static const Widget _performance_rating_detail_widgets[] = {
 
{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,               STR_018B_CLOSE_WINDOW},
 
@@ -1158,10 +1154,10 @@ static const WindowDesc _performance_rat
 
	WC_PERFORMANCE_DETAIL, WC_NONE,
 
	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
 
	_performance_rating_detail_widgets,
 
	PerformanceRatingDetailWndProc
 
	NULL
 
};
 

	
 
void ShowPerformanceRatingDetail()
 
{
 
	AllocateWindowDescFront<Window>(&_performance_rating_detail_desc, 0);
 
	AllocateWindowDescFront<PerformanceRatingDetailWindow>(&_performance_rating_detail_desc, 0);
 
}
0 comments (0 inline, 0 general)