Return empty string from wxColour::GetAsString() if it's invalid

This is consistent with wxToString(wxColour) and seems more useful than
either returning black string representation (as wxMSW used to do) or
asserting (as wxGTK did).

Document this behaviour and add a test checking for it.

Closes #18623.
This commit is contained in:
Vadim Zeitlin
2020-07-11 14:31:54 +02:00
parent 5d14346325
commit 9890cf6bac
3 changed files with 18 additions and 4 deletions

View File

@@ -113,10 +113,11 @@ public:
@c wxC2S_HTML_SYNTAX, to obtain the colour as "#" followed by 6 @c wxC2S_HTML_SYNTAX, to obtain the colour as "#" followed by 6
hexadecimal digits (e.g. wxColour(255,0,0) == "#FF0000"). hexadecimal digits (e.g. wxColour(255,0,0) == "#FF0000").
This function never fails and always returns a non-empty string but This function returns empty string if the colour is not initialized
asserts if the colour has alpha channel (i.e. is non opaque) but (see IsOk()). Otherwise, the returned string is always non-empty, but
@c wxC2S_CSS_SYNTAX (which is the only one supporting alpha) is not the function asserts if the colour has alpha channel (i.e. is non
specified in flags. opaque) but @c wxC2S_CSS_SYNTAX (which is the only one supporting
alpha) is not specified in @a flags.
@note For non-solid (i.e. non-RGB) colour this function returns @note For non-solid (i.e. non-RGB) colour this function returns
"rgb(??, ?? ??)" or "#??????". "rgb(??, ?? ??)" or "#??????".

View File

@@ -218,6 +218,9 @@ bool wxColourBase::FromString(const wxString& str)
wxString wxColourBase::GetAsString(long flags) const wxString wxColourBase::GetAsString(long flags) const
{ {
if ( !IsOk() )
return wxString();
wxString colName; wxString colName;
if ( IsSolid() ) if ( IsSolid() )

View File

@@ -145,6 +145,16 @@ TEST_CASE("wxColour::FromString", "[colour][string]")
CHECK( !wxFromString("rgba(1, 2, 3.456, foo)", &col) ); CHECK( !wxFromString("rgba(1, 2, 3.456, foo)", &col) );
} }
TEST_CASE("wxColour::GetAsString", "[colour][string]")
{
CHECK( wxColour().GetAsString() == "" );
wxColour red("red");
CHECK( red.GetAsString() == "red" );
CHECK( red.GetAsString(wxC2S_CSS_SYNTAX) == "rgb(255, 0, 0)" );
CHECK( red.GetAsString(wxC2S_HTML_SYNTAX) == "#FF0000" );
}
TEST_CASE("wxColour::GetLuminance", "[colour][luminance]") TEST_CASE("wxColour::GetLuminance", "[colour][luminance]")
{ {
CHECK( wxBLACK->GetLuminance() == Approx(0.0) ); CHECK( wxBLACK->GetLuminance() == Approx(0.0) );