/* * networkingpage.cc - Implementation of the UI.Network.AddressType page * 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 "networkingpage.hh" #include "horizonwizard.hh" #include "netdhcppage.hh" #ifdef HAS_INSTALL_ENV # include #endif /* HAS_INSTALL_ENV */ #include #include NetworkingPage::NetworkingPage(QWidget *parent) : HorizonWizardPage(parent) { loadWatermark("network"); setTitle(tr("Networking Setup")); radioGroup = new QButtonGroup(this); simple = new QRadioButton(tr("&Automatic - my computer connects to the Internet directly\n" "or via a modem/router.")); simple->setWhatsThis(tr("This option will configure your network automatically using DHCP.")); advanced = new QRadioButton(tr("&Manual - my computer connects to an enterprise network,\n" "or I use a static IP address.")); advanced->setWhatsThis(tr("This option will prompt you for your network information.")); skip = new QRadioButton(tr("&Skip - I don't want to connect to a network or the Internet.")); skip->setWhatsThis(tr("This option disables networking on this computer. You can configure your computer's networking after installation.")); } void NetworkingPage::initializePage() { QLabel *descLabel; QVBoxLayout *layout; #ifdef HAS_INSTALL_ENV if(horizonWizard()->interfaces.empty()) { descLabel = new QLabel(tr( "No supported network interfaces have been detected on your computer.\n\n" "You will not be able to connect to a network nor the Internet.\n\n" "If you have a network interface attached to your computer, it may not be supported by Adélie Linux. Please contact our community at https://help.adelielinux.org/ for help.")); } else #endif /* HAS_INSTALL_ENV */ { descLabel = new QLabel(tr( "If your computer is directly connected to the Internet via Ethernet or Wi-Fi using a modem or router, choose Automatic.\n\n" "If you need to set a static IP address, or you use a proxy server, choose Manual.\n\n" "If you don't want to configure networking or you don't want to use this computer on the Internet, choose Skip.")); } descLabel->setWordWrap(true); #ifdef HAS_INSTALL_ENV /* The interface list will be empty if we're in a Runtime Environment. */ if(!horizonWizard()->interfaces.empty()) #endif /* HAS_INSTALL_ENV */ { radioGroup->addButton(simple); radioGroup->addButton(advanced); } radioGroup->addButton(skip); QObject::connect(radioGroup, QOverload::of(&QButtonGroup::buttonClicked), [=](QAbstractButton *button) { if(button == skip) { horizonWizard()->network = false; } else { horizonWizard()->network = true; if(button == simple) { horizonWizard()->net_dhcp = true; } else { horizonWizard()->net_dhcp = false; } } emit completeChanged(); }); layout = new QVBoxLayout; layout->addWidget(descLabel); layout->addSpacing(50); layout->addStretch(); #ifdef HAS_INSTALL_ENV /* The interface list will be empty if we're in a Runtime Environment. */ if(!horizonWizard()->interfaces.empty()) #endif /* HAS_INSTALL_ENV */ { layout->addWidget(simple); layout->addStretch(); layout->addWidget(advanced); layout->addStretch(); } layout->addWidget(skip); #ifdef HAS_INSTALL_ENV /* REQ: UI.Network.AddressType.MaybeNotDisable * * If we are running in an Installation Environment, we know we require * networking if /packages doesn't exist, because this is a live-only * media. If we are running in a Runtime Environment, we always require * networking because we set the mirror as distfiles.adelielinux.org. * * This may change in the future, when we have mirror selection * implemented; we may have a way to do "local" mirrors. */ if(!QDir("/packages").exists()) #endif /* HAS_INSTALL_ENV */ { QLabel *warnIcon = new QLabel; warnIcon->setPixmap(QIcon::fromTheme("dialog-warning").pixmap(QSize(16, 16))); warnIcon->setMaximumSize(QSize(16, 16)); QLabel *warnLabel = new QLabel(tr("Networking cannot be skipped because a network connection is required to install packages.")); warnLabel->setWordWrap(true); QHBoxLayout *warnLayout = new QHBoxLayout; warnLayout->addSpacing(32); warnLayout->addWidget(warnIcon); warnLayout->addWidget(warnLabel); layout->addLayout(warnLayout); skip->setEnabled(false); } setLayout(layout); } bool NetworkingPage::isComplete() const { return (radioGroup->checkedButton() != nullptr); } int NetworkingPage::nextId() const { if(radioGroup->checkedButton() == simple) { if(horizonWizard()->interfaces.size() != 1) { return HorizonWizard::Page_Network_Iface; } else { horizonWizard()->chosen_auto_iface = (horizonWizard()->interfaces.begin())->first; if((horizonWizard()->interfaces.begin())->second.type == HorizonWizard::Wireless) { return HorizonWizard::Page_Network_Wireless; } else { return HorizonWizard::Page_Network_DHCP; } } } else if(radioGroup->checkedButton() == advanced) { return HorizonWizard::Page_Network_Manual; } else { /* REQ: UI.Network.AddressType.Skip */ return HorizonWizard::Page_DateTime; } } bool NetworkingPage::validatePage() { #ifdef HAS_INSTALL_ENV /* What a hack! * * Independent Pages means the DHCP page is never cleaned, even when Back * is chosen. So, we have to do it from here. Note that it isn't enough * to do it from NetworkIfacePage, because if only we have one interface, * that page will never be shown! * REF: adelie/horizon#354 */ horizonWizard()->removePage(HorizonWizard::Page_Network_DHCP); horizonWizard()->setPage(HorizonWizard::Page_Network_DHCP, new NetDHCPPage); #endif /* HAS_INSTALL_ENV */ return true; }