Changeset 958
- Timestamp:
- 03/18/08 13:52:22 (15 years ago)
- Files:
-
- trunk/libffado/src/ffadodevice.cpp (modified) (3 diffs)
- trunk/libffado/src/ffadodevice.h (modified) (5 diffs)
- trunk/libffado/src/libcontrol/BasicElements.cpp (modified) (1 diff)
- trunk/libffado/src/libcontrol/BasicElements.h (modified) (1 diff)
- trunk/libffado/src/libcontrol/ClockSelect.cpp (added)
- trunk/libffado/src/libcontrol/ClockSelect.h (added)
- trunk/libffado/support/dbus/control-interface.xml (modified) (1 diff)
- trunk/libffado/support/dbus/controlserver.cpp (modified) (2 diffs)
- trunk/libffado/support/dbus/controlserver.h (modified) (2 diffs)
- trunk/libffado/support/dbus/test-dbus-server.cpp (modified) (1 diff)
- trunk/libffado/support/mixer/ffadomixer.in (modified) (2 diffs)
- trunk/libffado/support/mixer/mixer_af2.py (modified) (2 diffs)
- trunk/libffado/support/mixer/mixer_af2.ui (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/libffado/src/ffadodevice.cpp
r937 r958 28 28 #include "libieee1394/ieee1394service.h" 29 29 30 #include "libcontrol/Element.h" 31 #include "libcontrol/ClockSelect.h" 32 30 33 #include <iostream> 31 34 #include <sstream> … … 48 51 debugWarning("failed to add ConfigRom to Control::Container\n"); 49 52 } 53 54 m_genericContainer = new Control::Container("Generic"); 55 if(m_genericContainer == NULL) { 56 debugError("Could not create Control::Container for generic controls\n"); 57 } else { 58 59 if (!addElement(m_genericContainer)) { 60 debugWarning("failed to add generic container to Control::Container\n"); 61 } 62 // add a generic control for the clock source selection 63 if(!m_genericContainer->addElement(new Control::ClockSelect(*this))) { 64 debugWarning("failed to add clock source control to container\n"); 65 } 66 } 50 67 } 51 68 … … 54 71 if (!deleteElement(&getConfigRom())) { 55 72 debugWarning("failed to remove ConfigRom from Control::Container\n"); 73 } 74 75 // remove generic controls if present 76 if(m_genericContainer) { 77 if (!deleteElement(m_genericContainer)) { 78 debugError("Generic controls present but not registered to the avdevice\n"); 79 } 80 // remove and delete (as in free) child control elements 81 m_genericContainer->clearElements(true); 82 delete m_genericContainer; 56 83 } 57 84 } trunk/libffado/src/ffadodevice.h
r864 r958 41 41 class StreamProcessor; 42 42 class StreamProcessorManager; 43 } 44 45 namespace Control { 46 class Container; 43 47 } 44 48 … … 174 178 * @brief Clock source identification struct 175 179 */ 176 struct sClockSource { 180 class sClockSource { 181 public: 177 182 sClockSource() 178 183 : type( eCT_Invalid ) … … 183 188 , slipping( false ) 184 189 , description( "" ) 185 {} 190 {}; 191 virtual ~sClockSource() {}; 186 192 /// indicates the type of the clock source (e.g. eCT_ADAT) 187 193 enum eClockSourceType type; … … 198 204 /// description of the clock struct (optional) 199 205 std::string description; 206 207 bool operator==(const sClockSource& x) { 208 return (type == x.type) && (id == x.id); 209 } 200 210 }; 201 211 typedef struct sClockSource ClockSource; … … 425 435 std::auto_ptr<ConfigRom>( m_pConfigRom ); 426 436 DeviceManager& m_pDeviceManager; 437 Control::Container* m_genericContainer; 427 438 protected: 428 439 DECLARE_DEBUG_MODULE; trunk/libffado/src/libcontrol/BasicElements.cpp
r934 r958 142 142 } 143 143 144 //// --- 145 146 Enum::Enum() 147 : Element() 148 , m_selected( -1 ) 149 { 150 } 151 152 Enum::Enum(std::string n) 153 : Element(n) 154 , m_selected( -1 ) 155 { 156 } 157 158 void 159 Enum::show() 160 { 161 debugOutput( DEBUG_LEVEL_NORMAL, "Enum Element %s, selected=%d\n", 162 getName().c_str(), m_selected); 163 } 164 165 // NOTE: dummy implementation for tests 166 bool 167 Enum::select(int idx) 168 { 169 if(idx <3) { 170 m_selected=idx; 171 return true; 172 } else { 173 return false; 174 } 175 } 176 177 int 178 Enum::selected() 179 { 180 return m_selected; 181 } 182 183 int 184 Enum::count() 185 { 186 return 3; 187 } 188 189 std::string 190 Enum::getEnumLabel(int idx) 191 { 192 switch(idx) { 193 case 0: return "enum val 1"; 194 case 1: return "enum val 2"; 195 case 2: return "enum val 3"; 196 default: return "bad index"; 197 } 198 } 199 200 201 //// --- 202 203 AttributeEnum::AttributeEnum() 204 : Enum() 205 { 206 } 207 208 AttributeEnum::AttributeEnum(std::string n) 209 : Enum(n) 210 { 211 } 212 213 void 214 AttributeEnum::show() 215 { 216 debugOutput( DEBUG_LEVEL_NORMAL, "AttributeEnum Element %s\n", 217 getName().c_str()); 218 Enum::show(); 219 } 220 221 // NOTE: dummy implementation for tests 222 int 223 AttributeEnum::attributeCount() 224 { 225 return 2; 226 } 227 228 std::string 229 AttributeEnum::getAttributeValue(int attridx) 230 { 231 switch(attridx) { 232 case 0: return "attr val 1"; 233 case 1: return "attr val 2"; 234 default: return "bad attr index"; 235 } 236 } 237 238 std::string 239 AttributeEnum::getAttributeName(int attridx) 240 { 241 switch(attridx) { 242 case 0: return "attr 1"; 243 case 1: return "attr 2"; 244 default: return "bad attr index"; 245 } 246 } 247 144 248 } // namespace Control trunk/libffado/src/libcontrol/BasicElements.h
r934 r958 94 94 }; 95 95 96 /*! 97 @brief Base class for basic enumerated control elements 98 */ 99 class Enum 100 : public Element 101 { 102 public: 103 Enum(); 104 Enum(std::string n); 105 virtual ~Enum() {}; 106 107 virtual bool select(int idx); 108 virtual int selected(); 109 virtual int count(); 110 virtual std::string getEnumLabel(int idx); 111 112 virtual void show(); 113 //private: // HACK 114 int m_selected; 115 }; 116 117 /*! 118 @brief Base class for attribute enumerated control elements 119 120 The idea of this is that one can have a set of config values 121 available for a certain enum choice. 122 123 Example: for clock source selection: 124 idx Label signal locked available 125 0 WordClock 0 0 1 126 1 S/PDIF 1 0 1 127 ... 128 129 Attributes: 130 0 signal 131 1 locked 132 2 available 133 134 */ 135 class AttributeEnum 136 : public Enum 137 { 138 public: 139 AttributeEnum(); 140 AttributeEnum(std::string n); 141 virtual ~AttributeEnum() {}; 142 143 virtual int attributeCount(); 144 ///> get a specific attribute value for the selected enum 145 virtual std::string getAttributeValue(int attridx); 146 ///> get the name of the attribute with a certain index 147 virtual std::string getAttributeName(int attridx); 148 149 virtual void show(); 150 private: 151 }; 152 96 153 }; // namespace Control 97 154 trunk/libffado/support/dbus/control-interface.xml
r933 r958 75 75 </interface> 76 76 77 <interface name="org.ffado.Control.Element.Enum"> 78 <method name="select"> 79 <arg type="i" name="idx" direction="in"/> 80 <arg type="i" name="success" direction="out"/> 81 </method> 82 <method name="selected"> 83 <arg type="i" name="idx" direction="out"/> 84 </method> 85 <method name="count"> 86 <arg type="i" name="count" direction="out"/> 87 </method> 88 <method name="getEnumLabel"> 89 <arg type="i" name="idx" direction="in"/> 90 <arg type="s" name="label" direction="out"/> 91 </method> 92 </interface> 93 94 <interface name="org.ffado.Control.Element.AttributeEnum"> 95 <method name="select"> 96 <arg type="i" name="idx" direction="in"/> 97 <arg type="i" name="success" direction="out"/> 98 </method> 99 <method name="selected"> 100 <arg type="i" name="idx" direction="out"/> 101 </method> 102 <method name="count"> 103 <arg type="i" name="count" direction="out"/> 104 </method> 105 <method name="attributeCount"> 106 <arg type="i" name="count" direction="out"/> 107 </method> 108 <method name="getEnumLabel"> 109 <arg type="i" name="idx" direction="in"/> 110 <arg type="s" name="label" direction="out"/> 111 </method> 112 <method name="getAttributeValue"> 113 <arg type="i" name="idx" direction="in"/> 114 <arg type="s" name="value" direction="out"/> 115 </method> 116 <method name="getAttributeName"> 117 <arg type="i" name="idx" direction="in"/> 118 <arg type="s" name="name" direction="out"/> 119 </method> 120 </interface> 121 77 122 <interface name="org.ffado.Control.Element.MatrixMixer"> 78 123 <method name="setValue"> trunk/libffado/support/dbus/controlserver.cpp
r933 r958 146 146 *dynamic_cast<Control::Text *>(&e)); 147 147 } 148 149 // note that we have to check this before checking the Enum, 150 // since Enum is a base class 151 if (dynamic_cast<Control::AttributeEnum *>(&e) != NULL) { 152 debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::AttributeEnum\n"); 153 154 return new AttributeEnum(conn(), std::string(path()+"/"+e.getName()), 155 *dynamic_cast<Control::AttributeEnum *>(&e)); 156 } 157 158 if (dynamic_cast<Control::Enum *>(&e) != NULL) { 159 debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::Enum\n"); 160 161 return new Enum(conn(), std::string(path()+"/"+e.getName()), 162 *dynamic_cast<Control::Enum *>(&e)); 163 } 148 164 149 165 if (dynamic_cast<ConfigRom *>(&e) != NULL) { … … 253 269 } 254 270 271 272 // --- Enum 273 274 Enum::Enum( DBus::Connection& connection, std::string p, Control::Enum &slave) 275 : Element(connection, p, slave) 276 , m_Slave(slave) 277 { 278 debugOutput( DEBUG_LEVEL_VERBOSE, "Created Enum on '%s'\n", 279 path().c_str() ); 280 } 281 282 DBus::Int32 283 Enum::select( const DBus::Int32& idx ) 284 { 285 debugOutput( DEBUG_LEVEL_VERBOSE, "select(%d)\n", idx ); 286 return m_Slave.select(idx); 287 } 288 289 DBus::Int32 290 Enum::selected() 291 { 292 int retval = m_Slave.selected(); 293 debugOutput( DEBUG_LEVEL_VERBOSE, "selected() => %d\n", retval ); 294 return retval; 295 } 296 297 DBus::Int32 298 Enum::count() 299 { 300 int retval = m_Slave.count(); 301 debugOutput( DEBUG_LEVEL_VERBOSE, "count() => %d\n", retval ); 302 return retval; 303 } 304 305 DBus::String 306 Enum::getEnumLabel( const DBus::Int32 & idx ) 307 { 308 std::string retval = m_Slave.getEnumLabel(idx); 309 debugOutput( DEBUG_LEVEL_VERBOSE, "getEnumLabel(%d) => %s\n", idx, retval.c_str() ); 310 return retval; 311 } 312 313 // --- AttributeEnum 314 AttributeEnum::AttributeEnum( DBus::Connection& connection, std::string p, Control::AttributeEnum &slave) 315 : Element(connection, p, slave) 316 , m_Slave(slave) 317 { 318 debugOutput( DEBUG_LEVEL_VERBOSE, "Created Enum on '%s'\n", 319 path().c_str() ); 320 } 321 322 DBus::Int32 323 AttributeEnum::select( const DBus::Int32& idx ) 324 { 325 debugOutput( DEBUG_LEVEL_VERBOSE, "select(%d)\n", idx ); 326 return m_Slave.select(idx); 327 } 328 329 DBus::Int32 330 AttributeEnum::selected() 331 { 332 int retval = m_Slave.selected(); 333 debugOutput( DEBUG_LEVEL_VERBOSE, "selected() => %d\n", retval ); 334 return retval; 335 } 336 337 DBus::Int32 338 AttributeEnum::count() 339 { 340 int retval = m_Slave.count(); 341 debugOutput( DEBUG_LEVEL_VERBOSE, "count() => %d\n", retval ); 342 return retval; 343 } 344 345 DBus::Int32 346 AttributeEnum::attributeCount() 347 { 348 int retval = m_Slave.attributeCount(); 349 debugOutput( DEBUG_LEVEL_VERBOSE, "attributeCount() => %d\n", retval ); 350 return retval; 351 } 352 353 DBus::String 354 AttributeEnum::getEnumLabel( const DBus::Int32 & idx ) 355 { 356 std::string retval = m_Slave.getEnumLabel(idx); 357 debugOutput( DEBUG_LEVEL_VERBOSE, "getEnumLabel(%d) => %s\n", idx, retval.c_str() ); 358 return retval; 359 } 360 361 DBus::String 362 AttributeEnum::getAttributeValue( const DBus::Int32 & idx ) 363 { 364 std::string retval = m_Slave.getAttributeValue(idx); 365 debugOutput( DEBUG_LEVEL_VERBOSE, "getAttributeValue(%d) => %s\n", idx, retval.c_str() ); 366 return retval; 367 } 368 369 DBus::String 370 AttributeEnum::getAttributeName( const DBus::Int32 & idx ) 371 { 372 std::string retval = m_Slave.getAttributeName(idx); 373 debugOutput( DEBUG_LEVEL_VERBOSE, "getAttributeName(%d) => %s\n", idx, retval.c_str() ); 374 return retval; 375 } 376 255 377 // --- ConfigRom 256 378 trunk/libffado/support/dbus/controlserver.h
r933 r958 108 108 public: 109 109 Discrete( DBus::Connection& connection, 110 111 110 std::string p, 111 Control::Discrete &slave ); 112 112 113 113 DBus::Int32 setValue( const DBus::Int32 & value ); … … 132 132 private: 133 133 Control::Text &m_Slave; 134 }; 135 136 class Enum 137 : public org::ffado::Control::Element::Enum 138 , public Element 139 { 140 public: 141 Enum( DBus::Connection& connection, 142 std::string p, 143 Control::Enum &slave ); 144 145 DBus::Int32 select( const DBus::Int32 & idx ); 146 DBus::Int32 selected( ); 147 DBus::Int32 count( ); 148 DBus::String getEnumLabel( const DBus::Int32 & idx ); 149 150 private: 151 Control::Enum &m_Slave; 152 }; 153 154 class AttributeEnum 155 : public org::ffado::Control::Element::AttributeEnum 156 , public Element 157 { 158 public: 159 AttributeEnum( DBus::Connection& connection, 160 std::string p, 161 Control::AttributeEnum &slave ); 162 163 DBus::Int32 select( const DBus::Int32 & idx ); 164 DBus::Int32 selected( ); 165 DBus::Int32 count( ); 166 DBus::Int32 attributeCount(); 167 DBus::String getEnumLabel( const DBus::Int32 & idx ); 168 DBus::String getAttributeValue( const DBus::Int32 & idx ); 169 DBus::String getAttributeName( const DBus::Int32 & idx ); 170 171 private: 172 Control::AttributeEnum &m_Slave; 134 173 }; 135 174 trunk/libffado/support/dbus/test-dbus-server.cpp
r864 r958 139 139 c5.setVerboseLevel(DEBUG_LEVEL_VERBOSE); 140 140 cont1.addElement(&c5); 141 142 Control::Discrete d1("test_discr1"); 143 d1.setVerboseLevel(DEBUG_LEVEL_VERBOSE); 144 cont1.addElement(&d1); 145 146 Control::Enum e1("test_enum"); 147 e1.setVerboseLevel(DEBUG_LEVEL_VERBOSE); 148 cont1.addElement(&e1); 149 150 Control::AttributeEnum a1("test_attrenum"); 151 a1.setVerboseLevel(DEBUG_LEVEL_VERBOSE); 152 cont1.addElement(&a1); 153 154 Control::Text t1("test_text"); 155 t1.setVerboseLevel(DEBUG_LEVEL_VERBOSE); 156 cont1.addElement(&t1); 141 157 142 158 // Note: create handlers AFTER all children are added trunk/libffado/support/mixer/ffadomixer.in
r953 r958 168 168 def getModelId(self): 169 169 return self.iface.getModelId() 170 170 171 class ClockSelectInterface: 172 def __init__(self, servername, devicepath): 173 self.basepath=devicepath + '/Generic/ClockSelect' 174 self.servername=servername 175 self.bus=dbus.SessionBus() 176 self.dev = self.bus.get_object(self.servername, self.basepath) 177 self.iface = dbus.Interface(self.dev, dbus_interface='org.ffado.Control.Element.AttributeEnum') 178 def count(self): 179 return self.iface.count() 180 def select(self, idx): 181 return self.iface.select(idx) 182 def selected(self): 183 return self.iface.selected() 184 def getEnumLabel(self, idx): 185 return self.iface.getEnumLabel(idx) 186 def attributeCount(self): 187 return self.iface.attributeCount() 188 def getAttributeValue(self, idx): 189 return self.iface.getAttributeValue(idx) 190 def getAttributeName(self, idx): 191 return self.iface.getAttributeName(idx) 171 192 172 193 if __name__ == "__main__": … … 236 257 exec('forms.append('+mixerapp+'())') 237 258 forms[idx].hw = ControlInterface(server, basepath+'/DeviceManager/'+path) 259 forms[idx].clockselect = ClockSelectInterface(server, basepath+'/DeviceManager/'+path) 238 260 forms[idx].initValues() 239 261 forms[idx].show() trunk/libffado/support/mixer/mixer_af2.py
r864 r958 184 184 state) 185 185 self.hw.setDiscrete(self.SelectorControls[sender][0], state) 186 187 def updateClockSelection(self,a0): 188 #disable the combobox 189 self.comboClockSelect.setEnabled(False) 190 #change the clock source 191 self.clockselect.select(a0) 192 #refresh the clock source selection box 193 self.initClockSelector() 194 #make the box available again 195 self.comboClockSelect.setEnabled(True) 196 197 def initClockSelector(self): 198 self.comboClockSelect.clear() 199 nbsources = self.clockselect.count() 200 for idx in range(nbsources): 201 desc = self.clockselect.getEnumLabel(idx) 202 self.comboClockSelect.insertItem(desc) 203 active_idx = self.clockselect.selected(); 204 if active_idx >= 0: 205 self.comboClockSelect.setCurrentItem(active_idx) 186 206 187 207 def initValues(self): … … 241 261 # connect the UI element 242 262 QObject.connect(ctrl,SIGNAL('stateChanged(int)'),self.updateSelector) 263 264 self.initClockSelector() 265 # connect the clock selector UI element 266 QObject.connect(self.comboClockSelect, SIGNAL('activated(int)'), self.updateClockSelection) trunk/libffado/support/mixer/mixer_af2.ui
r864 r958 50 50 </property> 51 51 <attribute name="title"> 52 <string> ANALOG OUT</string>52 <string>&ANALOG OUT</string> 53 53 </attribute> 54 54 <widget class="QLabel"> … … 84 84 </property> 85 85 <property name="text"> 86 <string> Mute</string>86 <string>&Mute</string> 87 87 </property> 88 88 <property name="toggleButton"> … … 1840 1840 </property> 1841 1841 <attribute name="title"> 1842 <string>S/PDIF OUT</string>1842 <string>S/PDIF &OUT</string> 1843 1843 </attribute> 1844 1844 <widget class="QLabel"> … … 2716 2716 </property> 2717 2717 <attribute name="title"> 2718 <string>SETTI NGS</string>2718 <string>SETTI&NGS</string> 2719 2719 </attribute> 2720 <widget class="QLabel"> 2721 <property name="name"> 2722 <cstring>AnOut_textLabel1_2_6</cstring> 2723 </property> 2724 <property name="geometry"> 2725 <rect> 2726 <x>20</x> 2727 <y>50</y> 2728 <width>50</width> 2729 <height>21</height> 2730 </rect> 2731 </property> 2732 <property name="text"> 2733 <string>1</string> 2734 </property> 2735 <property name="alignment"> 2736 <set>AlignCenter</set> 2737 </property> 2738 </widget> 2739 <widget class="QLabel"> 2740 <property name="name"> 2741 <cstring>AnOut_textLabel1_2_3_4</cstring> 2742 </property> 2743 <property name="geometry"> 2744 <rect> 2745 <x>78</x> 2746 <y>50</y> 2747 <width>50</width> 2748 <height>21</height> 2749 </rect> 2750 </property> 2751 <property name="text"> 2752 <string>2</string> 2753 </property> 2754 <property name="alignment"> 2755 <set>AlignCenter</set> 2756 </property> 2757 </widget> 2758 <widget class="QPushButton"> 2759 <property name="name"> 2760 <cstring>btnIn1Pad</cstring> 2761 </property> 2762 <property name="geometry"> 2763 <rect> 2764 <x>22</x> 2765 <y>80</y> 2766 <width>50</width> 2767 <height>21</height> 2768 </rect> 2769 </property> 2770 <property name="text"> 2771 <string>Pad</string> 2772 </property> 2773 <property name="toggleButton"> 2774 <bool>true</bool> 2775 </property> 2776 </widget> 2777 <widget class="QPushButton"> 2778 <property name="name"> 2779 <cstring>btnIn2Pad</cstring> 2780 </property> 2781 <property name="geometry"> 2782 <rect> 2783 <x>80</x> 2784 <y>80</y> 2785 <width>50</width> 2786 <height>21</height> 2787 </rect> 2788 </property> 2789 <property name="text"> 2790 <string>Pad</string> 2791 </property> 2792 <property name="toggleButton"> 2793 <bool>true</bool> 2794 </property> 2795 </widget> 2720 2796 <widget class="QLabel"> 2721 2797 <property name="name"> … … 2737 2813 </property> 2738 2814 </widget> 2739 <widget class="Q Label">2740 <property name="name"> 2741 <cstring> AnOut_textLabel1_2_6</cstring>2815 <widget class="QGroupBox"> 2816 <property name="name"> 2817 <cstring>groupBox1</cstring> 2742 2818 </property> 2743 2819 <property name="geometry"> 2744 2820 <rect> 2745 2821 <x>20</x> 2746 <y>50</y> 2747 <width>50</width> 2748 <height>21</height> 2749 </rect> 2750 </property> 2751 <property name="text"> 2752 <string>1</string> 2753 </property> 2754 <property name="alignment"> 2755 <set>AlignCenter</set> 2756 </property> 2757 </widget> 2758 <widget class="QLabel"> 2759 <property name="name"> 2760 <cstring>AnOut_textLabel1_2_3_4</cstring> 2761 </property> 2762 <property name="geometry"> 2763 <rect> 2764 <x>78</x> 2765 <y>50</y> 2766 <width>50</width> 2767 <height>21</height> 2768 </rect> 2769 </property> 2770 <property name="text"> 2771 <string>2</string> 2772 </property> 2773 <property name="alignment"> 2774 <set>AlignCenter</set> 2775 </property> 2776 </widget> 2777 <widget class="QPushButton"> 2778 <property name="name"> 2779 <cstring>btnIn1Pad</cstring> 2780 </property> 2781 <property name="geometry"> 2782 <rect> 2783 <x>22</x> 2784 <y>80</y> 2785 <width>50</width> 2786 <height>21</height> 2787 </rect> 2788 </property> 2789 <property name="text"> 2790 <string>Pad</string> 2791 </property> 2792 <property name="toggleButton"> 2793 <bool>true</bool> 2794 </property> 2795 </widget> 2796 <widget class="QPushButton"> 2797 <property name="name"> 2798 <cstring>btnIn2Pad</cstring> 2799 </property> 2800 <property name="geometry"> 2801 <rect> 2802 <x>80</x> 2803 <y>80</y> 2804 <width>50</width> 2805 <height>21</height> 2806 </rect> 2807 </property> 2808 <property name="text"> 2809 <string>Pad</string> 2810 </property> 2811 <property name="toggleButton"> 2812 <bool>true</bool> 2813 </property> 2822 <y>120</y> 2823 <width>521</width> 2824 <height>60</height> 2825 </rect> 2826 </property> 2827 <property name="title"> 2828 <string>Clock Source</string> 2829 </property> 2830 <widget class="QComboBox"> 2831 <property name="name"> 2832 <cstring>comboClockSelect</cstring> 2833 </property> 2834 <property name="geometry"> 2835 <rect> 2836 <x>10</x> 2837 <y>20</y> 2838 <width>500</width> 2839 <height>31</height> 2840 </rect> 2841 </property> 2842 </widget> 2814 2843 </widget> 2815 2844 </widget>