]> git.sesse.net Git - kdenlive/commitdiff
Updated keyframe editor
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Thu, 19 Nov 2009 00:25:59 +0000 (00:25 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Thu, 19 Nov 2009 00:25:59 +0000 (00:25 +0000)
svn path=/trunk/kdenlive/; revision=4135

src/clipitem.cpp
src/keyframeedit.cpp
src/keyframeedit.h
src/widgets/colorval_ui.ui
src/widgets/keyframeeditor_ui.ui

index 7ef69ea4a7bf01e77fbb05da3bab9e9086b61b18..99a9a1c5b148902043b6eefeaaf76f9c3dfcd00b 100644 (file)
@@ -189,7 +189,7 @@ void ClipItem::initEffect(QDomElement effect, int diff)
             if (e.attribute("keyframes").isEmpty()) {
                 e.setAttribute("keyframes", QString::number(cropStart().frames(m_fps)) + ':' + def + ';' + QString::number((cropStart() + cropDuration()).frames(m_fps) - 1) + ':' + def);
                 //kDebug() << "///// EFFECT KEYFRAMES INITED: " << e.attribute("keyframes");
-                break;
+                //break;
             }
         }
     }
index 687695a155d3c795ed257853c31a883ba85afca8..5ecc4d2aebdec727851286bb8a2224e3db385847 100644 (file)
@@ -26,7 +26,6 @@
 
 KeyframeEdit::KeyframeEdit(QDomElement e, int maxFrame, int minVal, int maxVal, Timecode tc, const QString paramName, QWidget* parent) :
         QWidget(parent),
-        m_param(e),
         m_max(maxFrame),
         m_minVal(minVal),
         m_maxVal(maxVal),
@@ -34,8 +33,10 @@ KeyframeEdit::KeyframeEdit(QDomElement e, int maxFrame, int minVal, int maxVal,
         m_previousPos(0)
 {
     setupUi(this);
+    m_params.append(e);
     keyframe_list->setFont(KGlobalSettings::generalFont());
-    keyframe_list->setHeaderLabels(QStringList() << i18n("Position") << (paramName.isEmpty() ? i18n("Value") : paramName));
+    
+    //keyframe_list->setHorizontalHeaderLabels(QStringList() << (paramName.isEmpty() ? i18n("Value") : paramName));
     //setResizeMode(1, QHeaderView::Interactive);
     button_add->setIcon(KIcon("list-add"));
     button_add->setToolTip(i18n("Add keyframe"));
@@ -44,177 +45,211 @@ KeyframeEdit::KeyframeEdit(QDomElement e, int maxFrame, int minVal, int maxVal,
     connect(keyframe_list, SIGNAL(itemSelectionChanged()/*itemClicked(QTreeWidgetItem *, int)*/), this, SLOT(slotAdjustKeyframeInfo()));
     keyframe_val->setRange(m_minVal, m_maxVal);
     setupParam();
+    //keyframe_list->sortItems(0);
+    keyframe_list->resizeRowsToContents();
+    keyframe_list->verticalHeader()->setResizeMode(QHeaderView::Fixed);
 
-    keyframe_list->header()->resizeSections(QHeaderView::ResizeToContents);
+    //keyframe_list->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents);
     connect(button_delete, SIGNAL(clicked()), this, SLOT(slotDeleteKeyframe()));
     connect(button_add, SIGNAL(clicked()), this, SLOT(slotAddKeyframe()));
-    connect(keyframe_list, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotGenerateParams(QTreeWidgetItem *, int)));
-    connect(keyframe_list, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotSaveCurrentParam(QTreeWidgetItem *, int)));
+    connect(keyframe_list, SIGNAL(cellChanged(int, int)), this, SLOT(slotGenerateParams(int, int)));
+    //connect(keyframe_list, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotSaveCurrentParam(QTreeWidgetItem *, int)));
     connect(keyframe_pos, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustKeyframePos(int)));
     connect(keyframe_val, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustKeyframeValue(int)));
     keyframe_pos->setPageStep(1);
-    m_delegate = new KeyItemDelegate(minVal, maxVal);
-    keyframe_list->setItemDelegate(m_delegate);
+    /*m_delegate = new KeyItemDelegate(minVal, maxVal);
+    keyframe_list->setItemDelegate(m_delegate);*/
 }
 
 KeyframeEdit::~KeyframeEdit()
 {
     keyframe_list->blockSignals(true);
     keyframe_list->clear();
-    delete m_delegate;
+    //delete m_delegate;
 }
 
 void KeyframeEdit::addParameter(QDomElement e) {
+    keyframe_list->blockSignals(true);
     QDomNode na = e.firstChildElement("name");
-    kDebug() << "- - - -ADD PARAM:" <<na.toElement().text();
     QString paramName = i18n(na.toElement().text().toUtf8().data());
-    keyframe_list->setColumnCount(3);
-    keyframe_list->headerItem()->setText(2, paramName);
-    
+    int columnId = keyframe_list->columnCount();
+    keyframe_list->insertColumn(columnId);
+    keyframe_list->setHorizontalHeaderItem(columnId, new QTableWidgetItem(paramName));
+    m_params.append(e);
     QStringList frames = e.attribute("keyframes").split(";", QString::SkipEmptyParts);
     for (int i = 0; i < frames.count(); i++) {
-        QString framePos = m_timecode.getTimecodeFromFrames(frames.at(i).section(':', 0, 0).toInt());
-       QList<QTreeWidgetItem *> list = keyframe_list->findItems(framePos, Qt::MatchExactly, 0);
-       QTreeWidgetItem *item;
-       if (!list.isEmpty()) {
-           item = list.at(0);
-           item->setText(2, frames.at(i).section(':', 1, 1));
+       int frame = frames.at(i).section(':', 0, 0).toInt();
+       bool found = false;
+       int j;
+       for (j = 0; j < keyframe_list->rowCount(); j++) {
+           int currentPos = m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(j)->text());
+           if (frame == currentPos) {
+               keyframe_list->setItem(j, columnId, new QTableWidgetItem(frames.at(i).section(':', 1, 1)));
+               found = true;
+               break;
+           }
+           else if (currentPos > frame) {
+               break;
+           }
        }
-        else {
-           item = new QTreeWidgetItem(QStringList() << framePos << QString() << frames.at(i).section(':', 1, 1));
-           item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled);
-           keyframe_list->addTopLevelItem(item);
+        if (!found) {
+           //int newRow = keyframe_list->rowCount();
+           keyframe_list->insertRow(j);
+           keyframe_list->setVerticalHeaderItem(j, new QTableWidgetItem(m_timecode.getTimecodeFromFrames(frame)));
+           keyframe_list->setItem(j, columnId, new QTableWidgetItem(frames.at(i).section(':', 1, 1)));
+           keyframe_list->resizeRowToContents(j);
        }
     }
+    keyframe_list->blockSignals(false);
 }
 
-void KeyframeEdit::setupParam(QDomElement e)
+void KeyframeEdit::setupParam()
 {
-    if (!e.isNull()) m_param = e;
+    keyframe_list->blockSignals(true);
     keyframe_list->clear();
-    QStringList frames = m_param.attribute("keyframes").split(";", QString::SkipEmptyParts);
+    int col = keyframe_list->columnCount();
+    QDomNode na = m_params.at(0).firstChildElement("name");
+    QString paramName = i18n(na.toElement().text().toUtf8().data());
+    kDebug()<<" INSERT COL: "<<col<<", "<<paramName;
+    keyframe_list->insertColumn(col);
+    keyframe_list->setHorizontalHeaderItem(col, new QTableWidgetItem(paramName));
+    QStringList frames = m_params.at(0).attribute("keyframes").split(";", QString::SkipEmptyParts);
     for (int i = 0; i < frames.count(); i++) {
-        QString framePos = m_timecode.getTimecodeFromFrames(frames.at(i).section(':', 0, 0).toInt());
-        QTreeWidgetItem *item = new QTreeWidgetItem(QStringList() << framePos << frames.at(i).section(':', 1, 1));
-        item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled);
-        keyframe_list->addTopLevelItem(item);
+       keyframe_list->insertRow(i);
+       QString framePos = m_timecode.getTimecodeFromFrames(frames.at(i).section(':', 0, 0).toInt());
+       keyframe_list->setVerticalHeaderItem(i, new QTableWidgetItem(framePos));
+       keyframe_list->setItem(i, col, new QTableWidgetItem(frames.at(i).section(':', 1, 1)));
+        //item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled);
     }
-    QTreeWidgetItem *first = keyframe_list->topLevelItem(0);
-    if (first) keyframe_list->setCurrentItem(first);
-    slotAdjustKeyframeInfo();
-    button_delete->setEnabled(keyframe_list->topLevelItemCount() > 1);
+    /*QTreeWidgetItem *first = keyframe_list->topLevelItem(0);
+    if (first) keyframe_list->setCurrentItem(first);*/
+    keyframe_list->blockSignals(false);
+    keyframe_list->setCurrentCell(0, 0);
+    //slotAdjustKeyframeInfo();
+    button_delete->setEnabled(keyframe_list->rowCount() > 1);
 }
 
 void KeyframeEdit::slotDeleteKeyframe()
 {
-    if (keyframe_list->topLevelItemCount() < 2) return;
-    QTreeWidgetItem *item = keyframe_list->currentItem();
-    if (item) {
-        delete item;
-        slotGenerateParams();
-    }
-    button_delete->setEnabled(keyframe_list->topLevelItemCount() > 1);
+    if (keyframe_list->rowCount() < 2) return;
+    int col = keyframe_list->currentColumn();
+    int row = keyframe_list->currentRow();
+    keyframe_list->removeRow(keyframe_list->currentRow());
+    row = qMin(row, keyframe_list->rowCount() - 1);
+    keyframe_list->setCurrentCell(row, col);
+    slotGenerateParams(row, col);
+    button_delete->setEnabled(keyframe_list->rowCount() > 1);
 }
 
 void KeyframeEdit::slotAddKeyframe()
 {
     keyframe_list->blockSignals(true);
     int pos2;
-    QTreeWidgetItem *item = keyframe_list->currentItem();
-    if (item == NULL) return;
-    int ix = keyframe_list->indexOfTopLevelItem(item);
-    int pos1 = m_timecode.getFrameCount(item->text(0));
-    QTreeWidgetItem *below = keyframe_list->topLevelItem(ix + 1);
-    if (below == NULL) below = keyframe_list->topLevelItem(ix - 1);
-    if (below == NULL) {
-        if (pos1 == 0) pos2 = m_max;
-        else pos2 = 0;
-    } else {
-        pos2 = m_timecode.getFrameCount(below->text(0));
+    QTableWidgetItem *item = keyframe_list->currentItem();
+    int row = keyframe_list->currentRow();
+    int col = keyframe_list->currentColumn();
+    int newrow = row;
+    int pos1 = m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(row)->text());
+    kDebug()<<"// ADD KF: "<<row<<", MAX: "<<keyframe_list->rowCount()<<", POS: "<<pos1;
+    if (row < (keyframe_list->rowCount() - 1)) {
+       pos2 = m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(row + 1)->text());
+       newrow++;
+    }
+    else if (row == 0) {
+       if (pos1 == 0) {
+           pos2 = m_max * 2;
+           newrow++;
+       }
+        else {
+           pos2 = 0;
+           pos1 = 0;
+       }
     }
+    else pos2 = m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(row - 1)->text());
 
     int result = (pos1 + pos2) / 2;
-    if (result > pos1) ix++;
-    QTreeWidgetItem *newItem = new QTreeWidgetItem(QStringList() << m_timecode.getTimecodeFromFrames(result) << item->text(1));
-    newItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled);
-    keyframe_list->insertTopLevelItem(ix, newItem);
-    keyframe_list->setCurrentItem(newItem);
+    
+    keyframe_list->insertRow(newrow);
+    keyframe_list->setVerticalHeaderItem(newrow, new QTableWidgetItem(m_timecode.getTimecodeFromFrames(result)));
+    keyframe_list->setItem(newrow, keyframe_list->currentColumn(), new QTableWidgetItem(item->text()));
+    keyframe_list->resizeRowToContents(newrow);
     slotAdjustKeyframeInfo();
     keyframe_list->blockSignals(false);
-    button_delete->setEnabled(keyframe_list->topLevelItemCount() > 1);
-    slotGenerateParams();
+    slotGenerateParams(newrow, keyframe_list->currentColumn());
+    button_delete->setEnabled(keyframe_list->rowCount() > 1);
+    keyframe_list->setCurrentCell(newrow, col);
+    //slotGenerateParams(newrow, 0);
 }
 
-void KeyframeEdit::slotGenerateParams(QTreeWidgetItem *item, int column)
+void KeyframeEdit::slotGenerateParams(int row, int column)
 {
-    if (item) {
-        if (column == 0) {
-            QString val = item->text(0);
-            int pos = m_timecode.getFrameCount(val);
-            if (pos <= 0) {
-                pos = 0;
-                val = m_timecode.getTimecodeFromFrames(pos);
-            }
-            if (pos > m_max) {
-                pos = m_max;
-                val = m_timecode.getTimecodeFromFrames(pos);
-            }
-            QList<QTreeWidgetItem *> duplicates = keyframe_list->findItems(val, Qt::MatchExactly, 0);
+    QTableWidgetItem *item = keyframe_list->item(row, column);
+    if (item == NULL) return;
+    QString val = keyframe_list->verticalHeaderItem(row)->text();
+    int pos = m_timecode.getFrameCount(val);
+    if (pos <= 0) {
+       pos = 0;
+        val = m_timecode.getTimecodeFromFrames(pos);
+    }
+    if (pos > m_max) {
+       pos = m_max;
+        val = m_timecode.getTimecodeFromFrames(pos);
+    }
+            /*QList<QTreeWidgetItem *> duplicates = keyframe_list->findItems(val, Qt::MatchExactly, 0);
             duplicates.removeAll(item);
             if (!duplicates.isEmpty()) {
                 // Trying to insert a keyframe at existing value, revert it
                 val = m_timecode.getTimecodeFromFrames(m_previousPos);
-            }
-            if (val != item->text(0)) item->setText(0, val);
-        }
-        if (column == 1) {
-            if (item->text(1).toInt() >= m_param.attribute("max").toInt()) item->setText(1, m_param.attribute("max"));
-            if (item->text(1).toInt() <= m_param.attribute("min").toInt()) item->setText(1, m_param.attribute("min"));
-        }
-       slotAdjustKeyframeInfo();
-    }
+            }*/
+    if (val != keyframe_list->verticalHeaderItem(row)->text()) keyframe_list->verticalHeaderItem(row)->setText(val);
+
+    int v = item->text().toInt();
+    if (v >= m_params.at(column).attribute("max").toInt()) item->setText(m_params.at(column).attribute("max"));
+    if (v <= m_params.at(column).attribute("min").toInt()) item->setText(m_params.at(column).attribute("min"));
+    slotAdjustKeyframeInfo();
+
     QString keyframes;
-    for (int i = 0; i < keyframe_list->topLevelItemCount(); i++) {
-        QTreeWidgetItem *item = keyframe_list->topLevelItem(i);
-        keyframes.append(QString::number(m_timecode.getFrameCount(item->text(0))) + ':' + item->text(1) + ';');
+    for (int i = 0; i < keyframe_list->rowCount(); i++) {
+        keyframes.append(QString::number(m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(i)->text())) + ':' + keyframe_list->item(i, 0)->text() + ';');
     }
-    m_param.setAttribute("keyframes", keyframes);
+    m_params[column].setAttribute("keyframes", keyframes);
     emit parameterChanged();
 }
 
 void KeyframeEdit::slotAdjustKeyframeInfo()
 {
-    QTreeWidgetItem *item = keyframe_list->currentItem();
+    QTableWidgetItem *item = keyframe_list->currentItem();
     if (!item) return;
     int min = 0;
     int max = m_max;
-    QTreeWidgetItem *above = keyframe_list->itemAbove(item);
-    QTreeWidgetItem *below = keyframe_list->itemBelow(item);
-    if (above) min = m_timecode.getFrameCount(above->text(0)) + 1;
-    if (below) max = m_timecode.getFrameCount(below->text(0)) - 1;
+    QTableWidgetItem *above = keyframe_list->item(item->row() - 1, item->column());
+    QTableWidgetItem *below = keyframe_list->item(item->row() + 1, item->column());
+    if (above) min = m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(above->row())->text()) + 1;
+    if (below) max = m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(below->row())->text()) - 1;
     keyframe_pos->blockSignals(true);
     keyframe_pos->setRange(min, max);
-    keyframe_pos->setValue(m_timecode.getFrameCount(item->text(0)));
+    keyframe_pos->setValue(m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(item->row())->text()));
     keyframe_pos->blockSignals(false);
     keyframe_val->blockSignals(true);
-    keyframe_val->setValue(item->text(1).toInt());
+    keyframe_val->setValue(item->text().toInt());
     keyframe_val->blockSignals(false);
 }
 
 void KeyframeEdit::slotAdjustKeyframePos(int value)
 {
-    QTreeWidgetItem *item = keyframe_list->currentItem();
-    item->setText(0, m_timecode.getTimecodeFromFrames(value));
+    QTableWidgetItem *item = keyframe_list->currentItem();
+    keyframe_list->verticalHeaderItem(item->row())->setText(m_timecode.getTimecodeFromFrames(value));
+    slotGenerateParams(item->row(), item->column());
 }
 
 void KeyframeEdit::slotAdjustKeyframeValue(int value)
 {
-    QTreeWidgetItem *item = keyframe_list->currentItem();
-    item->setText(1, QString::number(value));
+    QTableWidgetItem *item = keyframe_list->currentItem();
+    item->setText(QString::number(value));
 }
 
-void KeyframeEdit::slotSaveCurrentParam(QTreeWidgetItem *item, int column)
+/*void KeyframeEdit::slotSaveCurrentParam(QTreeWidgetItem *item, int column)
 {
     if (item && column == 0) m_previousPos = m_timecode.getFrameCount(item->text(0));
-}
+}*/
 
index bd632e0d2308ff45e0e00e47198886cebe86c6a2..9e9758208962c957c48e7cfc44ad7c2a66d094ab 100644 (file)
@@ -77,11 +77,11 @@ class KeyframeEdit : public QWidget, public Ui::KeyframeEditor_UI
 public:
     explicit KeyframeEdit(QDomElement e, int maxFrame, int minVal, int maxVal, Timecode tc, const QString paramName = QString(), QWidget* parent = 0);
     virtual ~KeyframeEdit();
-    void setupParam(QDomElement e = QDomElement());
+    void setupParam();
     void addParameter(QDomElement e);
 
 private:
-    QDomElement m_param;
+    QList <QDomElement> m_params;
     int m_max;
     int m_minVal;
     int m_maxVal;
@@ -95,11 +95,11 @@ public slots:
 private slots:
     void slotDeleteKeyframe();
     void slotAddKeyframe();
-    void slotGenerateParams(QTreeWidgetItem *item = NULL, int column = -1);
+    void slotGenerateParams(int row, int column);
     void slotAdjustKeyframeInfo();
     void slotAdjustKeyframePos(int value);
     void slotAdjustKeyframeValue(int value);
-    void slotSaveCurrentParam(QTreeWidgetItem *item, int column);
+    //void slotSaveCurrentParam(QTreeWidgetItem *item, int column);
 
 signals:
     void parameterChanged();
index 4235daf7236aaf9db5b6d7c0d95c2244bcb8af42..3472928bc236b684ea0104b1aa52b987a1764902 100644 (file)
@@ -1,48 +1,28 @@
-<ui version="4.0" >
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
  <class>Colorval_UI</class>
- <widget class="QWidget" name="Colorval_UI" >
-  <property name="geometry" >
+ <widget class="QWidget" name="Colorval_UI">
+  <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>128</width>
-    <height>60</height>
+    <width>129</width>
+    <height>32</height>
    </rect>
   </property>
-  <layout class="QGridLayout" >
-   <item row="0" column="0" >
-    <layout class="QVBoxLayout" >
-     <item>
-      <widget class="QLabel" name="label" >
-       <property name="text" >
-        <string>TextLabel</string>
-       </property>
-       <property name="alignment" >
-        <set>Qt::AlignCenter</set>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <layout class="QHBoxLayout" >
-       <item>
-        <spacer>
-         <property name="orientation" >
-          <enum>Qt::Horizontal</enum>
-         </property>
-         <property name="sizeHint" >
-          <size>
-           <width>40</width>
-           <height>20</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-       <item>
-        <widget class="KColorButton" name="kcolorbutton" />
-       </item>
-      </layout>
-     </item>
-    </layout>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0">
+    <widget class="QLabel" name="label">
+     <property name="text">
+      <string>TextLabel</string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignCenter</set>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="1">
+    <widget class="KColorButton" name="kcolorbutton"/>
    </item>
   </layout>
  </widget>
index 082f86e6a02f56759915816d753675c9a8350a9a..2d7ab60c6c0d5b7807eb487ffbbcfdc2c4e44986 100644 (file)
@@ -6,38 +6,14 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>213</width>
-    <height>177</height>
+    <width>186</width>
+    <height>153</height>
    </rect>
   </property>
   <layout class="QGridLayout" name="gridLayout">
    <property name="margin">
     <number>0</number>
    </property>
-   <item row="0" column="0" colspan="2">
-    <widget class="QTreeWidget" name="keyframe_list">
-     <property name="alternatingRowColors">
-      <bool>true</bool>
-     </property>
-     <property name="rootIsDecorated">
-      <bool>false</bool>
-     </property>
-     <property name="itemsExpandable">
-      <bool>false</bool>
-     </property>
-     <property name="sortingEnabled">
-      <bool>false</bool>
-     </property>
-     <property name="allColumnsShowFocus">
-      <bool>true</bool>
-     </property>
-     <column>
-      <property name="text">
-       <string notr="true">1</string>
-      </property>
-     </column>
-    </widget>
-   </item>
    <item row="1" column="0">
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
      </property>
     </widget>
    </item>
+   <item row="0" column="0" colspan="2">
+    <widget class="QTableWidget" name="keyframe_list">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="alternatingRowColors">
+      <bool>true</bool>
+     </property>
+     <property name="cornerButtonEnabled">
+      <bool>false</bool>
+     </property>
+     <attribute name="horizontalHeaderHighlightSections">
+      <bool>false</bool>
+     </attribute>
+     <attribute name="horizontalHeaderStretchLastSection">
+      <bool>true</bool>
+     </attribute>
+     <attribute name="verticalHeaderVisible">
+      <bool>true</bool>
+     </attribute>
+     <attribute name="verticalHeaderHighlightSections">
+      <bool>false</bool>
+     </attribute>
+     <attribute name="verticalHeaderVisible">
+      <bool>true</bool>
+     </attribute>
+     <attribute name="horizontalHeaderStretchLastSection">
+      <bool>true</bool>
+     </attribute>
+     <attribute name="horizontalHeaderHighlightSections">
+      <bool>false</bool>
+     </attribute>
+     <attribute name="verticalHeaderHighlightSections">
+      <bool>false</bool>
+     </attribute>
+    </widget>
+   </item>
   </layout>
  </widget>
  <resources/>