From bb58a013f4dc10a359d786ce157d53408fd4fcdd Mon Sep 17 00:00:00 2001 From: "A. Wilcox" Date: Fri, 22 May 2020 08:50:26 -0500 Subject: Qt UI: Implement Mount Point selection, the last wizard page --- ui/qt5/mountdialog.cc | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 ui/qt5/mountdialog.cc (limited to 'ui/qt5/mountdialog.cc') diff --git a/ui/qt5/mountdialog.cc b/ui/qt5/mountdialog.cc new file mode 100644 index 0000000..f986423 --- /dev/null +++ b/ui/qt5/mountdialog.cc @@ -0,0 +1,106 @@ +/* + * mountdialog.cc - Implementation of a dialog for selecting a mount point + * horizon-qt5, the Qt 5 user interface for + * Project Horizon + * + * Copyright (c) 2020 Adélie Linux and contributors. All rights reserved. + * This code is licensed under the AGPL 3.0 license, as noted in the + * LICENSE-code file in the root directory of this repository. + * + * SPDX-License-Identifier: AGPL-3.0-only + */ + +#include "mountdialog.hh" + +#include +#include +#include +#include +#include + +MountDialog::MountDialog(QStringList skipParts, QStringList skipMounts, + HorizonWizard *wizard, QWidget *parent) + : QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint) { + setWindowTitle(tr("Choose Partition and Mount Point")); + + QPushButton *ok = new QPushButton(tr("Confirm")); + ok->setEnabled(false); + connect(ok, &QPushButton::clicked, this, &QDialog::accept); + QPushButton *cancel = new QPushButton(tr("Cancel")); + connect(cancel, &QPushButton::clicked, this, &QDialog::reject); + + QVBoxLayout *buttonLayout = new QVBoxLayout; + buttonLayout->setAlignment(Qt::AlignTop); + buttonLayout->addWidget(ok); + buttonLayout->addWidget(cancel); + +#ifdef HAS_INSTALL_ENV + QStringList partitions; + + for(const auto &disk : wizard->disks) { + if(disk.has_fs()) { + partitions << QString::fromStdString(disk.node()); + } else if(disk.has_label()) { + for(const auto &part : disk.partitions()) { + partitions << QString::fromStdString(part.node()); + } + } + } + + QSet parts = partitions.toSet().subtract(skipParts.toSet()); + partitions = parts.toList(); + partitions.sort(); + + partList = new QListWidget; + partList->setWhatsThis(tr("A list of the partitions available on this system.")); + partList->addItems(partitions); + connect(partList, &QListWidget::currentItemChanged, [=] { + ok->setEnabled(partList->currentItem() != nullptr); + }); +#else + partInput = new QLineEdit; + partInput->setWhatsThis(tr("Input the name of a partition, such as /dev/sda1, here.")); +#endif + + QStringList pathCandidates = {"/", "/home", "/opt", "/srv", "/usr", + "/usr/local", "/var", "/var/db", "/var/log"}; + QSet paths = pathCandidates.toSet().subtract(skipMounts.toSet()); + pathCandidates = paths.toList(); + pathCandidates.sort(); + + pathInput = new QComboBox; + pathInput->setEditable(true); + pathInput->setWhatsThis(tr("Select where the partition will be mounted.")); + pathInput->addItems(pathCandidates); + + QVBoxLayout *controlLayout = new QVBoxLayout; + controlLayout->addWidget(new QLabel(tr("Partition"))); + controlLayout->addWidget(partList); + controlLayout->addWidget(new QLabel(tr("will be mounted on"))); + controlLayout->addWidget(pathInput); + + QHBoxLayout *mainBox = new QHBoxLayout; + mainBox->addLayout(controlLayout); + mainBox->addLayout(buttonLayout); + + setLayout(mainBox); +} + +QString MountDialog::partition() const { + assert(partList->currentItem() != nullptr); + return partList->currentItem()->text(); +} + +void MountDialog::setPartition(const QString &part) { + QList candidate = partList->findItems(part, Qt::MatchExactly); + if(candidate.empty()) return; + partList->setCurrentItem(candidate.at(0)); +} + +QString MountDialog::mountPoint() const { + return pathInput->currentText(); +} + +void MountDialog::setMountPoint(const QString &path) { + pathInput->setCurrentText(path); +} -- cgit v1.2.3-70-g09d2