diff options
| author | Georg Gadinger <nilsding@nilsding.org> | 2021-05-07 21:38:32 +0200 |
|---|---|---|
| committer | Georg Gadinger <nilsding@nilsding.org> | 2021-11-26 21:01:41 +0100 |
| commit | 596e820fa0e8bca3c53a00481c34ac6f047160ee (patch) | |
| tree | 78c89b0ca934753fdb11525f7c7cdc25f6aa2424 | |
| parent | c960103a5850b6c1a9c9f75dcbee078a757a6f07 (diff) | |
| download | qmmp-596e820fa0e8bca3c53a00481c34ac6f047160ee.tar.gz qmmp-596e820fa0e8bca3c53a00481c34ac6f047160ee.tar.bz2 qmmp-596e820fa0e8bca3c53a00481c34ac6f047160ee.zip | |
skinned: make windowshaded playlist view use bitmap font, add … letter
| -rw-r--r-- | src/plugins/Ui/skinned/playlisttitlebar.cpp | 77 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/playlisttitlebar.h | 2 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/skin.cpp | 3 |
3 files changed, 69 insertions, 13 deletions
diff --git a/src/plugins/Ui/skinned/playlisttitlebar.cpp b/src/plugins/Ui/skinned/playlisttitlebar.cpp index e69adb3cd..d9ada09b8 100644 --- a/src/plugins/Ui/skinned/playlisttitlebar.cpp +++ b/src/plugins/Ui/skinned/playlisttitlebar.cpp @@ -29,7 +29,7 @@ #include "playlisttitlebar.h" #include "skin.h" -#define TITLE_FORMAT "%p%if(%p&%t, - ,)%t%if(%p,,%if(%t,,%f))%if(%l, %(%l%),)" +#define TITLE_FORMAT "%p%if(%p&%t, - ,)%t%if(%p,,%if(%t,,%f))" // TODO {shademode, updateskin} -> do we have the shaded cursor PlayListTitleBar::PlayListTitleBar(QWidget *parent) @@ -61,6 +61,7 @@ PlayListTitleBar::PlayListTitleBar(QWidget *parent) m_pl->resize (settings.value ("Skinned/pl_size", QSize (m_ratio*275, m_ratio*116)).toSize()); if (settings.value ("Skinned/pl_shaded", false).toBool()) shade(); + m_bitmap = settings.value("Skinned/bitmap_font", false).toBool(); resize(m_pl->width(),height()); m_align = true; setCursor(m_skin->getCursor(Skin::CUR_PTBAR)); @@ -85,6 +86,28 @@ void PlayListTitleBar::updatePositions() m_shade2->move(m_ratio*255+sx*25,m_ratio*3); } +inline void drawBitmapText(int x, int y, const QString &text, QPainter *paint, Skin *skin) +{ + QString lowertext = text.toLower(); + int chwidth, ypix; + { + QPixmap samplechar = skin->getLetter('a'); + chwidth = samplechar.width(); + ypix = y - samplechar.height(); + } + for (int i = 0; i < lowertext.size(); i++) + { + QPixmap pixchar = skin->getLetter(lowertext[i]); + paint->drawPixmap(x, ypix, pixchar); + x += chwidth; + } +} + +inline int bitmapTextWidth(const QString &text, Skin *skin) +{ + return skin->getLetter('a').width() * text.length(); +} + void PlayListTitleBar::updatePixmap() { int sx = ((m_shaded ? m_pl->width() : width())-275*m_ratio)/25; @@ -132,15 +155,38 @@ void PlayListTitleBar::updatePixmap() } if (m_shaded) { - QColor col; - col.setNamedColor(QString(m_skin->getPLValue("normalbg"))); - paint.setBrush(QBrush(col)); - paint.setPen(col); - paint.drawRect(8*m_ratio, m_ratio, 235*m_ratio + sx*25, 11*m_ratio); - //draw text - paint.setFont(m_font); - paint.setPen(QString(m_skin->getPLValue("normal"))); - paint.drawText(9*m_ratio, 11*m_ratio, m_truncatedText); + bool useBitmapFont = m_bitmap && (m_text.toLatin1() == m_text.toLocal8Bit()); //use bitmap font if possible + if (useBitmapFont) + { + int durationTextWidth = bitmapTextWidth(m_durationText, m_skin) + 1; // +1 to ensure a space in front of it + int maxChars = (width() - durationTextWidth - 35 * m_ratio) / m_skin->getLetter('a').width(); + QString truncatedText = m_text; + if (truncatedText.length() > maxChars) + { + maxChars -= 2; // keep space for a " …" + int lastSpace = truncatedText.lastIndexOf(' ', maxChars); + if (lastSpace != -1) + { + truncatedText = truncatedText.left(lastSpace) + " …"; + } + } + + drawBitmapText(5 * m_ratio, 10 * m_ratio, truncatedText, &paint, m_skin); + drawBitmapText(width() - durationTextWidth - 30 * m_ratio, 10 * m_ratio, m_durationText, &paint, m_skin); + } + else + { + QColor col; + col.setNamedColor(QString(m_skin->getPLValue("normalbg"))); + paint.setBrush(QBrush(col)); + paint.setPen(col); + paint.drawRect(8*m_ratio, m_ratio, 235*m_ratio + sx*25, 11*m_ratio); + //draw text + paint.setFont(m_font); + paint.setPen(QString(m_skin->getPLValue("normal"))); + paint.drawText(9*m_ratio, 11*m_ratio, m_truncatedText); + paint.drawText(width() - m_durationWidth - 30 * m_ratio, 11*m_ratio, m_durationText); + } } paint.end(); setPixmap(pixmap); @@ -149,7 +195,7 @@ void PlayListTitleBar::updatePixmap() void PlayListTitleBar::resizeEvent(QResizeEvent *) { QFontMetrics metrics(m_font); - m_truncatedText = metrics.elidedText (m_text, Qt::ElideRight, width() - 35*m_ratio); + m_truncatedText = metrics.elidedText (m_text, Qt::ElideRight, width() - m_durationWidth - 40*m_ratio); updatePositions(); updatePixmap(); } @@ -226,6 +272,7 @@ void PlayListTitleBar::readSettings() QSettings settings (Qmmp::configFile(), QSettings::IniFormat); m_font.fromString(settings.value("Skinned/pl_font", QApplication::font().toString()).toString()); m_font.setPixelSize(12 * m_ratio); + m_bitmap = settings.value("Skinned/bitmap_font", false).toBool(); } void PlayListTitleBar::updateSkin() @@ -275,14 +322,20 @@ void PlayListTitleBar::mouseDoubleClickEvent (QMouseEvent *) void PlayListTitleBar::showCurrent() { m_text.clear(); + m_durationText.clear(); + m_durationWidth = 0; if (m_model) { PlayListTrack* track = m_model->currentTrack(); if (track) + { + m_durationText = track->formattedLength(); m_text = QString("%1. %2").arg(track->trackIndex() + 1).arg(m_formatter.format(track)); + } } QFontMetrics metrics(m_font); - m_truncatedText = metrics.elidedText (m_text, Qt::ElideRight, width() - 35*m_ratio); + m_durationWidth = metrics.horizontalAdvance(m_durationText) + 3*m_ratio; + m_truncatedText = metrics.elidedText (m_text, Qt::ElideRight, width() - m_durationWidth - 40*m_ratio); updatePixmap(); } diff --git a/src/plugins/Ui/skinned/playlisttitlebar.h b/src/plugins/Ui/skinned/playlisttitlebar.h index 71d285560..628104141 100644 --- a/src/plugins/Ui/skinned/playlisttitlebar.h +++ b/src/plugins/Ui/skinned/playlisttitlebar.h @@ -63,10 +63,12 @@ private: Button *m_shade2 = nullptr; bool m_shaded = false; bool m_align = false, m_resize = false; + bool m_bitmap = false; int m_ratio; int m_height; PlayListModel* m_model = nullptr; QString m_text; + QString m_durationText; QString m_truncatedText; QFont m_font; MetaDataFormatter m_formatter; diff --git a/src/plugins/Ui/skinned/skin.cpp b/src/plugins/Ui/skinned/skin.cpp index 208351dea..f1b6f8b79 100644 --- a/src/plugins/Ui/skinned/skin.cpp +++ b/src/plugins/Ui/skinned/skin.cpp @@ -763,6 +763,8 @@ void Skin::loadLetters(void) /* special characters */ m_letters.insert('"', letters[0][27]); m_letters.insert('@', letters[0][28]); + m_letters.insert(0x2026, letters[1][10]); + m_letters.insert('.', letters[1][11]); m_letters.insert(':', letters[1][12]); m_letters.insert('(', letters[1][13]); m_letters.insert(')', letters[1][14]); @@ -779,7 +781,6 @@ void Skin::loadLetters(void) m_letters.insert('^', letters[1][24]); m_letters.insert('&', letters[1][25]); m_letters.insert('%', letters[1][26]); - m_letters.insert('.', letters[1][11]); m_letters.insert(',', letters[1][27]); m_letters.insert('=', letters[1][28]); m_letters.insert('$', letters[1][29]); |
