From 2e289d7231fee91051ccda9bfe68d9d5a2368bdc Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 20 May 2021 00:20:54 +0100 Subject: [PATCH] Add wxSizerFlags::DisableConsistencyChecks() This allows to (hopefully temporarily) disable size flag check asserts. --- docs/changes.txt | 4 +++- include/wx/sizer.h | 3 +++ interface/wx/sizer.h | 23 +++++++++++++++++++++++ src/common/sizer.cpp | 21 +++++++++++++++++---- 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 21d6b8fc75..a189daf42e 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -25,7 +25,9 @@ Changes in behaviour not resulting in compilation errors (it used to succeed in wxMSW). - Using invalid flags with wxBoxSizer or wxGridSizer items now triggers asserts - when done from the code or error messages when done in XRC. + when done from the code or error messages when done in XRC. These asserts are + best avoided by fixing the flags, but wxSizerFlags::DisableConsistencyChecks() + can be used to globally suppress them until this can be done. - wxWS_EX_VALIDATE_RECURSIVELY is now the default behaviour, i.e. calling Validate() or TransferData{From,To}Window() will now also call the same diff --git a/include/wx/sizer.h b/include/wx/sizer.h index c1f234734f..16af934419 100644 --- a/include/wx/sizer.h +++ b/include/wx/sizer.h @@ -238,6 +238,9 @@ public: int GetFlags() const { return m_flags; } int GetBorderInPixels() const { return m_borderInPixels; } + // Disablee sizer flags (in)consistency asserts. + static void DisableConsistencyChecks(); + private: #ifdef wxNEEDS_BORDER_IN_PX static float DoGetDefaultBorderInPx(); diff --git a/interface/wx/sizer.h b/interface/wx/sizer.h index b2dab8d0ac..a1f7508e94 100644 --- a/interface/wx/sizer.h +++ b/interface/wx/sizer.h @@ -1480,6 +1480,29 @@ public: */ wxSizerFlags& CentreVertical(); + /** + Globally disable checks for sizer flag consistency in debug builds. + + By default, sizer classes such as wxBoxSizer and wxFlexGridSizer assert + when passed invalid flags, even though doing this usually doesn't + result in any catastrophic consequences and the invalid flags are + simply ignored later. Due to this, and the fact that these checks were + only added in wxWidgets 3.1, existing code may run into multiple + asserts warning about incorrect sizer flags use. Using this function + provides a temporary solution for avoiding such asserts when upgrading + to wxWidgets 3.1 from a previous version and will prevent such checks + from being done. + + Please do note that correcting the code by removing the invalid flags + remains a much better solution as these asserts may be very helpful to + understand why some code using sizer flags doesn't work as expected, so + using this function, especially permanently, rather than a temporary + workaround, is @e not recommended. + + @since 3.1.6 + */ + static void DisableConsistencyChecks(); + /** Sets the border in the given @a direction having twice the default border size. diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index a06bba72a0..6ed7b1d46d 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -147,6 +147,8 @@ static const int SIZER_FLAGS_MASK = namespace { +bool gs_disableFlagChecks = false; + wxString MakeFlagsCheckMessage(const char* start, const char* whatToRemove) { return wxString::Format @@ -158,7 +160,9 @@ wxString MakeFlagsCheckMessage(const char* start, const char* whatToRemove) "reporting the problem to the program developers.\n" "\n" "If you're the developer, simply remove %s from your code to " - "avoid getting this message.\n", + "avoid getting this message. You can also call " + "wxSizerFlags::DisableConsistencyChecks() to globally disable " + "all such checks, but this is strongly not recommended.", start, whatToRemove ); @@ -171,7 +175,7 @@ wxString MakeFlagsCheckMessage(const char* start, const char* whatToRemove) #define ASSERT_NO_IGNORED_FLAGS_IMPL(f, value, name, explanation) \ wxASSERT_MSG \ ( \ - !((f) & (value)), \ + gs_disableFlagChecks || !((f) & (value)), \ MakeFlagsCheckMessage \ ( \ name " will be ignored in this sizer: " explanation, \ @@ -185,7 +189,7 @@ wxString MakeFlagsCheckMessage(const char* start, const char* whatToRemove) #define ASSERT_INCOMPATIBLE_NOT_USED_IMPL(f, f1, n1, f2, n2) \ wxASSERT_MSG \ ( \ - ((f) & (f1 | f2)) != (f1 | f2), \ + gs_disableFlagChecks || ((f) & (f1 | f2)) != (f1 | f2), \ MakeFlagsCheckMessage \ ( \ "One of " n1 " and " n2 " will be ignored in this sizer: " \ @@ -203,6 +207,14 @@ wxString MakeFlagsCheckMessage(const char* start, const char* whatToRemove) ASSERT_INCOMPATIBLE_NOT_USED(f, wxALIGN_CENTRE_VERTICAL, wxALIGN_BOTTOM) +/* static */ +void wxSizerFlags::DisableConsistencyChecks() +{ +#if wxDEBUG_LEVEL + gs_disableFlagChecks = true; +#endif // wxDEBUG_LEVEL +} + void wxSizerItem::Init(const wxSizerFlags& flags) { Init(); @@ -1515,7 +1527,8 @@ wxSizerItem *wxGridSizer::DoInsert(size_t index, wxSizerItem *item) // Check that expansion will happen in at least one of the directions. wxASSERT_MSG ( - !(flags & (wxALIGN_BOTTOM | wxALIGN_CENTRE_VERTICAL)) || + gs_disableFlagChecks || + !(flags & (wxALIGN_BOTTOM | wxALIGN_CENTRE_VERTICAL)) || !(flags & (wxALIGN_RIGHT | wxALIGN_CENTRE_HORIZONTAL)), MakeFlagsCheckMessage (