VirtualBox

Changeset 75897 in vbox


Ignore:
Timestamp:
Dec 3, 2018 12:29:15 PM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
127101
Message:

FE/Qt: bugref:6699. Improving the file operations panel.

Location:
trunk/src/VBox/Frontends/VirtualBox/src/guestctrl
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIGuestControlFileManager.cpp

    r75835 r75897  
    349349    connect(m_pActionPool->action(UIActionIndex_M_GuestControlFileManager_S_MoveToGuest), &QAction::triggered,
    350350             this, &UIGuestControlFileManager::sltMoveHostToGuest);
    351 
    352351    layout ->addWidget(m_pVerticalToolBar);
    353352}
     
    393392        connect(m_pActionPool->action(UIActionIndex_M_GuestControlFileManager_T_FileOperations), &QAction::toggled,
    394393                this, &UIGuestControlFileManager::sltPanelActionToggled);
     394
     395#ifdef TEST_COPY
     396
     397        m_pToolBar->addSeparator();
     398        QAction *pSession = new QAction("session", this);
     399        QAction *pCopy = new QAction("Copy", this);
     400        m_pToolBar->addAction(pSession);
     401        m_pToolBar->addAction(pCopy);
     402
     403        connect(pSession, &QAction::triggered,
     404                this, &UIGuestControlFileManager::sltTestSession);
     405        connect(pCopy, &QAction::triggered,
     406                this, &UIGuestControlFileManager::sltTestCopy);
     407
     408#endif
    395409
    396410#ifdef VBOX_WS_MAC
     
    810824}
    811825
     826void UIGuestControlFileManager::sltTestSession()
     827{
     828    createSession("vbox", "password");
     829}
     830
     831void UIGuestControlFileManager::sltTestCopy()
     832{
     833    QStringList sources;
     834    sources << "/home/serkan/misos/xenialpup-7.5-uefi.iso";
     835    if ( m_pGuestFileTable)
     836        m_pGuestFileTable->copyHostToGuest(sources, false, "/home/vbox/test");
     837}
     838
    812839#include "UIGuestControlFileManager.moc"
  • trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIGuestControlFileManager.h

    r75835 r75897  
    125125    void sltHandleOptionsUpdated();
    126126
     127    void sltTestCopy();
     128    void sltTestSession();
     129
    127130private:
    128131
     
    170173    QStringList               getFsObjInfoStringList(const T &fsObjectInfo) const;
    171174    void                      appendLog(const QString &strLog, FileManagerLogType eLogType);
    172 
    173175    CGuest                    m_comGuest;
    174176    CGuestSession             m_comGuestSession;
  • trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIGuestControlFileManagerOperationsPanel.cpp

    r75827 r75897  
    2222/* Qt includes: */
    2323# include <QHBoxLayout>
     24# include <QGridLayout>
    2425# include <QLabel>
    2526# include <QMenu>
     
    6566    void sigProgressComplete(QUuid progressId);
    6667    void sigProgressFail(QString strErrorString, FileManagerLogType eLogType);
     68    void sigFocusIn(QWidget *pWidget);
     69    void sigFocusOut(QWidget *pWidget);
    6770
    6871protected:
    6972
    7073    virtual void retranslateUi() /* override */;
    71     // virtual void focusInEvent(QFocusEvent *pEvent) /* override */;
    72     // virtual void focusOutEvent(QFocusEvent *pEvent) /* override */;
     74    virtual void focusInEvent(QFocusEvent *pEvent) /* override */;
     75    virtual void focusOutEvent(QFocusEvent *pEvent) /* override */;
    7376
    7477private slots:
     
    7982
    8083private:
    81 
     84    enum OperationStatus
     85    {
     86        OperationStatus_NotStarted,
     87        OperationStatus_Working,
     88        OperationStatus_Paused,
     89        OperationStatus_Canceled,
     90        OperationStatus_Succeded,
     91        OperationStatus_Failed,
     92        OperationStatus_Invalid,
     93        OperationStatus_Max
     94
     95    };
    8296    void prepare();
    8397    void prepareWidgets();
     
    8599    void cleanupEventHandler();
    86100
     101    OperationStatus         m_eStatus;
    87102    CProgress               m_comProgress;
    88103    UIProgressEventHandler *m_pEventHandler;
    89     QHBoxLayout            *m_pMainLayout;
     104    QGridLayout            *m_pMainLayout;
    90105    QProgressBar           *m_pProgressBar;
    91106    QIToolButton           *m_pCancelButton;
    92107    QILabel                *m_pStatusLabel;
     108    QILabel                *m_pPercentageLabel;
    93109};
    94110
     
    100116UIFileOperationProgressWidget::UIFileOperationProgressWidget(const CProgress &comProgress, QWidget *pParent /* = 0 */)
    101117    : QIWithRetranslateUI<QFrame>(pParent)
     118    , m_eStatus(OperationStatus_NotStarted)
    102119    , m_comProgress(comProgress)
    103120    , m_pEventHandler(0)
     
    106123    , m_pCancelButton(0)
    107124    , m_pStatusLabel(0)
     125    , m_pPercentageLabel(0)
    108126{
    109127    prepare();
     
    134152{
    135153    if (m_pCancelButton)
    136         m_pCancelButton->setToolTip(UIGuestControlFileManager::tr("Close the pane"));
     154        m_pCancelButton->setToolTip(UIGuestControlFileManager::tr("Cancel"));
     155
     156    switch (m_eStatus)
     157    {
     158        case OperationStatus_NotStarted:
     159            m_pStatusLabel->setText(UIGuestControlFileManager::tr("Not yet started"));
     160            break;
     161        case OperationStatus_Working:
     162            m_pStatusLabel->setText(UIGuestControlFileManager::tr("Working"));
     163            break;
     164        case OperationStatus_Paused:
     165            m_pStatusLabel->setText(UIGuestControlFileManager::tr("Paused"));
     166            break;
     167        case OperationStatus_Canceled:
     168            m_pStatusLabel->setText(UIGuestControlFileManager::tr("Canceled"));
     169            break;
     170        case OperationStatus_Succeded:
     171            m_pStatusLabel->setText(UIGuestControlFileManager::tr("Succeded"));
     172            break;
     173        case OperationStatus_Failed:
     174            m_pStatusLabel->setText(UIGuestControlFileManager::tr("Failed"));
     175            break;
     176        case OperationStatus_Invalid:
     177        case OperationStatus_Max:
     178        default:
     179            m_pStatusLabel->setText(UIGuestControlFileManager::tr("Invalid"));
     180            break;
     181    }
     182}
     183
     184void UIFileOperationProgressWidget::focusInEvent(QFocusEvent *pEvent)
     185{
     186    QFrame::focusInEvent(pEvent);
     187    emit sigFocusIn(this);
     188}
     189
     190void UIFileOperationProgressWidget::focusOutEvent(QFocusEvent *pEvent)
     191{
     192    QFrame::focusOutEvent(pEvent);
     193    emit sigFocusOut(this);
    137194}
    138195
     
    146203void UIFileOperationProgressWidget::prepareWidgets()
    147204{
    148     m_pMainLayout = new QHBoxLayout;
     205    m_pMainLayout = new QGridLayout;
    149206    if (!m_pMainLayout)
    150207        return;
     
    158215        if (!m_comProgress.isNull() && !m_comProgress.GetCancelable())
    159216            m_pCancelButton->setEnabled(false);
    160         m_pMainLayout->addWidget(m_pCancelButton);
     217        m_pMainLayout->addWidget(m_pCancelButton, 0, 0, 1, 1);
    161218    }
    162219
     
    166223        m_pProgressBar->setMinimum(0);
    167224        m_pProgressBar->setMaximum(100);
    168         m_pProgressBar->setTextVisible(true);
    169         m_pMainLayout->addWidget(m_pProgressBar);
     225        /* Hide the QProgressBar's text since in MacOS it never shows: */
     226        m_pProgressBar->setTextVisible(false);
     227        m_pMainLayout->addWidget(m_pProgressBar, 0, 1, 1, 2);
    170228    }
    171229    m_pStatusLabel = new QILabel;
    172230    if (m_pStatusLabel)
    173231    {
    174         m_pMainLayout->addWidget(m_pStatusLabel);
    175         m_pStatusLabel->setText(UIGuestControlFileManager::tr("Idle"));
    176     }
    177     m_pMainLayout->addStretch();
     232        m_pStatusLabel->setContextMenuPolicy(Qt::NoContextMenu);
     233        m_pMainLayout->addWidget(m_pStatusLabel, 0, 3, 1, 1);
     234    }
     235
     236    m_pPercentageLabel = new QILabel;
     237    if (m_pPercentageLabel)
     238    {
     239        m_pPercentageLabel->setContextMenuPolicy(Qt::NoContextMenu);
     240        m_pMainLayout->addWidget(m_pPercentageLabel, 1, 1, 1, 4);
     241    }
    178242
    179243    setLayout(m_pMainLayout);
     244    retranslateUi();
    180245}
    181246
     
    189254    connect(m_pEventHandler, &UIProgressEventHandler::sigProgressTaskComplete,
    190255            this, &UIFileOperationProgressWidget::sltHandleProgressComplete);
    191     m_pStatusLabel->setText(UIGuestControlFileManager::tr("Working"));
     256    m_eStatus = OperationStatus_Working;
     257    retranslateUi();
    192258}
    193259
     
    203269    Q_UNUSED(iPercent);
    204270    m_pProgressBar->setValue(iPercent);
    205 
     271    if (m_pPercentageLabel)
     272        m_pPercentageLabel->setText(QString("%1%").arg(QString::number(iPercent)));
    206273}
    207274
     
    215282    {
    216283        emit sigProgressFail(UIErrorString::formatErrorInfo(m_comProgress), FileManagerLogType_Error);
    217         if (m_pStatusLabel)
    218             m_pStatusLabel->setText(UIGuestControlFileManager::tr("Failed"));
     284        m_eStatus = OperationStatus_Failed;
    219285    }
    220286    else
    221287    {
    222288        emit sigProgressComplete(m_comProgress.GetId());
    223         if (m_pStatusLabel)
    224             m_pStatusLabel->setText(UIGuestControlFileManager::tr("Succeeded"));
    225     }
     289        m_eStatus = OperationStatus_Succeded;
     290    }
     291    if (m_pProgressBar)
     292        m_pProgressBar->setEnabled(false);
     293    retranslateUi();
    226294}
    227295
     
    232300    if (m_pCancelButton)
    233301        m_pCancelButton->setEnabled(false);
    234     if (m_pStatusLabel)
    235         m_pStatusLabel->setText(UIGuestControlFileManager::tr("Canceled"));
    236302    if (m_pProgressBar)
    237303        m_pProgressBar->setEnabled(false);
     304    m_eStatus = OperationStatus_Canceled;
     305    retranslateUi();
    238306}
    239307
     
    250318    , m_pContainerLayout(0)
    251319    , m_pContainerSpaceItem(0)
     320    , m_pWidgetInFocus(0)
    252321{
    253322    prepare();
     
    262331    if (!pOperationsWidget)
    263332        return;
     333    m_widgetSet.insert(pOperationsWidget);
    264334    m_pContainerLayout->insertWidget(m_pContainerLayout->count() - 1, pOperationsWidget);
    265335
     
    268338    connect(pOperationsWidget, &UIFileOperationProgressWidget::sigProgressFail,
    269339            this, &UIGuestControlFileManagerOperationsPanel::sigFileOperationFail);
     340
     341    connect(pOperationsWidget, &UIFileOperationProgressWidget::sigFocusIn,
     342            this, &UIGuestControlFileManagerOperationsPanel::sltHandleWidgetFocusIn);
     343    connect(pOperationsWidget, &UIFileOperationProgressWidget::sigFocusOut,
     344            this, &UIGuestControlFileManagerOperationsPanel::sltHandleWidgetFocusOut);
    270345}
    271346
     
    311386    QMenu *menu = new QMenu(this);
    312387
    313     QAction *pCleanFinished = menu->addAction(UIGuestControlFileManager::tr("Clean Finished"));
    314     QAction *pCleanAll = menu->addAction(UIGuestControlFileManager::tr("Clean All"));
    315 
    316     connect(pCleanFinished, &QAction::triggered,
    317             this, &UIGuestControlFileManagerOperationsPanel::sltCleanFinished);
    318     connect(pCleanAll, &QAction::triggered,
    319             this, &UIGuestControlFileManagerOperationsPanel::sltCleanAll);
     388    if (m_pWidgetInFocus)
     389    {
     390        QAction *pRemoveSelected = menu->addAction(UIGuestControlFileManager::tr("Remove Selected"));
     391        connect(pRemoveSelected, &QAction::triggered,
     392                this, &UIGuestControlFileManagerOperationsPanel::sltRemoveSelected);
     393    }
     394
     395    QAction *pRemoveFinished = menu->addAction(UIGuestControlFileManager::tr("Remove Finished"));
     396    QAction *pRemoveAll = menu->addAction(UIGuestControlFileManager::tr("Remove All"));
     397
     398    connect(pRemoveFinished, &QAction::triggered,
     399            this, &UIGuestControlFileManagerOperationsPanel::sltRemoveFinished);
     400    connect(pRemoveAll, &QAction::triggered,
     401            this, &UIGuestControlFileManagerOperationsPanel::sltRemoveAll);
    320402
    321403    menu->exec(pEvent->globalPos());
     
    323405}
    324406
    325 void UIGuestControlFileManagerOperationsPanel::sltCleanFinished()
    326 {
    327     // QList<int> listOfRowsToRemove;
    328     // for (int i = 0; i < m_pListView->count(); ++i)
    329     // {
    330     //     UIFileOperationProgressWidget* pProgressWidget =
    331     //         qobject_cast<UIFileOperationProgressWidget*>(m_pListView->itemWidget(m_pListView->item(i)));
    332     //     if (pProgressWidget)
    333     //     {
    334     //         if (pProgressWidget->isCanceled() || pProgressWidget->isCompleted())
    335     //             listOfRowsToRemove << i;
    336     //     }
    337     // }
    338     // foreach (int row, listOfRowsToRemove)
    339     // {
    340     //     /* This will delete the progress widget as well: */
    341     //     QListWidgetItem *pItem = m_pListView->takeItem(row);
    342     //     delete m_pListView->itemWidget(pItem);
    343     //     delete pItem;
    344     // }
    345 }
    346 
    347 void UIGuestControlFileManagerOperationsPanel::sltCleanAll()
    348 {
    349     //m_pListView->clear();
    350     //m_pListView->setRowCount(0);
     407void UIGuestControlFileManagerOperationsPanel::sltRemoveFinished()
     408{
     409    QList<UIFileOperationProgressWidget*> widgetsToRemove;
     410    foreach (QWidget *pWidget, m_widgetSet)
     411    {
     412        UIFileOperationProgressWidget *pProgressWidget = qobject_cast<UIFileOperationProgressWidget*>(pWidget);
     413        if (pProgressWidget && pProgressWidget->isCompleted())
     414        {
     415            delete pProgressWidget;
     416            widgetsToRemove << pProgressWidget;
     417        }
     418    }
     419    foreach (UIFileOperationProgressWidget *pWidget, widgetsToRemove)
     420        m_widgetSet.remove(pWidget);
     421}
     422
     423void UIGuestControlFileManagerOperationsPanel::sltRemoveAll()
     424{
     425    foreach (QWidget *pWidget, m_widgetSet)
     426    {
     427        if (pWidget)
     428        {
     429            delete pWidget;
     430        }
     431    }
     432    m_widgetSet.clear();
     433}
     434
     435void UIGuestControlFileManagerOperationsPanel::sltRemoveSelected()
     436{
     437    if (!m_pWidgetInFocus)
     438        return;
     439    delete m_pWidgetInFocus;
     440    m_widgetSet.remove(m_pWidgetInFocus);
     441}
     442
     443void UIGuestControlFileManagerOperationsPanel::sltHandleWidgetFocusIn(QWidget *pWidget)
     444{
     445    if (!pWidget)
     446        return;
     447    m_pWidgetInFocus = pWidget;
     448}
     449
     450void UIGuestControlFileManagerOperationsPanel::sltHandleWidgetFocusOut(QWidget *pWidget)
     451{
     452    if (!pWidget)
     453        return;
     454    m_pWidgetInFocus = 0;
    351455}
    352456
  • trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIGuestControlFileManagerOperationsPanel.h

    r75788 r75897  
    6868private slots:
    6969
    70     void sltCleanFinished();
    71     void sltCleanAll();
     70    void sltRemoveFinished();
     71    void sltRemoveAll();
     72    void sltRemoveSelected();
     73
     74    void sltHandleWidgetFocusIn(QWidget *pWidget);
     75    void sltHandleWidgetFocusOut(QWidget *pWidget);
    7276
    7377private:
     
    7579    /** @name Member variables.
    7680      * @{ */
    77         QScrollArea *m_pScrollArea;
    78         QWidget     *m_pContainerWidget;
    79         QVBoxLayout *m_pContainerLayout;
    80         QSpacerItem *m_pContainerSpaceItem;
     81        QScrollArea    *m_pScrollArea;
     82        QWidget        *m_pContainerWidget;
     83        QVBoxLayout    *m_pContainerLayout;
     84        QSpacerItem    *m_pContainerSpaceItem;
     85        QWidget        *m_pWidgetInFocus;
     86        QSet<QWidget*>  m_widgetSet;
    8187    /** @} */
    8288
  • trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIGuestFileTable.cpp

    r75760 r75897  
    330330}
    331331
    332 void UIGuestFileTable::copyHostToGuest(const QStringList &hostSourcePathList, bool fDeleteAfterSuccessfulCopy /* = false */)
     332void UIGuestFileTable::copyHostToGuest(const QStringList &hostSourcePathList, bool fDeleteAfterSuccessfulCopy /* = false */,
     333                                        const QString &strDestination /* = QString() */)
    333334{
    334335    if (!checkGuestSession())
     
    337338    QVector<QString>  aFilters;
    338339    QVector<QString>  aFlags;
    339     QString strDestinationPath = currentDirectoryPath();
     340    QString strDestinationPath = strDestination;
     341    if (strDestinationPath.isEmpty())
     342        strDestinationPath = currentDirectoryPath();
     343
    340344    if (strDestinationPath.isEmpty())
    341345    {
  • trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIGuestFileTable.h

    r75760 r75897  
    4343    void initGuestFileTable(const CGuestSession &session);
    4444    void copyGuestToHost(const QString& hostDestinationPath, bool fDeleteAfterSuccessfulCopy = false);
    45     void copyHostToGuest(const QStringList &hostSourcePathList, bool fDeleteAfterSuccessfulCopy = false);
     45    void copyHostToGuest(const QStringList &hostSourcePathList, bool fDeleteAfterSuccessfulCopy = false,
     46                         const QString &strDestination = QString());
    4647
    4748signals:
Note: See TracChangeset for help on using the changeset viewer.

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