VirtualBox

Changeset 71255 in vbox


Ignore:
Timestamp:
Mar 7, 2018 12:02:39 PM (7 years ago)
Author:
vboxsync
Message:

FE/Qt bugref:6699 Implement rename for guest file view

Location:
trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/guestctrl
Files:
3 edited

Legend:

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

    r71234 r71255  
    447447void UIGuestControlFileManager::sltGuestSessionStateChanged(const CGuestSessionStateChangedEvent &cEvent)
    448448{
    449     if (cEvent.isOk() && m_comGuestSession.isOk())
     449    if (cEvent.isOk() /*&& m_comGuestSession.isOk()*/)
    450450    {
    451451        CVirtualBoxErrorInfo cErrorInfo = cEvent.GetError();
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/guestctrl/UIGuestControlFileTable.cpp

    r71234 r71255  
    3030# include "QILabel.h"
    3131# include "QILineEdit.h"
     32# include "UIErrorString.h"
    3233# include "UIIconPool.h"
    3334# include "UIGuestControlFileTable.h"
     
    5960{
    6061public:
    61     explicit UIFileTableItem(const QList<QVariant> &data, UIFileTableItem *parentItem = 0);
     62    explicit UIFileTableItem(const QList<QVariant> &data, bool isDirectory, UIFileTableItem *parentItem);
    6263    ~UIFileTableItem();
    6364
    6465    void appendChild(UIFileTableItem *child);
    6566
    66     UIFileTableItem *child(int row);
     67    UIFileTableItem *child(int row) const;
     68    /** Return a child (if possible) by path */
     69    UIFileTableItem *child(const QString &path) const;
    6770    int childCount() const;
    6871    int columnCount() const;
    6972    QVariant data(int column) const;
     73    void setData(const QVariant &data, int index);
    7074    int row() const;
    7175    UIFileTableItem *parentItem();
     
    7377    bool isDirectory() const;
    7478    bool isOpened() const;
    75 
    76     void setIsDirectory(bool flag);
    7779    void setIsOpened(bool flag);
    7880
    7981    const QString  &path() const;
    8082    void setPath(const QString &path);
    81 
    82     const QString  &name() const;
    83     void setName(const QString &name);
     83    /** Merge prefix and suffix by making sure they have a single '/' in between */
     84    void setPath(const QString &prexix, const QString &suffix);
    8485
    8586    /** True if this is directory and name is ".." */
     
    8889
    8990private:
    90     QList<UIFileTableItem*> m_childItems;
     91    QList<UIFileTableItem*>         m_childItems;
     92    /** Used to find children by path */
     93    QMap<QString, UIFileTableItem*> m_childMap;
    9194    QList<QVariant>  m_itemData;
    9295    UIFileTableItem *m_parentItem;
    9396    bool             m_bIsDirectory;
    9497    bool             m_bIsOpened;
     98    /** Full absolute path of the item. Without the trailing '/' */
    9599    QString          m_strPath;
    96     QString          m_strName;
     100    /** For directories base name is the name of the lowest level directory
     101        in strPath. eg. for 'm_strPath = /opt/qt5.6/examples' 'm_strBaseName = examples'
     102        for files it is the name of the file */
     103    QString          m_strBaseName;
    97104};
    98105
    99106
    100 UIFileTableItem::UIFileTableItem(const QList<QVariant> &data, UIFileTableItem *parent)
     107UIFileTableItem::UIFileTableItem(const QList<QVariant> &data, bool isDirectory, UIFileTableItem *parent)
    101108    : m_itemData(data)
    102109    , m_parentItem(parent)
    103     , m_bIsDirectory(false)
     110    , m_bIsDirectory(isDirectory)
    104111    , m_bIsOpened(false)
    105112{
     
    115122void UIFileTableItem::appendChild(UIFileTableItem *item)
    116123{
     124    if (!item)
     125        return;
    117126    m_childItems.append(item);
    118 }
    119 
    120 UIFileTableItem *UIFileTableItem::child(int row)
     127    m_childMap.insert(item->path(), item);
     128}
     129
     130UIFileTableItem *UIFileTableItem::child(int row) const
    121131{
    122132    return m_childItems.value(row);
    123133}
    124134
     135UIFileTableItem *UIFileTableItem::child(const QString &path) const
     136{
     137    if (!m_childMap.contains(path))
     138        return 0;
     139    return m_childMap.value(path);
     140}
     141
    125142int UIFileTableItem::childCount() const
    126143{
     
    136153{
    137154    return m_itemData.value(column);
     155}
     156
     157void UIFileTableItem::setData(const QVariant &data, int index)
     158{
     159    if (index >= m_itemData.length())
     160        return;
     161    m_itemData[index] = data;
    138162}
    139163
     
    160184    qDeleteAll(m_childItems);
    161185    m_childItems.clear();
     186    m_childMap.clear();
    162187}
    163188
     
    167192}
    168193
    169 void UIFileTableItem::setIsDirectory(bool flag)
    170 {
    171     m_bIsDirectory = flag;
    172 }
    173 
    174194void UIFileTableItem::setIsOpened(bool flag)
    175195{
     
    184204void UIFileTableItem::setPath(const QString &path)
    185205{
     206    if (path.isNull() || path.isEmpty())
     207        return;
    186208    m_strPath = path;
    187 }
    188 
    189 const QString  &UIFileTableItem::name() const
    190 {
    191     return m_strName;
    192 }
    193 
    194 void UIFileTableItem::setName(const QString &name)
    195 {
    196     m_strName = name;
     209    /* Make sure for we dont have any trailing slashes: */
     210    if (m_strPath.length() > 1 && m_strPath.at(m_strPath.length() - 1) == QChar('/'))
     211        m_strPath.chop(1);
     212}
     213
     214void UIFileTableItem::setPath(const QString &prefix, const QString &suffix)
     215{
     216    if (prefix.isEmpty())
     217        return;
     218    QString newPath(prefix);
     219    /* Make sure we have a trailing '/' in @p prefix: */
     220    if (prefix.at(newPath.length() - 1) != QChar('/'))
     221        newPath += "/";
     222    newPath += suffix;
     223    setPath(newPath);
    197224}
    198225
     
    243270}
    244271
     272bool UIGuestControlFileModel::setData(const QModelIndex &index, const QVariant &value, int role)
     273{
     274    if (index.isValid() && role == Qt::EditRole)
     275    {
     276        UIFileTableItem *item = static_cast<UIFileTableItem*>(index.internalPointer());
     277        if (!item || !m_pParent)
     278            return false;
     279        if (m_pParent->renameItem(item, value.toString()))
     280        {
     281            item->setData(value, index.column());
     282            emit dataChanged(index, index);
     283        }
     284        else
     285        {
     286            if (m_pParent)
     287                m_pParent->emitLogOutput(QString("cannot rename %1").arg(item->path()));
     288        }
     289        return true;
     290    }
     291    return false;
     292}
     293
    245294QVariant UIGuestControlFileModel::data(const QModelIndex &index, int role) const
    246295{
     
    251300        return QVariant();
    252301
    253     if (role == Qt::DisplayRole)
     302    if (role == Qt::DisplayRole || role == Qt::EditRole)
    254303    {
    255304        /* dont show anything but the name for up directories: */
     
    279328    if (!index.isValid())
    280329        return 0;
    281 
     330    UIFileTableItem *item = static_cast<UIFileTableItem*>(index.internalPointer());
     331    if (!item)
     332        return QAbstractItemModel::flags(index);
     333
     334    if (!item->isUpDirectory() && index.column() == 0)
     335        return QAbstractItemModel::flags(index)  | Qt::ItemIsEditable;
    282336    return QAbstractItemModel::flags(index);
    283337}
     
    294348    }
    295349    return QVariant();
     350}
     351
     352QModelIndex UIGuestControlFileModel::index(UIFileTableItem* item)
     353{
     354    if (!item)
     355        return QModelIndex();
     356    return createIndex(item->row(), 0, item);
    296357}
    297358
     
    382443    , m_pTree(0)
    383444    , m_pLocationLabel(0)
     445    , m_pGoHome(0)
    384446    , m_pMainLayout(0)
    385447    , m_pCurrentLocationEdit(0)
    386448    , m_pToolBar(0)
    387449    , m_pGoUp(0)
    388     , m_pGoHome(0)
    389450    , m_pRefresh(0)
    390451    , m_pDelete(0)
     
    417478}
    418479
     480void UIGuestControlFileTable::emitLogOutput(const QString& strOutput)
     481{
     482    emit sigLogOutput(strOutput);
     483}
     484
    419485void UIGuestControlFileTable::prepareObjects()
    420486{
     
    460526        m_pView->setModel(m_pModel);
    461527        m_pView->setItemDelegate(new UIFileDelegate);
     528        m_pView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    462529        /* Minimize the row height: */
    463530        m_pView->verticalHeader()->setDefaultSectionSize(m_pView->verticalHeader()->minimumSectionSize());
     
    565632    QList<QVariant> headData;
    566633    headData << "Name" << "Size";
    567     m_pRootItem = new UIFileTableItem(headData);
     634    m_pRootItem = new UIFileTableItem(headData, true, 0);
    568635
    569636    QList<QVariant> startDirData;
    570637    startDirData << "/" << 4096;
    571     UIFileTableItem* startItem = new UIFileTableItem(startDirData, m_pRootItem);
     638    UIFileTableItem* startItem = new UIFileTableItem(startDirData, true, m_pRootItem);
    572639    startItem->setPath("/");
    573     startItem->setName("/");
    574640    m_pRootItem->appendChild(startItem);
    575641
    576     startItem->setIsDirectory(true);
    577642    startItem->setIsOpened(false);
    578643    /* Read the root directory and get the list: */
     
    594659            QList<QVariant> data;
    595660            data << ".." << 4096;
    596             UIFileTableItem *item = new UIFileTableItem(data, parent);
    597             item->setIsDirectory(true);
     661            UIFileTableItem *item = new UIFileTableItem(data, isDirectoryMap, parent);
    598662            item->setIsOpened(false);
    599663            map.insert("..", item);
     
    628692        return;
    629693    if (currentRoot != m_pModel->rootIndex())
    630         m_pView->setRootIndex(currentRoot.parent());
     694        changeLocation(currentRoot.parent());
    631695}
    632696
    633697void UIGuestControlFileTable::sltGoHome()
    634698{
     699    goToHomeDirectory();
    635700}
    636701
     
    645710    if (!item)
    646711        return;
     712
    647713    /* check if we need to go up: */
    648714    if (item->isUpDirectory())
     
    658724    if (!item->isOpened())
    659725       readDirectory(item->path(),item);
    660 
    661726    changeLocation(itemIndex);
    662727}
    663728
     729void UIGuestControlFileTable::goIntoDirectory(const QVector<QString> &pathTrail)
     730{
     731    UIFileTableItem *parent = getStartDirectoryItem();
     732
     733    for(int i = 0; i < pathTrail.size(); ++i)
     734    {
     735        if (!parent)
     736            return;
     737        /* Make sure parent is already opened: */
     738        if (!parent->isOpened())
     739            readDirectory(parent->path(), parent, parent == getStartDirectoryItem());
     740        /* search the current path item among the parent's children: */
     741        UIFileTableItem *item = parent->child(pathTrail.at(i));
     742        if (!item)
     743            return;
     744        parent = item;
     745    }
     746    if (!parent)
     747        return;
     748    if (!parent->isOpened())
     749        readDirectory(parent->path(), parent, parent == getStartDirectoryItem());
     750    goIntoDirectory(parent);
     751}
     752
     753void UIGuestControlFileTable::goIntoDirectory(UIFileTableItem *item)
     754{
     755    if (!item || !m_pModel)
     756        return;
     757    goIntoDirectory(m_pModel->index(item));
     758}
     759
     760UIFileTableItem* UIGuestControlFileTable::indexData(const QModelIndex &index) const
     761{
     762    if (!index.isValid())
     763        return 0;
     764    return static_cast<UIFileTableItem*>(index.internalPointer());
     765}
     766
    664767void UIGuestControlFileTable::refresh()
    665768{
     
    667770        return;
    668771    QModelIndex currentIndex = m_pView->rootIndex();
    669     if (!currentIndex.isValid())
    670         return;
    671     UIFileTableItem *treeItem =
    672         static_cast<UIFileTableItem*>(currentIndex.internalPointer());
     772
     773    UIFileTableItem *treeItem = indexData(currentIndex);
    673774    if (!treeItem)
    674775        return;
     
    700801void UIGuestControlFileTable::sltRename()
    701802{
     803    if (!m_pView)
     804        return;
     805    QItemSelectionModel *selectionModel =  m_pView->selectionModel();
     806    if (!selectionModel)
     807        return;
     808
     809    QModelIndexList selectedItemIndices = selectionModel->selectedRows();
     810    if (selectedItemIndices.size() == 0)
     811        return;
     812    UIFileTableItem *item = indexData(selectedItemIndices.at(0));
     813    if (!item || item->isUpDirectory())
     814        return;
     815    m_pView->edit(selectedItemIndices.at(0));
     816
    702817}
    703818
    704819void UIGuestControlFileTable::deleteByIndex(const QModelIndex &itemIndex)
    705820{
    706     if (!itemIndex.isValid())
    707         return;
    708     UIFileTableItem *treeItem = static_cast<UIFileTableItem*>(itemIndex.internalPointer());
     821    UIFileTableItem *treeItem = indexData(itemIndex);
    709822    if (!treeItem)
    710823        return;
     
    723836    if (m_pGoHome)
    724837    {
    725         m_pGoHome->setText(UIVMInformationDialog::tr("Goto home folder"));
    726         m_pGoHome->setToolTip(UIVMInformationDialog::tr("Goto home folder"));
    727         m_pGoHome->setStatusTip(UIVMInformationDialog::tr("Goto home folder"));
     838        m_pGoHome->setText(UIVMInformationDialog::tr("Go to home folder"));
     839        m_pGoHome->setToolTip(UIVMInformationDialog::tr("Go to home folder"));
     840        m_pGoHome->setStatusTip(UIVMInformationDialog::tr("Go to home folder"));
    728841    }
    729842
     
    805918}
    806919
    807 
     920UIFileTableItem *UIGuestControlFileTable::getStartDirectoryItem()
     921{
     922    if (!m_pRootItem)
     923        return 0;
     924    if (m_pRootItem->childCount() <= 0)
     925        return 0;
     926    return m_pRootItem->child(0);
     927}
     928
     929QString UIGuestControlFileTable::constructNewItemPath(const QString &previousPath, const QString &newBaseName)
     930{
     931    if (newBaseName.isEmpty() || previousPath.length() <= 1)
     932        return QString();
     933
     934    QStringList pathList = previousPath.split('/', QString::SkipEmptyParts);
     935    QString newPath("/");
     936    for(int i = 0; i < pathList.size() - 1; ++i)
     937    {
     938        newPath += (pathList.at(i) + "/");
     939    }
     940    newPath += newBaseName;
     941    return newPath;
     942}
    808943/*********************************************************************************************************************************
    809944*   UIGuestFileTable implementation.                                                                                             *
     
    813948    :UIGuestControlFileTable(pParent)
    814949{
     950    configureObjects();
    815951    retranslateUi();
    816952}
     
    859995            QList<QVariant> data;
    860996            data << fsInfo.GetName() << static_cast<qulonglong>(fsInfo.GetObjectSize());
    861             UIFileTableItem *item = new UIFileTableItem(data, parent);
    862             item->setPath(QString("%1%3%2").arg(strPath).arg("/").arg(fsInfo.GetName()));
    863             if (fsInfo.GetType() == KFsObjType_Directory)
     997            bool isDirectory = (fsInfo.GetType() == KFsObjType_Directory);
     998            UIFileTableItem *item = new UIFileTableItem(data, isDirectory, parent);
     999
     1000            item->setPath(strPath, fsInfo.GetName());
     1001            if (isDirectory)
    8641002            {
    8651003                directories.insert(fsInfo.GetName(), item);
    866                 item->setIsDirectory(true);
    8671004                item->setIsOpened(false);
    8681005            }
     
    8701007            {
    8711008                files.insert(fsInfo.GetName(), item);
    872                 item->setIsDirectory(false);
    8731009                item->setIsOpened(false);
    8741010            }
     
    8961032    }
    8971033    else
    898     {
    899         /** @todo this is not working: */
    9001034        m_comGuestSession.FsObjRemove(item->path());
    901     }
    902 }
    903 
     1035}
     1036
     1037void UIGuestFileTable::goToHomeDirectory()
     1038{
     1039    /* TODO: not implemented in guest control yet: */
     1040}
     1041
     1042bool UIGuestFileTable::renameItem(UIFileTableItem *item, QString newBaseName)
     1043{
     1044
     1045    if (!item || item->isUpDirectory() || newBaseName.isEmpty() || !m_comGuestSession.isOk())
     1046        return false;
     1047    QString newPath = constructNewItemPath(item->path(), newBaseName);
     1048    QVector<KFsObjRenameFlag> aFlags(KFsObjRenameFlag_Replace);
     1049
     1050    m_comGuestSession.FsObjRename(item->path(), newPath, aFlags);
     1051    if (m_comGuestSession.isOk())
     1052        return false;
     1053    return true;
     1054}
     1055
     1056void UIGuestFileTable::configureObjects()
     1057{
     1058    if (m_pGoHome)
     1059        m_pGoHome->setEnabled(false);
     1060}
    9041061
    9051062/*********************************************************************************************************************************
     
    9401097        QList<QVariant> data;
    9411098        data << fileInfo.baseName() << fileInfo.size();
    942         UIFileTableItem *item = new UIFileTableItem(data, parent);
     1099        UIFileTableItem *item = new UIFileTableItem(data, fileInfo.isDir(), parent);
    9431100        item->setPath(fileInfo.absoluteFilePath());
    9441101        if (fileInfo.isDir())
    9451102        {
    9461103            directories.insert(fileInfo.baseName(), item);
    947             item->setIsDirectory(true);
    9481104            item->setIsOpened(false);
    9491105        }
     
    9511107        {
    9521108            files.insert(fileInfo.baseName(), item);
    953             item->setIsDirectory(false);
    9541109            item->setIsOpened(false);
    9551110        }
     
    9811136}
    9821137
     1138void UIHostFileTable::goToHomeDirectory()
     1139{
     1140    if(!m_pRootItem || m_pRootItem->childCount() <= 0)
     1141        return;
     1142    UIFileTableItem *startDirItem = m_pRootItem->child(0);
     1143    if (!startDirItem)
     1144        return;
     1145
     1146    // UIFileTableItem *rootDirectoryItem
     1147    QDir homeDirectory(QDir::homePath());
     1148    QVector<QString> pathTrail;//(QDir::rootPath());
     1149    do{
     1150
     1151        pathTrail.push_front(homeDirectory.absolutePath());
     1152        homeDirectory.cdUp();
     1153    }while(!homeDirectory.isRoot());
     1154
     1155    goIntoDirectory(pathTrail);
     1156}
     1157
     1158bool UIHostFileTable::renameItem(UIFileTableItem *item, QString newPath)
     1159{
     1160    Q_UNUSED(item);
     1161    return true;
     1162}
    9831163#include "UIGuestControlFileTable.moc"
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/guestctrl/UIGuestControlFileTable.h

    r71234 r71255  
    5757
    5858    QVariant data(const QModelIndex &index, int role) const /* override */;
     59    bool setData(const QModelIndex &index, const QVariant &value, int role);
     60
    5961    Qt::ItemFlags flags(const QModelIndex &index) const /* override */;
    6062    QVariant headerData(int section, Qt::Orientation orientation,
    6163    int role = Qt::DisplayRole) const /* override */;
    6264    QModelIndex index(int row, int column,
    63     const QModelIndex &parent = QModelIndex()) const /* override */;
     65                      const QModelIndex &parent = QModelIndex()) const /* override */;
     66    QModelIndex index(UIFileTableItem* item);
    6467    QModelIndex parent(const QModelIndex &index) const /* override */;
    6568    int rowCount(const QModelIndex &parent = QModelIndex()) const /* override */;
     
    97100    /** Delete all the tree nodes */
    98101    void reset();
     102    void emitLogOutput(const QString& strOutput);
    99103
    100104protected:
     
    109113    virtual void refresh();
    110114    virtual void deleteByItem(UIFileTableItem *item) = 0;
     115    virtual void goToHomeDirectory() = 0;
     116    virtual bool renameItem(UIFileTableItem *item, QString newPath) = 0;
     117    void             goIntoDirectory(const QModelIndex &itemIndex);
     118    /** Follow the path trail, open directories as we go and descend */
     119    void             goIntoDirectory(const QVector<QString> &pathTrail);
     120    /** Go into directory pointed by the @p item */
     121    void             goIntoDirectory(UIFileTableItem *item);
     122    UIFileTableItem* indexData(const QModelIndex &index) const;
    111123    void keyPressEvent(QKeyEvent * pEvent);
     124
     125    /** Replace the last part of the @p previusPath with newBaseName */
     126    QString constructNewItemPath(const QString &previousPath, const QString &newBaseName);
     127
    112128    UIFileTableItem         *m_pRootItem;
    113129
     
    119135    QTreeView               *m_pTree;
    120136    QILabel                 *m_pLocationLabel;
    121 
     137    QAction                  *m_pGoHome;
    122138protected slots:
    123139
     
    131147private:
    132148
    133     void            prepareObjects();
    134     void            prepareActions();
    135     void            deleteByIndex(const QModelIndex &itemIndex);
    136     void            goIntoDirectory(const QModelIndex &itemIndex);
    137     QGridLayout    *m_pMainLayout;
    138     QILineEdit     *m_pCurrentLocationEdit;
    139     UIToolBar      *m_pToolBar;
    140     QAction        *m_pGoUp;
    141     QAction        *m_pGoHome;
    142     QAction        *m_pRefresh;
    143     QAction        *m_pDelete;
    144     QAction        *m_pRename;
    145     QAction        *m_pNewFolder;
    146 
    147     QAction        *m_pCopy;
    148     QAction        *m_pCut;
    149     QAction        *m_pPaste;
     149    void             prepareObjects();
     150    void             prepareActions();
     151    void             deleteByIndex(const QModelIndex &itemIndex);
     152    /** Return the UIFileTableItem for path / which is a direct (and single) child of m_pRootItem */
     153    UIFileTableItem *getStartDirectoryItem();
     154
     155    QGridLayout     *m_pMainLayout;
     156    QILineEdit      *m_pCurrentLocationEdit;
     157    UIToolBar       *m_pToolBar;
     158    QAction         *m_pGoUp;
     159
     160    QAction         *m_pRefresh;
     161    QAction         *m_pDelete;
     162    QAction         *m_pRename;
     163    QAction         *m_pNewFolder;
     164
     165    QAction         *m_pCopy;
     166    QAction         *m_pCut;
     167    QAction         *m_pPaste;
    150168
    151169    friend class UIGuestControlFileModel;
     
    168186    virtual void readDirectory(const QString& strPath, UIFileTableItem *parent, bool isStartDir = false) /* override */;
    169187    virtual void deleteByItem(UIFileTableItem *item) /* override */;
     188    virtual void goToHomeDirectory() /* override */;
     189    virtual bool renameItem(UIFileTableItem *item, QString newPath);
    170190
    171191private:
    172192
     193    void configureObjects();
    173194    CGuestSession m_comGuestSession;
     195
    174196};
    175197
     
    189211    virtual void readDirectory(const QString& strPath, UIFileTableItem *parent, bool isStartDir = false) /* override */;
    190212    virtual void deleteByItem(UIFileTableItem *item) /* override */;
     213    virtual void goToHomeDirectory() /* override */;
     214    virtual bool renameItem(UIFileTableItem *item, QString newPath);
    191215};
    192216
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