VirtualBox

Changeset 34063 in vbox


Ignore:
Timestamp:
Nov 15, 2010 10:59:13 AM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
67745
Message:

FE/Qt4: boot table: enable drag & drop; add icons; code cleanup

Location:
trunk/src/VBox/Frontends/VirtualBox
Files:
4 edited
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk

    r33882 r34063  
    325325        src/widgets/UISpecialControls.h \
    326326        src/widgets/VBoxApplianceEditorWgt.h \
    327         src/widgets/VBoxBootTable.h \
     327        src/widgets/UIBootTable.h \
    328328        src/widgets/VBoxExportApplianceWgt.h \
    329329        src/widgets/VBoxFilePathSelectorWidget.h \
     
    339339        src/selector/UIVMListView.h \
    340340        src/selector/UIVMPreviewWindow.h \
     341        src/selector/UIVMItem.h \
    341342        src/selector/UIVirtualBoxEventHandler.h \
    342343        src/selector/VBoxSelectorWnd.h \
     
    486487        src/widgets/UIToolBar.cpp \
    487488        src/widgets/VBoxApplianceEditorWgt.cpp \
    488         src/widgets/VBoxBootTable.cpp \
     489        src/widgets/UIBootTable.cpp \
    489490        src/widgets/VBoxExportApplianceWgt.cpp \
    490491        src/widgets/VBoxFilePathSelectorWidget.cpp \
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.cpp

    r34007 r34063  
    2727#include <iprt/cdefs.h>
    2828#include <QHeaderView>
    29 
    30 #define ITEM_TYPE_ROLE Qt::UserRole + 1
    3129
    3230UIMachineSettingsSystem::UIMachineSettingsSystem()
     
    7876    for (int i = 0; i < m_possibleBootItems.size(); ++i)
    7977    {
    80         QString name = vboxGlobal().toString(m_possibleBootItems[i]);
    81         QTreeWidgetItem *pItem = new QTreeWidgetItem(QStringList(name));
    82         pItem->setData(0, ITEM_TYPE_ROLE, QVariant(m_possibleBootItems[i]));
    83         pItem->setCheckState(0, Qt::Unchecked);
    84         mTwBootOrder->addTopLevelItem(pItem);
     78        QListWidgetItem *pItem = new UIBootTableItem(m_possibleBootItems[i]);
     79        mTwBootOrder->addItem(pItem);
    8580    }
    8681
     
    9691
    9792    connect (mTbBootItemUp, SIGNAL (clicked()),
    98              this, SLOT (moveBootItemUp()));
     93             mTwBootOrder, SLOT(sltMoveItemUp()));
    9994    connect (mTbBootItemDown, SIGNAL (clicked()),
    100              this, SLOT (moveBootItemDown()));
    101     connect (mTwBootOrder, SIGNAL (moveItemUp()),
    102              this, SLOT (moveBootItemUp()));
    103     connect (mTwBootOrder, SIGNAL (moveItemDown()),
    104              this, SLOT (moveBootItemDown()));
    105     connect (mTwBootOrder, SIGNAL (itemToggled()),
    106              this, SIGNAL (tableChanged()));
    107     connect (mTwBootOrder, SIGNAL (currentItemChanged (QTreeWidgetItem*,
    108                                                        QTreeWidgetItem*)),
    109              this, SLOT (onCurrentBootItemChanged (QTreeWidgetItem*,
    110                                                    QTreeWidgetItem*)));
     95             mTwBootOrder, SLOT(sltMoveItemDown()));
     96    connect (mTwBootOrder, SIGNAL (sigRowChanged(int)),
     97             this, SLOT (onCurrentBootItemChanged (int)));
    11198
    11299    connect (mSlCPU, SIGNAL (valueChanged (int)),
     
    238225    {
    239226        UIBootItemData data = m_cache.m_bootItems[i];
    240         QString name = vboxGlobal().toString(data.m_type);
    241         QTreeWidgetItem *pItem = new QTreeWidgetItem(QStringList(name));
    242         pItem->setData(0, ITEM_TYPE_ROLE, QVariant(data.m_type));
    243         pItem->setCheckState(0, data.m_fEnabled ? Qt::Checked : Qt::Unchecked);
    244         mTwBootOrder->addTopLevelItem(pItem);
     227        QListWidgetItem *pItem = new UIBootTableItem(data.m_type);
     228        pItem->setCheckState(data.m_fEnabled ? Qt::Checked : Qt::Unchecked);
     229        mTwBootOrder->addItem(pItem);
    245230    }
    246231    mCbApic->setChecked(m_cache.m_fIoApicEnabled);
     
    273258    /* Gather internal variables data from QWidget(s): */
    274259    m_cache.m_bootItems.clear();
    275     for (int i = 0; i < mTwBootOrder->topLevelItemCount(); ++i)
    276     {
    277         QTreeWidgetItem *pItem = mTwBootOrder->topLevelItem(i);
     260    for (int i = 0; i < mTwBootOrder->count(); ++i)
     261    {
     262        QListWidgetItem *pItem = mTwBootOrder->item(i);
    278263        UIBootItemData data;
    279         data.m_type = (KDeviceType)pItem->data(0, ITEM_TYPE_ROLE).toInt();
    280         data.m_fEnabled = pItem->checkState(0) == Qt::Checked;
     264        data.m_type = static_cast<UIBootTableItem*>(pItem)->type();
     265        data.m_fEnabled = pItem->checkState() == Qt::Checked;
    281266        m_cache.m_bootItems << data;
    282267    }
     
    450435    Ui::UIMachineSettingsSystem::retranslateUi (this);
    451436
    452     /* Adjust the boot order tree widget */
    453     mTwBootOrder->header()->setResizeMode (QHeaderView::ResizeToContents);
    454     mTwBootOrder->resizeColumnToContents (0);
    455     mTwBootOrder->updateGeometry();
    456     /* Retranslate the boot order items */
    457     QTreeWidgetItemIterator it (mTwBootOrder);
    458     while (*it)
    459     {
    460         QTreeWidgetItem *item = (*it);
    461         item->setText (0, vboxGlobal().toString (
    462              static_cast <KDeviceType> (item->data (0, ITEM_TYPE_ROLE).toInt())));
    463         ++ it;
    464     }
    465437    /* Readjust the tree widget items size */
    466438    adjustBootOrderTWSize();
     
    487459}
    488460
    489 void UIMachineSettingsSystem::moveBootItemUp()
    490 {
    491     QTreeWidgetItem *item = mTwBootOrder->currentItem();
    492     Assert (item);
    493     if (!mTwBootOrder->itemAbove (item))
    494         return;
    495 
    496     int index = mTwBootOrder->indexOfTopLevelItem (item);
    497     QTreeWidgetItem *takenItem = mTwBootOrder->takeTopLevelItem (index);
    498     Assert (takenItem == item);
    499 
    500     mTwBootOrder->insertTopLevelItem (index - 1, takenItem);
    501     mTwBootOrder->setCurrentItem (item);
    502 
    503     emit tableChanged();
    504 }
    505 
    506 void UIMachineSettingsSystem::moveBootItemDown()
    507 {
    508     QTreeWidgetItem *item = mTwBootOrder->currentItem();
    509     Assert (item);
    510     if (!mTwBootOrder->itemBelow (item))
    511         return;
    512 
    513     int index = mTwBootOrder->indexOfTopLevelItem (item);
    514     QTreeWidgetItem *takenItem = mTwBootOrder->takeTopLevelItem (index);
    515     Assert (takenItem == item);
    516 
    517     mTwBootOrder->insertTopLevelItem (index + 1, takenItem);
    518     mTwBootOrder->setCurrentItem (item);
    519 
    520     emit tableChanged();
    521 }
    522 
    523 void UIMachineSettingsSystem::onCurrentBootItemChanged (QTreeWidgetItem *aItem,
    524                                                      QTreeWidgetItem *)
    525 {
    526     bool upEnabled   = aItem && mTwBootOrder->itemAbove (aItem);
    527     bool downEnabled = aItem && mTwBootOrder->itemBelow (aItem);
     461void UIMachineSettingsSystem::onCurrentBootItemChanged (int i)
     462{
     463    bool upEnabled   = i > 0;
     464    bool downEnabled = i < mTwBootOrder->count() - 1;
    528465    if ((mTbBootItemUp->hasFocus() && !upEnabled) ||
    529466        (mTbBootItemDown->hasFocus() && !downEnabled))
     
    535472void UIMachineSettingsSystem::adjustBootOrderTWSize()
    536473{
    537     /* Calculate the optimal size of the tree widget & set it as fixed
    538      * size. */
    539 
    540     QAbstractItemView *iv = qobject_cast <QAbstractItemView*> (mTwBootOrder);
    541 
    542     int h = 2 * mTwBootOrder->frameWidth();
    543     int w = h;
    544 #if QT_VERSION < 0x040700
    545 # ifdef Q_WS_MAC
    546     int left, top, right, bottom;
    547     mTwBootOrder->getContentsMargins (&left, &top, &right, &bottom);
    548     h += top + bottom;
    549     w += left + right;
    550 # else /* Q_WS_MAC */
    551     w += 4;
    552 # endif /* !Q_WS_MAC */
    553 #endif /* QT_VERSION < 0x040700 */
    554     mTwBootOrder->setFixedSize(
    555         iv->sizeHintForColumn(0) + w,
    556         iv->sizeHintForRow(0) * mTwBootOrder->topLevelItemCount() + h);
     474    mTwBootOrder->adjustSizeToFitContent();
    557475
    558476    /* Update the layout system */
     
    591509            {
    592510                if (!mTwBootOrder->currentItem())
    593                     mTwBootOrder->setCurrentItem (mTwBootOrder->topLevelItem (0));
     511                    mTwBootOrder->setCurrentItem (mTwBootOrder->item (0));
    594512                else
    595                     onCurrentBootItemChanged (mTwBootOrder->currentItem());
     513                    onCurrentBootItemChanged (mTwBootOrder->currentRow());
    596514                mTwBootOrder->currentItem()->setSelected (true);
    597515            }
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.h

    r33932 r34063  
    9696    void textChangedRAM (const QString &aText);
    9797
    98     void moveBootItemUp();
    99     void moveBootItemDown();
    100     void onCurrentBootItemChanged (QTreeWidgetItem *aItem,
    101                                    QTreeWidgetItem *aPrev = 0);
     98    void onCurrentBootItemChanged (int);
    10299
    103100    void valueChangedCPU (int aVal);
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.ui

    r33882 r34063  
    172172         </property>
    173173         <item>
    174           <widget class="VBoxBootTable" name="mTwBootOrder">
     174          <widget class="UIBootTable" name="mTwBootOrder">
    175175           <property name="sizePolicy">
    176176            <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
     
    189189           </property>
    190190           <property name="alternatingRowColors">
    191             <bool>true</bool>
    192            </property>
    193            <property name="rootIsDecorated">
    194             <bool>false</bool>
    195            </property>
    196            <property name="uniformRowHeights">
    197191            <bool>true</bool>
    198192           </property>
     
    639633 <customwidgets>
    640634  <customwidget>
    641    <class>VBoxBootTable</class>
    642    <extends>QTreeWidget</extends>
    643    <header>VBoxBootTable.h</header>
     635   <class>UIBootTable</class>
     636   <extends>QListWidget</extends>
     637   <header>UIBootTable.h</header>
    644638  </customwidget>
    645639  <customwidget>
  • trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIBootTable.cpp

    r34018 r34063  
    33 *
    44 * VBox frontends: Qt4 GUI ("VirtualBox"):
    5  * VBoxBootTable class implementation
     5 * UIBootTable class implementation
    66 */
    77
     
    1919
    2020/* Global include */
    21 #include <QHeaderView>
    22 #include <QKeyEvent>
     21#include <QScrollBar>
    2322
    2423/* Local includes */
    25 #include "VBoxBootTable.h"
     24#include "UIBootTable.h"
    2625#include "VBoxGlobal.h"
    2726
    28 VBoxBootTable::VBoxBootTable(QWidget *pParent)
    29     : QTreeWidget(pParent)
     27UIBootTableItem::UIBootTableItem(KDeviceType type)
     28  : m_type(type)
    3029{
    31     header()->hide();
    32     connect(this, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(onItemChanged()));
     30    setCheckState(Qt::Unchecked);
     31    switch(type)
     32    {
     33        case KDeviceType_Floppy:
     34        {
     35            setIcon(QIcon(":fd_16px.png"));
     36            break;
     37        }
     38        case KDeviceType_DVD:
     39        {
     40            setIcon(QIcon(":cd_16px.png"));
     41            break;
     42        }
     43        case KDeviceType_HardDisk:
     44        {
     45            setIcon(QIcon(":hd_16px.png"));
     46            break;
     47        }
     48        case KDeviceType_Network:
     49        {
     50            setIcon(QIcon(":nw_16px.png"));
     51            break;
     52        }
     53    }
     54    retranslateUi();
    3355}
    3456
    35 void VBoxBootTable::onItemChanged()
     57KDeviceType UIBootTableItem::type() const
    3658{
    37     emit itemToggled();
     59    return m_type;
    3860}
    3961
    40 void VBoxBootTable::keyPressEvent(QKeyEvent *pEvent)
     62void UIBootTableItem::retranslateUi()
    4163{
    42     if (pEvent->QInputEvent::modifiers() == Qt::ControlModifier)
     64    setText(vboxGlobal().toString(m_type));
     65}
     66
     67UIBootTable::UIBootTable(QWidget *pParent /* = 0 */)
     68    : QIWithRetranslateUI<QListWidget>(pParent)
     69{
     70    setDragDropMode(QAbstractItemView::InternalMove);
     71    setSelectionMode(QAbstractItemView::SingleSelection);
     72    setDropIndicatorShown(true);
     73    setUniformItemSizes(true);
     74    connect(this, SIGNAL(currentRowChanged(int)),
     75            this, SIGNAL(sigRowChanged(int)));
     76}
     77
     78void UIBootTable::adjustSizeToFitContent()
     79{
     80    int h = 2 * frameWidth();
     81    int w = h;
     82#if QT_VERSION < 0x040700
     83# ifdef Q_WS_MAC
     84    int left, top, right, bottom;
     85    getContentsMargins(&left, &top, &right, &bottom);
     86    h += top + bottom;
     87    w += left + right;
     88# else /* Q_WS_MAC */
     89    w += 4;
     90# endif /* !Q_WS_MAC */
     91#endif /* QT_VERSION < 0x040700 */
     92    setFixedSize(sizeHintForColumn(0) + w,
     93                 sizeHintForRow(0) * count() + h);
     94}
     95
     96void UIBootTable::sltMoveItemUp()
     97{
     98    QModelIndex index = currentIndex();
     99    moveItemTo(index, index.row() - 1);
     100}
     101
     102void UIBootTable::sltMoveItemDown()
     103{
     104    QModelIndex index = currentIndex();
     105    moveItemTo(index, index.row() + 2);
     106}
     107
     108void UIBootTable::retranslateUi()
     109{
     110    for (int i = 0; i < count(); ++i)
     111        static_cast<UIBootTableItem*>(item(i))->retranslateUi();
     112
     113    adjustSizeToFitContent();
     114}
     115
     116void UIBootTable::dropEvent(QDropEvent *pEvent)
     117{
     118    QListWidget::dropEvent(pEvent);
     119    emit sigRowChanged(currentRow());
     120}
     121
     122QModelIndex UIBootTable::moveCursor(QAbstractItemView::CursorAction cursorAction, Qt::KeyboardModifiers modifiers)
     123{
     124    if (modifiers.testFlag(Qt::ControlModifier))
    43125    {
    44         switch (pEvent->key())
     126        switch (cursorAction)
    45127        {
    46             case Qt::Key_Up:
    47                 emit moveItemUp();
    48                 return;
    49             case Qt::Key_Down:
    50                 emit moveItemDown();
    51                 return;
     128            case QAbstractItemView::MoveUp:
     129            {
     130                QModelIndex index = currentIndex();
     131                return moveItemTo(index, index.row() - 1);
     132            }
     133            case QAbstractItemView::MoveDown:
     134            {
     135                QModelIndex index = currentIndex();
     136                return moveItemTo(index, index.row() + 2);
     137            }
     138            case QAbstractItemView::MovePageUp:
     139            {
     140                QModelIndex index = currentIndex();
     141                return moveItemTo(index, qMax(0, index.row() - verticalScrollBar()->pageStep()));
     142            }
     143            case QAbstractItemView::MovePageDown:
     144            {
     145                QModelIndex index = currentIndex();
     146                return moveItemTo(index, qMin(model()->rowCount(), index.row() + verticalScrollBar()->pageStep() + 1));
     147            }
     148            case QAbstractItemView::MoveHome:
     149                return moveItemTo(currentIndex(), 0);
     150            case QAbstractItemView::MoveEnd:
     151                return moveItemTo(currentIndex(), model()->rowCount());
    52152            default:
    53153                break;
    54154        }
    55155    }
    56     QTreeWidget::keyPressEvent(pEvent);
     156    return QListWidget::moveCursor(cursorAction, modifiers);
    57157}
    58158
     159QModelIndex UIBootTable::moveItemTo(const QModelIndex &index, int row)
     160{
     161    if (!index.isValid())
     162        return QModelIndex();
     163
     164    if (row < 0 || row > model()->rowCount())
     165        return QModelIndex();
     166
     167    QPersistentModelIndex oldIndex(index);
     168    UIBootTableItem *pItem = static_cast<UIBootTableItem*>(itemFromIndex(oldIndex));
     169    insertItem(row, new UIBootTableItem(*pItem));
     170    QPersistentModelIndex newIndex = model()->index(row, 0);
     171    delete takeItem(oldIndex.row());
     172    setCurrentRow(newIndex.row());
     173    return newIndex;
     174}
     175
  • trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIBootTable.h

    r34018 r34063  
    22 *
    33 * VBox frontends: Qt4 GUI ("VirtualBox"):
    4  * VBoxBootTable class declaration
     4 * UIBootTable class declaration
    55 */
    66
    77/*
    8  * Copyright (C) 2009 Oracle Corporation
     8 * Copyright (C) 2009-2010 Oracle Corporation
    99 *
    1010 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    1717 */
    1818
    19 #ifndef __VBoxBootTable_h__
    20 #define __VBoxBootTable_h__
     19#ifndef __UIBootTable_h__
     20#define __UIBootTable_h__
     21
     22/* Local includes */
     23#include <COMDefs.h>
     24#include "QIWithRetranslateUI.h"
    2125
    2226/* Global includes */
    23 #include <QTreeWidget>
     27#include <QListWidget>
    2428
    25 /**
    26  *  QTreeWidget class reimplementation to use as boot items table.
    27  *  It has one unsorted column without header.
    28  *  Keymapping handlers for ctrl-up & ctrl-down are translated into
    29  *  boot-items up/down moving signals.
    30  *  Emits itemToggled() signal when the item changed.
    31  */
    32 class VBoxBootTable : public QTreeWidget
     29class UIBootTableItem : public QListWidgetItem
     30{
     31public:
     32
     33    UIBootTableItem(KDeviceType type);
     34
     35    KDeviceType type() const;
     36
     37    void retranslateUi();
     38
     39private:
     40
     41    /* Private member vars */
     42    KDeviceType m_type;
     43
     44};
     45
     46class UIBootTable : public QIWithRetranslateUI<QListWidget>
    3347{
    3448    Q_OBJECT;
     
    3650public:
    3751
    38     VBoxBootTable(QWidget *pParent);
     52    UIBootTable(QWidget *pParent = 0);
     53
     54    void adjustSizeToFitContent();
     55
     56public slots:
     57
     58    void sltMoveItemUp();
     59    void sltMoveItemDown();
    3960
    4061signals:
    4162
    42     void moveItemUp();
    43     void moveItemDown();
    44     void itemToggled();
     63    void sigRowChanged(int);
    4564
    4665protected:
    4766
    48     void keyPressEvent(QKeyEvent *pEvent);
    49 
    50 private slots:
    51 
    52     void onItemChanged();
     67    void retranslateUi();
     68    void dropEvent(QDropEvent *pEvent);
     69    QModelIndex moveCursor(QAbstractItemView::CursorAction cursorAction, Qt::KeyboardModifiers modifiers);
     70    QModelIndex moveItemTo(const QModelIndex &index, int row);
    5371};
    5472
    55 #endif // __VBoxBootTable_h__
     73#endif // __UIBootTable_h__
    5674
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette