summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarkvater <darkvater@openttd.org>2005-07-17 16:02:17 +0000
committerDarkvater <darkvater@openttd.org>2005-07-17 16:02:17 +0000
commit0eef2daf06cdac090107bd36d29717a1da626de1 (patch)
tree472e4925f19e8f1b2da0024cf181db2ee6f6785b
parent3e49626aecbf8316fc48c326a17fd11c67c8cdc8 (diff)
downloadopenttd-0eef2daf06cdac090107bd36d29717a1da626de1.tar.xz
(svn r2611) - CodeChange: use standardized truncutation with the newsmessage-history window as well
-rw-r--r--news.h2
-rw-r--r--news_gui.c72
2 files changed, 32 insertions, 42 deletions
diff --git a/news.h b/news.h
index 858d3923a..60d7a3e6e 100644
--- a/news.h
+++ b/news.h
@@ -23,7 +23,7 @@ struct NewsItem {
typedef bool ValidationProc ( uint data_a, uint data_b );
typedef void DrawNewsCallbackProc(Window *w);
-typedef StringID GetNewsStringCallbackProc(NewsItem *ni);
+typedef StringID GetNewsStringCallbackProc(const NewsItem *ni);
#define NEWS_FLAGS(mode,flag,type,cb) ((cb)<<24 | (type)<<16 | (flag)<<8 | (mode))
void AddNewsItem(StringID string, uint32 flags, uint data_a, uint data_b);
diff --git a/news_gui.c b/news_gui.c
index 1642fd682..08d284304 100644
--- a/news_gui.c
+++ b/news_gui.c
@@ -47,11 +47,11 @@ void DrawNewsNewAircraftAvail(Window *w);
void DrawNewsBankrupcy(Window *w);
static void MoveToNexItem(void);
-StringID GetNewsStringNewTrainAvail(NewsItem *ni);
-StringID GetNewsStringNewRoadVehAvail(NewsItem *ni);
-StringID GetNewsStringNewShipAvail(NewsItem *ni);
-StringID GetNewsStringNewAircraftAvail(NewsItem *ni);
-StringID GetNewsStringBankrupcy(NewsItem *ni);
+StringID GetNewsStringNewTrainAvail(const NewsItem *ni);
+StringID GetNewsStringNewRoadVehAvail(const NewsItem *ni);
+StringID GetNewsStringNewShipAvail(const NewsItem *ni);
+StringID GetNewsStringNewAircraftAvail(const NewsItem *ni);
+StringID GetNewsStringBankrupcy(const NewsItem *ni);
static DrawNewsCallbackProc * const _draw_news_callback[] = {
DrawNewsNewTrainAvail, /* DNC_TRAINAVAIL */
@@ -555,14 +555,18 @@ static byte getNews(byte i)
return i;
}
-// cut string after len pixels
-static void GetNewsString(NewsItem *ni, char *buffer, uint max)
+/** Draw an unformatted news message truncated to a maximum length. If
+ * length exceeds maximum length it will be postfixed by '...'
+ * @param x,y position of the string
+ * @param color the color the string will be shown in
+ * @param *ni NewsItem being printed
+ * @param maxw maximum width of string in pixels
+ */
+static void DrawNewsString(int x, int y, uint16 color, const NewsItem *ni, uint maxw)
{
- char buf[512];
+ char buffer[512], buffer2[512];
+ char *ptr, *dest;
StringID str;
- const char *s;
- char *d;
- uint len = 0;
if (ni->display_mode == 3) {
str = _get_news_string_callback[ni->callback](ni);
@@ -571,31 +575,21 @@ static void GetNewsString(NewsItem *ni, char *buffer, uint max)
str = ni->string_id;
}
- GetString(buf, str);
-
- s = buf;
- d = buffer;
-
- for (;; s++) {
- // cut strings that are too long
- if (len >= max-24) { // add 3x "." at the end
- d[0] = d[1] = d[2] = '.';
- d += 3;
- *d = '\0';
- break;
- }
-
- if (*s == '\0') {
- *d = '\0';
- break;
- } else if (*s == '\r') {
- d[0] = d[1] = d[2] = d[3] = ' ';
- d += 4;
- } else if ((byte)*s >= ' ' && ((byte)*s < 0x88 || (byte)*s >= 0x99)) {
- len += GetCharacterWidth((byte)*s);
- *d++ = *s;
+ GetString(buffer, str);
+ /* Copy the just gotten string to another buffer to remove any formatting
+ * from it such as big fonts, etc. */
+ for (ptr = buffer, dest = buffer2; *ptr != '\0'; ptr++) {
+ if ((byte)*ptr == '\r') {
+ dest[0] = dest[1] = dest[2] = dest[3] = ' ';
+ dest += 4;
+ } else if ((byte)*ptr >= ' ' && ((byte)*ptr < 0x88 || (byte)*ptr >= 0x99)) {
+ *dest++ = *ptr;
}
}
+
+ *dest = '\0';
+ /* Truncate and show string; postfixed by '...' if neccessary */
+ DoDrawStringTruncated(buffer2, x, y, color, maxw);
}
@@ -605,7 +599,6 @@ static void MessageHistoryWndProc(Window *w, WindowEvent *e)
case WE_PAINT: {
int y = 19;
byte p, show;
- NewsItem *ni;
DrawWindowWidgets(w);
@@ -613,16 +606,13 @@ static void MessageHistoryWndProc(Window *w, WindowEvent *e)
show = min(_total_news, w->vscroll.cap);
for (p = w->vscroll.pos; p < w->vscroll.pos + show; p++) {
- char buffer[256];
-
// get news in correct order
- ni = &_news_items[getNews(p)];
+ const NewsItem *ni = &_news_items[getNews(p)];
SetDParam(0, ni->date);
- DrawString(4, y, STR_SHORT_DATE, 16);
+ DrawString(4, y, STR_SHORT_DATE, 12);
- GetNewsString(ni, buffer, w->width-90);
- DoDrawString(buffer, 82, y, 16);
+ DrawNewsString(82, y, 12, ni, w->width - 95);
y += 12;
}