VirtualBox

Changeset 563 in vbox for trunk/src/VBox/Frontends


Ignore:
Timestamp:
Feb 2, 2007 4:44:41 PM (18 years ago)
Author:
vboxsync
Message:

FE/Qt: Fixed retaining the current list position in the VDM dialog after doing media refresh.

Location:
trunk/src/VBox/Frontends/VirtualBox
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/include/VBoxGlobal.h

    r548 r563  
    383383    /**
    384384     *  Emitted at the end of the enumeration process started
    385      *  by #startEnumeratingMedia().
    386      *  @note #currentMediaList() will return an empty list
    387      *  when this signal is emitted, use the argument instead.
     385     *  by #startEnumeratingMedia(). The @a aList argument is passed for
     386     *  convenience, it is exactly the same as returned by #currentMediaList().
    388387     */
    389388    void mediaEnumFinished (const VBoxMediaList &aList);
  • trunk/src/VBox/Frontends/VirtualBox/src/VBoxGlobal.cpp

    r548 r563  
    10661066    if (media_enum_thread)
    10671067        return;
     1068   
     1069    /* ignore the request during application termination */
     1070    if (vboxGlobal_cleanup)
     1071        return;
    10681072
    10691073    /* composes a list of all currently known media */
     
    10711075    {
    10721076        CHardDiskEnumerator enHD = vbox.GetHardDisks().Enumerate();
    1073         while (enHD.HasMore() && !vboxGlobal_cleanup)
     1077        while (enHD.HasMore())
    10741078        {
    10751079            CHardDisk hd = enHD.GetNext();
     
    10771081        }
    10781082        CDVDImageEnumerator enCD = vbox.GetDVDImages().Enumerate();
    1079         while (enCD.HasMore() && !vboxGlobal_cleanup)
     1083        while (enCD.HasMore())
    10801084        {
    10811085            CDVDImage cd = enCD.GetNext();
     
    10831087        }
    10841088        CFloppyImageEnumerator enFD = vbox.GetFloppyImages().Enumerate();
    1085         while (enFD.HasMore() && !vboxGlobal_cleanup)
     1089        while (enFD.HasMore())
    10861090        {
    10871091            CFloppyImage fd = enFD.GetNext();
    10881092            media_list += VBoxMedia (CUnknown (fd), VBoxDefs::FD, VBoxMedia::Unknown);
    10891093        }
    1090         if (!vboxGlobal_cleanup)
    1091             emit mediaEnumStarted();
    10921094    }
    10931095
     
    10971099    public:
    10981100
    1099         Thread (VBoxMediaList &aList) : mList (aList) {}
     1101        Thread (const VBoxMediaList &aList) : mList (aList) {}
    11001102
    11011103        virtual void run()
     
    11091111            /* enumerating list */
    11101112            int index = 0;
    1111             VBoxMediaList::Iterator it;
     1113            VBoxMediaList::const_iterator it;
    11121114            for (it = mList.begin();
    11131115                 it != mList.end() && !vboxGlobal_cleanup;
    11141116                 ++ it, ++ index)
    11151117            {
    1116                 VBoxMedia &media = *it;
     1118                VBoxMedia media = *it;
    11171119                switch (media.type)
    11181120                {
     
    11341136                            }
    11351137                        }
    1136                         VBoxMedia newMedia (CUnknown(hd), VBoxDefs::HD, media.status);
    11371138                        QApplication::postEvent (target,
    1138                             new VBoxEnumerateMediaEvent (newMedia, index));
     1139                            new VBoxEnumerateMediaEvent (media, index));
    11391140                        break;
    11401141                    }
     
    11461147                            cd.isOk() ? VBoxMedia::Inaccessible :
    11471148                            VBoxMedia::Error;
    1148                         VBoxMedia newMedia (CUnknown(cd), VBoxDefs::CD, media.status);
    11491149                        QApplication::postEvent (target,
    1150                             new VBoxEnumerateMediaEvent (newMedia, index));
     1150                            new VBoxEnumerateMediaEvent (media, index));
    11511151                        break;
    11521152                    }
     
    11581158                            fd.isOk() ? VBoxMedia::Inaccessible :
    11591159                            VBoxMedia::Error;
    1160                         VBoxMedia newMedia (CUnknown(fd), VBoxDefs::FD, media.status);
    11611160                        QApplication::postEvent (target,
    1162                             new VBoxEnumerateMediaEvent (newMedia, index));
     1161                            new VBoxEnumerateMediaEvent (media, index));
    11631162                        break;
    11641163                    }
     
    11811180    private:
    11821181
    1183         VBoxMediaList &mList;
     1182        const VBoxMediaList &mList;
    11841183    };
    11851184
    11861185    media_enum_thread = new Thread (media_list);
     1186        AssertReturnVoid (media_enum_thread);
     1187
     1188    /* emit mediaEnumStarted() after we set media_enum_thread to != NULL
     1189     * to cause isMediaEnumerationStarted() to return TRUE from slots */   
     1190    emit mediaEnumStarted();
     1191
    11871192    media_enum_thread->start();
    11881193}
  • trunk/src/VBox/Frontends/VirtualBox/src/VBoxSelectorWnd.cpp

    r548 r563  
    981981        if (it != list.end() && vboxProblem().remindAboutInaccessibleMedia())
    982982        {
    983             /* pass the list we got in the argument to indicate that
    984              * VBoxDiskImageManagerDlg should not start the enumeration at the
    985              * beginning (i.e. if being shown for the first time) */
    986             VBoxDiskImageManagerDlg::showModeless (&list);
     983            /* Show the VDM dialog but don't refresh once more after a
     984             * just-finished refresh */
     985            VBoxDiskImageManagerDlg::showModeless (false /* aRefresh */);
    987986        }
    988987    }
  • trunk/src/VBox/Frontends/VirtualBox/ui/VBoxDiskImageManagerDlg.ui

    r548 r563  
    603603    <function returnType="QUuid">getSelectedUuid()</function>
    604604    <function returnType="QString">getSelectedPath()</function>
    605     <function>setup( int aType, bool aDoSelect, const QUuid *aTargetVMId = NULL, const VBoxMediaList *mediaList = NULL, CMachine machine = 0 )</function>
     605    <function>setup( int aType, bool aDoSelect, const QUuid *aTargetVMId = NULL, bool aRefresh = true, CMachine machine = NULL )</function>
    606606    <function access="private" returnType="QListView*">getCurrentListView()</function>
    607607    <function access="private" returnType="QListView*">getListView( VBoxDefs::DiskType )</function>
     
    624624    <function access="protected" returnType="QPushButton*">searchDefaultButton()</function>
    625625    <function access="protected">setCurrentItem( QListView*, QListViewItem* )</function>
    626     <function specifier="non virtual">static showModeless( const VBoxMediaList * = NULL )</function>
     626    <function specifier="non virtual">static showModeless( bool aRefresh = true )</function>
    627627    <function specifier="non virtual" returnType="QString">static composeHdToolTip( CHardDisk &amp;, VBoxMedia::Status = VBoxMedia::Ok )</function>
    628628    <function specifier="non virtual" returnType="QString">static composeCdToolTip( CDVDImage &amp;, VBoxMedia::Status = VBoxMedia::Ok )</function>
  • trunk/src/VBox/Frontends/VirtualBox/ui/VBoxDiskImageManagerDlg.ui.h

    r548 r563  
    146146
    147147
    148 void VBoxDiskImageManagerDlg::showModeless (const VBoxMediaList *list /* = NULL */)
     148void VBoxDiskImageManagerDlg::showModeless (bool aRefresh /* = true */)
    149149{
    150150    if (!mModelessDialog)
     
    155155                                         WType_TopLevel | WDestructiveClose);
    156156        mModelessDialog->setup (VBoxDefs::HD | VBoxDefs::CD | VBoxDefs::FD,
    157                                 false, NULL, list);
     157                                false, NULL, aRefresh);
    158158
    159159        /* listen to events that may change the media status and refresh
     
    12111211
    12121212void VBoxDiskImageManagerDlg::setup (int aType, bool aDoSelect,
    1213                                      const QUuid *aTargetVMId,
    1214                                      const VBoxMediaList *mediaList,
    1215                                      CMachine machine)
     1213                                     const QUuid *aTargetVMId /* = NULL */,
     1214                                     bool aRefresh /* = true */,
     1215                                     CMachine machine /* = NULL */)
    12161216{
    12171217    cmachine = machine;
     
    12511251             this, SLOT (mediaRemoved (VBoxDefs::DiskType, const QUuid &)));
    12521252
    1253     /* insert already enumerated media */
    1254     VBoxMediaList list = mediaList ?
    1255         *mediaList : vboxGlobal().currentMediaList();
     1253    if (aRefresh && !vboxGlobal().isMediaEnumerationStarted())
     1254    {
     1255        vboxGlobal().startEnumeratingMedia();
     1256    }
     1257    else
     1258    {   
     1259        /* insert already enumerated media */
     1260        const VBoxMediaList &list = vboxGlobal().currentMediaList();
     1261        prepareToRefresh (list.size());
     1262        VBoxMediaList::const_iterator it;
     1263        int index = 0;
     1264        for (it = list.begin(); it != list.end(); ++ it)
     1265        {
     1266            mediaAdded (*it);
     1267            if ((*it).status != VBoxMedia::Unknown)
     1268                mProgressBar->setProgress (++ index);
     1269        }
     1270
     1271        /* select first child */
     1272        setCurrentItem (hdsView, hdsView->firstChild());
     1273        setCurrentItem (cdsView, cdsView->firstChild());
     1274        setCurrentItem (fdsView, fdsView->firstChild());
     1275       
     1276        /* emulate the finished signal to reuse the code */
     1277        if (!vboxGlobal().isMediaEnumerationStarted())
     1278            mediaEnumFinished (list);
     1279    }
     1280}
     1281
     1282
     1283void VBoxDiskImageManagerDlg::mediaEnumStarted()
     1284{
     1285    /* load current media list */
     1286    const VBoxMediaList &list = vboxGlobal().currentMediaList();
    12561287    prepareToRefresh (list.size());
    1257     VBoxMediaList::const_iterator it;
    1258     int index = 0;
    1259     for (it = list.begin(); it != list.end(); ++ it)
    1260     {
    1261         mediaAdded (*it);
    1262         if ((*it).status != VBoxMedia::Unknown)
    1263             mProgressBar->setProgress (index ++);
    1264     }
    1265     /* select first child */
    1266     setCurrentItem (hdsView, hdsView->firstChild());
    1267     setCurrentItem (cdsView, cdsView->firstChild());
    1268     setCurrentItem (fdsView, fdsView->firstChild());
    1269 
    1270     if (mediaList)
    1271     {
    1272         mediaEnumFinished (list);
    1273     }
    1274     else
    1275     {
    1276         /* only start enumerating media if we haven't been supplied a list
    1277          * (it's ok if the enumeration has been already started, nothing will
    1278          * happen) */
    1279         vboxGlobal().startEnumeratingMedia();
    1280     }
    1281 }
    1282 
    1283 
    1284 void VBoxDiskImageManagerDlg::mediaEnumStarted()
    1285 {
    1286     VBoxMediaList list = vboxGlobal().currentMediaList();
    1287     prepareToRefresh (list.size());
    1288     /* clearing lists */
    1289     hdsView->clear(), cdsView->clear(), fdsView->clear();
    1290     /* load current media list */
    12911288    VBoxMediaList::const_iterator it;
    12921289    for (it = list.begin(); it != list.end(); ++ it)
    12931290        mediaAdded (*it);
    12941291    /* select first child */
    1295     if (!hdsView->isSelected (hdsView->currentItem()))
     1292    if (!hdsView->currentItem())
    12961293        setCurrentItem (hdsView, hdsView->firstChild());
    1297     if (!cdsView->isSelected (cdsView->currentItem()))
     1294    if (!cdsView->currentItem())
    12981295        setCurrentItem (cdsView, cdsView->firstChild());
    1299     if (!fdsView->isSelected (fdsView->currentItem()))
     1296    if (!fdsView->currentItem())
    13001297        setCurrentItem (fdsView, fdsView->firstChild());
    13011298
     
    13071304{
    13081305    mediaUpdated (aMedia);
     1306    Assert (aMedia.status != VBoxMedia::Unknown);
    13091307    if (aMedia.status != VBoxMedia::Unknown)
    1310         mProgressBar->setProgress (aIndex);
     1308        mProgressBar->setProgress (aIndex + 1);
    13111309}
    13121310
     
    13181316    imRefreshAction->setEnabled (true);
    13191317    unsetCursor();
     1318
     1319    /* adjust columns (it is strange to repeat but it works) */
     1320
     1321    hdsView->adjustColumn (1);
     1322    hdsView->adjustColumn (2);
     1323    hdsView->adjustColumn (1);
     1324
     1325    cdsView->adjustColumn (1);
     1326    cdsView->adjustColumn (2);
     1327    cdsView->adjustColumn (1);
     1328   
     1329    fdsView->adjustColumn (1);
     1330    fdsView->adjustColumn (2);
     1331    fdsView->adjustColumn (1);
    13201332
    13211333    processCurrentChanged();
     
    14501462    imRefreshAction->setEnabled (false);
    14511463    setCursor (QCursor (BusyCursor));
     1464
     1465    /* store the current list selections */
     1466   
     1467    QListViewItem *item;
     1468    DiskImageItem *di;
     1469
     1470    item = hdsView->currentItem();
     1471    di = (item && item->rtti() == 1001) ? static_cast <DiskImageItem *> (item) : 0;
     1472    hdSelectedId = di ? di->getUuid() : QUuid();
     1473 
     1474    item = cdsView->currentItem();
     1475    di = (item && item->rtti() == 1001) ? static_cast <DiskImageItem *> (item) : 0;
     1476    cdSelectedId = di ? di->getUuid() : QUuid();
     1477
     1478    item = fdsView->currentItem();
     1479    di = (item && item->rtti() == 1001) ? static_cast <DiskImageItem *> (item) : 0;
     1480    fdSelectedId = di ? di->getUuid() : QUuid();
     1481
     1482    /* finally, clear all lists */
     1483    hdsView->clear();
     1484    cdsView->clear();
     1485    fdsView->clear();
    14521486}
    14531487
     
    15281562    aListView->setCurrentItem (aItem);
    15291563    aListView->setSelected (aListView->currentItem(), true);
    1530     /* it is strange repeat but it works */
    1531     aListView->adjustColumn (1);
    1532     aListView->adjustColumn (2);
    1533     aListView->adjustColumn (1);
    15341564}
    15351565
     
    16081638            hdsPane4->setText (item->getInformation (item->getUsage()));
    16091639            hdsPane5->setText (item->getInformation (item->getSnapshotName()));
    1610             hdSelectedId = item->getUuid();
    16111640        }
    16121641        else if (item->listView() == cdsView)
     
    16141643            cdsPane1->setText (item->getInformation (item->getPath(), true, "end"));
    16151644            cdsPane2->setText (item->getInformation (item->getUsage()));
    1616             cdSelectedId = item->getUuid();
    16171645        }
    16181646        else if (item->listView() == fdsView)
     
    16201648            fdsPane1->setText (item->getInformation (item->getPath(), true, "end"));
    16211649            fdsPane2->setText (item->getInformation (item->getUsage()));
    1622             fdSelectedId = item->getUuid();
    16231650        }
    16241651    }
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