From 5965debcc8faba6ffc284fe17ca60f42fb4b5d2c Mon Sep 17 00:00:00 2001 From: Tobias Rundstrom Date: Wed, 1 Mar 2006 00:39:44 -0300 Subject: [PATCH] You can now move entries around in the playlist. --- PlaylistList.cpp | 174 ++++++++++++++++++++++++++++++++++++++++------- PlaylistList.h | 18 ++++- XMMSHandler.h | 1 + 3 files changed, 168 insertions(+), 25 deletions(-) diff --git a/PlaylistList.cpp b/PlaylistList.cpp index e731235..6dc90c8 100644 --- a/PlaylistList.cpp +++ b/PlaylistList.cpp @@ -4,6 +4,8 @@ #include "Playlist.h" #include +#include +#include PlaylistItem::PlaylistItem (PlaylistList *pl, uint id) { @@ -42,6 +44,8 @@ PlaylistList::PlaylistList (QWidget *parent) : QWidget (parent) setAttribute (Qt::WA_NoBackground); setFocusPolicy (Qt::StrongFocus); + setAcceptDrops (true); + connect (skin, SIGNAL (skinChanged (Skin *)), this, SLOT (setPixmaps(Skin *))); @@ -52,6 +56,7 @@ PlaylistList::PlaylistList (QWidget *parent) : QWidget (parent) m_itemmap = new QHash; m_offset = 0; m_status = XMMS_PLAYBACK_STATUS_STOP; + m_bar = -2; connect (xmmsh, SIGNAL(playlistList(QList)), this, SLOT(playlistList(QList))); @@ -182,6 +187,25 @@ PlaylistList::mouseDoubleClickEvent (QMouseEvent *event) } } +QPixmap +PlaylistList::generatePixmap (int i) +{ + QStyleOptionHeader opt; + QString t (m_items->value(i)->text()); + + QPixmap p (m_fontmetrics->width(t), getFontH()); + + QPainter paint; + paint.begin (&p); + paint.setFont (*m_font); + paint.setPen (QPen (m_color_normal)); + paint.fillRect (p.rect(), QBrush (m_color_normal_bg)); + paint.drawText (p.rect(), t); + paint.end (); + + return p; +} + void PlaylistList::mousePressEvent (QMouseEvent *event) { @@ -193,39 +217,124 @@ PlaylistList::mousePressEvent (QMouseEvent *event) i = 0; } - if (event->modifiers() & Qt::ShiftModifier) { - if (m_selected->count () > 0) { - int o = m_selected->last (); - if (o < i) { - for (int y = o; y <= i; y++) { - m_selected->append (y); + if (i > m_items->count ()) { + return; + } + + if (event->button () == Qt::LeftButton) { + if (event->modifiers() & Qt::ShiftModifier) { + if (m_selected->count () > 0) { + int o = m_selected->last (); + if (o < i) { + for (int y = o; y <= i; y++) { + m_selected->append (y); + } + } else { + for (int y = i; y <= o; y++) { + m_selected->append (y); + } } } else { - for (int y = i; y <= o; y++) { - m_selected->append (y); - } + m_selected->append (i); + } + } else if (event->modifiers () & Qt::ControlModifier) { + if (m_selected->contains (i)) { + m_selected->removeAll (i); + } else { + m_selected->append (i); } } else { - m_selected->append (i); - } - } else if (event->modifiers () & Qt::ControlModifier) { - if (m_selected->contains (i)) { - m_selected->removeAll (i); - } else { - m_selected->append (i); - } - } else { - if (m_selected->contains (i)) { - m_selected->clear(); - } else { - m_selected->clear(); - m_selected->append(i); + if (m_selected->contains (i)) { + m_selected->clear(); + } else { + m_selected->clear(); + m_selected->append(i); + } + + m_dragstart = event->pos (); } } update (); } +void +PlaylistList::mouseMoveEvent (QMouseEvent *event) +{ + + if (!(event->buttons() & Qt::LeftButton)) + return; + if ((event->pos() - m_dragstart).manhattanLength() < QApplication::startDragDistance()) + return; + + if (m_selected->count() > 0) { + int i = m_selected->last (); + + m_drag = new QDrag (this); + m_md = new QMimeData; + m_md->setText (QString::number (m_selected->last ())); + m_drag->setMimeData (m_md); + + m_drag_id = m_items->value (i)->getID (); + m_pos = i; + + QPixmap p = generatePixmap (i); + + m_drag->setPixmap (p); + m_items->removeAt (i); + m_selected->clear (); + + Qt::DropAction drop = m_drag->start (); + } + +} + +void +PlaylistList::dragEnterEvent (QDragEnterEvent *event) +{ + event->accept (); +} + +void +PlaylistList::dragMoveEvent (QDragMoveEvent *event) +{ + int i = ((event->pos().y()+m_offset) / getFontH()); + if (event->pos().y() < getFontH() / 2) { + m_bar = -1; + } else if (i >= m_items->count ()) { + m_bar = m_items->count ()-1; + } else { + m_bar = i; + } + update (); +} + +void +PlaylistList::dragLeaveEvent (QDragLeaveEvent *event) +{ + m_bar = -2; + update (); +} + +void +PlaylistList::dropEvent (QDropEvent *event) +{ + XMMSHandler *xmmsh = XMMSHandler::getInstance (); + + if (m_bar == -2) { + m_items->insert (m_pos, m_itemmap->value (m_drag_id)); + } else { + m_items->insert (m_bar + 1, m_itemmap->value (m_drag_id)); + xmmsh->playlistMove (m_pos, m_bar + 1); + } + m_selected->append (m_drag_id); + m_bar = -2; + update (); + + + +} + void PlaylistList::keyPressEvent (QKeyEvent *event) { @@ -260,9 +369,9 @@ PlaylistList::keyPressEvent (QKeyEvent *event) case Qt::Key_Backspace: case Qt::Key_Delete: { + /* Sort list and remove in reverse order */ qSort (*m_selected); for (int i = m_selected->count (); i > 0; i --) { - qDebug ("%d", m_selected->value (i)); xmmsh->playlistRemove (m_selected->value (i)); } m_selected->clear (); @@ -325,6 +434,22 @@ PlaylistList::paintEvent (QPaintEvent *event) paint.drawText (r, q); } + if (m_bar == -1) { + paint.save (); + QPen pen (m_color_active); + pen.setWidth (2); + paint.setPen (pen); + paint.drawLine (2, 0, size().width()-2, 0); + paint.restore (); + } else if (m_bar == i) { + paint.save (); + QPen pen (m_color_active); + pen.setWidth (5); + paint.setPen (pen); + paint.drawLine (2, r.y()+getFontH(), size().width()-2, r.y()+getFontH()); + paint.restore (); + } + } if ((getFontH()*(i-sitem) - mod) < size().height()) { @@ -380,6 +505,7 @@ PlaylistList::setPixmaps (Skin *skin) m_color_active.setNamedColor (skin->getPLeditValue ("current")); m_color_selected.setNamedColor (skin->getPLeditValue ("selectedbg")); m_color_normal.setNamedColor (skin->getPLeditValue ("normal")); + m_color_normal_bg.setNamedColor (skin->getPLeditValue ("normalbg")); update (); } diff --git a/PlaylistList.h b/PlaylistList.h index e62450a..f13b5d0 100644 --- a/PlaylistList.h +++ b/PlaylistList.h @@ -5,6 +5,8 @@ #include #include +#include + class PlaylistItem; class PlaylistList : public QWidget { @@ -29,10 +31,16 @@ class PlaylistList : public QWidget { private: void paintEvent (QPaintEvent *event); void mousePressEvent (QMouseEvent *event); + void mouseMoveEvent (QMouseEvent *event); void mouseDoubleClickEvent (QMouseEvent *event); void keyPressEvent (QKeyEvent *event); - void mouseMoveEvent (QMouseEvent *event) {} + void dragMoveEvent (QDragMoveEvent *event); + void dragEnterEvent (QDragEnterEvent *event); + void dragLeaveEvent (QDragLeaveEvent *event); + void dropEvent (QDropEvent *event); + + QPixmap generatePixmap (int); QList *m_items; QList *m_selected; @@ -43,11 +51,19 @@ class PlaylistList : public QWidget { QColor m_color_active; QColor m_color_selected; QColor m_color_normal; + QColor m_color_normal_bg; int getFontH (void); int m_offset; int m_active; + int m_bar; + int m_drag_id; + int m_pos; + QPoint m_dragstart; uint m_status; + + QDrag *m_drag; + QMimeData *m_md; }; class PlaylistItem { diff --git a/XMMSHandler.h b/XMMSHandler.h index 94cd1cb..7da74b9 100644 --- a/XMMSHandler.h +++ b/XMMSHandler.h @@ -29,6 +29,7 @@ class XMMSHandler : public QObject, public sigc::trackable { void playlistAddURL (QString); void playlistClear (void); void playlistRemove (uint pos) { delete m_xmmsc->playlist_remove (pos); } + void playlistMove (uint pos, uint newpos) { delete m_xmmsc->playlist_move (pos, newpos); } const XMMSClient *getXMMS () { return m_xmmsc; }