Changeset - r19337:9e30e80ded39
[Not reviewed]
master
0 2 0
frosch - 12 years ago 2012-05-14 20:58:59
frosch@openttd.org
(svn r24248) -Codechange: Move ErrorMessageData class definition to header file.
2 files changed with 68 insertions and 62 deletions:
0 comments (0 inline, 0 general)
src/error.h
Show inline comments
 
@@ -13,6 +13,8 @@
 
#define ERROR_H
 

	
 
#include "strings_type.h"
 
#include "company_type.h"
 
#include "core/geometry_type.hpp"
 

	
 
/** Message severity/type */
 
enum WarningLevel {
 
@@ -22,6 +24,25 @@ enum WarningLevel {
 
	WL_CRITICAL, ///< Critical errors, the MessageBox is shown in all cases
 
};
 

	
 
/** The data of the error message. */
 
class ErrorMessageData {
 
protected:
 
	uint duration;                  ///< Length of display of the message. 0 means forever,
 
	uint64 decode_params[20];       ///< Parameters of the message strings.
 
	const char *strings[20];        ///< Copies of raw strings that were used.
 
	uint textref_stack_size;        ///< Number of uint32 values to put on the #TextRefStack for the error message.
 
	uint32 textref_stack[16];       ///< Values to put on the #TextRefStack for the error message.
 
	StringID summary_msg;           ///< General error message showed in first line. Must be valid.
 
	StringID detailed_msg;          ///< Detailed error message showed in second line. Can be #INVALID_STRING_ID.
 
	Point position;                 ///< Position of the error message window.
 
	CompanyID face;                 ///< Company belonging to the face being shown. #INVALID_COMPANY if no face present.
 

	
 
public:
 
	ErrorMessageData(const ErrorMessageData &data);
 
	~ErrorMessageData();
 
	ErrorMessageData(StringID summary_msg, StringID detailed_msg, uint duration = 0, int x = 0, int y = 0, uint textref_stack_size = 0, const uint32 *textref_stack = NULL);
 
};
 

	
 
void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel wl, int x = 0, int y = 0, uint textref_stack_size = 0, const uint32 *textref_stack = NULL);
 
void ClearErrorMessages();
 
void ShowFirstError();
src/error_gui.cpp
Show inline comments
 
@@ -66,72 +66,57 @@ static const WindowDesc _errmsg_face_des
 
	_nested_errmsg_face_widgets, lengthof(_nested_errmsg_face_widgets)
 
);
 

	
 
/** The data of the error message. */
 
class ErrorMessageData {
 
protected:
 
	uint duration;                  ///< Length of display of the message. 0 means forever,
 
	uint64 decode_params[20];       ///< Parameters of the message strings.
 
	const char *strings[20];        ///< Copies of raw strings that were used.
 
	uint textref_stack_size;        ///< Number of uint32 values to put on the #TextRefStack for the error message.
 
	uint32 textref_stack[16];       ///< Values to put on the #TextRefStack for the error message.
 
	StringID summary_msg;           ///< General error message showed in first line. Must be valid.
 
	StringID detailed_msg;          ///< Detailed error message showed in second line. Can be #INVALID_STRING_ID.
 
	Point position;                 ///< Position of the error message window.
 
	CompanyID face;                 ///< Company belonging to the face being shown. #INVALID_COMPANY if no face present.
 
/**
 
 * Copy the given data into our instace.
 
 * @param data The data to copy.
 
 */
 
ErrorMessageData::ErrorMessageData(const ErrorMessageData &data)
 
{
 
	*this = data;
 
	for (size_t i = 0; i < lengthof(this->strings); i++) {
 
		if (this->strings[i] != NULL) {
 
			this->strings[i] = strdup(this->strings[i]);
 
			this->decode_params[i] = (size_t)this->strings[i];
 
		}
 
	}
 
}
 

	
 
/** Free all the strings. */
 
ErrorMessageData::~ErrorMessageData()
 
{
 
	for (size_t i = 0; i < lengthof(this->strings); i++) free(this->strings[i]);
 
}
 

	
 
public:
 
	/**
 
	 * Copy the given data into our instace.
 
	 * @param data The data to copy.
 
	 */
 
	ErrorMessageData(const ErrorMessageData &data)
 
	{
 
		*this = data;
 
		for (size_t i = 0; i < lengthof(this->strings); i++) {
 
			if (this->strings[i] != NULL) {
 
				this->strings[i] = strdup(this->strings[i]);
 
				this->decode_params[i] = (size_t)this->strings[i];
 
			}
 
		}
 
/**
 
 * Display an error message in a window.
 
 * @param summary_msg  General error message showed in first line. Must be valid.
 
 * @param detailed_msg Detailed error message showed in second line. Can be INVALID_STRING_ID.
 
 * @param duration     The amount of time to show this error message.
 
 * @param x            World X position (TileVirtX) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
 
 * @param y            World Y position (TileVirtY) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
 
 * @param textref_stack_size Number of uint32 values to put on the #TextRefStack for the error message; 0 if the #TextRefStack shall not be used.
 
 * @param textref_stack Values to put on the #TextRefStack.
 
 */
 
ErrorMessageData::ErrorMessageData(StringID summary_msg, StringID detailed_msg, uint duration, int x, int y, uint textref_stack_size, const uint32 *textref_stack) :
 
	duration(duration),
 
	textref_stack_size(textref_stack_size),
 
	summary_msg(summary_msg),
 
	detailed_msg(detailed_msg)
 
{
 
	this->position.x = x;
 
	this->position.y = y;
 
	if (textref_stack_size > 0) StartTextRefStackUsage(textref_stack_size, textref_stack);
 
	CopyOutDParam(this->decode_params, this->strings, detailed_msg == INVALID_STRING_ID ? summary_msg : detailed_msg, lengthof(this->decode_params));
 
	if (textref_stack_size > 0) {
 
		StopTextRefStackUsage();
 
		MemCpyT(this->textref_stack, textref_stack, textref_stack_size);
 
	}
 

	
 
	/** Free all the strings. */
 
	~ErrorMessageData()
 
	{
 
		for (size_t i = 0; i < lengthof(this->strings); i++) free(this->strings[i]);
 
	}
 
	CompanyID company = (CompanyID)GetDParamX(this->decode_params, 2);
 
	this->face = (this->detailed_msg == STR_ERROR_OWNED_BY && company < MAX_COMPANIES) ? company : INVALID_COMPANY;
 

	
 
	/**
 
	 * Display an error message in a window.
 
	 * @param summary_msg  General error message showed in first line. Must be valid.
 
	 * @param detailed_msg Detailed error message showed in second line. Can be INVALID_STRING_ID.
 
	 * @param duration     The amount of time to show this error message.
 
	 * @param x            World X position (TileVirtX) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
 
	 * @param y            World Y position (TileVirtY) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
 
	 * @param textref_stack_size Number of uint32 values to put on the #TextRefStack for the error message; 0 if the #TextRefStack shall not be used.
 
	 * @param textref_stack Values to put on the #TextRefStack.
 
	 */
 
	ErrorMessageData(StringID summary_msg, StringID detailed_msg, uint duration, int x, int y, uint textref_stack_size, const uint32 *textref_stack) :
 
		duration(duration),
 
		textref_stack_size(textref_stack_size),
 
		summary_msg(summary_msg),
 
		detailed_msg(detailed_msg)
 
	{
 
		this->position.x = x;
 
		this->position.y = y;
 
		if (textref_stack_size > 0) StartTextRefStackUsage(textref_stack_size, textref_stack);
 
		CopyOutDParam(this->decode_params, this->strings, detailed_msg == INVALID_STRING_ID ? summary_msg : detailed_msg, lengthof(this->decode_params));
 
		if (textref_stack_size > 0) {
 
			StopTextRefStackUsage();
 
			MemCpyT(this->textref_stack, textref_stack, textref_stack_size);
 
		}
 

	
 
		CompanyID company = (CompanyID)GetDParamX(this->decode_params, 2);
 
		this->face = (this->detailed_msg == STR_ERROR_OWNED_BY && company < MAX_COMPANIES) ? company : INVALID_COMPANY;
 

	
 
		assert(summary_msg != INVALID_STRING_ID);
 
	}
 
};
 
	assert(summary_msg != INVALID_STRING_ID);
 
}
 

	
 
/** Define a queue with errors. */
 
typedef std::list<ErrorMessageData> ErrorList;
0 comments (0 inline, 0 general)