diff --git a/PixWidget.cpp b/PixWidget.cpp index 5143a6f..ac44bc2 100644 --- a/PixWidget.cpp +++ b/PixWidget.cpp @@ -1,5 +1,4 @@ #include "MainWindow.h" -#include "PixWidget.h" PixWidget::PixWidget (QWidget *parent) : QWidget (parent) { diff --git a/Playlist.cpp b/Playlist.cpp index 01f2215..d3dc359 100644 --- a/Playlist.cpp +++ b/Playlist.cpp @@ -1,12 +1,15 @@ #include "MainWindow.h" #include "Playlist.h" +#include "PlaylistMenu.h" + #include #include #include #include #include #include +#include PlaylistScrollButton::PlaylistScrollButton (PlaylistScroller *parent, uint normal, uint pressed) : Button (parent, normal, pressed, true) { @@ -98,7 +101,7 @@ PlaylistScroller::paintEvent (QPaintEvent *event) QPainter (paint); paint.begin (this); - paint.drawPixmap (rect (), m_pixmap, m_pixmap.rect ()); + paint.drawPixmap (event->rect (), m_pixmap, m_pixmap.rect ()); paint.end (); } @@ -142,7 +145,8 @@ PlaylistWindow::PlaylistWindow (QWidget *parent) : QMainWindow (parent) } -void PlaylistWindow::togglePL (void) +void +PlaylistWindow::togglePL (void) { m_mw->togglePL(true); } @@ -248,11 +252,107 @@ PlaylistWidget::PlaylistWidget (QWidget *parent) : QWidget (parent) connect (m_list, SIGNAL(sizeChanged(QSize)), this, SLOT(sizeChangedList (QSize))); m_drag = new dragButton (this); + m_drag->resize (30, 30); + + addButtons (); setMinimumSize (275, 116); resize (275, 300); } +void +PlaylistWidget::addButtons (void) +{ + PlaylistMenuButton *b; + + 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 ())); + + + 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); + b = new PlaylistMenuButton (m_del, Skin::PLS_DEL_CRP_0, + Skin::PLS_DEL_CRP_1); + b = new PlaylistMenuButton (m_del, Skin::PLS_DEL_FIL_0, + Skin::PLS_DEL_FIL_1); + + 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); + b = new PlaylistMenuButton (m_sel, Skin::PLS_SEL_NIL_0, + Skin::PLS_SEL_NIL_1); + b = new PlaylistMenuButton (m_sel, Skin::PLS_SEL_ALL_0, + Skin::PLS_SEL_ALL_1); + + 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); + + 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::menuAddDir () +{ + XMMSHandler *xmmsh = XMMSHandler::getInstance(); + QString dir; + dir = QFileDialog::getExistingDirectory (this, "Select files to play", + QDir::homePath ()); + QDir d (dir); + + d.setFilter (QDir::Files); + + QFileInfoList list = d.entryInfoList(); + for (int i = 0; i < list.size(); ++i) { + QFileInfo fileInfo = list.at(i); + QString fname = fileInfo.filePath(); + xmmsh->playlistAddURL ("file://" + fname); + } + +} + +void +PlaylistWidget::menuAddFile () +{ + XMMSHandler *xmmsh = XMMSHandler::getInstance(); + QStringList files; + + files = QFileDialog::getOpenFileNames (NULL, "Select files to play", + QDir::homePath(), + "Music (*.mp3 *.ogg *.flac *.wav *.mpc *.mp4)"); + + for (int i = 0; i < files.count(); i++) { + xmmsh->playlistAddURL ("file://" + files.value(i)); + } + +} + void PlaylistWidget::sizeChangedList (QSize s) { @@ -438,7 +538,12 @@ PlaylistWidget::paintEvent (QPaintEvent *event) /* drag corner */ m_drag->move (size().width()-30, size().height()-30); - m_drag->resize (30, 30); + /* move add menu */ + 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); } diff --git a/Playlist.h b/Playlist.h index e165ef5..1c9ef79 100644 --- a/Playlist.h +++ b/Playlist.h @@ -1,11 +1,14 @@ #ifndef __PLAYLIST_H__ #define __PLAYLIST_H__ +#include "XMMSHandler.h" #include "Skin.h" #include "PlaylistList.h" #include "PixWidget.h" #include "Button.h" #include "PlaylistShade.h" +#include "PlaylistMenu.h" + #include #include @@ -79,10 +82,15 @@ class PlaylistWidget : public QWidget { void doScroll (int); void sizeChangedList (QSize); + void menuAddUrl () {} + void menuAddDir (); + void menuAddFile (); + private: void resizeEvent (QResizeEvent *event); void paintEvent (QPaintEvent *event); void mouseDoubleClickEvent (QMouseEvent *event); + void addButtons (void); QPixmap m_corner1; QPixmap m_corner2; @@ -103,6 +111,12 @@ class PlaylistWidget : public QWidget { PlaylistList *m_list; PlaylistScroller *m_scroller; dragButton *m_drag; + + PlaylistMenu *m_add; + PlaylistMenu *m_del; + PlaylistMenu *m_sel; + PlaylistMenu *m_msc; + PlaylistMenu *m_lst; }; @@ -122,7 +136,6 @@ class PlaylistWindow : public QMainWindow { void moveEvent (QMoveEvent *event); void resizeEvent (QResizeEvent *event); - public slots: void switchDisplay (void); void togglePL (void); diff --git a/PlaylistMenu.cpp b/PlaylistMenu.cpp new file mode 100644 index 0000000..f1c9122 --- /dev/null +++ b/PlaylistMenu.cpp @@ -0,0 +1,144 @@ +#include "PlaylistMenu.h" + +#include +#include +#include + +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(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(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 (); +} diff --git a/PlaylistMenu.h b/PlaylistMenu.h new file mode 100644 index 0000000..0a4274f --- /dev/null +++ b/PlaylistMenu.h @@ -0,0 +1,85 @@ +#ifndef __PLAYLISTMENU_H__ +#define __PLAYLISTMENU_H__ + +class PlaylistMenu; + +#include "XMMSHandler.h" +#include "Skin.h" +#include "PixWidget.h" + +/* +#include +#include +*/ + +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 m_items; + QWidget *m_expanded; + + PlaylistMenuBar *m_decbar; + +}; + +#endif diff --git a/Skin.cpp b/Skin.cpp index dc0c5c0..14c1694 100644 --- a/Skin.cpp +++ b/Skin.cpp @@ -61,6 +61,70 @@ Skin::BuildPlaylist (void) m_playlist[PLS_LCBAR] = img->copy(0, 72, 125, 38); m_playlist[PLS_RCBAR] = img->copy(126, 72, 150, 38); + /* extract the buttons */ + m_playlist[PLS_ADD] = img->copy(11, 80, 25, 18); + m_playlist[PLS_ADD_DEC] = img->copy(48, 111, 3, 54); + m_playlist[PLS_ADD_URL_0] = img->copy(0, 111, 22, 18); + m_playlist[PLS_ADD_URL_1] = img->copy(23, 111, 22, 18); + + m_playlist[PLS_ADD_DIR_0] = img->copy(0, 130, 22, 18); + m_playlist[PLS_ADD_DIR_1] = img->copy(23, 130, 22, 18); + + m_playlist[PLS_ADD_FIL_0] = img->copy(0, 149, 22, 18); + m_playlist[PLS_ADD_FIL_1] = img->copy(23, 149, 22, 18); + + /* Delete buttons */ + m_playlist[PLS_DEL] = img->copy(40, 80, 25, 18); + m_playlist[PLS_DEL_DEC] = img->copy(100, 111, 3, 72); + m_playlist[PLS_DEL_ALL_0] = img->copy(54, 111, 22, 18); + m_playlist[PLS_DEL_ALL_1] = img->copy(77, 111, 22, 18); + + m_playlist[PLS_DEL_CRP_0] = img->copy(54, 130, 22, 18); + m_playlist[PLS_DEL_CRP_1] = img->copy(77, 130, 22, 18); + + m_playlist[PLS_DEL_FIL_0] = img->copy(54, 149, 22, 18); + m_playlist[PLS_DEL_FIL_1] = img->copy(77, 149, 22, 18); + + /* Select buttons */ + m_playlist[PLS_SEL] = img->copy(69, 80, 25, 18); + m_playlist[PLS_SEL_DEC] = img->copy(150, 111, 3, 54); + m_playlist[PLS_SEL_INV_0] = img->copy(104, 111, 22, 18); + m_playlist[PLS_SEL_INV_1] = img->copy(127, 111, 22, 18); + + m_playlist[PLS_SEL_NIL_0] = img->copy(104, 130, 22, 18); + m_playlist[PLS_SEL_NIL_1] = img->copy(127, 130, 22, 18); + + m_playlist[PLS_SEL_ALL_0] = img->copy(104, 149, 22, 18); + m_playlist[PLS_SEL_ALL_1] = img->copy(127, 149, 22, 18); + + /* misc buttons */ + m_playlist[PLS_MSC] = img->copy(98, 80, 25, 18); + m_playlist[PLS_MSC_DEC] = img->copy(200, 111, 3, 54); + m_playlist[PLS_MSC_SRT_0] = img->copy(154, 111, 22, 18); + m_playlist[PLS_MSC_SRT_1] = img->copy(177, 111, 22, 18); + + m_playlist[PLS_MSC_INF_0] = img->copy(154, 130, 22, 18); + m_playlist[PLS_MSC_INF_1] = img->copy(177, 130, 22, 18); + + m_playlist[PLS_MSC_OPT_0] = img->copy(154, 149, 22, 18); + m_playlist[PLS_MSC_OPT_1] = img->copy(177, 149, 22, 18); + + /* list buttons */ + m_playlist[PLS_LST] = img->copy(229, 80, 25, 18); + m_playlist[PLS_LST_DEC] = img->copy(250, 111, 3, 54); + m_playlist[PLS_LST_NEW_0] = img->copy(204, 111, 22, 18); + m_playlist[PLS_LST_NEW_1] = img->copy(227, 111, 22, 18); + + m_playlist[PLS_LST_SAV_0] = img->copy(204, 130, 22, 18); + m_playlist[PLS_LST_SAV_1] = img->copy(227, 130, 22, 18); + + m_playlist[PLS_LST_OPN_0] = img->copy(204, 149, 22, 18); + m_playlist[PLS_LST_OPN_1] = img->copy(227, 149, 22, 18); + + /* misc button */ + m_playlist[PLS_MSC_BTN_0] = img->copy(54, 168, 22, 18); + m_playlist[PLS_MSC_BTN_1] = img->copy(77, 168, 22, 18); + delete img; } diff --git a/Skin.h b/Skin.h index ac8b0a9..6994b6b 100644 --- a/Skin.h +++ b/Skin.h @@ -154,14 +154,18 @@ class Skin : public QWidget PLS_CORNER_UL_1, PLS_CORNER_UR_0, PLS_CORNER_UR_1, + PLS_TBAR_0, PLS_TBAR_1, + PLS_TFILL_0, PLS_TFILL_1, PLS_BFILL_0, PLS_BFILL_1 = PLS_BFILL_0, + PLS_VISMINI_0, PLS_VISMINI_1 = PLS_VISMINI_0, + PLS_LFILL_0, PLS_LFILL_1 = PLS_LFILL_0, PLS_RFILL_0, @@ -170,12 +174,14 @@ class Skin : public QWidget PLS_RFILL2_1 = PLS_RFILL2_0, PLS_RFILL3_0, PLS_RFILL3_1 = PLS_RFILL3_0, + PLS_CLOSE_BTN_0, PLS_CLOSE_BTN_1, PLS_SHADE_BTN_0, PLS_SHADE_BTN_1, PLS_MAX_BTN_0, PLS_MAX_BTN_1, + PLS_SCROLL_0, PLS_SCROLL_1, PLS_WS_LE_0, @@ -185,8 +191,57 @@ class Skin : public QWidget PLS_WS_MID_0, PLS_WS_MID_1 = PLS_WS_MID_0, PLS_LCBAR, - PLS_RCBAR + PLS_RCBAR, + + PLS_MSC_BTN_0, + PLS_MSC_BTN_1, + + PLS_ADD, + PLS_ADD_DEC, + PLS_ADD_URL_0, + PLS_ADD_URL_1, + PLS_ADD_DIR_0, + PLS_ADD_DIR_1, + PLS_ADD_FIL_0, + PLS_ADD_FIL_1, + + PLS_DEL, + PLS_DEL_DEC, + PLS_DEL_ALL_0, + PLS_DEL_ALL_1, + PLS_DEL_CRP_0, + PLS_DEL_CRP_1, + PLS_DEL_FIL_0, + PLS_DEL_FIL_1, + + PLS_SEL, + PLS_SEL_DEC, + PLS_SEL_INV_0, + PLS_SEL_INV_1, + PLS_SEL_NIL_0, + PLS_SEL_NIL_1, + PLS_SEL_ALL_0, + PLS_SEL_ALL_1, + + PLS_MSC, + PLS_MSC_DEC, + PLS_MSC_SRT_0, + PLS_MSC_SRT_1, + PLS_MSC_INF_0, + PLS_MSC_INF_1, + PLS_MSC_OPT_0, + PLS_MSC_OPT_1, + + PLS_LST, + PLS_LST_DEC, + PLS_LST_NEW_0, + PLS_LST_NEW_1, + PLS_LST_SAV_0, + PLS_LST_SAV_1, + PLS_LST_OPN_0, + PLS_LST_OPN_1 }; + private: Skin() {}; static Skin *singleton; diff --git a/promoe.pro b/promoe.pro index ed9c35c..66a8ecc 100644 --- a/promoe.pro +++ b/promoe.pro @@ -23,7 +23,8 @@ SOURCES += XmmsQT4.cpp \ SettingsWindow.cpp \ MediaArtistList.cpp \ MediaAlbumList.cpp \ - MediaSongList.cpp + MediaSongList.cpp \ + PlaylistMenu.cpp HEADERS += XmmsQT4.h \ PixWidget.h \ @@ -50,7 +51,8 @@ HEADERS += XmmsQT4.h \ SettingsWindow.h \ MediaArtistList.h \ MediaAlbumList.h \ - MediaSongList.h + MediaSongList.h \ + PlaylistMenu.h