Changeset - r17463:0e77af810a2d
[Not reviewed]
master
0 6 0
frosch - 14 years ago 2011-03-08 20:52:59
frosch@openttd.org
(svn r22228) -Fix (r22135)[FS#4546]: Do not resort town, industry and signs list directly in OnInvalidateData(). There might be a scheduled rebuild which needs execution first. So, only set a trigger for resorting.
6 files changed with 48 insertions and 11 deletions:
0 comments (0 inline, 0 general)
src/group_gui.cpp
Show inline comments
 
@@ -255,6 +255,9 @@ public:
 

	
 
	virtual void OnInvalidateData(int data)
 
	{
 
		/* We can only set the trigger for resorting/rebuilding.
 
		 * We cannot safely resort at this point, as there might be multiple scheduled invalidations,
 
		 * and a rebuild needs to be done first though it is scheduled later. */
 
		if (data == 0) {
 
			this->vehicles.ForceRebuild();
 
			this->groups.ForceRebuild();
src/industry_gui.cpp
Show inline comments
 
@@ -1334,6 +1334,12 @@ public:
 
		this->vscroll->SetCapacityFromWidget(this, IDW_INDUSTRY_LIST);
 
	}
 

	
 
	virtual void OnPaint()
 
	{
 
		if (this->industries.NeedRebuild()) this->BuildSortIndustriesList();
 
		this->DrawWidgets();
 
	}
 

	
 
	virtual void OnHundredthTick()
 
	{
 
		this->industries.ForceResort();
 
@@ -1342,12 +1348,14 @@ public:
 

	
 
	virtual void OnInvalidateData(int data)
 
	{
 
		/* We can only set the trigger for resorting/rebuilding.
 
		 * We cannot safely resort at this point, as there might be multiple scheduled invalidations,
 
		 * and a rebuild needs to be done first though it is scheduled later. */
 
		if (data == 0) {
 
			this->industries.ForceRebuild();
 
		} else {
 
			this->industries.ForceResort();
 
		}
 
		this->BuildSortIndustriesList();
 
	}
 
};
 

	
src/signs_gui.cpp
Show inline comments
 
@@ -164,9 +164,7 @@ struct SignListWindow : QueryStringBaseW
 
		/* Create initial list. */
 
		this->signs.ForceRebuild();
 
		this->signs.ForceResort();
 
		this->BuildSignsList();
 
		this->SortSignsList();
 
		this->vscroll->SetCount(this->signs.Length());
 
		this->BuildSortSignList();
 
	}
 

	
 
	/**
 
@@ -214,6 +212,7 @@ struct SignListWindow : QueryStringBaseW
 

	
 
	virtual void OnPaint()
 
	{
 
		if (this->signs.NeedRebuild()) this->BuildSortSignList();
 
		this->DrawWidgets();
 
		if (!this->IsShaded()) this->DrawEditBox(SLW_FILTER_TEXT);
 
	}
 
@@ -352,23 +351,36 @@ struct SignListWindow : QueryStringBaseW
 
		this->HandleEditBox(SLW_FILTER_TEXT);
 
	}
 

	
 
	void BuildSortSignList()
 
	{
 
		if (this->signs.NeedRebuild()) {
 
			this->BuildSignsList();
 
			this->vscroll->SetCount(this->signs.Length());
 
			this->SetWidgetDirty(SLW_CAPTION);
 
		}
 
		this->SortSignsList();
 
	}
 

	
 
	virtual void OnHundredthTick()
 
	{
 
		this->BuildSortSignList();
 
		this->SetDirty();
 
	}
 

	
 
	virtual void OnInvalidateData(int data)
 
	{
 
		/* When there is a filter string, we always need to rebuild the list even if
 
		 * the amount of signs in total is unchanged, as the subset of signs that is
 
		 * accepted by the filter might has changed.
 
		 */
 
		 *
 
		 * We can only set the trigger for resorting/rebuilding.
 
		 * We cannot safely resort at this point, as there might be multiple scheduled invalidations,
 
		 * and a rebuild needs to be done first though it is scheduled later. */
 
		if (data == 0 || !StrEmpty(this->filter_string)) { // New or deleted sign, or there is a filter string
 
			this->signs.ForceRebuild();
 
			this->BuildSignsList();
 
			this->SetWidgetDirty(SLW_CAPTION);
 
			this->vscroll->SetCount(this->signs.Length());
 
		} else { // Change of sign contents while there is no filter string
 
			this->signs.ForceResort();
 
		}
 

	
 
		this->SortSignsList();
 
	}
 

	
 
	static Hotkey<SignListWindow> signlist_hotkeys[];
src/station_gui.cpp
Show inline comments
 
@@ -689,6 +689,9 @@ public:
 

	
 
	virtual void OnInvalidateData(int data)
 
	{
 
		/* We can only set the trigger for resorting/rebuilding.
 
		 * We cannot safely resort at this point, as there might be multiple scheduled invalidations,
 
		 * and a rebuild needs to be done first though it is scheduled later. */
 
		if (data == 0) {
 
			this->stations.ForceRebuild();
 
		} else {
src/town_gui.cpp
Show inline comments
 
@@ -846,6 +846,12 @@ public:
 
		}
 
	}
 

	
 
	virtual void OnPaint()
 
	{
 
		if (this->towns.NeedRebuild()) this->BuildSortTownList();
 
		this->DrawWidgets();
 
	}
 

	
 
	virtual void OnHundredthTick()
 
	{
 
		this->BuildSortTownList();
 
@@ -859,12 +865,14 @@ public:
 

	
 
	virtual void OnInvalidateData(int data)
 
	{
 
		/* We can only set the trigger for resorting/rebuilding.
 
		 * We cannot safely resort at this point, as there might be multiple scheduled invalidations,
 
		 * and a rebuild needs to be done first though it is scheduled later. */
 
		if (data == 0) {
 
			this->towns.ForceRebuild();
 
		} else {
 
			this->towns.ForceResort();
 
		}
 
		this->BuildSortTownList();
 
	}
 
};
 

	
src/vehicle_gui.cpp
Show inline comments
 
@@ -1609,6 +1609,9 @@ public:
 
			return;
 
		}
 

	
 
		/* We can only set the trigger for resorting/rebuilding.
 
		 * We cannot safely resort at this point, as there might be multiple scheduled invalidations,
 
		 * and a rebuild needs to be done first though it is scheduled later. */
 
		if (data == 0) {
 
			this->vehicles.ForceRebuild();
 
		} else {
0 comments (0 inline, 0 general)