summaryrefslogtreecommitdiff
path: root/ui
diff options
context:
space:
mode:
authorA. Wilcox <AWilcox@Wilcox-Tech.com>2020-05-22 08:50:26 -0500
committerA. Wilcox <AWilcox@Wilcox-Tech.com>2020-05-22 08:50:26 -0500
commitbb58a013f4dc10a359d786ce157d53408fd4fcdd (patch)
treeca8208a9385fd90682d99ed67b82b55e1c3f5c35 /ui
parenta9b35213d330faa3fc551c9a8c3524d519d8466b (diff)
downloadhorizon-bb58a013f4dc10a359d786ce157d53408fd4fcdd.tar.gz
horizon-bb58a013f4dc10a359d786ce157d53408fd4fcdd.tar.bz2
horizon-bb58a013f4dc10a359d786ce157d53408fd4fcdd.tar.xz
horizon-bb58a013f4dc10a359d786ce157d53408fd4fcdd.zip
Qt UI: Implement Mount Point selection, the last wizard page
Diffstat (limited to 'ui')
-rw-r--r--ui/qt5/CMakeLists.txt4
-rw-r--r--ui/qt5/horizonwizard.cc6
-rw-r--r--ui/qt5/mountdialog.cc106
-rw-r--r--ui/qt5/mountdialog.hh45
-rw-r--r--ui/qt5/partitionmountpage.cc78
-rw-r--r--ui/qt5/partitionmountpage.hh31
6 files changed, 269 insertions, 1 deletions
diff --git a/ui/qt5/CMakeLists.txt b/ui/qt5/CMakeLists.txt
index f8bdb56..934cd70 100644
--- a/ui/qt5/CMakeLists.txt
+++ b/ui/qt5/CMakeLists.txt
@@ -9,6 +9,7 @@ set(UI_SOURCES
${CMAKE_SOURCE_DIR}/3rdparty/Section.cpp
stepprogresswidget.cc
subnetbox.cc
+ mountdialog.cc
useraccountwidget.cc
avatardialog.cc
crypt_sha512.c
@@ -51,7 +52,8 @@ IF(INSTALL)
LIST(APPEND UI_SOURCES
commitpage.cc
partitionprobe.cc
- partitionpage.cc)
+ partitionpage.cc
+ partitionmountpage.cc)
ELSE(INSTALL)
LIST(APPEND UI_SOURCES writeoutpage.cc)
ENDIF(INSTALL)
diff --git a/ui/qt5/horizonwizard.cc b/ui/qt5/horizonwizard.cc
index 161accf..143ae43 100644
--- a/ui/qt5/horizonwizard.cc
+++ b/ui/qt5/horizonwizard.cc
@@ -47,6 +47,7 @@ extern "C" {
#include "partitiondiskpage.hh"
#include "partitionchoicepage.hh"
#include "partitionmanualpage.hh"
+#include "partitionmountpage.hh"
#include "networkingpage.hh"
#include "networkifacepage.hh"
#include "netsimplewifipage.hh"
@@ -251,6 +252,9 @@ HorizonWizard::HorizonWizard(QWidget *parent) : QWizard(parent) {
setPage(Page_PartitionDisk, new PartitionDiskPage);
setPage(Page_PartitionChoose, new PartitionChoicePage);
setPage(Page_PartitionManual, new PartitionManualPage);
+#ifdef HAS_INSTALL_ENV
+ setPage(Page_PartitionMount, new PartitionMountPage);
+#endif /* HAS_INSTALL_ENV */
setPage(Page_Network, new NetworkingPage);
setPage(Page_Network_Iface, new NetworkIfacePage);
setPage(Page_Network_Wireless, new NetworkSimpleWirelessPage);
@@ -538,6 +542,8 @@ QString HorizonWizard::toHScript() {
break;
}
+ part_lines << (dynamic_cast<PartitionMountPage *>(page(Page_PartitionMount)))->mountLines();
+
if(chosen_disk.empty()) {
lines << part_lines;
} else if(!auto_part) {
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 <QHBoxLayout>
+#include <QLabel>
+#include <QLineEdit>
+#include <QPushButton>
+#include <QVBoxLayout>
+
+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<QString> 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<QString> 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<QListWidgetItem *> 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);
+}
diff --git a/ui/qt5/mountdialog.hh b/ui/qt5/mountdialog.hh
new file mode 100644
index 0000000..f701438
--- /dev/null
+++ b/ui/qt5/mountdialog.hh
@@ -0,0 +1,45 @@
+/*
+ * mountdialog.hh - Definition of a dialog for selecting a mount point
+ * horizon-qt5, the Qt 5 user interface for
+ * Project Horizon
+ *
+ * Copyright (c) 2019 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
+ */
+
+#ifndef MOUNTDIALOG_HH
+#define MOUNTDIALOG_HH
+
+#include "horizonwizard.hh"
+
+#include <QComboBox>
+#include <QDialog>
+#ifdef HAS_INSTALL_ENV
+#include <QListWidget>
+#else /* !HAS_INSTALL_ENV */
+#include <QLineEdit>
+#endif /* HAS_INSTALL_ENV */
+
+class MountDialog : public QDialog {
+public:
+ explicit MountDialog(QStringList skipParts, QStringList skipMounts,
+ HorizonWizard *wizard, QWidget *parent = nullptr);
+
+ QString partition() const;
+ void setPartition(const QString &part);
+ QString mountPoint() const;
+ void setMountPoint(const QString &path);
+private:
+#ifdef HAS_INSTALL_ENV
+ QListWidget *partList;
+#else /* !HAS_INSTALL_ENV */
+ QLineEdit *partInput;
+#endif /* HAS_INSTALL_ENV */
+ QComboBox *pathInput;
+ QString path;
+};
+
+#endif /* !MOUNTDIALOG_HH */
diff --git a/ui/qt5/partitionmountpage.cc b/ui/qt5/partitionmountpage.cc
index 687d603..7631d0b 100644
--- a/ui/qt5/partitionmountpage.cc
+++ b/ui/qt5/partitionmountpage.cc
@@ -11,9 +11,87 @@
*/
#include "partitionmountpage.hh"
+#include "mountdialog.hh"
+
+#include <functional>
+#include <QDebug>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
PartitionMountPage::PartitionMountPage(QWidget *parent)
: HorizonWizardPage(parent) {
loadWatermark("disk");
setTitle(tr("Set Mount Points"));
+
+ mountList = new QListWidget;
+
+ QVBoxLayout *buttonLayout = new QVBoxLayout;
+ addMountButton = new QPushButton(tr("&Add Mount..."));
+ addMountButton->setIcon(QIcon::fromTheme("list-add"));
+ connect(addMountButton, &QPushButton::clicked, [=] {
+ QStringList parts, paths;
+ for(const auto &mount : mountList->findItems("", Qt::MatchContains)) {
+ parts << mount->data(Qt::UserRole + 1).toString();
+ paths << mount->data(Qt::UserRole + 2).toString();
+ }
+ MountDialog md(parts, paths, horizonWizard());
+ if(md.exec() == QDialog::Accepted) {
+ QListWidgetItem *mount = new QListWidgetItem;
+ QString part = md.partition();
+ QString path = md.mountPoint();
+ mount->setText(tr("%1 on %2").arg(part).arg(path));
+ mount->setIcon(QIcon::fromTheme("drive-harddisk"));
+ mount->setData(Qt::UserRole + 1, part);
+ mount->setData(Qt::UserRole + 2, path);
+
+ mountList->addItem(mount);
+ }
+ });
+ buttonLayout->addWidget(addMountButton);
+
+ delMountButton = new QPushButton(tr("&Remove Mount"));
+ delMountButton->setEnabled(false);
+ delMountButton->setIcon(QIcon::fromTheme("list-remove"));
+ connect(delMountButton, &QPushButton::clicked, [=] {
+ delete mountList->takeItem(mountList->currentRow());
+ });
+ buttonLayout->addWidget(delMountButton);
+
+ /*rescanButton = new QPushButton(tr("Re&scan Devices"));
+ rescanButton->setIcon(QIcon::fromTheme("view-refresh"));
+ connect(rescanButton, &QPushButton::clicked, [=] {
+
+ });
+ buttonLayout->addWidget(rescanButton);*/
+
+ connect(mountList, &QListWidget::currentItemChanged, [=] {
+ delMountButton->setEnabled(mountList->currentItem() != nullptr);
+ });
+
+ std::function<void()> listRowsChanged { [=] {
+ emit completeChanged();
+ } };
+ connect(mountList->model(), &QAbstractItemModel::rowsInserted, listRowsChanged);
+ connect(mountList->model(), &QAbstractItemModel::rowsRemoved, listRowsChanged);
+
+ QHBoxLayout *layout = new QHBoxLayout;
+ layout->addStretch();
+ layout->addWidget(mountList);
+ layout->addLayout(buttonLayout);
+ layout->addStretch();
+
+ setLayout(layout);
+}
+
+bool PartitionMountPage::isComplete() const {
+ return !mountList->findItems(" on /", Qt::MatchEndsWith).isEmpty();
+}
+
+QStringList PartitionMountPage::mountLines() const {
+ QStringList lines;
+ for(const auto &mount : mountList->findItems("", Qt::MatchContains)) {
+ lines << QString("mount %1 %2").arg(mount->data(Qt::UserRole + 1).toString())
+ .arg(mount->data(Qt::UserRole + 2).toString());
+ }
+ return lines;
}
diff --git a/ui/qt5/partitionmountpage.hh b/ui/qt5/partitionmountpage.hh
new file mode 100644
index 0000000..d9a4939
--- /dev/null
+++ b/ui/qt5/partitionmountpage.hh
@@ -0,0 +1,31 @@
+/*
+ * partitionmountpage.hh - Definition of the UI.Partition.Install.Mount page
+ * 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
+ */
+
+#ifndef PARTITIONMOUNTPAGE_HH
+#define PARTITIONMOUNTPAGE_HH
+
+#include "horizonwizardpage.hh"
+#include <QListWidget>
+#include <QPushButton>
+
+class PartitionMountPage : public HorizonWizardPage {
+public:
+ PartitionMountPage(QWidget *parent = nullptr);
+
+ bool isComplete() const override;
+ QStringList mountLines() const;
+private:
+ QListWidget *mountList;
+ QPushButton *addMountButton, *delMountButton, *rescanButton;
+};
+
+#endif /* !PARTITIONMOUNTPAGE_HH */