]> git.sesse.net Git - kdenlive/commitdiff
Make composite transition position obey the timecode format (frame / hh:mm:ss:ff)
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 22 May 2010 22:15:56 +0000 (22:15 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 22 May 2010 22:15:56 +0000 (22:15 +0000)
svn path=/trunk/kdenlive/; revision=4475

src/effectstackedit.cpp
src/effectstackedit.h
src/geometryval.cpp
src/geometryval.h
src/keyframehelper.cpp
src/keyframehelper.h
src/mainwindow.cpp
src/transitionsettings.cpp
src/transitionsettings.h
src/widgets/geometryval_ui.ui

index 56a1b4f46ed47dc1e149aaf533deb44193874721..a6252d7598815b9e85efc19f5740af176ba0bc5f 100644 (file)
@@ -107,7 +107,23 @@ void EffectStackEdit::setFrameSize(QPoint p)
             break;
         }
     }
+}
+
+void EffectStackEdit::updateTimecodeFormat()
+{
+    QDomNodeList namenode = m_params.elementsByTagName("parameter");
+    for (int i = 0; i < namenode.count() ; i++) {
+        QDomNode pa = namenode.item(i);
+        QDomNode na = pa.firstChildElement("name");
+        QString type = pa.attributes().namedItem("type").nodeValue();
+        QString paramName = i18n(na.toElement().text().toUtf8().data());
 
+        if (type == "geometry") {
+            Geometryval *geom = ((Geometryval*)m_valueItems[paramName+"geometry"]);
+            geom->updateTimecodeFormat();
+            break;
+        }
+    }
 }
 
 void EffectStackEdit::updateProjectFormat(MltVideoProfile profile, Timecode t)
@@ -230,7 +246,7 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, int in, int out)
             m_valueItems[paramName+"complex"] = pl;
             connect(pl, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters()));
         } else if (type == "geometry") {
-            Geometryval *geo = new Geometryval(m_profile, m_frameSize, m_in);
+            Geometryval *geo = new Geometryval(m_profile, m_timecode, m_frameSize, m_in);
             geo->setupParam(pa, minFrame, maxFrame);
             m_vbox->addWidget(geo);
             m_valueItems[paramName+"geometry"] = geo;
index 0cc9dcdc9da4f89e6d5f1faf072cc66ed0e794d9..c1fff7d9f5cd31115b139ac0621a608147ccdfd9 100644 (file)
@@ -50,6 +50,7 @@ public:
     static QMap<QString, QImage> iconCache;
     void updateParameter(const QString &name, const QString &value);
     void setFrameSize(QPoint p);
+    void updateTimecodeFormat();
 
 private:
     void clearAllItems();
index 73705688c3669254c9b7c2c30738fc7a2487dd04..037b4ebdb54f3164267219e21810f2883c19c4d7 100644 (file)
 #include <QInputDialog>
 
 
-Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, int startPoint, QWidget* parent) :
+Geometryval::Geometryval(const MltVideoProfile profile, Timecode t, QPoint frame_size, int startPoint, QWidget* parent) :
         QWidget(parent),
         m_profile(profile),
+        m_timecode(t),
         m_paramRect(NULL),
         m_geom(NULL),
         m_path(NULL),
@@ -106,6 +107,8 @@ Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, int s
     connect(buttonAdd , SIGNAL(clicked()) , this , SLOT(slotAddFrame()));
     connect(m_scene, SIGNAL(actionFinished()), this, SLOT(slotUpdateTransitionProperties()));
     connect(m_scene, SIGNAL(doubleClickEvent()), this, SLOT(slotGeometry()));
+    connect(pos_up, SIGNAL(clicked()), this, SLOT(slotPosUp()));
+    connect(pos_down, SIGNAL(clicked()), this, SLOT(slotPosDown()));
 
     buttonhcenter->setIcon(KIcon("kdenlive-align-hor"));
     buttonhcenter->setToolTip(i18n("Align item horizontally"));
@@ -221,7 +224,9 @@ void Geometryval::slotResizeCustom()
 
 void Geometryval::slotTransparencyChanged(int transp)
 {
-    int pos = spinPos->value();
+    int pos;
+    if (KdenliveSettings::frametimecode()) pos = timePos->text().toInt();
+    else pos = m_timecode.getFrameCount(timePos->text());
     Mlt::GeometryItem item;
     int error = m_geom->fetch(&item, pos);
     if (error || item.key() == false) {
@@ -239,10 +244,60 @@ void Geometryval::slotSyncCursor()
     KdenliveSettings::setTransitionfollowcursor(m_syncAction->isChecked());
 }
 
+void Geometryval::updateTimecodeFormat()
+{
+    timePos->setInputMask("");
+    if (KdenliveSettings::frametimecode()) {
+        int frames = m_timecode.getFrameCount(timePos->text());
+        QIntValidator *valid = new QIntValidator(this);
+        valid->setBottom(0);
+        timePos->setValidator(valid);
+        timePos->setText(QString::number(frames));
+    } else {
+        int pos = timePos->text().toInt();
+        timePos->setValidator(m_timecode.validator());
+        timePos->setText(m_timecode.getTimecodeFromFrames(pos));
+    }
+}
+
+void Geometryval::slotPosUp()
+{
+    int pos;
+    if (KdenliveSettings::frametimecode()) pos = timePos->text().toInt();
+    else pos = m_timecode.getFrameCount(timePos->text());
+    pos ++;
+    if (pos > m_helper->frameLength) pos = m_helper->frameLength;
+    if (KdenliveSettings::frametimecode()) {
+        timePos->setText(QString::number(pos));
+    } else timePos->setText(m_timecode.getTimecodeFromFrames(pos));
+    slotPositionChanged();
+}
+
+void Geometryval::slotPosDown()
+{
+    int pos;
+    if (KdenliveSettings::frametimecode()) pos = timePos->text().toInt();
+    else pos = m_timecode.getFrameCount(timePos->text());
+    pos --;
+    if (pos < 0) pos = 0;
+    if (KdenliveSettings::frametimecode()) {
+        timePos->setText(QString::number(pos));
+    } else timePos->setText(m_timecode.getTimecodeFromFrames(pos));
+    slotPositionChanged();
+}
+
 void Geometryval::slotPositionChanged(int pos, bool seek)
 {
+    if (pos == -1) {
+        if (KdenliveSettings::frametimecode()) pos = timePos->text().toInt();
+        else pos = m_timecode.getFrameCount(timePos->text());
+    }
     if (seek && KdenliveSettings::transitionfollowcursor()) emit seekToPos(pos + m_startPoint);
-    spinPos->setValue(pos);
+    if (KdenliveSettings::frametimecode()) {
+        timePos->setText(QString::number(pos));
+    } else timePos->setText(m_timecode.getTimecodeFromFrames(pos));
+
+    //spinPos->setValue(pos);
     m_helper->setValue(pos);
     Mlt::GeometryItem item;
     int error = m_geom->fetch(&item, pos);
@@ -274,14 +329,18 @@ void Geometryval::slotDeleteFrame(int pos)
 {
     // check there is more than one keyframe
     Mlt::GeometryItem item;
-    if (pos == -1) pos = spinPos->value();
+    int frame;
+    if (KdenliveSettings::frametimecode()) frame = timePos->text().toInt();
+    else frame = m_timecode.getFrameCount(timePos->text());
+
+    if (pos == -1) pos = frame;
     int error = m_geom->next_key(&item, pos + 1);
     if (error) {
         error = m_geom->prev_key(&item, pos - 1);
         if (error || item.frame() == pos) return;
     }
 
-    m_geom->remove(spinPos->value());
+    m_geom->remove(frame);
     buttonAdd->setEnabled(true);
     buttonDelete->setEnabled(false);
     widget->setEnabled(false);
@@ -296,7 +355,10 @@ void Geometryval::slotDeleteFrame(int pos)
 
 void Geometryval::slotAddFrame(int pos)
 {
-    if (pos == -1) pos = spinPos->value();
+    int frame;
+    if (KdenliveSettings::frametimecode()) frame = timePos->text().toInt();
+    else frame = m_timecode.getFrameCount(timePos->text());
+    if (pos == -1) pos = frame;
     Mlt::GeometryItem item;
     item.frame(pos);
     QRectF r = m_paramRect->rect().normalized();
@@ -321,14 +383,17 @@ void Geometryval::slotNextFrame()
 {
     Mlt::GeometryItem item;
     int error = m_geom->next_key(&item, m_helper->value() + 1);
+    int pos;
     kDebug() << "// SEEK TO NEXT KFR: " << error;
     if (error) {
         // Go to end
-        spinPos->setValue(spinPos->maximum());
-        return;
-    }
-    int pos = item.frame();
-    spinPos->setValue(pos);
+        pos = m_helper->frameLength;
+    } else pos = item.frame();
+
+    if (KdenliveSettings::frametimecode()) {
+        timePos->setText(QString::number(pos));
+    } else timePos->setText(m_timecode.getTimecodeFromFrames(pos));
+    slotPositionChanged();
 }
 
 void Geometryval::slotPreviousFrame()
@@ -338,7 +403,10 @@ void Geometryval::slotPreviousFrame()
     kDebug() << "// SEEK TO NEXT KFR: " << error;
     if (error) return;
     int pos = item.frame();
-    spinPos->setValue(pos);
+    if (KdenliveSettings::frametimecode()) {
+        timePos->setText(QString::number(pos));
+    } else timePos->setText(m_timecode.getTimecodeFromFrames(pos));
+    slotPositionChanged();
 }
 
 
@@ -359,7 +427,7 @@ void Geometryval::setupParam(const QDomElement par, int minFrame, int maxFrame)
         spinTransp->setMaximum(500);
         label_pos->setHidden(true);
         m_helper->setHidden(true);
-        spinPos->setHidden(true);
+        timePos->setHidden(true);
     }
     if (par.attribute("opacity") == "false") {
         label_opacity->setHidden(true);
@@ -380,7 +448,6 @@ void Geometryval::setupParam(const QDomElement par, int minFrame, int maxFrame)
         /*QDomDocument doc;
         doc.appendChild(doc.importNode(par, true));
         kDebug() << "IMPORTED TRANS: " << doc.toString();*/
-        spinPos->setMaximum(maxFrame - minFrame - 1);
         if (m_path == NULL) {
             m_path = new QGraphicsPathItem();
             m_path->setPen(QPen(Qt::red));
@@ -402,7 +469,7 @@ void Geometryval::setupParam(const QDomElement par, int minFrame, int maxFrame)
     slotPositionChanged(0, false);
     slotUpdateGeometry();
     if (!m_fixedMode) {
-        connect(spinPos, SIGNAL(valueChanged(int)), this , SLOT(slotPositionChanged(int)));
+        connect(timePos, SIGNAL(editingFinished()), this , SLOT(slotPositionChanged()));
     }
     connect(spinTransp, SIGNAL(valueChanged(int)), this , SLOT(slotTransparencyChanged(int)));
 }
@@ -430,7 +497,9 @@ void Geometryval::updateTransitionPath()
 
 void Geometryval::slotUpdateTransitionProperties()
 {
-    int pos = spinPos->value();
+    int pos;
+    if (KdenliveSettings::frametimecode()) pos = timePos->text().toInt();
+    else pos = m_timecode.getFrameCount(timePos->text());
     Mlt::GeometryItem item;
     int error = m_geom->next_key(&item, pos);
     if (error || item.frame() != pos) {
@@ -483,7 +552,7 @@ void Geometryval::slotSwitchOptions()
         frameOptions->setHidden(true);
         m_editOptions->setChecked(false);
     }
-    adjustSize();
+    //adjustSize();
 }
 
 void Geometryval::slotGeometryX(int value)
@@ -544,7 +613,10 @@ void Geometryval::slotUpdateGeometry()
 bool Geometryval::keyframeSelected()
 {
     Mlt::GeometryItem item;
-    if (m_geom->fetch(&item, spinPos->value()) || item.key() == false) return false;
+    int pos;
+    if (KdenliveSettings::frametimecode()) pos = timePos->text().toInt();
+    else pos = m_timecode.getFrameCount(timePos->text());
+    if (m_geom->fetch(&item, pos) || item.key() == false) return false;
     return true;
 }
 
index 74d1d9179f1baa67cef9703ce97aa231fa5515c8..4ba289e720739967700baf408bb4a1fc6a3ce3fc 100644 (file)
@@ -41,14 +41,17 @@ class Geometryval : public QWidget, public Ui::Geometryval
 {
     Q_OBJECT
 public:
-    explicit Geometryval(const MltVideoProfile profile, QPoint frame_size, int startPoint = 0, QWidget* parent = 0);
+    explicit Geometryval(const MltVideoProfile profile, Timecode t, QPoint frame_size, int startPoint = 0, QWidget* parent = 0);
     virtual ~Geometryval();
     QDomElement getParamDesc();
     QString getValue() const;
     void setFrameSize(QPoint p);
+    /* update the timecode display depending on what the user wants (frame number or hh:mm:ss:ff) */
+    void updateTimecodeFormat();
 
 private:
     MltVideoProfile m_profile;
+    Timecode m_timecode;
     int m_realWidth;
     GraphicsSceneRectMove *m_scene;
     QGraphicsRectItem *m_paramRect;
@@ -74,7 +77,7 @@ public slots:
 private slots:
     void slotNextFrame();
     void slotPreviousFrame();
-    void slotPositionChanged(int pos, bool seek = true);
+    void slotPositionChanged(int pos = -1, bool seek = true);
     void slotDeleteFrame(int pos = -1);
     void slotAddFrame(int pos = -1);
     void slotUpdateTransitionProperties();
@@ -96,6 +99,8 @@ private slots:
     void slotGeometryY(int value);
     void slotGeometryWidth(int value);
     void slotGeometryHeight(int value);
+    void slotPosUp();
+    void slotPosDown();
 
 signals:
     void parameterChanged();
index 9d760c52ba1440e410dea5c70f9d94e3b6598bee..682e67a9e76a8e64b7e939658066e3ad6f848f0b 100644 (file)
@@ -75,14 +75,14 @@ void KeyframeHelper::mouseMoveEvent(QMouseEvent * event)
             m_geom->remove(m_movingItem.frame());
         }
         int pos = qMax(0, (int)(event->x() / m_scale));
-        pos = qMin(m_length, pos);
+        pos = qMin(frameLength, pos);
         m_movingItem.frame(pos);
         update();
         return;
     }
     m_position = event->x() / m_scale;
     m_position = qMax(0, m_position);
-    m_position = qMin(m_length, m_position);
+    m_position = qMin(frameLength, m_position);
     emit positionChanged(m_position);
     update();
 }
@@ -121,7 +121,7 @@ void KeyframeHelper::wheelEvent(QWheelEvent * e)
     if (e->delta() < 0) m_position = m_position - 1;
     else m_position = m_position + 1;
     m_position = qMax(0, m_position);
-    m_position = qMin(m_length, m_position);
+    m_position = qMin(frameLength, m_position);
     emit positionChanged(m_position);
     update();
     /*    int delta = 1;
@@ -137,7 +137,7 @@ void KeyframeHelper::paintEvent(QPaintEvent *e)
     QStylePainter p(this);
     const QRectF clipRect = e->rect();
     p.setClipRect(clipRect);
-    m_scale = (double) width() / m_length;
+    m_scale = (double) width() / frameLength;
     if (m_geom != NULL) {
         int pos = 0;
         p.setPen(QColor(255, 20, 20));
@@ -194,7 +194,7 @@ void KeyframeHelper::setValue(const int pos)
 void KeyframeHelper::setKeyGeometry(Mlt::Geometry *geom, const int length)
 {
     m_geom = geom;
-    m_length = length;
+    frameLength = length;
     update();
 }
 
index 982cd3a8fb01ed5c98ca343c906362f738a4fc39..6bcbd375fb6b690d41f0959aa1ac54152ca060a7 100644 (file)
@@ -33,6 +33,7 @@ class KeyframeHelper : public QWidget
 public:
     KeyframeHelper(QWidget *parent = 0);
     int value() const;
+    int frameLength;
 
 protected:
     virtual void paintEvent(QPaintEvent * /*e*/);
@@ -44,7 +45,6 @@ protected:
 
 private:
     Mlt::Geometry *m_geom;
-    int m_length;
     int m_position;
     double m_scale;
     bool m_movingKeyframe;
index ce4d1d2c5e10e4f09840748f8142320b4a80ca28..fde0e90bc1ffcdd5da467cc2e85b920b57a23af6 100644 (file)
@@ -3314,6 +3314,7 @@ void MainWindow::slotUpdateTimecodeFormat(int ix)
     KdenliveSettings::setFrametimecode(ix == 1);
     m_clipMonitor->updateTimecodeFormat();
     m_projectMonitor->updateTimecodeFormat();
+    m_transitionConfig->updateTimecodeFormat();
     m_activeTimeline->projectView()->clearSelection();
     m_activeTimeline->updateRuler();
 }
index bb817fab2d33ec0381c31b22757e28d48ce863ab..3d7f4358439c29a84ca3d6a06007000dfae184b2 100644 (file)
@@ -74,6 +74,11 @@ void TransitionSettings::updateProjectFormat(MltVideoProfile profile, Timecode t
     updateTrackList();
 }
 
+void TransitionSettings::updateTimecodeFormat()
+{
+    m_effectEdit->updateTimecodeFormat();
+}
+
 void TransitionSettings::updateTrackList()
 {
     transitionTrack->blockSignals(true);
index 4f0f03d72741fd34fe859183f6f95bfd1008d779..3166a01c5e29484e6d5eb825c1071d4317e53de7 100644 (file)
@@ -35,6 +35,7 @@ public:
     TransitionSettings(QWidget* parent = 0);
     void raiseWindow(QWidget*);
     void updateProjectFormat(MltVideoProfile profile, Timecode t, const QList <TrackInfo> info);
+    void updateTimecodeFormat();
 
 private:
     EffectStackEdit *m_effectEdit;
index 7646c142a7afe173ee1c8de6d60b2026fa529150..70f3954580fee1421e9f6df042f88a26a151aa77 100644 (file)
@@ -6,15 +6,15 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>405</width>
-    <height>240</height>
+    <width>401</width>
+    <height>251</height>
    </rect>
   </property>
   <layout class="QGridLayout" name="gridLayout_2">
    <property name="margin">
     <number>0</number>
    </property>
-   <item row="0" column="0" colspan="10">
+   <item row="0" column="0">
     <widget class="QWidget" name="widget" native="true">
      <property name="sizePolicy">
       <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
-     <zorder>frameOptions</zorder>
     </widget>
    </item>
-   <item row="1" column="0" colspan="10">
+   <item row="1" column="0">
     <widget class="QFrame" name="keyframeWidget">
      <property name="sizePolicy">
       <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
     </widget>
    </item>
    <item row="2" column="0">
-    <widget class="QToolButton" name="buttonMenu">
-     <property name="text">
-      <string>M</string>
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <property name="spacing">
+      <number>-1</number>
      </property>
-     <property name="arrowType">
-      <enum>Qt::NoArrow</enum>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="1">
-    <widget class="QToolButton" name="buttonPrevious">
-     <property name="text">
-      <string>P</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="2">
-    <widget class="QToolButton" name="buttonNext">
-     <property name="text">
-      <string>N</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="3">
-    <widget class="QToolButton" name="buttonAdd">
-     <property name="text">
-      <string>A</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="4">
-    <widget class="QToolButton" name="buttonDelete">
-     <property name="text">
-      <string>D</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="5">
-    <widget class="QLabel" name="label_opacity">
-     <property name="text">
-      <string>Opacity</string>
-     </property>
-    </widget>
+     <item>
+      <widget class="QToolButton" name="buttonMenu">
+       <property name="text">
+        <string>M</string>
+       </property>
+       <property name="arrowType">
+        <enum>Qt::NoArrow</enum>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="buttonPrevious">
+       <property name="text">
+        <string>P</string>
+       </property>
+       <property name="autoRaise">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="buttonNext">
+       <property name="text">
+        <string>N</string>
+       </property>
+       <property name="autoRaise">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="buttonAdd">
+       <property name="text">
+        <string>A</string>
+       </property>
+       <property name="autoRaise">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="buttonDelete">
+       <property name="text">
+        <string>D</string>
+       </property>
+       <property name="autoRaise">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="label_opacity">
+       <property name="text">
+        <string>Opacity</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QSpinBox" name="spinTransp">
+       <property name="maximum">
+        <number>100</number>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="label_pos">
+       <property name="text">
+        <string>Pos</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout_4">
+       <property name="spacing">
+        <number>0</number>
+       </property>
+       <item>
+        <widget class="KRestrictedLine" name="timePos">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <layout class="QVBoxLayout" name="verticalLayout_2">
+         <item>
+          <widget class="QToolButton" name="pos_up">
+           <property name="text">
+            <string>...</string>
+           </property>
+           <property name="iconSize">
+            <size>
+             <width>3</width>
+             <height>2</height>
+            </size>
+           </property>
+           <property name="autoRaise">
+            <bool>true</bool>
+           </property>
+           <property name="arrowType">
+            <enum>Qt::UpArrow</enum>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QToolButton" name="pos_down">
+           <property name="text">
+            <string>...</string>
+           </property>
+           <property name="iconSize">
+            <size>
+             <width>3</width>
+             <height>2</height>
+            </size>
+           </property>
+           <property name="autoRaise">
+            <bool>true</bool>
+           </property>
+           <property name="arrowType">
+            <enum>Qt::DownArrow</enum>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer_2">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
    </item>
-   <item row="2" column="6">
-    <widget class="QSpinBox" name="spinTransp">
-     <property name="maximum">
-      <number>100</number>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="7">
-    <spacer name="horizontalSpacer">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>40</width>
-       <height>20</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="2" column="8">
-    <widget class="QLabel" name="label_pos">
-     <property name="text">
-      <string>Pos</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="9">
-    <widget class="QSpinBox" name="spinPos"/>
-   </item>
-   <item row="3" column="0" colspan="10">
+   <item row="3" column="0">
     <widget class="QGroupBox" name="frameOptions">
      <property name="title">
       <string/>
         </item>
        </layout>
       </item>
+      <item row="0" column="1">
+       <spacer name="horizontalSpacer">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>40</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
      </layout>
     </widget>
    </item>
    <extends>QSpinBox</extends>
    <header>knuminput.h</header>
   </customwidget>
+  <customwidget>
+   <class>KLineEdit</class>
+   <extends>QLineEdit</extends>
+   <header>klineedit.h</header>
+  </customwidget>
+  <customwidget>
+   <class>KRestrictedLine</class>
+   <extends>KLineEdit</extends>
+   <header>krestrictedline.h</header>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>