Merge pull request #6620 from Cacodemon345/cassette-record-play-indicators

Play/record indicators for cassette
This commit is contained in:
Miran Grča
2025-12-26 18:43:26 +01:00
committed by GitHub
4 changed files with 50 additions and 8 deletions

View File

@@ -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);
}

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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);