- Timestamp:
- Jan 24, 2019 3:59:56 PM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 128371
- Location:
- trunk/src/VBox/Frontends/VirtualBox
- Files:
-
- 3 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk
r76950 r76979 828 828 src/medium/UIMediumEnumerator.h \ 829 829 src/medium/UIMediumItem.h \ 830 src/medium/UIMediumSearchWidget.h \ 830 831 src/medium/UIMediumSelector.h \ 831 832 src/medium/viso/UIVisoBrowserBase.h \ … … 972 973 src/logviewer/UIVMLogViewerTextEdit.cpp \ 973 974 src/medium/UIMediumEnumerator.cpp \ 974 src/medium/UIMediumSelector.cpp \975 975 src/medium/viso/UIVisoContentBrowser.cpp \ 976 976 src/medium/viso/UIVisoHostBrowser.cpp \ … … 1293 1293 src/medium/UIMediumEnumerator.cpp \ 1294 1294 src/medium/UIMediumItem.cpp \ 1295 src/medium/UIMediumSearchWidget.cpp \ 1295 1296 src/medium/UIMediumSelector.cpp \ 1296 1297 src/medium/viso/UIVisoBrowserBase.cpp \ -
trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumSearchWidget.cpp
r76969 r76979 1 1 /* $Id$ */ 2 2 /** @file 3 * VBox Qt GUI - UIMediumSe lectorclass implementation.3 * VBox Qt GUI - UIMediumSearchWidget class implementation. 4 4 */ 5 5 … … 17 17 18 18 /* Qt includes: */ 19 #include <QAction> 20 #include <QHeaderView> 21 #include <QMenuBar> 19 #include <QLineEdit> 20 #include <QPushButton> 22 21 #include <QVBoxLayout> 23 #include <QPushButton>24 22 25 23 /* GUI includes: */ 26 24 #include "QIComboBox.h" 27 25 #include "QIDialogButtonBox.h" 28 #include "QIFileDialog.h"29 #include "QILineEdit.h"30 #include "QIMessageBox.h"31 #include "QITabWidget.h"32 26 #include "QIToolButton.h" 33 #include "VBoxGlobal.h"34 #include "UIDesktopWidgetWatchdog.h"35 #include "UIExtraDataManager.h"36 27 #include "UIFDCreationDialog.h" 37 #include "UIMediumSelector.h"38 #include "UIMessageCenter.h"39 28 #include "UIIconPool.h" 40 #include "UIMedium.h" 41 #include "UIMediumItem.h" 29 #include "UIMediumSearchWidget.h" 42 30 #include "UIToolBar.h" 43 44 /* COM includes: */45 #include "COMEnums.h"46 #include "CMachine.h"47 #include "CMediumAttachment.h"48 #include "CMediumFormat.h"49 #include "CStorageController.h"50 #include "CSystemProperties.h"51 31 52 32 #ifdef VBOX_WS_MAC 53 33 # include "UIWindowMenuManager.h" 54 34 #endif /* VBOX_WS_MAC */ 55 56 /*********************************************************************************************************************************57 * UIMediumSearchWidget definition. *58 *********************************************************************************************************************************/59 /** QWidget extension providing a simple way to enter a earch term and search type for medium searching60 * in virtual media manager, medium selection dialog, etc. */61 class UIMediumSearchWidget : public QIWithRetranslateUI<QWidget>62 {63 Q_OBJECT;64 65 public:66 67 enum SearchType68 {69 SearchByName,70 SearchByUUID,71 SearchByMax72 };73 74 signals:75 76 void sigPerformSearch();77 void sigShowNextMatchingItem();78 void sigShowPreviousMatchingItem();79 80 public:81 82 UIMediumSearchWidget(QWidget *pParent = 0);83 SearchType searchType() const;84 QString searchTerm() const;85 86 protected:87 88 void retranslateUi() /* override */;89 90 private:91 92 void prepareWidgets();93 QIComboBox *m_pSearchComboxBox;94 QLineEdit *m_pSearchTermLineEdit;95 QIToolButton *m_pShowNextMatchButton;96 QIToolButton *m_pShowPreviousMatchButton;97 };98 99 100 /*********************************************************************************************************************************101 * UIMediumSearchWidget implementation. *102 *********************************************************************************************************************************/103 35 104 36 UIMediumSearchWidget::UIMediumSearchWidget(QWidget *pParent) … … 137 69 m_pSearchTermLineEdit->setClearButtonEnabled(true); 138 70 pLayout->addWidget(m_pSearchTermLineEdit); 139 connect(m_pSearchTermLineEdit, &Q ILineEdit::textChanged,71 connect(m_pSearchTermLineEdit, &QLineEdit::textChanged, 140 72 this, &UIMediumSearchWidget::sigPerformSearch); 141 73 } … … 177 109 if (m_pSearchComboxBox) 178 110 { 179 m_pSearchComboxBox->setItemText(SearchByName, UIMediumSe lector::tr("Search By Name"));180 m_pSearchComboxBox->setItemText(SearchByUUID, UIMediumSe lector::tr("Search By UUID"));181 m_pSearchComboxBox->setToolTip(UIMediumSe lector::tr("Select the search type"));111 m_pSearchComboxBox->setItemText(SearchByName, UIMediumSearchWidget::tr("Search By Name")); 112 m_pSearchComboxBox->setItemText(SearchByUUID, UIMediumSearchWidget::tr("Search By UUID")); 113 m_pSearchComboxBox->setToolTip(UIMediumSearchWidget::tr("Select the search type")); 182 114 } 183 115 if (m_pSearchTermLineEdit) … … 188 120 m_pShowNextMatchButton->setToolTip("Show the next item matching the search term"); 189 121 } 190 191 /*********************************************************************************************************************************192 * UIMediumSelector implementation. *193 *********************************************************************************************************************************/194 195 UIMediumSelector::UIMediumSelector(UIMediumDeviceType enmMediumType, const QString &machineName /* = QString() */,196 const QString &machineSettigFilePath /* = QString() */, QWidget *pParent /* = 0 */)197 :QIWithRetranslateUI<QIMainDialog>(pParent)198 , m_pCentralWidget(0)199 , m_pMainLayout(0)200 , m_pTreeWidget(0)201 , m_enmMediumType(enmMediumType)202 , m_pButtonBox(0)203 , m_pMainMenu(0)204 , m_pToolBar(0)205 , m_pActionAdd(0)206 , m_pActionCreate(0)207 , m_pActionRefresh(0)208 , m_pAttachedSubTreeRoot(0)209 , m_pNotAttachedSubTreeRoot(0)210 , m_pParent(pParent)211 , m_pSearchWidget(0)212 , m_iCurrentShownIndex(0)213 , m_strMachineSettingsFilePath(machineSettigFilePath)214 , m_strMachineName(machineName)215 {216 configure();217 finalize();218 }219 220 QList<QUuid> UIMediumSelector::selectedMediumIds() const221 {222 QList<QUuid> selectedIds;223 if (!m_pTreeWidget)224 return selectedIds;225 QList<QTreeWidgetItem*> selectedItems = m_pTreeWidget->selectedItems();226 for (int i = 0; i < selectedItems.size(); ++i)227 {228 UIMediumItem *item = dynamic_cast<UIMediumItem*>(selectedItems.at(i));229 if (item)230 selectedIds.push_back(item->medium().id());231 }232 return selectedIds;233 }234 235 236 void UIMediumSelector::retranslateUi()237 {238 if (m_pMainMenu)239 m_pMainMenu->setTitle(tr("Medium"));240 241 if (m_pActionAdd)242 {243 m_pActionAdd->setText(tr("&Add..."));244 m_pActionAdd->setToolTip(tr("Add Disk Image"));245 m_pActionAdd->setStatusTip(tr("Add existing disk image file"));246 }247 248 if (m_pActionCreate)249 {250 m_pActionCreate->setText(tr("&Create..."));251 m_pActionCreate->setToolTip(tr("Create Disk Image"));252 m_pActionCreate->setStatusTip(tr("Create new disk image file"));253 }254 255 if (m_pActionRefresh)256 {257 m_pActionRefresh->setText(tr("&Refresh"));258 m_pActionRefresh->setToolTip(tr("Refresh Disk Image Files (%1)").arg(m_pActionRefresh->shortcut().toString()));259 m_pActionRefresh->setStatusTip(tr("Refresh the list of disk image files"));260 }261 262 if (m_pButtonBox)263 m_pButtonBox->button(QDialogButtonBox::Ok)->setText(tr("Choose"));264 265 if (m_pTreeWidget)266 {267 m_pTreeWidget->headerItem()->setText(0, tr("Name"));268 m_pTreeWidget->headerItem()->setText(1, tr("Virtual Size"));269 m_pTreeWidget->headerItem()->setText(2, tr("Actual Size"));270 }271 }272 273 void UIMediumSelector::configure()274 {275 /* Apply window icons: */276 setWindowIcon(UIIconPool::iconSetFull(":/media_manager_32px.png", ":/media_manager_16px.png"));277 prepareWidgets();278 prepareActions();279 prepareConnections();280 }281 282 void UIMediumSelector::prepareActions()283 {284 QString strPrefix("hd");285 switch (m_enmMediumType)286 {287 case UIMediumDeviceType_DVD:288 strPrefix = "cd";289 break;290 case UIMediumDeviceType_Floppy:291 strPrefix = "fd";292 break;293 case UIMediumDeviceType_HardDisk:294 case UIMediumDeviceType_All:295 case UIMediumDeviceType_Invalid:296 default:297 strPrefix = "hd";298 break;299 }300 301 m_pActionAdd = new QAction(this);302 if (m_pActionAdd)303 {304 /* Configure add-action: */305 m_pActionAdd->setShortcut(QKeySequence("Ctrl+A"));306 307 m_pActionAdd->setIcon(UIIconPool::iconSetFull(QString(":/%1_add_32px.png").arg(strPrefix),308 QString(":/%1_add_16px.png").arg(strPrefix),309 QString(":/%1_add_disabled_32px.png").arg(strPrefix),310 QString(":/%1_add_disabled_16px.png").arg(strPrefix)));311 if (m_pMainMenu)312 m_pMainMenu->addAction(m_pActionAdd);313 if (m_pToolBar)314 m_pToolBar->addAction(m_pActionAdd);315 }316 317 /* Currently create is supported only for Floppy: */318 if (m_enmMediumType == UIMediumDeviceType_Floppy)319 {320 m_pActionCreate = new QAction(this);321 }322 if (m_pActionCreate)323 {324 325 m_pActionCreate->setShortcut(QKeySequence("Ctrl+C"));326 m_pActionCreate->setIcon(UIIconPool::iconSetFull(QString(":/%1_add_32px.png").arg(strPrefix),327 QString(":/%1_add_16px.png").arg(strPrefix),328 QString(":/%1_add_disabled_32px.png").arg(strPrefix),329 QString(":/%1_add_disabled_16px.png").arg(strPrefix)));330 if (m_pMainMenu)331 m_pMainMenu->addAction(m_pActionCreate);332 if (m_pToolBar)333 m_pToolBar->addAction(m_pActionCreate);334 }335 336 337 m_pActionRefresh = new QAction(this);338 if (m_pActionRefresh)339 {340 m_pActionRefresh->setShortcut(QKeySequence(QKeySequence::Refresh));341 if (m_pActionRefresh && m_pActionRefresh->icon().isNull())342 m_pActionRefresh->setIcon(UIIconPool::iconSetFull(":/refresh_32px.png", ":/refresh_16px.png",343 ":/refresh_disabled_32px.png", ":/refresh_disabled_16px.png"));344 if (m_pMainMenu)345 m_pMainMenu->addAction(m_pActionRefresh);346 if (m_pToolBar)347 m_pToolBar->addAction(m_pActionRefresh);348 }349 }350 351 void UIMediumSelector::prepareConnections()352 {353 /* Configure medium-enumeration connections: */354 connect(&vboxGlobal(), &VBoxGlobal::sigMediumEnumerationStarted,355 this, &UIMediumSelector::sltHandleMediumEnumerationStart);356 connect(&vboxGlobal(), &VBoxGlobal::sigMediumEnumerated,357 this, &UIMediumSelector::sltHandleMediumEnumerated);358 connect(&vboxGlobal(), &VBoxGlobal::sigMediumEnumerationFinished,359 this, &UIMediumSelector::sltHandleMediumEnumerationFinish);360 if (m_pActionAdd)361 connect(m_pActionAdd, &QAction::triggered, this, &UIMediumSelector::sltAddMedium);362 if (m_pActionCreate)363 connect(m_pActionCreate, &QAction::triggered, this, &UIMediumSelector::sltCreateMedium);364 if (m_pActionRefresh)365 connect(m_pActionRefresh, &QAction::triggered, this, &UIMediumSelector::sltHandleRefresh);366 367 if (m_pTreeWidget)368 {369 connect(m_pTreeWidget, &QITreeWidget::itemSelectionChanged, this, &UIMediumSelector::sltHandleItemSelectionChanged);370 connect(m_pTreeWidget, &QITreeWidget::itemDoubleClicked, this, &UIMediumSelector::sltHandleTreeWidgetDoubleClick);371 connect(m_pTreeWidget, &QITreeWidget::customContextMenuRequested, this, &UIMediumSelector::sltHandleTreeContextMenuRequest);372 }373 374 if (m_pButtonBox)375 {376 connect(m_pButtonBox, &QIDialogButtonBox::rejected, this, &UIMediumSelector::close);377 connect(m_pButtonBox, &QIDialogButtonBox::accepted, this, &UIMediumSelector::accept);378 }379 380 if (m_pSearchWidget)381 {382 connect(m_pSearchWidget, &UIMediumSearchWidget::sigPerformSearch,383 this, &UIMediumSelector::sltHandlePerformSearch);384 connect(m_pSearchWidget, &UIMediumSearchWidget::sigShowNextMatchingItem,385 this, &UIMediumSelector::sltHandleShowNextMatchingItem);386 connect(m_pSearchWidget, &UIMediumSearchWidget::sigShowPreviousMatchingItem,387 this, &UIMediumSelector::sltHandleShowPreviousMatchingItem);388 }389 }390 391 UIMediumItem* UIMediumSelector::addTreeItem(const UIMedium &medium, QITreeWidgetItem *pParent)392 {393 if (!pParent)394 return 0;395 switch (m_enmMediumType)396 {397 case UIMediumDeviceType_DVD:398 return new UIMediumItemCD(medium, pParent);399 break;400 case UIMediumDeviceType_Floppy:401 return new UIMediumItemFD(medium, pParent);402 break;403 case UIMediumDeviceType_HardDisk:404 case UIMediumDeviceType_All:405 case UIMediumDeviceType_Invalid:406 default:407 return createHardDiskItem(medium, pParent);408 break;409 }410 }411 412 UIMediumItem* UIMediumSelector::createHardDiskItem(const UIMedium &medium, QITreeWidgetItem *pParent)413 {414 if (medium.medium().isNull())415 return 0;416 if (!m_pTreeWidget)417 return 0;418 /* Search the tree to see if we already have the item: */419 UIMediumItem *pMediumItem = searchItem(0, medium.id());420 if (pMediumItem)421 return pMediumItem;422 /* Check if the corresponding medium has a parent */423 if (medium.parentID() != UIMedium::nullID())424 {425 UIMediumItem *pParentMediumItem = searchItem(0, medium.parentID());426 /* If parent medium-item was not found we create it: */427 if (!pParentMediumItem)428 {429 /* Make sure corresponding parent medium is already cached! */430 UIMedium parentMedium = vboxGlobal().medium(medium.parentID());431 if (parentMedium.isNull())432 AssertMsgFailed(("Parent medium with ID={%s} was not found!\n", medium.parentID().toString().toUtf8().constData()));433 /* Try to create parent medium-item: */434 else435 pParentMediumItem = createHardDiskItem(parentMedium, pParent);436 }437 if (pParentMediumItem)438 {439 pMediumItem = new UIMediumItemHD(medium, pParentMediumItem);440 LogRel2(("UIMediumManager: Child hard-disk medium-item with ID={%s} created.\n", medium.id().toString().toUtf8().constData()));441 }442 else443 AssertMsgFailed(("Parent medium with ID={%s} could not be created!\n", medium.parentID().toString().toUtf8().constData()));444 }445 446 /* No parents, thus just create item as top-level one: */447 else448 {449 pMediumItem = new UIMediumItemHD(medium, pParent);450 LogRel2(("UIMediumManager: Root hard-disk medium-item with ID={%s} created.\n", medium.id().toString().toUtf8().constData()));451 }452 return pMediumItem;453 }454 455 void UIMediumSelector::restoreSelection(const QList<QUuid> &selectedMediums, QVector<UIMediumItem*> &mediumList)456 {457 if (!m_pTreeWidget)458 return;459 if (selectedMediums.isEmpty())460 {461 m_pTreeWidget->setCurrentItem(0);462 return;463 }464 bool selected = false;465 for (int i = 0; i < mediumList.size(); ++i)466 {467 if (!mediumList[i])468 continue;469 if (selectedMediums.contains(mediumList[i]->medium().id()))470 {471 mediumList[i]->setSelected(true);472 selected = true;473 }474 }475 476 if (!selected)477 m_pTreeWidget->setCurrentItem(0);478 return;479 }480 481 void UIMediumSelector::prepareWidgets()482 {483 m_pCentralWidget = new QWidget;484 if (!m_pCentralWidget)485 return;486 setCentralWidget(m_pCentralWidget);487 488 m_pMainLayout = new QVBoxLayout;489 m_pCentralWidget->setLayout(m_pMainLayout);490 491 if (!m_pMainLayout || !menuBar())492 return;493 494 m_pMainMenu = menuBar()->addMenu(tr("Medium"));495 496 m_pToolBar = new UIToolBar(parentWidget());497 if (m_pToolBar)498 {499 /* Configure toolbar: */500 const int iIconMetric = (int)(QApplication::style()->pixelMetric(QStyle::PM_LargeIconSize));501 m_pToolBar->setIconSize(QSize(iIconMetric, iIconMetric));502 m_pToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);503 m_pMainLayout->addWidget(m_pToolBar);504 }505 506 m_pTreeWidget = new QITreeWidget;507 if (m_pTreeWidget)508 {509 m_pTreeWidget->setSelectionMode(QAbstractItemView::SingleSelection);510 m_pMainLayout->addWidget(m_pTreeWidget);511 m_pTreeWidget->setAlternatingRowColors(true);512 int iColumnCount = (m_enmMediumType == UIMediumDeviceType_HardDisk) ? 3 : 2;513 m_pTreeWidget->setColumnCount(iColumnCount);514 m_pTreeWidget->setSortingEnabled(true);515 m_pTreeWidget->sortItems(0, Qt::AscendingOrder);516 m_pTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu);517 }518 519 m_pSearchWidget = new UIMediumSearchWidget;520 if (m_pSearchWidget)521 {522 m_pMainLayout->addWidget(m_pSearchWidget);523 }524 525 m_pButtonBox = new QIDialogButtonBox;526 if (m_pButtonBox)527 {528 /* Configure button-box: */529 m_pButtonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok);530 m_pButtonBox->button(QDialogButtonBox::Cancel)->setShortcut(Qt::Key_Escape);531 532 /* Add button-box into main layout: */533 m_pMainLayout->addWidget(m_pButtonBox);534 }535 536 repopulateTreeWidget();537 }538 539 void UIMediumSelector::sltAddMedium()540 {541 QString strDefaultMachineFolder = vboxGlobal().virtualBox().GetSystemProperties().GetDefaultMachineFolder();542 QUuid uMediumID = vboxGlobal().openMediumWithFileOpenDialog(m_enmMediumType, this, strDefaultMachineFolder);543 if (uMediumID.isNull())544 return;545 repopulateTreeWidget();546 selectMedium(uMediumID);547 548 }549 550 void UIMediumSelector::sltCreateMedium()551 {552 QString strMachineFolder = QFileInfo(m_strMachineSettingsFilePath).absolutePath();553 UIFDCreationDialog *pDialog = new UIFDCreationDialog(this, m_strMachineName, strMachineFolder);554 if (pDialog->exec())555 {556 repopulateTreeWidget();557 selectMedium(pDialog->mediumID());558 }559 delete pDialog;560 }561 562 void UIMediumSelector::sltHandleItemSelectionChanged()563 {564 updateOkButton();565 }566 567 void UIMediumSelector::sltHandleTreeWidgetDoubleClick(QTreeWidgetItem * item, int column)568 {569 Q_UNUSED(column);570 if (!dynamic_cast<UIMediumItem*>(item))571 return;572 accept();573 }574 575 576 void UIMediumSelector::sltHandleMediumEnumerationStart()577 {578 /* Disable controls. Left Alone button box 'Ok' button. it is handle by tree population: */579 if (m_pActionRefresh)580 m_pActionRefresh->setEnabled(false);581 }582 583 void UIMediumSelector::sltHandleMediumEnumerated()584 {585 }586 587 void UIMediumSelector::sltHandleMediumEnumerationFinish()588 {589 repopulateTreeWidget();590 if (m_pActionRefresh)591 m_pActionRefresh->setEnabled(true);592 }593 594 void UIMediumSelector::sltHandleRefresh()595 {596 /* Initialize media enumation: */597 vboxGlobal().startMediumEnumeration();598 }599 600 void UIMediumSelector::sltHandlePerformSearch()601 {602 performMediumSearch();603 }604 605 void UIMediumSelector::sltHandleShowNextMatchingItem()606 {607 if (m_mathingItemList.isEmpty())608 return;609 610 if (++m_iCurrentShownIndex >= m_mathingItemList.size())611 m_iCurrentShownIndex = 0;612 scrollToItem(m_mathingItemList[m_iCurrentShownIndex]);613 }614 615 void UIMediumSelector::sltHandleShowPreviousMatchingItem()616 {617 if (m_mathingItemList.isEmpty())618 return;619 if (--m_iCurrentShownIndex < 0)620 m_iCurrentShownIndex = m_mathingItemList.size() -1;621 scrollToItem(m_mathingItemList[m_iCurrentShownIndex]);622 }623 624 void UIMediumSelector::sltHandleTreeContextMenuRequest(const QPoint &point)625 {626 QWidget *pSender = qobject_cast<QWidget*>(sender());627 if (!pSender)628 return;629 630 QMenu menu;631 QAction *pExpandAll = menu.addAction(tr("Expand All"));632 QAction *pCollapseAll = menu.addAction(tr("Collapse All"));633 634 connect(pExpandAll, &QAction::triggered, this, &UIMediumSelector::sltHandleTreeExpandAllSignal);635 connect(pCollapseAll, &QAction::triggered, this, &UIMediumSelector::sltHandleTreeCollapseAllSignal);636 637 menu.exec(pSender->mapToGlobal(point));638 }639 640 void UIMediumSelector::sltHandleTreeExpandAllSignal()641 {642 if (m_pTreeWidget)643 m_pTreeWidget->expandAll();644 }645 646 void UIMediumSelector::sltHandleTreeCollapseAllSignal()647 {648 if (m_pTreeWidget)649 m_pTreeWidget->collapseAll();650 651 if (m_pAttachedSubTreeRoot)652 m_pTreeWidget->setExpanded(m_pTreeWidget->itemIndex(m_pAttachedSubTreeRoot), true);653 if (m_pNotAttachedSubTreeRoot)654 m_pTreeWidget->setExpanded(m_pTreeWidget->itemIndex(m_pNotAttachedSubTreeRoot), true);655 }656 657 void UIMediumSelector::selectMedium(const QUuid &uMediumID)658 {659 if (!m_pTreeWidget)660 return;661 UIMediumItem *pMediumItem = searchItem(0, uMediumID);662 if (pMediumItem)663 {664 m_pTreeWidget->setCurrentItem(pMediumItem);665 666 }667 }668 669 void UIMediumSelector::updateOkButton()670 {671 672 if (!m_pTreeWidget || !m_pButtonBox || !m_pButtonBox->button(QDialogButtonBox::Ok))673 return;674 QList<QTreeWidgetItem*> selectedItems = m_pTreeWidget->selectedItems();675 if (selectedItems.isEmpty())676 {677 m_pButtonBox->button(QDialogButtonBox::Ok)->setEnabled(false);678 return;679 }680 681 /* check if at least one of the selected items is a UIMediumItem */682 bool mediumItemSelected = false;683 for (int i = 0; i < selectedItems.size() && !mediumItemSelected; ++i)684 {685 if (dynamic_cast<UIMediumItem*>(selectedItems.at(i)))686 mediumItemSelected = true;687 }688 if (mediumItemSelected)689 m_pButtonBox->button(QDialogButtonBox::Ok)->setEnabled(true);690 else691 m_pButtonBox->button(QDialogButtonBox::Ok)->setEnabled(false);692 }693 694 void UIMediumSelector::finalize()695 {696 /* Apply language settings: */697 retranslateUi();698 }699 700 void UIMediumSelector::showEvent(QShowEvent *pEvent)701 {702 Q_UNUSED(pEvent);703 704 /* Try to determine the initial size: */705 QSize proposedSize;706 int iHostScreen = 0;707 if (m_pParent)708 iHostScreen = gpDesktop->screenNumber(m_pParent);709 else710 iHostScreen = gpDesktop->screenNumber(this);711 if (iHostScreen >= 0 && iHostScreen < gpDesktop->screenCount())712 {713 /* On the basis of current host-screen geometry if possible: */714 const QRect screenGeometry = gpDesktop->screenGeometry(iHostScreen);715 if (screenGeometry.isValid())716 proposedSize = screenGeometry.size() * 5 / 15;717 }718 /* Fallback to default size if we failed: */719 if (proposedSize.isNull())720 proposedSize = QSize(800, 600);721 /* Resize to initial size: */722 resize(proposedSize);723 724 if (m_pParent)725 VBoxGlobal::centerWidget(this, m_pParent, false);726 727 }728 729 void UIMediumSelector::repopulateTreeWidget()730 {731 if (!m_pTreeWidget)732 return;733 /* Cache the currently selected items: */734 QList<QTreeWidgetItem*> selectedItems = m_pTreeWidget->selectedItems();735 QList<QUuid> selectedMedia = selectedMediumIds();736 /* uuid list of selected items: */737 /* Reset the related data structure: */738 m_mediumItemList.clear();739 m_pTreeWidget->clear();740 m_pAttachedSubTreeRoot = 0;741 m_pNotAttachedSubTreeRoot = 0;742 QVector<UIMediumItem*> menuItemVector;743 744 foreach (const QUuid &uMediumID, vboxGlobal().mediumIDs())745 {746 UIMedium medium = vboxGlobal().medium(uMediumID);747 //printf("name %s\n", qPrintable(medium.name()));748 if (medium.type() == m_enmMediumType)749 {750 bool isMediumAttached = !(medium.medium().GetMachineIds().isEmpty());751 QITreeWidgetItem *pParent = 0;752 if (isMediumAttached)753 {754 if (!m_pAttachedSubTreeRoot)755 {756 QStringList strList;757 strList << "Attached";758 m_pAttachedSubTreeRoot = new QITreeWidgetItem(m_pTreeWidget, strList);759 }760 pParent = m_pAttachedSubTreeRoot;761 762 }763 else764 {765 if (!m_pNotAttachedSubTreeRoot)766 {767 QStringList strList;768 strList << "Not Attached";769 m_pNotAttachedSubTreeRoot = new QITreeWidgetItem(m_pTreeWidget, strList);770 }771 pParent = m_pNotAttachedSubTreeRoot;772 }773 UIMediumItem *treeItem = addTreeItem(medium, pParent);774 m_mediumItemList.append(treeItem);775 menuItemVector.push_back(treeItem);776 }777 }778 restoreSelection(selectedMedia, menuItemVector);779 saveDefaultForeground();780 updateOkButton();781 if (m_pAttachedSubTreeRoot)782 m_pTreeWidget->expandItem(m_pAttachedSubTreeRoot);783 784 if (m_pNotAttachedSubTreeRoot)785 m_pTreeWidget->expandItem(m_pNotAttachedSubTreeRoot);786 787 m_pTreeWidget->resizeColumnToContents(0);788 performMediumSearch();789 }790 791 void UIMediumSelector::saveDefaultForeground()792 {793 if (!m_pTreeWidget)794 return;795 if (m_defaultItemForeground == QBrush() && m_pTreeWidget->topLevelItemCount() >= 1)796 {797 QTreeWidgetItem *item = m_pTreeWidget->topLevelItem(0);798 if (item)799 {800 QVariant data = item->data(0, Qt::ForegroundRole);801 if (data.canConvert<QBrush>())802 {803 m_defaultItemForeground = data.value<QBrush>();804 }805 }806 }807 }808 809 UIMediumItem* UIMediumSelector::searchItem(const QTreeWidgetItem *pParent, const QUuid &mediumId)810 {811 if (!m_pTreeWidget)812 return 0;813 if (!pParent)814 {815 pParent = m_pTreeWidget->invisibleRootItem();816 }817 if (!pParent)818 return 0;819 820 for (int i = 0; i < pParent->childCount(); ++i)821 {822 QTreeWidgetItem *pChild = pParent->child(i);823 if (!pChild)824 continue;825 UIMediumItem *mediumItem = dynamic_cast<UIMediumItem*>(pChild);826 if (mediumItem)827 {828 if (mediumItem->id() == mediumId)829 {830 return mediumItem;831 }832 }833 UIMediumItem *pResult = searchItem(pChild, mediumId);834 if (pResult)835 return pResult;836 }837 return 0;838 }839 840 void UIMediumSelector::performMediumSearch()841 {842 if (!m_pSearchWidget || !m_pTreeWidget)843 return;844 /* Unmark all tree items to remove the highltights: */845 for (int i = 0; i < m_mediumItemList.size(); ++i)846 {847 for (int j = 0; j < m_pTreeWidget->columnCount(); ++j)848 {849 if (m_mediumItemList[i])850 m_mediumItemList[i]->setData(j, Qt::ForegroundRole, m_defaultItemForeground);851 }852 }853 854 m_mathingItemList.clear();855 m_iCurrentShownIndex = 0;856 857 UIMediumSearchWidget::SearchType searchType =858 m_pSearchWidget->searchType();859 if (searchType >= UIMediumSearchWidget::SearchByMax)860 return;861 QString strTerm = m_pSearchWidget->searchTerm();862 if (strTerm.isEmpty())863 return;864 865 for (int i = 0; i < m_mediumItemList.size(); ++i)866 {867 if (!m_mediumItemList[i])868 continue;869 QString strMedium;870 if (searchType == UIMediumSearchWidget::SearchByName)871 strMedium = m_mediumItemList[i]->medium().name();872 else if(searchType == UIMediumSearchWidget::SearchByUUID)873 strMedium = m_mediumItemList[i]->medium().id().toString();874 if (strMedium.isEmpty())875 continue;876 if (strMedium.contains(strTerm, Qt::CaseInsensitive))877 {878 /* mark all the items by setting foregroung color to red: */879 for (int j = 0; j < m_pTreeWidget->columnCount(); ++j)880 m_mediumItemList[i]->setData(j, Qt::ForegroundRole, QBrush(QColor(255, 0, 0)));881 m_mathingItemList.append(m_mediumItemList[i]);882 }883 }884 if (!m_mathingItemList.isEmpty())885 scrollToItem(m_mathingItemList[0]);886 }887 888 void UIMediumSelector::scrollToItem(UIMediumItem* pItem)889 {890 if (!pItem)891 return;892 893 QModelIndex itemIndex = m_pTreeWidget->itemIndex(pItem);894 for (int i = 0; i < m_mediumItemList.size(); ++i)895 {896 QFont font = m_mediumItemList[i]->font(0);897 font.setBold(false);898 m_mediumItemList[i]->setFont(0, font);899 }900 QFont font = pItem->font(0);901 font.setBold(true);902 pItem->setFont(0, font);903 904 m_pTreeWidget->scrollTo(itemIndex);905 //m_pTreeWidget->setCurrentIndex(itemIndex);906 }907 908 909 #include "UIMediumSelector.moc" -
trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumSearchWidget.h
r76969 r76979 1 1 /* $Id$ */ 2 2 /** @file 3 * VBox Qt GUI - UIMediumSe lectorclass declaration.3 * VBox Qt GUI - UIMediumSearchWidget class declaration. 4 4 */ 5 5 … … 16 16 */ 17 17 18 #ifndef FEQT_INCLUDED_SRC_medium_UIMediumSe lector_h19 #define FEQT_INCLUDED_SRC_medium_UIMediumSe lector_h18 #ifndef FEQT_INCLUDED_SRC_medium_UIMediumSearchWidget_h 19 #define FEQT_INCLUDED_SRC_medium_UIMediumSearchWidget_h 20 20 #ifndef RT_WITHOUT_PRAGMA_ONCE 21 21 # pragma once … … 23 23 24 24 /* GUI includes: */ 25 #include "QIMainDialog.h"26 25 #include "QIWithRetranslateUI.h" 27 #include "UIMedium.h"28 #include "UIMediumDefs.h"29 #include "UIMediumDetailsWidget.h"30 26 31 27 /* Forward declarations: */ 32 28 class QAction; 33 class QTreeWidgetItem; 34 class QITreeWidget; 35 class QITreeWidgetItem; 36 class QVBoxLayout; 29 class QLineEdit; 30 class QIComboBox; 37 31 class QIDialogButtonBox; 38 class UIMediumItem; 39 class UIMediumSearchWidget; 40 class UIToolBar; 32 class QIToolButton; 41 33 42 43 /** QIDialog extension providing GUI with a dialog to select an existing medium. */44 class SHARED_LIBRARY_STUFF UIMediumSelector : public QIWithRetranslateUI<QIMainDialog>34 /** QWidget extension providing a simple way to enter a earch term and search type for medium searching 35 * in virtual media manager, medium selection dialog, etc. */ 36 class SHARED_LIBRARY_STUFF UIMediumSearchWidget : public QIWithRetranslateUI<QWidget> 45 37 { 46 47 38 Q_OBJECT; 48 39 49 40 signals: 50 41 42 void sigPerformSearch(); 43 void sigShowNextMatchingItem(); 44 void sigShowPreviousMatchingItem(); 45 51 46 public: 52 47 53 UIMediumSelector(UIMediumDeviceType enmMediumType, const QString &machineName = QString(), 54 const QString &machineSettigFilePath = QString(), QWidget *pParent = 0); 55 QList<QUuid> selectedMediumIds() const; 48 enum SearchType 49 { 50 SearchByName, 51 SearchByUUID, 52 SearchByMax 53 }; 54 55 public: 56 57 UIMediumSearchWidget(QWidget *pParent = 0); 58 SearchType searchType() const; 59 QString searchTerm() const; 56 60 57 61 protected: 58 62 59 void showEvent(QShowEvent *pEvent);63 void retranslateUi() /* override */; 60 64 61 private slots:65 private: 62 66 63 void sltAddMedium(); 64 void sltCreateMedium(); 65 void sltHandleItemSelectionChanged(); 66 void sltHandleTreeWidgetDoubleClick(QTreeWidgetItem * item, int column); 67 void sltHandleMediumEnumerationStart(); 68 void sltHandleMediumEnumerated(); 69 void sltHandleMediumEnumerationFinish(); 70 void sltHandleRefresh(); 71 void sltHandlePerformSearch(); 72 void sltHandleShowNextMatchingItem(); 73 void sltHandleShowPreviousMatchingItem(); 74 void sltHandleTreeContextMenuRequest(const QPoint &point); 75 void sltHandleTreeExpandAllSignal(); 76 void sltHandleTreeCollapseAllSignal(); 77 78 private: 79 80 81 /** @name Event-handling stuff. 82 * @{ */ 83 /** Handles translation event. */ 84 virtual void retranslateUi() /* override */; 85 /** @} */ 86 87 /** @name Prepare/cleanup cascade. 88 * @{ */ 89 /** Configures all. */ 90 void configure(); 91 void prepareWidgets(); 92 void prepareActions(); 93 void prepareConnections(); 94 /** Perform final preparations. */ 95 void finalize(); 96 /** @} */ 97 98 void repopulateTreeWidget(); 99 /** Disable/enable 'ok' button on the basis of having a selected item */ 100 void updateOkButton(); 101 UIMediumItem* addTreeItem(const UIMedium &medium, QITreeWidgetItem *pParent); 102 void restoreSelection(const QList<QUuid> &selectedMediums, QVector<UIMediumItem*> &mediumList); 103 /** Recursively create the hard disk hierarchy under the tree widget */ 104 UIMediumItem* createHardDiskItem(const UIMedium &medium, QITreeWidgetItem *pParent); 105 UIMediumItem* searchItem(const QTreeWidgetItem *pParent, const QUuid &mediumId); 106 void performMediumSearch(); 107 /** Remember the default foreground brush of the tree so that we can reset tree items' foreground later */ 108 void saveDefaultForeground(); 109 void selectMedium(const QUuid &uMediumID); 110 void scrollToItem(UIMediumItem* pItem); 111 QWidget *m_pCentralWidget; 112 QVBoxLayout *m_pMainLayout; 113 QITreeWidget *m_pTreeWidget; 114 UIMediumDeviceType m_enmMediumType; 115 QIDialogButtonBox *m_pButtonBox; 116 QMenu *m_pMainMenu; 117 UIToolBar *m_pToolBar; 118 QAction *m_pActionAdd; 119 QAction *m_pActionCreate; 120 QAction *m_pActionRefresh; 121 /** All the known media that are already attached to some vm are added under the following top level tree item */ 122 QITreeWidgetItem *m_pAttachedSubTreeRoot; 123 /** All the known media that are not attached to any vm are added under the following top level tree item */ 124 QITreeWidgetItem *m_pNotAttachedSubTreeRoot; 125 QWidget *m_pParent; 126 UIMediumSearchWidget *m_pSearchWidget; 127 /** The list all items added to tree. kept in sync. with tree to make searching easier (faster). */ 128 QList<UIMediumItem*> m_mediumItemList; 129 /** List of items that are matching to the search. */ 130 QList<UIMediumItem*> m_mathingItemList; 131 /** Index of the currently shown (scrolled) item in the m_mathingItemList. */ 132 int m_iCurrentShownIndex; 133 QBrush m_defaultItemForeground; 134 QString m_strMachineSettingsFilePath; 135 QString m_strMachineName; 67 void prepareWidgets(); 68 QIComboBox *m_pSearchComboxBox; 69 QLineEdit *m_pSearchTermLineEdit; 70 QIToolButton *m_pShowNextMatchButton; 71 QIToolButton *m_pShowPreviousMatchButton; 136 72 }; 137 73 138 #endif /* !FEQT_INCLUDED_SRC_medium_UIMediumSe lector_h */74 #endif /* !FEQT_INCLUDED_SRC_medium_UIMediumSearchWidget_h */ -
trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumSelector.cpp
r76909 r76979 24 24 25 25 /* GUI includes: */ 26 #include "QIComboBox.h"27 26 #include "QIDialogButtonBox.h" 28 27 #include "QIFileDialog.h" 29 #include "QILineEdit.h"30 28 #include "QIMessageBox.h" 31 29 #include "QITabWidget.h" … … 35 33 #include "UIExtraDataManager.h" 36 34 #include "UIFDCreationDialog.h" 35 #include "UIMediumSearchWidget.h" 37 36 #include "UIMediumSelector.h" 38 37 #include "UIMessageCenter.h" … … 54 53 #endif /* VBOX_WS_MAC */ 55 54 56 /*********************************************************************************************************************************57 * UIMediumSearchWidget definition. *58 *********************************************************************************************************************************/59 /** QWidget extension providing a simple way to enter a earch term and search type for medium searching60 * in virtual media manager, medium selection dialog, etc. */61 class UIMediumSearchWidget : public QIWithRetranslateUI<QWidget>62 {63 Q_OBJECT;64 65 public:66 67 enum SearchType68 {69 SearchByName,70 SearchByUUID,71 SearchByMax72 };73 74 signals:75 76 void sigPerformSearch();77 void sigShowNextMatchingItem();78 void sigShowPreviousMatchingItem();79 80 public:81 82 UIMediumSearchWidget(QWidget *pParent = 0);83 SearchType searchType() const;84 QString searchTerm() const;85 86 protected:87 88 void retranslateUi() /* override */;89 90 private:91 92 void prepareWidgets();93 QIComboBox *m_pSearchComboxBox;94 QLineEdit *m_pSearchTermLineEdit;95 QIToolButton *m_pShowNextMatchButton;96 QIToolButton *m_pShowPreviousMatchButton;97 };98 99 100 /*********************************************************************************************************************************101 * UIMediumSearchWidget implementation. *102 *********************************************************************************************************************************/103 104 UIMediumSearchWidget::UIMediumSearchWidget(QWidget *pParent)105 :QIWithRetranslateUI<QWidget>(pParent)106 , m_pSearchComboxBox(0)107 , m_pSearchTermLineEdit(0)108 , m_pShowNextMatchButton(0)109 , m_pShowPreviousMatchButton(0)110 {111 prepareWidgets();112 }113 114 void UIMediumSearchWidget::prepareWidgets()115 {116 QHBoxLayout *pLayout = new QHBoxLayout;117 setLayout(pLayout);118 pLayout->setContentsMargins(0, 0, 0, 0);119 pLayout->setSpacing(0);120 121 m_pSearchComboxBox = new QIComboBox;122 if (m_pSearchComboxBox)123 {124 m_pSearchComboxBox->setEditable(false);125 m_pSearchComboxBox->insertItem(SearchByName, "Search By Name");126 m_pSearchComboxBox->insertItem(SearchByUUID, "Search By UUID");127 pLayout->addWidget(m_pSearchComboxBox);128 129 connect(m_pSearchComboxBox, static_cast<void(QIComboBox::*)(int)>(&QIComboBox::currentIndexChanged),130 this, &UIMediumSearchWidget::sigPerformSearch);131 132 }133 134 m_pSearchTermLineEdit = new QLineEdit;135 if (m_pSearchTermLineEdit)136 {137 m_pSearchTermLineEdit->setClearButtonEnabled(true);138 pLayout->addWidget(m_pSearchTermLineEdit);139 connect(m_pSearchTermLineEdit, &QILineEdit::textChanged,140 this, &UIMediumSearchWidget::sigPerformSearch);141 }142 143 m_pShowPreviousMatchButton = new QIToolButton;144 if (m_pShowPreviousMatchButton)145 {146 m_pShowPreviousMatchButton->setIcon(UIIconPool::iconSet(":/log_viewer_search_backward_16px.png", ":/log_viewer_search_backward_disabled_16px.png"));147 connect(m_pShowPreviousMatchButton, &QIToolButton::clicked, this, &UIMediumSearchWidget::sigShowPreviousMatchingItem);148 pLayout->addWidget(m_pShowPreviousMatchButton);149 }150 m_pShowNextMatchButton = new QIToolButton;151 if (m_pShowNextMatchButton)152 {153 m_pShowNextMatchButton->setIcon(UIIconPool::iconSet(":/log_viewer_search_forward_16px.png", ":/log_viewer_search_forward_disabled_16px.png"));154 connect(m_pShowNextMatchButton, &QIToolButton::clicked, this, &UIMediumSearchWidget:: sigShowNextMatchingItem);155 pLayout->addWidget(m_pShowNextMatchButton);156 }157 158 retranslateUi();159 }160 161 UIMediumSearchWidget::SearchType UIMediumSearchWidget::searchType() const162 {163 if (!m_pSearchComboxBox || m_pSearchComboxBox->currentIndex() >= static_cast<int>(SearchByMax))164 return SearchByMax;165 return static_cast<SearchType>(m_pSearchComboxBox->currentIndex());166 }167 168 QString UIMediumSearchWidget::searchTerm() const169 {170 if (!m_pSearchTermLineEdit)171 return QString();172 return m_pSearchTermLineEdit->text();173 }174 175 void UIMediumSearchWidget::retranslateUi()176 {177 if (m_pSearchComboxBox)178 {179 m_pSearchComboxBox->setItemText(SearchByName, UIMediumSelector::tr("Search By Name"));180 m_pSearchComboxBox->setItemText(SearchByUUID, UIMediumSelector::tr("Search By UUID"));181 m_pSearchComboxBox->setToolTip(UIMediumSelector::tr("Select the search type"));182 }183 if (m_pSearchTermLineEdit)184 m_pSearchTermLineEdit->setToolTip("Enter the search term and press Return");185 if (m_pShowPreviousMatchButton)186 m_pShowPreviousMatchButton->setToolTip("Show the previous item matching the search term");187 if (m_pShowNextMatchButton)188 m_pShowNextMatchButton->setToolTip("Show the next item matching the search term");189 }190 191 /*********************************************************************************************************************************192 * UIMediumSelector implementation. *193 *********************************************************************************************************************************/194 55 195 56 UIMediumSelector::UIMediumSelector(UIMediumDeviceType enmMediumType, const QString &machineName /* = QString() */, … … 903 764 904 765 m_pTreeWidget->scrollTo(itemIndex); 905 //m_pTreeWidget->setCurrentIndex(itemIndex); 906 } 907 908 909 #include "UIMediumSelector.moc" 766 } -
trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumSelector.h
r76909 r76979 27 27 #include "UIMedium.h" 28 28 #include "UIMediumDefs.h" 29 #include "UIMediumDetailsWidget.h" 29 30 30 31 31 /* Forward declarations: */
Note:
See TracChangeset
for help on using the changeset viewer.