diff --git a/CMakeLists.txt b/CMakeLists.txt index ea9f0f7..7d52b8b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,8 +20,6 @@ set(PROJECT_SOURCES mainwindow.h qefientryview.cpp qefientryview.h - qefientryrebootview.cpp - qefientryrebootview.h qefientry.cpp qefientry.h qefientrystaticlist.cpp diff --git a/mainwindow.cpp b/mainwindow.cpp index bd439cb..376d615 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -7,26 +7,14 @@ MainWindow::MainWindow(QWidget *parent) this->setWindowTitle(QStringLiteral("EFI Entry Manager")); this->resize(800, 600); - // Create tabs - m_tab = new QTabWidget(this); - // Create a class for each page amd keep a ref to update - m_entryView = new QEFIEntryView(m_tab); - m_rebootView = new QEFIEntryRebootView(m_tab); - - m_tab->insertTab(0, m_entryView, QStringLiteral("Boot Order")); - m_tab->insertTab(1, m_rebootView, QStringLiteral("Reboot with")); + m_entryView = new QEFIEntryView(this); - this->setCentralWidget(m_tab); + this->setCentralWidget(m_entryView); } MainWindow::~MainWindow() { - if (m_tab != nullptr) delete m_tab; - m_tab = nullptr; - - // Ownership has been passed to tab - m_entryView = nullptr; - m_rebootView = nullptr; + if (m_entryView != nullptr) delete m_entryView; } diff --git a/mainwindow.h b/mainwindow.h index 75f4051..8382de3 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -3,18 +3,14 @@ #include -#include #include -#include "qefientryrebootview.h" #include "qefientryview.h" class MainWindow : public QMainWindow { Q_OBJECT - QTabWidget *m_tab; - QEFIEntryRebootView *m_rebootView; QEFIEntryView *m_entryView; public: MainWindow(QWidget *parent = nullptr); diff --git a/qefientryrebootview.cpp b/qefientryrebootview.cpp deleted file mode 100644 index 54abe27..0000000 --- a/qefientryrebootview.cpp +++ /dev/null @@ -1,102 +0,0 @@ -#include "qefientryrebootview.h" - -#include -#include -#include - -QEFIEntryRebootView::QEFIEntryRebootView(QWidget *parent) - : QWidget(parent) -{ - // TODO: Add list view and buttons - m_topLevelLayout = new QBoxLayout(QBoxLayout::LeftToRight, this); - - m_entries = new QListWidget(this); - m_entryItems = QEFIEntryStaticList::instance()->entries(); - - // Keys are sorted in RBTree - m_entryIds = m_entryItems.keys(); - m_entries->clear(); - m_rebootItemIndex = -1; - for (int i = 0; i < m_entryIds.size(); i++) { - QEFIEntry &entry = m_entryItems[m_entryIds[i]]; - m_entries->addItem(QString::asprintf("[%04X] ", entry.id()) + entry.name() - + (entry.devicePath().size() > 0 ? "\n" + entry.devicePath() : "")); - } - QObject::connect(m_entries, &QListWidget::currentRowChanged, - this, &QEFIEntryRebootView::entryChanged); - m_topLevelLayout->addWidget(m_entries, 3); - - m_buttonLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); - m_topLevelLayout->addLayout(m_buttonLayout, 1); - - m_bootTimeoutLabel = new QLabel(QString::asprintf("Timeout: %d second(s)", - QEFIEntryStaticList::instance()->timeout()), this); - m_buttonLayout->addWidget(m_bootTimeoutLabel); - m_buttonLayout->addStretch(1); - m_rebootTargetButton = new QPushButton(QString::asprintf("Set reboot target"), this); - m_rebootTargetButton->setDisabled(true); - QObject::connect(m_rebootTargetButton, &QPushButton::clicked, - this, &QEFIEntryRebootView::rebootClicked); - m_buttonLayout->addWidget(m_rebootTargetButton, 0); - - this->setLayout(m_topLevelLayout); - // TODO: Add a dialog to ask whether the user wants to reboot now -} - -QEFIEntryRebootView::~QEFIEntryRebootView() -{ - // TODO: Use smart ptr - if (m_topLevelLayout != nullptr) { - delete m_topLevelLayout; - m_topLevelLayout = nullptr; - } - - if (m_entries != nullptr) delete m_entries; - m_entries = nullptr; - - if (m_rebootTargetButton != nullptr) delete m_rebootTargetButton; - m_rebootTargetButton = nullptr; - if (m_bootTimeoutLabel != nullptr) delete m_bootTimeoutLabel; - m_bootTimeoutLabel = nullptr; -} - -void QEFIEntryRebootView::entryChanged(int currentRow) -{ - qDebug() << "[EFIRebootView] Clicked: " << currentRow; - m_rebootItemIndex = currentRow; - if (m_rebootItemIndex >= m_entryIds.size() || m_rebootItemIndex < 0) { - m_rebootTargetButton->setDisabled(true); - } else { - m_rebootTargetButton->setDisabled(false); - } -} - -void QEFIEntryRebootView::rebootClicked(bool checked) -{ - Q_UNUSED(checked); - if (m_rebootItemIndex >= 0 || m_rebootItemIndex < m_entryIds.size()) { - qDebug() << "[EFIRebootView] Set " << m_entryIds[m_rebootItemIndex] << " " - << m_entryItems[m_entryIds[m_rebootItemIndex]].name() << " as reboot target"; - // Set BootNext - QEFIEntryStaticList::instance()->setBootNext(m_entryIds[m_rebootItemIndex]); - int ret = QMessageBox::warning(this, QStringLiteral("Reboot to ") + - m_entryItems[m_entryIds[m_rebootItemIndex]].name(), - QStringLiteral("Do you want to reboot now?"), - QMessageBox::Yes | QMessageBox::No, - QMessageBox::No); - if (ret == QMessageBox::Yes) { - // Reboot now - qDebug() << "[EFIRebootView] Reboot now"; - QProcess process; -#ifdef Q_OS_WIN - process.startDetached("shutdown", {"/r", "/t", "0"}); -#else - process.startDetached("reboot", {}); -#endif - } else { - // Do nothing - qDebug() << "[EFIRebootView] Reboot later"; - } - return; - } -} diff --git a/qefientryrebootview.h b/qefientryrebootview.h deleted file mode 100644 index 33ee32a..0000000 --- a/qefientryrebootview.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef QEFIENTRYREBOOTVIEW_H -#define QEFIENTRYREBOOTVIEW_H - -#include - -#include -#include -#include -#include - -#include -#include - -#include "qefientrystaticlist.h" - -class QEFIEntryRebootView: public QWidget -{ - Q_OBJECT - - QBoxLayout *m_topLevelLayout; - - QListWidget *m_entries; - - QBoxLayout *m_buttonLayout; - QPushButton *m_rebootTargetButton; - - QLabel *m_bootTimeoutLabel; - - QMap m_entryItems; - quint16 m_timeout; - - QList m_entryIds; - int m_rebootItemIndex; -public: - QEFIEntryRebootView(QWidget *parent = nullptr); - ~QEFIEntryRebootView(); - -public slots: - void entryChanged(int currentRow); - void rebootClicked(bool checked); -}; - -#endif // QEFIENTRYREBOOTVIEW_H diff --git a/qefientryview.cpp b/qefientryview.cpp index 0d87f9d..95a160c 100644 --- a/qefientryview.cpp +++ b/qefientryview.cpp @@ -3,6 +3,8 @@ #include "qefientrystaticlist.h" #include +#include +#include QEFIEntryView::QEFIEntryView(QWidget *parent) : QWidget(parent) @@ -36,20 +38,28 @@ QEFIEntryView::QEFIEntryView(QWidget *parent) m_moveUpEntryButton = new QPushButton(QStringLiteral("Move up"), this); m_moveDownEntryButton = new QPushButton(QStringLiteral("Move down"), this); m_setCurrentButton = new QPushButton(QStringLiteral("Make default"), this); + m_rebootTargetButton = new QPushButton(QStringLiteral("Set reboot"), this); + m_rebootTargetButton->setDisabled(true); m_buttonLayout->addWidget(m_moveUpEntryButton); m_buttonLayout->addWidget(m_moveDownEntryButton); m_buttonLayout->addWidget(m_setCurrentButton); + m_buttonLayout->addWidget(m_rebootTargetButton); QObject::connect(m_moveUpEntryButton, &QPushButton::clicked, this, &QEFIEntryView::moveUpClicked); QObject::connect(m_moveDownEntryButton, &QPushButton::clicked, this, &QEFIEntryView::moveDownClicked); QObject::connect(m_setCurrentButton, &QPushButton::clicked, this, &QEFIEntryView::setCurrentClicked); + QObject::connect(m_rebootTargetButton, &QPushButton::clicked, + this, &QEFIEntryView::rebootClicked); m_buttonLayout->addStretch(1); + m_bootTimeoutLabel = new QLabel(QString::asprintf("Timeout: %d second(s)", + QEFIEntryStaticList::instance()->timeout()), this); m_saveButton = new QPushButton(QStringLiteral("Save"), this); m_resetButton = new QPushButton(QStringLiteral("Reset"), this); + m_buttonLayout->addWidget(m_bootTimeoutLabel); m_buttonLayout->addWidget(m_saveButton); m_buttonLayout->addWidget(m_resetButton); QObject::connect(m_saveButton, &QPushButton::clicked, @@ -82,6 +92,8 @@ QEFIEntryView::~QEFIEntryView() if (m_setCurrentButton != nullptr) delete m_setCurrentButton; if (m_saveButton != nullptr) delete m_saveButton; if (m_resetButton != nullptr) delete m_resetButton; + if (m_rebootTargetButton != nullptr) delete m_rebootTargetButton; + if (m_bootTimeoutLabel != nullptr) delete m_bootTimeoutLabel; } void QEFIEntryView::entryChanged(int currentRow) @@ -160,6 +172,7 @@ void QEFIEntryView::updateButtonState() m_moveUpEntryButton->setDisabled(false); m_moveDownEntryButton->setDisabled(false); m_setCurrentButton->setDisabled(false); + m_rebootTargetButton->setDisabled(false); m_saveButton->setDisabled(false); m_resetButton->setDisabled(false); if (0 == m_selectedItemIndex) { @@ -172,6 +185,7 @@ void QEFIEntryView::updateButtonState() m_moveUpEntryButton->setDisabled(true); m_moveDownEntryButton->setDisabled(true); m_setCurrentButton->setDisabled(true); + m_rebootTargetButton->setDisabled(true); m_saveButton->setDisabled(false); m_resetButton->setDisabled(false); } @@ -184,3 +198,33 @@ void QEFIEntryView::resetFromStaticListClicked(bool checked) m_selectedItemIndex = -1; resetClicked(checked); } + +void QEFIEntryView::rebootClicked(bool checked) +{ + Q_UNUSED(checked); + if (m_rebootItemIndex >= 0 || m_rebootItemIndex < m_order.size()) { + qDebug() << "[EFIRebootView] Set " << m_order[m_rebootItemIndex] << " " + << m_entryItems[m_order[m_rebootItemIndex]].name() << " as reboot target"; + // Set BootNext + QEFIEntryStaticList::instance()->setBootNext(m_order[m_rebootItemIndex]); + int ret = QMessageBox::warning(this, QStringLiteral("Reboot to ") + + m_entryItems[m_order[m_rebootItemIndex]].name(), + QStringLiteral("Do you want to reboot now?"), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::No); + if (ret == QMessageBox::Yes) { + // Reboot now + qDebug() << "[EFIRebootView] Reboot now"; + QProcess process; +#ifdef Q_OS_WIN + process.startDetached("shutdown", {"/r", "/t", "0"}); +#else + process.startDetached("reboot", {}); +#endif + } else { + // Do nothing + qDebug() << "[EFIRebootView] Reboot later"; + } + return; + } +} diff --git a/qefientryview.h b/qefientryview.h index b365130..818111e 100644 --- a/qefientryview.h +++ b/qefientryview.h @@ -27,11 +27,15 @@ class QEFIEntryView: public QWidget QPushButton *m_setCurrentButton; QPushButton *m_saveButton; QPushButton *m_resetButton; + QPushButton *m_rebootTargetButton; + + QLabel *m_bootTimeoutLabel; QMap m_entryItems; QList m_order; int m_selectedItemIndex; + int m_rebootItemIndex; void updateButtonState(); public: @@ -45,6 +49,7 @@ public slots: void resetFromStaticListClicked(bool checked); void saveClicked(bool checked); void setCurrentClicked(bool checked); + void rebootClicked(bool checked); void moveUpClicked(bool checked); void moveDownClicked(bool checked);