Merge branch 'window-create-disabled'

Make calling wxWindow::Disable() before wxWindow::Create() work.

See https://github.com/wxWidgets/wxWidgets/pull/1071

Closes #16385.
This commit is contained in:
Vadim Zeitlin
2018-12-12 18:24:10 +01:00
17 changed files with 88 additions and 42 deletions

View File

@@ -111,6 +111,7 @@ Changes in behaviour which may result in build errors
All (GUI): All (GUI):
- Fix wxInfoBar close button size in high DPI (Stefan Ziegler). - Fix wxInfoBar close button size in high DPI (Stefan Ziegler).
- Make disabling the window before creating it actually work.
3.1.2: (released 2018-12-10) 3.1.2: (released 2018-12-10)

View File

@@ -23,8 +23,6 @@ public:
m_isPressed = false; m_isPressed = false;
} }
virtual bool Enable( bool enable = true ) wxOVERRIDE;
// implementation // implementation
// -------------- // --------------
@@ -41,6 +39,8 @@ public:
protected: protected:
virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const wxOVERRIDE; virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const wxOVERRIDE;
virtual void DoEnable(bool enable) wxOVERRIDE;
virtual wxBitmap DoGetBitmap(State which) const wxOVERRIDE; virtual wxBitmap DoGetBitmap(State which) const wxOVERRIDE;
virtual void DoSetBitmap(const wxBitmap& bitmap, State which) wxOVERRIDE; virtual void DoSetBitmap(const wxBitmap& bitmap, State which) wxOVERRIDE;
virtual void DoSetBitmapPosition(wxDirection dir) wxOVERRIDE; virtual void DoSetBitmapPosition(wxDirection dir) wxOVERRIDE;

View File

@@ -39,7 +39,6 @@ public:
bool GetValue() const wxOVERRIDE; bool GetValue() const wxOVERRIDE;
virtual void SetLabel( const wxString& label ) wxOVERRIDE; virtual void SetLabel( const wxString& label ) wxOVERRIDE;
virtual bool Enable( bool enable = true ) wxOVERRIDE;
static wxVisualAttributes static wxVisualAttributes
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
@@ -52,6 +51,8 @@ protected:
virtual void DoApplyWidgetStyle(GtkRcStyle *style) wxOVERRIDE; virtual void DoApplyWidgetStyle(GtkRcStyle *style) wxOVERRIDE;
virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const wxOVERRIDE; virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const wxOVERRIDE;
virtual void DoEnable(bool enable) wxOVERRIDE;
void DoSet3StateValue(wxCheckBoxState state) wxOVERRIDE; void DoSet3StateValue(wxCheckBoxState state) wxOVERRIDE;
wxCheckBoxState DoGet3StateValue() const wxOVERRIDE; wxCheckBoxState DoGet3StateValue() const wxOVERRIDE;

View File

@@ -141,6 +141,8 @@ protected:
virtual void DoApplyWidgetStyle(GtkRcStyle *style) wxOVERRIDE; virtual void DoApplyWidgetStyle(GtkRcStyle *style) wxOVERRIDE;
virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const wxOVERRIDE; virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const wxOVERRIDE;
virtual void DoEnable(bool enable) wxOVERRIDE;
virtual bool GTKNeedsToFilterSameWindowFocus() const wxOVERRIDE { return true; } virtual bool GTKNeedsToFilterSameWindowFocus() const wxOVERRIDE { return true; }
virtual bool GTKWidgetNeedsMnemonic() const wxOVERRIDE; virtual bool GTKWidgetNeedsMnemonic() const wxOVERRIDE;

View File

@@ -41,7 +41,6 @@ public:
virtual void SetLabel(const wxString& label) wxOVERRIDE; virtual void SetLabel(const wxString& label) wxOVERRIDE;
virtual void SetValue(bool val); virtual void SetValue(bool val);
virtual bool GetValue() const; virtual bool GetValue() const;
virtual bool Enable( bool enable = true ) wxOVERRIDE;
static wxVisualAttributes static wxVisualAttributes
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
@@ -52,6 +51,8 @@ protected:
virtual void DoApplyWidgetStyle(GtkRcStyle *style) wxOVERRIDE; virtual void DoApplyWidgetStyle(GtkRcStyle *style) wxOVERRIDE;
virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const wxOVERRIDE; virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const wxOVERRIDE;
virtual void DoEnable(bool enable) wxOVERRIDE;
private: private:
typedef wxControl base_type; typedef wxControl base_type;

View File

@@ -44,8 +44,6 @@ public:
static wxVisualAttributes static wxVisualAttributes
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
virtual bool Enable( bool enable = true ) wxOVERRIDE;
// implementation // implementation
int m_pos; int m_pos;
@@ -56,6 +54,8 @@ protected:
virtual wxSize DoGetBestSize() const wxOVERRIDE; virtual wxSize DoGetBestSize() const wxOVERRIDE;
virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const wxOVERRIDE; virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const wxOVERRIDE;
virtual void DoEnable(bool enable) wxOVERRIDE;
private: private:
typedef wxSpinButtonBase base_type; typedef wxSpinButtonBase base_type;

View File

@@ -95,7 +95,6 @@ public:
// Overridden wxWindow methods // Overridden wxWindow methods
virtual void SetWindowStyleFlag( long style ) wxOVERRIDE; virtual void SetWindowStyleFlag( long style ) wxOVERRIDE;
virtual bool Enable( bool enable = true ) wxOVERRIDE;
// Implementation from now on // Implementation from now on
void OnDropFiles( wxDropFilesEvent &event ); void OnDropFiles( wxDropFilesEvent &event );
@@ -178,6 +177,8 @@ protected:
private: private:
void Init(); void Init();
virtual void DoEnable(bool enable) wxOVERRIDE;
// overridden wxTextEntry virtual methods // overridden wxTextEntry virtual methods
virtual GtkEditable *GetEditable() const wxOVERRIDE; virtual GtkEditable *GetEditable() const wxOVERRIDE;
virtual GtkEntry *GetEntry() const wxOVERRIDE; virtual GtkEntry *GetEntry() const wxOVERRIDE;

View File

@@ -2834,6 +2834,14 @@ public:
disabled, all of its children are disabled as well and they are reenabled again disabled, all of its children are disabled as well and they are reenabled again
when the parent is. when the parent is.
A window can be created initially disabled by calling this method on it
@e before calling Create() to create the actual underlying window, e.g.
@code
wxWindow* w = new MyWindow(); // Note: default ctor is used here.
w->Enable(false);
w->Create(parent, ... all the usual non-default ctor arguments ...);
@endcode
@param enable @param enable
If @true, enables the window for input. If @false, disables the window. If @true, enables the window for input. If @false, disables the window.

View File

@@ -69,10 +69,13 @@ wxgtk_button_released_callback(GtkWidget *WXUNUSED(widget), wxAnyButton *button)
// wxAnyButton // wxAnyButton
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool wxAnyButton::Enable( bool enable ) void wxAnyButton::DoEnable(bool enable)
{ {
if (!base_type::Enable(enable)) // See wxWindow::DoEnable()
return false; if ( !m_widget )
return;
base_type::DoEnable(enable);
gtk_widget_set_sensitive(gtk_bin_get_child(GTK_BIN(m_widget)), enable); gtk_widget_set_sensitive(gtk_bin_get_child(GTK_BIN(m_widget)), enable);
@@ -80,8 +83,6 @@ bool wxAnyButton::Enable( bool enable )
GTKFixSensitivity(); GTKFixSensitivity();
GTKUpdateBitmap(); GTKUpdateBitmap();
return true;
} }
GdkWindow *wxAnyButton::GTKGetWindow(wxArrayGdkWindows& WXUNUSED(windows)) const GdkWindow *wxAnyButton::GTKGetWindow(wxArrayGdkWindows& WXUNUSED(windows)) const

View File

@@ -222,17 +222,17 @@ void wxCheckBox::SetLabel( const wxString& label )
GTKSetLabelForLabel(GTK_LABEL(m_widgetLabel), label); GTKSetLabelForLabel(GTK_LABEL(m_widgetLabel), label);
} }
bool wxCheckBox::Enable( bool enable ) void wxCheckBox::DoEnable(bool enable)
{ {
if (!base_type::Enable(enable)) if ( !m_widgetLabel )
return false; return;
base_type::DoEnable(enable);
gtk_widget_set_sensitive( m_widgetLabel, enable ); gtk_widget_set_sensitive( m_widgetLabel, enable );
if (enable) if (enable)
GTKFixSensitivity(); GTKFixSensitivity();
return true;
} }
void wxCheckBox::DoApplyWidgetStyle(GtkRcStyle *style) void wxCheckBox::DoApplyWidgetStyle(GtkRcStyle *style)

View File

@@ -487,8 +487,18 @@ void wxRadioBox::SetString(unsigned int item, const wxString& label)
bool wxRadioBox::Enable( bool enable ) bool wxRadioBox::Enable( bool enable )
{ {
if ( !wxControl::Enable( enable ) ) // Explicitly forward to the base class just because we need to override
return false; // this function to prevent it from being hidden by Enable(int, bool)
// overload.
return wxControl::Enable(enable);
}
void wxRadioBox::DoEnable(bool enable)
{
if ( !m_widget )
return;
wxControl::DoEnable(enable);
wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst(); wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst();
while (node) while (node)
@@ -503,8 +513,6 @@ bool wxRadioBox::Enable( bool enable )
if (enable) if (enable)
GTKFixSensitivity(); GTKFixSensitivity();
return true;
} }
bool wxRadioBox::Enable(unsigned int item, bool enable) bool wxRadioBox::Enable(unsigned int item, bool enable)

View File

@@ -149,17 +149,17 @@ bool wxRadioButton::GetValue() const
return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_widget)) != 0; return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_widget)) != 0;
} }
bool wxRadioButton::Enable( bool enable ) void wxRadioButton::DoEnable(bool enable)
{ {
if (!base_type::Enable(enable)) if ( !m_widget )
return false; return;
base_type::DoEnable(enable);
gtk_widget_set_sensitive(gtk_bin_get_child(GTK_BIN(m_widget)), enable); gtk_widget_set_sensitive(gtk_bin_get_child(GTK_BIN(m_widget)), enable);
if (enable) if (enable)
GTKFixSensitivity(); GTKFixSensitivity();
return true;
} }
void wxRadioButton::DoApplyWidgetStyle(GtkRcStyle *style) void wxRadioButton::DoApplyWidgetStyle(GtkRcStyle *style)

View File

@@ -173,16 +173,16 @@ void wxSpinButton::SetRange(int minVal, int maxVal)
GtkEnableEvents(); GtkEnableEvents();
} }
bool wxSpinButton::Enable( bool enable ) void wxSpinButton::DoEnable(bool enable)
{ {
if (!base_type::Enable(enable)) if ( !m_widget )
return false; return;
base_type::DoEnable(enable);
// Work around lack of visual update when enabling // Work around lack of visual update when enabling
if (enable) if (enable)
GTKFixSensitivity(false /* fix even if not under mouse */); GTKFixSensitivity(false /* fix even if not under mouse */);
return true;
} }
void wxSpinButton::GtkDisableEvents() const void wxSpinButton::GtkDisableEvents() const

View File

@@ -1350,17 +1350,14 @@ void wxTextCtrl::SetEditable( bool editable )
} }
} }
bool wxTextCtrl::Enable( bool enable ) void wxTextCtrl::DoEnable(bool enable)
{ {
if (!wxWindowBase::Enable(enable)) if ( !m_text )
{ return;
// nothing to do
return false; wxTextCtrlBase::DoEnable(enable);
}
gtk_widget_set_sensitive( m_text, enable ); gtk_widget_set_sensitive( m_text, enable );
return true;
} }
void wxTextCtrl::MarkDirty() void wxTextCtrl::MarkDirty()

View File

@@ -2913,6 +2913,11 @@ void wxWindowGTK::PostCreation()
SetLayoutDirection(wxLayout_Default); SetLayoutDirection(wxLayout_Default);
// if the window had been disabled before being created, it should be
// created in the initially disabled state
if ( !m_isEnabled )
DoEnable(false);
// unless the window was created initially hidden (i.e. Hide() had been // unless the window was created initially hidden (i.e. Hide() had been
// called before Create()), we should show it at GTK+ level as well // called before Create()), we should show it at GTK+ level as well
if (m_isShown) if (m_isShown)
@@ -4196,7 +4201,12 @@ bool wxWindowGTK::IsShown() const
void wxWindowGTK::DoEnable( bool enable ) void wxWindowGTK::DoEnable( bool enable )
{ {
wxCHECK_RET( (m_widget != NULL), wxT("invalid window") ); if ( !m_widget )
{
// The window can be disabled before being created, so just don't do
// anything in this case and, in particular, don't assert.
return;
}
gtk_widget_set_sensitive( m_widget, enable ); gtk_widget_set_sensitive( m_widget, enable );
if (m_wxwindow && (m_wxwindow != m_widget)) if (m_wxwindow && (m_wxwindow != m_widget))

View File

@@ -1518,6 +1518,9 @@ WXDWORD wxWindowMSW::MSWGetStyle(long flags, WXDWORD *exstyle) const
// wxTopLevelWindow) should remove WS_CHILD in their MSWGetStyle() // wxTopLevelWindow) should remove WS_CHILD in their MSWGetStyle()
WXDWORD style = WS_CHILD; WXDWORD style = WS_CHILD;
if ( !IsThisEnabled() )
style |= WS_DISABLED;
// using this flag results in very significant reduction in flicker, // using this flag results in very significant reduction in flicker,
// especially with controls inside the static boxes (as the interior of the // especially with controls inside the static boxes (as the interior of the
// box is not redrawn twice), but sometimes results in redraw problems, so // box is not redrawn twice), but sometimes results in redraw problems, so

View File

@@ -102,8 +102,21 @@ void ButtonTestCase::Disabled()
wxUIActionSimulator sim; wxUIActionSimulator sim;
//In this test we disable the button and check events are not sent // In this test we disable the button and check events are not sent and we
// do it once by disabling the previously enabled button and once by
// creating the button in the disabled state.
SECTION("Disable after creation")
{
m_button->Disable(); m_button->Disable();
}
SECTION("Create disabled")
{
delete m_button;
m_button = new wxButton();
m_button->Disable();
m_button->Create(wxTheApp->GetTopWindow(), wxID_ANY, "wxButton");
}
sim.MouseMove(m_button->GetScreenPosition() + wxPoint(10, 10)); sim.MouseMove(m_button->GetScreenPosition() + wxPoint(10, 10));
wxYield(); wxYield();