changeset 14054:ed7bd40a291b draft

(svn r18597) -Fix (r17147)[FS#3395, FS#3396]: ChangeVehicleNews() did not update the news ticker.
author frosch <frosch@openttd.org>
date Mon, 21 Dec 2009 21:14:40 +0000
parents 0fadb3eca304
children 1d37529b4d5a
files src/news_func.h src/news_gui.cpp src/statusbar_gui.cpp
diffstat 3 files changed, 15 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/news_func.h
+++ b/src/news_func.h
@@ -46,7 +46,7 @@
 void NewsLoop();
 void InitNewsItemStructs();
 
-extern NewsItem _statusbar_news_item;
+extern const NewsItem *_statusbar_news_item;
 extern bool _news_ticker_sound;
 
 extern NewsTypeData _news_type_data[];
--- a/src/news_gui.cpp
+++ b/src/news_gui.cpp
@@ -34,7 +34,7 @@
 
 #include "table/strings.h"
 
-NewsItem _statusbar_news_item;
+const NewsItem *_statusbar_news_item = NULL;
 bool _news_ticker_sound; ///< Make a ticker sound when a news item is published.
 
 static uint MIN_NEWS_AMOUNT = 30;           ///< prefered minimum amount of news messages
@@ -46,10 +46,10 @@
  * Users can force an item by accessing the history or "last message".
  * If the message being shown was forced by the user, a pointer is stored
  * in _forced_news. Otherwise, \a _forced_news variable is NULL. */
-static NewsItem *_forced_news = NULL;       ///< item the user has asked for
+static const NewsItem *_forced_news = NULL;       ///< item the user has asked for
 
 /** Current news item (last item shown regularly). */
-static NewsItem *_current_news = NULL;
+static const NewsItem *_current_news = NULL;
 
 
 /**
@@ -281,10 +281,10 @@
 struct NewsWindow : Window {
 	uint16 chat_height;   ///< Height of the chat window.
 	uint16 status_height; ///< Height of the status bar window
-	NewsItem *ni;         ///< News item to display.
+	const NewsItem *ni;   ///< News item to display.
 	static uint duration; ///< Remaining time for showing current news message (may only be accessed while a news item is displayed).
 
-	NewsWindow(const WindowDesc *desc, NewsItem *ni) : Window(), ni(ni)
+	NewsWindow(const WindowDesc *desc, const NewsItem *ni) : Window(), ni(ni)
 	{
 		NewsWindow::duration = 555;
 		const Window *w = FindWindowByClass(WC_SEND_NETWORK_MSG);
@@ -561,7 +561,7 @@
 
 
 /** Open up an own newspaper window for the news item */
-static void ShowNewspaper(NewsItem *ni)
+static void ShowNewspaper(const NewsItem *ni)
 {
 	SoundFx sound = _news_type_data[_news_subtype_data[ni->subtype].type].sound;
 	if (sound != 0) SndPlayFx(sound);
@@ -574,7 +574,7 @@
 {
 	if (_news_ticker_sound) SndPlayFx(SND_16_MORSE);
 
-	_statusbar_news_item = *ni;
+	_statusbar_news_item = ni;
 	InvalidateWindowData(WC_STATUS_BAR, 0, SBI_SHOW_TICKER);
 }
 
@@ -592,6 +592,7 @@
 	_latest_news = NULL;
 	_forced_news = NULL;
 	_current_news = NULL;
+	_statusbar_news_item = NULL;
 	NewsWindow::duration = 0;
 }
 
@@ -601,7 +602,7 @@
  */
 static bool ReadyForNextItem()
 {
-	NewsItem *ni = _forced_news == NULL ? _current_news : _forced_news;
+	const NewsItem *ni = _forced_news == NULL ? _current_news : _forced_news;
 	if (ni == NULL) return true;
 
 	/* Ticker message
@@ -621,11 +622,12 @@
 	InvalidateWindowData(WC_STATUS_BAR, 0, SBI_NEWS_DELETED); // invalidate the statusbar
 	DeleteWindowById(WC_NEWS_WINDOW, 0); // close the newspapers window if shown
 	_forced_news = NULL;
+	_statusbar_news_item = NULL;
 
 	/* if we're not at the last item, then move on */
 	if (_current_news != _latest_news) {
 		_current_news = (_current_news == NULL) ? _oldest_news : _current_news->next;
-		NewsItem *ni = _current_news;
+		const NewsItem *ni = _current_news;
 		const NewsType type = _news_subtype_data[ni->subtype].type;
 
 		/* check the date, don't show too old items */
@@ -832,7 +834,7 @@
 }
 
 /** Do a forced show of a specific message */
-static void ShowNewsMessage(NewsItem *ni)
+static void ShowNewsMessage(const NewsItem *ni)
 {
 	assert(_total_news != 0);
 
--- a/src/statusbar_gui.cpp
+++ b/src/statusbar_gui.cpp
@@ -161,9 +161,9 @@
 					DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, STR_STATUSBAR_AUTOSAVE, TC_FROMSTRING, SA_CENTER);
 				} else if (_pause_mode != PM_UNPAUSED) {
 					DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, STR_STATUSBAR_PAUSED, TC_FROMSTRING, SA_CENTER);
-				} else if (this->ticker_scroll < TICKER_STOP && FindWindowById(WC_NEWS_WINDOW, 0) == NULL && _statusbar_news_item.string_id != 0) {
+				} else if (this->ticker_scroll < TICKER_STOP && FindWindowById(WC_NEWS_WINDOW, 0) == NULL && _statusbar_news_item != NULL && _statusbar_news_item->string_id != 0) {
 					/* Draw the scrolling news text */
-					if (!DrawScrollingStatusText(&_statusbar_news_item, this->ticker_scroll, r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, r.bottom)) {
+					if (!DrawScrollingStatusText(_statusbar_news_item, this->ticker_scroll, r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, r.bottom)) {
 						InvalidateWindowData(WC_STATUS_BAR, 0, SBI_NEWS_DELETED);
 						if (Company::IsValidID(_local_company)) {
 							/* This is the default text */