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:
@@ -111,6 +111,7 @@ Changes in behaviour which may result in build errors
|
||||
All (GUI):
|
||||
|
||||
- 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)
|
||||
|
@@ -23,8 +23,6 @@ public:
|
||||
m_isPressed = false;
|
||||
}
|
||||
|
||||
virtual bool Enable( bool enable = true ) wxOVERRIDE;
|
||||
|
||||
// implementation
|
||||
// --------------
|
||||
|
||||
@@ -41,6 +39,8 @@ public:
|
||||
protected:
|
||||
virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const wxOVERRIDE;
|
||||
|
||||
virtual void DoEnable(bool enable) wxOVERRIDE;
|
||||
|
||||
virtual wxBitmap DoGetBitmap(State which) const wxOVERRIDE;
|
||||
virtual void DoSetBitmap(const wxBitmap& bitmap, State which) wxOVERRIDE;
|
||||
virtual void DoSetBitmapPosition(wxDirection dir) wxOVERRIDE;
|
||||
|
@@ -39,7 +39,6 @@ public:
|
||||
bool GetValue() const wxOVERRIDE;
|
||||
|
||||
virtual void SetLabel( const wxString& label ) wxOVERRIDE;
|
||||
virtual bool Enable( bool enable = true ) wxOVERRIDE;
|
||||
|
||||
static wxVisualAttributes
|
||||
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
|
||||
@@ -52,6 +51,8 @@ protected:
|
||||
virtual void DoApplyWidgetStyle(GtkRcStyle *style) wxOVERRIDE;
|
||||
virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const wxOVERRIDE;
|
||||
|
||||
virtual void DoEnable(bool enable) wxOVERRIDE;
|
||||
|
||||
void DoSet3StateValue(wxCheckBoxState state) wxOVERRIDE;
|
||||
wxCheckBoxState DoGet3StateValue() const wxOVERRIDE;
|
||||
|
||||
|
@@ -141,6 +141,8 @@ protected:
|
||||
virtual void DoApplyWidgetStyle(GtkRcStyle *style) wxOVERRIDE;
|
||||
virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const wxOVERRIDE;
|
||||
|
||||
virtual void DoEnable(bool enable) wxOVERRIDE;
|
||||
|
||||
virtual bool GTKNeedsToFilterSameWindowFocus() const wxOVERRIDE { return true; }
|
||||
|
||||
virtual bool GTKWidgetNeedsMnemonic() const wxOVERRIDE;
|
||||
|
@@ -41,7 +41,6 @@ public:
|
||||
virtual void SetLabel(const wxString& label) wxOVERRIDE;
|
||||
virtual void SetValue(bool val);
|
||||
virtual bool GetValue() const;
|
||||
virtual bool Enable( bool enable = true ) wxOVERRIDE;
|
||||
|
||||
static wxVisualAttributes
|
||||
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
|
||||
@@ -52,6 +51,8 @@ protected:
|
||||
virtual void DoApplyWidgetStyle(GtkRcStyle *style) wxOVERRIDE;
|
||||
virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const wxOVERRIDE;
|
||||
|
||||
virtual void DoEnable(bool enable) wxOVERRIDE;
|
||||
|
||||
private:
|
||||
typedef wxControl base_type;
|
||||
|
||||
|
@@ -44,8 +44,6 @@ public:
|
||||
static wxVisualAttributes
|
||||
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
|
||||
|
||||
virtual bool Enable( bool enable = true ) wxOVERRIDE;
|
||||
|
||||
// implementation
|
||||
int m_pos;
|
||||
|
||||
@@ -56,6 +54,8 @@ protected:
|
||||
virtual wxSize DoGetBestSize() const wxOVERRIDE;
|
||||
virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const wxOVERRIDE;
|
||||
|
||||
virtual void DoEnable(bool enable) wxOVERRIDE;
|
||||
|
||||
private:
|
||||
typedef wxSpinButtonBase base_type;
|
||||
|
||||
|
@@ -95,7 +95,6 @@ public:
|
||||
|
||||
// Overridden wxWindow methods
|
||||
virtual void SetWindowStyleFlag( long style ) wxOVERRIDE;
|
||||
virtual bool Enable( bool enable = true ) wxOVERRIDE;
|
||||
|
||||
// Implementation from now on
|
||||
void OnDropFiles( wxDropFilesEvent &event );
|
||||
@@ -178,6 +177,8 @@ protected:
|
||||
private:
|
||||
void Init();
|
||||
|
||||
virtual void DoEnable(bool enable) wxOVERRIDE;
|
||||
|
||||
// overridden wxTextEntry virtual methods
|
||||
virtual GtkEditable *GetEditable() const wxOVERRIDE;
|
||||
virtual GtkEntry *GetEntry() const wxOVERRIDE;
|
||||
|
@@ -2834,6 +2834,14 @@ public:
|
||||
disabled, all of its children are disabled as well and they are reenabled again
|
||||
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
|
||||
If @true, enables the window for input. If @false, disables the window.
|
||||
|
||||
|
@@ -69,10 +69,13 @@ wxgtk_button_released_callback(GtkWidget *WXUNUSED(widget), wxAnyButton *button)
|
||||
// wxAnyButton
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
bool wxAnyButton::Enable( bool enable )
|
||||
void wxAnyButton::DoEnable(bool enable)
|
||||
{
|
||||
if (!base_type::Enable(enable))
|
||||
return false;
|
||||
// See wxWindow::DoEnable()
|
||||
if ( !m_widget )
|
||||
return;
|
||||
|
||||
base_type::DoEnable(enable);
|
||||
|
||||
gtk_widget_set_sensitive(gtk_bin_get_child(GTK_BIN(m_widget)), enable);
|
||||
|
||||
@@ -80,8 +83,6 @@ bool wxAnyButton::Enable( bool enable )
|
||||
GTKFixSensitivity();
|
||||
|
||||
GTKUpdateBitmap();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
GdkWindow *wxAnyButton::GTKGetWindow(wxArrayGdkWindows& WXUNUSED(windows)) const
|
||||
|
@@ -222,17 +222,17 @@ void wxCheckBox::SetLabel( const wxString& label )
|
||||
GTKSetLabelForLabel(GTK_LABEL(m_widgetLabel), label);
|
||||
}
|
||||
|
||||
bool wxCheckBox::Enable( bool enable )
|
||||
void wxCheckBox::DoEnable(bool enable)
|
||||
{
|
||||
if (!base_type::Enable(enable))
|
||||
return false;
|
||||
if ( !m_widgetLabel )
|
||||
return;
|
||||
|
||||
base_type::DoEnable(enable);
|
||||
|
||||
gtk_widget_set_sensitive( m_widgetLabel, enable );
|
||||
|
||||
if (enable)
|
||||
GTKFixSensitivity();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void wxCheckBox::DoApplyWidgetStyle(GtkRcStyle *style)
|
||||
|
@@ -487,8 +487,18 @@ void wxRadioBox::SetString(unsigned int item, const wxString& label)
|
||||
|
||||
bool wxRadioBox::Enable( bool enable )
|
||||
{
|
||||
if ( !wxControl::Enable( enable ) )
|
||||
return false;
|
||||
// Explicitly forward to the base class just because we need to override
|
||||
// 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();
|
||||
while (node)
|
||||
@@ -503,8 +513,6 @@ bool wxRadioBox::Enable( bool enable )
|
||||
|
||||
if (enable)
|
||||
GTKFixSensitivity();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool wxRadioBox::Enable(unsigned int item, bool enable)
|
||||
|
@@ -149,17 +149,17 @@ bool wxRadioButton::GetValue() const
|
||||
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))
|
||||
return false;
|
||||
if ( !m_widget )
|
||||
return;
|
||||
|
||||
base_type::DoEnable(enable);
|
||||
|
||||
gtk_widget_set_sensitive(gtk_bin_get_child(GTK_BIN(m_widget)), enable);
|
||||
|
||||
if (enable)
|
||||
GTKFixSensitivity();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void wxRadioButton::DoApplyWidgetStyle(GtkRcStyle *style)
|
||||
|
@@ -173,16 +173,16 @@ void wxSpinButton::SetRange(int minVal, int maxVal)
|
||||
GtkEnableEvents();
|
||||
}
|
||||
|
||||
bool wxSpinButton::Enable( bool enable )
|
||||
void wxSpinButton::DoEnable(bool enable)
|
||||
{
|
||||
if (!base_type::Enable(enable))
|
||||
return false;
|
||||
if ( !m_widget )
|
||||
return;
|
||||
|
||||
base_type::DoEnable(enable);
|
||||
|
||||
// Work around lack of visual update when enabling
|
||||
if (enable)
|
||||
GTKFixSensitivity(false /* fix even if not under mouse */);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void wxSpinButton::GtkDisableEvents() const
|
||||
|
@@ -1350,17 +1350,14 @@ void wxTextCtrl::SetEditable( bool editable )
|
||||
}
|
||||
}
|
||||
|
||||
bool wxTextCtrl::Enable( bool enable )
|
||||
void wxTextCtrl::DoEnable(bool enable)
|
||||
{
|
||||
if (!wxWindowBase::Enable(enable))
|
||||
{
|
||||
// nothing to do
|
||||
return false;
|
||||
}
|
||||
if ( !m_text )
|
||||
return;
|
||||
|
||||
wxTextCtrlBase::DoEnable(enable);
|
||||
|
||||
gtk_widget_set_sensitive( m_text, enable );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void wxTextCtrl::MarkDirty()
|
||||
|
@@ -2913,6 +2913,11 @@ void wxWindowGTK::PostCreation()
|
||||
|
||||
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
|
||||
// called before Create()), we should show it at GTK+ level as well
|
||||
if (m_isShown)
|
||||
@@ -4196,7 +4201,12 @@ bool wxWindowGTK::IsShown() const
|
||||
|
||||
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 );
|
||||
if (m_wxwindow && (m_wxwindow != m_widget))
|
||||
|
@@ -1518,6 +1518,9 @@ WXDWORD wxWindowMSW::MSWGetStyle(long flags, WXDWORD *exstyle) const
|
||||
// wxTopLevelWindow) should remove WS_CHILD in their MSWGetStyle()
|
||||
WXDWORD style = WS_CHILD;
|
||||
|
||||
if ( !IsThisEnabled() )
|
||||
style |= WS_DISABLED;
|
||||
|
||||
// using this flag results in very significant reduction in flicker,
|
||||
// especially with controls inside the static boxes (as the interior of the
|
||||
// box is not redrawn twice), but sometimes results in redraw problems, so
|
||||
|
@@ -102,8 +102,21 @@ void ButtonTestCase::Disabled()
|
||||
|
||||
wxUIActionSimulator sim;
|
||||
|
||||
//In this test we disable the button and check events are not sent
|
||||
m_button->Disable();
|
||||
// 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();
|
||||
}
|
||||
|
||||
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));
|
||||
wxYield();
|
||||
|
Reference in New Issue
Block a user