refactored machinestatus to update the qstatusbar

This commit is contained in:
Joakim L. Gilje
2021-11-30 22:06:41 +01:00
parent a6f8e6b68e
commit cee1c93d49
5 changed files with 89 additions and 98 deletions

View File

@@ -1,5 +1,4 @@
#include "qt_machinestatus.hpp" #include "qt_machinestatus.hpp"
#include "ui_qt_machinestatus.h"
extern "C" { extern "C" {
#define EMU_CPU_H // superhack - don't want timer.h to include cpu.h here, and some combo is preventing a compile #define EMU_CPU_H // superhack - don't want timer.h to include cpu.h here, and some combo is preventing a compile
@@ -28,6 +27,7 @@ extern uint64_t tsc;
#include <QPicture> #include <QPicture>
#include <QLabel> #include <QLabel>
#include <QTimer> #include <QTimer>
#include <QStatusBar>
namespace { namespace {
struct PixmapSetActive { struct PixmapSetActive {
@@ -62,29 +62,35 @@ namespace {
}; };
struct StateActive { struct StateActive {
QLabel label; std::unique_ptr<QLabel> label;
QTimer timer; QTimer timer;
PixmapSetActive* pixmaps = nullptr; PixmapSetActive* pixmaps = nullptr;
bool active = false; bool active = false;
void setActive(bool b) { void setActive(bool b) {
active = b; active = b;
label.setPixmap(active ? pixmaps->active : pixmaps->normal); if (! label) {
return;
}
label->setPixmap(active ? pixmaps->active : pixmaps->normal);
timer.start(75); timer.start(75);
} }
}; };
struct StateEmpty { struct StateEmpty {
QLabel label; std::unique_ptr<QLabel> label;
PixmapSetEmpty* pixmaps = nullptr; PixmapSetEmpty* pixmaps = nullptr;
bool empty = false; bool empty = false;
void setEmpty(bool e) { void setEmpty(bool e) {
empty = e; empty = e;
label.setPixmap(empty ? pixmaps->empty : pixmaps->normal); if (! label) {
return;
}
label->setPixmap(empty ? pixmaps->empty : pixmaps->normal);
} }
}; };
struct StateEmptyActive { struct StateEmptyActive {
QLabel label; std::unique_ptr<QLabel> label;
QTimer timer; QTimer timer;
PixmapSetEmptyActive* pixmaps = nullptr; PixmapSetEmptyActive* pixmaps = nullptr;
bool empty = false; bool empty = false;
@@ -100,15 +106,18 @@ namespace {
refresh(); refresh();
} }
void refresh() { void refresh() {
if (! label) {
return;
}
if (empty) { if (empty) {
label.setPixmap(active ? pixmaps->empty_active : pixmaps->empty); label->setPixmap(active ? pixmaps->empty_active : pixmaps->empty);
} else { } else {
label.setPixmap(active ? pixmaps->active : pixmaps->normal); label->setPixmap(active ? pixmaps->active : pixmaps->normal);
} }
} }
}; };
static const QSize pixmap_size(32, 32); static const QSize pixmap_size(16, 16);
static const QString pixmap_empty = QStringLiteral("_empty"); static const QString pixmap_empty = QStringLiteral("_empty");
static const QString pixmap_active = QStringLiteral("_active"); static const QString pixmap_active = QStringLiteral("_active");
static const QString pixmap_empty_active = QStringLiteral("_empty_active"); static const QString pixmap_empty_active = QStringLiteral("_empty_active");
@@ -174,7 +183,6 @@ struct MachineStatus::States {
QObject::connect(&h.timer, &QTimer::timeout, parent, [&]{ h.setActive(false); }); QObject::connect(&h.timer, &QTimer::timeout, parent, [&]{ h.setActive(false); });
} }
net.pixmaps = &pixmaps.net; net.pixmaps = &pixmaps.net;
sound.setPixmap(pixmaps.sound);
} }
std::array<StateEmpty, 2> cartridge; std::array<StateEmpty, 2> cartridge;
@@ -185,21 +193,16 @@ struct MachineStatus::States {
std::array<StateEmptyActive, MO_NUM> mo; std::array<StateEmptyActive, MO_NUM> mo;
std::array<StateActive, HDD_BUS_USB> hdds; std::array<StateActive, HDD_BUS_USB> hdds;
StateActive net; StateActive net;
QLabel sound; std::unique_ptr<QLabel> sound;
}; };
MachineStatus::MachineStatus(QWidget *parent) : MachineStatus::MachineStatus(QObject *parent) :
QWidget(parent), QObject(parent)
ui(new Ui::MachineStatus)
{ {
ui->setupUi(this);
d = std::make_unique<MachineStatus::States>(this); d = std::make_unique<MachineStatus::States>(this);
} }
MachineStatus::~MachineStatus() MachineStatus::~MachineStatus() = default;
{
delete ui;
}
static int hdd_count(int bus) { static int hdd_count(int bus) {
int c = 0; int c = 0;
@@ -214,7 +217,7 @@ static int hdd_count(int bus) {
return(c); return(c);
} }
void MachineStatus::refresh() { void MachineStatus::refresh(QStatusBar* sbar) {
bool has_cart = machines[machine].flags & MACHINE_CARTRIDGE; bool has_cart = machines[machine].flags & MACHINE_CARTRIDGE;
bool has_mfm = machines[machine].flags & MACHINE_MFM; bool has_mfm = machines[machine].flags & MACHINE_MFM;
bool has_xta = machines[machine].flags & MACHINE_XTA; bool has_xta = machines[machine].flags & MACHINE_XTA;
@@ -229,26 +232,45 @@ void MachineStatus::refresh() {
int c_scsi = hdd_count(HDD_BUS_SCSI); int c_scsi = hdd_count(HDD_BUS_SCSI);
int do_net = (network_type == NET_TYPE_NONE) || (network_card == 0); int do_net = (network_type == NET_TYPE_NONE) || (network_card == 0);
while (ui->statusIcons->count() > 0) { sbar->removeWidget(d->cassette.label.get());
auto item = ui->statusIcons->itemAt(0); for (int i = 0; i < 2; ++i) {
ui->statusIcons->removeItem(item); sbar->removeWidget(d->cartridge[i].label.get());
delete item;
} }
for (size_t i = 0; i < FDD_NUM; ++i) {
sbar->removeWidget(d->fdd[i].label.get());
}
for (size_t i = 0; i < CDROM_NUM; i++) {
sbar->removeWidget(d->cdrom[i].label.get());
}
for (size_t i = 0; i < ZIP_NUM; i++) {
sbar->removeWidget(d->zip[i].label.get());
}
for (size_t i = 0; i < MO_NUM; i++) {
sbar->removeWidget(d->mo[i].label.get());
}
for (size_t i = 0; i < HDD_BUS_USB; i++) {
sbar->removeWidget(d->hdds[i].label.get());
}
sbar->removeWidget(d->net.label.get());
sbar->removeWidget(d->sound.get());
if (cassette_enable) { if (cassette_enable) {
d->cassette.label = std::make_unique<QLabel>();
d->cassette.setEmpty(QString(cassette_fname).isEmpty()); d->cassette.setEmpty(QString(cassette_fname).isEmpty());
ui->statusIcons->addWidget(&d->cassette.label); sbar->addWidget(d->cassette.label.get());
} }
if (has_cart) { if (has_cart) {
for (int i = 0; i < 2; ++i) { for (int i = 0; i < 2; ++i) {
d->cartridge[i].label = std::make_unique<QLabel>();
d->cartridge[i].setEmpty(QString(cart_fns[i]).isEmpty()); d->cartridge[i].setEmpty(QString(cart_fns[i]).isEmpty());
ui->statusIcons->addWidget(&d->cartridge[i].label); sbar->addWidget(d->cartridge[i].label.get());
} }
} }
for (size_t i = 0; i < FDD_NUM; ++i) { for (size_t i = 0; i < FDD_NUM; ++i) {
if (fdd_get_type(i) != 0) { if (fdd_get_type(i) != 0) {
d->fdd[i].label = std::make_unique<QLabel>();
int t = fdd_get_type(i); int t = fdd_get_type(i);
if (t == 0) { if (t == 0) {
d->fdd[i].pixmaps = &d->pixmaps.floppy_disabled; d->fdd[i].pixmaps = &d->pixmaps.floppy_disabled;
@@ -259,7 +281,7 @@ void MachineStatus::refresh() {
} }
d->fdd[i].setEmpty(QString(floppyfns[i]).isEmpty()); d->fdd[i].setEmpty(QString(floppyfns[i]).isEmpty());
d->fdd[i].setActive(false); d->fdd[i].setActive(false);
ui->statusIcons->addWidget(&d->fdd[i].label); sbar->addWidget(d->fdd[i].label.get());
} }
} }
@@ -274,9 +296,10 @@ void MachineStatus::refresh() {
(scsi_card_current[2] == 0) && (scsi_card_current[3] == 0)) (scsi_card_current[2] == 0) && (scsi_card_current[3] == 0))
continue; continue;
if (cdrom[i].bus_type != 0) { if (cdrom[i].bus_type != 0) {
d->cdrom[i].label = std::make_unique<QLabel>();
d->cdrom[i].setEmpty(cdrom[i].host_drive != 200 || QString(cdrom[i].image_path).isEmpty()); d->cdrom[i].setEmpty(cdrom[i].host_drive != 200 || QString(cdrom[i].image_path).isEmpty());
d->cdrom[i].setActive(false); d->cdrom[i].setActive(false);
ui->statusIcons->addWidget(&d->cdrom[i].label); sbar->addWidget(d->cdrom[i].label.get());
} }
} }
for (size_t i = 0; i < ZIP_NUM; i++) { for (size_t i = 0; i < ZIP_NUM; i++) {
@@ -289,9 +312,10 @@ void MachineStatus::refresh() {
(scsi_card_current[2] == 0) && (scsi_card_current[3] == 0)) (scsi_card_current[2] == 0) && (scsi_card_current[3] == 0))
continue; continue;
if (zip_drives[i].bus_type != 0) { if (zip_drives[i].bus_type != 0) {
d->zip[i].label = std::make_unique<QLabel>();
d->zip[i].setEmpty(QString(zip_drives[i].image_path).isEmpty()); d->zip[i].setEmpty(QString(zip_drives[i].image_path).isEmpty());
d->zip[i].setActive(false); d->zip[i].setActive(false);
ui->statusIcons->addWidget(&d->zip[i].label); sbar->addWidget(d->zip[i].label.get());
} }
} }
for (size_t i = 0; i < MO_NUM; i++) { for (size_t i = 0; i < MO_NUM; i++) {
@@ -304,40 +328,48 @@ void MachineStatus::refresh() {
(scsi_card_current[2] == 0) && (scsi_card_current[3] == 0)) (scsi_card_current[2] == 0) && (scsi_card_current[3] == 0))
continue; continue;
if (mo_drives[i].bus_type != 0) { if (mo_drives[i].bus_type != 0) {
d->mo[i].label = std::make_unique<QLabel>();
d->mo[i].setEmpty(QString(mo_drives[i].image_path).isEmpty()); d->mo[i].setEmpty(QString(mo_drives[i].image_path).isEmpty());
d->mo[i].setActive(false); d->mo[i].setActive(false);
ui->statusIcons->addWidget(&d->mo[i].label); sbar->addWidget(d->mo[i].label.get());
} }
} }
if ((has_mfm || hdc_name == QStringLiteral("st506")) && c_mfm > 0) { if ((has_mfm || hdc_name == QStringLiteral("st506")) && c_mfm > 0) {
d->hdds[HDD_BUS_MFM].label = std::make_unique<QLabel>();
d->hdds[HDD_BUS_MFM].setActive(false); d->hdds[HDD_BUS_MFM].setActive(false);
ui->statusIcons->addWidget(&d->hdds[HDD_BUS_MFM].label); sbar->addWidget(d->hdds[HDD_BUS_MFM].label.get());
} }
if ((has_esdi || hdc_name == QStringLiteral("esdi")) && c_esdi > 0) { if ((has_esdi || hdc_name == QStringLiteral("esdi")) && c_esdi > 0) {
d->hdds[HDD_BUS_ESDI].label = std::make_unique<QLabel>();
d->hdds[HDD_BUS_ESDI].setActive(false); d->hdds[HDD_BUS_ESDI].setActive(false);
ui->statusIcons->addWidget(&d->hdds[HDD_BUS_ESDI].label); sbar->addWidget(d->hdds[HDD_BUS_ESDI].label.get());
} }
if ((has_xta || hdc_name == QStringLiteral("xta")) && c_xta > 0) { if ((has_xta || hdc_name == QStringLiteral("xta")) && c_xta > 0) {
d->hdds[HDD_BUS_XTA].label = std::make_unique<QLabel>();
d->hdds[HDD_BUS_XTA].setActive(false); d->hdds[HDD_BUS_XTA].setActive(false);
ui->statusIcons->addWidget(&d->hdds[HDD_BUS_XTA].label); sbar->addWidget(d->hdds[HDD_BUS_XTA].label.get());
} }
if ((has_ide || hdc_name == QStringLiteral("xtide") || hdc_name == QStringLiteral("ide")) && c_ide > 0) { if ((has_ide || hdc_name == QStringLiteral("xtide") || hdc_name == QStringLiteral("ide")) && c_ide > 0) {
d->hdds[HDD_BUS_IDE].label = std::make_unique<QLabel>();
d->hdds[HDD_BUS_IDE].setActive(false); d->hdds[HDD_BUS_IDE].setActive(false);
ui->statusIcons->addWidget(&d->hdds[HDD_BUS_IDE].label); sbar->addWidget(d->hdds[HDD_BUS_IDE].label.get());
} }
if ((has_scsi || (scsi_card_current[0] != 0) || (scsi_card_current[1] != 0) || if ((has_scsi || (scsi_card_current[0] != 0) || (scsi_card_current[1] != 0) ||
(scsi_card_current[2] != 0) || (scsi_card_current[3] != 0)) && c_scsi > 0) { (scsi_card_current[2] != 0) || (scsi_card_current[3] != 0)) && c_scsi > 0) {
d->hdds[HDD_BUS_SCSI].label = std::make_unique<QLabel>();
d->hdds[HDD_BUS_SCSI].setActive(false); d->hdds[HDD_BUS_SCSI].setActive(false);
ui->statusIcons->addWidget(&d->hdds[HDD_BUS_SCSI].label); sbar->addWidget(d->hdds[HDD_BUS_SCSI].label.get());
} }
if (do_net) { if (do_net) {
d->net.label = std::make_unique<QLabel>();
d->net.setActive(false); d->net.setActive(false);
ui->statusIcons->addWidget(&d->net.label); sbar->addWidget(d->net.label.get());
} }
ui->statusIcons->addWidget(&d->sound); d->sound = std::make_unique<QLabel>();
ui->statusIcons->addItem(new QSpacerItem(20, 40, QSizePolicy::Expanding, QSizePolicy::Minimum)); d->sound->setPixmap(d->pixmaps.sound);
sbar->addWidget(d->sound.get());
} }
void MachineStatus::setActivity(int tag, bool active) { void MachineStatus::setActivity(int tag, bool active) {

View File

@@ -3,28 +3,22 @@
#include <QWidget> #include <QWidget>
class QLabel; class QStatusBar;
namespace Ui { class MachineStatus : public QObject
class MachineStatus;
}
class MachineStatus : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit MachineStatus(QWidget *parent = nullptr); explicit MachineStatus(QObject *parent = nullptr);
~MachineStatus(); ~MachineStatus();
public slots: public slots:
void refresh(); void refresh(QStatusBar* sbar);
void setActivity(int tag, bool active); void setActivity(int tag, bool active);
void setEmpty(int tag, bool active); void setEmpty(int tag, bool active);
private: private:
Ui::MachineStatus *ui;
struct States; struct States;
std::unique_ptr<States> d; std::unique_ptr<States> d;
}; };

View File

@@ -1,44 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MachineStatus</class>
<widget class="QWidget" name="MachineStatus">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="statusIcons"/>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@@ -1,7 +1,5 @@
#include "qt_mainwindow.hpp" #include "qt_mainwindow.hpp"
#include "ui_qt_machinestatus.h"
#include "ui_qt_mainwindow.h" #include "ui_qt_mainwindow.h"
#include <qevent.h>
extern "C" { extern "C" {
#include <86box/86box.h> #include <86box/86box.h>
@@ -24,6 +22,7 @@ extern "C" {
#include "qt_settings.hpp" #include "qt_settings.hpp"
#include "qt_gleswidget.hpp" #include "qt_gleswidget.hpp"
#include "qt_machinestatus.hpp"
#ifdef __unix__ #ifdef __unix__
#include <X11/Xlib.h> #include <X11/Xlib.h>
@@ -39,6 +38,7 @@ MainWindow::MainWindow(QWidget *parent) :
ui(new Ui::MainWindow) ui(new Ui::MainWindow)
{ {
Q_INIT_RESOURCE(qt_resources); Q_INIT_RESOURCE(qt_resources);
status = std::make_unique<MachineStatus>(this);
ui->setupUi(this); ui->setupUi(this);
video_setblit(qt_blit); video_setblit(qt_blit);
@@ -66,9 +66,15 @@ MainWindow::MainWindow(QWidget *parent) :
config_save(); config_save();
}); });
// connect(this, &MainWindow::updateStatusBarPanes, ui->machineStatus, &MachineStatus::refresh); connect(this, &MainWindow::updateStatusBarPanes, this, [this] {
// connect(this, &MainWindow::updateStatusBarActivity, ui->machineStatus, &MachineStatus::setActivity); status->refresh(ui->statusbar);
// connect(this, &MainWindow::updateStatusBarEmpty, ui->machineStatus, &MachineStatus::setEmpty); });
connect(this, &MainWindow::updateStatusBarActivity, this, [this](int i, bool b) {
status->setActivity(i, b);
});
connect(this, &MainWindow::updateStatusBarEmpty, this, [this](int i, bool b) {
status->setEmpty(i, b);
});
ui->actionKeyboard_requires_capture->setChecked(kbd_req_capture); ui->actionKeyboard_requires_capture->setChecked(kbd_req_capture);
ui->actionRight_CTRL_is_left_ALT->setChecked(rctrl_is_lalt); ui->actionRight_CTRL_is_left_ALT->setChecked(rctrl_is_lalt);

View File

@@ -3,12 +3,14 @@
#include <QMainWindow> #include <QMainWindow>
#include <QLabel> #include <QLabel>
#include <qevent.h> #include <QEvent>
namespace Ui { namespace Ui {
class MainWindow; class MainWindow;
} }
class MachineStatus;
class MainWindow : public QMainWindow class MainWindow : public QMainWindow
{ {
Q_OBJECT Q_OBJECT
@@ -48,6 +50,7 @@ protected:
void keyReleaseEvent(QKeyEvent* event) override; void keyReleaseEvent(QKeyEvent* event) override;
private: private:
Ui::MainWindow *ui; Ui::MainWindow *ui;
std::unique_ptr<MachineStatus> status;
}; };
#endif // QT_MAINWINDOW_HPP #endif // QT_MAINWINDOW_HPP