From 45df4bb6c238e3c42765af9454c15ad814d7a80a Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 28 Sep 2012 23:48:34 +0000 Subject: [PATCH] Add "inherit" to XRC tag. This allows to construct a font based on the parent window font instead of either fully specifying all font parameters or basing it on a standard font. Closes #14632. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72572 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + docs/doxygen/overviews/xrc_format.h | 22 ++++++++---- include/wx/xrc/xmlres.h | 2 +- samples/xrc/rc/controls.xrc | 53 ++++++++++++++++++++++++++--- src/xrc/xh_listc.cpp | 2 +- src/xrc/xmlres.cpp | 21 +++++++++--- 6 files changed, 85 insertions(+), 16 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 1c45e52d1d..c2ed7071b7 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -557,6 +557,7 @@ All (GUI): - Fix text origin and extent computations in wxSVGFileDC (Neil Chittenden). - Show tooltips for the too long items in generic wxTreeCtrl (Steven Houchins). - Add wxStyledTextCtrl::AnnotationClearLine() (sentieshar). +- Add "inherit" to XRC tag (Steffen Olszewski, Gero Meßsysteme GmbH). wxGTK: diff --git a/docs/doxygen/overviews/xrc_format.h b/docs/doxygen/overviews/xrc_format.h index eb9f73e49b..84e60f92fb 100644 --- a/docs/doxygen/overviews/xrc_format.h +++ b/docs/doxygen/overviews/xrc_format.h @@ -402,7 +402,8 @@ Examples: XRC uses similar, but more flexible, abstract description of fonts to that used by wxFont class. A font can be described either in terms of its elementary -properties, or it can be derived from one of system fonts. +properties, or it can be derived from one of system fonts or the parent window +font. The font property element is "composite" element: unlike majority of properties, it doesn't have text value but contains several child elements @@ -413,7 +414,8 @@ and can be one of the following "sub-properties": @hdr3col{property, type, description} @row3col{size, unsigned integer, Pixel size of the font (default: wxNORMAL_FONT's size or @c sysfont's - size if the @c sysfont property is used.} + size if the @c sysfont property is used or the current size of the font + of the enclosing control if the @c inherit property is used.} @row3col{style, enum, One of "normal", "italic" or "slant" (default: normal).} @row3col{weight, enum, @@ -431,14 +433,18 @@ and can be one of the following "sub-properties": (default: unspecified).} @row3col{sysfont, , Symbolic name of system standard font(one of wxSYS_*_FONT constants).} +@row3col{inherit, @ref overview_xrcformat_type_bool, + If true, the font of the enclosing control is used. If this property and the + @c sysfont property are specified the @c sysfont property takes precedence.} @row3col{relativesize, float, - Float, font size relative to chosen system font's size; can only be - used when 'sysfont' is used and when 'size' is not used.} + Float, font size relative to chosen system font's or inherited font's size; + can only be used when 'sysfont' or 'inherit' is used and when 'size' is not + used.} @endTable All of them are optional, if they are missing, appropriate wxFont default is -used. If the @c sysfont property is used, then the defaults are taken from it -instead. +used. If the @c sysfont or @c inherit property is used, then the defaults are +taken from it instead. Examples: @code @@ -456,6 +462,10 @@ Examples: @endcode +@note You cannot use @c inherit for a font that gets used before the enclosing + control is created, e.g. if the control gets the font passed as parameter + for its constructor, or if the control is not derived from wxWindow. + @section overview_xrcformat_windows Controls and Windows diff --git a/include/wx/xrc/xmlres.h b/include/wx/xrc/xmlres.h index 1d226c11af..07a5b90251 100644 --- a/include/wx/xrc/xmlres.h +++ b/include/wx/xrc/xmlres.h @@ -594,7 +594,7 @@ protected: #endif // Gets a font. - wxFont GetFont(const wxString& param = wxT("font")); + wxFont GetFont(const wxString& param = wxT("font"), wxWindow* parent = NULL); // Gets the value of a boolean attribute (only "0" and "1" are valid values) bool GetBoolAttr(const wxString& attr, bool defaultv); diff --git a/samples/xrc/rc/controls.xrc b/samples/xrc/rc/controls.xrc index 0a7306146e..b14bade14e 100644 --- a/samples/xrc/rc/controls.xrc +++ b/samples/xrc/rc/controls.xrc @@ -934,18 +934,63 @@ lay them out using wxSizers, absolute positioning, everything you like! + + 12 + - 1 + 2 0 0 0 - 0 - 0 + 0,1 + 0,1,2 - wxALIGN_CENTRE|wxALL + wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL|wxALL + 5 + + + + + + wxALIGN_LEFT|wxALIGN_CENTRE_VERTICAL + 5 + + + + + + wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL|wxALL + 5 + + + + + + wxALIGN_LEFT|wxALIGN_CENTRE_VERTICAL + 5 + + + + bold + + + + + wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL|wxALL + 5 + + + + + + wxALIGN_LEFT|wxALIGN_CENTRE_VERTICAL 5 + + 1 + bold + diff --git a/src/xrc/xh_listc.cpp b/src/xrc/xh_listc.cpp index acce070d34..b9a9c2d059 100644 --- a/src/xrc/xh_listc.cpp +++ b/src/xrc/xh_listc.cpp @@ -150,7 +150,7 @@ void wxListCtrlXmlHandler::HandleListItem() if (HasParam(wxT("data"))) item.SetData(GetLong(wxT("data"))); if (HasParam(wxT("font"))) - item.SetFont(GetFont()); + item.SetFont(GetFont(wxT("font"), list)); if (HasParam(wxT("state"))) item.SetState(GetStyle(wxT("state"))); if (HasParam(wxT("textcolour"))) diff --git a/src/xrc/xmlres.cpp b/src/xrc/xmlres.cpp index f39611943b..8e41d39e5e 100644 --- a/src/xrc/xmlres.cpp +++ b/src/xrc/xmlres.cpp @@ -2201,7 +2201,7 @@ static wxFont GetSystemFont(const wxString& name) return wxNullFont; } -wxFont wxXmlResourceHandler::GetFont(const wxString& param) +wxFont wxXmlResourceHandler::GetFont(const wxString& param, wxWindow* parent) { wxXmlNode *font_node = GetParamNode(param); if (font_node == NULL) @@ -2304,8 +2304,21 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param) } #endif // wxUSE_FONTMAP + wxFont font; + // is this font based on a system font? - wxFont font = GetSystemFont(GetParamValue(wxT("sysfont"))); + if (HasParam(wxT("sysfont"))) + { + font = GetSystemFont(GetParamValue(wxT("sysfont"))); + } + // or should the font of the widget be used? + else if (GetBool(wxT("inherit"), false)) + { + if (parent) + font = parent->GetFont(); + else + ReportError("no parent window specified to derive the font from"); + } if (font.IsOk()) { @@ -2368,9 +2381,9 @@ void wxXmlResourceHandler::SetupWindow(wxWindow *wnd) wnd->SetToolTip(GetText(wxT("tooltip"))); #endif if (HasParam(wxT("font"))) - wnd->SetFont(GetFont(wxT("font"))); + wnd->SetFont(GetFont(wxT("font"), wnd)); if (HasParam(wxT("ownfont"))) - wnd->SetOwnFont(GetFont(wxT("ownfont"))); + wnd->SetOwnFont(GetFont(wxT("ownfont"), wnd)); if (HasParam(wxT("help"))) wnd->SetHelpText(GetText(wxT("help"))); } -- 2.45.2