network: allow to set a NIC's link from the status bar
This commit is contained in:
@@ -220,7 +220,9 @@ struct MachineStatus::States {
|
||||
for (auto& h : hdds) {
|
||||
h.pixmaps = &pixmaps.hd;
|
||||
}
|
||||
net.pixmaps = &pixmaps.net;
|
||||
for (auto& n : net) {
|
||||
n.pixmaps = &pixmaps.net;
|
||||
}
|
||||
}
|
||||
|
||||
std::array<StateEmpty, 2> cartridge;
|
||||
@@ -230,7 +232,7 @@ struct MachineStatus::States {
|
||||
std::array<StateEmptyActive, ZIP_NUM> zip;
|
||||
std::array<StateEmptyActive, MO_NUM> mo;
|
||||
std::array<StateActive, HDD_BUS_USB> hdds;
|
||||
StateActive net;
|
||||
std::array<StateActive, NET_CARD_MAX> net;
|
||||
std::unique_ptr<ClickableLabel> sound;
|
||||
std::unique_ptr<QLabel> text;
|
||||
};
|
||||
@@ -320,6 +322,14 @@ void MachineStatus::iterateMO(const std::function<void (int)> &cb) {
|
||||
}
|
||||
}
|
||||
|
||||
void MachineStatus::iterateNIC(const std::function<void (int)> &cb) {
|
||||
for (int i = 0; i < NET_CARD_MAX; i++) {
|
||||
if (network_dev_available(i)) {
|
||||
cb(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int hdd_count(int bus) {
|
||||
int c = 0;
|
||||
int i;
|
||||
@@ -357,7 +367,9 @@ void MachineStatus::refreshIcons() {
|
||||
d->hdds[i].setActive(machine_status.hdd[i].active);
|
||||
}
|
||||
|
||||
d->net.setActive(machine_status.net.active);
|
||||
for (size_t i = 0; i < NET_CARD_MAX; i++) {
|
||||
d->net[i].setActive(machine_status.net[i].active);
|
||||
}
|
||||
|
||||
for (int i = 0; i < 2; ++i) {
|
||||
d->cartridge[i].setEmpty(machine_status.cartridge[i].empty);
|
||||
@@ -375,7 +387,6 @@ void MachineStatus::refresh(QStatusBar* sbar) {
|
||||
int c_xta = hdd_count(HDD_BUS_XTA);
|
||||
int c_ide = hdd_count(HDD_BUS_IDE);
|
||||
int c_scsi = hdd_count(HDD_BUS_SCSI);
|
||||
int do_net = network_available();
|
||||
|
||||
sbar->removeWidget(d->cassette.label.get());
|
||||
for (int i = 0; i < 2; ++i) {
|
||||
@@ -396,7 +407,9 @@ void MachineStatus::refresh(QStatusBar* sbar) {
|
||||
for (size_t i = 0; i < HDD_BUS_USB; i++) {
|
||||
sbar->removeWidget(d->hdds[i].label.get());
|
||||
}
|
||||
sbar->removeWidget(d->net.label.get());
|
||||
for (size_t i = 0; i < NET_CARD_MAX; i++) {
|
||||
sbar->removeWidget(d->net[i].label.get());
|
||||
}
|
||||
sbar->removeWidget(d->sound.get());
|
||||
|
||||
if (cassette_enable) {
|
||||
@@ -503,6 +516,17 @@ void MachineStatus::refresh(QStatusBar* sbar) {
|
||||
sbar->addWidget(d->mo[i].label.get());
|
||||
});
|
||||
|
||||
iterateNIC([this, sbar](int i) {
|
||||
d->net[i].label = std::make_unique<ClickableLabel>();
|
||||
d->net[i].setActive(false);
|
||||
d->net[i].refresh();
|
||||
d->net[i].label->setToolTip(MediaMenu::ptr->netMenus[i]->title());
|
||||
connect((ClickableLabel*)d->net[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
|
||||
MediaMenu::ptr->netMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->netMenus[i]->sizeHint().height()));
|
||||
});
|
||||
sbar->addWidget(d->net[i].label.get());
|
||||
});
|
||||
|
||||
auto hdc_name = QString(hdc_get_internal_name(hdc_current));
|
||||
if ((has_mfm || hdc_name.left(5) == QStringLiteral("st506")) && c_mfm > 0) {
|
||||
d->hdds[HDD_BUS_MFM].label = std::make_unique<QLabel>();
|
||||
@@ -541,13 +565,6 @@ void MachineStatus::refresh(QStatusBar* sbar) {
|
||||
sbar->addWidget(d->hdds[HDD_BUS_SCSI].label.get());
|
||||
}
|
||||
|
||||
if (do_net) {
|
||||
d->net.label = std::make_unique<QLabel>();
|
||||
d->net.setActive(false);
|
||||
d->net.refresh();
|
||||
d->net.label->setToolTip(tr("Network"));
|
||||
sbar->addWidget(d->net.label.get());
|
||||
}
|
||||
d->sound = std::make_unique<ClickableLabel>();
|
||||
d->sound->setPixmap(d->pixmaps.sound);
|
||||
|
||||
|
||||
@@ -66,6 +66,7 @@ public:
|
||||
static void iterateCDROM(const std::function<void(int i)>& cb);
|
||||
static void iterateZIP(const std::function<void(int i)>& cb);
|
||||
static void iterateMO(const std::function<void(int i)>& cb);
|
||||
static void iterateNIC(const std::function<void(int i)>& cb);
|
||||
|
||||
QString getMessage();
|
||||
public slots:
|
||||
|
||||
@@ -44,10 +44,14 @@ extern "C" {
|
||||
#include <86box/mo.h>
|
||||
#include <86box/sound.h>
|
||||
#include <86box/ui.h>
|
||||
#include <86box/thread.h>
|
||||
#include <86box/network.h>
|
||||
|
||||
};
|
||||
|
||||
#include "qt_newfloppydialog.hpp"
|
||||
#include "qt_util.hpp"
|
||||
#include "qt_deviceconfig.hpp"
|
||||
|
||||
std::shared_ptr<MediaMenu> MediaMenu::ptr;
|
||||
|
||||
@@ -156,6 +160,16 @@ void MediaMenu::refresh(QMenu *parentMenu) {
|
||||
moMenus[i] = menu;
|
||||
moUpdateMenu(i);
|
||||
});
|
||||
|
||||
netMenus.clear();
|
||||
MachineStatus::iterateNIC([this, parentMenu](int i) {
|
||||
auto *menu = parentMenu->addMenu("");
|
||||
netDisconnPos = menu->children().count();
|
||||
auto *action = menu->addAction(tr("&Disconnected"), [i] { network_connect(i, !network_is_connected(i)); config_save(); });
|
||||
action->setCheckable(true);
|
||||
netMenus[i] = menu;
|
||||
nicUpdateMenu(i);
|
||||
});
|
||||
}
|
||||
|
||||
void MediaMenu::cassetteNewImage() {
|
||||
@@ -662,6 +676,30 @@ void MediaMenu::moUpdateMenu(int i) {
|
||||
menu->setTitle(QString::asprintf(tr("MO %i (%ls): %ls").toUtf8().constData(), i + 1, busName.toStdU16String().data(), name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data()));
|
||||
}
|
||||
|
||||
void MediaMenu::nicUpdateMenu(int i) {
|
||||
if (!netMenus.contains(i))
|
||||
return;
|
||||
|
||||
QString netType = tr("None");
|
||||
switch (net_cards_conf[i].net_type) {
|
||||
case NET_TYPE_SLIRP:
|
||||
netType = "SLiRP";
|
||||
break;
|
||||
case NET_TYPE_PCAP:
|
||||
netType = "PCAP";
|
||||
break;
|
||||
}
|
||||
|
||||
QString devName = DeviceConfig::DeviceName(network_card_getdevice(net_cards_conf[i].device_num), network_card_get_internal_name(net_cards_conf[i].device_num), 1);
|
||||
|
||||
auto *menu = netMenus[i];
|
||||
auto childs = menu->children();
|
||||
auto *connectedAction = dynamic_cast<QAction*>(childs[netDisconnPos]);
|
||||
connectedAction->setChecked(!network_is_connected(i));
|
||||
|
||||
menu->setTitle(QString::asprintf(tr("NIC %02i (%ls) %ls").toUtf8().constData(), i + 1, netType.toStdU16String().data(), devName.toStdU16String().data()));
|
||||
}
|
||||
|
||||
QString MediaMenu::getMediaOpenDirectory() {
|
||||
QString openDirectory;
|
||||
if (open_dir_usr_path > 0) {
|
||||
|
||||
@@ -56,6 +56,8 @@ public:
|
||||
void moEject(int i);
|
||||
void moReload(int i);
|
||||
void moUpdateMenu(int i);
|
||||
|
||||
void nicUpdateMenu(int i);
|
||||
private:
|
||||
QWidget* parentWidget = nullptr;
|
||||
|
||||
@@ -65,6 +67,7 @@ private:
|
||||
QMap<int, QMenu*> cdromMenus;
|
||||
QMap<int, QMenu*> zipMenus;
|
||||
QMap<int, QMenu*> moMenus;
|
||||
QMap<int, QMenu*> netMenus;
|
||||
|
||||
QString getMediaOpenDirectory();
|
||||
|
||||
@@ -89,5 +92,7 @@ private:
|
||||
int moEjectPos;
|
||||
int moReloadPos;
|
||||
|
||||
int netDisconnPos;
|
||||
|
||||
friend class MachineStatus;
|
||||
};
|
||||
|
||||
@@ -50,6 +50,8 @@ extern "C" {
|
||||
#include <86box/zip.h>
|
||||
#include <86box/mo.h>
|
||||
#include <86box/hdd.h>
|
||||
#include <86box/thread.h>
|
||||
#include <86box/network.h>
|
||||
#include <86box/machine_status.h>
|
||||
|
||||
void
|
||||
@@ -246,7 +248,7 @@ ui_sb_update_icon(int tag, int active) {
|
||||
machine_status.hdd[item].active = active > 0 ? true : false;
|
||||
break;
|
||||
case SB_NETWORK:
|
||||
machine_status.net.active = active > 0 ? true : false;
|
||||
machine_status.net[item].active = active > 0 ? true : false;
|
||||
break;
|
||||
case SB_SOUND:
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user