VirtualBox

Changeset 76762 in vbox


Ignore:
Timestamp:
Jan 10, 2019 8:57:13 PM (6 years ago)
Author:
vboxsync
Message:

FE/Qt: bugref:9080: Adding drag-drop functionality between host and iso content browsers.

Location:
trunk/src/VBox/Frontends/VirtualBox/src/medium/viso
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/viso/UIVisoBrowserBase.cpp

    r76730 r76762  
    3232    : QWidget(pParent)
    3333    , m_pTreeView(0)
    34     , m_pTableView(0)
    3534    , m_pTitleLabel(0)
    3635    , m_pRightContainerWidget(0)
     
    9493    }
    9594
    96     m_pTableView = new QTableView;
    97     if (m_pTableView)
    98     {
    99         m_pRightContainerLayout->addWidget(m_pTableView, 0, 0, 6, 4);
    100         m_pTableView->setSelectionMode(QAbstractItemView::ContiguousSelection);
    101         m_pTableView->setShowGrid(false);
    102         m_pTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    103         m_pTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    104         m_pTableView->setAlternatingRowColors(true);
    105         QHeaderView *pVerticalHeader = m_pTableView->verticalHeader();
    106         if (pVerticalHeader)
    107         {
    108             m_pTableView->verticalHeader()->setVisible(false);
    109             /* Minimize the row height: */
    110             m_pTableView->verticalHeader()->setDefaultSectionSize(m_pTableView->verticalHeader()->minimumSectionSize());
    111         }
    112         QHeaderView *pHorizontalHeader = m_pTableView->horizontalHeader();
    113         if (pHorizontalHeader)
    114         {
    115             pHorizontalHeader->setHighlightSections(false);
    116             pHorizontalHeader->setSectionResizeMode(QHeaderView::Stretch);
    117         }
    118     }
    11995
    12096    m_pVerticalToolBar = new UIToolBar;
     
    135111void UIVisoBrowserBase::prepareConnections()
    136112{
    137     if (m_pTableView)
    138         connect(m_pTableView, &QTableView::doubleClicked,
    139                 this, &UIVisoBrowserBase::sltHandleTableViewItemDoubleClick);
    140113    if (m_pTreeView)
    141114    {
     
    154127void UIVisoBrowserBase::sltHandleTreeSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
    155128{
    156     if (!m_pTableView)
    157         return;
    158129    Q_UNUSED(deselected);
    159130    QModelIndexList indices = selected.indexes();
     
    163134    treeSelectionChanged(selectedIndex);
    164135}
     136
    165137
    166138void UIVisoBrowserBase::sltHandleTreeItemClicked(const QModelIndex &modelIndex)
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/viso/UIVisoBrowserBase.h

    r76730 r76762  
    4646    virtual void showHideHiddenObjects(bool bShow) = 0;
    4747
     48public slots:
     49
     50    void sltHandleTableViewItemDoubleClick(const QModelIndex &index);
     51
    4852protected:
    4953
     
    5862
    5963    QTreeView          *m_pTreeView;
    60     QTableView         *m_pTableView;
    6164    QLabel             *m_pTitleLabel;
    6265    QWidget            *m_pRightContainerWidget;
     
    6972
    7073private slots:
    71     void sltHandleTableViewItemDoubleClick(const QModelIndex &index);
     74
    7275    void sltHandleTreeSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
    7376    void sltHandleTreeItemClicked(const QModelIndex &modelIndex);
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/viso/UIVisoContentBrowser.cpp

    r76750 r76762  
    2727#include <QLabel>
    2828#include <QListView>
     29#include <QMimeData>
    2930#include <QSplitter>
    3031#include <QTableView>
     
    3940
    4041
     42
     43/*********************************************************************************************************************************
     44*   UIVisoContentTableView definition.                                                                                      *
     45*********************************************************************************************************************************/
     46/** An QTableView extension mainly used to handle dropeed file objects from the host browser. */
     47class UIVisoContentTableView : public QTableView
     48{
     49    Q_OBJECT;
     50
     51signals:
     52
     53    void sigNewItemsDropped(QStringList pathList);
     54
     55public:
     56
     57    UIVisoContentTableView(QWidget *pParent = 0);
     58    void dragEnterEvent(QDragEnterEvent *event);
     59    void dropEvent(QDropEvent *event);
     60    void dragMoveEvent(QDragMoveEvent *event);
     61};
     62
     63
    4164/*********************************************************************************************************************************
    4265*   UIVisoContentTreeProxyModel definition.                                                                                      *
     
    5679    /** Used to filter-out files and show only directories. */
    5780    virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const /* override */;
    58 
    5981};
     82
     83
     84/*********************************************************************************************************************************
     85*   UIVisoContentTableView implementation.                                                                                       *
     86*********************************************************************************************************************************/
     87UIVisoContentTableView::UIVisoContentTableView(QWidget *pParent /* = 0 */)
     88    :QTableView(pParent)
     89{
     90}
     91
     92void UIVisoContentTableView::dragMoveEvent(QDragMoveEvent *event)
     93{
     94    event->acceptProposedAction();
     95
     96}
     97
     98void UIVisoContentTableView::dragEnterEvent(QDragEnterEvent *pEvent)
     99{
     100    if (pEvent->mimeData()->hasFormat("application/vnd.text.list"))
     101        pEvent->accept();
     102    else
     103        pEvent->ignore();
     104}
     105
     106void UIVisoContentTableView::dropEvent(QDropEvent *pEvent)
     107{
     108    if (pEvent->mimeData()->hasFormat("application/vnd.text.list"))
     109    {
     110        QByteArray itemData = pEvent->mimeData()->data("application/vnd.text.list");
     111        QDataStream stream(&itemData, QIODevice::ReadOnly);
     112        QStringList pathList;
     113
     114        while (!stream.atEnd()) {
     115            QString text;
     116            stream >> text;
     117            pathList << text;
     118        }
     119        emit sigNewItemsDropped(pathList);
     120    }
     121}
    60122
    61123
     
    94156UIVisoContentBrowser::UIVisoContentBrowser(QWidget *pParent)
    95157    : QIWithRetranslateUI<UIVisoBrowserBase>(pParent)
     158    , m_pTableView(0)
    96159    , m_pModel(0)
    97160    , m_pTableProxyModel(0)
     
    342405    }
    343406
     407    m_pTableView = new UIVisoContentTableView;
    344408    if (m_pTableView)
    345409    {
     410        m_pRightContainerLayout->addWidget(m_pTableView, 0, 0, 6, 4);
     411        m_pTableView->setSelectionMode(QAbstractItemView::ContiguousSelection);
     412        m_pTableView->setShowGrid(false);
     413        m_pTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
     414        m_pTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
     415        m_pTableView->setAlternatingRowColors(true);
     416        QHeaderView *pVerticalHeader = m_pTableView->verticalHeader();
     417        if (pVerticalHeader)
     418        {
     419            m_pTableView->verticalHeader()->setVisible(false);
     420            /* Minimize the row height: */
     421            m_pTableView->verticalHeader()->setDefaultSectionSize(m_pTableView->verticalHeader()->minimumSectionSize());
     422        }
     423        QHeaderView *pHorizontalHeader = m_pTableView->horizontalHeader();
     424        if (pHorizontalHeader)
     425        {
     426            pHorizontalHeader->setHighlightSections(false);
     427            pHorizontalHeader->setSectionResizeMode(QHeaderView::Stretch);
     428        }
     429
    346430        m_pTableView->setModel(m_pTableProxyModel);
    347431        setTableRootIndex();
     
    353437        m_pTableView->setSortingEnabled(true);
    354438        m_pTableView->sortByColumn(0, Qt::AscendingOrder);
     439
     440        m_pTableView->setDragEnabled(false);
     441        m_pTableView->setAcceptDrops(true);
     442        m_pTableView->setDropIndicatorShown(true);
     443        m_pTableView->setDragDropMode(QAbstractItemView::DropOnly);
    355444    }
    356445
     
    397486{
    398487    UIVisoBrowserBase::prepareConnections();
     488
     489    if (m_pTableView)
     490    {
     491        connect(m_pTableView, &UIVisoContentTableView::doubleClicked,
     492                this, &UIVisoBrowserBase::sltHandleTableViewItemDoubleClick);
     493        connect(m_pTableView, &UIVisoContentTableView::sigNewItemsDropped,
     494                this, &UIVisoContentBrowser::sltHandleDroppedItems);
     495    }
     496
    399497    if (m_pNewDirectoryAction)
    400498        connect(m_pNewDirectoryAction, &QAction::triggered,
     
    668766}
    669767
     768void UIVisoContentBrowser::sltHandleDroppedItems(QStringList pathList)
     769{
     770    addObjectsToViso(pathList);
     771}
     772
    670773void UIVisoContentBrowser::reset()
    671774{
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/viso/UIVisoContentBrowser.h

    r76750 r76762  
    4343class UIVisoContentTreeProxyModel;
    4444class UICustomFileSystemItem;
     45class UIVisoContentTableView;
    4546
    4647class SHARED_LIBRARY_STUFF UIVisoContentBrowser : public QIWithRetranslateUI<UIVisoBrowserBase>
     
    7980    void sltHandleTableSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
    8081    void sltHandleResetAction();
     82    void sltHandleDroppedItems(QStringList pathList);
    8183
    8284private:
     
    101103     *  in the table view. */
    102104    QList<UICustomFileSystemItem*> tableSelectedItems();
    103 
     105    UIVisoContentTableView       *m_pTableView;
    104106    UICustomFileSystemModel      *m_pModel;
    105107    UICustomFileSystemProxyModel *m_pTableProxyModel;
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/viso/UIVisoHostBrowser.cpp

    r76750 r76762  
    2020#include <QDir>
    2121#include <QFileSystemModel>
     22#include <QGridLayout>
    2223#include <QHeaderView>
    2324#include <QLabel>
    2425#include <QListView>
     26#include <QMimeData>
    2527#include <QTableView>
    2628#include <QTreeView>
     
    4446    virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const /* override */;
    4547    UIVisoHostBrowserModel(QObject *pParent);
     48
     49    virtual QStringList mimeTypes() const /* override */;
     50    /** Prepares the mime data  as a list of text consisting of dragged objects full file path. */
     51    QMimeData *mimeData(const QModelIndexList &indexes) const /* override */;
    4652
    4753protected:
     
    7884}
    7985
     86QStringList UIVisoHostBrowserModel::mimeTypes() const
     87{
     88    QStringList types;
     89    types << "application/vnd.text.list";
     90    return types;
     91}
     92
     93QMimeData *UIVisoHostBrowserModel::mimeData(const QModelIndexList &indexes) const
     94{
     95    QMimeData *mimeData = new QMimeData();
     96    QByteArray encodedData;
     97
     98    QDataStream stream(&encodedData, QIODevice::WriteOnly);
     99
     100    foreach (const QModelIndex &index, indexes) {
     101        if (index.isValid() && index.column() == 0)
     102        {
     103            QString strPath = fileInfo(index).filePath();
     104            if (!strPath.contains(".."))
     105                stream << fileInfo(index).filePath();
     106        }
     107    }
     108
     109    mimeData->setData("application/vnd.text.list", encodedData);
     110    return mimeData;
     111}
     112
    80113/*********************************************************************************************************************************
    81114*   UIVisoHostBrowser implementation.                                                                                   *
     
    87120    , m_pTableModel(0)
    88121    , m_pAddAction(0)
     122    , m_pTableView(0)
    89123{
    90124    prepareObjects();
     
    128162    }
    129163
     164    m_pTableView = new QTableView;
    130165    if (m_pTableView)
    131166    {
     167        m_pRightContainerLayout->addWidget(m_pTableView, 0, 0, 6, 4);
     168        m_pTableView->setSelectionMode(QAbstractItemView::ContiguousSelection);
     169        m_pTableView->setShowGrid(false);
     170        m_pTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
     171        m_pTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
     172        m_pTableView->setAlternatingRowColors(true);
     173        QHeaderView *pVerticalHeader = m_pTableView->verticalHeader();
     174        if (pVerticalHeader)
     175        {
     176            m_pTableView->verticalHeader()->setVisible(false);
     177            /* Minimize the row height: */
     178            m_pTableView->verticalHeader()->setDefaultSectionSize(m_pTableView->verticalHeader()->minimumSectionSize());
     179        }
     180        QHeaderView *pHorizontalHeader = m_pTableView->horizontalHeader();
     181        if (pHorizontalHeader)
     182        {
     183            pHorizontalHeader->setHighlightSections(false);
     184            pHorizontalHeader->setSectionResizeMode(QHeaderView::Stretch);
     185        }
     186
    132187        m_pTableView->setModel(m_pTableModel);
    133188        setTableRootIndex();
    134189        /* Hide the "type" column: */
    135190        m_pTableView->hideColumn(2);
     191
     192        m_pTableView->setSelectionMode(QAbstractItemView::ExtendedSelection);
     193        m_pTableView->setDragDropMode(QAbstractItemView::DragOnly);
    136194    }
    137195
     
    154212{
    155213    UIVisoBrowserBase::prepareConnections();
     214    if (m_pTableView)
     215        connect(m_pTableView, &QTableView::doubleClicked,
     216                this, &UIVisoBrowserBase::sltHandleTableViewItemDoubleClick);
     217
    156218    if (m_pTableView->selectionModel())
    157219        connect(m_pTableView->selectionModel(), &QItemSelectionModel::selectionChanged,
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/viso/UIVisoHostBrowser.h

    r76750 r76762  
    7171    UIVisoHostBrowserModel *m_pTableModel;
    7272    QAction                *m_pAddAction;
     73    QTableView             *m_pTableView;
     74
    7375};
    7476
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