diff options
author | yexo <yexo@openttd.org> | 2012-01-12 19:11:51 +0000 |
---|---|---|
committer | yexo <yexo@openttd.org> | 2012-01-12 19:11:51 +0000 |
commit | b1a830491aa01218cf0ec699269bd5d6a107f6f8 (patch) | |
tree | 8d7a388597837627e9bba12460d25777fac50885 | |
parent | 1ea634fcba9a2a03b0cfe07c05d307ee0e0152c6 (diff) | |
download | openttd-b1a830491aa01218cf0ec699269bd5d6a107f6f8.tar.xz |
(svn r23791) -Fix [FS#4960]: resize text panel for parameter description if it doesn't fit in 4 lines.
If you resize the window so it's smaller than default the text might still not fit
-rw-r--r-- | src/gfx.cpp | 30 | ||||
-rw-r--r-- | src/gfx_func.h | 1 | ||||
-rw-r--r-- | src/newgrf_gui.cpp | 12 |
3 files changed, 42 insertions, 1 deletions
diff --git a/src/gfx.cpp b/src/gfx.cpp index 5dcd9a09d..55721e052 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -821,6 +821,36 @@ Dimension GetStringMultiLineBoundingBox(StringID str, const Dimension &suggestio return box; } + +/** + * Calculates height of string (in pixels). The string is changed to a multiline string if needed. + * @param str string to check + * @param maxw maximum string width + * @return height of pixels of string when it is drawn + */ +int GetStringHeight(const char *str, int maxw) +{ + char buffer[DRAW_STRING_BUFFER]; + + strecpy(buffer, str, lastof(buffer)); + + uint32 tmp = FormatStringLinebreaks(buffer, lastof(buffer), maxw); + + return GetMultilineStringHeight(buffer, GB(tmp, 0, 16), FS_NORMAL); +} + +/** + * Calculate string bounding box for multi-line strings. + * @param str String to check. + * @param suggestion Suggested bounding box. + * @return Bounding box for the multi-line string, may be bigger than \a suggestion. + */ +Dimension GetStringMultiLineBoundingBox(const char *str, const Dimension &suggestion) +{ + Dimension box = {suggestion.width, GetStringHeight(str, suggestion.width)}; + return box; +} + /** * Draw string, possibly over multiple lines. * diff --git a/src/gfx_func.h b/src/gfx_func.h index 544c6174e..49d2d35a3 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -125,6 +125,7 @@ Dimension GetStringBoundingBox(StringID strid); uint32 FormatStringLinebreaks(char *str, const char *last, int maxw, FontSize start_fontsize = FS_NORMAL); int GetStringHeight(StringID str, int maxw); Dimension GetStringMultiLineBoundingBox(StringID str, const Dimension &suggestion); +Dimension GetStringMultiLineBoundingBox(const char *str, const Dimension &suggestion); void LoadStringWidthTable(bool monospace = false); void DrawDirtyBlocks(); diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index 95d88abd1..79a845ad0 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -211,7 +211,17 @@ struct NewGRFParametersWindow : public Window { break; case WID_NP_DESCRIPTION: - size->height = max<uint>(size->height, FONT_HEIGHT_NORMAL * 4 + WD_TEXTPANEL_TOP + WD_TEXTPANEL_BOTTOM); + /* Minimum size of 4 lines. The 500 is the default size of the window. */ + Dimension suggestion = {500 - WD_FRAMERECT_LEFT - WD_FRAMERECT_RIGHT, FONT_HEIGHT_NORMAL * 4 + WD_TEXTPANEL_TOP + WD_TEXTPANEL_BOTTOM}; + for (uint i = 0; i < this->grf_config->param_info.Length(); i++) { + const GRFParameterInfo *par_info = this->grf_config->param_info[i]; + if (par_info == NULL) continue; + const char *desc = GetGRFStringFromGRFText(par_info->desc); + if (desc == NULL) continue; + const Dimension d = GetStringMultiLineBoundingBox(desc, suggestion); + suggestion = maxdim(d, suggestion); + } + size->height = suggestion.height; break; } } |