// Name: src/gtk/slider.cpp
// Purpose:
// Author: Robert Roebling
-// Id: $Id$
// Copyright: (c) 1998 Robert Roebling
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
}
// and also generate a command event for compatibility
- wxCommandEvent event( wxEVT_COMMAND_SLIDER_UPDATED, win->GetId() );
+ wxCommandEvent event( wxEVT_SLIDER, win->GetId() );
event.SetEventObject( win );
event.SetInt( value );
win->HandleWindowEvent( event );
const double oldPos = win->m_pos;
win->m_pos = value;
- if (!win->m_hasVMT || g_blockEventsOnDrag)
+ if (g_blockEventsOnDrag)
return;
if (win->GTKEventsDisabled())
wxSlider::wxSlider()
{
- m_pos = 0;
- m_scrollEventType = GTK_SCROLL_NONE;
- m_needThumbRelease = false;
- m_blockScrollEvent = false;
+ m_scale = NULL;
+}
+
+wxSlider::~wxSlider()
+{
+ if (m_scale && m_scale != m_widget)
+ GTKDisconnect(m_scale);
}
bool wxSlider::Create(wxWindow *parent,
{
m_pos = value;
m_scrollEventType = GTK_SCROLL_NONE;
+ m_needThumbRelease = false;
+ m_blockScrollEvent = false;
if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, validator, name ))
return false;
}
-
- if (style & wxSL_VERTICAL)
- m_scale = gtk_vscale_new( NULL );
- else
- m_scale = gtk_hscale_new( NULL );
- g_object_ref(m_scale);
+ const bool isVertical = (style & wxSL_VERTICAL) != 0;
+ m_scale = gtk_scale_new(GtkOrientation(isVertical), NULL);
if (style & wxSL_MIN_MAX_LABELS)
{
gtk_widget_show( m_scale );
- if (style & wxSL_VERTICAL)
- m_widget = gtk_hbox_new(false, 0);
- else
- m_widget = gtk_vbox_new(false, 0);
- g_object_ref(m_widget);
- gtk_widget_show( m_widget );
- gtk_container_add( GTK_CONTAINER(m_widget), m_scale );
-
- GtkWidget *box;
- if (style & wxSL_VERTICAL)
- box = gtk_vbox_new(false,0);
- else
- box = gtk_hbox_new(false,0);
- g_object_ref(box);
+ m_widget = gtk_box_new(GtkOrientation(!isVertical), 0);
+ gtk_box_pack_start(GTK_BOX(m_widget), m_scale, true, true, 0);
+
+ GtkWidget* box = gtk_box_new(GtkOrientation(isVertical), 0);
gtk_widget_show(box);
- gtk_container_add( GTK_CONTAINER(m_widget), box );
+ gtk_box_pack_start(GTK_BOX(m_widget), box, true, true, 0);
m_minLabel = gtk_label_new(NULL);
- g_object_ref(m_minLabel);
gtk_widget_show( m_minLabel );
- gtk_container_add( GTK_CONTAINER(box), m_minLabel );
- gtk_box_set_child_packing( GTK_BOX(box), m_minLabel, FALSE, FALSE, 0, GTK_PACK_START );
+ gtk_box_pack_start(GTK_BOX(box), m_minLabel, false, false, 0);
// expanding empty space between the min/max labels
GtkWidget *space = gtk_label_new(NULL);
- g_object_ref(space);
gtk_widget_show( space );
- gtk_container_add( GTK_CONTAINER(box), space );
- gtk_box_set_child_packing( GTK_BOX(box), space, TRUE, FALSE, 0, GTK_PACK_START );
+ gtk_box_pack_start(GTK_BOX(box), space, true, false, 0);
m_maxLabel = gtk_label_new(NULL);
- g_object_ref(m_maxLabel);
gtk_widget_show( m_maxLabel );
- gtk_container_add( GTK_CONTAINER(box), m_maxLabel );
- gtk_box_set_child_packing( GTK_BOX(box), m_maxLabel, FALSE, FALSE, 0, GTK_PACK_END );
+ gtk_box_pack_end(GTK_BOX(box), m_maxLabel, false, false, 0);
}
else
{
m_maxLabel = NULL;
m_minLabel = NULL;
}
+ g_object_ref(m_widget);
const bool showValueLabel = (style & wxSL_VALUE_LABEL) != 0;
gtk_scale_set_draw_value(GTK_SCALE (m_scale), showValueLabel );
{
GTKDisableEvents();
gtk_range_set_value(GTK_RANGE (m_scale), value);
+ // GTK only updates value label if handle moves at least 1 pixel
+ gtk_widget_queue_draw(m_scale);
GTKEnableEvents();
}
GdkWindow *wxSlider::GTKGetWindow(wxArrayGdkWindows& WXUNUSED(windows)) const
{
+#ifdef __WXGTK3__
+ // no access to internal GdkWindows
+ return NULL;
+#else
return GTK_RANGE(m_scale)->event_window;
+#endif
}
// static
wxVisualAttributes
wxSlider::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
{
- return GetDefaultAttributesFromGTKWidget(gtk_vscale_new);
+ return GetDefaultAttributesFromGTKWidget(gtk_scale_new(GTK_ORIENTATION_VERTICAL, NULL));
}
#endif // wxUSE_SLIDER