diff options
-rw-r--r-- | ui/qt5/CMakeLists.txt | 7 | ||||
-rw-r--r-- | ui/qt5/horizon.qrc | 1 | ||||
-rw-r--r-- | ui/qt5/horizonwizard.cc | 2 | ||||
-rw-r--r-- | ui/qt5/horizonwizard.hh | 8 | ||||
-rw-r--r-- | ui/qt5/partitionpage.cc | 97 | ||||
-rw-r--r-- | ui/qt5/partitionpage.hh | 45 | ||||
-rw-r--r-- | ui/qt5/partitionprobe.cc | 19 | ||||
-rw-r--r-- | ui/qt5/partitionprobe.hh | 32 | ||||
-rw-r--r-- | ui/qt5/resources/disk-low.png | bin | 0 -> 6553 bytes |
9 files changed, 208 insertions, 3 deletions
diff --git a/ui/qt5/CMakeLists.txt b/ui/qt5/CMakeLists.txt index a8779fd..dfcaf53 100644 --- a/ui/qt5/CMakeLists.txt +++ b/ui/qt5/CMakeLists.txt @@ -15,6 +15,7 @@ set(UI_SOURCES intropage.cc inputpage.cc + partitionpage.cc networkingpage.cc networkifacepage.cc netsimplewifipage.cc @@ -45,7 +46,9 @@ set(RUN_QT_SOURCES horizon.qrc) IF(INSTALL) - LIST(APPEND UI_SOURCES commitpage.cc) + LIST(APPEND UI_SOURCES + commitpage.cc + partitionprobe.cc) ELSE(INSTALL) LIST(APPEND UI_SOURCES writeoutpage.cc) ENDIF(INSTALL) @@ -68,7 +71,7 @@ IF(INSTALL) pkg_check_modules(XKBFile REQUIRED xkbfile) pkg_check_modules(LIBX11 REQUIRED x11) pkg_check_modules(LibCap REQUIRED libcap) - target_link_libraries(horizon-qt5 ${BCNM} ${SKARNET} ${LIBUDEV_LIBRARIES} ${LibCap_LIBRARIES} ${LIBX11_LIBRARIES} ${XKBFile_LIBRARIES}) + target_link_libraries(horizon-qt5 ${BCNM} ${SKARNET} ${LIBUDEV_LIBRARIES} ${LibCap_LIBRARIES} ${LIBX11_LIBRARIES} ${XKBFile_LIBRARIES} diskman) add_executable(horizon-run-qt5 ${RUN_QT_SOURCES}) target_link_libraries(horizon-run-qt5 Qt5::Widgets) target_compile_definitions(horizon-run-qt5 PRIVATE IN_RUNNER) diff --git a/ui/qt5/horizon.qrc b/ui/qt5/horizon.qrc index 709cdc2..9e67f22 100644 --- a/ui/qt5/horizon.qrc +++ b/ui/qt5/horizon.qrc @@ -2,6 +2,7 @@ <qresource prefix="/wizard_pixmaps"> <file>resources/intro-high.png</file> <file>resources/intro-low.png</file> + <file>resources/disk-low.png</file> <file>resources/network-low.png</file> <file>resources/network-high.png</file> <file>resources/software-high.png</file> diff --git a/ui/qt5/horizonwizard.cc b/ui/qt5/horizonwizard.cc index 72af147..9672006 100644 --- a/ui/qt5/horizonwizard.cc +++ b/ui/qt5/horizonwizard.cc @@ -38,6 +38,7 @@ extern "C" { #include "intropage.hh" #include "inputpage.hh" +#include "partitionpage.hh" #ifdef NON_LIBRE_FIRMWARE #include "firmwarepage.hh" #endif /* NON_LIBRE_FIRMWARE */ @@ -205,6 +206,7 @@ HorizonWizard::HorizonWizard(QWidget *parent) : QWizard(parent) { setPage(Page_Intro, new IntroPage); setPage(Page_Input, new InputPage); + setPage(Page_Partition, new PartitionPage); #ifdef NON_LIBRE_FIRMWARE setPage(Page_Firmware, new FirmwarePage); #endif /* NON_LIBRE_FIRMWARE */ diff --git a/ui/qt5/horizonwizard.hh b/ui/qt5/horizonwizard.hh index 6c6d781..3252d5b 100644 --- a/ui/qt5/horizonwizard.hh +++ b/ui/qt5/horizonwizard.hh @@ -13,10 +13,12 @@ #ifndef HORIZONWIZARD_HH #define HORIZONWIZARD_HH +#include <diskman/disk.hh> #include <QShortcut> #include <QWizard> #include <map> #include <string> +#include <vector> inline QString fromMacAddress(char address[6]) { char buf[18]; @@ -134,12 +136,16 @@ public: std::string version; /*! The architecture being installed. */ Arch arch; +#ifdef HAS_INSTALL_ENV + /*! The disks present on this computer. */ + std::vector<Horizon::DiskMan::Disk> disks; +#endif /*! Whether to erase the disk when automatically partitioning. */ bool erase; /*! The disk to partition automatically. */ std::string auto_disk; /*! The HorizonScript lines describing what to do about partitioning. - * If auto_erase_disk is set, this is not used. + * If auto_disk is set, this is not used. * Otherwise, this should have any relevant disklabel/partition/fs etc. */ QStringList part_lines; #ifdef NON_LIBRE_FIRMWARE diff --git a/ui/qt5/partitionpage.cc b/ui/qt5/partitionpage.cc new file mode 100644 index 0000000..8ca704a --- /dev/null +++ b/ui/qt5/partitionpage.cc @@ -0,0 +1,97 @@ +/* + * partitionpage.cc - Implementation of the UI.Partition page: + * either UI.Partition.Runtime.DiskDetails, or UI.Partition.Install.Details + * 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 + */ + +#include "partitionpage.hh" + +#include <QVBoxLayout> + +PartitionPage::PartitionPage(QWidget *parent) : HorizonWizardPage(parent) { + loadWatermark("disk"); +#ifdef HAS_INSTALL_ENV + setTitle(tr("Detecting Disks")); + + thread = nullptr; + scanDone = false; + + descLabel = new QLabel; + descLabel->setWordWrap(true); + progress = new QProgressBar; + progress->setRange(0, 0); + + scanButton = new QPushButton(tr("Rescan Devices")); + connect(scanButton, &QPushButton::clicked, this, &PartitionPage::scanDisks); + scanButton->setHidden(true); + + QVBoxLayout *layout = new QVBoxLayout; + layout->addStretch(); + layout->addWidget(descLabel); + layout->addWidget(progress); + layout->addWidget(scanButton, 0, Qt::AlignCenter); + layout->addStretch(); + + setLayout(layout); +#else /* !HAS_INSTALL_ENV */ + setTitle(tr("Enter Disk Information")); +#endif /* HAS_INSTALL_ENV */ +} + +void PartitionPage::initializePage() { +#ifdef HAS_INSTALL_ENV + scanDisks(); +#endif +} + +bool PartitionPage::isComplete() const { +#ifdef HAS_INSTALL_ENV + return scanDone; +#else /* !HAS_INSTALL_ENV */ + // determine whether a valid disk has been input + return false; +#endif /* HAS_INSTALL_ENV */ +} + +#ifdef HAS_INSTALL_ENV +void PartitionPage::scanDisks() { + descLabel->setText(tr("Please wait while System Installation collects information on your computer's disk drives.")); + scanButton->setEnabled(false); + scanButton->setHidden(true); + progress->setHidden(false); + + if(thread != nullptr) { + thread->deleteLater(); + } + + thread = new PartitionProbeThread; + connect(thread, &PartitionProbeThread::foundDisks, + this, &PartitionPage::processDisks); + thread->start(); +} + +void PartitionPage::processDisks(void *disk_obj) { + /* Qt can only fling void*s around threads; convert back to vec of Disk */ + vector<Disk> *disks = static_cast<vector<Disk> *>(disk_obj); + + scanButton->setEnabled(true); + scanButton->setHidden(false); + progress->setHidden(true); + descLabel->setText(tr("System Installation has finished scanning your computer for disk drives.\n\nIf you've changed your computer's disk drive layout, choose Rescan Devices to run another scan.")); + + /* Copy our disk information into the wizard's global object */ + horizonWizard()->disks.swap(*disks); + delete disks; + + scanDone = true; + emit completeChanged(); + wizard()->next(); +} +#endif diff --git a/ui/qt5/partitionpage.hh b/ui/qt5/partitionpage.hh new file mode 100644 index 0000000..ab9ad79 --- /dev/null +++ b/ui/qt5/partitionpage.hh @@ -0,0 +1,45 @@ +/* + * partitionpage.hh - Definition of the UI.Partition page: + * either UI.Partition.Runtime.DiskDetails, or UI.Partition.Install.Details + * 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 PARTITIONPAGE_HH +#define PARTITIONPAGE_HH + +#ifdef HAS_INSTALL_ENV +# include <QLabel> +# include <QProgressBar> +# include <QPushButton> +# include "partitionprobe.hh" +#endif /* HAS_INSTALL_ENV */ + + +#include "horizonwizardpage.hh" + +class PartitionPage : public HorizonWizardPage { +public: + PartitionPage(QWidget *parent = nullptr); + void initializePage(); + bool isComplete() const override; +private: +#ifdef HAS_INSTALL_ENV + void scanDisks(); + void processDisks(void *disks); + bool scanDone; + + QProgressBar *progress; + QLabel *descLabel; + QPushButton *scanButton; + PartitionProbeThread *thread; +#endif /* HAS_INSTALL_ENV */ +}; + +#endif /* !PARTITIONPAGE_HH */ diff --git a/ui/qt5/partitionprobe.cc b/ui/qt5/partitionprobe.cc new file mode 100644 index 0000000..32a45ab --- /dev/null +++ b/ui/qt5/partitionprobe.cc @@ -0,0 +1,19 @@ +/* + * partitionprobe.cc - Implementation of the disk probing thread routines + * 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 + */ + +#include "partitionprobe.hh" + +void PartitionProbeThread::run() { + vector<Disk> *disks = new vector<Disk>{myMan.find_disks(true, true, false)}; + sleep(3); + emit foundDisks(disks); +} diff --git a/ui/qt5/partitionprobe.hh b/ui/qt5/partitionprobe.hh new file mode 100644 index 0000000..f718907 --- /dev/null +++ b/ui/qt5/partitionprobe.hh @@ -0,0 +1,32 @@ +/* + * partitionprobe.hh - Definition of the disk probing thread routines + * 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 PARTITIONPROBE_HH +#define PARTITIONPROBE_HH + +#include <QThread> +#include <diskman/diskman.hh> + +using std::vector; +using Horizon::DiskMan::Disk; + +class PartitionProbeThread : public QThread { + Q_OBJECT +public: + void run() override; +signals: + void foundDisks(void *disks); +private: + Horizon::DiskMan::DiskMan myMan; +}; + +#endif /* !PARTITIONPROBE_HH */ diff --git a/ui/qt5/resources/disk-low.png b/ui/qt5/resources/disk-low.png Binary files differnew file mode 100644 index 0000000..845ca7f --- /dev/null +++ b/ui/qt5/resources/disk-low.png |