libyui-gtk  2.49.0
YGIntField.cc
1 /********************************************************************
2  * YaST2-GTK - http://en.opensuse.org/YaST2-GTK *
3  ********************************************************************/
4 
5 #define YUILogComponent "gtk"
6 #include "YGUI.h"
7 #include "YGUtils.h"
8 #include "YGWidget.h"
9 #include "YGMacros.h"
10 
11 class YGSpinBox : public YGLabeledWidget
12 {
13  YIntField *m_yfield;
14  GtkWidget *m_spiner, *m_slider;
15 
16 public:
17  YGSpinBox (YWidget *ywidget, YWidget *parent, const std::string &label,
18  int minValue, int maxValue, int initialValue, bool show_slider)
19  : YGLabeledWidget (ywidget, parent, label, YD_HORIZ,
20  YGTK_HBOX_NEW(6), "spacing", 6, NULL)
21  {
22  m_spiner = gtk_spin_button_new_with_range (minValue, maxValue, 1);
23 
24  if (show_slider) {
25  m_slider = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, minValue, maxValue, 1);
26  if (maxValue - minValue < 20)
27  // GtkScale by default uses a step of 10 -- use a lower for low values
28  gtk_range_set_increments (GTK_RANGE (m_slider), 1, 2);
29  gtk_scale_set_draw_value (GTK_SCALE (m_slider), FALSE);
30  YGLabeledWidget::setBuddy (m_slider);
31  gtk_widget_set_size_request (m_slider, 100, -1);
32 
33  gtk_box_pack_start (GTK_BOX (getWidget()), m_slider, TRUE, TRUE, 0);
34  gtk_box_pack_start (GTK_BOX (getWidget()), m_spiner, FALSE, TRUE, 0);
35  gtk_widget_show (m_slider);
36  }
37  else {
38  m_slider = NULL;
39  YGLabeledWidget::setBuddy (m_spiner);
40  gtk_container_add (GTK_CONTAINER (getWidget()), m_spiner);
41  }
42  gtk_widget_show (m_spiner);
43 
44  doSetValue (initialValue);
45  connect (m_spiner, "value-changed", G_CALLBACK (spiner_changed_cb), this);
46  if (m_slider)
47  connect (m_slider, "value-changed", G_CALLBACK (slider_changed_cb), this);
48  }
49 
50  GtkSpinButton *getSpiner()
51  { return GTK_SPIN_BUTTON (m_spiner); }
52 
53  bool useSlider()
54  { return m_slider != NULL; }
55  GtkRange *getSlider()
56  { return GTK_RANGE (m_slider); }
57 
58  virtual void reportValue (int value) = 0;
59 
60  int doGetValue()
61  { return gtk_spin_button_get_value_as_int (getSpiner()); }
62 
63  void doSetValue (int value)
64  {
65  BlockEvents block (this);
66  gtk_spin_button_set_value (getSpiner(), value);
67  if (useSlider())
68  gtk_range_set_value (getSlider(), value);
69  }
70 
71  // Events callbacks
72  static void spiner_changed_cb (GtkSpinButton *widget, YGSpinBox *pThis)
73  {
74  int value = gtk_spin_button_get_value_as_int (pThis->getSpiner());
75  pThis->reportValue (value);
76  if (pThis->useSlider())
77  gtk_range_set_value (pThis->getSlider(), value);
78  pThis->emitEvent (YEvent::ValueChanged);
79  }
80 
81  static void slider_changed_cb (GtkRange *range, YGSpinBox *pThis)
82  {
83  int value = (int) gtk_range_get_value (range);
84  gtk_spin_button_set_value (pThis->getSpiner(), value);
85  pThis->reportValue (value);
86  pThis->emitEvent (YEvent::ValueChanged);
87  }
88 };
89 
90 #define YGSPIN_BOX_IMPL(ParentClass) \
91  virtual void reportValue (int value) { \
92  ParentClass::setValue (value); \
93  } \
94  virtual int value() { \
95  return doGetValue(); \
96  } \
97  virtual void setValueInternal (int value) { \
98  doSetValue (value); \
99  }
100 
101 #include "YIntField.h"
102 
103 class YGIntField : public YIntField, public YGSpinBox
104 {
105 public:
106  YGIntField (YWidget *parent, const std::string &label, int minValue, int maxValue,
107  int initialValue)
108  : YIntField (NULL, label, minValue, maxValue)
109  , YGSpinBox (this, parent, label, minValue, maxValue, initialValue, false)
110  {}
111 
112  YGLABEL_WIDGET_IMPL (YIntField)
113  YGSPIN_BOX_IMPL (YIntField)
114 };
115 
116 YIntField *YGWidgetFactory::createIntField (YWidget *parent, const std::string &label,
117  int minValue, int maxValue, int initialValue)
118 { return new YGIntField (parent, label, minValue, maxValue, initialValue); }
119 
120 #include "YSlider.h"
121 
122 class YGSlider : public YSlider, public YGSpinBox
123 {
124 public:
125  YGSlider (YWidget *parent, const std::string &label, int minValue, int maxValue,
126  int initialValue)
127  : YSlider (NULL, label, minValue, maxValue)
128  , YGSpinBox (this, parent, label, minValue, maxValue, initialValue, true)
129  {}
130 
131  virtual unsigned int getMinSize (YUIDimension dim)
132  { return dim == YD_HORIZ ? 200 : 0; }
133 
134  YGLABEL_WIDGET_IMPL (YSlider)
135  YGSPIN_BOX_IMPL (YSlider)
136 };
137 
138 YSlider *YGOptionalWidgetFactory::createSlider (YWidget *parent, const std::string &label,
139  int minValue, int maxValue, int initialValue)
140 { return new YGSlider (parent, label, minValue, maxValue, initialValue); }
141 
YGIntField
Definition: YGIntField.cc:104
YGSlider
Definition: YGIntField.cc:123
YGLabeledWidget
Definition: YGWidget.h:123
BlockEvents
Definition: YGWidget.h:77
YGSpinBox
Definition: YGIntField.cc:12