diff options
| -rw-r--r-- | src/plugins/Ui/skinned/listwidget.cpp | 2 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/listwidgetdrawer.cpp | 132 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/listwidgetdrawer.h | 20 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/playlistheader.cpp | 22 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/playlistheader.h | 1 |
5 files changed, 82 insertions, 95 deletions
diff --git a/src/plugins/Ui/skinned/listwidget.cpp b/src/plugins/Ui/skinned/listwidget.cpp index 74f6da5d7..4912258d3 100644 --- a/src/plugins/Ui/skinned/listwidget.cpp +++ b/src/plugins/Ui/skinned/listwidget.cpp @@ -186,8 +186,6 @@ void ListWidget::paintEvent(QPaintEvent *) { m_drawer.drawDropLine(&painter, m_drop_index - m_first, width()); } - //draw line - m_drawer.drawVerticalLine(&painter, m_rows.count(), width(), rtl); } void ListWidget::mouseDoubleClickEvent (QMouseEvent *e) diff --git a/src/plugins/Ui/skinned/listwidgetdrawer.cpp b/src/plugins/Ui/skinned/listwidgetdrawer.cpp index 0ab4ce884..a35807177 100644 --- a/src/plugins/Ui/skinned/listwidgetdrawer.cpp +++ b/src/plugins/Ui/skinned/listwidgetdrawer.cpp @@ -26,17 +26,19 @@ #include "skin.h" #include "listwidgetdrawer.h" -#define PADDING 3 +// |= number=|=row1=|=row2=|=extra= duration=| ListWidgetDrawer::ListWidgetDrawer() { m_skin = Skin::instance(); + m_column_manager = QmmpUiSettings::instance()->columnManager(); m_update = false; m_show_anchor = false; m_show_number = false; m_align_numbres = false; m_row_height = 0; m_number_width = 0; + m_padding = 0; readSettings(); loadColors(); } @@ -67,6 +69,7 @@ void ListWidgetDrawer::readSettings() m_update = true; m_metrics = new QFontMetrics(m_font); m_extra_metrics = new QFontMetrics(m_extra_font); + m_padding = m_metrics->width("9")/2; m_row_height = m_metrics->lineSpacing() + 1; } @@ -92,15 +95,18 @@ 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(m_number_width) + row->numberColumnWidth = m_number_width + 2 * m_padding; + else + row->numberColumnWidth = 0; + if(row->flags & ListWidgetRow::GROUP) { row->titles[0] = m_metrics->elidedText (row->titles[0], Qt::ElideRight, @@ -111,48 +117,39 @@ void ListWidgetDrawer::prepareRow(ListWidgetRow *row) if(m_show_number && !m_align_numbres) row->titles[0].prepend(QString("%1").arg(row->number)+". "); - row->x[ListWidgetRow::NUMBER] = row->x[ListWidgetRow::TITLE] = row->rect.left() + PADDING; + if(!row->length.isEmpty() || !row->extraString.isEmpty()) + row->lengthColumnWidth = m_padding; + else + row->lengthColumnWidth = 0; - if(m_number_width) - { - QString number = QString("%1").arg(row->number); + if(!row->length.isEmpty()) + row->lengthColumnWidth += m_metrics->width(row->length) + m_padding; - row->x[ListWidgetRow::NUMBER] += m_number_width - m_metrics->width(number); - row->x[ListWidgetRow::TITLE] += m_number_width + m_metrics->width("9"); - } + if(!row->extraString.isEmpty()) + row->lengthColumnWidth += m_extra_metrics->width(row->extraString) + m_padding; - row->x[ListWidgetRow::LENGTH] = row->rect.right() - m_metrics->width(row->length) - PADDING; - row->x[ListWidgetRow::EXTRA_STRING] = row->x[ListWidgetRow::LENGTH]; + //elide title + int visible_width = row->rect.width() - row->lengthColumnWidth - row->numberColumnWidth; - int extra_string_width = row->extraString.isEmpty() ? 0 : m_extra_metrics->width(row->extraString); - if(extra_string_width) + if(row->titles.count() == 1 && !row->lengthColumnWidth) { - extra_string_width += row->length.isEmpty() ? 0 : m_extra_metrics->width("9")/2; - row->x[ListWidgetRow::EXTRA_STRING] = row->x[ListWidgetRow::LENGTH] - extra_string_width; + row->titles[0] = m_metrics->elidedText (row->titles[0], Qt::ElideRight, visible_width - 2 * m_padding); + return; } - - //elide title - int visible_width = row->x[ListWidgetRow::EXTRA_STRING] - row->x[ListWidgetRow::TITLE] - - m_metrics->width("9"); - - if( row->titles.count() == 1) + else if(row->titles.count() == 1) { - row->titles[0] = m_metrics->elidedText (row->titles[0], Qt::ElideRight, visible_width); + row->titles[0] = m_metrics->elidedText (row->titles[0], Qt::ElideRight, visible_width - m_padding); return; } - int offset = 0; - for(int i = 0; i < row->titles.count(); ++i) + for(int i = 0; i < row->titles.count() && visible_width > 0; ++i) { - int width = qMin(QmmpUiSettings::instance()->columnManager()->size(i) - m_metrics->width(9), - visible_width - offset); + int width = qMin(QmmpUiSettings::instance()->columnManager()->size(i) - 2 * m_padding, + visible_width - 2 * m_padding); - if(width <= 0) - break; row->titles[i] = m_metrics->elidedText (row->titles[i], Qt::ElideRight, width); - offset += QmmpUiSettings::instance()->columnManager()->size(i); + visible_width -= QmmpUiSettings::instance()->columnManager()->size(i); } - //row->titles[0] = m_metrics->elidedText (row->titles[0], Qt::ElideRight, title_width); } void ListWidgetDrawer::fillBackground(QPainter *painter, int width, int height) @@ -209,60 +206,64 @@ void ListWidgetDrawer::drawSeparator(QPainter *painter, ListWidgetRow *row, bool painter->drawLine(sx - 45, sy, sx - 5, sy); painter->drawLine(sx + m_metrics->width(row->titles[0]) + 5, sy, row->rect.width(), sy); + if(row->numberColumnWidth) + { + painter->drawLine(row->rect.left() + row->numberColumnWidth, row->rect.top(), + row->rect.left() + row->numberColumnWidth, row->rect.bottom() + 1); + } } } void ListWidgetDrawer::drawTrack(QPainter *painter, ListWidgetRow *row) { int sy = row->rect.y() + m_metrics->overlinePos() - 1; + int sx = row->rect.x(); painter->setFont(m_font); - painter->setPen(row->flags & ListWidgetRow::CURRENT ? m_current : m_normal); - if(m_number_width) + //|= number=|=col1 =|=col2 =|=extra=duration=| + if(row->numberColumnWidth) { + sx += row->numberColumnWidth; + painter->setPen(row->flags & ListWidgetRow::CURRENT ? m_current : m_normal); QString number = QString("%1").arg(row->number); - painter->drawText(row->x[ListWidgetRow::NUMBER], sy, number); + painter->drawText(sx - m_padding - m_metrics->width(number), sy, number); + painter->setPen(m_normal); + painter->drawLine(sx, row->rect.top(), sx, row->rect.bottom() + 1); } - int offset = 0; for(int i = 0; i < QmmpUiSettings::instance()->columnManager()->count(); i++) { - if(row->x[ListWidgetRow::TITLE] + offset >= row->x[ListWidgetRow::EXTRA_STRING] - m_metrics->width("9")) + if(sx + m_padding >= row->rect.right() - row->lengthColumnWidth) break; - painter->drawText(row->x[ListWidgetRow::TITLE] + offset, sy, row->titles[i]); - offset += QmmpUiSettings::instance()->columnManager()->size(i); + painter->setPen(row->flags & ListWidgetRow::CURRENT ? m_current : m_normal); + painter->drawText(sx + m_padding, sy, row->titles[i]); + sx += QmmpUiSettings::instance()->columnManager()->size(i); + + if(m_column_manager->count() > 1 && sx < row->rect.right() - row->lengthColumnWidth) + { + painter->setPen(m_normal); + painter->drawLine(sx, row->rect.top(), sx, row->rect.bottom() + 1); + } } - QString extra_string = row->extraString; + sx = row->rect.right() - m_padding; + painter->setPen(row->flags & ListWidgetRow::CURRENT ? m_current : m_normal); - if(!extra_string.isEmpty()) + if(!row->length.isEmpty()) { - painter->setFont(m_extra_font); - painter->drawText(row->x[ListWidgetRow::EXTRA_STRING], sy, extra_string); - painter->setFont(m_font); + sx -= m_metrics->width(row->length); + painter->drawText(sx, sy, row->length); + sx -= m_padding; } - if(!row->length.isEmpty()) - painter->drawText(row->x[ListWidgetRow::LENGTH], sy, row->length); - if(QmmpUiSettings::instance()->columnManager()->count() == 1) - return; - - offset = 0; - painter->setPen(m_normal); - for(int i = 0; i < QmmpUiSettings::instance()->columnManager()->count(); i++) + if(!row->extraString.isEmpty()) { - offset += QmmpUiSettings::instance()->columnManager()->size(i); - - if(QmmpUiSettings::instance()->columnManager()->count() > 1 && - row->x[ListWidgetRow::TITLE] + offset < row->x[ListWidgetRow::EXTRA_STRING] - m_metrics->width("9")) - { - painter->drawLine(row->x[ListWidgetRow::TITLE] + offset - m_metrics->width("9")/2, row->rect.top(), - row->x[ListWidgetRow::TITLE] + offset - m_metrics->width("9")/2, row->rect.bottom() + 1); - } + sx -= m_extra_metrics->width(row->extraString); + painter->setFont(m_extra_font); + painter->drawText(sx, sy, row->extraString); } - } void ListWidgetDrawer::drawDropLine(QPainter *painter, int row_number, int width) @@ -271,14 +272,3 @@ void ListWidgetDrawer::drawDropLine(QPainter *painter, int row_number, int width painter->drawLine (5, row_number * m_row_height, width - 5 , row_number * m_row_height); } - -void ListWidgetDrawer::drawVerticalLine(QPainter *painter, int row_count, int width, bool rtl) -{ - if(m_number_width) - { - painter->setPen(m_normal); - int sx = rtl ? width - 10 - m_number_width - m_metrics->width("9")/2 - 1 : - 5 + PADDING + m_number_width + m_metrics->width("9")/2 - 1; - painter->drawLine(sx, 2, sx, (row_count + 1) * (1 + m_metrics->lineSpacing()) - m_metrics->descent()); - } -} diff --git a/src/plugins/Ui/skinned/listwidgetdrawer.h b/src/plugins/Ui/skinned/listwidgetdrawer.h index 71b8137b1..0b221394d 100644 --- a/src/plugins/Ui/skinned/listwidgetdrawer.h +++ b/src/plugins/Ui/skinned/listwidgetdrawer.h @@ -27,19 +27,25 @@ #include <QRect> #include <QFontMetrics> -class Skin; + class QPainter; +class Skin; +class ColumnManager; struct ListWidgetRow { ListWidgetRow() { flags = NO_FLAGS; + numberColumnWidth = 0; + lengthColumnWidth = 0; } QStringList titles; QString length; QString extraString; int number; + int numberColumnWidth; + int lengthColumnWidth; enum { NO_FLAGS = 0x00, @@ -50,15 +56,6 @@ struct ListWidgetRow }; int flags; - - enum - { - NUMBER = 0, - TITLE, - EXTRA_STRING, - LENGTH - }; - int x[LENGTH + 1]; QRect rect; //geometry }; @@ -82,18 +79,19 @@ public: void drawSeparator(QPainter *painter, ListWidgetRow *row, bool rtl); void drawTrack(QPainter *painter, ListWidgetRow *row); void drawDropLine(QPainter *painter, int row_number, int width); - void drawVerticalLine(QPainter *painter, int row_count, int width, bool rtl); private: QColor m_normal, m_current, m_normal_bg, m_selected_bg; Skin *m_skin; QFontMetrics *m_metrics; QFontMetrics *m_extra_metrics; + ColumnManager *m_column_manager; QFont m_font, m_extra_font; bool m_update; bool m_show_number; bool m_show_anchor; bool m_align_numbres; + int m_padding; int m_number_width; int m_row_height; }; diff --git a/src/plugins/Ui/skinned/playlistheader.cpp b/src/plugins/Ui/skinned/playlistheader.cpp index a13179879..eb53eef8c 100644 --- a/src/plugins/Ui/skinned/playlistheader.cpp +++ b/src/plugins/Ui/skinned/playlistheader.cpp @@ -35,13 +35,12 @@ #include "skin.h" #include "playlistheader.h" -#define PADDING 3 - PlayListHeader::PlayListHeader(QWidget *parent) : QWidget(parent) { setMouseTracking(true); m_metrics = 0; + m_padding = 0; m_show_number = false; m_align_numbres = false; m_number_width = 0; @@ -81,6 +80,7 @@ void PlayListHeader::readSettings() m_metrics = new QFontMetrics(m_font); m_show_number = settings.value ("pl_show_numbers", true).toBool(); m_align_numbres = settings.value ("pl_align_numbers", false).toBool(); + m_padding = m_metrics->width("9")/2; settings.endGroup(); updateColumns(); } @@ -99,9 +99,9 @@ void PlayListHeader::updateColumns() m_rects.clear(); m_names.clear(); - int sx = 5 + PADDING; + int sx = 5; if(m_number_width) - sx += m_number_width + m_metrics->width("9"); + sx += m_number_width + 2 * m_padding; if(m_manager->count() == 1) { @@ -112,7 +112,7 @@ void PlayListHeader::updateColumns() for(int i = 0; i < m_manager->count(); ++i) { - m_rects << QRect(sx, 0, m_manager->size(i)+1, height()); + m_rects << QRect(sx, 0, m_manager->size(i), height()); m_names << m_metrics->elidedText(m_manager->name(i), Qt::ElideRight, m_manager->size(i) - m_metrics->width("9")); @@ -263,8 +263,8 @@ void PlayListHeader::paintEvent(QPaintEvent *) if(m_number_width) { - painter.drawLine(m_rects.at(0).x() - m_metrics->width("9")/2 - 1, 0, - m_rects.at(0).x() - m_metrics->width("9")/2 - 1, height()); + painter.drawLine(m_rects.at(0).x(), 0, + m_rects.at(0).x(), height()); } if(m_names.count() == 1) @@ -280,7 +280,7 @@ void PlayListHeader::paintEvent(QPaintEvent *) { painter.setBrush(m_normal_bg); painter.setPen(m_current); - painter.drawRect(m_rects[i].x() - m_metrics->width("9")/2, 0, + painter.drawRect(m_rects[i].x(), 0, m_rects[i].width(), height()-1); painter.setBrush(m_normal); painter.setPen(m_normal_bg); @@ -290,15 +290,15 @@ void PlayListHeader::paintEvent(QPaintEvent *) painter.drawText((m_rects[i].x() + m_rects[i].right())/2 - m_metrics->width(m_names[i])/2, m_metrics->ascent(), m_names[i]); - painter.drawLine(m_rects[i].right() - m_metrics->width("9")/2, 0, - m_rects[i].right() - m_metrics->width("9")/2, height()+1); + painter.drawLine(m_rects[i].right()+1, 0, + m_rects[i].right()+1, height()+1); } if(m_task == MOVE) { painter.setPen(m_normal); - painter.drawRect(m_mouse_pos.x() - m_press_offset - m_metrics->width("9")/2, 0, + painter.drawRect(m_mouse_pos.x() - m_press_offset, 0, m_rects.at(m_pressed_column).width(), height()); painter.setPen(m_normal_bg); diff --git a/src/plugins/Ui/skinned/playlistheader.h b/src/plugins/Ui/skinned/playlistheader.h index 3282e3b98..b405d2ebf 100644 --- a/src/plugins/Ui/skinned/playlistheader.h +++ b/src/plugins/Ui/skinned/playlistheader.h @@ -77,6 +77,7 @@ private: int m_pressed_column; int m_old_size; int m_press_offset; + int m_padding; enum { |
