Moved some files and minor cleanups

This commit is contained in:
Thomas Frauendorfer 2008-01-24 05:52:52 +01:00
parent 0cf6c18de4
commit 883243a376
62 changed files with 95 additions and 79 deletions

630
src/playlist/playlist.cpp Normal file
View file

@ -0,0 +1,630 @@
#include "MainWindow.h"
#include "BrowseDialog.h"
#include "playlist.h"
#include "playlistview.h"
#include "playlistmodel.h"
#include "playlistshade.h"
#include "playlistmenu.h"
#include "FileDialog.h"
#include <QMouseEvent>
#include <QPaintEvent>
#include <QRect>
#include <QIcon>
#include <QApplication>
#include <QSettings>
#include <QFileDialog>
/*
*
* PlaylistScrollBar
*
*/
PlaylistScrollBar::PlaylistScrollBar (QWidget *parent) :
QScrollBar (Qt::Vertical, parent)
{
Skin *skin = Skin::getInstance ();
setContextMenuPolicy(Qt::NoContextMenu);
m_pixmap = QPixmap (0, 0);
m_slider = QPixmap (0, 0);
m_slider_down = QPixmap (0, 0);
connect (skin, SIGNAL (skinChanged (Skin *)),
this, SLOT (setPixmaps(Skin *)));
}
void
PlaylistScrollBar::mouseMoveEvent (QMouseEvent *event)
{
if (!isSliderDown ())
return;
int tmp = sliderValueFromPosition(event->y () - m_sliderOffset);
if (tmp == value())
return;
setValue(tmp);
//TODO only repaint necessary range
repaint ();
}
void
PlaylistScrollBar::mousePressEvent (QMouseEvent *event)
{
if (event->button() == Qt::RightButton) {
event->ignore();
return;
}
if (maximum () == minimum ())
return;
int sliderBase = sliderPositionFromValue();
if (event->y () < sliderBase) {
triggerAction (QAbstractSlider::SliderPageStepSub);
} else if (event->y () > sliderBase + m_slider.height ()) {
triggerAction (QAbstractSlider::SliderPageStepAdd);
} else {
m_sliderOffset = event->y () - sliderBase;
setSliderDown (true);
}
//TODO only repaint necessary range
repaint ();
}
void
PlaylistScrollBar::mouseReleaseEvent (QMouseEvent *event)
{
if (event->button() == Qt::RightButton) {
event->ignore();
return;
}
if (isSliderDown ()) {
setValue(sliderValueFromPosition(event->y () - m_sliderOffset));
setSliderDown (false);
}
//TODO only repaint necessary range
repaint ();
}
void
PlaylistScrollBar::paintEvent (QPaintEvent *event)
{
if (m_pixmap.isNull ()) {
return;
}
// TODO remove, in here for debuging
// qDebug("%i %i %i %i %i %i %i", event->rect ().x(), event->rect ().y(), event->rect ().width(), event->rect ().height(),
// minimum(), maximum (), sliderPosition ());
QPainter (paint);
paint.begin (this);
/* draw background */
paint.drawPixmap (event->rect (), m_pixmap, m_pixmap.rect ());
/* draw slider */
QPixmap *slider = isSliderDown () ? &m_slider_down : &m_slider ;
QRect rect (slider->rect ());
rect.moveTop (sliderPositionFromValue ());
paint.drawPixmap (rect , *slider, slider->rect ());
paint.end ();
}
void
PlaylistScrollBar::setPixmaps (Skin *skin)
{
m_pixmap = skin->getPls (Skin::PLS_RFILL2_0);
m_slider = skin->getPls (Skin::PLS_SCROLL_0);
m_slider_down = skin->getPls (Skin::PLS_SCROLL_1);
}
int
PlaylistScrollBar::sliderPositionFromValue ()
{
return QStyle::sliderPositionFromValue (minimum (), maximum (),
sliderPosition (),
height () - m_slider.height (),
false);
}
int
PlaylistScrollBar::sliderValueFromPosition (int position)
{
return QStyle::sliderValueFromPosition (minimum (), maximum (),
position,
height () - m_slider.height (),
false);
}
/*
* dragButton
*/
void
dragButton::mouseMoveEvent (QMouseEvent *event)
{
PlaylistWindow *pw = dynamic_cast<PlaylistWindow *>(window ());
pw->resize (pw->size().width()+(event->pos().x()-m_diffx),
pw->size().height()+(event->pos().y()-m_diffy));
}
/*
* PlaylistWindow
*/
PlaylistWindow::PlaylistWindow (QWidget *parent) : QMainWindow (parent)
{
QSettings s;
m_mw = dynamic_cast<MainWindow *>(parent);
#ifndef _WIN32
setWindowIcon (QIcon (":icon.png"));
#endif
setWindowFlags (Qt::Dialog | Qt::FramelessWindowHint);
setAttribute (Qt::WA_DeleteOnClose);
s.beginGroup ("playlist");
if (!s.contains ("size")) {
s.setValue ("size", QSize (275, 350));
}
resize (s.value("size").toSize ());
m_playlist = new PlaylistWidget (this);
setCentralWidget (m_playlist);
m_shaded = new PlaylistShade (this);
m_shadebtn = new Button (this, Skin::PLS_SHADE_BTN_0, Skin::PLS_SHADE_BTN_1, true);
connect (m_shadebtn, SIGNAL (clicked()), this, SLOT (switchDisplay ()));
m_shadebtn->move(size().width() - 21, 3);
m_closebtn = new Button (this, Skin::PLS_CLOSE_BTN_0, Skin::PLS_CLOSE_BTN_1, true);
connect (m_closebtn, SIGNAL (clicked()), this, SLOT (togglePL ()));
m_closebtn->move(size().width() - 11, 3);
if (!s.contains ("shaded"))
s.setValue ("shaded", false);
else
s.setValue ("shaded", !s.value("shaded").toBool ());
switchDisplay ();
s.endGroup ();
}
void
PlaylistWindow::togglePL (void)
{
m_mw->togglePL(true);
}
void
PlaylistWindow::switchDisplay (void)
{
QSettings s;
s.beginGroup ("playlist");
if (!s.value("shaded").toBool ()) {
m_shaded->hide ();
m_playlist->show ();
s.setValue ("shaded", true);
m_playlist->resize (s.value("size").toSize ());
resize (s.value("size").toSize ());
} else {
m_playlist->hide ();
m_shaded->show ();
s.setValue ("shaded", false);
m_shaded->resize (s.value("size").toSize ().width(), 14);
resize (s.value("size").toSize ().width(), 14);
}
s.endGroup ();
update ();
}
void
PlaylistWindow::resizeEvent (QResizeEvent *event)
{
QSettings s;
m_shadebtn->move(size().width() - 21, 3);
m_closebtn->move(size().width() - 11, 3);
if (s.value("playlist/shaded").toBool ()) {
s.setValue ("playlist/size", size ());
}
}
void
PlaylistWindow::mousePressEvent (QMouseEvent *event)
{
m_diffx = event->pos ().x ();
m_diffy = event->pos ().y ();
}
void
PlaylistWindow::mouseMoveEvent (QMouseEvent *event)
{
move (event->globalPos().x() - m_diffx,
event->globalPos().y() - m_diffy);
}
void
PlaylistWindow::moveEvent (QMoveEvent *event)
{
QSettings s;
s.setValue ("playlist/pos", pos ());
}
void
PlaylistWindow::enterEvent (QEvent *event)
{
m_playlist->setActive (true);
m_shaded->setActive (true);
}
void
PlaylistWindow::leaveEvent (QEvent *event)
{
m_playlist->setActive (false);
m_shaded->setActive (false);
}
/*
* PlaylistWidget
*/
PlaylistWidget::PlaylistWidget (QWidget *parent) : QWidget (parent)
{
Skin *skin = Skin::getInstance ();
connect (skin, SIGNAL (skinChanged (Skin *)),
this, SLOT (setPixmaps(Skin *)));
setActive (underMouse ());
m_view = new PlaylistView (this);
m_view->move (10, 20);
m_view->resize (size().width()-30, size().height()-20-38);
// TODO: creation of Playlistmodel should be done elsewhere
m_view->setModel (XMMSHandler::getInstance().getPlaylistModel());
//m_list = new PlaylistList (m_view);
/*
* This is a hack to make PlaylistScrollBar work with PlaylistView.
* It is necessery because of limitations and at least one Bug in the
* QT library (as of Version 4.3)
* TODO: This might break in a future Qt version. Try to find a better solution
*/
m_scrollBar = new PlaylistScrollBar (this);
m_view->setVerticalScrollBar (m_scrollBar);
m_scrollBar->setParent(this);
m_scrollBar->show();
/* Workarounds for another QT bug (at least in my opinion) */
connect (m_scrollBar, SIGNAL(actionTriggered (int)),
m_view, SLOT(verticalScrollbarAction (int)));
connect (m_scrollBar, SIGNAL(valueChanged (int)),
m_view, SLOT(verticalScrollbarValueChanged (int)));
m_drag = new dragButton (this);
m_drag->resize (30, 30);
addButtons ();
setMinimumSize (275, 116);
resize (275, 300);
}
void
PlaylistWidget::addButtons (void)
{
PlaylistMenuButton *b;
/* Add menu */
m_add = new PlaylistMenu (this, Skin::PLS_ADD,
Skin::PLS_ADD_DEC);
b = new PlaylistMenuButton (m_add, Skin::PLS_ADD_URL_0,
Skin::PLS_ADD_URL_1);
connect (b, SIGNAL(activated ()), this, SLOT (menuAddUrl ()));
b = new PlaylistMenuButton (m_add, Skin::PLS_ADD_DIR_0,
Skin::PLS_ADD_DIR_1);
connect (b, SIGNAL(activated ()), this, SLOT (menuAddDir ()));
b = new PlaylistMenuButton (m_add, Skin::PLS_ADD_FIL_0,
Skin::PLS_ADD_FIL_1);
connect (b, SIGNAL(activated ()), this, SLOT (menuAddFile ()));
/* Del menu */
m_del = new PlaylistMenu (this, Skin::PLS_DEL,
Skin::PLS_DEL_DEC);
b = new PlaylistMenuButton (m_del, Skin::PLS_MSC_BTN_0,
Skin::PLS_MSC_BTN_1);
b = new PlaylistMenuButton (m_del, Skin::PLS_DEL_ALL_0,
Skin::PLS_DEL_ALL_1);
connect (b, SIGNAL (activated ()),
&XMMSHandler::getInstance(), SLOT (playlistClear ()));
b = new PlaylistMenuButton (m_del, Skin::PLS_DEL_CRP_0,
Skin::PLS_DEL_CRP_1);
connect (b, SIGNAL (activated ()),
m_view, SLOT (cropSelected ()));
b = new PlaylistMenuButton (m_del, Skin::PLS_DEL_FIL_0,
Skin::PLS_DEL_FIL_1);
connect (b, SIGNAL (activated ()),
m_view, SLOT (removeSelected ()));
// connect (b, SIGNAL(activated ()), m_list, SLOT (deleteFiles ()));
/* Selection menu */
m_sel = new PlaylistMenu (this, Skin::PLS_SEL,
Skin::PLS_SEL_DEC);
b = new PlaylistMenuButton (m_sel, Skin::PLS_SEL_INV_0,
Skin::PLS_SEL_INV_1);
connect (b, SIGNAL (activated ()),
m_view, SLOT (invertSelection ()));
b = new PlaylistMenuButton (m_sel, Skin::PLS_SEL_NIL_0,
Skin::PLS_SEL_NIL_1);
connect (b, SIGNAL (activated ()),
m_view, SLOT (clearSelection ()));
b = new PlaylistMenuButton (m_sel, Skin::PLS_SEL_ALL_0,
Skin::PLS_SEL_ALL_1);
connect (b, SIGNAL (activated ()),
m_view, SLOT (selectAll ()));
/* misc menu */
m_msc = new PlaylistMenu (this, Skin::PLS_MSC,
Skin::PLS_MSC_DEC);
b = new PlaylistMenuButton (m_msc, Skin::PLS_MSC_SRT_0,
Skin::PLS_MSC_SRT_1);
b = new PlaylistMenuButton (m_msc, Skin::PLS_MSC_INF_0,
Skin::PLS_MSC_INF_1);
b = new PlaylistMenuButton (m_msc, Skin::PLS_MSC_OPT_0,
Skin::PLS_MSC_OPT_1);
/* playlist menu */
m_lst = new PlaylistMenu (this, Skin::PLS_LST,
Skin::PLS_LST_DEC);
b = new PlaylistMenuButton (m_lst, Skin::PLS_LST_NEW_0,
Skin::PLS_LST_NEW_1);
b = new PlaylistMenuButton (m_lst, Skin::PLS_LST_SAV_0,
Skin::PLS_LST_SAV_1);
b = new PlaylistMenuButton (m_lst, Skin::PLS_LST_OPN_0,
Skin::PLS_LST_OPN_1);
}
void
PlaylistWidget::diveDir (const QString &dir)
{
QDir d (dir);
d.setFilter (QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
QFileInfoList list = d.entryInfoList();
for (int i = 0; i < list.size(); ++i) {
QFileInfo fileInfo = list.at(i);
if (fileInfo.isDir ()) {
diveDir (fileInfo.filePath ());
} else {
QString fname = fileInfo.filePath();
XMMSHandler::getInstance ().playlistAddURL ("file://" + fname);
}
}
}
void
PlaylistWidget::menuAddDir ()
{
/*
QString dir;
dir = QFileDialog::getExistingDirectory (this, "Select files to play",
QDir::homePath ());
diveDir (dir);
*/
FileDialog fd (this, "playlist_add_dir");
QString dir = fd.getDirectory ();
if (!dir.isNull ())
diveDir (dir);
}
void
PlaylistWidget::menuAddFile ()
{
QSettings s;
QStringList files;
if (s.value ("playlist/useremote").toBool () == true) {
BrowseDialog bd (window ());
files = bd.getFiles ();
for (int i = 0; i < files.count(); i++) {
XMMSHandler::getInstance ().playlistAddURL (files.value (i));
}
} else {
FileDialog fd (this, "playlist_add_files");
files = fd.getFiles ();
for (int i = 0; i < files.count(); i++) {
XMMSHandler::getInstance ().playlistAddURL ("file://" + files.value(i));
}
}
}
void
PlaylistWidget::resizeEvent (QResizeEvent *event)
{
m_view->resize (size().width()-30, size().height()-20-38);
/* since the sizes has changed we need to move the buttons */
m_scrollBar->move (size().width()-m_rfill3.width()-m_rfill2.width(),
m_corner2.height());
m_scrollBar->resize (m_rfill2.width(),
size().height()-m_corner2.height()-m_corner4.height());
/* drag corner */
m_drag->move (size().width()-30,
size().height()-30);
/* move menus */
m_add->move (11, height() - m_add->height() - 12);
m_del->move (40, height() - m_del->height() - 12);
m_sel->move (69, height() - m_sel->height() - 12);
m_msc->move (98, height() - m_msc->height() - 12);
m_lst->move (width()-22-25, height() - m_lst->height() - 12);
}
void
PlaylistWidget::setPixmaps (Skin *skin)
{
setActive (m_active);
resize (size().width(), size().height());
}
void
PlaylistWidget::setActive (bool active)
{
Skin *skin = Skin::getInstance ();
m_active = active;
m_corner3 = skin->getPls (Skin::PLS_LCBAR);
m_corner4 = skin->getPls (Skin::PLS_RCBAR);
if (active) {
m_corner1 = skin->getPls (Skin::PLS_CORNER_UL_0);
m_corner2 = skin->getPls (Skin::PLS_CORNER_UR_0);
m_titlebar = skin->getPls (Skin::PLS_TBAR_0);
m_tfill = skin->getPls (Skin::PLS_TFILL_0);
m_bfill = skin->getPls (Skin::PLS_BFILL_0);
m_lfill = skin->getPls (Skin::PLS_LFILL_0);
m_rfill = skin->getPls (Skin::PLS_RFILL_0);
m_rfill2 = skin->getPls (Skin::PLS_RFILL2_0);
m_rfill3 = skin->getPls (Skin::PLS_RFILL3_0);
} else {
m_corner1 = skin->getPls (Skin::PLS_CORNER_UL_1);
m_corner2 = skin->getPls (Skin::PLS_CORNER_UR_1);
m_titlebar = skin->getPls (Skin::PLS_TBAR_1);
m_tfill = skin->getPls (Skin::PLS_TFILL_1);
m_bfill = skin->getPls (Skin::PLS_BFILL_1);
m_lfill = skin->getPls (Skin::PLS_LFILL_1);
m_rfill = skin->getPls (Skin::PLS_RFILL_1);
m_rfill2 = skin->getPls (Skin::PLS_RFILL2_1);
m_rfill3 = skin->getPls (Skin::PLS_RFILL3_1);
}
update ();
}
void
PlaylistWidget::mouseDoubleClickEvent (QMouseEvent *event)
{
PlaylistWindow *pw = dynamic_cast<PlaylistWindow *>(window ());
if (event->pos().y() < 14) {
pw->switchDisplay ();
}
}
void
PlaylistWidget::paintEvent (QPaintEvent *event)
{
QPainter paint;
QRect r;
paint.begin (this);
/* drawing the upper left corner */
r.setRect (0, 0,
m_corner1.width(),
m_corner1.height());
paint.drawPixmap (r, m_corner1, m_corner1.rect ());
/* drawing the upper right corner */
r.setRect (width()-m_corner2.width(), 0, m_corner2.width(), m_corner2.height());
paint.drawPixmap (r, m_corner2, m_corner2.rect());
/* Drawing the lower left corner */
r.setRect (0, size().height()-m_corner3.height(),
m_corner3.width(), m_corner3.height());
paint.drawPixmap (r, m_corner3, m_corner3.rect());
/* drawing the lower right corner */
r.setRect (size().width()-m_corner4.width(),
size().height()-m_corner4.height(),
m_corner4.width(),
m_corner4.height());
paint.drawPixmap (r, m_corner4, m_corner4.rect());
/* calculate middle of the bar */
int midx = (size().width()/2) - (m_titlebar.width()/2);
/* Add the titlebar */
r.setRect (midx, 0, m_titlebar.width(), m_titlebar.height());
paint.drawPixmap (r, m_titlebar, m_titlebar.rect());
/* left fill */
r.setRect (m_corner1.width(), 0, midx - m_corner1.width(), m_tfill.height());
paint.drawPixmap (r, m_tfill, m_tfill.rect());
/* Calculate middle pixel to the right side of the titlebar */
int midx2 = midx + m_titlebar.width();
/* right fill */
r.setRect (midx2, 0, width()-midx2-m_corner2.width(), m_tfill.height());
paint.drawPixmap (r, m_tfill, m_tfill.rect());
/* calculate the size of the bottom side */
int bsize = m_corner3.width()+m_corner4.width();
/* if the width is bigger than bottom size we need to pad with
* a bit of generic bottom */
if (size().width() > bsize) {
/* calculate padding width */
int pad_to = size().width() - bsize;
/* Draw the bottom filling */
r.setRect (m_corner3.width(), size().height()-m_bfill.height(),
pad_to, m_bfill.height());
paint.drawPixmap (r, m_bfill, m_bfill.rect());
}
/* The slider bar consists of three elements L|S|R (left, slider, right)
* here we paint L and R and let the slider take care of the rest.
*/
r.setRect (0, m_corner1.height(), m_lfill.width(),
size().height()-m_corner3.height()-m_corner1.height());
paint.drawPixmap (r,m_lfill, m_lfill.rect());
r.setRect (size().width()-m_rfill3.width(), m_corner2.height(), m_rfill3.width(),
size().height()-m_corner2.height()-m_corner3.height());
paint.drawPixmap (r, m_rfill3, m_rfill3.rect());
/* figure out where to place the last padding */
int x = size().width();
x -= m_rfill3.width(); /* minus R */
x -= m_rfill2.width(); /* minus slider */
x -= m_rfill.width(); /* minus L */
r.setRect (x, m_corner2.height(), m_rfill.width(),
size().height()-m_corner2.height()-m_corner3.height());
paint.drawPixmap (r, m_rfill, m_rfill.rect());
paint.end ();
}

143
src/playlist/playlist.h Normal file
View file

@ -0,0 +1,143 @@
#ifndef __PLAYLIST_H__
#define __PLAYLIST_H__
#include "XMMSHandler.h"
#include <QMainWindow>
#include <QFont>
#include <QScrollBar>
class MainWindow;
class PlaylistWidget;
class PlaylistScroller;
#include "Button.h"
class Skin;
//class PlaylistList;
class PlaylistView;
class PlaylistShade;
class PlaylistMenu;
class PlaylistScrollBar : public QScrollBar {
Q_OBJECT
public:
PlaylistScrollBar (QWidget *parent = NULL);
~PlaylistScrollBar () {}
public slots:
void mouseMoveEvent (QMouseEvent *event);
void mousePressEvent (QMouseEvent *event);
void mouseReleaseEvent (QMouseEvent *event);
void paintEvent (QPaintEvent *event);
void setPixmaps (Skin *skin);
private:
int sliderPositionFromValue ();
int sliderValueFromPosition (int position);
int m_sliderOffset;
QPixmap m_pixmap;
QPixmap m_slider;
QPixmap m_slider_down;
};
class dragButton : public Button {
public:
dragButton (QWidget *parent) : Button (parent) {}
~dragButton () {}
void mouseMoveEvent (QMouseEvent *event);
};
class PlaylistWidget : public QWidget {
Q_OBJECT
public:
PlaylistWidget (QWidget *parent);
~PlaylistWidget () {}
void setActive (bool);
void switchDisplay (void);
public slots:
void setPixmaps (Skin *skin);
void menuAddUrl () {}
void menuAddDir ();
void menuAddFile ();
private:
void resizeEvent (QResizeEvent *event);
void paintEvent (QPaintEvent *event);
void mouseDoubleClickEvent (QMouseEvent *event);
void addButtons (void);
void diveDir (const QString &);
QPixmap m_corner1;
QPixmap m_corner2;
QPixmap m_corner3;
QPixmap m_corner4;
QPixmap m_titlebar;
QPixmap m_tfill;
QPixmap m_bfill;
QPixmap m_lfill;
QPixmap m_rfill;
QPixmap m_rfill2;
QPixmap m_rfill3;
bool m_active;
PlaylistView *m_view;
QScrollBar *m_scrollBar;
dragButton *m_drag;
PlaylistMenu *m_add;
PlaylistMenu *m_del;
PlaylistMenu *m_sel;
PlaylistMenu *m_msc;
PlaylistMenu *m_lst;
};
class PlaylistWindow : public QMainWindow {
Q_OBJECT
public:
PlaylistWindow (QWidget *parent);
~PlaylistWindow () {}
void setActive (bool);
void mousePressEvent (QMouseEvent *event);
void mouseMoveEvent (QMouseEvent *event);
void enterEvent (QEvent *event);
void leaveEvent (QEvent *event);
void moveEvent (QMoveEvent *event);
void resizeEvent (QResizeEvent *event);
public slots:
void switchDisplay (void);
void togglePL (void);
private:
PlaylistWidget *m_playlist;
PlaylistShade *m_shaded;
int m_diffx;
int m_diffy;
Button *m_shadebtn;
Button *m_closebtn;
uint getOffset (void);
MainWindow *m_mw;
};
#endif

12
src/playlist/playlist.pri Normal file
View file

@ -0,0 +1,12 @@
HEADERS += playlist.h \
playlistmenu.h \
playlistshade.h \
playlistview.h
SOURCES += playlist.cpp \
playlistmenu.cpp \
playlistshade.cpp \
playlistview.cpp
INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD

View file

@ -0,0 +1,144 @@
#include "playlistmenu.h"
#include <QMouseEvent>
#include <QWidget>
#include <QPoint>
PlaylistMenuButton::PlaylistMenuButton (PlaylistMenu *menu,
uint pix1, uint pix2) : QWidget (menu)
{
m_pixid1 = pix1;
m_pixid2 = pix2;
menu->addButton (this);
m_menu = menu;
setMinimumSize (22, 18);
setMaximumSize (22, 18);
}
PlaylistMenuButton::~PlaylistMenuButton ()
{
m_menu->rmButton (this);
}
void
PlaylistMenuButton::paintEvent (QPaintEvent *event)
{
QPainter p;
p.begin (this);
p.drawPixmap (rect (), m_pixmap, m_pixmap.rect ());
p.end ();
}
void
PlaylistMenuButton::setPixmaps (Skin *skin)
{
m_pixmap1 = skin->getPls (m_pixid1);
m_pixmap2 = skin->getPls (m_pixid2);
m_pixmap = m_pixmap1;
}
PlaylistMenu::PlaylistMenu (QWidget *parent, uint pix,
uint decoration) : PixWidget (parent)
{
setMinimumSize (25, 18);
setMaximumSize (25, 18);
m_expanded = new QWidget (parent);
m_expanded->hide ();
m_decbar = new PlaylistMenuBar (m_expanded, decoration);
m_decbar->move (0, 0);
m_pixid = pix;
}
void
PlaylistMenu::addButton (PlaylistMenuButton *b)
{
int i = m_items.count ();
/* black magic, don't try this at home kids */
b->setParent (m_expanded);
b->move (3, i * 18);
m_items.append (b);
i = m_items.count ();
m_decbar->resize (3, i * 18);
m_expanded->resize (25, i * 18);
}
void
PlaylistMenu::rmButton (PlaylistMenuButton *b)
{
m_items.removeAll (b);
}
void
PlaylistMenu::mousePressEvent (QMouseEvent *event)
{
PlaylistMenuButton *b = m_items.last ();
b->setOver ();
QWidget *w = dynamic_cast<QWidget*>(parent ());
m_expanded->move (pos ().x (),
w->height() - m_expanded->height() - 12);
m_expanded->show ();
}
void
PlaylistMenu::mouseMoveEvent (QMouseEvent *event)
{
int my_y = event->y() + (m_items.count () - 1) * 18;
for (int i = 0; i < m_items.count (); i ++) {
PlaylistMenuButton *b = m_items.value (i);
if (my_y > b->pos().y() &&
my_y < b->pos().y() + 18) {
b->setOver ();
} else {
b->setNoOver ();
}
}
m_expanded->update ();
}
void
PlaylistMenu::mouseReleaseEvent (QMouseEvent *event)
{
int my_y = event->y() + (m_items.count () - 1) * 18;
for (int i = 0; i < m_items.count (); i ++) {
PlaylistMenuButton *b = m_items.value (i);
if (my_y > b->pos().y() &&
my_y < b->pos().y() + 18) {
b->clicked ();
}
}
m_expanded->hide ();
dynamic_cast<QWidget*>(parent ())->update ();
}
void
PlaylistMenu::setPixmaps (Skin *skin)
{
for (int i = 0; i < m_items.count (); i++) {
PlaylistMenuButton *b = m_items.value (i);
if (b) {
b->setPixmaps (skin);
}
}
m_pixmap = skin->getPls (m_pixid);
m_dpixmap = skin->getPls (m_dec);
update ();
}

View file

@ -0,0 +1,85 @@
#ifndef __PLAYLISTMENU_H__
#define __PLAYLISTMENU_H__
class PlaylistMenu;
#include "XMMSHandler.h"
#include "Skin.h"
#include "PixWidget.h"
/*
#include <QWidget>
#include <QPixmap>
*/
class PlaylistMenu;
class PlaylistMenuBar : public PixWidget {
Q_OBJECT
public:
PlaylistMenuBar (QWidget *parent, uint id) : PixWidget (parent)
{
m_id = id;
}
public slots:
void setPixmaps (Skin *skin) { m_pixmap = skin->getPls (m_id); }
private:
uint m_id;
};
class PlaylistMenuButton : public QWidget {
Q_OBJECT
public:
PlaylistMenuButton (PlaylistMenu *, uint pix1, uint pix2);
~PlaylistMenuButton ();
void paintEvent (QPaintEvent *event);
void setPixmaps (Skin *skin);
void setOver (void) { m_pixmap = m_pixmap2; }
void setNoOver (void) { m_pixmap = m_pixmap1; }
void clicked (void) { emit activated (); }
signals:
void activated (void);
private:
uint m_pixid1;
uint m_pixid2;
PlaylistMenu *m_menu;
QPixmap m_pixmap1;
QPixmap m_pixmap2;
QPixmap m_pixmap;
};
class PlaylistMenu : public PixWidget {
Q_OBJECT
public:
PlaylistMenu (QWidget *, uint, uint);
~PlaylistMenu () {}
void addButton (PlaylistMenuButton *b);
void rmButton (PlaylistMenuButton *b);
void mousePressEvent (QMouseEvent *event);
void mouseReleaseEvent (QMouseEvent *event);
void mouseMoveEvent (QMouseEvent *);
public slots:
void setPixmaps (Skin *skin);
private:
uint m_pixid;
uint m_dec;
QPixmap m_dpixmap;
QList<PlaylistMenuButton *> m_items;
QWidget *m_expanded;
PlaylistMenuBar *m_decbar;
};
#endif

View file

@ -0,0 +1,124 @@
#include "XMMSHandler.h"
#include <xmmsclient/xmmsclient++.h>
#include "playlistshade.h"
#include "playlist.h"
#include <QSettings>
PlaylistShade::PlaylistShade (QWidget *parent) : QWidget (parent)
{
QSettings s;
XMMSHandler &xmmsh = XMMSHandler::getInstance ();
if (!s.contains ("playlist/shadedsize"))
s.setValue ("playlist/shadedsize", 8);
Skin *skin = Skin::getInstance ();
setMinimumSize (275, 14);
connect (skin, SIGNAL (skinChanged (Skin *)),
this, SLOT (setPixmaps(Skin *)));
connect (&xmmsh, SIGNAL(currentSong (const Xmms::PropDict &)),
this, SLOT(setMediainfo (const Xmms::PropDict &)));
connect (&xmmsh, SIGNAL(settingsSaved ()),
this, SLOT(settingsSaved ()));
m_text = "Promoe 0.1 - A very neat XMMS2 client";
}
void
PlaylistShade::settingsSaved ()
{
QSettings s;
m_font.setPixelSize (s.value ("playlist/shadedsize").toInt ());
update ();
}
void
PlaylistShade::setMediainfo (const Xmms::PropDict &info)
{
QString n;
if (info.contains ("artist") && info.contains ("album") &&
info.contains ("title")) {
n = QString::fromUtf8 (info.get<std::string> ("artist").c_str ())
+ " - " +
QString::fromUtf8 (info.get<std::string> ("album").c_str ())
+ " - " +
QString::fromUtf8 (info.get<std::string> ("title").c_str ());
} else {
n = QString::fromUtf8 (info.get<std::string> ("url").c_str ());
}
m_text = (n);
update ();
}
void
PlaylistShade::setPixmaps (Skin *skin)
{
QSettings s;
m_pixmap_le = skin->getPls (Skin::PLS_WS_LE_0);
m_pixmap_re_0 = skin->getPls (Skin::PLS_WS_RE_0);
m_pixmap_re_1 = skin->getPls (Skin::PLS_WS_RE_1);
m_pixmap_mid = skin->getPls (Skin::PLS_WS_MID_0);
m_pixmap_re = m_pixmap_re_0;
m_font = QFont (skin->getPLeditValue ("font"));
m_font.setPixelSize (s.value ("playlist/shadedsize").toInt ());
m_color.setNamedColor (skin->getPLeditValue ("normal"));
update ();
}
void
PlaylistShade::setActive (bool b)
{
if (b) {
m_pixmap_re = m_pixmap_re_0;
} else {
m_pixmap_re = m_pixmap_re_1;
}
update ();
}
void
PlaylistShade::mouseDoubleClickEvent (QMouseEvent *event)
{
PlaylistWindow *pw = dynamic_cast<PlaylistWindow*>(window ());
pw->switchDisplay ();
}
void
PlaylistShade::paintEvent (QPaintEvent *event)
{
QRect r;
QPainter p;
p.begin (this);
r.setRect (0, 0, m_pixmap_le.size().width(), m_pixmap_le.size().height());
p.drawPixmap (r, m_pixmap_le, m_pixmap_le.rect());
int s = size().width() - m_pixmap_le.size().width() - m_pixmap_re.size().width();
r.setRect (m_pixmap_le.size().width(), 0, s, m_pixmap_mid.size().height());
p.drawPixmap (r, m_pixmap_mid, m_pixmap_mid.rect ());
r.setRect (size().width() - m_pixmap_re.size().width(), 0, m_pixmap_re.size().width(),
m_pixmap_re.size().height());
p.drawPixmap (r, m_pixmap_re, m_pixmap_re.rect ());
/* Text */
p.setFont (m_font);
p.setPen (m_color);
p.drawText (QRect (5, 4, size().width()-25, 7),
Qt::AlignLeft | Qt::AlignVCenter,
m_text);
p.end ();
}

View file

@ -0,0 +1,40 @@
#ifndef __PLAYLISTSHADE_H__
#define __PLAYLISTSHADE_H__
#include <xmmsclient/xmmsclient++.h>
#include "Skin.h"
#include <QWidget>
#include <QHash>
class PlaylistShade : public QWidget {
Q_OBJECT
public:
PlaylistShade (QWidget *parent);
~PlaylistShade () {}
void paintEvent (QPaintEvent *event);
void mouseDoubleClickEvent (QMouseEvent *event);
void setActive (bool);
public slots:
void setPixmaps (Skin *skin);
void setMediainfo (const Xmms::PropDict &info);
void settingsSaved ();
private:
QPixmap m_pixmap_le;
QPixmap m_pixmap_re;
QPixmap m_pixmap_mid;
QPixmap m_pixmap_re_0;
QPixmap m_pixmap_re_1;
QFont m_font;
QColor m_color;
QString m_text;
// QFontMetrics m_fm;
};
#endif

View file

@ -0,0 +1,242 @@
// TODO might not need those two
#include <xmmsclient/xmmsclient++.h>
#include "XMMSHandler.h"
#include "playlistview.h"
#include "playlistmodel.h"
#include "playlist.h"
#include <QColor>
#include <QMenu>
#include <QPaintEvent>
#include <QPalette>
#include <QSettings>
#include <QSizePolicy>
/*
* PlaylistDelegate
*/
PlaylistDelegate::PlaylistDelegate (QObject *parent) :
QAbstractItemDelegate (parent)
{
}
void
PlaylistDelegate::paint( QPainter *painter, const QStyleOptionViewItem& option,
const QModelIndex &index ) const
{
painter->save ();
/* Set background color */
if ( option.state & QStyle::State_Selected ) {
qDrawPlainRect (painter, option.rect, QColor("#FFFFFF"), 0,
&option.palette.brush (QPalette::Highlight));
}
/* Set forground color */
if ( index.data (PlaylistModel::CurrentEntryRole).toBool () ) {
painter->setPen (option.palette.brush (QPalette::BrightText).color ());
} else {
painter->setPen (option.palette.brush (QPalette::Text).color ());
}
/* generate string */
//TODO Add album and playtime
QVariant tmp;
QString s = QString ("%1. ").arg (index.row () + 1);
tmp = index.data ();
if (tmp.isValid ())
s.append (tmp.toString ()).append (" - ");
QModelIndex m = index.sibling (index.row (), 1);
tmp = m.data ();
if (tmp.isValid ())
s.append (tmp.toString ());
s = option.fontMetrics.elidedText(s, Qt::ElideRight, option.rect.width());
painter->drawText (option.rect, Qt::AlignVCenter, s);
painter->restore ();
}
QSize
PlaylistDelegate::sizeHint ( const QStyleOptionViewItem &option,
const QModelIndex &index ) const
{
/* For QListModel, width must be > 0, but is otherwise */
return QSize (1, option.font.pixelSize () +3);
}
/*
* PlaylistView
*/
PlaylistView::PlaylistView (QWidget *parent) : QListView (parent)
{
QSettings s;
Skin *skin = Skin::getInstance ();
if (!s.contains ("playlist/fontsize"))
s.setValue ("playlist/fontsize", 10);
setAttribute (Qt::WA_NoBackground);
// TODO make drag and drop work
//setDragEnabled(true);
//setAcceptDrops(true);
//setDropIndicatorShown (true);
// end DragandDrop
setFrameStyle(QFrame::NoFrame);
setFocusPolicy (Qt::StrongFocus);
setSelectionMode (QAbstractItemView::ExtendedSelection);
setUniformItemSizes(true);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// TODO make sure delegate gets deleted
setItemDelegate (new PlaylistDelegate (this));
connect (skin, SIGNAL (skinChanged (Skin *)),
this, SLOT (setPixmaps(Skin *)));
m_font = NULL;
m_fontmetrics = NULL;
XMMSHandler &xmmsh = XMMSHandler::getInstance ();
connect (&xmmsh, SIGNAL(settingsSaved()),
this, SLOT(settingsSaved()));
connect (&xmmsh, SIGNAL(playbackStatusChanged(Xmms::Playback::Status)),
this, SLOT(handleStatus(Xmms::Playback::Status)));
}
void
PlaylistView::invertSelection () {
QItemSelection selection = QItemSelection (model ()->index (0, 0),
model ()->index (model ()->rowCount ()-1, 0));
selectionModel ()->select (selection, QItemSelectionModel::Toggle |
QItemSelectionModel::Columns);
selectionModel()->setCurrentIndex(model ()->index (0, 0),
QItemSelectionModel::NoUpdate);
}
void
PlaylistView::cropSelected () {
invertSelection ();
removeSelected ();
selectAll ();
}
void
PlaylistView::removeSelected () {
qobject_cast<PlaylistModel *> (model ())->removeRows (selectedIndexes ());
}
void
PlaylistView::setModel (QAbstractItemModel *model) {
QListView::setModel (model);
setModelColumn(0);
updateGeometry();
}
void
PlaylistView::contextMenuEvent (QContextMenuEvent *e)
{
QMenu qm(this);
QAction *a;
a = new QAction (tr ("Show file info"), this);
a->setShortcut (tr ("Ctrl+Enter"));
// connect (a, SIGNAL (triggered ()), this, SLOT (showMlib ()));
qm.addAction (a);
qm.addSeparator ();
a = new QAction (tr ("Add file"), this);
a->setShortcut (tr ("Ctrl+F"));
qm.addAction (a);
a = new QAction (tr ("Remove selected"), this);
connect (a, SIGNAL (triggered ()), this, SLOT (removeSelected ()));
qm.addAction (a);
qm.addSeparator ();
a = new QAction (tr ("Medialib browser"), this);
qm.addAction (a);
e->accept ();
qm.exec (e->globalPos ());
}
void
PlaylistView::handleStatus (const Xmms::Playback::Status st)
{
m_status = st;
}
void
PlaylistView::settingsSaved ()
{
QSettings s;
m_font->setPixelSize (s.value ("playlist/fontsize").toInt ());
if (m_fontmetrics) {
delete m_fontmetrics;
}
m_fontmetrics = new QFontMetrics (*m_font);
update ();
}
void
PlaylistView::setPixmaps (Skin *skin)
{
QSettings s;
QPalette pal;
QColor c;
c.setNamedColor (skin->getPLeditValue ("normalbg"));
QBrush b (c);
pal.setBrush (QPalette::Window, b);
setPalette (pal);
if (m_font) {
delete m_font;
}
m_font = new QFont (skin->getPLeditValue ("font"));
m_font->setPixelSize (s.value ("playlist/fontsize").toInt ());
if (m_fontmetrics) {
delete m_fontmetrics;
}
m_fontmetrics = new QFontMetrics (*m_font);
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"));
// remove later, in here for testing
setFont(*m_font);
pal.setColor (QPalette::Text, m_color_normal);
pal.setColor (QPalette::BrightText, m_color_active);
pal.setColor (QPalette::Base, m_color_normal_bg);
pal.setColor (QPalette::Highlight, m_color_selected);
setPalette (pal);
update ();
}
void
PlaylistView::mouseDoubleClickEvent (QMouseEvent *event)
{
QModelIndex index = indexAt(event->pos());
if (!index.isValid()) {
return;
}
XMMSHandler &xmmsh = XMMSHandler::getInstance ();
xmmsh.requestTrackChange (index.row());
if (m_status == XMMS_PLAYBACK_STATUS_STOP ||
m_status == XMMS_PLAYBACK_STATUS_PAUSE) {
xmmsh.play ();
}
}

View file

@ -0,0 +1,60 @@
#ifndef __PLAYLISTVIEW_H__
#define __PLAYLISTVIEW_H__
//include "Playlist.h"
#include <xmmsclient/xmmsclient++.h>
#include "Skin.h"
#include <QObject>
#include <QAbstractItemDelegate>
#include <QListView>
#include <QWidget>
class PlaylistDelegate : public QAbstractItemDelegate {
Q_OBJECT
public:
PlaylistDelegate (QObject *parent = NULL);
~PlaylistDelegate () { }
void paint( QPainter * painter, const QStyleOptionViewItem & option,
const QModelIndex & index ) const;
QSize sizeHint ( const QStyleOptionViewItem &option,
const QModelIndex &index ) const;
};
class PlaylistView : public QListView {
Q_OBJECT
public:
PlaylistView (QWidget *parent);
~PlaylistView () {}
void setModel (QAbstractItemModel *model);
public slots:
void contextMenuEvent (QContextMenuEvent *e);
void handleStatus (const Xmms::Playback::Status st);
void invertSelection (void);
void cropSelected (void);
void removeSelected (void);
void settingsSaved (void);
void setPixmaps (Skin *skin);
protected:
void mouseDoubleClickEvent (QMouseEvent *event);
private:
Xmms::Playback::Status m_status;
QFont *m_font;
QFontMetrics *m_fontmetrics;
QColor m_color_active;
QColor m_color_selected;
QColor m_color_normal;
QColor m_color_normal_bg;
};
#endif