diff options
| -rw-r--r-- | src/plugins/Ui/skinned/listwidget.cpp | 43 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/listwidget.h | 6 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/listwidgetdrawer.cpp | 57 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/listwidgetdrawer.h | 13 |
4 files changed, 66 insertions, 53 deletions
diff --git a/src/plugins/Ui/skinned/listwidget.cpp b/src/plugins/Ui/skinned/listwidget.cpp index 57d4209ca..3142be84e 100644 --- a/src/plugins/Ui/skinned/listwidget.cpp +++ b/src/plugins/Ui/skinned/listwidget.cpp @@ -44,7 +44,6 @@ ListWidget::ListWidget(QWidget *parent) m_update = false; m_skin = Skin::instance(); m_popupWidget = 0; - m_metrics = 0; m_drop_index = INVALID_INDEX; m_menu = new QMenu(this); m_scroll_direction = NONE; @@ -67,8 +66,6 @@ ListWidget::ListWidget(QWidget *parent) ListWidget::~ListWidget() { - if(m_metrics) - delete m_metrics; qDeleteAll(m_rows); m_rows.clear(); } @@ -77,18 +74,12 @@ void ListWidget::readSettings() { QSettings settings(Qmmp::configFile(), QSettings::IniFormat); settings.beginGroup("Skinned"); - m_font.fromString(settings.value("pl_font", QApplication::font().toString()).toString()); m_show_protocol = settings.value ("pl_show_protocol", false).toBool(); - m_show_number = settings.value ("pl_show_numbers", true).toBool(); - m_align_numbres = settings.value ("pl_align_numbers", false).toBool(); - m_show_anchor = settings.value("pl_show_anchor", false).toBool(); bool show_popup = settings.value("pl_show_popup", false).toBool(); if (m_update) { m_drawer.readSettings(); - delete m_metrics; - m_metrics = new QFontMetrics(m_font); m_row_count = height() / m_drawer.rowHeight(); updateList(PlayListModel::STRUCTURE); if(m_popupWidget) @@ -100,7 +91,6 @@ void ListWidget::readSettings() else { m_update = true; - m_metrics = new QFontMetrics(m_font); } if(show_popup) m_popupWidget = new PlayListPopup::PopupWidget(this); @@ -141,7 +131,6 @@ PlayListModel *ListWidget::model() void ListWidget::paintEvent(QPaintEvent *) { QPainter painter(this); - painter.setFont(m_font); m_drawer.fillBackground(&painter, width(), height()); #if QT_VERSION >= 0x040700 painter.setLayoutDirection(Qt::LayoutDirectionAuto); @@ -154,11 +143,11 @@ void ListWidget::paintEvent(QPaintEvent *) if(m_rows[i]->flags & ListWidgetRow::GROUP) { - m_drawer.drawSeparator(&painter, m_number_width, m_rows[i], rtl); + m_drawer.drawSeparator(&painter, m_rows[i], rtl); continue; } - m_drawer.drawTrack(&painter, m_number_width, m_rows[i], rtl); + m_drawer.drawTrack(&painter, m_rows[i], rtl); } //draw drop line if(m_drop_index != INVALID_INDEX) @@ -166,10 +155,7 @@ void ListWidget::paintEvent(QPaintEvent *) m_drawer.drawDropLine(&painter, m_drop_index - m_first, width()); } //draw line - if(m_number_width) - { - m_drawer.drawVerticalLine(&painter, m_number_width, m_rows.count(), width(), rtl); - } + m_drawer.drawVerticalLine(&painter, m_rows.count(), width(), rtl); } void ListWidget::mouseDoubleClickEvent (QMouseEvent *e) @@ -314,12 +300,7 @@ void ListWidget::updateList(int flags) emit positionChanged(m_first, m_model->count() - m_row_count); //song numbers width - if(m_show_number && m_align_numbres && m_model->count()) - { - m_number_width = m_metrics->width("9") * QString::number(m_model->trackCount()).size(); - } - else - m_number_width = 0; + m_drawer.calculateNumberWidth(m_model->count()); items = m_model->mid(m_first, m_row_count); @@ -347,7 +328,7 @@ void ListWidget::updateList(int flags) if(flags == PlayListModel::SELECTION) continue; - row->rect = QRect(5, i * m_drawer.rowHeight(), width() - 10, m_metrics->lineSpacing()); + row->rect = QRect(5, i * m_drawer.rowHeight(), width() - 10, m_drawer.rowHeight() - 1); row->title = items[i]->formattedTitle(); (m_first + i) == m_model->currentIndex() ? row->flags |= ListWidgetRow::CURRENT : @@ -358,8 +339,6 @@ void ListWidget::updateList(int flags) row->flags |= ListWidgetRow::GROUP; row->number = 0; row->length.clear(); - row->title = m_metrics->elidedText (row->title, Qt::ElideRight, - width() - m_number_width - 22 - 70); } else { @@ -375,17 +354,9 @@ void ListWidget::updateList(int flags) row->number = ++prev_number; } row->length = items[i]->formattedLength(); - if(m_show_number && !m_align_numbres) - row->title.prepend(QString("%1").arg(row->number)+". "); row->extraString = getExtraString(m_first + i); - //elide titles - int extra_string_width = row->extraString.isEmpty() ? 0 : m_metrics->width(row->extraString); - if(m_number_width) - extra_string_width += m_number_width + m_metrics->width("9"); - - row->title = m_metrics->elidedText (row->title, Qt::ElideRight, - width() - m_metrics->width(row->length) - 22 - extra_string_width); } + m_drawer.prepareRow(row); //elide titles } update(); } @@ -406,7 +377,7 @@ void ListWidget::autoscroll() } else if(m_scroll_direction == TOP && m_first > 0) { - m_first --; + m_first--; m_model->moveItems(m_pressed_index, m_first); m_pressed_index = m_first; } diff --git a/src/plugins/Ui/skinned/listwidget.h b/src/plugins/Ui/skinned/listwidget.h index 808762570..e87395fc3 100644 --- a/src/plugins/Ui/skinned/listwidget.h +++ b/src/plugins/Ui/skinned/listwidget.h @@ -112,8 +112,6 @@ private: QMenu *m_menu; PlayListModel *m_model; int m_row_count, m_first; - QFont m_font; - QFontMetrics *m_metrics; Skin *m_skin; int m_anchor_index; /*! @@ -123,10 +121,6 @@ private: int m_prev_y; bool m_select_on_release; bool m_show_protocol; - bool m_show_number; - bool m_show_anchor; - bool m_align_numbres; - int m_number_width; int m_drop_index; QList<ListWidgetRow *> m_rows; QmmpUiSettings *m_ui_settings; diff --git a/src/plugins/Ui/skinned/listwidgetdrawer.cpp b/src/plugins/Ui/skinned/listwidgetdrawer.cpp index 1e113b6eb..10f5034c6 100644 --- a/src/plugins/Ui/skinned/listwidgetdrawer.cpp +++ b/src/plugins/Ui/skinned/listwidgetdrawer.cpp @@ -29,7 +29,11 @@ ListWidgetDrawer::ListWidgetDrawer() { m_skin = Skin::instance(); m_update = false; + m_show_anchor = false; + m_show_number = false; + m_align_numbres = false; m_row_height = 0; + m_number_width = 0; readSettings(); loadColors(); } @@ -47,6 +51,8 @@ void ListWidgetDrawer::readSettings() QSettings settings(Qmmp::configFile(), QSettings::IniFormat); settings.beginGroup("Skinned"); m_show_anchor = settings.value("pl_show_anchor", false).toBool(); + m_show_number = settings.value ("pl_show_numbers", true).toBool(); + m_align_numbres = settings.value ("pl_align_numbers", false).toBool(); m_font.fromString(settings.value("pl_font", QApplication::font().toString()).toString()); m_extra_font = m_font; m_extra_font.setPointSize(m_font.pointSize() - 1); @@ -74,6 +80,38 @@ int ListWidgetDrawer::rowHeight() const return m_row_height; } +void ListWidgetDrawer::calculateNumberWidth(int count) +{ + //song numbers width + if(m_show_number && m_align_numbres && count) + { + m_number_width = m_metrics->width("9") * QString::number(count).size(); + } + else + m_number_width = 0; +} + +void ListWidgetDrawer::prepareRow(ListWidgetRow *row) +{ + if(row->flags & ListWidgetRow::GROUP) + { + row->title = m_metrics->elidedText (row->title, Qt::ElideRight, + row->rect.width() - m_number_width - 12 - 70); + return; + } + + if(m_show_number && !m_align_numbres) + row->title.prepend(QString("%1").arg(row->number)+". "); + + //elide titles + int extra_string_width = row->extraString.isEmpty() ? 0 : m_metrics->width(row->extraString); + if(m_number_width) + extra_string_width += m_number_width + m_metrics->width("9"); + + row->title = m_metrics->elidedText (row->title, Qt::ElideRight, + row->rect.width() - m_metrics->width(row->length) - 12 - extra_string_width); +} + void ListWidgetDrawer::fillBackground(QPainter *painter, int width, int height) { painter->setBrush(m_normal_bg); @@ -100,11 +138,12 @@ void ListWidgetDrawer::drawBackground(QPainter *painter, ListWidgetRow *row) painter->drawRect(row->rect); } -void ListWidgetDrawer::drawSeparator(QPainter *painter, int m_number_width, ListWidgetRow *row, bool rtl) +void ListWidgetDrawer::drawSeparator(QPainter *painter, ListWidgetRow *row, bool rtl) { int sx = row->rect.x() + 50; int sy = row->rect.y() + m_metrics->overlinePos() - 1; + painter->setFont(m_font); painter->setPen(m_normal); if(m_number_width) @@ -130,11 +169,12 @@ void ListWidgetDrawer::drawSeparator(QPainter *painter, int m_number_width, List } } -void ListWidgetDrawer::drawTrack(QPainter *painter, int m_number_width, ListWidgetRow *row, bool rtl) +void ListWidgetDrawer::drawTrack(QPainter *painter, ListWidgetRow *row, bool rtl) { int sx = 0; int sy = row->rect.y() + m_metrics->overlinePos() - 1; + painter->setFont(m_font); painter->setPen(row->flags & ListWidgetRow::CURRENT ? m_current : m_normal); if(m_number_width) @@ -188,10 +228,13 @@ void ListWidgetDrawer::drawDropLine(QPainter *painter, int row_number, int width width - 5 , row_number * m_row_height); } -void ListWidgetDrawer::drawVerticalLine(QPainter *painter, int m_number_width, int row_count, int width, bool rtl) +void ListWidgetDrawer::drawVerticalLine(QPainter *painter, int row_count, int width, bool rtl) { - painter->setPen(m_normal); - int sx = rtl ? width - 10 - m_number_width - m_metrics->width("9")/2 - 1 : - 10 + m_number_width + m_metrics->width("9")/2 - 1; - painter->drawLine(sx, 2, sx, row_count * (1 + m_metrics->lineSpacing()) - m_metrics->descent()); + if(m_number_width) + { + painter->setPen(m_normal); + int sx = rtl ? width - 10 - m_number_width - m_metrics->width("9")/2 - 1 : + 10 + m_number_width + m_metrics->width("9")/2 - 1; + painter->drawLine(sx, 2, sx, row_count * (1 + m_metrics->lineSpacing()) - m_metrics->descent()); + } } diff --git a/src/plugins/Ui/skinned/listwidgetdrawer.h b/src/plugins/Ui/skinned/listwidgetdrawer.h index 3b67f4227..efcb11d22 100644 --- a/src/plugins/Ui/skinned/listwidgetdrawer.h +++ b/src/plugins/Ui/skinned/listwidgetdrawer.h @@ -64,12 +64,14 @@ public: void readSettings(); void loadColors(); int rowHeight() const; + void calculateNumberWidth(int count); + void prepareRow(ListWidgetRow *row); void fillBackground(QPainter *painter, int width, int height); void drawBackground(QPainter *painter, ListWidgetRow *row); - void drawSeparator(QPainter *painter, int m_number_width, ListWidgetRow *row, bool rtl); - void drawTrack(QPainter *painter, int m_number_width, ListWidgetRow *row, bool rtl); + void drawSeparator(QPainter *painter, ListWidgetRow *row, bool rtl); + void drawTrack(QPainter *painter, ListWidgetRow *row, bool rtl); void drawDropLine(QPainter *painter, int row_number, int width); - void drawVerticalLine(QPainter *painter, int m_number_width, int row_count, int width, bool rtl); + void drawVerticalLine(QPainter *painter, int row_count, int width, bool rtl); private: QColor m_normal, m_current, m_normal_bg, m_selected_bg; @@ -77,8 +79,11 @@ private: QFontMetrics *m_metrics; QFontMetrics *m_extra_metrics; QFont m_font, m_extra_font; - bool m_show_anchor; bool m_update; + bool m_show_number; + bool m_show_anchor; + bool m_align_numbres; + int m_number_width; int m_row_height; }; |
