diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-11-19 09:45:38 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-11-19 09:45:38 +0000 |
| commit | 1e12d4279bb187339b38d850db58f7345a9bfdd7 (patch) | |
| tree | b9c0a76087abaa407c199799c5d9fb3af6d1841c /src/ui/playlistselector.cpp | |
| parent | 3a0093c1f8baa2959e3247d819674e1bbd7aaefa (diff) | |
| download | qmmp-1e12d4279bb187339b38d850db58f7345a9bfdd7.tar.gz qmmp-1e12d4279bb187339b38d850db58f7345a9bfdd7.tar.bz2 qmmp-1e12d4279bb187339b38d850db58f7345a9bfdd7.zip | |
playlist selector: added scrolling
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1382 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/ui/playlistselector.cpp')
| -rw-r--r-- | src/ui/playlistselector.cpp | 126 |
1 files changed, 110 insertions, 16 deletions
diff --git a/src/ui/playlistselector.cpp b/src/ui/playlistselector.cpp index 534aa6bf0..031d4627d 100644 --- a/src/ui/playlistselector.cpp +++ b/src/ui/playlistselector.cpp @@ -32,12 +32,15 @@ PlayListSelector::PlayListSelector(PlayListManager *manager, QWidget *parent) : QWidget(parent) { m_update = FALSE; + m_scrollable = FALSE; + m_offset = 0; + m_offset_max = 0; m_skin = Skin::instance(); m_pl_manager = manager; connect(m_pl_manager, SIGNAL(playListsChanged()), SLOT(updateTabs())); - connect(m_skin, SIGNAL(skinChanged()), this, SLOT(updateSkin())); - readSettings(); + connect(m_skin, SIGNAL(skinChanged()), this, SLOT(updateSkin())); loadColors(); + readSettings(); updateTabs(); } @@ -52,6 +55,7 @@ void PlayListSelector::readSettings() { delete m_metrics; m_metrics = new QFontMetrics(m_font); + updateTabs(); } else { @@ -60,6 +64,7 @@ void PlayListSelector::readSettings() m_metrics = new QFontMetrics(m_font); resize(width(), m_metrics->height () +1); + drawButtons(); } void PlayListSelector::updateTabs() @@ -71,54 +76,81 @@ void PlayListSelector::updateTabs() if(m_rects.isEmpty()) rect.setX(9); else - rect.setX(m_rects.last().x() + m_rects.last().width() + m_metrics->width(" | ")); + rect.setX(m_rects.last().right() + m_metrics->width(" | ")); rect.setY(0); rect.setWidth(m_metrics->width(text)); rect.setHeight(m_metrics->ascent ()); m_rects.append(rect); } + updateScrollers(); update(); } void PlayListSelector::updateSkin() { loadColors(); + drawButtons(); updateTabs(); } void PlayListSelector::paintEvent(QPaintEvent *) { - QPainter m_painter(this); - m_painter.setFont(m_font); - m_painter.setBrush(QBrush(m_normal_bg)); - m_painter.drawRect(-1,-1,width()+1,height()+1); + QPainter painter(this); + painter.setFont(m_font); + painter.setBrush(QBrush(m_normal_bg)); + painter.drawRect(-1,-1,width()+1,height()+1); QStringList names = m_pl_manager->playListNames(); int current = m_pl_manager->indexOf(m_pl_manager->currentPlayList()); int selected = m_pl_manager->indexOf(m_pl_manager->selectedPlayList()); - m_painter.setBrush(QBrush(m_selected_bg)); - m_painter.setPen(m_selected_bg); - m_painter.drawRect(m_rects.at(selected).x()-3, 0, m_rects.at(selected).width()+4, height()-1); + painter.setBrush(QBrush(m_selected_bg)); + painter.setPen(m_selected_bg); + painter.drawRect(m_rects.at(selected).x()- 3 - m_offset, 0, + m_rects.at(selected).width()+4, height()-1); for (int i = 0; i < m_rects.size(); ++i) { if(i == current) - m_painter.setPen(m_current); + painter.setPen(m_current); else - m_painter.setPen(m_normal); - m_painter.drawText(m_rects[i].x(), m_metrics->ascent(), names.at(i)); + painter.setPen(m_normal); + painter.drawText(m_rects[i].x() - m_offset, m_metrics->ascent(), names.at(i)); if(i < m_rects.size() - 1) { - m_painter.setPen(m_normal); - m_painter.drawText(m_rects[i].x() + m_rects[i].width(), m_metrics->ascent(), " | "); + painter.setPen(m_normal); + painter.drawText(m_rects[i].x() + m_rects[i].width() - m_offset, m_metrics->ascent(), " | "); } } + if(m_scrollable) + { + painter.drawPixmap(width()-40, 0, m_pixmap); + painter.setBrush(QBrush(m_normal_bg)); + painter.setPen(m_normal_bg); + painter.drawRect(0,0,6,height()); + } } void PlayListSelector::mousePressEvent (QMouseEvent *e) { + if(m_scrollable && e->x() > width() - 20) + { + m_offset += m_rects.at(lastVisible()).right() - m_offset - width() + 42; + m_offset = qMin(m_offset, m_offset_max); + update(); + return; + } + if(m_scrollable && (width() - 40 < e->x()) && (e->x() <= width() - 20)) + { + m_offset -= 11 - m_rects.at(firstVisible()).x() + m_offset; + m_offset = qMax(0, m_offset); + update(); + return; + } + + QPoint pp = e->pos(); + pp.rx() += m_offset; for(int i = 0; i < m_rects.count(); ++i) { - if(m_rects.at(i).contains(e->pos())) + if(m_rects.at(i).contains(pp)) { m_pl_manager->selectPlayList(i); break; @@ -126,6 +158,11 @@ void PlayListSelector::mousePressEvent (QMouseEvent *e) } } +void PlayListSelector::resizeEvent (QResizeEvent *) +{ + updateScrollers(); +} + void PlayListSelector::loadColors() { m_normal.setNamedColor(m_skin->getPLValue("normal")); @@ -133,3 +170,60 @@ void PlayListSelector::loadColors() m_normal_bg.setNamedColor(m_skin->getPLValue("normalbg")); m_selected_bg.setNamedColor(m_skin->getPLValue("selectedbg")); } + +void PlayListSelector::drawButtons() +{ + m_pixmap = QPixmap(40, height()); + m_pixmap.fill(m_normal_bg); + QPainter painter(&m_pixmap); + painter.setPen(m_normal); + painter.setBrush(QBrush(m_normal)); + QPoint points[3] = { + QPoint(m_pixmap.width() - 25, height()/2 - 6), + QPoint(m_pixmap.width() - 35, height()/2-1), + QPoint(m_pixmap.width() - 25, height()/2 + 4), + }; + painter.drawPolygon(points, 3); + + QPoint points2[3] = { + QPoint(m_pixmap.width() - 20, height()/2 - 6), + QPoint(m_pixmap.width() - 10, height()/2-1), + QPoint(m_pixmap.width() - 20, height()/2 + 4), + }; + painter.drawPolygon(points2, 3); +} + +void PlayListSelector::updateScrollers() +{ + m_scrollable = m_rects.last().right() > width(); + if(m_scrollable) + { + m_offset_max = m_rects.last().right() - width() + 42; + m_offset = qMin(m_offset, m_offset_max); + } + else + { + m_offset = 0; + m_offset_max = 0; + } +} + +int PlayListSelector::firstVisible() +{ + for(int i = 0; i < m_rects.size(); ++i) + { + if(m_rects.at(i).right() - m_offset + m_metrics->width(" - ") + 2 >= 9) + return i; + } + return 0; +} + +int PlayListSelector::lastVisible() +{ + for(int i = m_rects.size() - 1; i >= 0; --i) + { + if(m_rects.at(i).x() - m_offset - m_metrics->width(" - ") - 2 <= width() - 40) + return i; + } + return m_rects.count() - 1; +} |
