Changeset - r12657:fdb9884fac07
[Not reviewed]
master
0 1 0
alberth - 15 years ago 2009-08-08 20:06:38
alberth@openttd.org
(svn r17122) -Codechange: Message history window uses nested widget tree.
1 file changed with 50 insertions and 31 deletions:
0 comments (0 inline, 0 general)
src/news_gui.cpp
Show inline comments
 
@@ -779,52 +779,78 @@ enum MessageHistoryWidgets {
 
};
 

	
 
struct MessageHistoryWindow : Window {
 
	MessageHistoryWindow(const WindowDesc *desc) : Window(desc)
 
	static const int top_spacing;    ///< Additional spacing at the top of the #MHW_BACKGROUND widget.
 
	static const int bottom_spacing; ///< Additional spacing at the bottom of the #MHW_BACKGROUND widget.
 

	
 
	int line_height; /// < Height of a single line in the news histoy window including spacing.
 
	int date_width;  /// < Width needed for the date part.
 

	
 
	MessageHistoryWindow(const WindowDesc *desc) : Window()
 
	{
 
		this->vscroll.cap = 10;
 
		this->vscroll.count = _total_news;
 
		this->resize.step_height = 12;
 
		this->resize.height = this->height - 12 * 6; // minimum of 4 items in the list, each item 12 high
 
		this->resize.step_width = 1;
 
		this->resize.width = 200; // can't make window any smaller than 200 pixel
 
		this->InitNested(desc); // Initializes 'this->line_height' and 'this->date_width'.
 
		this->vscroll.cap = (this->nested_array[MHW_BACKGROUND]->current_y - this->top_spacing - this->bottom_spacing) / this->line_height;
 
		OnInvalidateData(0);
 
	}
 

	
 
		this->FindWindowPlacementAndResize(desc);
 
	virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *resize)
 
	{
 
		if (widget == MHW_BACKGROUND) {
 
			this->line_height = FONT_HEIGHT_NORMAL + 2;
 
			resize->height = this->line_height;
 

	
 
			SetDParam(0, ConvertYMDToDate(2024, 7, 28));
 
			this->date_width = GetStringBoundingBox(STR_SHORT_DATE).width;
 

	
 
			size->height = 4 * resize->height + this->top_spacing + this->bottom_spacing; // At least 4 lines are visible.
 
			size->width = max(200u, size->width); // At least 200 pixels wide.
 
		}
 
	}
 

	
 
	virtual void OnPaint()
 
	{
 
		int y = 19;
 

	
 
		SetVScrollCount(this, _total_news);
 
		OnInvalidateData(0);
 
		this->DrawWidgets();
 
	}
 

	
 
		if (_total_news == 0) return;
 
	virtual void DrawWidget(const Rect &r, int widget) const
 
	{
 
		if (widget != MHW_BACKGROUND || _total_news == 0) return;
 

	
 
		/* Find the first news item to display. */
 
		NewsItem *ni = _latest_news;
 
		for (int n = this->vscroll.pos; n > 0; n--) {
 
			ni = ni->prev;
 
			if (ni == NULL) return;
 
		}
 

	
 
		/* Fill the widget with news items. */
 
		int y = r.top + this->top_spacing;
 
		const int date_left = r.left + WD_FRAMETEXT_LEFT;       // Left edge of dates
 
		const int news_left = date_left + this->date_width + 5; // Left edge of news items
 
		for (int n = this->vscroll.cap; n > 0; n--) {
 
			SetDParam(0, ni->date);
 
			DrawString(4, 82, y, STR_SHORT_DATE);
 
			DrawString(date_left, news_left, y, STR_SHORT_DATE);
 

	
 
			DrawNewsString(82, y, TC_WHITE, ni, this->width - 95);
 
			y += 12;
 
			DrawNewsString(news_left, y, TC_WHITE, ni, r.right - WD_FRAMETEXT_RIGHT - news_left);
 
			y += this->line_height;
 

	
 
			ni = ni->prev;
 
			if (ni == NULL) return;
 
		}
 
	}
 

	
 
	virtual void OnInvalidateData(int data)
 
	{
 
		SetVScrollCount(this, _total_news);
 
	}
 

	
 
	virtual void OnClick(Point pt, int widget)
 
	{
 
		if (widget == MHW_BACKGROUND) {
 
			NewsItem *ni = _latest_news;
 
			if (ni == NULL) return;
 

	
 
			for (int n = (pt.y - 19) / 12 + this->vscroll.pos; n > 0; n--) {
 
			for (int n = (pt.y - this->nested_array[MHW_BACKGROUND]->pos_y - WD_FRAMERECT_TOP) / this->line_height + this->vscroll.pos; n > 0; n--) {
 
				ni = ni->prev;
 
				if (ni == NULL) return;
 
			}
 
@@ -835,32 +861,26 @@ struct MessageHistoryWindow : Window {
 

	
 
	virtual void OnResize(Point delta)
 
	{
 
		this->vscroll.cap += delta.y / 12;
 
		this->vscroll.cap += delta.y / this->line_height;
 
		OnInvalidateData(0);
 
	}
 
};
 

	
 
static const Widget _message_history_widgets[] = {
 
{   WWT_CLOSEBOX,   RESIZE_NONE,  COLOUR_BROWN,     0,    10,     0,    13, STR_BLACK_CROSS,     STR_TOOLTIP_CLOSE_WINDOW},
 
{    WWT_CAPTION,  RESIZE_RIGHT,  COLOUR_BROWN,    11,   387,     0,    13, STR_MESSAGE_HISTORY, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS},
 
{  WWT_STICKYBOX,     RESIZE_LR,  COLOUR_BROWN,   388,   399,     0,    13, 0x0,                 STR_TOOLTIP_STICKY},
 
{      WWT_PANEL,     RESIZE_RB,  COLOUR_BROWN,     0,   387,    14,   139, 0x0,                 STR_MESSAGE_HISTORY_TOOLTIP},
 
{  WWT_SCROLLBAR,    RESIZE_LRB,  COLOUR_BROWN,   388,   399,    14,   127, 0x0,                 STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST},
 
{  WWT_RESIZEBOX,   RESIZE_LRTB,  COLOUR_BROWN,   388,   399,   128,   139, 0x0,                 STR_TOOLTIP_RESIZE},
 
{   WIDGETS_END},
 
};
 
const int MessageHistoryWindow::top_spacing = WD_FRAMERECT_TOP + 4;
 
const int MessageHistoryWindow::bottom_spacing = WD_FRAMERECT_BOTTOM;
 

	
 
static const NWidgetPart _nested_message_history[] = {
 
	NWidget(NWID_HORIZONTAL),
 
		NWidget(WWT_CLOSEBOX, COLOUR_BROWN, MHW_CLOSEBOX), SetMinimalSize(11, 14), SetDataTip(STR_BLACK_CROSS, STR_TOOLTIP_CLOSE_WINDOW),
 
		NWidget(WWT_CAPTION, COLOUR_BROWN, MHW_CAPTION), SetMinimalSize(377, 14), SetDataTip(STR_MESSAGE_HISTORY, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
 
		NWidget(WWT_CAPTION, COLOUR_BROWN, MHW_CAPTION), SetDataTip(STR_MESSAGE_HISTORY, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
 
		NWidget(WWT_STICKYBOX, COLOUR_BROWN, MHW_STICKYBOX), SetMinimalSize(12, 14), SetDataTip(0x0, STR_TOOLTIP_STICKY),
 
	EndContainer(),
 

	
 
	NWidget(NWID_HORIZONTAL),
 
		NWidget(WWT_PANEL, COLOUR_BROWN, MHW_BACKGROUND), SetMinimalSize(388, 125), SetDataTip(0x0, STR_MESSAGE_HISTORY_TOOLTIP), SetResize(1, 12),
 
		NWidget(WWT_PANEL, COLOUR_BROWN, MHW_BACKGROUND), SetMinimalSize(200, 125), SetDataTip(0x0, STR_MESSAGE_HISTORY_TOOLTIP), SetResize(1, 12),
 
		EndContainer(),
 
		NWidget(NWID_VERTICAL),
 
			NWidget(WWT_SCROLLBAR, COLOUR_BROWN, MHW_SCROLLBAR), SetMinimalSize(12, 114), SetDataTip(0x0, STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST), SetResize(0, 1),
 
			NWidget(WWT_SCROLLBAR, COLOUR_BROWN, MHW_SCROLLBAR), SetFill(0, 1), SetDataTip(0x0, STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST), SetResize(0, 1),
 
			NWidget(WWT_RESIZEBOX, COLOUR_BROWN, MHW_RESIZEBOX), SetMinimalSize(12, 12), SetDataTip(0x0, STR_TOOLTIP_RESIZE),
 
		EndContainer(),
 
	EndContainer(),
 
@@ -870,8 +890,7 @@ static const WindowDesc _message_history
 
	240, 22, 400, 140, 400, 140,
 
	WC_MESSAGE_HISTORY, WC_NONE,
 
	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
 
	_message_history_widgets,
 
	_nested_message_history, lengthof(_nested_message_history)
 
	NULL, _nested_message_history, lengthof(_nested_message_history)
 
);
 

	
 
/** Display window with news messages history */
0 comments (0 inline, 0 general)