Write-protected indicator (part 1)

This commit is contained in:
Cacodemon345
2025-07-21 01:20:54 +06:00
parent 174e92dad9
commit 6b2e58d3b4
12 changed files with 98 additions and 8 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@@ -12,6 +12,8 @@ getIndicatorIcon(IconIndicator indicator)
return QIcon(":/settings/qt/icons/write_active.ico");
case Disabled:
return QIcon(":/settings/qt/icons/disabled.ico");
case WriteProtected:
return QIcon(":/settings/qt/icons/write_protected.ico");
default:
return QIcon();
}
@@ -26,11 +28,11 @@ getIconWithIndicator(const QIcon &icon, const QSize &size, QIcon::Mode iconMode,
return iconPixmap;
auto painter = QPainter(&iconPixmap);
auto indicatorPixmap = getIndicatorIcon(indicator == ReadWriteActive ? Active : indicator).pixmap(size);
auto indicatorPixmap = getIndicatorIcon((indicator == ReadWriteActive || indicator == WriteProtectedActive) ? Active : indicator).pixmap(size);
painter.drawPixmap(0, 0, indicatorPixmap);
if (indicator == ReadWriteActive) {
auto writeIndicatorPixmap = getIndicatorIcon(WriteActive).pixmap(size);
if (indicator == ReadWriteActive || indicator == WriteProtectedActive) {
auto writeIndicatorPixmap = getIndicatorIcon(indicator == WriteProtectedActive ? WriteProtected : WriteActive).pixmap(size);
painter.drawPixmap(0, 0, writeIndicatorPixmap);
}
painter.end();

View File

@@ -10,6 +10,8 @@ enum IconIndicator {
WriteActive,
ReadWriteActive,
Disabled,
WriteProtected,
WriteProtectedActive,
};
QPixmap getIconWithIndicator(const QIcon &icon, const QSize &size, QIcon::Mode iconMode, IconIndicator indicator);

View File

@@ -91,6 +91,8 @@ struct PixmapSetEmptyActive {
QPixmap read_write_active;
QPixmap empty_write_active;
QPixmap empty_read_write_active;
QPixmap wp;
QPixmap wp_active;
void load(const QIcon &icon);
};
struct Pixmaps {
@@ -168,6 +170,7 @@ struct StateEmptyActive {
bool empty = false;
bool active = false;
bool write_active = false;
bool wp = false;
void setActive(bool b)
{
@@ -193,6 +196,14 @@ struct StateEmptyActive {
empty = b;
refresh();
}
void setWriteProtected(bool b)
{
if (!label || b == wp)
return;
wp = b;
refresh();
}
void refresh()
{
if (!label)
@@ -203,7 +214,9 @@ struct StateEmptyActive {
else
label->setPixmap(write_active ? pixmaps->empty_write_active : (active ? pixmaps->empty_active : pixmaps->empty));
} else {
if (active && write_active)
if (wp)
label->setPixmap(active ? pixmaps->wp_active : pixmaps->wp);
else if (active && write_active)
label->setPixmap(pixmaps->read_write_active);
else
label->setPixmap(write_active ? pixmaps->write_active : (active ? pixmaps->active : pixmaps->normal));
@@ -241,6 +254,8 @@ void
PixmapSetEmptyActive::load(const QIcon &icon)
{
normal = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, None);
wp = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, WriteProtected);
wp_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, WriteProtectedActive);
active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, Active);
write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, WriteActive);
read_write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, ReadWriteActive);
@@ -454,16 +469,23 @@ MachineStatus::refreshEmptyIcons()
if (!sbar_initialized)
return;
for (size_t i = 0; i < FDD_NUM; ++i)
for (size_t i = 0; i < FDD_NUM; ++i) {
d->fdd[i].setEmpty(machine_status.fdd[i].empty);
d->fdd[i].setWriteProtected(machine_status.fdd[i].write_prot);
}
for (size_t i = 0; i < CDROM_NUM; ++i)
d->cdrom[i].setEmpty(machine_status.cdrom[i].empty);
for (size_t i = 0; i < ZIP_NUM; i++)
for (size_t i = 0; i < ZIP_NUM; i++) {
d->zip[i].setEmpty(machine_status.zip[i].empty);
for (size_t i = 0; i < MO_NUM; i++)
d->zip[i].setWriteProtected(machine_status.zip[i].write_prot);
}
for (size_t i = 0; i < MO_NUM; i++) {
d->mo[i].setEmpty(machine_status.mo[i].empty);
d->mo[i].setWriteProtected(machine_status.mo[i].write_prot);
}
d->cassette.setEmpty(machine_status.cassette.empty);
d->cassette.setWriteProtected(machine_status.cassette.write_prot);
for (size_t i = 0; i < NET_CARD_MAX; i++)
d->net[i].setEmpty(machine_status.net[i].empty);
@@ -595,6 +617,7 @@ MachineStatus::refresh(QStatusBar *sbar)
if (cassette_enable) {
d->cassette.label = std::make_unique<ClickableLabel>();
d->cassette.setEmpty(QString(cassette_fname).isEmpty());
d->cassette.setWriteProtected(cassette_ui_writeprot);
d->cassette.refresh();
connect((ClickableLabel *) d->cassette.label.get(), &ClickableLabel::clicked, [](QPoint pos) {
MediaMenu::ptr->cassetteMenu->popup(pos - QPoint(0, MediaMenu::ptr->cassetteMenu->sizeHint().height()));
@@ -635,6 +658,7 @@ MachineStatus::refresh(QStatusBar *sbar)
}
d->fdd[i].label = std::make_unique<ClickableLabel>();
d->fdd[i].setEmpty(QString(floppyfns[i]).isEmpty());
d->fdd[i].setWriteProtected(ui_writeprot[i]);
d->fdd[i].setActive(false);
d->fdd[i].setWriteActive(false);
d->fdd[i].refresh();
@@ -669,6 +693,7 @@ MachineStatus::refresh(QStatusBar *sbar)
iterateZIP([this, sbar](int i) {
d->zip[i].label = std::make_unique<ClickableLabel>();
d->zip[i].setEmpty(QString(zip_drives[i].image_path).isEmpty());
d->zip[i].setWriteProtected(zip_drives[i].read_only);
d->zip[i].setActive(false);
d->zip[i].setWriteActive(false);
d->zip[i].refresh();
@@ -686,6 +711,7 @@ MachineStatus::refresh(QStatusBar *sbar)
iterateMO([this, sbar](int i) {
d->mo[i].label = std::make_unique<ClickableLabel>();
d->mo[i].setEmpty(QString(mo_drives[i].image_path).isEmpty());
d->mo[i].setWriteProtected(mo_drives[i].read_only);
d->mo[i].setActive(false);
d->mo[i].setWriteActive(false);
d->mo[i].refresh();

View File

@@ -282,6 +282,7 @@ MediaMenu::cassetteMount(const QString &filename, bool wp)
}
ui_sb_update_icon_state(SB_CASSETTE, filename.isEmpty() ? 1 : 0);
ui_sb_update_icon_wp(SB_CASSETTE, cassette_ui_writeprot);
mhm.addImageToHistory(0, ui::MediaType::Cassette, previous_image.filePath(), filename);
cassetteUpdateMenu();
ui_sb_update_tip(SB_CASSETTE);
@@ -446,6 +447,7 @@ MediaMenu::floppyMount(int i, const QString &filename, bool wp)
fdd_load(i, filenameBytes.data());
}
ui_sb_update_icon_state(SB_FLOPPY | i, filename.isEmpty() ? 1 : 0);
ui_sb_update_icon_wp(SB_FLOPPY | i, ui_writeprot[i]);
mhm.addImageToHistory(i, ui::MediaType::Floppy, previous_image.filePath(), filename);
floppyUpdateMenu(i);
ui_sb_update_tip(SB_FLOPPY | i);
@@ -822,6 +824,7 @@ MediaMenu::zipMount(int i, const QString &filename, bool wp)
mhm.addImageToHistory(i, ui::MediaType::Zip, zip_drives[i].prev_image_path, zip_drives[i].image_path);
ui_sb_update_icon_state(SB_ZIP | i, filename.isEmpty() ? 1 : 0);
ui_sb_update_icon_wp(SB_ZIP | i, wp);
zipUpdateMenu(i);
ui_sb_update_tip(SB_ZIP | i);
@@ -858,6 +861,7 @@ MediaMenu::zipReloadPrev(int i)
} else {
ui_sb_update_icon_state(SB_ZIP | i, 0);
}
ui_sb_update_icon_wp(SB_ZIP | i, zip_drives[i].read_only);
zipUpdateMenu(i);
ui_sb_update_tip(SB_ZIP | i);
@@ -869,7 +873,7 @@ void
MediaMenu::zipReload(int index, int slot)
{
const QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Zip);
zipMount(index, filename, false);
zipMount(index, filename, zip_drives[index].read_only);
zipUpdateMenu(index);
ui_sb_update_tip(SB_ZIP | index);
}
@@ -995,6 +999,7 @@ MediaMenu::moReloadPrev(int i)
} else {
ui_sb_update_icon_state(SB_MO | i, 0);
}
ui_sb_update_icon_state(SB_MO | i, mo_drives[i].read_only);
moUpdateMenu(i);
ui_sb_update_tip(SB_MO | i);

View File

@@ -262,6 +262,34 @@ ui_sb_set_ready(int ready)
}
}
void
ui_sb_update_icon_wp(int tag, int state)
{
const auto temp = static_cast<unsigned int>(tag);
const int category = static_cast<int>(temp & 0xfffffff0);
const int item = tag & 0xf;
switch (category) {
default:
break;
case SB_CASSETTE:
machine_status.cassette.write_prot = state > 0 ? true : false;
break;
case SB_FLOPPY:
machine_status.fdd[item].write_prot = state > 0 ? true : false;
break;
case SB_ZIP:
machine_status.zip[item].write_prot = state > 0 ? true : false;
break;
case SB_MO:
machine_status.mo[item].write_prot = state > 0 ? true : false;
break;
}
if (main_window != nullptr)
main_window->updateStatusEmptyIcons();
}
void
ui_sb_update_icon_state(int tag, int state)
{