You can now move entries around in the playlist.

This commit is contained in:
Tobias Rundstrom 2006-03-01 00:39:44 -03:00
parent ce54eaba15
commit 5965debcc8
3 changed files with 168 additions and 25 deletions

View file

@ -4,6 +4,8 @@
#include "Playlist.h" #include "Playlist.h"
#include <QPaintEvent> #include <QPaintEvent>
#include <QDrag>
#include <QStyleOptionHeader>
PlaylistItem::PlaylistItem (PlaylistList *pl, uint id) PlaylistItem::PlaylistItem (PlaylistList *pl, uint id)
{ {
@ -42,6 +44,8 @@ PlaylistList::PlaylistList (QWidget *parent) : QWidget (parent)
setAttribute (Qt::WA_NoBackground); setAttribute (Qt::WA_NoBackground);
setFocusPolicy (Qt::StrongFocus); setFocusPolicy (Qt::StrongFocus);
setAcceptDrops (true);
connect (skin, SIGNAL (skinChanged (Skin *)), connect (skin, SIGNAL (skinChanged (Skin *)),
this, SLOT (setPixmaps(Skin *))); this, SLOT (setPixmaps(Skin *)));
@ -52,6 +56,7 @@ PlaylistList::PlaylistList (QWidget *parent) : QWidget (parent)
m_itemmap = new QHash<uint, PlaylistItem *>; m_itemmap = new QHash<uint, PlaylistItem *>;
m_offset = 0; m_offset = 0;
m_status = XMMS_PLAYBACK_STATUS_STOP; m_status = XMMS_PLAYBACK_STATUS_STOP;
m_bar = -2;
connect (xmmsh, SIGNAL(playlistList(QList<uint>)), connect (xmmsh, SIGNAL(playlistList(QList<uint>)),
this, SLOT(playlistList(QList<uint>))); this, SLOT(playlistList(QList<uint>)));
@ -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 void
PlaylistList::mousePressEvent (QMouseEvent *event) PlaylistList::mousePressEvent (QMouseEvent *event)
{ {
@ -193,39 +217,124 @@ PlaylistList::mousePressEvent (QMouseEvent *event)
i = 0; i = 0;
} }
if (event->modifiers() & Qt::ShiftModifier) { if (i > m_items->count ()) {
if (m_selected->count () > 0) { return;
int o = m_selected->last (); }
if (o < i) {
for (int y = o; y <= i; y++) { if (event->button () == Qt::LeftButton) {
m_selected->append (y); 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 { } else {
for (int y = i; y <= o; y++) { m_selected->append (i);
m_selected->append (y); }
} } else if (event->modifiers () & Qt::ControlModifier) {
if (m_selected->contains (i)) {
m_selected->removeAll (i);
} else {
m_selected->append (i);
} }
} else { } else {
m_selected->append (i); if (m_selected->contains (i)) {
} m_selected->clear();
} else if (event->modifiers () & Qt::ControlModifier) { } else {
if (m_selected->contains (i)) { m_selected->clear();
m_selected->removeAll (i); m_selected->append(i);
} else { }
m_selected->append (i);
} m_dragstart = event->pos ();
} else {
if (m_selected->contains (i)) {
m_selected->clear();
} else {
m_selected->clear();
m_selected->append(i);
} }
} }
update (); 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 void
PlaylistList::keyPressEvent (QKeyEvent *event) PlaylistList::keyPressEvent (QKeyEvent *event)
{ {
@ -260,9 +369,9 @@ PlaylistList::keyPressEvent (QKeyEvent *event)
case Qt::Key_Backspace: case Qt::Key_Backspace:
case Qt::Key_Delete: case Qt::Key_Delete:
{ {
/* Sort list and remove in reverse order */
qSort (*m_selected); qSort (*m_selected);
for (int i = m_selected->count (); i > 0; i --) { for (int i = m_selected->count (); i > 0; i --) {
qDebug ("%d", m_selected->value (i));
xmmsh->playlistRemove (m_selected->value (i)); xmmsh->playlistRemove (m_selected->value (i));
} }
m_selected->clear (); m_selected->clear ();
@ -325,6 +434,22 @@ PlaylistList::paintEvent (QPaintEvent *event)
paint.drawText (r, q); 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()) { if ((getFontH()*(i-sitem) - mod) < size().height()) {
@ -380,6 +505,7 @@ PlaylistList::setPixmaps (Skin *skin)
m_color_active.setNamedColor (skin->getPLeditValue ("current")); m_color_active.setNamedColor (skin->getPLeditValue ("current"));
m_color_selected.setNamedColor (skin->getPLeditValue ("selectedbg")); m_color_selected.setNamedColor (skin->getPLeditValue ("selectedbg"));
m_color_normal.setNamedColor (skin->getPLeditValue ("normal")); m_color_normal.setNamedColor (skin->getPLeditValue ("normal"));
m_color_normal_bg.setNamedColor (skin->getPLeditValue ("normalbg"));
update (); update ();
} }

View file

@ -5,6 +5,8 @@
#include <QWidget> #include <QWidget>
#include <QHash> #include <QHash>
#include <QDrag>
class PlaylistItem; class PlaylistItem;
class PlaylistList : public QWidget { class PlaylistList : public QWidget {
@ -29,10 +31,16 @@ class PlaylistList : public QWidget {
private: private:
void paintEvent (QPaintEvent *event); void paintEvent (QPaintEvent *event);
void mousePressEvent (QMouseEvent *event); void mousePressEvent (QMouseEvent *event);
void mouseMoveEvent (QMouseEvent *event);
void mouseDoubleClickEvent (QMouseEvent *event); void mouseDoubleClickEvent (QMouseEvent *event);
void keyPressEvent (QKeyEvent *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<PlaylistItem*> *m_items; QList<PlaylistItem*> *m_items;
QList<uint> *m_selected; QList<uint> *m_selected;
@ -43,11 +51,19 @@ class PlaylistList : public QWidget {
QColor m_color_active; QColor m_color_active;
QColor m_color_selected; QColor m_color_selected;
QColor m_color_normal; QColor m_color_normal;
QColor m_color_normal_bg;
int getFontH (void); int getFontH (void);
int m_offset; int m_offset;
int m_active; int m_active;
int m_bar;
int m_drag_id;
int m_pos;
QPoint m_dragstart;
uint m_status; uint m_status;
QDrag *m_drag;
QMimeData *m_md;
}; };
class PlaylistItem { class PlaylistItem {

View file

@ -29,6 +29,7 @@ class XMMSHandler : public QObject, public sigc::trackable {
void playlistAddURL (QString); void playlistAddURL (QString);
void playlistClear (void); void playlistClear (void);
void playlistRemove (uint pos) { delete m_xmmsc->playlist_remove (pos); } 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; } const XMMSClient *getXMMS () { return m_xmmsc; }