Browse Source

fix: logarithmic waveform scale + visible idle color + duration display

- Waveform bars: linear→logarithmic (dB mapping -60..0dB)
- Colors: idle gray visible (130 alpha), played blue, unplayed dim blue
- Min bar height: 1→2px
- Duration: fallback to MsgVoiceDurationRole when not playing (was 0:00/0:00)
- Debug log: wfN, width, first value, dB, barH
topo_upd
Evgeny 2 months ago
parent
commit
5593bfdc0c
  1. 18
      tools/chatgui/src/messagedelegate.cpp

18
tools/chatgui/src/messagedelegate.cpp

@ -622,6 +622,10 @@ void MessageDelegate::paint(QPainter *painter, const QStyleOptionViewItem &optio
/* compute elapsed/frac for progress */ /* compute elapsed/frac for progress */
float elapsed = 0, frac = 0, durSec = st.durationSec; float elapsed = 0, frac = 0, durSec = st.durationSec;
if (durSec <= 0) {
QString ds = index.data(MsgVoiceDurationRole).toString();
ds.remove('s'); durSec = ds.toFloat();
}
if (isPaused) { if (isPaused) {
elapsed = st.pausedPosSec; elapsed = st.pausedPosSec;
} else if (isPlaying) { } else if (isPlaying) {
@ -662,16 +666,24 @@ void MessageDelegate::paint(QPainter *painter, const QStyleOptionViewItem &optio
QRect wfR = L.voiceWaveformRect; QRect wfR = L.voiceWaveformRect;
if (wfN > 0) { if (wfN > 0) {
float barW = (float)wfR.width() / wfN; float barW = (float)wfR.width() / wfN;
int ph = wfR.height() - 3; /* leave 3px for progress bar at bottom */ int ph = wfR.height() - 3;
for (int i = 0; i < wfN; i++) { for (int i = 0; i < wfN; i++) {
float v = wf[i].toFloat(); float v = wf[i].toFloat();
int barH = 1 + (int)(v * (ph - 1)); float db = v > 0.00001f ? 20.0f * log10f(v) : -100.0f;
float logV = (db + 60.0f) / 60.0f;
if (logV < 0) logV = 0; if (logV > 1) logV = 1;
int barH = 2 + (int)(logV * (ph - 2));
int x = wfR.left() + (int)(i * barW); int x = wfR.left() + (int)(i * barW);
int y = wfR.top() + ph - barH; int y = wfR.top() + ph - barH;
int bw = qMax(2, (int)(barW * 0.8f)); int bw = qMax(2, (int)(barW * 0.8f));
bool before = wfN > 0 && (float)i / wfN <= frac; bool before = wfN > 0 && (float)i / wfN <= frac;
painter->setBrush(before ? QColor(0x33, 0x90, 0xEC) : QColor(0x33, 0x90, 0xEC, 45)); QColor played(0x33, 0x90, 0xEC);
QColor unplayed(0x33, 0x90, 0xEC, 80);
QColor idle(0x70, 0x70, 0x78, 130);
painter->setBrush((isPlaying || isPaused) ? (before ? played : unplayed) : idle);
painter->drawRect(QRect(x, y, bw, barH)); painter->drawRect(QRect(x, y, bw, barH));
if (i == 0) GUI_DEBUG("voice paint: wfN=%d wfW=%d v=%.3f dB=%.1f logV=%.2f barH=%d",
wfN, wfR.width(), v, db, logV, barH);
} }
} }

Loading…
Cancel
Save