summaryrefslogblamecommitdiff
path: root/ui/qt5/subnetbox.cc
blob: 54f17322a506b0de3eda6376004a81c815d716ea (plain) (tree)
































































                                                                              
/*
 * subnetbox.cc - Implementation of a widget for inputting an IPv4 subnet mask
 * 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 "subnetbox.hh"
#include "util/net.hh"

SubnetBox::SubnetBox(QWidget *parent) : QWidget(parent) {
    SubnetBox::layout = new QHBoxLayout(this);
    SubnetBox::subnet = new QLineEdit(this);
    SubnetBox::cidr   = new QSpinBox(this);

    this->setLayout(layout);

    layout->addWidget(subnet);
    layout->addWidget(cidr);
    layout->setMargin(0);

    subnet->setInputMask("000.000.000.000;_");
    cidr->setRange(1, 32);

    connect(subnet, &QLineEdit::textEdited, this, &SubnetBox::subnetEdited);
    connect(cidr, QOverload<int>::of(&QSpinBox::valueChanged),
            this, &SubnetBox::cidrEdited);
}

QString SubnetBox::subnetMask(void) const {
    return subnet->text();
}

int SubnetBox::subnetCIDR(void) const {
    return cidr->value();
}

void SubnetBox::subnetEdited(const QString &text) {
    int value = subnet_mask_to_cidr(text.toUtf8());
    if(value > 0) {
        cidr->setValue(value);
    }
}

void SubnetBox::cidrEdited(int value) {
    int bytes = value / 8, bits = value % 8, lastfilled = 0;
    QString data;
    char temp[4];

    for(int i = 0; i < bytes; i++) {
        data.append("255.");
    }
    for(int i = bits; i > 0; i--) {
        lastfilled |= (1 << (8 - i));
    }
    snprintf(temp, 4, "%d", lastfilled);
    data.append(temp);

    subnet->setText(data);
}