From d1bcf8421c9c2f967c8e5cf3fbcf75bb21e5ca0e Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 26 Dec 2025 23:01:29 +0600 Subject: [PATCH] Play/record indicators for cassette --- src/device/cassette.c | 13 ++++++++++--- src/qt/qt_iconindicators.cpp | 14 ++++++++++---- src/qt/qt_iconindicators.hpp | 4 +++- src/qt/qt_machinestatus.cpp | 27 +++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/device/cassette.c b/src/device/cassette.c index b2d8f7a1c..c64813999 100644 --- a/src/device/cassette.c +++ b/src/device/cassette.c @@ -500,7 +500,10 @@ pc_cas_set_motor(pc_cassette_t *cas, unsigned char val) else timer_disable(&cas->timer); - ui_sb_update_icon(SB_CASSETTE, !!val); + if (!cas->save) + ui_sb_update_icon(SB_CASSETTE, !!val); + else + ui_sb_update_icon_write(SB_CASSETTE, !!val); } unsigned char @@ -665,8 +668,12 @@ cassette_callback(void *priv) pc_cas_clock(cas, 8); - if (cas->motor) - ui_sb_update_icon(SB_CASSETTE, 1); + if (cas->motor) { + if (cas->pcm && cas->save) + ui_sb_update_icon_write(SB_CASSETTE, 1); + else + ui_sb_update_icon(SB_CASSETTE, 1); + } timer_advance_u64(&cas->timer, 8ULL * PITCONST); } diff --git a/src/qt/qt_iconindicators.cpp b/src/qt/qt_iconindicators.cpp index 22ae9e9a6..771a9ac59 100644 --- a/src/qt/qt_iconindicators.cpp +++ b/src/qt/qt_iconindicators.cpp @@ -14,6 +14,8 @@ getIndicatorIcon(IconIndicator indicator) return QIcon(":/settings/qt/icons/active.ico"); case WriteActive: return QIcon(":/settings/qt/icons/write_active.ico"); + case Record: + return QIcon(":/settings/qt/icons/record.ico"); case Disabled: return QIcon(":/settings/qt/icons/disabled.ico"); case WriteProtected: @@ -41,17 +43,21 @@ getIconWithIndicator(const QIcon &icon, const QSize &size, QIcon::Mode iconMode, auto painter = QPainter(&iconPixmap); auto indicatorPixmap = getIndicatorIcon((indicator == ReadWriteActive || indicator == WriteProtectedActive - || indicator == PlayActive || indicator == PauseActive)? Active : indicator) - .pixmap((indicator == Play || indicator == Pause) ? size / 2. : size); + || indicator == PlayActive || indicator == PauseActive) ? Active : + (indicator == RecordWriteActive) ? Record : indicator) + .pixmap((indicator == Play || indicator == Pause || indicator == Record || indicator == RecordWriteActive) ? size / 2. : size); if (indicator == WriteProtectedBrowse) indicatorPixmap = getIndicatorIcon(WriteProtected).pixmap(size); - painter.drawPixmap(0, (indicator == Play || indicator == Pause) ? (size.height() / 2) : 0, indicatorPixmap); + if (indicator == Record || indicator == RecordWriteActive) + painter.drawPixmap(size.width() / 2, size.height() / 2, indicatorPixmap); + else + painter.drawPixmap(0, (indicator == Play || indicator == Pause) ? (size.height() / 2) : 0, indicatorPixmap); if (indicator == PlayActive || indicator == PauseActive) { auto playPauseIndicatorPixmap = getIndicatorIcon(indicator == PlayActive ? Play : Pause).pixmap(size / 2.); painter.drawPixmap(0, size.height() / 2, playPauseIndicatorPixmap); - } else if ((indicator == ReadWriteActive) || (indicator == WriteProtectedActive)) { + } else if ((indicator == ReadWriteActive) || (indicator == WriteProtectedActive) || (indicator == RecordWriteActive)) { auto writeIndicatorPixmap = getIndicatorIcon(indicator == WriteProtectedActive ? WriteProtected : WriteActive).pixmap(size); painter.drawPixmap(0, 0, writeIndicatorPixmap); } else if (indicator == WriteProtectedBrowse) { diff --git a/src/qt/qt_iconindicators.hpp b/src/qt/qt_iconindicators.hpp index 7d1b4e041..971ab6ead 100644 --- a/src/qt/qt_iconindicators.hpp +++ b/src/qt/qt_iconindicators.hpp @@ -20,7 +20,9 @@ enum IconIndicator { Play, Pause, PlayActive, - PauseActive + PauseActive, + Record, + RecordWriteActive }; QPixmap getIconWithIndicator(const QIcon &icon, const QSize &size, QIcon::Mode iconMode, IconIndicator indicator); diff --git a/src/qt/qt_machinestatus.cpp b/src/qt/qt_machinestatus.cpp index bbcee95cc..9773c404d 100644 --- a/src/qt/qt_machinestatus.cpp +++ b/src/qt/qt_machinestatus.cpp @@ -83,6 +83,7 @@ struct PixmapSetEmpty { struct PixmapSetEmptyActive { QPixmap normal; QPixmap active; + QPixmap record; QPixmap play; QPixmap pause; QPixmap play_active; @@ -90,6 +91,7 @@ struct PixmapSetEmptyActive { QPixmap empty; QPixmap empty_active; QPixmap write_active; + QPixmap record_write_active; QPixmap read_write_active; QPixmap empty_write_active; QPixmap empty_read_write_active; @@ -175,6 +177,16 @@ struct StateEmptyActive { bool wp = false; bool play = false; bool pause = false; + bool record = false; + + void setRecord(bool b) + { + if (!label || b == record) + return; + + record = b; + refresh(); + } void setPlay(bool b) { @@ -240,6 +252,8 @@ struct StateEmptyActive { label->setPixmap(active ? pixmaps->wp_active : pixmaps->wp); else if (active && write_active && !wp) label->setPixmap(pixmaps->read_write_active); + else if (record && !active && !wp) + label->setPixmap(write_active ? pixmaps->record_write_active : pixmaps->record); else if ((play || pause) && !write_active) label->setPixmap(play ? (active ? pixmaps->play_active : pixmaps->play) : (active ? pixmaps->pause_active : pixmaps->pause)); else @@ -280,12 +294,14 @@ PixmapSetEmptyActive::load(const QIcon &icon) normal = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, None); play = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, Play); pause = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, Pause); + record = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, Record); play_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, PlayActive); pause_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, PauseActive); 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); + record_write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, RecordWriteActive); read_write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, ReadWriteActive); empty = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, None); empty_active = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, Active); @@ -525,10 +541,21 @@ MachineStatus::refreshEmptyIcons() void MachineStatus::refreshIcons() { + /* Always show record/play statuses of cassette even if icon updates are disabled, since it's important to indicate play/record modes. */ + if (cassette_enable) { + d->cassette.setRecord(!!cassette->save); + d->cassette.setPlay(!cassette->save); + } + /* Check if icons should show activity. */ if (!update_icons) return; + if (cassette_enable) { + d->cassette.setWriteActive(machine_status.cassette.write_active); + d->cassette.setActive(machine_status.cassette.active); + } + for (size_t i = 0; i < FDD_NUM; ++i) { d->fdd[i].setActive(machine_status.fdd[i].active); d->fdd[i].setWriteActive(machine_status.fdd[i].write_active);