00001
00002
00003 #include "Iguana/GLBrowsers/interface/Ig3DEnumControl.h"
00004 #include "Iguana/GLBrowsers/interface/IgControlCategory.h"
00005 #include <Inventor/fields/SoSFEnum.h>
00006 #include <classlib/utils/DebugAids.h>
00007 #include <qlayout.h>
00008 #include <qlabel.h>
00009 #include <qcombobox.h>
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 Ig3DEnumControl::Ig3DEnumControl (IgControlCategory *pane, QString label)
00022 : Ig3DFieldControl (pane)
00023 {
00024 ASSERT (pane);
00025 ASSERT (pane->bodyArea ());
00026 ASSERT (pane->bodyLayout ());
00027
00028 QWidget *area = pane->bodyArea ();
00029 int row = gridRows ();
00030
00031 ASSERT (row >= 0);
00032
00033
00034 QWidget *vlab = makeIndentedLabel (label, area);
00035 addGridWidget (vlab, row, 0);
00036
00037 m_value = new QComboBox (area);
00038 m_value->setEditable(false);
00039 addGridWidget (makeSpacedBox (area, m_value), row, 1);
00040
00041
00042 connect (m_value, SIGNAL (activated (int)),
00043 this, SLOT (valueChanged (int)));
00044 connect (this, SIGNAL (editable (bool)),
00045 m_value, SLOT (setEnabled (bool)));
00046 connect (this, SIGNAL (editable (bool)),
00047 vlab, SLOT (setEnabled (bool)));
00048 }
00049
00051 SoSFEnum *
00052 Ig3DEnumControl::field (void) const
00053 { return static_cast<SoSFEnum *> (Ig3DFieldControl::field ()); }
00054
00055 void
00056 Ig3DEnumControl::setField (SoSFEnum *field)
00057 {
00058 Ig3DFieldControl::setField (field);
00059 if (field)
00060 {
00061 int nums = field->getNumEnums ();
00062 if (nums != m_enums.size ())
00063 {
00064 m_enums.clear ();
00065 m_value->clear ();
00066 SbName name;
00067 for(int i=0; i < nums; i++)
00068 {
00069 m_enums.push_back (field->getEnum(i, name));
00070 m_value->insertItem (name.getString ());
00071 }
00072 }
00073 }
00074 }
00075
00076 int
00077 Ig3DEnumControl::fieldValue (void) const
00078 { ASSERT (field ()); return field ()->getValue (); }
00079
00081 int
00082 Ig3DEnumControl::value (void) const
00083 { return m_enums[m_value->currentItem ()]; }
00084
00085 void
00086 Ig3DEnumControl::setValue (int newval)
00087 {
00088 int index = findIndex (newval);
00089 ASSERT (index != -1);
00090
00091 m_value->setCurrentItem (index);
00092 setDirty (true);
00093 }
00094
00095 void
00096 Ig3DEnumControl::updateValue (void)
00097 { setValue (fieldValue ()); }
00098
00099 void
00100 Ig3DEnumControl::applyValue (void)
00101 { field ()->setValue (value ()); }
00102
00104 int
00105 Ig3DEnumControl::findIndex (int value)
00106 {
00107 int index = -1;
00108 for (unsigned int i = 0; i < m_enums.size (); i++)
00109 {
00110 if (m_enums[i] == value) { index = i ; break; }
00111 }
00112 return index;
00113 }
00114
00115 void
00116 Ig3DEnumControl::addValidValue (int value, const QString &name)
00117 {
00118 int index = findIndex (value);
00119 ASSERT (index == -1);
00120
00121 m_value->insertItem (name);
00122 m_enums.push_back (value);
00123 }
00124
00125 void
00126 Ig3DEnumControl::valueChanged (int index)
00127 {
00128 if (fieldValue () != m_enums[index])
00129 setDirty (true);
00130 }
00132 QWidget *
00133 Ig3DEnumControl::widget () const
00134 { return m_value; }