aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorg Gadinger <nilsding@nilsding.org>2021-05-07 21:38:32 +0200
committerGeorg Gadinger <nilsding@nilsding.org>2021-11-26 21:01:41 +0100
commit596e820fa0e8bca3c53a00481c34ac6f047160ee (patch)
tree78c89b0ca934753fdb11525f7c7cdc25f6aa2424
parentc960103a5850b6c1a9c9f75dcbee078a757a6f07 (diff)
downloadqmmp-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.cpp77
-rw-r--r--src/plugins/Ui/skinned/playlisttitlebar.h2
-rw-r--r--src/plugins/Ui/skinned/skin.cpp3
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]);