changeset 11705:fe57210e6f07 draft

(svn r16091) -Change [FS#2778]: Reverse the order of the lines in the AI debug window
author yexo <yexo@openttd.org>
date Sun, 19 Apr 2009 14:42:03 +0000
parents 57f791418861
children 42912f4e41bf
files src/ai/ai_gui.cpp src/ai/api/ai_log.cpp
diffstat 2 files changed, 17 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/ai/ai_gui.cpp
+++ b/src/ai/ai_gui.cpp
@@ -629,6 +629,8 @@
 struct AIDebugWindow : public Window {
 	static CompanyID ai_debug_company;
 	int redraw_timer;
+	int last_vscroll_pos;
+	bool autoscroll;
 
 	AIDebugWindow(const WindowDesc *desc, WindowNumber number) : Window(desc, number)
 	{
@@ -641,6 +643,8 @@
 		this->vscroll.cap = 14;
 		this->vscroll.pos = 0;
 		this->resize.step_height = 12;
+		this->last_vscroll_pos = 0;
+		this->autoscroll = true;
 
 		if (ai_debug_company != INVALID_COMPANY) this->LowerWidget(ai_debug_company + AID_WIDGET_COMPANY_BUTTON_START);
 
@@ -722,9 +726,17 @@
 		this->InvalidateWidget(AID_WIDGET_SCROLLBAR);
 		if (log == NULL) return;
 
+		/* Detect when the user scrolls the window. Enable autoscroll when the
+		 * bottom-most line becomes visible. */
+		if (this->last_vscroll_pos != this->vscroll.pos) {
+			this->autoscroll = this->vscroll.pos >= log->used - this->vscroll.cap;
+		}
+		if (this->autoscroll) this->vscroll.pos = max(0, log->used - this->vscroll.cap);
+		last_vscroll_pos = this->vscroll.pos;
+
 		int y = 6;
-		for (int i = this->vscroll.pos; i < (this->vscroll.cap + this->vscroll.pos); i++) {
-			uint pos = (log->count + log->pos - i) % log->count;
+		for (int i = this->vscroll.pos; i < (this->vscroll.cap + this->vscroll.pos) && i < log->used; i++) {
+			uint pos = (i + log->pos + 1 - log->used + log->count) % log->count;
 			if (log->lines[pos] == NULL) break;
 
 			TextColour colour;
@@ -747,6 +759,8 @@
 		this->RaiseWidget(ai_debug_company + AID_WIDGET_COMPANY_BUTTON_START);
 		ai_debug_company = show_ai;
 		this->LowerWidget(ai_debug_company + AID_WIDGET_COMPANY_BUTTON_START);
+		this->autoscroll = true;
+		this->last_vscroll_pos = this->vscroll.pos;
 		this->SetDirty();
 	}
 
--- a/src/ai/api/ai_log.cpp
+++ b/src/ai/api/ai_log.cpp
@@ -32,7 +32,7 @@
 		log->lines = CallocT<char *>(80);
 		log->type = CallocT<AILog::AILogType>(80);
 		log->count = 80;
-		log->pos = log->count;
+		log->pos = log->count - 1;
 		log->used = 0;
 	}
 	LogData *log = (LogData *)AIObject::GetLogPointer();