mirror of https://github.com/OpenTTD/OpenTTD
(svn r8627) [0.5] -Backport from trunk (8409, 8420 + 8421, 8533, 8612):
-Regression: When the latest news was deleted, the news queue wrapped back to the oldest item, showing all news again. -Regression [FS#573]: ShowLastNewsMessage could show an out-of-bounds news item because it did not checked if a previous item actually existed the first time it is called (forced news is INVALID_NEWS). -Codechange: Rename the 'New <vehtype>' button of the global vehicle lists to 'Available <vehtype>' as it is a view-only list, not one from which you can purchase (rolling) stock. -Fix: segmentation fault when the toolbar gets removed and you have selected one of the items in a submenu of the toolbar. -Fix [FS#582]: When the currently selected player in the performance details window is no longer active, choose the first active player instead of the first player as that may also be inactive.release/0.5
parent
0543461f5e
commit
61b95ff1fc
38
graph_gui.c
38
graph_gui.c
|
@ -906,7 +906,7 @@ void ShowCompanyLeagueTable(void)
|
|||
|
||||
static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
static PlayerID _performance_rating_detail_player = 0;
|
||||
static PlayerID _performance_rating_detail_player = INVALID_PLAYER;
|
||||
|
||||
switch (e->event) {
|
||||
case WE_PAINT: {
|
||||
|
@ -919,6 +919,32 @@ static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e)
|
|||
// Draw standard stuff
|
||||
DrawWindowWidgets(w);
|
||||
|
||||
/* 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. */
|
||||
RaiseWindowWidget(w, _performance_rating_detail_player + 13);
|
||||
DisableWindowWidget(w, _performance_rating_detail_player + 13);
|
||||
SetWindowDirty(w);
|
||||
|
||||
_performance_rating_detail_player = INVALID_PLAYER;
|
||||
}
|
||||
|
||||
for (i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
|
||||
if (GetPlayer(i)->is_active) {
|
||||
/* Lower the widget corresponding to this player. */
|
||||
LowerWindowWidget(w, i + 13);
|
||||
SetWindowDirty(w);
|
||||
|
||||
_performance_rating_detail_player = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* If there are no active players, don't display anything else. */
|
||||
if (_performance_rating_detail_player == INVALID_PLAYER) break;
|
||||
|
||||
// Paint the player icons
|
||||
for (i = 0; i < MAX_PLAYERS; i++) {
|
||||
if (!GetPlayer(i)->is_active) {
|
||||
|
@ -926,12 +952,7 @@ static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e)
|
|||
if (!IsWindowWidgetDisabled(w, i + 13)) {
|
||||
// Bah, player gone :(
|
||||
DisableWindowWidget(w, i + 13);
|
||||
// Is this player selected? If so, select first player (always save? :s)
|
||||
if (IsWindowWidgetLowered(w, i + 13)) {
|
||||
RaiseWindowWidget(w, i + 13);
|
||||
LowerWindowWidget(w, 13);
|
||||
_performance_rating_detail_player = 0;
|
||||
}
|
||||
|
||||
// We need a repaint
|
||||
SetWindowDirty(w);
|
||||
}
|
||||
|
@ -1054,8 +1075,7 @@ static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e)
|
|||
w->custom[0] = DAY_TICKS;
|
||||
w->custom[1] = 5;
|
||||
|
||||
_performance_rating_detail_player = 0;
|
||||
LowerWindowWidget(w, _performance_rating_detail_player + 13);
|
||||
if (_performance_rating_detail_player != INVALID_PLAYER) LowerWindowWidget(w, _performance_rating_detail_player + 13);
|
||||
SetWindowDirty(w);
|
||||
|
||||
break;
|
||||
|
|
|
@ -394,6 +394,10 @@ STR_ENGINE_SORT_CARGO_CAPACITY :Cargo Capacity
|
|||
STR_NO_WAITING_CARGO :{BLACK}No cargo of any type is waiting
|
||||
STR_SELECT_ALL_FACILITIES :{BLACK}Select all facilities
|
||||
STR_SELECT_ALL_TYPES :{BLACK}Select all cargo types (including no waiting cargo)
|
||||
STR_AVAILABLE_TRAINS :{BLACK}Available Trains
|
||||
STR_AVAILABLE_ROAD_VEHICLES :{BLACK}Available Vehicles
|
||||
STR_AVAILABLE_SHIPS :{BLACK}Available Ships
|
||||
STR_AVAILABLE_AIRCRAFT :{BLACK}Available Aircraft
|
||||
STR_AVAILABLE_ENGINES_TIP :{BLACK}See a list of available engine designs for this vehicle type.
|
||||
STR_MANAGE_LIST :{BLACK}Manage list
|
||||
STR_MANAGE_LIST_TIP :{BLACK}Send instructions to all vehicles in this list
|
||||
|
|
|
@ -558,7 +558,7 @@ void ShowLastNewsMessage(void)
|
|||
/* Not forced any news yet, show the current one, unless a news window is
|
||||
* open (which can only be the current one), then show the previous item */
|
||||
const Window *w = FindWindowById(WC_NEWS_WINDOW, 0);
|
||||
ShowNewsMessage((w == NULL) ? _current_news : decreaseIndex(_current_news));
|
||||
ShowNewsMessage((w == NULL || (_current_news == _oldest_news)) ? _current_news : decreaseIndex(_current_news));
|
||||
} else if (_forced_news == _oldest_news) {
|
||||
/* We have reached the oldest news, start anew with the latest */
|
||||
ShowNewsMessage(_latest_news);
|
||||
|
@ -918,9 +918,11 @@ void DeleteVehicleNews(VehicleID vid, StringID news)
|
|||
for (i = n;; i = decreaseIndex(i)) {
|
||||
_news_items[i] = _news_items[decreaseIndex(i)];
|
||||
|
||||
if (i != _latest_news) {
|
||||
if (i == _current_news) _current_news = increaseIndex(_current_news);
|
||||
if (i == _forced_news) _forced_news = increaseIndex(_forced_news);
|
||||
if (i == visible_news) WP(w, news_d).ni = &_news_items[increaseIndex(visible_news)];
|
||||
}
|
||||
|
||||
if (i == _oldest_news) break;
|
||||
}
|
||||
|
|
|
@ -83,6 +83,9 @@ typedef byte WindowClass;
|
|||
enum {
|
||||
INVALID_YEAR = -1,
|
||||
INVALID_DATE = -1,
|
||||
|
||||
PLAYER_FIRST = 0x00,
|
||||
INVALID_PLAYER = 0xFF,
|
||||
};
|
||||
|
||||
typedef int32 Year;
|
||||
|
|
|
@ -1400,7 +1400,7 @@ enum VehicleListWindowWidgets {
|
|||
VLW_WIDGET_LIST,
|
||||
VLW_WIDGET_SCROLLBAR,
|
||||
VLW_WIDGET_OTHER_PLAYER_FILLER,
|
||||
VLW_WIDGET_NEW_VEHICLES,
|
||||
VLW_WIDGET_AVAILABLE_VEHICLES,
|
||||
VLW_WIDGET_MANAGE_VEHICLES,
|
||||
VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN,
|
||||
VLW_WIDGET_STOP_ALL,
|
||||
|
@ -1448,10 +1448,10 @@ static void CreateVehicleListWindow(Window *w)
|
|||
* Some windows contains actions only fit for the owner */
|
||||
if (player == _local_player) {
|
||||
HideWindowWidget(w, VLW_WIDGET_OTHER_PLAYER_FILLER);
|
||||
SetWindowWidgetDisabledState(w, VLW_WIDGET_NEW_VEHICLES, window_type != VLW_STANDARD);
|
||||
SetWindowWidgetDisabledState(w, VLW_WIDGET_AVAILABLE_VEHICLES, window_type != VLW_STANDARD);
|
||||
} else {
|
||||
SetWindowWidgetsHiddenState(w, true,
|
||||
VLW_WIDGET_NEW_VEHICLES,
|
||||
VLW_WIDGET_AVAILABLE_VEHICLES,
|
||||
VLW_WIDGET_MANAGE_VEHICLES,
|
||||
VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN,
|
||||
VLW_WIDGET_STOP_ALL,
|
||||
|
@ -1464,22 +1464,22 @@ static void CreateVehicleListWindow(Window *w)
|
|||
switch (vl->vehicle_type) {
|
||||
case VEH_Train:
|
||||
w->widget[VLW_WIDGET_LIST].tooltips = STR_883D_TRAINS_CLICK_ON_TRAIN_FOR;
|
||||
w->widget[VLW_WIDGET_NEW_VEHICLES].data = STR_8815_NEW_VEHICLES;
|
||||
w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_TRAINS;
|
||||
break;
|
||||
|
||||
case VEH_Road:
|
||||
w->widget[VLW_WIDGET_LIST].tooltips = STR_901A_ROAD_VEHICLES_CLICK_ON;
|
||||
w->widget[VLW_WIDGET_NEW_VEHICLES].data = STR_9004_NEW_VEHICLES;
|
||||
w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_ROAD_VEHICLES;
|
||||
break;
|
||||
|
||||
case VEH_Ship:
|
||||
w->widget[VLW_WIDGET_LIST].tooltips = STR_9823_SHIPS_CLICK_ON_SHIP_FOR;
|
||||
w->widget[VLW_WIDGET_NEW_VEHICLES].data = STR_9804_NEW_SHIPS;
|
||||
w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_SHIPS;
|
||||
break;
|
||||
|
||||
case VEH_Aircraft:
|
||||
w->widget[VLW_WIDGET_LIST].tooltips = STR_A01F_AIRCRAFT_CLICK_ON_AIRCRAFT;
|
||||
w->widget[VLW_WIDGET_NEW_VEHICLES].data = STR_A003_NEW_AIRCRAFT;
|
||||
w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_AIRCRAFT;
|
||||
break;
|
||||
|
||||
default: NOT_REACHED();
|
||||
|
@ -1742,7 +1742,7 @@ void PlayerVehWndProc(Window *w, WindowEvent *e)
|
|||
}
|
||||
} break;
|
||||
|
||||
case VLW_WIDGET_NEW_VEHICLES:
|
||||
case VLW_WIDGET_AVAILABLE_VEHICLES:
|
||||
switch (vl->vehicle_type) {
|
||||
case VEH_Train: ShowBuildTrainWindow(0); break;
|
||||
case VEH_Road: ShowBuildRoadVehWindow(0); break;
|
||||
|
|
Loading…
Reference in New Issue