mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-13 02:52:37 +00:00
Change: Keep News Window usable by only storing the 1024 latest news messages
This commit is contained in:
parent
d1b7eb2de1
commit
7191360754
@ -44,6 +44,7 @@
|
|||||||
const NewsItem *_statusbar_news_item = nullptr;
|
const NewsItem *_statusbar_news_item = nullptr;
|
||||||
|
|
||||||
static uint MIN_NEWS_AMOUNT = 30; ///< preferred minimum amount of news messages
|
static uint MIN_NEWS_AMOUNT = 30; ///< preferred minimum amount of news messages
|
||||||
|
static uint MAX_NEWS_AMOUNT = 1 << 10; ///< Do not exceed this number of news messages
|
||||||
static uint _total_news = 0; ///< current number of news items
|
static uint _total_news = 0; ///< current number of news items
|
||||||
static NewsItem *_oldest_news = nullptr; ///< head of news items queue
|
static NewsItem *_oldest_news = nullptr; ///< head of news items queue
|
||||||
NewsItem *_latest_news = nullptr; ///< tail of news items queue
|
NewsItem *_latest_news = nullptr; ///< tail of news items queue
|
||||||
@ -729,6 +730,50 @@ static void MoveToNextNewsItem()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Delete a news item from the queue */
|
||||||
|
static void DeleteNewsItem(NewsItem *ni)
|
||||||
|
{
|
||||||
|
/* Delete the news from the news queue. */
|
||||||
|
if (ni->prev != nullptr) {
|
||||||
|
ni->prev->next = ni->next;
|
||||||
|
} else {
|
||||||
|
assert(_oldest_news == ni);
|
||||||
|
_oldest_news = ni->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ni->next != nullptr) {
|
||||||
|
ni->next->prev = ni->prev;
|
||||||
|
} else {
|
||||||
|
assert(_latest_news == ni);
|
||||||
|
_latest_news = ni->prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
_total_news--;
|
||||||
|
|
||||||
|
if (_forced_news == ni || _current_news == ni) {
|
||||||
|
/* When we're the current news, go to the previous item first;
|
||||||
|
* we just possibly made that the last news item. */
|
||||||
|
if (_current_news == ni) _current_news = ni->prev;
|
||||||
|
|
||||||
|
/* About to remove the currently forced item (shown as newspapers) ||
|
||||||
|
* about to remove the currently displayed item (newspapers) */
|
||||||
|
MoveToNextNewsItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_statusbar_news_item == ni) {
|
||||||
|
/* When we're the current news, go to the previous item first;
|
||||||
|
* we just possibly made that the last news item. */
|
||||||
|
_statusbar_news_item = ni->prev;
|
||||||
|
|
||||||
|
/* About to remove the currently displayed item (ticker, or just a reminder) */
|
||||||
|
MoveToNextTickerItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
delete ni;
|
||||||
|
|
||||||
|
SetWindowDirty(WC_MESSAGE_HISTORY, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a new newsitem to be shown.
|
* Add a new newsitem to be shown.
|
||||||
* @param string String to display
|
* @param string String to display
|
||||||
@ -777,6 +822,11 @@ void AddNewsItem(StringID string, NewsType type, NewsFlag flags, NewsReferenceTy
|
|||||||
ni->next = nullptr;
|
ni->next = nullptr;
|
||||||
_latest_news = ni;
|
_latest_news = ni;
|
||||||
|
|
||||||
|
/* Keep the number of stored news items to a managable number */
|
||||||
|
if (_total_news > MAX_NEWS_AMOUNT) {
|
||||||
|
DeleteNewsItem(_oldest_news);
|
||||||
|
}
|
||||||
|
|
||||||
SetWindowDirty(WC_MESSAGE_HISTORY, 0);
|
SetWindowDirty(WC_MESSAGE_HISTORY, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -844,50 +894,6 @@ CommandCost CmdCustomNewsItem(TileIndex tile, DoCommandFlag flags, uint32 p1, ui
|
|||||||
return CommandCost();
|
return CommandCost();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Delete a news item from the queue */
|
|
||||||
static void DeleteNewsItem(NewsItem *ni)
|
|
||||||
{
|
|
||||||
/* Delete the news from the news queue. */
|
|
||||||
if (ni->prev != nullptr) {
|
|
||||||
ni->prev->next = ni->next;
|
|
||||||
} else {
|
|
||||||
assert(_oldest_news == ni);
|
|
||||||
_oldest_news = ni->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ni->next != nullptr) {
|
|
||||||
ni->next->prev = ni->prev;
|
|
||||||
} else {
|
|
||||||
assert(_latest_news == ni);
|
|
||||||
_latest_news = ni->prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
_total_news--;
|
|
||||||
|
|
||||||
if (_forced_news == ni || _current_news == ni) {
|
|
||||||
/* When we're the current news, go to the previous item first;
|
|
||||||
* we just possibly made that the last news item. */
|
|
||||||
if (_current_news == ni) _current_news = ni->prev;
|
|
||||||
|
|
||||||
/* About to remove the currently forced item (shown as newspapers) ||
|
|
||||||
* about to remove the currently displayed item (newspapers) */
|
|
||||||
MoveToNextNewsItem();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_statusbar_news_item == ni) {
|
|
||||||
/* When we're the current news, go to the previous item first;
|
|
||||||
* we just possibly made that the last news item. */
|
|
||||||
_statusbar_news_item = ni->prev;
|
|
||||||
|
|
||||||
/* About to remove the currently displayed item (ticker, or just a reminder) */
|
|
||||||
MoveToNextTickerItem();
|
|
||||||
}
|
|
||||||
|
|
||||||
delete ni;
|
|
||||||
|
|
||||||
SetWindowDirty(WC_MESSAGE_HISTORY, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete a news item type about a vehicle.
|
* Delete a news item type about a vehicle.
|
||||||
* When the news item type is INVALID_STRING_ID all news about the vehicle gets deleted.
|
* When the news item type is INVALID_STRING_ID all news about the vehicle gets deleted.
|
||||||
|
Loading…
Reference in New Issue
Block a user