Change playlist to use Esperanza's playlistmodel
This commit is contained in:
parent
85cf6a8d1c
commit
503385309b
96 changed files with 2010 additions and 412 deletions
171
src/BrowseDialog.cpp
Normal file
171
src/BrowseDialog.cpp
Normal file
|
@ -0,0 +1,171 @@
|
|||
#include "XMMSHandler.h"
|
||||
#include "BrowseModel.h"
|
||||
#include "BrowseDialog.h"
|
||||
|
||||
#include <QDialog>
|
||||
#include <QSettings>
|
||||
#include <QSize>
|
||||
#include <QGridLayout>
|
||||
#include <QLabel>
|
||||
#include <QComboBox>
|
||||
#include <QLineEdit>
|
||||
#include <QPushButton>
|
||||
#include <QToolButton>
|
||||
#include <QTreeView>
|
||||
|
||||
BrowseDialog::BrowseDialog (QWidget *parent) : QDialog (parent)
|
||||
{
|
||||
setSizeGripEnabled(true);
|
||||
QGridLayout *grid = new QGridLayout (this);
|
||||
|
||||
m_list = new QTreeView (this);
|
||||
|
||||
m_model = new BrowseModel (this);
|
||||
m_list->setModel (m_model);
|
||||
m_list->setSelectionMode (QAbstractItemView::ExtendedSelection);
|
||||
m_list->setSelectionBehavior (QAbstractItemView::SelectRows);
|
||||
// m_list->setWrapping (true);
|
||||
m_list->setIndentation (0);
|
||||
//m_list->setResizeMode (QListView::Adjust);
|
||||
m_list->setEditTriggers (QAbstractItemView::EditKeyPressed);
|
||||
m_list->setContextMenuPolicy (Qt::CustomContextMenu);
|
||||
|
||||
m_selections = new QItemSelectionModel (m_model);
|
||||
m_list->setSelectionModel (m_selections);
|
||||
|
||||
connect (m_model, SIGNAL (dirChanged (QString)),
|
||||
this, SLOT (dirChanged(const QString &)));
|
||||
|
||||
grid->addWidget(m_list, 1, 0, 1, 6);
|
||||
connect (m_list, SIGNAL (activated (QModelIndex)),
|
||||
this, SLOT (setPath(const QModelIndex &)));
|
||||
/*
|
||||
QObject::connect(m_list, SIGNAL(customContextMenuRequested(QPoint)),
|
||||
q, SLOT(_q_showContextMenu(QPoint)));
|
||||
*/
|
||||
|
||||
QHBoxLayout *box = new QHBoxLayout;
|
||||
box->setMargin(3);
|
||||
box->setSpacing(3);
|
||||
QSize tools(22, 22);
|
||||
|
||||
QToolButton *toParentButton = new QToolButton (this);
|
||||
toParentButton->setIcon (style ()->standardPixmap (QStyle::SP_FileDialogToParent));
|
||||
toParentButton->setToolTip (tr("Parent Directory"));
|
||||
toParentButton->setAutoRaise (true);
|
||||
toParentButton->setFixedSize (tools);
|
||||
QObject::connect (toParentButton, SIGNAL(clicked ()), this, SLOT (navigateToPrevious ()));
|
||||
box->addWidget(toParentButton);
|
||||
|
||||
QToolButton *listModeButton = new QToolButton (this);
|
||||
listModeButton->setIcon (style ()->standardPixmap (QStyle::SP_FileDialogListView));
|
||||
listModeButton->setToolTip (tr("List View"));
|
||||
listModeButton->setAutoRaise (true);
|
||||
listModeButton->setDown (true);
|
||||
listModeButton->setFixedSize (tools);
|
||||
box->addWidget(listModeButton);
|
||||
|
||||
QToolButton *detailModeButton = new QToolButton (this);
|
||||
detailModeButton->setIcon(style ()->standardPixmap (QStyle::SP_FileDialogDetailedView));
|
||||
detailModeButton->setToolTip (tr("Detail View"));
|
||||
detailModeButton->setAutoRaise (true);
|
||||
detailModeButton->setFixedSize (tools);
|
||||
box->addWidget (detailModeButton);
|
||||
box->setSizeConstraint (QLayout::SetFixedSize);
|
||||
|
||||
grid->addLayout(box, 0, 4, 1, 2);
|
||||
|
||||
QLabel *lookInLabel = new QLabel (tr ("Look in:"), this);
|
||||
grid->addWidget (lookInLabel, 0, 0);
|
||||
|
||||
// push buttons
|
||||
QPushButton *acceptButton = new QPushButton (tr ("Open"), this);
|
||||
QObject::connect(acceptButton, SIGNAL(clicked()), this, SLOT(accept()));
|
||||
grid->addWidget(acceptButton, 2, 5);
|
||||
|
||||
QPushButton *rejectButton = new QPushButton (tr ("Cancel"), this);
|
||||
QObject::connect(rejectButton, SIGNAL(clicked()), this, SLOT(reject()));
|
||||
grid->addWidget(rejectButton, 2, 4);
|
||||
|
||||
m_lookInCombo = new QComboBox (this);
|
||||
m_lookInCombo->setInsertPolicy (QComboBox::NoInsert);
|
||||
m_lookInCombo->setDuplicatesEnabled (false);
|
||||
m_lookInCombo->setEditable (true);
|
||||
m_lookInCombo->setAutoCompletion (false);
|
||||
QObject::connect(m_lookInCombo, SIGNAL(activated(QString)),
|
||||
this, SLOT(setPath(QString)));
|
||||
|
||||
m_lookInEdit = new QLineEdit (m_lookInCombo);
|
||||
m_lookInCombo->setLineEdit (m_lookInEdit);
|
||||
m_lookInCombo->setSizePolicy (QSizePolicy::Expanding, QSizePolicy::Fixed);
|
||||
grid->addWidget (m_lookInCombo, 0, 1, 1, 3);
|
||||
|
||||
QSettings s;
|
||||
if (!s.contains ("browsedialog/path"))
|
||||
s.setValue ("browsedialog/path", "");
|
||||
m_model->setPath (s.value("browsedialog/path").toString ());
|
||||
|
||||
resize(530, 340);
|
||||
}
|
||||
|
||||
QStringList
|
||||
BrowseDialog::getFiles ()
|
||||
{
|
||||
QStringList ret;
|
||||
if (exec () == QDialog::Accepted) {
|
||||
QModelIndexList list = m_selections->selectedIndexes ();
|
||||
for (int i = 0; i < list.size (); i++) {
|
||||
BrowseModelItem *item = m_model->itemByIndex (list.at (i));
|
||||
if (!item)
|
||||
continue;
|
||||
|
||||
if (!item->isDir ())
|
||||
ret.append (item->data("path"));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
BrowseDialog::accept ()
|
||||
{
|
||||
QSettings s;
|
||||
s.setValue ("browsedialog/path", m_model->currentPath ());
|
||||
QDialog::accept ();
|
||||
}
|
||||
|
||||
void
|
||||
BrowseDialog::dirChanged (const QString &path)
|
||||
{
|
||||
m_lookInCombo->insertItem (0, path);
|
||||
m_lookInCombo->setCurrentIndex (0);
|
||||
}
|
||||
|
||||
void
|
||||
BrowseDialog::navigateToPrevious ()
|
||||
{
|
||||
QString dir = m_model->currentPath ();
|
||||
if (dir.endsWith ("/"))
|
||||
m_model->setPath (dir.left (dir.lastIndexOf ("/", -2) + 1));
|
||||
else
|
||||
m_model->setPath (dir.left (dir.lastIndexOf ("/") + 1));
|
||||
}
|
||||
|
||||
void
|
||||
BrowseDialog::setPath (const QModelIndex &index)
|
||||
{
|
||||
XMMSHandler &handler = XMMSHandler::getInstance ();
|
||||
BrowseModelItem *item = m_model->itemByIndex (index);
|
||||
if (item->isDir ()) {
|
||||
m_model->setPath (index);
|
||||
} else {
|
||||
handler.playlistAddURL (item->data("path"));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
BrowseDialog::setPath (const QString &path)
|
||||
{
|
||||
m_model->setPath (path);
|
||||
}
|
||||
|
39
src/BrowseDialog.h
Normal file
39
src/BrowseDialog.h
Normal file
|
@ -0,0 +1,39 @@
|
|||
#ifndef __BROWSEDIALOG_H__
|
||||
#define __BROWSEDIALOG_H__
|
||||
|
||||
#include "BrowseModel.h"
|
||||
|
||||
#include <QDialog>
|
||||
#include <QTreeView>
|
||||
#include <QListView>
|
||||
#include <QGridLayout>
|
||||
#include <QPushButton>
|
||||
#include <QLabel>
|
||||
#include <QComboBox>
|
||||
#include <QLineEdit>
|
||||
#include <QItemSelectionModel>
|
||||
|
||||
class BrowseDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
BrowseDialog (QWidget *parent);
|
||||
|
||||
public slots:
|
||||
void setPath (const QModelIndex &index);
|
||||
void setPath (const QString &path);
|
||||
void navigateToPrevious ();
|
||||
void dirChanged (const QString &path);
|
||||
void accept ();
|
||||
QStringList getFiles ();
|
||||
|
||||
private:
|
||||
QTreeView *m_list;
|
||||
QComboBox *m_lookInCombo;
|
||||
QLineEdit *m_lookInEdit;
|
||||
QLineEdit *m_fileNameEdit;
|
||||
QComboBox *m_fileTypeCombo;
|
||||
BrowseModel *m_model;
|
||||
QItemSelectionModel *m_selections;
|
||||
};
|
||||
#endif
|
193
src/BrowseModel.cpp
Normal file
193
src/BrowseModel.cpp
Normal file
|
@ -0,0 +1,193 @@
|
|||
#include "XMMSHandler.h"
|
||||
#include "BrowseModel.h"
|
||||
|
||||
#include <QAbstractTableModel>
|
||||
#include <QString>
|
||||
#include <QIcon>
|
||||
#include <QWidget>
|
||||
|
||||
|
||||
bool
|
||||
BrowseModelItem::itemCompare (BrowseModelItem *s1, BrowseModelItem *s2)
|
||||
{
|
||||
if (QString::localeAwareCompare (s1->m_vals["name"].toLower (),
|
||||
s2->m_vals["name"].toLower ()) < 0) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
BrowseModel::BrowseModel (QWidget *parent) : QAbstractTableModel ()
|
||||
{
|
||||
m_columns.append ("Name");
|
||||
m_style = parent->style ();
|
||||
m_client = XMMSHandler::getInstance ().getClient ();
|
||||
m_filter_dot = true;
|
||||
//list_root ();
|
||||
}
|
||||
|
||||
BrowseModelItem *
|
||||
BrowseModel::itemByIndex (const QModelIndex &index)
|
||||
{
|
||||
return m_list.at (index.row ());
|
||||
}
|
||||
|
||||
void
|
||||
BrowseModel::setPath (const QModelIndex &index)
|
||||
{
|
||||
BrowseModelItem *item = m_list.at (index.row ());
|
||||
m_client->xform.browse (item->data("path").toStdString ()) (Xmms::bind (&BrowseModel::list_cb, this));
|
||||
m_current_dir = item->data ("path");
|
||||
}
|
||||
|
||||
void
|
||||
BrowseModel::setPath (const QString &path)
|
||||
{
|
||||
if (path.isEmpty())
|
||||
list_root ();
|
||||
|
||||
m_client->xform.browse (path.toStdString ())(
|
||||
Xmms::bind (&BrowseModel::list_cb, this),
|
||||
Xmms::bind (&BrowseModel::list_err, this));
|
||||
m_current_dir = path;
|
||||
}
|
||||
|
||||
void
|
||||
BrowseModel::list_root ()
|
||||
{
|
||||
while (!m_list.isEmpty ()) {
|
||||
delete m_list.takeFirst ();
|
||||
}
|
||||
|
||||
m_list.append (new BrowseModelItem ("file:///", "Files", true));
|
||||
m_list.append (new BrowseModelItem ("daap://", "DAAP", true));
|
||||
emit dirChanged ("");
|
||||
|
||||
reset ();
|
||||
|
||||
m_current_dir = "";
|
||||
}
|
||||
|
||||
bool
|
||||
BrowseModel::list_err (const std::string err)
|
||||
{
|
||||
list_root ();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
BrowseModel::list_cb (const Xmms::List< Xmms::Dict > &res)
|
||||
{
|
||||
while (!m_list.isEmpty ()) {
|
||||
delete m_list.takeFirst ();
|
||||
}
|
||||
|
||||
for (res.first (); res.isValid (); ++res) {
|
||||
Xmms::Dict d = *res;
|
||||
|
||||
if (!d.contains ("path"))
|
||||
continue;
|
||||
|
||||
QString path = QString::fromStdString (d.get<std::string> ("path"));
|
||||
|
||||
QString name;
|
||||
if (d.contains ("name")) {
|
||||
name = QString::fromStdString (d.get<std::string> ("name"));
|
||||
} else {
|
||||
if (d.contains ("title")) {
|
||||
if (d.contains ("artist")) {
|
||||
name += QString::fromStdString (d.get<std::string> ("artist"));
|
||||
name += " - ";
|
||||
}
|
||||
if (d.contains ("album")) {
|
||||
name += QString::fromStdString (d.get<std::string> ("album"));
|
||||
name += " - ";
|
||||
}
|
||||
if (d.contains ("tracknr")) {
|
||||
name += QString::number (d.get<uint32_t>
|
||||
("tracknr")).rightJustified(2, '0');
|
||||
name += " - ";
|
||||
}
|
||||
name += QString::fromStdString (d.get<std::string> ("title"));
|
||||
} else {
|
||||
const char *tmp;
|
||||
QString tmp2 = path.mid (path.lastIndexOf ("/")+1);
|
||||
tmp = xmmsc_result_decode_url (NULL, tmp2.toAscii ());
|
||||
name = QString::fromUtf8 (tmp);
|
||||
free ((char *)tmp);
|
||||
}
|
||||
}
|
||||
|
||||
bool isdir = d.get<int32_t> ("isdir");
|
||||
|
||||
if (m_filter_dot && name.startsWith ("."))
|
||||
// skip these files
|
||||
continue;
|
||||
|
||||
m_list.append (new BrowseModelItem (path, name, isdir));
|
||||
}
|
||||
|
||||
qSort (m_list.begin (), m_list.end (), BrowseModelItem::itemCompare);
|
||||
|
||||
qDebug ("%s", qPrintable(m_list.at(0)->data("name")));
|
||||
|
||||
reset ();
|
||||
|
||||
emit dirChanged (m_current_dir);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* QModel overrides */
|
||||
int
|
||||
BrowseModel::rowCount (const QModelIndex &parent) const
|
||||
{
|
||||
return m_list.size ();
|
||||
}
|
||||
|
||||
int
|
||||
BrowseModel::columnCount (const QModelIndex &parent) const
|
||||
{
|
||||
return m_columns.size ();
|
||||
}
|
||||
|
||||
QVariant
|
||||
BrowseModel::data (const QModelIndex &index,
|
||||
int role) const
|
||||
{
|
||||
if (!index.isValid ())
|
||||
return QVariant ();
|
||||
|
||||
if (index.column () == 0 && role == Qt::DecorationRole)
|
||||
return fileIcon(index);
|
||||
|
||||
if (role != Qt::DisplayRole)
|
||||
return QVariant ();
|
||||
|
||||
QString h = m_columns[index.column ()].toLower ();
|
||||
|
||||
return QVariant (m_list.at (index.row ())->data (h));
|
||||
}
|
||||
|
||||
QVariant
|
||||
BrowseModel::headerData (int section,
|
||||
Qt::Orientation orientation,
|
||||
int role) const
|
||||
{
|
||||
if (role == Qt::DisplayRole)
|
||||
return QVariant (m_columns[section]);
|
||||
return QVariant ();
|
||||
}
|
||||
|
||||
QIcon
|
||||
BrowseModel::fileIcon (const QModelIndex &index) const
|
||||
{
|
||||
if (!index.isValid())
|
||||
return QIcon ();
|
||||
|
||||
BrowseModelItem *item = m_list.at (index.row ());
|
||||
if (item && item->isDir ())
|
||||
return QIcon (m_style->standardPixmap (QStyle::SP_DirClosedIcon));
|
||||
|
||||
return QIcon (m_style->standardPixmap (QStyle::SP_FileIcon));
|
||||
}
|
88
src/BrowseModel.h
Normal file
88
src/BrowseModel.h
Normal file
|
@ -0,0 +1,88 @@
|
|||
#ifndef __BROWSEMODEL_H__
|
||||
#define __BROWSEMODEL_H__
|
||||
|
||||
#include <xmmsclient/xmmsclient++.h>
|
||||
|
||||
#include <QHash>
|
||||
#include <QString>
|
||||
#include <QStyle>
|
||||
#include <QStringList>
|
||||
#include <QAbstractTableModel>
|
||||
|
||||
class BrowseModelItem
|
||||
{
|
||||
public:
|
||||
BrowseModelItem (const QString &path,
|
||||
const QString &name = 0,
|
||||
bool isdir = true)
|
||||
{
|
||||
m_isdir = isdir;
|
||||
m_vals["path"] = path;
|
||||
m_vals["name"] = name;
|
||||
};
|
||||
|
||||
QString data (const QString &key) {
|
||||
return m_vals[key];
|
||||
};
|
||||
|
||||
bool isDir () {
|
||||
return m_isdir;
|
||||
};
|
||||
|
||||
static bool itemCompare (BrowseModelItem *s1, BrowseModelItem *s2);
|
||||
|
||||
protected:
|
||||
QHash<QString, QString> m_vals;
|
||||
bool m_isdir;
|
||||
|
||||
};
|
||||
|
||||
class BrowseModel : public QAbstractTableModel
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
BrowseModel (QWidget *parent);
|
||||
|
||||
QString currentPath () const
|
||||
{
|
||||
return m_current_dir;
|
||||
};
|
||||
|
||||
void setFilterDot (bool b)
|
||||
{
|
||||
m_filter_dot = b;
|
||||
};
|
||||
|
||||
void setPath (const QModelIndex &index);
|
||||
void setPath (const QString &path);
|
||||
BrowseModelItem *itemByIndex (const QModelIndex &index);
|
||||
|
||||
/* QModel overrides */
|
||||
int rowCount (const QModelIndex &parent) const;
|
||||
int columnCount (const QModelIndex &parent) const;
|
||||
QVariant data (const QModelIndex &index,
|
||||
int role = Qt::DisplayRole) const;
|
||||
QVariant headerData (int section,
|
||||
Qt::Orientation orientation,
|
||||
int role = Qt::DisplayRole) const;
|
||||
QIcon fileIcon (const QModelIndex &index) const;
|
||||
|
||||
signals:
|
||||
void dirChanged (QString);
|
||||
|
||||
private:
|
||||
bool list_cb (const Xmms::List< Xmms::Dict > &res);
|
||||
bool list_err (const std::string err);
|
||||
|
||||
void list_root ();
|
||||
|
||||
bool m_filter_dot;
|
||||
|
||||
QList<BrowseModelItem*> m_list;
|
||||
QStringList m_columns;
|
||||
QString m_current_dir;
|
||||
QStyle *m_style;
|
||||
Xmms::Client *m_client;
|
||||
};
|
||||
|
||||
#endif
|
135
src/Button.cpp
Normal file
135
src/Button.cpp
Normal file
|
@ -0,0 +1,135 @@
|
|||
#include "MainWindow.h"
|
||||
#include "Button.h"
|
||||
|
||||
#include "Skin.h"
|
||||
|
||||
#include <QMouseEvent>
|
||||
|
||||
Button::Button (QWidget *parent) : PixWidget (parent)
|
||||
{
|
||||
m_name_normal = 0;
|
||||
m_name_pressed = 0;
|
||||
}
|
||||
|
||||
Button::Button (QWidget *parent, uint normal, uint pressed, bool pls) : PixWidget (parent)
|
||||
{
|
||||
m_name_normal = normal;
|
||||
m_name_pressed = pressed;
|
||||
m_diffx = 0;
|
||||
m_diffy = 0;
|
||||
m_pls = pls;
|
||||
}
|
||||
|
||||
Button::~Button ()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
Button::setPixmaps(Skin *skin)
|
||||
{
|
||||
if (!m_name_normal && !m_name_pressed) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_pls) {
|
||||
m_pixmap_normal = skin->getPls (m_name_normal);
|
||||
m_pixmap_pressed = skin->getPls (m_name_pressed);
|
||||
} else {
|
||||
m_pixmap_normal = skin->getItem (m_name_normal);
|
||||
m_pixmap_pressed = skin->getItem (m_name_pressed);
|
||||
}
|
||||
m_pixmap = m_pixmap_normal;
|
||||
|
||||
if (!m_pixmap_normal || m_pixmap_normal.isNull()) {
|
||||
qDebug ("OPPP! %d return NULL!", m_name_normal);
|
||||
}
|
||||
if (!m_pixmap_pressed || m_pixmap_pressed.isNull()) {
|
||||
qDebug ("OPPP! %d return NULL!", m_name_pressed);
|
||||
}
|
||||
|
||||
setMinimumSize (m_pixmap.size ());
|
||||
setMaximumSize (m_pixmap.size ());
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
void
|
||||
Button::mousePressEvent (QMouseEvent *event)
|
||||
{
|
||||
m_pixmap = m_pixmap_pressed;
|
||||
|
||||
m_diffx = event->pos().x();
|
||||
m_diffy = event->pos().y();
|
||||
|
||||
update ();
|
||||
}
|
||||
|
||||
void
|
||||
Button::mouseReleaseEvent (QMouseEvent *event)
|
||||
{
|
||||
m_pixmap = m_pixmap_normal;
|
||||
update();
|
||||
emit clicked();
|
||||
}
|
||||
|
||||
ToggleButton::ToggleButton (QWidget *parent, uint on_normal, uint on_pressed,
|
||||
uint off_normal, uint off_pressed) :
|
||||
Button (parent, off_normal, off_pressed)
|
||||
{
|
||||
|
||||
m_name_on_normal = on_normal;
|
||||
m_name_on_pressed = on_pressed;
|
||||
m_name_off_normal = off_normal;
|
||||
m_name_off_pressed = off_pressed;
|
||||
m_toggled_on = false;
|
||||
|
||||
connect (this, SIGNAL(clicked()), this, SLOT (toggleOn()));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ToggleButton::setPixmaps(Skin *skin)
|
||||
{
|
||||
m_pixmap_on_normal = skin->getItem(m_name_on_normal);
|
||||
m_pixmap_on_pressed = skin->getItem(m_name_on_pressed);
|
||||
m_pixmap_off_normal = skin->getItem(m_name_off_normal);
|
||||
m_pixmap_off_pressed = skin->getItem(m_name_off_pressed);
|
||||
|
||||
setCurrentPix ();
|
||||
|
||||
setMinimumSize (m_pixmap.size ());
|
||||
setMaximumSize (m_pixmap.size ());
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
void
|
||||
ToggleButton::setCurrentPix ()
|
||||
{
|
||||
if (m_toggled_on) {
|
||||
m_pixmap_normal = m_pixmap_on_normal;
|
||||
m_pixmap_pressed = m_pixmap_on_pressed;
|
||||
} else {
|
||||
m_pixmap_normal = m_pixmap_off_normal;
|
||||
m_pixmap_pressed = m_pixmap_off_pressed;
|
||||
}
|
||||
|
||||
m_pixmap = m_pixmap_normal;
|
||||
}
|
||||
|
||||
void
|
||||
ToggleButton::toggleOn ()
|
||||
{
|
||||
if (!m_toggled_on) {
|
||||
m_toggled_on = true;
|
||||
} else {
|
||||
m_toggled_on = false;
|
||||
}
|
||||
|
||||
setCurrentPix ();
|
||||
update ();
|
||||
}
|
||||
|
||||
ToggleButton::~ToggleButton ()
|
||||
{
|
||||
}
|
67
src/Button.h
Normal file
67
src/Button.h
Normal file
|
@ -0,0 +1,67 @@
|
|||
#ifndef __BUTTON_H__
|
||||
#define __BUTTON_H__
|
||||
|
||||
#include "PixWidget.h"
|
||||
|
||||
class Button : public PixWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
Button (QWidget *parent, uint btn1, uint btn2, bool pls=false);
|
||||
Button (QWidget *parent);
|
||||
~Button ();
|
||||
|
||||
public slots:
|
||||
void setPixmaps (Skin *skin);
|
||||
|
||||
signals:
|
||||
void clicked (void);
|
||||
|
||||
protected:
|
||||
void mousePressEvent (QMouseEvent *event);
|
||||
void mouseReleaseEvent (QMouseEvent *event);
|
||||
void mouseMoveEvent (QMouseEvent *event) {}
|
||||
|
||||
uint m_name_normal;
|
||||
uint m_name_pressed;
|
||||
|
||||
uint m_diffx;
|
||||
uint m_diffy;
|
||||
|
||||
QPixmap m_pixmap_normal;
|
||||
QPixmap m_pixmap_pressed;
|
||||
|
||||
bool m_nodrag;
|
||||
bool m_pls;
|
||||
};
|
||||
|
||||
class ToggleButton : public Button
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ToggleButton (QWidget *parent, uint, uint, uint, uint);
|
||||
~ToggleButton ();
|
||||
|
||||
bool getOn () const { return m_toggled_on; }
|
||||
|
||||
public slots:
|
||||
void setPixmaps(Skin *skin);
|
||||
void toggleOn ();
|
||||
|
||||
private:
|
||||
uint m_name_on_normal;
|
||||
uint m_name_on_pressed;
|
||||
uint m_name_off_normal;
|
||||
uint m_name_off_pressed;
|
||||
|
||||
QPixmap m_pixmap_on_normal;
|
||||
QPixmap m_pixmap_on_pressed;
|
||||
QPixmap m_pixmap_off_normal;
|
||||
QPixmap m_pixmap_off_pressed;
|
||||
|
||||
bool m_toggled_on;
|
||||
|
||||
void setCurrentPix ();
|
||||
};
|
||||
|
||||
#endif
|
62
src/ClutterBar.cpp
Normal file
62
src/ClutterBar.cpp
Normal file
|
@ -0,0 +1,62 @@
|
|||
#include "ClutterBar.h"
|
||||
#include "Skin.h"
|
||||
|
||||
ClutterBar::ClutterBar (QWidget *parent) : PixWidget (parent)
|
||||
{
|
||||
}
|
||||
|
||||
ClutterBar::~ClutterBar ()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ClutterBar::setPixmaps(Skin *skin)
|
||||
{
|
||||
m_clutter_on = skin->getItem(Skin::CLUTTER_ON);
|
||||
m_clutter_off = skin->getItem(Skin::CLUTTER_OFF);
|
||||
|
||||
m_clutter_o = skin->getItem(Skin::CLUTTER_O);
|
||||
m_clutter_a = skin->getItem(Skin::CLUTTER_A);
|
||||
m_clutter_i = skin->getItem(Skin::CLUTTER_I);
|
||||
m_clutter_d = skin->getItem(Skin::CLUTTER_D);
|
||||
m_clutter_v = skin->getItem(Skin::CLUTTER_V);
|
||||
|
||||
m_pixmap = m_clutter_on;
|
||||
|
||||
setMinimumSize (m_clutter_on.size ());
|
||||
setMaximumSize (m_clutter_on.size ());
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
void
|
||||
ClutterBar::mousePressEvent (QMouseEvent *event)
|
||||
{
|
||||
int y = event->pos().y();
|
||||
|
||||
if (y > 2 && y < 11) {
|
||||
m_pixmap = m_clutter_o;
|
||||
} else if (y > 10 && y < 19) {
|
||||
m_pixmap = m_clutter_a;
|
||||
} else if (y > 18 && y < 27) {
|
||||
m_pixmap = m_clutter_i;
|
||||
} else if (y > 26 && y < 35) {
|
||||
m_pixmap = m_clutter_d;
|
||||
} else if (y > 34 && y < 43) {
|
||||
m_pixmap = m_clutter_v;
|
||||
}
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
void
|
||||
ClutterBar::mouseReleaseEvent (QMouseEvent *event)
|
||||
{
|
||||
m_pixmap = m_clutter_on;
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
|
||||
|
36
src/ClutterBar.h
Normal file
36
src/ClutterBar.h
Normal file
|
@ -0,0 +1,36 @@
|
|||
#ifndef __CLUTTERBAR_H__
|
||||
#define __CLUTTERBAR_H__
|
||||
|
||||
#include <QMouseEvent>
|
||||
#include "PixWidget.h"
|
||||
|
||||
class ClutterBar : public PixWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ClutterBar (QWidget *parent);
|
||||
~ClutterBar ();
|
||||
|
||||
public slots:
|
||||
void setPixmaps(Skin *skin);
|
||||
|
||||
protected:
|
||||
void mousePressEvent (QMouseEvent *event);
|
||||
void mouseReleaseEvent (QMouseEvent *event);
|
||||
|
||||
QPixmap m_clutter_off;
|
||||
QPixmap m_clutter_on;
|
||||
|
||||
QPixmap m_clutter_o;
|
||||
QPixmap m_clutter_a;
|
||||
QPixmap m_clutter_i;
|
||||
QPixmap m_clutter_d;
|
||||
QPixmap m_clutter_v;
|
||||
|
||||
bool enabled;
|
||||
|
||||
int m_ypos;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
77
src/Display.cpp
Normal file
77
src/Display.cpp
Normal file
|
@ -0,0 +1,77 @@
|
|||
#include "MainWindow.h"
|
||||
#include "Display.h"
|
||||
|
||||
#include "TitleBar.h"
|
||||
|
||||
#include "FileDialog.h"
|
||||
|
||||
SkinDisplay::SkinDisplay (QWidget *parent) : QWidget(parent)
|
||||
{
|
||||
Skin *skin = Skin::getInstance ();
|
||||
|
||||
m_mw = parent;
|
||||
|
||||
connect (skin, SIGNAL (skinChanged (Skin *)),
|
||||
this, SLOT (setPixmaps (Skin *)));
|
||||
}
|
||||
|
||||
void
|
||||
SkinDisplay::setPixmaps (Skin *skin)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
SkinDisplay::mousePressEvent (QMouseEvent *event)
|
||||
{
|
||||
dynamic_cast<MainWindow *>(getMW())->raisePL ();
|
||||
m_diffX = event->x();
|
||||
m_diffY = event->y();
|
||||
}
|
||||
|
||||
void
|
||||
SkinDisplay::mouseMoveEvent (QMouseEvent *event)
|
||||
{
|
||||
m_mw->move (event->globalPos().x() - m_diffX,
|
||||
event->globalPos().y() - m_diffY);
|
||||
}
|
||||
|
||||
void
|
||||
SkinDisplay::enterEvent (QEvent *event)
|
||||
{
|
||||
dynamic_cast<TitleBar *>(m_tbar)->setActive(true);
|
||||
}
|
||||
|
||||
void
|
||||
SkinDisplay::leaveEvent (QEvent *event)
|
||||
{
|
||||
dynamic_cast<TitleBar *>(m_tbar)->setActive(false);
|
||||
}
|
||||
|
||||
void
|
||||
SkinDisplay::paintEvent (QPaintEvent *event)
|
||||
{
|
||||
QPainter(paint);
|
||||
|
||||
paint.begin(this);
|
||||
paint.eraseRect(rect());
|
||||
paint.end();
|
||||
}
|
||||
|
||||
void
|
||||
SkinDisplay::fileOpen (void)
|
||||
{
|
||||
FileDialog fd (this, "main_addfiles");
|
||||
QStringList files;
|
||||
|
||||
files = fd.getFiles ();
|
||||
|
||||
XMMSHandler &xmmsh = XMMSHandler::getInstance();
|
||||
if (files.count() > 0) {
|
||||
xmmsh.playlistClear ();
|
||||
}
|
||||
|
||||
for (int i = 0; i < files.count(); i++) {
|
||||
xmmsh.playlistAddURL ("file://" + files.value(i));
|
||||
}
|
||||
}
|
||||
|
40
src/Display.h
Normal file
40
src/Display.h
Normal file
|
@ -0,0 +1,40 @@
|
|||
#ifndef __SKINDISPLAY_H__
|
||||
#define __SKINDISPLAY_H__
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <QPixmap>
|
||||
#include <QPainter>
|
||||
#include <QWidget>
|
||||
#include <QHash>
|
||||
#include <QMouseEvent>
|
||||
#include <QPaintEvent>
|
||||
|
||||
#include "Skin.h"
|
||||
|
||||
class SkinDisplay : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
SkinDisplay (QWidget *parent);
|
||||
QWidget *getMW () const { return m_mw; }
|
||||
|
||||
public slots:
|
||||
virtual void setPixmaps(Skin *skin);
|
||||
void fileOpen (void);
|
||||
|
||||
protected:
|
||||
void mousePressEvent (QMouseEvent *);
|
||||
void mouseMoveEvent (QMouseEvent *);
|
||||
void paintEvent (QPaintEvent *event);
|
||||
void enterEvent (QEvent *event);
|
||||
void leaveEvent (QEvent *event);
|
||||
|
||||
QWidget *m_mw;
|
||||
QWidget *m_tbar;
|
||||
|
||||
int m_diffX;
|
||||
int m_diffY;
|
||||
};
|
||||
|
||||
#endif
|
122
src/Equalizer.cpp
Normal file
122
src/Equalizer.cpp
Normal file
|
@ -0,0 +1,122 @@
|
|||
#include "MainWindow.h"
|
||||
#include "TitleBar.h"
|
||||
#include "Equalizer.h"
|
||||
#include "Button.h"
|
||||
#include "VolumeSlider.h"
|
||||
|
||||
EqualizerWindow::EqualizerWindow (QWidget *parent) : QMainWindow (parent)
|
||||
{
|
||||
m_mw = dynamic_cast<MainWindow *>(parent);
|
||||
|
||||
setWindowFlags (Qt::Dialog | Qt::FramelessWindowHint);
|
||||
setAttribute (Qt::WA_DeleteOnClose);
|
||||
|
||||
m_equalizer = new EqualizerWidget (this);
|
||||
m_equalizer->show();
|
||||
|
||||
setCentralWidget (m_equalizer);
|
||||
|
||||
setMinimumSize (275, 116);
|
||||
setMaximumSize (275, 116);
|
||||
}
|
||||
|
||||
EqualizerWindow::~EqualizerWindow (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
EqualizerWindow::setEnabled (void)
|
||||
{
|
||||
qDebug ("test");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
EqualizerWindow::mousePressEvent (QMouseEvent *event)
|
||||
{
|
||||
m_diffx = event->pos().x();
|
||||
m_diffy = event->pos().y();
|
||||
}
|
||||
|
||||
void
|
||||
EqualizerWindow::mouseMoveEvent (QMouseEvent *event)
|
||||
{
|
||||
move(event->globalPos().x() - m_diffx,
|
||||
event->globalPos().y() - m_diffy);
|
||||
}
|
||||
|
||||
void
|
||||
EqualizerWindow::moveEvent (QMoveEvent *event)
|
||||
{
|
||||
QSettings s;
|
||||
s.setValue ("equalizer/pos", pos ());
|
||||
}
|
||||
|
||||
EqualizerWidget::EqualizerWidget (QWidget *parent) : QWidget (parent)
|
||||
{
|
||||
Skin *skin = Skin::getInstance ();
|
||||
|
||||
connect (skin, SIGNAL(skinChanged(Skin *)),
|
||||
this, SLOT(setPixmaps(Skin *)));
|
||||
|
||||
m_enable = new ToggleButton(this, Skin::EQ_WIN_ON_0, Skin::EQ_WIN_ON_1,
|
||||
Skin::EQ_WIN_OFF_0, Skin::EQ_WIN_OFF_1);
|
||||
m_enable->move(14, 18);
|
||||
|
||||
connect(m_enable, SIGNAL(clicked()), parent, SLOT(setEnabled()));
|
||||
|
||||
m_auto = new ToggleButton(this, Skin::EQ_WIN_AUTO_ON_0, Skin::EQ_WIN_AUTO_ON_1,
|
||||
Skin::EQ_WIN_AUTO_OFF_0, Skin::EQ_WIN_AUTO_OFF_1);
|
||||
m_auto->move(39, 18);
|
||||
|
||||
connect(m_auto, SIGNAL(clicked()), parent, SLOT(setEnabled()));
|
||||
|
||||
m_preset = new Button(this, Skin::EQ_WIN_PRESET_0, Skin::EQ_WIN_PRESET_1);
|
||||
m_preset->move(217, 18);
|
||||
|
||||
connect(m_preset, SIGNAL(clicked()), parent, SLOT(setEnabled()));
|
||||
|
||||
m_preamp = new Slider(this, Skin::EQ_WIN_BAR_POS_0, Skin::EQ_WIN_BAR_POS_27,
|
||||
Skin::EQ_WIN_BAR_BTN_0, Skin::EQ_WIN_BAR_BTN_1, -20, 20);
|
||||
m_preamp->move(21, 38);
|
||||
|
||||
for (int i=0; i < 10; i++) {
|
||||
m_bands[i] = new Slider(this, Skin::EQ_WIN_BAR_POS_0, Skin::EQ_WIN_BAR_POS_27,
|
||||
Skin::EQ_WIN_BAR_BTN_0, Skin::EQ_WIN_BAR_BTN_1, -20, 20);
|
||||
m_bands[i]->move(78+i*18, 38);
|
||||
}
|
||||
}
|
||||
|
||||
EqualizerWidget::~EqualizerWidget (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
EqualizerWidget::setPixmaps (Skin *skin)
|
||||
{
|
||||
m_pixmap = skin->getItem(Skin::EQ_WIN_BG);
|
||||
m_graph = skin->getItem(Skin::EQ_WIN_GRAPH_BG);
|
||||
|
||||
setMinimumSize (m_pixmap.size ());
|
||||
setMaximumSize (m_pixmap.size ());
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
void
|
||||
EqualizerWidget::paintEvent (QPaintEvent *event)
|
||||
{
|
||||
if (m_pixmap.isNull ()) {
|
||||
return;
|
||||
}
|
||||
QPainter(paint);
|
||||
QRect r;
|
||||
|
||||
paint.begin(this);
|
||||
|
||||
paint.drawPixmap(rect(), m_pixmap, m_pixmap.rect());
|
||||
r.setRect(86, 17, 113, 19);
|
||||
paint.drawPixmap(r, m_graph, m_graph.rect());
|
||||
|
||||
paint.end();
|
||||
}
|
62
src/Equalizer.h
Normal file
62
src/Equalizer.h
Normal file
|
@ -0,0 +1,62 @@
|
|||
#ifndef __EQUALIZER_H__
|
||||
#define __EQUALIZER_H__
|
||||
|
||||
class Skin;
|
||||
class Button;
|
||||
class MainWindow;
|
||||
class TitleBar;
|
||||
class ToggleButton;
|
||||
class Slider;
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <QPixmap>
|
||||
#include <QWidget>
|
||||
#include <QMouseEvent>
|
||||
#include <QPaintEvent>
|
||||
#include <QMainWindow>
|
||||
|
||||
#include "Display.h"
|
||||
|
||||
class EqualizerWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
EqualizerWidget(QWidget *parent);
|
||||
~EqualizerWidget();
|
||||
void paintEvent (QPaintEvent *event);
|
||||
|
||||
public slots:
|
||||
void setPixmaps(Skin *skin);
|
||||
private:
|
||||
QPixmap m_pixmap;
|
||||
QPixmap m_graph;
|
||||
ToggleButton *m_enable;
|
||||
ToggleButton *m_auto;
|
||||
Button *m_preset;
|
||||
Slider *m_preamp;
|
||||
Slider *m_bands[10];
|
||||
};
|
||||
|
||||
class EqualizerWindow : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
EqualizerWindow(QWidget *parent);
|
||||
~EqualizerWindow();
|
||||
void mouseMoveEvent(QMouseEvent *);
|
||||
void mousePressEvent(QMouseEvent *);
|
||||
void moveEvent(QMoveEvent *event);
|
||||
|
||||
public slots:
|
||||
void setEnabled (void);
|
||||
|
||||
private:
|
||||
MainWindow *m_mw;
|
||||
EqualizerWidget *m_equalizer;
|
||||
int m_diffx;
|
||||
int m_diffy;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
43
src/FileDialog.cpp
Normal file
43
src/FileDialog.cpp
Normal file
|
@ -0,0 +1,43 @@
|
|||
#include "FileDialog.h"
|
||||
|
||||
#include <QSettings>
|
||||
#include <QFileDialog>
|
||||
#include <QString>
|
||||
|
||||
|
||||
FileDialog::FileDialog (QWidget *parent, const QString &name) : QFileDialog (parent)
|
||||
{
|
||||
QSettings s;
|
||||
m_name = name;
|
||||
|
||||
if (!s.contains("filedialog/" + name))
|
||||
s.setValue ("filedialog/" + name, QDir::homePath ());
|
||||
|
||||
setDirectory (s.value("filedialog/" + name).toString ());
|
||||
}
|
||||
|
||||
QStringList
|
||||
FileDialog::getFiles ()
|
||||
{
|
||||
QSettings s;
|
||||
QStringList ret = getOpenFileNames (NULL, "Choose files");
|
||||
if (ret.size() > 0)
|
||||
s.setValue ("filedialog/" + m_name, directory ().absolutePath ());
|
||||
|
||||
qSort (ret);
|
||||
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
QString
|
||||
FileDialog::getDirectory ()
|
||||
{
|
||||
QSettings s;
|
||||
QString ret = getExistingDirectory (NULL, "Choose directory");
|
||||
if (!ret.isNull())
|
||||
s.setValue ("filedialog/" + m_name, directory ().absolutePath ());
|
||||
|
||||
return ret;
|
||||
|
||||
}
|
19
src/FileDialog.h
Normal file
19
src/FileDialog.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
#ifndef __FILEDIALOG_H__
|
||||
#define __FILEDIALOG_H__
|
||||
|
||||
#include <QFileDialog>
|
||||
|
||||
class FileDialog : public QFileDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
FileDialog (QWidget *parent, const QString &name);
|
||||
QString getDirectory ();
|
||||
QStringList getFiles ();
|
||||
|
||||
private:
|
||||
QString m_name;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
281
src/MainDisplay.cpp
Normal file
281
src/MainDisplay.cpp
Normal file
|
@ -0,0 +1,281 @@
|
|||
#include <xmmsclient/xmmsclient++.h>
|
||||
#include "XMMSHandler.h"
|
||||
#include "MainDisplay.h"
|
||||
#include "MainWindow.h"
|
||||
|
||||
#include "TitleBar.h"
|
||||
#include "Button.h"
|
||||
#include "TextBar.h"
|
||||
#include "NumberDisplay.h"
|
||||
#include "TimeDisplay.h"
|
||||
#include "SmallNumberDisplay.h"
|
||||
#include "StereoMono.h"
|
||||
#include "PosBar.h"
|
||||
#include "PlayStatus.h"
|
||||
#include "VolumeSlider.h"
|
||||
#include "Playlist.h"
|
||||
#include "ClutterBar.h"
|
||||
|
||||
#include <QFileDialog>
|
||||
#include <QSettings>
|
||||
|
||||
MainDisplay::MainDisplay (QWidget *parent) : SkinDisplay(parent)
|
||||
{
|
||||
m_tbar = new TitleBar(this, false);
|
||||
m_tbar->move(0, 0);
|
||||
m_tbar->resize(275, 14);
|
||||
|
||||
m_mw = dynamic_cast<MainWindow *>(parent);
|
||||
|
||||
SetupPushButtons ();
|
||||
SetupToggleButtons ();
|
||||
|
||||
m_text = new TextScroller (this, 154, 10, "main");
|
||||
m_text->move (112, 25);
|
||||
|
||||
m_time = new TimeDisplay(this, 0);
|
||||
connect (m_time, SIGNAL(clicked()), this, SLOT(toggleTime()));
|
||||
|
||||
m_kbps = new SmallNumberDisplay (this, 15);
|
||||
m_kbps->move (111, 43);
|
||||
m_kbps->setNumber (128, 3);
|
||||
|
||||
m_khz = new SmallNumberDisplay (this, 10);
|
||||
m_khz->move (156, 43);
|
||||
m_khz->setNumber (44, 2);
|
||||
|
||||
m_stereo = new StereoMono (this);
|
||||
m_stereo->move (212, 41);
|
||||
m_stereo->setStereoMono (0, 0);
|
||||
|
||||
m_clutterbar = new ClutterBar (this);
|
||||
m_clutterbar->move (10, 22);
|
||||
|
||||
m_posbar = new PosBar (this, Skin::POSBAR,
|
||||
Skin::POSBAR_BTN_0,
|
||||
Skin::POSBAR_BTN_1);
|
||||
m_posbar->move (16, 72);
|
||||
|
||||
m_playstatus = new PlayStatus (this);
|
||||
m_playstatus->move (24, 28);
|
||||
|
||||
m_vslider = new Slider(this, Skin::VOLUMEBAR_POS_0, Skin::VOLUMEBAR_POS_27,
|
||||
Skin::VOLBAR_BTN_0, Skin::VOLBAR_BTN_1, 0, 100);
|
||||
m_vslider->move (107, 57);
|
||||
|
||||
m_bslider = new Slider(this, Skin::BALANCE_POS_0, Skin::BALANCE_POS_27,
|
||||
Skin::BALANCE_BTN_0, Skin::BALANCE_BTN_1, -20, 20);
|
||||
m_bslider->move (177, 57);
|
||||
|
||||
XMMSHandler &xmmsh = XMMSHandler::getInstance ();
|
||||
connect (&xmmsh, SIGNAL(currentSong (const Xmms::PropDict &)),
|
||||
this, SLOT(setMediainfo (const Xmms::PropDict &)));
|
||||
connect (&xmmsh, SIGNAL(playbackStatusChanged(Xmms::Playback::Status)),
|
||||
this, SLOT(setStatus(Xmms::Playback::Status)));
|
||||
// connect (&xmmsh, SIGNAL(playtimeChanged(uint)),
|
||||
// this, SLOT(setPlaytime(uint)));
|
||||
connect (xmmsh.cache () , SIGNAL (playtime (uint32_t)),
|
||||
this, SLOT (setPlaytime (uint32_t)));
|
||||
connect (&xmmsh, SIGNAL(getVolume(uint)), this, SLOT(updateVolume(uint)));
|
||||
connect (m_vslider, SIGNAL(valueChanged(int)), this, SLOT(setVolume(int)));
|
||||
xmmsh.volumeGet();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
MainDisplay::updateVolume (uint volume)
|
||||
{
|
||||
m_vslider->setValue((int)volume);
|
||||
}
|
||||
|
||||
void
|
||||
MainDisplay::setVolume (int volume)
|
||||
{
|
||||
XMMSHandler &xmmsh = XMMSHandler::getInstance();
|
||||
xmmsh.volumeSet((uint)volume);
|
||||
}
|
||||
|
||||
void
|
||||
MainDisplay::mouseMoveEvent (QMouseEvent *event)
|
||||
{
|
||||
MainWindow *mw = dynamic_cast<MainWindow *>(window ());
|
||||
PlaylistWindow *pl = mw->getPL ();
|
||||
|
||||
m_mw->move (event->globalPos().x() - m_diffX,
|
||||
event->globalPos().y() - m_diffY);
|
||||
|
||||
if (!pl || !pl->isVisible ())
|
||||
return;
|
||||
|
||||
pl->move (event->globalPos().x() - m_diffX,
|
||||
event->globalPos().y() - m_diffY + size().height());
|
||||
}
|
||||
|
||||
void
|
||||
MainDisplay::setPixmaps (Skin *skin)
|
||||
{
|
||||
QPalette palette = QPalette();
|
||||
QBrush brush = QBrush(skin->getItem(Skin::MAIN_WINDOW));
|
||||
palette.setBrush(QPalette::Background, brush);
|
||||
setPalette(palette);
|
||||
|
||||
setMaximumSize(QSize(275, 116));
|
||||
setMinimumSize(QSize(275, 116));
|
||||
}
|
||||
|
||||
void
|
||||
MainDisplay::setStatus (Xmms::Playback::Status status)
|
||||
{
|
||||
if (status == Xmms::Playback::STOPPED) {
|
||||
m_time->setTime(0);
|
||||
m_posbar->setPos (0);
|
||||
m_posbar->hideBar (true);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MainDisplay::setPlaytime (uint32_t time)
|
||||
{
|
||||
uint32_t showtime;
|
||||
if (m_mw->isTimemodeReverse()) {
|
||||
uint maxtime = m_posbar->getMax();
|
||||
showtime = -(maxtime - time);
|
||||
} else {
|
||||
showtime = time;
|
||||
}
|
||||
m_time->setTime (showtime);
|
||||
|
||||
// update slider
|
||||
m_posbar->setPos (time);
|
||||
}
|
||||
|
||||
void
|
||||
MainDisplay::setMediainfo (const Xmms::PropDict &info)
|
||||
{
|
||||
QString n;
|
||||
if (info.contains ("title")) {
|
||||
if (info.contains ("artist")) {
|
||||
n = QString::fromUtf8 (info.get<std::string> ("artist").c_str ()) + " - ";
|
||||
}
|
||||
if (info.contains ("album")) {
|
||||
n += QString::fromUtf8 (info.get<std::string> ("album").c_str ()) + " - ";
|
||||
}
|
||||
n += QString::fromUtf8 (info.get<std::string> ("title").c_str ());
|
||||
} else if (info.contains ("channel")) {
|
||||
n = QString::fromUtf8 (info.get<std::string> ("channel").c_str ()) + " - " +
|
||||
QString::fromUtf8 (info.get<std::string> ("title").c_str ());
|
||||
} else {
|
||||
n = QString::fromUtf8 (info.get<std::string> ("url").c_str ());
|
||||
n = n.section ("/", -1);
|
||||
}
|
||||
m_text->setText (n);
|
||||
|
||||
if (info.contains ("bitrate")) {
|
||||
m_kbps->setNumber (info.get<int32_t> ("bitrate")/1000, 3);
|
||||
} else {
|
||||
m_kbps->setNumber (0, 1);
|
||||
}
|
||||
|
||||
if (info.contains ("samplerate")) {
|
||||
m_khz->setNumber (info.get<int32_t> ("samplerate")/1000, 2);
|
||||
} else {
|
||||
m_khz->setNumber(0, 1);
|
||||
}
|
||||
if (info.contains ("channels:in") &&
|
||||
info.get<int32_t> ("channels:in") > 1) {
|
||||
m_stereo->setStereoMono (1, 0);
|
||||
} else {
|
||||
m_stereo->setStereoMono (0, 1);
|
||||
}
|
||||
|
||||
if (info.contains ("duration")) {
|
||||
m_posbar->setMax (info.get<int32_t> ("duration"));
|
||||
m_posbar->hideBar (false);
|
||||
} else {
|
||||
m_posbar->hideBar (true);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MainDisplay::SetupToggleButtons (void)
|
||||
{
|
||||
QSettings s;
|
||||
|
||||
m_pls = new ToggleButton (this, Skin::PLS_ON_0, Skin::PLS_ON_1,
|
||||
Skin::PLS_OFF_0, Skin::PLS_OFF_1);
|
||||
m_pls->move(242, 58);
|
||||
if (!s.value ("playlist/hidden").toBool ())
|
||||
m_pls->toggleOn ();
|
||||
|
||||
connect (m_pls, SIGNAL(clicked()), this, SLOT(togglePL()));
|
||||
|
||||
m_eq = new ToggleButton (this, Skin::EQ_ON_0, Skin::EQ_ON_1,
|
||||
Skin::EQ_OFF_0, Skin::EQ_OFF_1);
|
||||
m_eq->move(219, 58);
|
||||
if (!s.value ("equalizer/hidden").toBool ())
|
||||
m_pls->toggleOn ();
|
||||
|
||||
connect (m_eq, SIGNAL(clicked()), this, SLOT(toggleEQ()));
|
||||
|
||||
m_shuffle = new ToggleButton (this, Skin::SHUFFLE_ON_0, Skin::SHUFFLE_ON_1,
|
||||
Skin::SHUFFLE_OFF_0, Skin::SHUFFLE_OFF_1);
|
||||
m_shuffle->move(164, 89);
|
||||
|
||||
m_repeat = new ToggleButton (this, Skin::REPEAT_ON_0, Skin::REPEAT_ON_1,
|
||||
Skin::REPEAT_OFF_0, Skin::REPEAT_OFF_1);
|
||||
m_repeat->move(210, 89);
|
||||
}
|
||||
|
||||
void
|
||||
MainDisplay::togglePL (void)
|
||||
{
|
||||
m_mw->togglePL(false);
|
||||
}
|
||||
|
||||
void
|
||||
MainDisplay::toggleEQ (void)
|
||||
{
|
||||
m_mw->toggleEQ(false);
|
||||
}
|
||||
|
||||
void
|
||||
MainDisplay::toggleTime (void)
|
||||
{
|
||||
m_mw->setTimemodeReverse (!m_mw->isTimemodeReverse());
|
||||
}
|
||||
|
||||
void
|
||||
MainDisplay::SetupPushButtons (void)
|
||||
{
|
||||
XMMSHandler &xmmsh = XMMSHandler::getInstance ();
|
||||
|
||||
/* Normal buttons */
|
||||
m_prev = new Button (this, Skin::BTN_PREV_0, Skin::BTN_PREV_1);
|
||||
m_prev->move(16, 88);
|
||||
connect (m_prev, SIGNAL(clicked()), &xmmsh, SLOT(prev()));
|
||||
|
||||
m_play = new Button (this, Skin::BTN_PLAY_0, Skin::BTN_PLAY_1);
|
||||
m_play->move(39, 88);
|
||||
connect (m_play, SIGNAL(clicked()), &xmmsh, SLOT(play()));
|
||||
|
||||
m_pause = new Button (this, Skin::BTN_PAUSE_0, Skin::BTN_PAUSE_1);
|
||||
m_pause->move(62, 88);
|
||||
connect (m_pause, SIGNAL(clicked()), &xmmsh, SLOT(pause()));
|
||||
|
||||
m_stop = new Button (this, Skin::BTN_STOP_0, Skin::BTN_STOP_1);
|
||||
m_stop->move(85, 88);
|
||||
connect (m_stop, SIGNAL(clicked()), &xmmsh, SLOT(stop()));
|
||||
|
||||
m_next = new Button (this, Skin::BTN_NEXT_0, Skin::BTN_NEXT_1);
|
||||
m_next->move(108, 88);
|
||||
connect (m_next, SIGNAL(clicked()), &xmmsh, SLOT(next()));
|
||||
|
||||
m_eject = new Button (this, Skin::BTN_EJECT_0, Skin::BTN_EJECT_1);
|
||||
m_eject->move(136, 89);
|
||||
connect (m_eject, SIGNAL(clicked()), this, SLOT(fileOpen()));
|
||||
|
||||
}
|
||||
|
||||
MainDisplay::~MainDisplay (void)
|
||||
{
|
||||
}
|
103
src/MainDisplay.h
Normal file
103
src/MainDisplay.h
Normal file
|
@ -0,0 +1,103 @@
|
|||
#ifndef __MAINDISPLAY_H__
|
||||
#define __MAINDISPLAY_H__
|
||||
|
||||
class MainDisplay;
|
||||
|
||||
#include <xmmsclient/xmmsclient++.h>
|
||||
#include "XMMSHandler.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <QPixmap>
|
||||
#include <QPainter>
|
||||
#include <QWidget>
|
||||
#include <QHash>
|
||||
#include <QBrush>
|
||||
#include <QPalette>
|
||||
|
||||
#include "Display.h"
|
||||
/*
|
||||
#include "TitleBar.h"
|
||||
#include "Button.h"
|
||||
#include "TextBar.h"
|
||||
#include "NumberDisplay.h"
|
||||
#include "TimeDisplay.h"
|
||||
#include "SmallNumberDisplay.h"
|
||||
#include "StereoMono.h"
|
||||
#include "Slider.h"
|
||||
#include "PlayStatus.h"
|
||||
#include "VolumeSlider.h"
|
||||
#include "MainWindow.h"
|
||||
*/
|
||||
|
||||
class Button;
|
||||
class ToggleButton;
|
||||
class TextScroller;
|
||||
class TimeDisplay;
|
||||
class SmallNumberDisplay;
|
||||
class StereoMono;
|
||||
class PosBar;
|
||||
class Slider;
|
||||
class PlayStatus;
|
||||
class MainWindow;
|
||||
class ClutterBar;
|
||||
|
||||
class MainDisplay : public SkinDisplay
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
MainDisplay (QWidget *parent);
|
||||
~MainDisplay ();
|
||||
ToggleButton *GetPls() {return m_pls;};
|
||||
ToggleButton *GetEq() {return m_eq;};
|
||||
|
||||
TextScroller *m_text;
|
||||
TimeDisplay *m_time;
|
||||
|
||||
SmallNumberDisplay *m_kbps;
|
||||
SmallNumberDisplay *m_khz;
|
||||
|
||||
StereoMono *m_stereo;
|
||||
PosBar *m_posbar;
|
||||
Slider *m_vslider;
|
||||
Slider *m_bslider;
|
||||
|
||||
PlayStatus *m_playstatus;
|
||||
MainWindow *getMW(void) { return m_mw; }
|
||||
|
||||
void mouseMoveEvent (QMouseEvent *);
|
||||
|
||||
public slots:
|
||||
void setPixmaps(Skin *skin);
|
||||
void setStatus (Xmms::Playback::Status status);
|
||||
void setPlaytime (uint32_t time);
|
||||
void setMediainfo (const Xmms::PropDict &);
|
||||
void togglePL(void);
|
||||
void toggleEQ(void);
|
||||
void toggleTime(void);
|
||||
void updateVolume (uint volume);
|
||||
void setVolume (int volume);
|
||||
|
||||
protected:
|
||||
void SetupPushButtons (void);
|
||||
void SetupToggleButtons (void);
|
||||
|
||||
Button *m_prev;
|
||||
Button *m_play;
|
||||
Button *m_pause;
|
||||
Button *m_stop;
|
||||
Button *m_next;
|
||||
Button *m_eject;
|
||||
|
||||
ToggleButton *m_pls;
|
||||
ToggleButton *m_eq;
|
||||
ToggleButton *m_shuffle;
|
||||
ToggleButton *m_repeat;
|
||||
|
||||
MainWindow *m_mw;
|
||||
|
||||
ClutterBar *m_clutterbar;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
208
src/MainWindow.cpp
Normal file
208
src/MainWindow.cpp
Normal file
|
@ -0,0 +1,208 @@
|
|||
#include "MainWindow.h"
|
||||
|
||||
#ifdef HAVE_SERVERBROWSER
|
||||
#include "ServerBrowser.h"
|
||||
#endif
|
||||
|
||||
#include "Playlist.h"
|
||||
#include "MainDisplay.h"
|
||||
#include "ShadedDisplay.h"
|
||||
#include "Equalizer.h"
|
||||
|
||||
#include <QSettings>
|
||||
#include <QIcon>
|
||||
#include <QPluginLoader>
|
||||
#include <qplugin.h>
|
||||
|
||||
MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent)
|
||||
{
|
||||
QSettings settings;
|
||||
|
||||
setWindowFlags(Qt::FramelessWindowHint);
|
||||
setGeometry(100, 100, 275, 116);
|
||||
#ifndef _WIN32
|
||||
setWindowIcon (QIcon (":icon.png"));
|
||||
#endif
|
||||
|
||||
if (!settings.contains ("mainwindow/shaded"))
|
||||
setShaded (true);
|
||||
else
|
||||
setShaded (!isShaded ());
|
||||
|
||||
/*
|
||||
* The MainDisplay is the mainwindow non-shaded mode
|
||||
*/
|
||||
m_display = new MainDisplay (this);
|
||||
setCentralWidget (m_display);
|
||||
m_display->show ();
|
||||
|
||||
/*
|
||||
* MainDisplay's shaded mode
|
||||
*/
|
||||
m_shaded = new ShadedDisplay (this);
|
||||
m_shaded->hide ();
|
||||
|
||||
switchDisplay ();
|
||||
|
||||
m_playlistwin = NULL;
|
||||
|
||||
if (!settings.contains ("mainwindow/pos"))
|
||||
settings.setValue ("mainwindow/pos", QPoint (100, 100));
|
||||
|
||||
move (settings.value("mainwindow/pos").toPoint ());
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow ()
|
||||
{
|
||||
delete Skin::getInstance ();
|
||||
}
|
||||
|
||||
void
|
||||
MainWindow::switchDisplay ()
|
||||
{
|
||||
QSettings s;
|
||||
|
||||
if (isShaded ()) {
|
||||
m_shaded->hide ();
|
||||
m_display->show ();
|
||||
resize (275, 116);
|
||||
setShaded (false);
|
||||
} else {
|
||||
m_display->hide ();
|
||||
m_shaded->show ();
|
||||
resize (275, 14);
|
||||
setShaded (true);
|
||||
}
|
||||
|
||||
update ();
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
MainWindow::raisePL (void)
|
||||
{
|
||||
m_playlistwin->raise ();
|
||||
}
|
||||
|
||||
void
|
||||
MainWindow::moveEvent (QMoveEvent *event)
|
||||
{
|
||||
QSettings s;
|
||||
s.setValue ("mainwindow/pos", pos ());
|
||||
}
|
||||
|
||||
void
|
||||
MainWindow::togglePL (bool UpdateButton)
|
||||
{
|
||||
QSettings s;
|
||||
|
||||
if(UpdateButton)
|
||||
{
|
||||
getMD()->GetPls()->toggleOn();
|
||||
}
|
||||
|
||||
if (s.value ("playlist/hidden").toBool ()) {
|
||||
m_playlistwin->move (s.value("playlist/pos").toPoint ());
|
||||
m_playlistwin->show ();
|
||||
s.setValue ("playlist/hidden", false);
|
||||
} else {
|
||||
m_playlistwin->hide ();
|
||||
s.setValue ("playlist/hidden", true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
MainWindow::toggleEQ (bool UpdateButton)
|
||||
{
|
||||
QSettings s;
|
||||
|
||||
if(UpdateButton)
|
||||
{
|
||||
getMD()->GetEq()->toggleOn();
|
||||
}
|
||||
|
||||
if (s.value ("equalizer/hidden").toBool ()) {
|
||||
m_equalizer->move (s.value("equalizer/pos").toPoint ());
|
||||
m_equalizer->show ();
|
||||
s.setValue ("equalizer/hidden", false);
|
||||
} else {
|
||||
m_equalizer->hide ();
|
||||
s.setValue ("equalizer/hidden", true);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
QApplication app(argc, argv);
|
||||
|
||||
QCoreApplication::setOrganizationName("XMMS2 Team");
|
||||
QCoreApplication::setOrganizationDomain("xmms.org");
|
||||
QCoreApplication::setApplicationName("Promoe");
|
||||
|
||||
QSettings settings;
|
||||
|
||||
#ifdef Q_OS_MACX
|
||||
/** This is soooo wrong, there must exsist a flag for
|
||||
* static plugins
|
||||
Q_IMPORT_PLUGIN(QJpegPlugin);
|
||||
*/
|
||||
#endif
|
||||
|
||||
MainWindow *mw = new MainWindow (NULL);
|
||||
|
||||
PlaylistWindow *playlistwin = new PlaylistWindow (mw);
|
||||
EqualizerWindow *eqwin = new EqualizerWindow (mw);
|
||||
|
||||
/*
|
||||
* Now that everything is initialized
|
||||
* open the skin and send the
|
||||
* SkinChanged signal that will cause
|
||||
* all widgets to get their pixmaps
|
||||
*/
|
||||
if (!settings.contains ("skin/path")) {
|
||||
settings.setValue ("skin/path", ":CleanAMP/");
|
||||
}
|
||||
|
||||
Skin::getInstance()->setSkin (settings.value("skin/path").toString ());
|
||||
|
||||
mw->show ();
|
||||
mw->setPL (playlistwin);
|
||||
mw->setEQ (eqwin);
|
||||
|
||||
if (!settings.contains ("playlist/pos"))
|
||||
settings.setValue ("playlist/pos", QPoint (mw->pos().x(),
|
||||
mw->pos().y()+mw->size().height()));
|
||||
playlistwin->move (settings.value("playlist/pos").toPoint ());
|
||||
|
||||
if (!settings.contains ("playlist/hidden"))
|
||||
settings.setValue ("playlist/hidden", true);
|
||||
|
||||
if (settings.value("playlist/hidden").toBool ())
|
||||
playlistwin->hide ();
|
||||
else
|
||||
playlistwin->show ();
|
||||
|
||||
|
||||
if (!settings.contains ("equalizer/pos"))
|
||||
settings.setValue ("equalizer/pos", QPoint (mw->pos().x(),
|
||||
mw->pos().y()+mw->size().height()));
|
||||
eqwin->move (settings.value("equalizer/pos").toPoint ());
|
||||
|
||||
if (!settings.contains ("equalizer/hidden"))
|
||||
settings.setValue ("equalizer/hidden", true);
|
||||
|
||||
if (settings.value("equalizer/hidden").toBool ())
|
||||
eqwin->hide ();
|
||||
else
|
||||
eqwin->show ();
|
||||
|
||||
|
||||
#ifdef HAVE_SERVERBROWSER
|
||||
ServerBrowserWindow *browser = new ServerBrowserWindow (mw);
|
||||
browser->show ();
|
||||
#endif
|
||||
|
||||
return app.exec();
|
||||
}
|
68
src/MainWindow.h
Normal file
68
src/MainWindow.h
Normal file
|
@ -0,0 +1,68 @@
|
|||
#ifndef __MAINWINDOW_H__
|
||||
#define __MAINWINDOW_H__
|
||||
|
||||
class MainWindow;
|
||||
|
||||
#include "XMMSHandler.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <QMainWindow>
|
||||
#include <QPixmap>
|
||||
#include <QPainter>
|
||||
#include <QWidget>
|
||||
#include <QHash>
|
||||
#include <QSettings>
|
||||
|
||||
#include "xmmsqt4.h"
|
||||
|
||||
/*
|
||||
#include "Skin.h"
|
||||
#include "MainDisplay.h"
|
||||
#include "ShadedDisplay.h"
|
||||
#include "Playlist.h"
|
||||
*/
|
||||
|
||||
class XmmsQT4;
|
||||
class Skin;
|
||||
class MainDisplay;
|
||||
class ShadedDisplay;
|
||||
class PlaylistWindow;
|
||||
class EqualizerWindow;
|
||||
|
||||
class MainWindow : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
MainWindow (QWidget *parent);
|
||||
~MainWindow (void);
|
||||
|
||||
MainDisplay *getMD () { return m_display; }
|
||||
ShadedDisplay *getSD () { return m_shaded; }
|
||||
PlaylistWindow *getPL () { return m_playlistwin; }
|
||||
|
||||
void setPL (PlaylistWindow *p) { m_playlistwin = p; }
|
||||
void setEQ (EqualizerWindow *e) { m_equalizer = e; }
|
||||
|
||||
void raisePL (void);
|
||||
void moveEvent (QMoveEvent *event);
|
||||
|
||||
void togglePL (bool UpdateButton);
|
||||
void toggleEQ (bool UpdateButton);
|
||||
bool isTimemodeReverse(void) { QSettings s; return s.value("MainWindow/timemodereverse").toBool(); }
|
||||
void setTimemodeReverse(bool b) { QSettings s; return s.setValue("MainWindow/timemodereverse",b); }
|
||||
|
||||
public slots:
|
||||
void switchDisplay ();
|
||||
|
||||
private:
|
||||
bool isShaded (void) { QSettings s; return s.value("MainWindow/shaded").toBool(); }
|
||||
void setShaded (bool b) { QSettings s; return s.setValue("MainWindow/shaded", b); }
|
||||
MainDisplay *m_display;
|
||||
ShadedDisplay *m_shaded;
|
||||
PlaylistWindow *m_playlistwin;
|
||||
EqualizerWindow *m_equalizer;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
62
src/MedialibItem.h
Normal file
62
src/MedialibItem.h
Normal file
|
@ -0,0 +1,62 @@
|
|||
#ifndef __MEDIALIBITEM_H__
|
||||
#define __MEDIALIBITEM_H__
|
||||
|
||||
#include <QStringList>
|
||||
|
||||
class MedialibItem {
|
||||
public:
|
||||
enum MedialibItemType {
|
||||
NoneItem,
|
||||
ArtistItem,
|
||||
AlbumItem,
|
||||
SongItem
|
||||
};
|
||||
|
||||
MedialibItem (const QStringList &text = QStringList (), MedialibItem *parent = NULL, MedialibItemType type = NoneItem) {
|
||||
m_text = text;
|
||||
m_type = type;
|
||||
m_parent = parent;
|
||||
if (parent) {
|
||||
parent->m_childs.append (this);
|
||||
}
|
||||
};
|
||||
|
||||
bool mayHaveChilds () const {
|
||||
if (m_type == NoneItem || m_type == SongItem)
|
||||
return false;
|
||||
return true;
|
||||
};
|
||||
|
||||
QString data (int c) const {
|
||||
if (m_text.size () > c) {
|
||||
return m_text.at (c);
|
||||
}
|
||||
return QString ();
|
||||
};
|
||||
|
||||
MedialibItem *child (int c) const {
|
||||
return m_childs.value (c);
|
||||
}
|
||||
|
||||
int childCount () const {
|
||||
return m_childs.count ();
|
||||
};
|
||||
|
||||
MedialibItem *parent () const {
|
||||
return m_parent;
|
||||
};
|
||||
|
||||
int row () const {
|
||||
if (m_parent)
|
||||
return m_parent->m_childs.indexOf (const_cast<MedialibItem*> (this));
|
||||
return 0;
|
||||
}
|
||||
|
||||
private:
|
||||
MedialibItemType m_type;
|
||||
QStringList m_text;
|
||||
MedialibItem *m_parent;
|
||||
QList<MedialibItem *> m_childs;
|
||||
};
|
||||
|
||||
#endif
|
149
src/MedialibTreeModel.cpp
Normal file
149
src/MedialibTreeModel.cpp
Normal file
|
@ -0,0 +1,149 @@
|
|||
#include <xmmsclient/xmmsclient++.h>
|
||||
#include "XmmsQt4.h"
|
||||
#include "MedialibTreeModel.h"
|
||||
#include "MedialibItem.h"
|
||||
|
||||
#include <QAbstractItemModel>
|
||||
#include <QErrorMessage>
|
||||
#include <QString>
|
||||
|
||||
MedialibTreeModel::MedialibTreeModel (QObject *parent) :
|
||||
QAbstractItemModel (parent), m_client ("PromoeMedialibTree")
|
||||
{
|
||||
const char *path = getenv("XMMS_PATH");
|
||||
try {
|
||||
m_client.connect (path ? path : "");
|
||||
}
|
||||
catch (Xmms::connection_error& e) {
|
||||
QErrorMessage *err = new QErrorMessage ();
|
||||
err->showMessage ("Couldn't connect to XMMS2, please try again.");
|
||||
err->exec ();
|
||||
delete err;
|
||||
}
|
||||
|
||||
m_client.setMainloop (new XmmsQT4 (m_client.getConnection ()));
|
||||
|
||||
m_rootitem = new MedialibItem ();
|
||||
|
||||
using Xmms::bind;
|
||||
|
||||
m_client.medialib.select ("select distinct value from Media where key='artist' order by lower(value)",
|
||||
bind (&MedialibTreeModel::artist_list, this));
|
||||
|
||||
}
|
||||
|
||||
bool
|
||||
MedialibTreeModel::artist_list (const Xmms::List< Xmms::Dict > &artists)
|
||||
{
|
||||
QString s;
|
||||
|
||||
for (artists.first (); artists.isValid (); ++artists) {
|
||||
s = QString::fromUtf8 ((*artists).get<std::string> ("value").c_str ());
|
||||
new MedialibItem (QStringList (s), m_rootitem, MedialibItem::ArtistItem);
|
||||
}
|
||||
|
||||
reset ();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* QModel overrides */
|
||||
|
||||
Qt::ItemFlags
|
||||
MedialibTreeModel::flags (const QModelIndex &index) const
|
||||
{
|
||||
if (!index.isValid())
|
||||
return Qt::ItemIsEnabled;
|
||||
|
||||
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
|
||||
}
|
||||
|
||||
int
|
||||
MedialibTreeModel::rowCount (const QModelIndex &parent) const
|
||||
{
|
||||
MedialibItem *item;
|
||||
|
||||
if (!parent.isValid ()) {
|
||||
item = m_rootitem;
|
||||
} else {
|
||||
item = static_cast<MedialibItem*> (parent.internalPointer ());
|
||||
}
|
||||
|
||||
int n = item->childCount ();
|
||||
|
||||
if (n == 0 && item->mayHaveChilds ())
|
||||
n = 1;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
QModelIndex
|
||||
MedialibTreeModel::parent (const QModelIndex &index) const
|
||||
{
|
||||
if (!index.isValid ())
|
||||
return QModelIndex ();
|
||||
|
||||
MedialibItem *item = static_cast<MedialibItem*> (index.internalPointer ());
|
||||
MedialibItem *parent = item->parent ();
|
||||
|
||||
if (parent == m_rootitem) {
|
||||
return QModelIndex ();
|
||||
}
|
||||
|
||||
return createIndex (parent->row (), 0, parent);
|
||||
}
|
||||
|
||||
QModelIndex
|
||||
MedialibTreeModel::index (int row, int column,
|
||||
const QModelIndex &parent) const
|
||||
{
|
||||
MedialibItem *p;
|
||||
if (!parent.isValid ()) {
|
||||
p = m_rootitem;
|
||||
} else {
|
||||
p = static_cast<MedialibItem*> (parent.internalPointer ());
|
||||
}
|
||||
|
||||
MedialibItem *child = p->child (row);
|
||||
if (child) {
|
||||
return createIndex (row, column, child);
|
||||
} else {
|
||||
if (p->columnCount () == 0 && !p->loading ()) {
|
||||
qDebug ("Loading items...");
|
||||
switch (p->type ()) {
|
||||
case MedialibItem::ArtistItem:
|
||||
m_client.medialib.select ("select distinct m1.value as value from Media m1 join Media m2 on m1.id = m2.id and m2.key = 'artist' where m1.key='album' and m2.value = '%s' order by lower(m1.value)", MedialibTreeModel::sub_list);
|
||||
|
||||
return QModelIndex ();
|
||||
}
|
||||
|
||||
int
|
||||
MedialibTreeModel::columnCount (const QModelIndex &parent) const
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
QVariant
|
||||
MedialibTreeModel::data (const QModelIndex &index,
|
||||
int role) const
|
||||
{
|
||||
if (!index.isValid ())
|
||||
return QVariant ();
|
||||
|
||||
if (role != Qt::DisplayRole)
|
||||
return QVariant ();
|
||||
|
||||
MedialibItem *item = static_cast<MedialibItem *> (index.internalPointer ());
|
||||
return QVariant (item->data (index.column ()));
|
||||
}
|
||||
|
||||
QVariant
|
||||
MedialibTreeModel::headerData (int section,
|
||||
Qt::Orientation orientation,
|
||||
int role) const
|
||||
{
|
||||
if (role == Qt::DisplayRole)
|
||||
return QVariant("Title");
|
||||
return QVariant ();
|
||||
}
|
||||
|
33
src/MedialibTreeModel.h
Normal file
33
src/MedialibTreeModel.h
Normal file
|
@ -0,0 +1,33 @@
|
|||
#ifndef __MEDIALIBTREEMODEL_H__
|
||||
#define __MEDIALIBTREEMODEL_H__
|
||||
|
||||
#include <xmmsclient/xmmsclient++.h>
|
||||
|
||||
#include "MedialibItem.h"
|
||||
|
||||
#include <QAbstractItemModel>
|
||||
#include <QStringList>
|
||||
|
||||
class MedialibTreeModel : public QAbstractItemModel
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
MedialibTreeModel (QObject *parent);
|
||||
MedialibTreeModel::~MedialibTreeModel () {};
|
||||
|
||||
/* QModel overrides */
|
||||
int rowCount (const QModelIndex &parent) const;
|
||||
int columnCount (const QModelIndex &parent) const;
|
||||
QVariant data (const QModelIndex &index, int role = Qt::DisplayRole) const;
|
||||
QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
|
||||
Qt::ItemFlags flags (const QModelIndex &index) const;
|
||||
QModelIndex index (int row, int column, const QModelIndex &parent) const;
|
||||
QModelIndex parent (const QModelIndex &index) const;
|
||||
|
||||
private:
|
||||
bool artist_list (const Xmms::List< Xmms::Dict > &artists);
|
||||
Xmms::Client m_client;
|
||||
MedialibItem *m_rootitem;
|
||||
};
|
||||
|
||||
#endif
|
10
src/MedialibView.cpp
Normal file
10
src/MedialibView.cpp
Normal file
|
@ -0,0 +1,10 @@
|
|||
#include "MedialibTreeModel.h"
|
||||
#include "MedialibView.h"
|
||||
#include <QTreeView>
|
||||
|
||||
|
||||
MedialibView::MedialibView (QWidget *parent) : QTreeView (parent)
|
||||
{
|
||||
setAlternatingRowColors (true);
|
||||
setModel (new MedialibTreeModel (this));
|
||||
}
|
15
src/MedialibView.h
Normal file
15
src/MedialibView.h
Normal file
|
@ -0,0 +1,15 @@
|
|||
#ifndef __MEDIALIBVIEW_H__
|
||||
#define __MEDIALIBVIEW_H__
|
||||
|
||||
#include <QTreeView>
|
||||
#include <QAbstractItemModel>
|
||||
|
||||
class MedialibView : public QTreeView
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
MedialibView (QWidget *parent);
|
||||
};
|
||||
|
||||
|
||||
#endif
|
21
src/MedialibWindow.cpp
Normal file
21
src/MedialibWindow.cpp
Normal file
|
@ -0,0 +1,21 @@
|
|||
#include "XMMSSocket.h"
|
||||
#include "MedialibWindow.h"
|
||||
#include "MedialibView.h"
|
||||
|
||||
#include <QMainWindow>
|
||||
|
||||
MedialibWindow::MedialibWindow (QWidget *parent) : QMainWindow (parent)
|
||||
{
|
||||
#ifndef _WIN32
|
||||
setWindowIcon (QIcon (":icon.png"));
|
||||
#endif
|
||||
|
||||
setWindowFlags (Qt::Dialog);
|
||||
setAttribute (Qt::WA_DeleteOnClose);
|
||||
|
||||
m_view = new MedialibView (this);
|
||||
|
||||
setCentralWidget (m_view);
|
||||
|
||||
resize (500, 600);
|
||||
}
|
17
src/MedialibWindow.h
Normal file
17
src/MedialibWindow.h
Normal file
|
@ -0,0 +1,17 @@
|
|||
#ifndef __MEDIALIBWINDOW_H__
|
||||
#define __MEDIALIBWINDOW_H__
|
||||
|
||||
#include "MedialibView.h"
|
||||
#include <QMainWindow>
|
||||
|
||||
class MedialibWindow : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
MedialibWindow (QWidget *parent);
|
||||
|
||||
private:
|
||||
QTreeView *m_view;
|
||||
};
|
||||
|
||||
#endif
|
63
src/NumberDisplay.cpp
Normal file
63
src/NumberDisplay.cpp
Normal file
|
@ -0,0 +1,63 @@
|
|||
#include "MainWindow.h"
|
||||
#include "NumberDisplay.h"
|
||||
|
||||
#include "TimeDisplay.h"
|
||||
#include "Skin.h"
|
||||
|
||||
NumberDisplay::NumberDisplay (QWidget *parent, TimeDisplay *td,uint w, uint startpx) : PixWidget (parent)
|
||||
{
|
||||
m_td = td;
|
||||
m_w = w;
|
||||
m_startpx = startpx;
|
||||
|
||||
m_pixmap = QPixmap (m_w, 13);
|
||||
|
||||
setMinimumSize (m_w, 13);
|
||||
setMaximumSize (m_w, 13);
|
||||
|
||||
setNumber (0,0);
|
||||
}
|
||||
|
||||
void
|
||||
NumberDisplay::setPixmaps (Skin *skin)
|
||||
{
|
||||
QBrush b (skin->getNumber (10));
|
||||
|
||||
QPainter paint;
|
||||
paint.begin (&m_pixmap);
|
||||
paint.fillRect (m_pixmap.rect (), b);
|
||||
paint.drawPixmap (m_startpx, 0, skin->getNumber (m_n1));
|
||||
paint.drawPixmap (m_startpx+12, 0, skin->getNumber (m_n2));
|
||||
paint.end();
|
||||
|
||||
update ();
|
||||
}
|
||||
|
||||
void
|
||||
NumberDisplay::setNumber (uint n1, uint n2)
|
||||
{
|
||||
if (m_n1 != n1 || m_n2 != n2) {
|
||||
Skin *skin = Skin::getInstance ();
|
||||
|
||||
m_n1 = n1;
|
||||
m_n2 = n2;
|
||||
|
||||
setPixmaps (skin);
|
||||
}
|
||||
}
|
||||
|
||||
NumberDisplay::~NumberDisplay ()
|
||||
{
|
||||
}
|
||||
void
|
||||
NumberDisplay::mousePressEvent (QMouseEvent *event)
|
||||
{
|
||||
}
|
||||
void
|
||||
NumberDisplay::mouseReleaseEvent (QMouseEvent *event)
|
||||
{
|
||||
// TimeDisplay *td = dynamic_cast<TimeDisplay *>(parent());
|
||||
emit clicked();
|
||||
m_td->drawMinus ();
|
||||
}
|
||||
|
34
src/NumberDisplay.h
Normal file
34
src/NumberDisplay.h
Normal file
|
@ -0,0 +1,34 @@
|
|||
#ifndef __NUMBERDISPLAY_H__
|
||||
#define __NUMBERDISPLAY_H__
|
||||
|
||||
class TimeDisplay;
|
||||
|
||||
#include "PixWidget.h"
|
||||
|
||||
class NumberDisplay : public PixWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
NumberDisplay (QWidget *parent, TimeDisplay *td, uint, uint);
|
||||
~NumberDisplay ();
|
||||
|
||||
void setNumber (uint, uint);
|
||||
|
||||
public slots:
|
||||
void setPixmaps (Skin *skin);
|
||||
signals:
|
||||
void clicked(void);
|
||||
|
||||
protected:
|
||||
void mousePressEvent (QMouseEvent *event);
|
||||
void mouseReleaseEvent (QMouseEvent *event);
|
||||
int m_w;
|
||||
int m_startpx;
|
||||
|
||||
TimeDisplay *m_td;
|
||||
uint m_n1;
|
||||
uint m_n2;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
42
src/PixWidget.cpp
Normal file
42
src/PixWidget.cpp
Normal file
|
@ -0,0 +1,42 @@
|
|||
#include "MainWindow.h"
|
||||
|
||||
#include "Skin.h"
|
||||
#include "PixWidget.h"
|
||||
|
||||
PixWidget::PixWidget (QWidget *parent) : QWidget (parent)
|
||||
{
|
||||
Skin *skin = Skin::getInstance();
|
||||
m_pixmap = QPixmap(0,0);
|
||||
|
||||
connect (skin, SIGNAL (skinChanged (Skin *)),
|
||||
this, SLOT (setPixmaps(Skin *)));
|
||||
}
|
||||
|
||||
|
||||
PixWidget::~PixWidget ()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
PixWidget::setPixmaps(Skin *skin)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Since almost every Widget I have here
|
||||
* is done by drawing self.pixmap onto self
|
||||
* we define this a generic PaintEvent handler
|
||||
*/
|
||||
void
|
||||
PixWidget::paintEvent (QPaintEvent *event)
|
||||
{
|
||||
if (m_pixmap.isNull ()) {
|
||||
return;
|
||||
}
|
||||
|
||||
QPainter (paint);
|
||||
paint.begin (this);
|
||||
paint.drawPixmap (rect (), m_pixmap, m_pixmap.rect ());
|
||||
paint.end ();
|
||||
}
|
27
src/PixWidget.h
Normal file
27
src/PixWidget.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
#ifndef __PIXWIDGET_H__
|
||||
#define __PIXWIDGET_H__
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <QPixmap>
|
||||
#include <QPainter>
|
||||
#include <QWidget>
|
||||
|
||||
class Skin;
|
||||
|
||||
class PixWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
PixWidget(QWidget *parent = 0);
|
||||
~PixWidget();
|
||||
void paintEvent (QPaintEvent *event);
|
||||
QWidget *getMW (void) { return m_mw; }
|
||||
public slots:
|
||||
virtual void setPixmaps(Skin *skin);
|
||||
protected:
|
||||
QPixmap m_pixmap;
|
||||
QWidget *m_mw;
|
||||
};
|
||||
|
||||
#endif
|
41
src/PlayStatus.cpp
Normal file
41
src/PlayStatus.cpp
Normal file
|
@ -0,0 +1,41 @@
|
|||
#include <xmmsclient/xmmsclient++.h>
|
||||
#include "PlayStatus.h"
|
||||
#include "Skin.h"
|
||||
|
||||
PlayStatus::PlayStatus (QWidget *parent) : PixWidget (parent)
|
||||
{
|
||||
setMinimumSize(11, 9);
|
||||
setMaximumSize(11, 9);
|
||||
|
||||
m_status = Xmms::Playback::STOPPED;
|
||||
|
||||
connect (&XMMSHandler::getInstance (),
|
||||
SIGNAL(playbackStatusChanged(Xmms::Playback::Status)),
|
||||
this, SLOT(setStatus(Xmms::Playback::Status)));
|
||||
}
|
||||
|
||||
void
|
||||
PlayStatus::setPixmaps (Skin *skin)
|
||||
{
|
||||
m_pixmap_play = skin->getItem (Skin::PIC_PLAY);
|
||||
m_pixmap_pause = skin->getItem (Skin::PIC_PAUSE);
|
||||
m_pixmap_stop = skin->getItem (Skin::PIC_STOP);
|
||||
|
||||
setStatus (m_status);
|
||||
}
|
||||
|
||||
void
|
||||
PlayStatus::setStatus (Xmms::Playback::Status status)
|
||||
{
|
||||
using Xmms::Playback;
|
||||
if (status == Playback::STOPPED) {
|
||||
m_pixmap = m_pixmap_stop;
|
||||
} else if (status == Playback::PLAYING) {
|
||||
m_pixmap = m_pixmap_play;
|
||||
} else if (status == Playback::PAUSED) {
|
||||
m_pixmap = m_pixmap_pause;
|
||||
}
|
||||
|
||||
update ();
|
||||
}
|
||||
|
28
src/PlayStatus.h
Normal file
28
src/PlayStatus.h
Normal file
|
@ -0,0 +1,28 @@
|
|||
#ifndef __PLAYSTATUS_H__
|
||||
#define __PLAYSTATUS_H__
|
||||
|
||||
#include <xmmsclient/xmmsclient++.h>
|
||||
#include "XMMSHandler.h"
|
||||
#include "PixWidget.h"
|
||||
|
||||
class PlayStatus : public PixWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
PlayStatus (QWidget *parent);
|
||||
~PlayStatus () { }
|
||||
|
||||
|
||||
public slots:
|
||||
void setPixmaps (Skin *skin);
|
||||
void setStatus (Xmms::Playback::Status status);
|
||||
|
||||
private:
|
||||
Xmms::Playback::Status m_status;
|
||||
|
||||
QPixmap m_pixmap_stop;
|
||||
QPixmap m_pixmap_play;
|
||||
QPixmap m_pixmap_pause;
|
||||
};
|
||||
|
||||
#endif
|
616
src/Playlist.cpp
Normal file
616
src/Playlist.cpp
Normal file
|
@ -0,0 +1,616 @@
|
|||
#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 necessyry 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);
|
||||
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 in a future Qt version. Try to find a better solution
|
||||
*/
|
||||
//m_scroller = new PlaylistScrollBar (this);
|
||||
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;
|
||||
|
||||
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);
|
||||
connect (b, SIGNAL(activated ()),
|
||||
&XMMSHandler::getInstance(), SLOT (playlistClear ()));
|
||||
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);
|
||||
// connect (b, SIGNAL(activated ()), m_list, SLOT (deleteFiles ()));
|
||||
|
||||
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::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.h
Normal file
143
src/Playlist.h
Normal 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
|
792
src/PlaylistList.cpp
Normal file
792
src/PlaylistList.cpp
Normal file
|
@ -0,0 +1,792 @@
|
|||
#include <xmmsclient/xmmsclient++.h>
|
||||
#include "XMMSHandler.h"
|
||||
|
||||
#include "PlaylistList.h"
|
||||
#include "Playlist.h"
|
||||
|
||||
#include <QStyleOptionHeader>
|
||||
#include <QPaintEvent>
|
||||
#include <QSettings>
|
||||
#include <QCursor>
|
||||
#include <QDrag>
|
||||
#include <QMenu>
|
||||
|
||||
PlaylistItem::PlaylistItem (PlaylistList *pl, uint id)
|
||||
{
|
||||
m_pl = pl;
|
||||
m_id = id;
|
||||
m_req = false;
|
||||
m_duration = QString ("00:00");
|
||||
pl->addItem (this);
|
||||
}
|
||||
|
||||
PlaylistItem::PlaylistItem (PlaylistList *pl, uint id, uint pos)
|
||||
{
|
||||
m_pl = pl;
|
||||
m_id = id;
|
||||
m_req = false;
|
||||
m_duration = QString ("00:00");
|
||||
pl->addItem (this, pos);
|
||||
}
|
||||
|
||||
QString
|
||||
PlaylistItem::text (void)
|
||||
{
|
||||
|
||||
if (m_text.count() < 1) {
|
||||
|
||||
if (!m_req) {
|
||||
XMMSHandler::getInstance ().requestMediainfo (m_id);
|
||||
m_req = true;
|
||||
}
|
||||
|
||||
QString q;
|
||||
q.setNum (m_id);
|
||||
return q;
|
||||
} else {
|
||||
m_req = false;
|
||||
return m_text;
|
||||
}
|
||||
}
|
||||
|
||||
PlaylistList::PlaylistList (QWidget *parent) : QWidget (parent)
|
||||
{
|
||||
QSettings s;
|
||||
XMMSHandler &xmmsh = XMMSHandler::getInstance ();
|
||||
Skin *skin = Skin::getInstance ();
|
||||
|
||||
if (!s.contains("playlist/fontsize"))
|
||||
s.setValue ("playlist/fontsize", 10);
|
||||
|
||||
setAttribute (Qt::WA_NoBackground);
|
||||
setFocusPolicy (Qt::StrongFocus);
|
||||
|
||||
setAcceptDrops (true);
|
||||
|
||||
connect (skin, SIGNAL (skinChanged (Skin *)),
|
||||
this, SLOT (setPixmaps(Skin *)));
|
||||
|
||||
m_font = NULL;
|
||||
m_fontmetrics = NULL;
|
||||
m_items = new QList<PlaylistItem *>;
|
||||
m_selected = new QList<uint>;
|
||||
m_itemmap = new QHash<uint, PlaylistItem *>;
|
||||
m_offset = 0;
|
||||
m_status = XMMS_PLAYBACK_STATUS_STOP;
|
||||
m_bar = -2;
|
||||
|
||||
connect (&xmmsh, SIGNAL(playlistList(const Xmms::List< unsigned int > &)),
|
||||
this, SLOT(playlistList(const Xmms::List< unsigned int > &)));
|
||||
|
||||
connect (&xmmsh, SIGNAL(currentID(uint)),
|
||||
this, SLOT(currentID(uint)));
|
||||
|
||||
connect (&xmmsh, SIGNAL(mediainfoChanged(uint, const Xmms::PropDict &)),
|
||||
this, SLOT(mediainfoChanged(uint, const Xmms::PropDict &)));
|
||||
|
||||
connect (&xmmsh, SIGNAL(playlistChanged(const Xmms::Dict &)),
|
||||
this, SLOT(playlistChanged(const Xmms::Dict &)));
|
||||
|
||||
connect (&xmmsh, SIGNAL(playbackStatusChanged(Xmms::Playback::Status)),
|
||||
this, SLOT(setStatus(Xmms::Playback::Status)));
|
||||
|
||||
connect (&xmmsh, SIGNAL(settingsSaved()),
|
||||
this, SLOT(settingsSaved()));
|
||||
}
|
||||
|
||||
void
|
||||
PlaylistList::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
|
||||
PlaylistList::setStatus (Xmms::Playback::Status s)
|
||||
{
|
||||
m_status = s;
|
||||
}
|
||||
|
||||
void
|
||||
PlaylistList::playlistChanged (const Xmms::Dict &change)
|
||||
{
|
||||
int signal = change.get<int32_t> ("type");
|
||||
XMMSHandler &xmmsh = XMMSHandler::getInstance ();
|
||||
switch (signal) {
|
||||
case XMMS_PLAYLIST_CHANGED_ADD:
|
||||
{
|
||||
uint id = change.get<uint32_t> ("id");
|
||||
if (m_itemmap->contains (id)) {
|
||||
addItem (m_itemmap->value (id));
|
||||
} else {
|
||||
new PlaylistItem (this, id);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case XMMS_PLAYLIST_CHANGED_INSERT:
|
||||
{
|
||||
uint id = change.get<uint32_t> ("id");
|
||||
int pos = change.get<int32_t> ("position");
|
||||
|
||||
if (m_itemmap->contains (id)) {
|
||||
addItem (m_itemmap->value (id));
|
||||
} else {
|
||||
new PlaylistItem (this, id, pos);
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
case XMMS_PLAYLIST_CHANGED_REMOVE:
|
||||
{
|
||||
int pos = change.get<int32_t> ("position");
|
||||
PlaylistItem *i = m_items->value (pos);
|
||||
|
||||
if (!i) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_items->removeAt (pos);
|
||||
if (!m_items->contains (i)) {
|
||||
m_itemmap->remove (i->getID ());
|
||||
delete i;
|
||||
}
|
||||
|
||||
if (m_active) {
|
||||
if (m_active > pos) {
|
||||
m_active --;
|
||||
} else if (m_active == pos) {
|
||||
m_active = 0;
|
||||
}
|
||||
}
|
||||
|
||||
doResize ();
|
||||
|
||||
}
|
||||
break;
|
||||
case XMMS_PLAYLIST_CHANGED_MOVE:
|
||||
break;
|
||||
case XMMS_PLAYLIST_CHANGED_CLEAR:
|
||||
case XMMS_PLAYLIST_CHANGED_SHUFFLE:
|
||||
case XMMS_PLAYLIST_CHANGED_SORT:
|
||||
{
|
||||
while (!m_items->isEmpty()) {
|
||||
PlaylistItem *item = m_items->takeFirst();
|
||||
m_items->removeAll (item);
|
||||
delete item;
|
||||
}
|
||||
|
||||
m_itemmap->clear ();
|
||||
|
||||
if (signal != XMMS_PLAYLIST_CHANGED_CLEAR) {
|
||||
xmmsh.requestPlaylistList ();
|
||||
} else {
|
||||
doResize ();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
update ();
|
||||
}
|
||||
|
||||
void
|
||||
PlaylistList::currentID (uint id)
|
||||
{
|
||||
PlaylistItem *i = m_itemmap->value (id);
|
||||
if (!i) {
|
||||
m_active = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
m_active = m_items->indexOf (i);
|
||||
|
||||
update ();
|
||||
}
|
||||
|
||||
void
|
||||
PlaylistList::mediainfoChanged (uint id, const Xmms::PropDict &info)
|
||||
{
|
||||
PlaylistItem *i = m_itemmap->value (id);
|
||||
if (i) {
|
||||
QString n;
|
||||
if (info.contains ("title")) {
|
||||
if (info.contains ("artist")) {
|
||||
n = QString::fromUtf8 (info.get<std::string> ("artist").c_str ()) + " - ";
|
||||
}
|
||||
if (info.contains ("album")) {
|
||||
n += QString::fromUtf8 (info.get<std::string> ("album").c_str ()) + " - ";
|
||||
}
|
||||
n += QString::fromUtf8 (info.get<std::string> ("title").c_str ());
|
||||
} else if (info.contains ("channel")) {
|
||||
n = QString::fromUtf8 (info.get<std::string> ("channel").c_str ())
|
||||
+ " - " +
|
||||
QString::fromUtf8 (info.get<std::string> ("title").c_str ());
|
||||
} else {
|
||||
n = QString::fromUtf8 (info.get<std::string> ("url").c_str ());
|
||||
n = n.section ("/", -1);
|
||||
}
|
||||
|
||||
i->setText (n);
|
||||
|
||||
if (info.contains ("duration")) {
|
||||
unsigned int duration = info.get<int32_t> ("duration");
|
||||
if (duration != (uint)-1) {
|
||||
QString dur;
|
||||
dur.sprintf ("%02d:%02d", duration/60000, (duration/1000)%60);
|
||||
i->setDuration (dur);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
update ();
|
||||
}
|
||||
|
||||
void
|
||||
PlaylistList::playlistList (const Xmms::List< unsigned int > &list)
|
||||
{
|
||||
for (list.first (); list.isValid (); ++list) {
|
||||
if (m_itemmap->contains (*list)) {
|
||||
addItem (m_itemmap->value (*list));
|
||||
} else {
|
||||
new PlaylistItem (this, *list);
|
||||
}
|
||||
}
|
||||
|
||||
update ();
|
||||
}
|
||||
|
||||
void
|
||||
PlaylistList::mouseDoubleClickEvent (QMouseEvent *event)
|
||||
{
|
||||
if (m_items->count() < 1 || m_selected->count() < 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
PlaylistItem *it = m_items->value (m_selected->first());
|
||||
if (!it) {
|
||||
return;
|
||||
}
|
||||
|
||||
XMMSHandler &xmmsh = XMMSHandler::getInstance ();
|
||||
xmmsh.requestTrackChange (m_items->indexOf(it));
|
||||
if (m_status == XMMS_PLAYBACK_STATUS_STOP ||
|
||||
m_status == XMMS_PLAYBACK_STATUS_PAUSE)
|
||||
{
|
||||
xmmsh.play ();
|
||||
}
|
||||
}
|
||||
|
||||
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(), Qt::TextSingleLine, t);
|
||||
paint.end ();
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
void
|
||||
PlaylistList::showMenu (void)
|
||||
{
|
||||
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);
|
||||
qm.addAction (a);
|
||||
|
||||
qm.addSeparator ();
|
||||
|
||||
a = new QAction (tr ("Medialib browser"), this);
|
||||
qm.addAction (a);
|
||||
|
||||
qm.exec (QCursor::pos ());
|
||||
}
|
||||
|
||||
void
|
||||
PlaylistList::mousePressEvent (QMouseEvent *event)
|
||||
{
|
||||
if (m_items->count() < 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
int i = ((event->pos().y()+m_offset) / getFontH());
|
||||
|
||||
if (i < 0) {
|
||||
i = 0;
|
||||
}
|
||||
|
||||
if (i > (m_items->count () - 1)) {
|
||||
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+1; y <= i; y++) {
|
||||
m_selected->append (y);
|
||||
}
|
||||
} else {
|
||||
for (int y = i; y < o; y++) {
|
||||
m_selected->append (y);
|
||||
}
|
||||
}
|
||||
} 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);
|
||||
}
|
||||
|
||||
m_dragstart = event->pos ();
|
||||
}
|
||||
} else if (event->button () == Qt::RightButton) {
|
||||
showMenu ();
|
||||
}
|
||||
|
||||
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();
|
||||
QByteArray encodedData;
|
||||
|
||||
QDataStream stream (&encodedData, QIODevice::WriteOnly);
|
||||
stream << QString::number (m_selected->last ());
|
||||
|
||||
m_md->setData("application/playlist.move", encodedData);
|
||||
|
||||
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 ();
|
||||
|
||||
m_drag->start ();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
PlaylistList::dragEnterEvent (QDragEnterEvent *event)
|
||||
{
|
||||
|
||||
if (event->mimeData()->hasFormat("application/mlib.album") ||
|
||||
event->mimeData()->hasFormat("application/mlib.artist") ||
|
||||
event->mimeData()->hasFormat("application/mlib.song") ||
|
||||
event->mimeData()->hasFormat("application/playlist.move"))
|
||||
event->acceptProposedAction();
|
||||
}
|
||||
|
||||
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 (event->mimeData()->hasFormat("application/playlist.move")) {
|
||||
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);
|
||||
|
||||
event->acceptProposedAction ();
|
||||
}
|
||||
/*
|
||||
} else if (event->mimeData()->hasFormat("application/mlib.album")) {
|
||||
const QMimeData *md = event->mimeData ();
|
||||
QByteArray encodedData = md->data("application/mlib.album");
|
||||
QDataStream stream(&encodedData, QIODevice::ReadOnly);
|
||||
|
||||
QString artist;
|
||||
QString album;
|
||||
stream >> artist;
|
||||
stream >> album;
|
||||
|
||||
QString query;
|
||||
if (artist == "Various Artists") {
|
||||
query.sprintf ("select m1.id as id, ifnull(m3.value,-1) as tracknr from Media m1 join Media m2 on m1.id = m2.id and m2.key='compilation' left join Media m3 on m1.id = m3.id and m3.key='tracknr' where m1.key='album' and m1.value='%s' and m2.value=1 order by tracknr", album.toUtf8 ().data ());
|
||||
} else {
|
||||
query.sprintf ("select m1.id as id, ifnull(m3.value,-1) as tracknr from Media m1 join Media m2 on m1.id = m2.id and m2.key='album' left join Media m3 on m1.id = m3.id and m3.key='tracknr' where m1.key='artist' and m1.value='%s' and m2.value='%s' order by tracknr", artist.toUtf8 ().data (), album.toUtf8 ().data ());
|
||||
}
|
||||
|
||||
xmmsh->medialibQueryAdd (query);
|
||||
|
||||
event->acceptProposedAction ();
|
||||
} else if (event->mimeData()->hasFormat("application/mlib.artist")) {
|
||||
const QMimeData *md = event->mimeData ();
|
||||
QByteArray encodedData = md->data("application/mlib.artist");
|
||||
QDataStream stream(&encodedData, QIODevice::ReadOnly);
|
||||
|
||||
QString artist;
|
||||
stream >> artist;
|
||||
|
||||
QString query;
|
||||
if (artist == "Various Artists") {
|
||||
query.sprintf ("select m1.id as id, m2.value as album, ifnull(m3.value,-1) as tracknr from Media m1 left join Media m2 on m1.id = m2.id and m2.key='album' left join Media m3 on m1.id = m3.id and m3.key='tracknr' where m1.key='compilation' and m1.value=1 order by album, tracknr;");
|
||||
} else {
|
||||
query.sprintf ("select m1.id as id, m2.value as album, ifnull(m3.value,-1) as tracknr from Media m1 left join Media m2 on m1.id = m2.id and m2.key='album' left join Media m3 on m1.id = m3.id and m3.key='tracknr' where m1.key='artist' and m1.value='%s' order by album, tracknr", artist.toUtf8 ().data ());
|
||||
}
|
||||
|
||||
xmmsh->medialibQueryAdd (query);
|
||||
event->acceptProposedAction ();
|
||||
} else if (event->mimeData()->hasFormat("application/mlib.song")) {
|
||||
const QMimeData *md = event->mimeData ();
|
||||
QByteArray encodedData = md->data("application/mlib.song");
|
||||
QDataStream stream(&encodedData, QIODevice::ReadOnly);
|
||||
|
||||
QString artist;
|
||||
QString album;
|
||||
QString song;
|
||||
stream >> artist;
|
||||
stream >> album;
|
||||
stream >> song;
|
||||
|
||||
QString query;
|
||||
query.sprintf ("select m1.id as id, ifnull(m1.value, '[unknown]') as artist, ifnull(m2.value,'[unknown]') as album, ifnull(m4.value,m5.value) as song from Media m1 left join Media m2 on m1.id = m2.id and m2.key='album' left join Media m4 on m1.id = m4.id and m4.key='title' left join Media m5 on m1.id = m5.id and m5.key='url' where m1.key='artist' and artist='%s' and album='%s' and song='%s'", artist.toUtf8 ().data (), album.toUtf8 ().data (), song.toUtf8 ().data ());
|
||||
|
||||
xmmsh->medialibQueryAdd (query);
|
||||
|
||||
event->acceptProposedAction ();
|
||||
}
|
||||
m_bar = -2;
|
||||
update ();
|
||||
*/
|
||||
}
|
||||
|
||||
void
|
||||
PlaylistList::keyPressEvent (QKeyEvent *event)
|
||||
{
|
||||
|
||||
QWidget *w = dynamic_cast<QWidget*>(parent());
|
||||
QSize s = w->size ();
|
||||
int lastitem = (m_offset + s.height()) / getFontH () - 1;
|
||||
if (lastitem > m_items->count())
|
||||
lastitem = m_items->count() - 1;
|
||||
int firstitem = m_offset / getFontH();
|
||||
|
||||
switch (event->key ()) {
|
||||
case Qt::Key_Down:
|
||||
{
|
||||
int i = m_selected->last ();
|
||||
i ++;
|
||||
|
||||
if (i > (m_items->count () - 1))
|
||||
i = m_items->count () - 1;
|
||||
|
||||
m_selected->clear ();
|
||||
m_selected->append (i);
|
||||
|
||||
if (i > lastitem)
|
||||
setOffset (m_offset += getFontH ());
|
||||
|
||||
update ();
|
||||
emit sizeChanged (size());
|
||||
}
|
||||
break;
|
||||
case Qt::Key_Up:
|
||||
{
|
||||
int i = m_selected->last ();
|
||||
i --;
|
||||
if (i < 0)
|
||||
i = 0;
|
||||
m_selected->clear ();
|
||||
m_selected->append (i);
|
||||
if (i < firstitem)
|
||||
setOffset (m_offset -= getFontH ());
|
||||
|
||||
update ();
|
||||
emit sizeChanged (size());
|
||||
}
|
||||
break;
|
||||
case Qt::Key_Backspace:
|
||||
case Qt::Key_Delete:
|
||||
{
|
||||
deleteFiles ();
|
||||
}
|
||||
break;
|
||||
case Qt::Key_A:
|
||||
{
|
||||
if (event->modifiers() == Qt::ControlModifier) {
|
||||
m_selected->clear ();
|
||||
for (int i = 0; i < m_items->count (); i ++) {
|
||||
m_selected->append (i);
|
||||
}
|
||||
update ();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
PlaylistList::deleteFiles ()
|
||||
{
|
||||
XMMSHandler &xmmsh = XMMSHandler::getInstance ();
|
||||
|
||||
//Sort list and remove in reverse order
|
||||
qSort (*m_selected);
|
||||
for (int i = (m_selected->count () - 1); i >= 0; i --) {
|
||||
xmmsh.playlistRemove (m_selected->value (i));
|
||||
}
|
||||
m_selected->clear ();
|
||||
}
|
||||
|
||||
void
|
||||
PlaylistList::paintEvent (QPaintEvent *event)
|
||||
{
|
||||
int i;
|
||||
QPainter paint;
|
||||
paint.begin (this);
|
||||
paint.setFont (*m_font);
|
||||
/*
|
||||
paint.setClipping (false);
|
||||
*/
|
||||
paint.setPen (QPen (m_color_normal));
|
||||
|
||||
int cy = event->rect().y () + m_offset;
|
||||
int ch = event->rect().height();
|
||||
int sitem = cy / getFontH();
|
||||
int eitem = (cy + ch) / getFontH();
|
||||
int mod = m_offset - (getFontH() * sitem);
|
||||
|
||||
if (eitem > m_items->count())
|
||||
eitem = m_items->count();
|
||||
|
||||
QString q;
|
||||
QRect fullLine;
|
||||
QRect textLine;
|
||||
QRect numLine;
|
||||
|
||||
for (i = sitem; i < eitem; i++) {
|
||||
PlaylistItem *item = m_items->value (i);
|
||||
|
||||
int tw = m_fontmetrics->width(item->duration ())+2;
|
||||
|
||||
fullLine.setRect(0, (getFontH()*(i-sitem)) - mod,
|
||||
size().width(), getFontH());
|
||||
textLine.setRect(0, (getFontH()*(i-sitem)) - mod,
|
||||
size().width()-tw-4, getFontH());
|
||||
numLine.setRect(size().width()-tw, (getFontH()*(i-sitem)) - mod,
|
||||
tw, getFontH());
|
||||
|
||||
q = QString::number (i + 1) + ". " + item->text ();
|
||||
|
||||
if (m_selected->contains (i)) {
|
||||
paint.fillRect (fullLine, QBrush (m_color_selected));
|
||||
} else {
|
||||
paint.eraseRect (fullLine);
|
||||
}
|
||||
|
||||
if (m_active == i) {
|
||||
paint.setPen (QPen (m_color_active));
|
||||
paint.drawText (textLine, Qt::TextSingleLine, q);
|
||||
paint.drawText (numLine, item->duration ());
|
||||
paint.setPen (QPen (m_color_normal));
|
||||
} else {
|
||||
paint.drawText (textLine, Qt::TextSingleLine, q);
|
||||
paint.drawText (numLine, item->duration ());
|
||||
}
|
||||
|
||||
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, fullLine.y()+getFontH(), size().width()-2,
|
||||
fullLine.y()+getFontH());
|
||||
paint.restore ();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ((getFontH()*(i-sitem) - mod) < size().height()) {
|
||||
paint.eraseRect (QRect (0, (getFontH()*(i-sitem) - mod),
|
||||
size().width(),
|
||||
size().height()-(getFontH()*(i-sitem) - mod)));
|
||||
}
|
||||
|
||||
paint.end ();
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
PlaylistList::doResize (void)
|
||||
{
|
||||
QWidget *w = dynamic_cast<QWidget*>(parent());
|
||||
QSize s = w->size ();
|
||||
|
||||
if (m_items->count()*getFontH () > s.height ()) {
|
||||
resize (size().width(), m_items->count ()*getFontH ());
|
||||
} else {
|
||||
resize (size().width(), s.height());
|
||||
setOffset (0);
|
||||
}
|
||||
emit sizeChanged (size());
|
||||
}
|
||||
|
||||
void
|
||||
PlaylistList::addItem (PlaylistItem *i, uint pos)
|
||||
{
|
||||
m_items->insert (pos, i);
|
||||
if (!m_itemmap->contains (i->getID())) {
|
||||
m_itemmap->insert (i->getID(), i);
|
||||
}
|
||||
doResize ();
|
||||
}
|
||||
|
||||
void
|
||||
PlaylistList::addItem (PlaylistItem *i)
|
||||
{
|
||||
m_items->append (i);
|
||||
if (!m_itemmap->contains (i->getID())) {
|
||||
m_itemmap->insert (i->getID(), i);
|
||||
}
|
||||
doResize ();
|
||||
}
|
||||
|
||||
int
|
||||
PlaylistList::getFontH (void)
|
||||
{
|
||||
if (!m_fontmetrics) {
|
||||
return 0;
|
||||
}
|
||||
return m_fontmetrics->height();
|
||||
}
|
||||
|
||||
void
|
||||
PlaylistList::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"));
|
||||
|
||||
update ();
|
||||
}
|
||||
|
||||
void
|
||||
PlaylistList::setSize (int width, int height)
|
||||
{
|
||||
int nx, ny;
|
||||
nx = width;
|
||||
|
||||
if (height > size().height()) {
|
||||
ny = height;
|
||||
} else {
|
||||
ny = size().height();
|
||||
}
|
||||
|
||||
resize (nx, ny);
|
||||
}
|
||||
|
||||
|
108
src/PlaylistList.h
Normal file
108
src/PlaylistList.h
Normal file
|
@ -0,0 +1,108 @@
|
|||
#ifndef __PLAYLISTLIST_H__
|
||||
#define __PLAYLISTLIST_H__
|
||||
|
||||
#include <xmmsclient/xmmsclient++.h>
|
||||
#include "Skin.h"
|
||||
#include <QWidget>
|
||||
#include <QHash>
|
||||
|
||||
#include <QDrag>
|
||||
|
||||
class PlaylistItem;
|
||||
|
||||
class PlaylistView : public QWidget {
|
||||
public:
|
||||
PlaylistView (QWidget *parent) : QWidget (parent) {}
|
||||
~PlaylistView () {}
|
||||
};
|
||||
|
||||
class PlaylistList : public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
PlaylistList (QWidget *parent);
|
||||
~PlaylistList () {}
|
||||
|
||||
void setSize (int, int);
|
||||
void addItem (PlaylistItem *i);
|
||||
void addItem (PlaylistItem *i, uint pos);
|
||||
void setOffset (int i) { m_offset = i; }
|
||||
uint getOffset (void) const { return m_offset; }
|
||||
void doResize (void);
|
||||
|
||||
public slots:
|
||||
void setPixmaps (Skin *skin);
|
||||
void playlistList (const Xmms::List< unsigned int > &);
|
||||
void mediainfoChanged (uint, const Xmms::PropDict &);
|
||||
void playlistChanged (const Xmms::Dict &);
|
||||
void currentID (uint);
|
||||
void setStatus (Xmms::Playback::Status s);
|
||||
void settingsSaved ();
|
||||
void deleteFiles ();
|
||||
|
||||
signals:
|
||||
void sizeChanged (QSize);
|
||||
|
||||
private:
|
||||
void showMenu (void);
|
||||
void paintEvent (QPaintEvent *event);
|
||||
void mousePressEvent (QMouseEvent *event);
|
||||
void mouseMoveEvent (QMouseEvent *event);
|
||||
void mouseDoubleClickEvent (QMouseEvent *event);
|
||||
void keyPressEvent (QKeyEvent *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<uint> *m_selected;
|
||||
QHash<uint,PlaylistItem*> *m_itemmap;
|
||||
|
||||
QFont *m_font;
|
||||
QFontMetrics *m_fontmetrics;
|
||||
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;
|
||||
Xmms::Playback::Status m_status;
|
||||
|
||||
QDrag *m_drag;
|
||||
QMimeData *m_md;
|
||||
};
|
||||
|
||||
class PlaylistItem {
|
||||
public:
|
||||
PlaylistItem (PlaylistList *pl, uint, uint);
|
||||
PlaylistItem (PlaylistList *pl, uint);
|
||||
~PlaylistItem () {}
|
||||
|
||||
QString text (void);
|
||||
QString duration (void) { return m_duration; }
|
||||
|
||||
uint getID (void) { return m_id; }
|
||||
void setDuration (QString s) { m_duration = s; }
|
||||
void setText (QString s) { m_text = s; }
|
||||
|
||||
private:
|
||||
uint m_id;
|
||||
PlaylistList *m_pl;
|
||||
|
||||
bool m_req;
|
||||
QString m_text;
|
||||
QString m_duration;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
144
src/PlaylistMenu.cpp
Normal file
144
src/PlaylistMenu.cpp
Normal 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 ();
|
||||
}
|
85
src/PlaylistMenu.h
Normal file
85
src/PlaylistMenu.h
Normal 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
|
124
src/PlaylistShade.cpp
Normal file
124
src/PlaylistShade.cpp
Normal 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 ();
|
||||
|
||||
}
|
||||
|
40
src/PlaylistShade.h
Normal file
40
src/PlaylistShade.h
Normal 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
|
221
src/PlaylistView.cpp
Normal file
221
src/PlaylistView.cpp
Normal file
|
@ -0,0 +1,221 @@
|
|||
// TODO might not need those
|
||||
#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) : QTableView (parent)
|
||||
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::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);
|
||||
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());
|
||||
// TODO check for status first.
|
||||
if (m_status == XMMS_PLAYBACK_STATUS_STOP ||
|
||||
m_status == XMMS_PLAYBACK_STATUS_PAUSE) {
|
||||
xmmsh.play ();
|
||||
}
|
||||
}
|
57
src/PlaylistView.h
Normal file
57
src/PlaylistView.h
Normal file
|
@ -0,0 +1,57 @@
|
|||
#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 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
|
166
src/PosBar.cpp
Normal file
166
src/PosBar.cpp
Normal file
|
@ -0,0 +1,166 @@
|
|||
#include "MainWindow.h"
|
||||
|
||||
#include "PosBar.h"
|
||||
#include "Skin.h"
|
||||
|
||||
#include <QWidget>
|
||||
#include <QMouseEvent>
|
||||
|
||||
PosButton::PosButton (QWidget *parent, uint normal, uint pressed) : Button (parent, normal, pressed)
|
||||
{
|
||||
m_slider = dynamic_cast<PosBar *>(parent);
|
||||
setMinimumSize (29, 10);
|
||||
setMaximumSize (29, 10);
|
||||
m_moving = false;
|
||||
}
|
||||
|
||||
void
|
||||
PosButton::setPos (uint pos)
|
||||
{
|
||||
m_pos = pos;
|
||||
if (!m_moving) {
|
||||
move (pos, 0);
|
||||
}
|
||||
}
|
||||
|
||||
uint
|
||||
PosButton::getPos (void)
|
||||
{
|
||||
return m_pos;
|
||||
}
|
||||
|
||||
void
|
||||
PosButton::mousePressEvent (QMouseEvent *event)
|
||||
{
|
||||
QPoint p (event->pos ());
|
||||
|
||||
m_diffx = p.x();
|
||||
m_moving = true;
|
||||
}
|
||||
|
||||
void
|
||||
PosButton::mouseReleaseEvent (QMouseEvent *event)
|
||||
{
|
||||
m_moving = false;
|
||||
|
||||
float value = pos().x() / (float)(m_slider->width() - width());
|
||||
|
||||
m_slider->requestPos (value);
|
||||
}
|
||||
|
||||
void
|
||||
PosButton::mouseMoveEvent (QMouseEvent *event)
|
||||
{
|
||||
QPoint p (event->pos ());
|
||||
|
||||
/** @todo this could be cleaned up */
|
||||
if (m_slider->getVertical ()) {
|
||||
int npos = pos().x() + p.x() - m_diffx;
|
||||
if (npos >= 0 && (npos + rect().width()) <= m_slider->rect().width()) {
|
||||
move (npos, 0);
|
||||
} else if (npos < 0) {
|
||||
move (0, 0);
|
||||
} else if (npos + rect().width() > m_slider->rect().width()) {
|
||||
move (m_slider->rect().width() - rect().width(), 0);
|
||||
}
|
||||
} else {
|
||||
int npos = pos().y() + p.y() - m_diffy;
|
||||
if (npos >= 0 && (npos + rect().height()) <= m_slider->rect().height()) {
|
||||
move (npos, 0);
|
||||
} else if (npos < 0) {
|
||||
move (0, 0);
|
||||
} else if (npos + rect().height() > m_slider->rect().height()) {
|
||||
move (m_slider->rect().height() - rect().height(), 0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
PosBar::PosBar (QWidget *parent, uint bg, uint bnormal, uint bpressed, bool vertical) : PixWidget (parent)
|
||||
{
|
||||
m_bg = bg;
|
||||
m_vertical = vertical;
|
||||
|
||||
setMinimumSize (248, 10);
|
||||
setMaximumSize (248, 10);
|
||||
|
||||
m_max = 0;
|
||||
|
||||
m_button = new PosButton (this, bnormal, bpressed);
|
||||
m_button->move (0, 0);
|
||||
|
||||
if (m_vertical) {
|
||||
m_pix = size().width()-m_button->size().width();
|
||||
} else {
|
||||
m_pix = size().height()-m_button->size().height();
|
||||
}
|
||||
|
||||
hideBar (true);
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
PosBar::setSize (uint x, uint y)
|
||||
{
|
||||
setMinimumSize (x, y);
|
||||
setMaximumSize (x, y);
|
||||
|
||||
if (m_vertical) {
|
||||
m_pix = size().width()-m_button->size().width();
|
||||
} else {
|
||||
m_pix = size().height()-m_button->size().height();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
uint
|
||||
PosBar::getPos (void)
|
||||
{
|
||||
|
||||
if (m_vertical) {
|
||||
return (uint)((float)m_button->pos().x()) / (float)(m_pix) * float(m_max);
|
||||
} else {
|
||||
return (uint)((float)m_button->pos().y())/((float)(m_pix*m_max));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
PosBar::hideBar (bool b)
|
||||
{
|
||||
|
||||
if (b) {
|
||||
m_button->hide ();
|
||||
} else {
|
||||
m_button->show ();
|
||||
}
|
||||
update();
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
PosBar::setPos (uint p)
|
||||
{
|
||||
if (!m_max) {
|
||||
return;
|
||||
}
|
||||
|
||||
uint x = m_pix * p / m_max;
|
||||
if (x < m_pix - m_button->rect().width() && x != m_button->getPos()) {
|
||||
m_button->setPos (x);
|
||||
update ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
PosBar::requestPos (float value)
|
||||
{
|
||||
XMMSHandler::getInstance ().setPlaytime (m_max * value);
|
||||
}
|
||||
|
||||
void
|
||||
PosBar::setPixmaps (Skin *skin)
|
||||
{
|
||||
m_pixmap = skin->getItem (m_bg);
|
||||
}
|
||||
|
57
src/PosBar.h
Normal file
57
src/PosBar.h
Normal file
|
@ -0,0 +1,57 @@
|
|||
#ifndef __SLIDER_H__
|
||||
#define __SLIDER_H__
|
||||
|
||||
#include "PixWidget.h"
|
||||
#include "Button.h"
|
||||
|
||||
class PosBar;
|
||||
|
||||
class PosButton : public Button
|
||||
{
|
||||
public:
|
||||
PosButton (QWidget *, uint, uint);
|
||||
|
||||
void mouseMoveEvent (QMouseEvent *);
|
||||
void mousePressEvent (QMouseEvent *);
|
||||
void mouseReleaseEvent (QMouseEvent *);
|
||||
|
||||
void setPos (uint pos);
|
||||
uint getPos (void);
|
||||
|
||||
private:
|
||||
PosBar *m_slider;
|
||||
bool m_moving;
|
||||
uint m_pos;
|
||||
};
|
||||
|
||||
class PosBar : public PixWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
PosBar (QWidget *parent, uint bg, uint bnormal, uint bpressed, bool vertical=true);
|
||||
~PosBar () { }
|
||||
|
||||
void setSize (uint, uint);
|
||||
uint getPos (void);
|
||||
void setPos (uint);
|
||||
void requestPos (float value);
|
||||
|
||||
void setMax (uint max) { m_max = max; }
|
||||
uint getMax () { return m_max; }
|
||||
void hideBar (bool b);
|
||||
bool getVertical () { return m_vertical; }
|
||||
|
||||
public slots:
|
||||
void setPixmaps (Skin *skin);
|
||||
|
||||
private:
|
||||
bool m_vertical;
|
||||
int m_bg;
|
||||
uint m_max;
|
||||
uint m_pix;
|
||||
PosButton *m_button;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
190
src/ServerBrowser.cpp
Normal file
190
src/ServerBrowser.cpp
Normal file
|
@ -0,0 +1,190 @@
|
|||
#include "ServerBrowser.h"
|
||||
|
||||
#include <QPushButton>
|
||||
|
||||
ServerBrowserWindow::ServerBrowserWindow (QWidget *parent) : QMainWindow (parent)
|
||||
{
|
||||
#ifndef _WIN32
|
||||
setWindowIcon (QIcon (":icon.png"));
|
||||
#endif
|
||||
setWindowFlags (Qt::Dialog);
|
||||
setWindowModality (Qt::ApplicationModal);
|
||||
setAttribute (Qt::WA_DeleteOnClose);
|
||||
|
||||
QWidget *c = new QWidget (this);
|
||||
setCentralWidget (c);
|
||||
|
||||
QVBoxLayout *vbox = new QVBoxLayout (c);
|
||||
QLabel *label = new QLabel ("Available XMMS2 servers...", c);
|
||||
label->setFont (QFont ("Helvetica", 16));
|
||||
vbox->addWidget (label);
|
||||
|
||||
m_list = new ServerBrowserList (c);
|
||||
vbox->addWidget (m_list);
|
||||
|
||||
c = new QWidget (c);
|
||||
QHBoxLayout *hbox = new QHBoxLayout (c);
|
||||
vbox->addWidget (c);
|
||||
|
||||
QPushButton *connect = new QPushButton ("Connect", c);
|
||||
hbox->addWidget (new QWidget (), 1);
|
||||
hbox->addWidget (connect);
|
||||
|
||||
resize (300, 400);
|
||||
}
|
||||
|
||||
ServerBrowserList::ServerBrowserList (QWidget *parent) : QListWidget (parent)
|
||||
{
|
||||
setIconSize (QSize (32, 32));
|
||||
setupAvahi ();
|
||||
|
||||
|
||||
connect (this, SIGNAL (itemDoubleClicked (QListWidgetItem *)),
|
||||
SLOT (connectServer (QListWidgetItem *)));
|
||||
}
|
||||
|
||||
void
|
||||
ServerBrowserList::connectServer (QListWidgetItem *it)
|
||||
{
|
||||
ServerBrowserWindow *sw = dynamic_cast<ServerBrowserWindow*> (window ());
|
||||
|
||||
XMMSHandler *xmmsh = XMMSHandler::getInstance ();
|
||||
ServerItem *item = dynamic_cast<ServerItem*> (it);
|
||||
if (xmmsh->connect (item->path ().toAscii())) {
|
||||
sw->close ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ServerBrowserList::addServer (const QString &name, const QString &path)
|
||||
{
|
||||
new ServerItem (QIcon (":icon.png"), name, path, this);
|
||||
update ();
|
||||
}
|
||||
|
||||
static void
|
||||
resolve_callback (AvahiServiceResolver *r,
|
||||
AvahiIfIndex interface,
|
||||
AvahiProtocol protocol,
|
||||
AvahiResolverEvent event,
|
||||
const char *name,
|
||||
const char *type,
|
||||
const char *domain,
|
||||
const char *host_name,
|
||||
const AvahiAddress *address,
|
||||
uint16_t port,
|
||||
AvahiStringList *txt,
|
||||
AvahiLookupResultFlags flags,
|
||||
void* userdata)
|
||||
{
|
||||
ServerBrowserList *sl = static_cast<ServerBrowserList*> (userdata);
|
||||
|
||||
switch (event) {
|
||||
case AVAHI_RESOLVER_FAILURE:
|
||||
qWarning ("something broke...");
|
||||
break;
|
||||
case AVAHI_RESOLVER_FOUND:
|
||||
char a[AVAHI_ADDRESS_STR_MAX];
|
||||
avahi_address_snprint (a, sizeof (a), address);
|
||||
QString path;
|
||||
path.sprintf ("tcp://%s:%u", a, port);
|
||||
|
||||
sl->addServer (QString::fromLatin1 (name), path);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
browse_callback (AvahiServiceBrowser *b,
|
||||
AvahiIfIndex interface,
|
||||
AvahiProtocol protocol,
|
||||
AvahiBrowserEvent event,
|
||||
const char *name,
|
||||
const char *type,
|
||||
const char *domain,
|
||||
AvahiLookupResultFlags flags,
|
||||
void* userdata)
|
||||
{
|
||||
ServerBrowserList *sl = static_cast<ServerBrowserList*> (userdata);
|
||||
|
||||
switch (event) {
|
||||
case AVAHI_BROWSER_FAILURE:
|
||||
|
||||
qWarning("(Browser) %s\n", avahi_strerror (avahi_client_errno(avahi_service_browser_get_client(b))));
|
||||
sl->close ();
|
||||
return;
|
||||
|
||||
case AVAHI_BROWSER_NEW:
|
||||
if (!(avahi_service_resolver_new (sl->client (), interface,
|
||||
protocol, name,
|
||||
type, domain,
|
||||
AVAHI_PROTO_UNSPEC,
|
||||
(AvahiLookupFlags) 0,
|
||||
resolve_callback, userdata)))
|
||||
{
|
||||
qWarning ("couldn't resolv service!");
|
||||
sl->close ();
|
||||
}
|
||||
break;
|
||||
|
||||
case AVAHI_BROWSER_REMOVE:
|
||||
break;
|
||||
case AVAHI_BROWSER_ALL_FOR_NOW:
|
||||
qDebug ("done!");
|
||||
break;
|
||||
case AVAHI_BROWSER_CACHE_EXHAUSTED:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
client_callback (AvahiClient *c,
|
||||
AvahiClientState state,
|
||||
void *userdata)
|
||||
{
|
||||
ServerBrowserList *sl = static_cast<ServerBrowserList*> (userdata);
|
||||
|
||||
if (state == AVAHI_CLIENT_FAILURE) {
|
||||
qWarning ("Avahi failure!!");
|
||||
sl->close ();
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
ServerBrowserList::setupAvahi (void)
|
||||
{
|
||||
int ret = 1;
|
||||
int error;
|
||||
|
||||
m_poll = avahi_qt_poll_get ();
|
||||
m_client = avahi_client_new (m_poll, (AvahiClientFlags)0, client_callback, this, &error);
|
||||
|
||||
if (!m_client) {
|
||||
qWarning ("couldn't create avahi browser!");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(m_sb = avahi_service_browser_new (m_client, AVAHI_IF_UNSPEC,
|
||||
AVAHI_PROTO_UNSPEC,
|
||||
"_xmms2._tcp", NULL, (AvahiLookupFlags)0,
|
||||
browse_callback, this))) {
|
||||
qWarning ("couldn't create avahi browser!");
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ServerBrowserList::~ServerBrowserList ()
|
||||
{
|
||||
/*
|
||||
if (m_poll) {
|
||||
delete m_poll;
|
||||
}
|
||||
if (m_client) {
|
||||
avahi_client_free (m_client);
|
||||
}
|
||||
if (m_sb) {
|
||||
avahi_service_browser_free (m_sb);
|
||||
}
|
||||
*/
|
||||
}
|
57
src/ServerBrowser.h
Normal file
57
src/ServerBrowser.h
Normal file
|
@ -0,0 +1,57 @@
|
|||
#ifndef __SERVER_BROWSER_H__
|
||||
#define __SERVER_BROWSER_H__
|
||||
|
||||
#include "XMMSHandler.h"
|
||||
|
||||
#include <QWidget>
|
||||
#include <QListWidget>
|
||||
#include <QMainWindow>
|
||||
#include <QLabel>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
#include <avahi-client/client.h>
|
||||
#include <avahi-client/lookup.h>
|
||||
#include <avahi-common/malloc.h>
|
||||
#include <avahi-common/error.h>
|
||||
#include <avahi-qt4/qt-watch.h>
|
||||
|
||||
class ServerItem : public QListWidgetItem {
|
||||
public:
|
||||
ServerItem (QIcon i, const QString &name, const QString &path, QListWidget *parent) :
|
||||
QListWidgetItem (i, name, parent) {
|
||||
m_path = path;
|
||||
setToolTip (m_path);
|
||||
}
|
||||
QString path (void) const { return m_path; }
|
||||
private:
|
||||
QString m_path;
|
||||
};
|
||||
|
||||
class ServerBrowserList : public QListWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
ServerBrowserList (QWidget *parent);
|
||||
~ServerBrowserList ();
|
||||
void addServer (const QString &, const QString &);
|
||||
bool setupAvahi (void);
|
||||
AvahiClient *client (void) const { return m_client; }
|
||||
|
||||
public slots:
|
||||
void connectServer (QListWidgetItem *);
|
||||
|
||||
private:
|
||||
const AvahiPoll *m_poll;
|
||||
AvahiClient *m_client;
|
||||
AvahiServiceBrowser *m_sb;
|
||||
};
|
||||
|
||||
class ServerBrowserWindow : public QMainWindow {
|
||||
Q_OBJECT
|
||||
public:
|
||||
ServerBrowserWindow (QWidget *parent);
|
||||
~ServerBrowserWindow () {}
|
||||
private:
|
||||
ServerBrowserList *m_list;
|
||||
};
|
||||
|
||||
#endif
|
481
src/SettingsWindow.cpp
Normal file
481
src/SettingsWindow.cpp
Normal file
|
@ -0,0 +1,481 @@
|
|||
#include "MainWindow.h"
|
||||
#include "SettingsWindow.h"
|
||||
|
||||
#include <QCheckBox>
|
||||
#include <QSettings>
|
||||
|
||||
SettingsWindow::SettingsWindow (QWidget *parent) : QMainWindow (parent)
|
||||
{
|
||||
#ifndef _WIN32
|
||||
setWindowIcon (QIcon (":icon.png"));
|
||||
#endif
|
||||
setWindowTitle ("Promoe - Settings window");
|
||||
setWindowFlags (Qt::Dialog);
|
||||
setWindowModality (Qt::ApplicationModal);
|
||||
setAttribute (Qt::WA_DeleteOnClose);
|
||||
|
||||
resize (400, 500);
|
||||
|
||||
QWidget *dummy = new QWidget (this);
|
||||
setCentralWidget (dummy);
|
||||
|
||||
QVBoxLayout *vbox = new QVBoxLayout (dummy);
|
||||
|
||||
QTabWidget *tab = new QTabWidget (dummy);
|
||||
vbox->addWidget (tab);
|
||||
|
||||
QWidget *dummy2 = new QWidget (dummy);
|
||||
QHBoxLayout *hbox = new QHBoxLayout (dummy2);
|
||||
vbox->addWidget (dummy2);
|
||||
|
||||
QPushButton *cancel = new QPushButton (tr ("Cancel"));
|
||||
cancel->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed));
|
||||
QPushButton *ok = new QPushButton (tr ("OK"));
|
||||
ok->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed));
|
||||
connect (ok, SIGNAL (clicked ()), this, SLOT (okButton ()));
|
||||
connect (cancel, SIGNAL (clicked ()), this, SLOT (close ()));
|
||||
|
||||
hbox->addWidget (new QWidget (dummy2), 1);
|
||||
hbox->addWidget (cancel);
|
||||
hbox->addWidget (ok);
|
||||
|
||||
m_mainwindow = new SettingsTabMain (NULL);
|
||||
m_playlistwin = new SettingsTabPlaylist (NULL);
|
||||
/*
|
||||
m_medialib = new SettingsTabMedialib (NULL);
|
||||
*/
|
||||
|
||||
tab->addTab (m_mainwindow, tr ("Main Window"));
|
||||
tab->addTab (m_playlistwin, tr ("Playlist Window"));
|
||||
/*
|
||||
tab->addTab (m_medialib, tr ("Medialib"));
|
||||
*/
|
||||
}
|
||||
|
||||
void
|
||||
SettingsWindow::okButton (void)
|
||||
{
|
||||
m_mainwindow->saveSettings ();
|
||||
m_playlistwin->saveSettings ();
|
||||
|
||||
close ();
|
||||
}
|
||||
|
||||
/*
|
||||
SettingsTabMedialib::SettingsTabMedialib (QWidget *parent) : QWidget (parent)
|
||||
{
|
||||
QSettings s;
|
||||
|
||||
if (!s.contains ("medialib_artist/size")) {
|
||||
s.setValue ("medialib_artist/size", tr ("Large"));
|
||||
}
|
||||
|
||||
if (!s.contains ("medialib_album/size")) {
|
||||
s.setValue ("medialib_album/size", tr ("Large"));
|
||||
}
|
||||
|
||||
if (!s.contains ("medialib_song/size")) {
|
||||
s.setValue ("medialib_song/size", tr ("Large"));
|
||||
}
|
||||
|
||||
s.beginGroup("medialib");
|
||||
QWidget *dummy = new QWidget (this);
|
||||
|
||||
QVBoxLayout *vbox = new QVBoxLayout (dummy);
|
||||
QWidget *c = new QWidget (dummy);
|
||||
QHBoxLayout *h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c, 1);
|
||||
|
||||
m_selected = new QComboBox (c);
|
||||
m_selected->addItem (tr ("Artists"));
|
||||
m_selected->addItem (tr ("Albums"));
|
||||
m_selected->addItem (tr ("Songs"));
|
||||
m_selected->setEditable (false);
|
||||
|
||||
QString curr = s.value ("selected").toString ();
|
||||
for (int i = 0; i < m_selected->count(); i++) {
|
||||
if (m_selected->itemText (i) == curr) {
|
||||
m_selected->setCurrentIndex (i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
h->addWidget (m_selected);
|
||||
|
||||
QLabel *l = new QLabel (tr ("Selected tab on startup"), c);
|
||||
h->addWidget (l, 1);
|
||||
|
||||
s.endGroup ();
|
||||
|
||||
c = new QWidget (dummy);
|
||||
h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c, 1);
|
||||
|
||||
s.beginGroup ("medialib_artist");
|
||||
|
||||
l = new QLabel (tr ("Artist view"), c);
|
||||
|
||||
QFrame *f = new QFrame (c);
|
||||
f->setFrameStyle (QFrame::HLine | QFrame::Raised);
|
||||
h->addWidget (l);
|
||||
h->addWidget (f, 1);
|
||||
|
||||
c = new QWidget (dummy);
|
||||
h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c, 1);
|
||||
|
||||
m_artistsize = new QComboBox (c);
|
||||
m_artistsize->addItem (tr ("None"));
|
||||
m_artistsize->addItem (tr ("Small"));
|
||||
m_artistsize->addItem (tr ("Large"));
|
||||
m_artistsize->setEditable (false);
|
||||
|
||||
curr = s.value ("size").toString ();
|
||||
for (int i = 0; i < m_artistsize->count(); i++) {
|
||||
if (m_artistsize->itemText (i) == curr) {
|
||||
m_artistsize->setCurrentIndex (i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
h->addWidget (m_artistsize);
|
||||
l = new QLabel (tr ("Size of media art icon"), c);
|
||||
h->addWidget (l, 1);
|
||||
|
||||
s.endGroup ();
|
||||
|
||||
c = new QWidget (dummy);
|
||||
h = new QHBoxLayout (c);
|
||||
vbox->addWidget (c, 1);
|
||||
|
||||
s.beginGroup ("medialib_album");
|
||||
|
||||
l = new QLabel (tr ("Album view"), c);
|
||||
|
||||
f = new QFrame (c);
|
||||
f->setFrameStyle (QFrame::HLine | QFrame::Raised);
|
||||
h->addWidget (l);
|
||||
h->addWidget (f, 1);
|
||||
|
||||
c = new QWidget (dummy);
|
||||
h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c, 1);
|
||||
|
||||
m_albumsize = new QComboBox (c);
|
||||
m_albumsize->addItem (tr ("None"));
|
||||
m_albumsize->addItem (tr ("Small"));
|
||||
m_albumsize->addItem (tr ("Large"));
|
||||
m_albumsize->setEditable (false);
|
||||
|
||||
curr = s.value ("size").toString ();
|
||||
for (int i = 0; i < m_artistsize->count(); i++) {
|
||||
if (m_albumsize->itemText (i) == curr) {
|
||||
m_albumsize->setCurrentIndex (i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
h->addWidget (m_albumsize);
|
||||
l = new QLabel (tr ("Size of media art icon"), c);
|
||||
h->addWidget (l, 1);
|
||||
|
||||
s.endGroup ();
|
||||
|
||||
c = new QWidget (dummy);
|
||||
h = new QHBoxLayout (c);
|
||||
vbox->addWidget (c, 1);
|
||||
|
||||
s.beginGroup ("medialib_song");
|
||||
|
||||
l = new QLabel (tr ("Song view"), c);
|
||||
|
||||
f = new QFrame (c);
|
||||
f->setFrameStyle (QFrame::HLine | QFrame::Raised);
|
||||
h->addWidget (l);
|
||||
h->addWidget (f, 1);
|
||||
|
||||
c = new QWidget (dummy);
|
||||
h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c, 1);
|
||||
|
||||
m_songsize = new QComboBox (c);
|
||||
m_songsize->addItem (tr ("None"));
|
||||
m_songsize->addItem (tr ("Small"));
|
||||
m_songsize->addItem (tr ("Large"));
|
||||
m_songsize->setEditable (false);
|
||||
|
||||
curr = s.value ("size").toString ();
|
||||
for (int i = 0; i < m_artistsize->count(); i++) {
|
||||
if (m_songsize->itemText (i) == curr) {
|
||||
m_songsize->setCurrentIndex (i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
h->addWidget (m_songsize);
|
||||
l = new QLabel (tr ("Size of media art icon"), c);
|
||||
h->addWidget (l, 1);
|
||||
|
||||
s.endGroup ();
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
SettingsTabMedialib::saveSettings ()
|
||||
{
|
||||
QSettings s;
|
||||
s.setValue ("medialib/selected", m_selected->currentText ());
|
||||
s.setValue ("medialib_artist/size", m_artistsize->currentText ());
|
||||
s.setValue ("medialib_album/size", m_albumsize->currentText ());
|
||||
s.setValue ("medialib_song/size", m_songsize->currentText ());
|
||||
}
|
||||
*/
|
||||
|
||||
SettingsTabPlaylist::SettingsTabPlaylist (QWidget *parent) : QWidget (parent)
|
||||
{
|
||||
QSettings s;
|
||||
|
||||
s.beginGroup("playlist");
|
||||
QWidget *dummy = new QWidget (this);
|
||||
|
||||
QVBoxLayout *vbox = new QVBoxLayout (dummy);
|
||||
QWidget *c = new QWidget (dummy);
|
||||
QHBoxLayout *h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c, 1);
|
||||
|
||||
m_fontsize = new QSpinBox (c);
|
||||
m_fontsize->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed));
|
||||
m_fontsize->setMinimum (6);
|
||||
m_fontsize->setMaximum (20);
|
||||
m_fontsize->setValue (s.value("fontsize").toInt ());
|
||||
h->addWidget (m_fontsize);
|
||||
|
||||
QLabel *l = new QLabel (tr ("Playlist fontsize"), c);
|
||||
h->addWidget (l, 1);
|
||||
|
||||
c = new QWidget (dummy);
|
||||
h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c, 1);
|
||||
|
||||
m_shadesize = new QSpinBox (c);
|
||||
m_shadesize->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed));
|
||||
m_shadesize->setMinimum (6);
|
||||
m_shadesize->setMaximum (20);
|
||||
m_shadesize->setValue (s.value("shadedsize").toInt ());
|
||||
h->addWidget (m_shadesize);
|
||||
|
||||
l = new QLabel (tr ("Playlist shaded mode fontsize"), c);
|
||||
h->addWidget (l, 1);
|
||||
|
||||
QFrame *f = new QFrame (dummy);
|
||||
f->setFrameStyle (QFrame::HLine | QFrame::Raised);
|
||||
vbox->addWidget (f);
|
||||
|
||||
c = new QWidget (dummy);
|
||||
h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c, 1);
|
||||
|
||||
m_remote_fs = new QCheckBox (c);
|
||||
if (!s.contains ("useremote"))
|
||||
s.setValue ("useremote", false);
|
||||
m_remote_fs->setCheckState (s.value ("useremote").toBool () ? Qt::Checked : Qt::Unchecked);
|
||||
h->addWidget (m_remote_fs);
|
||||
|
||||
l = new QLabel (tr ("Use remote filebrowsing"), c);
|
||||
h->addWidget (l, 1);
|
||||
|
||||
s.endGroup ();
|
||||
}
|
||||
|
||||
void
|
||||
SettingsTabPlaylist::saveSettings (void)
|
||||
{
|
||||
QSettings s;
|
||||
s.setValue ("playlist/fontsize", m_fontsize->value ());
|
||||
s.setValue ("playlist/shadedsize", m_shadesize->value ());
|
||||
s.setValue ("playlist/useremote", m_remote_fs->checkState () == Qt::Checked);
|
||||
}
|
||||
|
||||
SettingsTabMain::SettingsTabMain (QWidget *parent) : QWidget (parent)
|
||||
{
|
||||
QSettings s;
|
||||
|
||||
QWidget *dummy = new QWidget (this);
|
||||
|
||||
QVBoxLayout *vbox = new QVBoxLayout (dummy);
|
||||
QWidget *c = new QWidget (dummy);
|
||||
QHBoxLayout *h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c, 1);
|
||||
|
||||
m_quitonclose = new QCheckBox (tr ("Quit XMMS2D when closing Promoe"), c);
|
||||
if (s.contains ("promoe/quitonclose"))
|
||||
s.setValue ("promoe/quitonclose", false);
|
||||
m_quitonclose->setCheckState (s.value ("promoe/quitonclose").toBool () ? Qt::Checked : Qt::Unchecked);
|
||||
h->addWidget (m_quitonclose);
|
||||
|
||||
c = new QWidget (dummy);
|
||||
h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c, 1);
|
||||
|
||||
QLabel *l = new QLabel (tr ("Unshaded view"), c);
|
||||
|
||||
QFrame *f = new QFrame (c);
|
||||
f->setFrameStyle (QFrame::HLine | QFrame::Raised);
|
||||
h->addWidget (l);
|
||||
h->addWidget (f, 1);
|
||||
|
||||
c = new QWidget (dummy);
|
||||
h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c, 1);
|
||||
|
||||
s.beginGroup ("display_main");
|
||||
m_mainscroll = new QCheckBox (tr ("Scroll titlebar"), c);
|
||||
|
||||
if (s.value("scroll").toBool ())
|
||||
m_mainscroll->setCheckState (Qt::Checked);
|
||||
else
|
||||
m_mainscroll->setCheckState (Qt::Unchecked);
|
||||
|
||||
h->addWidget (m_mainscroll);
|
||||
|
||||
m_mainsize = new QSpinBox (c);
|
||||
m_mainsize->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed));
|
||||
m_mainsize->setMinimum (6);
|
||||
m_mainsize->setMaximum (20);
|
||||
m_mainsize->setValue (s.value("fontsize").toInt ());
|
||||
h->addWidget (m_mainsize);
|
||||
|
||||
l = new QLabel (tr ("Titlebar fontsize"), c);
|
||||
l->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed));
|
||||
h->addWidget (l);
|
||||
|
||||
c = new QWidget (dummy);
|
||||
h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c, 1);
|
||||
|
||||
m_mainttf = new QCheckBox (tr ("Draw text with TrueType fonts"), c);
|
||||
m_mainttf->setCheckState (s.value ("ttf").toBool () ? Qt::Checked : Qt::Unchecked);
|
||||
h->addWidget (m_mainttf);
|
||||
|
||||
|
||||
s.endGroup ();
|
||||
|
||||
|
||||
c = new QWidget (dummy);
|
||||
h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c, 1);
|
||||
|
||||
l = new QLabel (tr ("Shaded view"), c);
|
||||
|
||||
f = new QFrame (c);
|
||||
f->setFrameStyle (QFrame::HLine | QFrame::Raised);
|
||||
h->addWidget (l);
|
||||
h->addWidget (f, 1);
|
||||
|
||||
c = new QWidget (dummy);
|
||||
h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c, 1);
|
||||
|
||||
s.beginGroup ("display_shaded");
|
||||
m_shadescroll = new QCheckBox (tr ("Scroll titlebar"), c);
|
||||
|
||||
if (s.value("scroll").toBool ())
|
||||
m_shadescroll->setCheckState (Qt::Checked);
|
||||
else
|
||||
m_shadescroll->setCheckState (Qt::Unchecked);
|
||||
|
||||
h->addWidget (m_shadescroll);
|
||||
|
||||
m_shadesize = new QSpinBox (c);
|
||||
m_shadesize->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed));
|
||||
m_shadesize->setMinimum (6);
|
||||
m_shadesize->setMaximum (20);
|
||||
m_shadesize->setValue (s.value("fontsize").toInt ());
|
||||
h->addWidget (m_shadesize);
|
||||
|
||||
l = new QLabel (tr ("Titlebar fontsize"), c);
|
||||
l->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed));
|
||||
h->addWidget (l);
|
||||
|
||||
c = new QWidget (dummy);
|
||||
h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c, 1);
|
||||
|
||||
m_shadettf = new QCheckBox (tr ("Draw text with TrueType fonts"), c);
|
||||
m_shadettf->setCheckState (s.value ("ttf").toBool () ? Qt::Checked : Qt::Unchecked);
|
||||
h->addWidget (m_shadettf);
|
||||
|
||||
/*
|
||||
|
||||
QFrame *f = new QFrame (dummy);
|
||||
f->setFrameStyle (QFrame::HLine | QFrame::Raised);
|
||||
vbox->addWidget (f, 1);
|
||||
|
||||
c = new QWidget (this);
|
||||
h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c);
|
||||
|
||||
m_mainttf = new QCheckBox (tr ("Draw main title with TrueType fonts"), this);
|
||||
m_mainttf->setCheckState (s.value ("mainttf").toBool () ? Qt::Checked : Qt::Unchecked);
|
||||
h->addWidget (m_mainttf);
|
||||
|
||||
c = new QWidget (this);
|
||||
h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c);
|
||||
|
||||
m_shadettf = new QCheckBox (tr ("Draw shaded title with TrueType fonts"), this);
|
||||
m_shadettf->setCheckState (s.value ("shadettf").toBool () ? Qt::Checked : Qt::Unchecked);
|
||||
h->addWidget (m_shadettf);
|
||||
|
||||
f = new QFrame (this);
|
||||
f->setFrameStyle (QFrame::HLine | QFrame::Raised);
|
||||
vbox->addWidget (f, 1);
|
||||
|
||||
c = new QWidget (this);
|
||||
h = new QHBoxLayout (c);
|
||||
|
||||
vbox->addWidget (c);
|
||||
|
||||
|
||||
|
||||
s.endGroup ();
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
SettingsTabMain::saveSettings (void)
|
||||
{
|
||||
QSettings s;
|
||||
|
||||
s.setValue ("promoe/quitonclose", m_quitonclose->checkState () == Qt::Checked);
|
||||
|
||||
s.beginGroup ("display_main");
|
||||
s.setValue ("scroll", m_mainscroll->checkState () == Qt::Checked);
|
||||
s.setValue ("fontsize", m_mainsize->value ());
|
||||
s.setValue ("ttf", m_mainttf->checkState () == Qt::Checked);
|
||||
s.endGroup ();
|
||||
|
||||
s.beginGroup ("display_shaded");
|
||||
s.setValue ("scroll", m_shadescroll->checkState () == Qt::Checked);
|
||||
s.setValue ("fontsize", m_shadesize->value ());
|
||||
s.setValue ("ttf", m_shadettf->checkState () == Qt::Checked);
|
||||
s.endGroup ();
|
||||
}
|
77
src/SettingsWindow.h
Normal file
77
src/SettingsWindow.h
Normal file
|
@ -0,0 +1,77 @@
|
|||
#ifndef __SETTINGSWINDOW_H__
|
||||
#define __SETTINGSWINDOW_H__
|
||||
|
||||
#include <QMainWindow>
|
||||
#include <QTabWidget>
|
||||
#include <QPushButton>
|
||||
#include <QVBoxLayout>
|
||||
#include <QCheckBox>
|
||||
#include <QHBoxLayout>
|
||||
#include <QSpinBox>
|
||||
#include <QLabel>
|
||||
#include <QComboBox>
|
||||
|
||||
class SettingsTabMedialib : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
SettingsTabMedialib (QWidget *parent);
|
||||
~SettingsTabMedialib () {}
|
||||
void saveSettings (void);
|
||||
|
||||
private:
|
||||
QComboBox *m_selected;
|
||||
QComboBox *m_artistsize;
|
||||
QComboBox *m_albumsize;
|
||||
QComboBox *m_songsize;
|
||||
};
|
||||
|
||||
class SettingsTabPlaylist : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
SettingsTabPlaylist (QWidget *parent);
|
||||
~SettingsTabPlaylist () {}
|
||||
void saveSettings (void);
|
||||
|
||||
private:
|
||||
QSpinBox *m_fontsize;
|
||||
QSpinBox *m_shadesize;
|
||||
QCheckBox *m_remote_fs;
|
||||
};
|
||||
|
||||
class SettingsTabMain : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
SettingsTabMain (QWidget *parent);
|
||||
~SettingsTabMain () {}
|
||||
void saveSettings (void);
|
||||
|
||||
|
||||
private:
|
||||
QCheckBox *m_quitonclose;
|
||||
|
||||
QSpinBox *m_mainsize;
|
||||
QCheckBox *m_mainttf;
|
||||
QCheckBox *m_mainscroll;
|
||||
QSpinBox *m_shadesize;
|
||||
QCheckBox *m_shadettf;
|
||||
QCheckBox *m_shadescroll;
|
||||
};
|
||||
|
||||
class SettingsWindow : public QMainWindow {
|
||||
Q_OBJECT
|
||||
public:
|
||||
SettingsWindow (QWidget *parent);
|
||||
~SettingsWindow () {}
|
||||
|
||||
public slots:
|
||||
void okButton (void);
|
||||
|
||||
private:
|
||||
SettingsTabMain *m_mainwindow;
|
||||
SettingsTabPlaylist *m_playlistwin;
|
||||
SettingsTabMedialib *m_medialib;
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif
|
108
src/ShadedDisplay.cpp
Normal file
108
src/ShadedDisplay.cpp
Normal file
|
@ -0,0 +1,108 @@
|
|||
#include <xmmsclient/xmmsclient++.h>
|
||||
#include "XMMSHandler.h"
|
||||
|
||||
#include "ShadedDisplay.h"
|
||||
#include "TitleBar.h"
|
||||
#include "Button.h"
|
||||
|
||||
#include "SmallNumberDisplay.h"
|
||||
#include "TextBar.h"
|
||||
|
||||
ShadedDisplay::ShadedDisplay (QWidget *parent) : SkinDisplay (parent)
|
||||
{
|
||||
XMMSHandler &xmmsh = XMMSHandler::getInstance ();
|
||||
|
||||
setMinimumSize (275, 14);
|
||||
setMaximumSize (275, 14);
|
||||
|
||||
m_tbar = new TitleBar(this, true);
|
||||
m_tbar->move (0, 0);
|
||||
|
||||
m_number = new SmallNumberDisplay (this, 10);
|
||||
m_number->move (135, 4);
|
||||
m_number->setNumber (0, 2);
|
||||
|
||||
m_number2 = new SmallNumberDisplay (this, 10);
|
||||
m_number2->move (147, 4);
|
||||
m_number2->setNumber (0, 2);
|
||||
|
||||
m_title = new TextScroller (this, 39, 7, "shaded");
|
||||
m_title->move (79, 4);
|
||||
|
||||
m_prev = new Button (this);
|
||||
m_prev->move(169, 4);
|
||||
m_prev->resize (8, 7);
|
||||
connect (m_prev, SIGNAL(clicked()), &xmmsh, SLOT(prev()));
|
||||
|
||||
m_play = new Button (this);
|
||||
m_play->move(177, 4);
|
||||
m_play->resize (10, 7);
|
||||
connect (m_play, SIGNAL(clicked()), &xmmsh, SLOT(play()));
|
||||
|
||||
m_pause = new Button (this);
|
||||
m_pause->move(187, 4);
|
||||
m_pause->resize (10, 7);
|
||||
connect (m_pause, SIGNAL(clicked()), &xmmsh, SLOT(pause()));
|
||||
|
||||
m_stop = new Button (this);
|
||||
m_stop->move(197, 4);
|
||||
m_stop->resize (9, 7);
|
||||
connect (m_stop, SIGNAL(clicked()), &xmmsh, SLOT(stop()));
|
||||
|
||||
m_next = new Button (this);
|
||||
m_next->move(206, 4);
|
||||
m_next->resize (8, 7);
|
||||
connect (m_next, SIGNAL(clicked()), &xmmsh, SLOT(next()));
|
||||
|
||||
m_eject = new Button (this);
|
||||
m_eject->move(216, 4);
|
||||
m_eject->resize (9, 7);
|
||||
connect (m_eject, SIGNAL(clicked()), this, SLOT(fileOpen()));
|
||||
|
||||
connect (&xmmsh, SIGNAL(playbackStatusChanged(Xmms::Playback::Status)),
|
||||
this, SLOT(setStatus(Xmms::Playback::Status)));
|
||||
connect (xmmsh.cache (), SIGNAL (playtime (uint32_t)),
|
||||
this, SLOT ( setPlaytime(uint32_t)));
|
||||
connect (&xmmsh, SIGNAL(currentSong (const Xmms::PropDict &)),
|
||||
this, SLOT(setMediainfo (const Xmms::PropDict &)));
|
||||
}
|
||||
|
||||
void
|
||||
ShadedDisplay::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_title->setText (n);
|
||||
}
|
||||
|
||||
void
|
||||
ShadedDisplay::setStatus (Xmms::Playback::Status status)
|
||||
{
|
||||
if (status == Xmms::Playback::STOPPED) {
|
||||
m_number->setNumber (0, 2);
|
||||
m_number2->setNumber (0, 2);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ShadedDisplay::setPlaytime (uint32_t time)
|
||||
{
|
||||
uint sec, min;
|
||||
|
||||
sec = (time / 1000) % 60;
|
||||
min = (time / 1000) / 60;
|
||||
|
||||
m_number2->setNumber (sec, 2);
|
||||
m_number->setNumber (min, 2);
|
||||
}
|
||||
|
||||
|
39
src/ShadedDisplay.h
Normal file
39
src/ShadedDisplay.h
Normal file
|
@ -0,0 +1,39 @@
|
|||
#ifndef __SHADEDDISPLAY_H__
|
||||
#define __SHADEDDISPLAY_H__
|
||||
|
||||
class ShadedDisplay;
|
||||
|
||||
#include <xmmsclient/xmmsclient++.h>
|
||||
#include "Display.h"
|
||||
|
||||
class MainWindow;
|
||||
class Button;
|
||||
class SmallNumberDisplay;
|
||||
class TextScroller;
|
||||
|
||||
class ShadedDisplay : public SkinDisplay
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ShadedDisplay (QWidget *parent);
|
||||
~ShadedDisplay () { }
|
||||
|
||||
SmallNumberDisplay *m_number;
|
||||
SmallNumberDisplay *m_number2;
|
||||
TextScroller *m_title;
|
||||
|
||||
private:
|
||||
Button *m_prev;
|
||||
Button *m_play;
|
||||
Button *m_pause;
|
||||
Button *m_stop;
|
||||
Button *m_next;
|
||||
Button *m_eject;
|
||||
|
||||
public slots:
|
||||
void setStatus (Xmms::Playback::Status status);
|
||||
void setPlaytime (uint32_t time);
|
||||
void setMediainfo (const Xmms::PropDict &info);
|
||||
};
|
||||
|
||||
#endif
|
604
src/Skin.cpp
Normal file
604
src/Skin.cpp
Normal file
|
@ -0,0 +1,604 @@
|
|||
#include "Skin.h"
|
||||
|
||||
Skin *Skin::singleton = NULL;
|
||||
|
||||
Skin *Skin::getInstance (void)
|
||||
{
|
||||
if (!singleton) {
|
||||
singleton = new Skin ();
|
||||
}
|
||||
|
||||
return singleton;
|
||||
}
|
||||
|
||||
void
|
||||
Skin::BuildEqualizer (void)
|
||||
{
|
||||
QPixmap *img = getPixmap ("eqmain");
|
||||
if (img) {
|
||||
m_items[EQ_WIN_BG] = img->copy (0, 0, 275, 116);
|
||||
m_items[EQ_WIN_ON_0] = img->copy (10, 119, 25, 12);
|
||||
m_items[EQ_WIN_ON_1] = img->copy (128, 119, 25, 12);
|
||||
m_items[EQ_WIN_OFF_1] = img->copy (187, 119, 25, 12);
|
||||
m_items[EQ_WIN_OFF_0] = img->copy (69, 119, 25, 12);
|
||||
|
||||
m_items[EQ_WIN_AUTO_ON_0] = img->copy (35, 119, 33, 12);
|
||||
m_items[EQ_WIN_AUTO_ON_1] = img->copy (153, 119, 33, 12);
|
||||
m_items[EQ_WIN_AUTO_OFF_1] = img->copy (212, 119, 33, 12);
|
||||
m_items[EQ_WIN_AUTO_OFF_0] = img->copy (94, 119, 33, 12);
|
||||
|
||||
m_items[EQ_WIN_PRESET_0] = img->copy (224, 164, 44, 12);
|
||||
m_items[EQ_WIN_PRESET_1] = img->copy (224, 176, 44, 12);
|
||||
|
||||
m_items[EQ_WIN_GRAPH_BG] = img->copy (0, 294, 113, 19);
|
||||
|
||||
for (int i = 0; i < 14; i++) {
|
||||
m_items[EQ_WIN_BAR_POS_0+i] = img->copy (13+15*i, 164, 14, 63);
|
||||
}
|
||||
for (int i = 0; i < 14; i++) {
|
||||
m_items[EQ_WIN_BAR_POS_14+i] = img->copy (13+15*i, 229, 14, 63);
|
||||
}
|
||||
|
||||
m_items[EQ_WIN_BAR_BTN_1] = img->copy (0, 164, 11, 11);
|
||||
m_items[EQ_WIN_BAR_BTN_0] = img->copy (0, 176, 11, 11);
|
||||
|
||||
delete img;
|
||||
} else {
|
||||
setSkin(":CleanAMP/");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Skin::BuildPlaylist (void)
|
||||
{
|
||||
QPixmap tmp;
|
||||
|
||||
QPixmap *img = getPixmap ("pledit");
|
||||
|
||||
if(img)
|
||||
{
|
||||
m_playlist[PLS_CORNER_UL_0] = img->copy(0, 0, 25, 20);
|
||||
m_playlist[PLS_CORNER_UL_1] = img->copy(0, 21, 25, 20);
|
||||
|
||||
m_playlist[PLS_TBAR_0] = img->copy (26, 0, 100, 20);
|
||||
m_playlist[PLS_TBAR_1] = img->copy (26, 21, 100, 20);
|
||||
|
||||
m_playlist[PLS_CORNER_UR_0] = img->copy(153, 0, 25, 20);
|
||||
m_playlist[PLS_CORNER_UR_1] = img->copy(153, 21, 25, 20);
|
||||
|
||||
m_playlist[PLS_TFILL_0] = img->copy(127, 0, 25, 20);
|
||||
m_playlist[PLS_TFILL_1] = img->copy(127, 21, 25, 20);
|
||||
|
||||
m_playlist[PLS_BFILL_0] = img->copy(179, 0, 25, 38);
|
||||
|
||||
m_playlist[PLS_VISMINI_0] = img->copy(205, 0, 75, 38);
|
||||
|
||||
m_playlist[PLS_LFILL_0] = img->copy(0, 42, 12, 29);
|
||||
|
||||
m_playlist[PLS_RFILL_0] = img->copy(31, 42, 5, 29);
|
||||
m_playlist[PLS_RFILL2_0] = img->copy(36, 42, 8, 29);
|
||||
m_playlist[PLS_RFILL3_0] = img->copy(44, 42, 7, 29);
|
||||
|
||||
tmp = m_playlist[PLS_CORNER_UR_0];
|
||||
|
||||
m_playlist[PLS_CLOSE_BTN_0] = tmp.copy(14, 3, 9, 9);
|
||||
m_playlist[PLS_CLOSE_BTN_1] = img->copy(52, 42, 9, 9);
|
||||
|
||||
m_playlist[PLS_SHADE_BTN_0] = tmp.copy(14, 3, 9, 9);
|
||||
m_playlist[PLS_SHADE_BTN_1] = img->copy(62, 42, 9, 9);
|
||||
|
||||
m_playlist[PLS_MAX_BTN_0] = img->copy(150, 42, 9, 9);
|
||||
|
||||
m_playlist[PLS_SCROLL_0] = img->copy(52, 53, 8, 18);
|
||||
m_playlist[PLS_SCROLL_1] = img->copy(61, 53, 8, 18);
|
||||
|
||||
m_playlist[PLS_WS_LE_0] = img->copy(72, 42, 25, 14);
|
||||
m_playlist[PLS_WS_RE_0] = img->copy(99, 42, 50, 14);
|
||||
m_playlist[PLS_WS_RE_1] = img->copy(99, 57, 50, 14);
|
||||
m_playlist[PLS_WS_MID_0] = img->copy(72, 57, 25, 14);
|
||||
|
||||
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;
|
||||
}
|
||||
else
|
||||
setSkin(":CleanAMP/");
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
Skin::setSkin (const QString& name)
|
||||
{
|
||||
m_path = name;
|
||||
|
||||
m_items.clear();
|
||||
BuildButtons();
|
||||
BuildToggleButtons();
|
||||
BuildTitleBar();
|
||||
BuildOther();
|
||||
BuildEqualizer ();
|
||||
|
||||
m_letterMap.clear();
|
||||
BuildLetterMap();
|
||||
|
||||
BuildSliders();
|
||||
|
||||
m_pledit_txt.clear();
|
||||
ParsePLEdit();
|
||||
|
||||
m_numbers.clear();
|
||||
BuildNumbers();
|
||||
|
||||
m_playlist.clear ();
|
||||
BuildPlaylist ();
|
||||
|
||||
emit skinChanged(this);
|
||||
}
|
||||
|
||||
QPixmap
|
||||
Skin::getPixmap (const QString& file, QDir dir)
|
||||
{
|
||||
/* check for files in zip and check if file exists */
|
||||
|
||||
dir.setFilter (QDir::Files);
|
||||
|
||||
QFileInfoList list = dir.entryInfoList();
|
||||
for (int i = 0; i < list.size(); ++i) {
|
||||
QFileInfo fileInfo = list.at(i);
|
||||
QString fname = fileInfo.fileName().toLower();
|
||||
if (fname.section(".", 0, 0) == file) {
|
||||
return QPixmap (fileInfo.filePath());
|
||||
}
|
||||
}
|
||||
|
||||
return QPixmap (0,0);
|
||||
}
|
||||
|
||||
|
||||
QPixmap *
|
||||
Skin::getPixmap (const QString& file)
|
||||
{
|
||||
QDir dir;
|
||||
|
||||
dir.setPath (m_path);
|
||||
dir.setFilter (QDir::Files);
|
||||
|
||||
QFileInfoList list = dir.entryInfoList();
|
||||
for (int i = 0; i < list.size(); ++i) {
|
||||
QFileInfo fileInfo = list.at(i);
|
||||
QString fname = fileInfo.fileName().toLower();
|
||||
if (fname.section(".", 0, 0) == file) {
|
||||
return new QPixmap (fileInfo.filePath());
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Skin::BuildLetterMap (void)
|
||||
{
|
||||
QPixmap *img = getPixmap("text");
|
||||
|
||||
if(img)
|
||||
{
|
||||
QList<QList<QPixmap> >(letters);
|
||||
for (int i = 0; i < 3; i++) {
|
||||
QList<QPixmap>(l);
|
||||
for (int j = 0; j < 31; j++) {
|
||||
l.append(img->copy(j*5, i*6, 4, 6));
|
||||
}
|
||||
letters.append(l);
|
||||
}
|
||||
|
||||
delete img;
|
||||
|
||||
|
||||
/* alphabet */
|
||||
for (uint i = 97; i < 123; i++) {
|
||||
m_letterMap[i] = letters[0][i-97];
|
||||
}
|
||||
|
||||
/* digits */
|
||||
for (uint i = 0; i <= 9; i++) {
|
||||
m_letterMap[i+48] = letters[1][i];
|
||||
}
|
||||
|
||||
/* special characters */
|
||||
m_letterMap['"'] = letters[0][27];
|
||||
m_letterMap['@'] = letters[0][28];
|
||||
m_letterMap['('] = letters[1][13];
|
||||
m_letterMap[')'] = letters[1][14];
|
||||
m_letterMap['-'] = letters[1][15];
|
||||
m_letterMap['\''] = letters[1][16];
|
||||
m_letterMap['`'] = letters[1][16];
|
||||
m_letterMap['!'] = letters[1][17];
|
||||
m_letterMap['_'] = letters[1][18];
|
||||
m_letterMap['+'] = letters[1][19];
|
||||
m_letterMap['\\'] = letters[1][20];
|
||||
m_letterMap['/'] = letters[1][21];
|
||||
m_letterMap['['] = letters[1][22];
|
||||
m_letterMap[']'] = letters[1][23];
|
||||
m_letterMap['^'] = letters[1][24];
|
||||
m_letterMap['&'] = letters[1][25];
|
||||
m_letterMap['%'] = letters[1][26];
|
||||
m_letterMap['.'] = letters[1][27];
|
||||
m_letterMap[','] = letters[1][27];
|
||||
m_letterMap['='] = letters[1][28];
|
||||
m_letterMap['$'] = letters[1][29];
|
||||
m_letterMap['#'] = letters[1][30];
|
||||
|
||||
m_letterMap[229] = letters[2][0];
|
||||
m_letterMap[246] = letters[2][1];
|
||||
m_letterMap[228] = letters[2][2];
|
||||
m_letterMap['?'] = letters[2][3];
|
||||
m_letterMap['*'] = letters[2][4];
|
||||
m_letterMap[' '] = letters[2][5];
|
||||
|
||||
/* text background */
|
||||
m_items[TEXTBG] = letters[2][6];
|
||||
}
|
||||
else
|
||||
setSkin(":CleanAMP/");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Skin::BuildButtons (void)
|
||||
{
|
||||
QPixmap *img = getPixmap("cbuttons");
|
||||
if(img)
|
||||
{
|
||||
m_items[BTN_PREV_0] = img->copy(0, 0, 23, 18);
|
||||
m_items[BTN_PREV_1] = img->copy(0, 18, 23, 18);
|
||||
|
||||
m_items[BTN_PLAY_0] = img->copy(23, 0, 23, 18);
|
||||
m_items[BTN_PLAY_1] = img->copy(23, 18, 23, 18);
|
||||
|
||||
m_items[BTN_PAUSE_0] = img->copy(46, 0, 23, 18);
|
||||
m_items[BTN_PAUSE_1] = img->copy(46, 18, 23, 18);
|
||||
|
||||
m_items[BTN_STOP_0] = img->copy(69, 0, 23, 18);
|
||||
m_items[BTN_STOP_1] = img->copy(69, 18, 23, 18);
|
||||
|
||||
m_items[BTN_NEXT_0] = img->copy(92, 0, 22, 18);
|
||||
m_items[BTN_NEXT_1] = img->copy(92, 18, 22, 18);
|
||||
|
||||
m_items[BTN_EJECT_0] = img->copy(114, 0, 22, 16);
|
||||
m_items[BTN_EJECT_1] = img->copy(114, 16, 22, 16);
|
||||
|
||||
delete img;
|
||||
}
|
||||
else
|
||||
setSkin(":CleanAMP/");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Skin::BuildToggleButtons (void)
|
||||
{
|
||||
QPixmap *img = getPixmap("shufrep");
|
||||
|
||||
if(img)
|
||||
{
|
||||
m_items[REPEAT_ON_0] = img->copy(0, 30, 28, 15);
|
||||
m_items[REPEAT_ON_1] = img->copy(0, 45, 28, 15);
|
||||
|
||||
m_items[REPEAT_OFF_0] = img->copy(0, 0, 28, 15);
|
||||
m_items[REPEAT_OFF_1] = img->copy(0, 15, 28, 15);
|
||||
|
||||
m_items[SHUFFLE_ON_0] = img->copy(28, 30, 46, 15);
|
||||
m_items[SHUFFLE_ON_1] = img->copy(28, 45, 46, 15);
|
||||
|
||||
m_items[SHUFFLE_OFF_0] = img->copy(28, 0, 46, 15);
|
||||
m_items[SHUFFLE_OFF_1] = img->copy(28, 15, 46, 15);
|
||||
|
||||
m_items[EQ_ON_0] = img->copy( 0, 73, 23, 12);
|
||||
m_items[EQ_ON_1] = img->copy(46, 73, 23, 12);
|
||||
|
||||
m_items[EQ_OFF_0] = img->copy( 0, 61, 23, 12);
|
||||
m_items[EQ_OFF_1] = img->copy(46, 61, 23, 12);
|
||||
|
||||
m_items[PLS_ON_0] = img->copy(23, 73, 23, 12);
|
||||
m_items[PLS_ON_1] = img->copy(69, 73, 23, 12);
|
||||
|
||||
m_items[PLS_OFF_0] = img->copy(23, 61, 23, 12);
|
||||
m_items[PLS_OFF_1] = img->copy(69, 61, 23, 12);
|
||||
|
||||
delete img;
|
||||
}
|
||||
else
|
||||
setSkin(":CleanAMP/");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Skin::BuildTitleBar (void)
|
||||
{
|
||||
QPixmap *img = getPixmap("titlebar");
|
||||
|
||||
if(img)
|
||||
{
|
||||
m_items[MENUBUTTON_0] = img->copy(0, 0, 9, 9);
|
||||
m_items[MENUBUTTON_1] = img->copy(0, 9, 9, 9);
|
||||
|
||||
m_items[MINIMIZE_0] = img->copy(9, 0, 9, 9);
|
||||
m_items[MINIMIZE_1] = img->copy(9, 9, 9, 9);
|
||||
|
||||
m_items[CLOSE_0] = img->copy(18, 0, 9, 9);
|
||||
m_items[CLOSE_1] = img->copy(18, 9, 9 ,9);
|
||||
|
||||
m_items[SHADE_1_0] = img->copy(0, 18, 9, 9);
|
||||
m_items[SHADE_1_1] = img->copy(9, 18, 9, 9);
|
||||
|
||||
m_items[SHADE_2_0] = img->copy(0, 27, 9, 9);
|
||||
m_items[SHADE_2_1] = img->copy(9, 27, 9, 9);
|
||||
|
||||
m_items[TITLEBAR_0] = img->copy(27, 0, 275, 14);
|
||||
m_items[TITLEBAR_1] = img->copy(27, 15, 275, 14);
|
||||
|
||||
m_items[STATUSBAR_0] = img->copy(27, 29, 275, 14);
|
||||
m_items[STATUSBAR_1] = img->copy(27, 29+13, 275, 14);
|
||||
|
||||
m_items[CLUTTER_ON] = img->copy(304+8*0, 0, 8, 43);
|
||||
m_items[CLUTTER_OFF] = img->copy(304+8*1, 0, 8, 43);
|
||||
|
||||
m_items[CLUTTER_O] = img->copy(304+8*0, 44, 8, 43);
|
||||
m_items[CLUTTER_A] = img->copy(304+8*1, 44, 8, 43);
|
||||
m_items[CLUTTER_I] = img->copy(304+8*2, 44, 8, 43);
|
||||
m_items[CLUTTER_D] = img->copy(304+8*3, 44, 8, 43);
|
||||
m_items[CLUTTER_V] = img->copy(304+8*4, 44, 8, 43);
|
||||
|
||||
delete img;
|
||||
}
|
||||
else
|
||||
setSkin(":CleanAMP/");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Skin::BuildOther (void)
|
||||
{
|
||||
QPixmap *img, *part;
|
||||
QPainter(painter);
|
||||
|
||||
img = getPixmap("monoster");
|
||||
if(img)
|
||||
{
|
||||
m_items[MONO_1] = img->copy(29, 0, 27, 12);
|
||||
m_items[MONO_0] = img->copy(29, 12, 27, 12);
|
||||
m_items[STEREO_1] = img->copy(0, 0, 29, 12);
|
||||
m_items[STEREO_0] = img->copy(0, 12, 29, 12);
|
||||
delete img;
|
||||
}
|
||||
else
|
||||
setSkin(":CleanAMP/");
|
||||
|
||||
img = getPixmap("playpaus");
|
||||
if(img)
|
||||
{
|
||||
part = new QPixmap(11, 9);
|
||||
painter.begin(part);
|
||||
painter.drawPixmap (0, 0, 3, 9, *img, 36, 0, 3, 9);
|
||||
painter.drawPixmap (3, 0, 8, 9, *img, 1, 0, 8, 9);
|
||||
painter.end();
|
||||
m_items[PIC_PLAY] = part->copy();
|
||||
delete part;
|
||||
|
||||
part = new QPixmap(11, 9);
|
||||
painter.begin(part);
|
||||
painter.drawPixmap (0, 0, 2, 9, *img, 27, 0, 2, 9);
|
||||
painter.drawPixmap (2, 0, 9, 9, *img, 9, 0, 9, 9);
|
||||
painter.end();
|
||||
m_items[PIC_PAUSE] = part->copy();
|
||||
delete part;
|
||||
|
||||
part = new QPixmap(11, 9);
|
||||
painter.begin(part);
|
||||
painter.drawPixmap (0, 0, 2, 9, *img, 27, 0, 2, 9);
|
||||
painter.drawPixmap (2, 0, 9, 9, *img, 18, 0, 9, 9);
|
||||
painter.end();
|
||||
m_items[PIC_STOP] = part->copy();
|
||||
delete part;
|
||||
|
||||
delete img;
|
||||
}
|
||||
else
|
||||
setSkin(":CleanAMP/");
|
||||
|
||||
img = getPixmap ("main");
|
||||
if(img)
|
||||
{
|
||||
m_items[MAIN_WINDOW] = img->copy();
|
||||
m_items[ABOUT_0] = img->copy(247, 83, 20, 25);
|
||||
m_items[ABOUT_1] = img->copy(247, 83, 20, 24);
|
||||
delete img;
|
||||
}
|
||||
else
|
||||
setSkin(":CleanAMP/");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Skin::BuildSliders (void)
|
||||
{
|
||||
QPixmap *img;
|
||||
|
||||
img = getPixmap("posbar");
|
||||
if (img) {
|
||||
m_items[POSBAR] = img->copy (0, 0, 248, 10);
|
||||
m_items[POSBAR_BTN_0] = img->copy (248, 0, 29, 10);
|
||||
m_items[POSBAR_BTN_1] = img->copy (278, 0, 29, 10);
|
||||
|
||||
delete img;
|
||||
} else {
|
||||
setSkin(":CleanAMP/");
|
||||
}
|
||||
|
||||
img = getPixmap("volume");
|
||||
if (img) {
|
||||
for (int i = 0; i <= 27; i++) {
|
||||
m_items[VOLUMEBAR_POS_0+i] = img->copy(0, i*15, 68, 13);
|
||||
}
|
||||
|
||||
if (img->height() > 420) {
|
||||
m_items[VOLBAR_BTN_1] = img->copy (0, 422, 14, 11);
|
||||
m_items[VOLBAR_BTN_0] = img->copy (15, 422, 14, 11);
|
||||
}
|
||||
|
||||
delete img;
|
||||
} else {
|
||||
setSkin(":CleanAMP/");
|
||||
}
|
||||
|
||||
img = getPixmap("balance");
|
||||
if (!img) {
|
||||
img = getPixmap("volume");
|
||||
}
|
||||
|
||||
if (img) {
|
||||
for (int i = 0; i < 28; i++) {
|
||||
m_items[BALANCE_POS_0+i] = img->copy(9, i*15, 38, 13);
|
||||
}
|
||||
|
||||
if (img->height() > 421) {
|
||||
m_items[BALANCE_BTN_0] = img->copy(0, 422, 14, 11);
|
||||
m_items[BALANCE_BTN_1] = img->copy(15, 422, 14, 11);
|
||||
}
|
||||
|
||||
delete img;
|
||||
} else {
|
||||
setSkin(":CleanAMP/");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Skin::BuildNumbers (void)
|
||||
{
|
||||
uint num = 11;
|
||||
|
||||
QPixmap *img = getPixmap("numbers");
|
||||
if (!img) {
|
||||
num = 12;
|
||||
img = getPixmap ("nums_ex");
|
||||
}
|
||||
|
||||
if(img)
|
||||
{
|
||||
for (uint i = 0; i < num; i++) {
|
||||
m_numbers[i] = img->copy (i*9, 0, 9, 13);
|
||||
}
|
||||
delete img;
|
||||
}
|
||||
else
|
||||
setSkin(":CleanAMP/");
|
||||
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Skin::ParsePLEdit (void)
|
||||
{
|
||||
QDir dir;
|
||||
QString path;
|
||||
|
||||
dir.setPath (m_path);
|
||||
dir.setFilter (QDir::Files);
|
||||
|
||||
QFileInfoList list = dir.entryInfoList();
|
||||
for (int i = 0; i < list.size(); ++i) {
|
||||
QFileInfo fileInfo = list.at(i);
|
||||
if (fileInfo.fileName().toLower() == "pledit.txt") {
|
||||
path += fileInfo.filePath ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (path.isNull ()) {
|
||||
qDebug ("trasigt!");
|
||||
return;
|
||||
}
|
||||
|
||||
QFile file (path);
|
||||
|
||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
||||
return;
|
||||
|
||||
while (!file.atEnd ()) {
|
||||
QByteArray line = file.readLine ();
|
||||
QList<QByteArray> l = line.split ('=');
|
||||
if (l.count () == 2) {
|
||||
m_pledit_txt[l[0].toLower ()] = l[1].trimmed();
|
||||
} else if (line.length() == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
330
src/Skin.h
Normal file
330
src/Skin.h
Normal file
|
@ -0,0 +1,330 @@
|
|||
#ifndef __SKIN_H__
|
||||
#define __SKIN_H__
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <QPixmap>
|
||||
#include <QPainter>
|
||||
#include <QWidget>
|
||||
#include <QMap>
|
||||
#include <QDir>
|
||||
|
||||
class Skin : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
static Skin *getInstance (void);
|
||||
|
||||
void setSkin (const QString& name);
|
||||
static QPixmap getPixmap (const QString&, QDir);
|
||||
|
||||
const QPixmap getItem (uint part) const { return m_items[part]; }
|
||||
const QPixmap getPls (uint part) const { return m_playlist[part]; }
|
||||
const QPixmap getLetter (uint c) const { return m_letterMap[c]; }
|
||||
const QPixmap getNumber (uint c) const { return m_numbers[c]; }
|
||||
uint getNumberSize () { return m_numbers.size(); }
|
||||
const QByteArray getPLeditValue (QByteArray c) const { return m_pledit_txt[c]; }
|
||||
|
||||
enum Part {
|
||||
NONE,
|
||||
MAIN_WINDOW,
|
||||
ABOUT_0,
|
||||
ABOUT_1,
|
||||
MONO_0,
|
||||
MONO_1,
|
||||
STEREO_0,
|
||||
STEREO_1,
|
||||
MENUBUTTON_0,
|
||||
MENUBUTTON_1,
|
||||
MINIMIZE_0,
|
||||
MINIMIZE_1,
|
||||
CLOSE_0,
|
||||
CLOSE_1,
|
||||
SHADE_1_0,
|
||||
SHADE_1_1,
|
||||
SHADE_2_0,
|
||||
SHADE_2_1,
|
||||
TITLEBAR_0,
|
||||
TITLEBAR_1,
|
||||
STATUSBAR_0,
|
||||
STATUSBAR_1,
|
||||
SEEKBAR,
|
||||
SEEKBAR_POS_0,
|
||||
SEEKBAR_POS_1,
|
||||
REPEAT_ON_0,
|
||||
REPEAT_ON_1,
|
||||
REPEAT_OFF_0,
|
||||
REPEAT_OFF_1,
|
||||
SHUFFLE_ON_0,
|
||||
SHUFFLE_ON_1,
|
||||
SHUFFLE_OFF_0,
|
||||
SHUFFLE_OFF_1,
|
||||
EQ_ON_0,
|
||||
EQ_ON_1,
|
||||
EQ_OFF_0,
|
||||
EQ_OFF_1,
|
||||
PLS_ON_0,
|
||||
PLS_ON_1,
|
||||
PLS_OFF_0,
|
||||
PLS_OFF_1,
|
||||
BTN_PREV_0,
|
||||
BTN_PREV_1,
|
||||
BTN_PLAY_0,
|
||||
BTN_PLAY_1,
|
||||
BTN_PAUSE_0,
|
||||
BTN_PAUSE_1,
|
||||
BTN_STOP_0,
|
||||
BTN_STOP_1,
|
||||
BTN_NEXT_0,
|
||||
BTN_NEXT_1,
|
||||
BTN_EJECT_0,
|
||||
BTN_EJECT_1,
|
||||
TEXTBG,
|
||||
PIC_PLAY,
|
||||
PIC_PAUSE,
|
||||
PIC_STOP,
|
||||
POSBAR,
|
||||
POSBAR_BTN_0,
|
||||
POSBAR_BTN_1,
|
||||
VOLUMEBAR_POS_0,
|
||||
VOLUMEBAR_POS_1,
|
||||
VOLUMEBAR_POS_2,
|
||||
VOLUMEBAR_POS_3,
|
||||
VOLUMEBAR_POS_4,
|
||||
VOLUMEBAR_POS_5,
|
||||
VOLUMEBAR_POS_6,
|
||||
VOLUMEBAR_POS_7,
|
||||
VOLUMEBAR_POS_8,
|
||||
VOLUMEBAR_POS_9,
|
||||
VOLUMEBAR_POS_10,
|
||||
VOLUMEBAR_POS_11,
|
||||
VOLUMEBAR_POS_12,
|
||||
VOLUMEBAR_POS_13,
|
||||
VOLUMEBAR_POS_14,
|
||||
VOLUMEBAR_POS_15,
|
||||
VOLUMEBAR_POS_16,
|
||||
VOLUMEBAR_POS_17,
|
||||
VOLUMEBAR_POS_18,
|
||||
VOLUMEBAR_POS_19,
|
||||
VOLUMEBAR_POS_20,
|
||||
VOLUMEBAR_POS_21,
|
||||
VOLUMEBAR_POS_22,
|
||||
VOLUMEBAR_POS_23,
|
||||
VOLUMEBAR_POS_24,
|
||||
VOLUMEBAR_POS_25,
|
||||
VOLUMEBAR_POS_26,
|
||||
VOLUMEBAR_POS_27,
|
||||
VOLBAR_BTN_0,
|
||||
VOLBAR_BTN_1,
|
||||
CLUTTER_ON,
|
||||
CLUTTER_OFF,
|
||||
CLUTTER_O,
|
||||
CLUTTER_A,
|
||||
CLUTTER_I,
|
||||
CLUTTER_D,
|
||||
CLUTTER_V,
|
||||
EQ_WIN_BG,
|
||||
EQ_WIN_ON_0,
|
||||
EQ_WIN_ON_1,
|
||||
EQ_WIN_OFF_0,
|
||||
EQ_WIN_OFF_1,
|
||||
EQ_WIN_AUTO_ON_0,
|
||||
EQ_WIN_AUTO_ON_1,
|
||||
EQ_WIN_AUTO_OFF_0,
|
||||
EQ_WIN_AUTO_OFF_1,
|
||||
EQ_WIN_PRESET_0,
|
||||
EQ_WIN_PRESET_1,
|
||||
EQ_WIN_GRAPH_BG,
|
||||
EQ_WIN_BAR_POS_0,
|
||||
EQ_WIN_BAR_POS_1,
|
||||
EQ_WIN_BAR_POS_2,
|
||||
EQ_WIN_BAR_POS_3,
|
||||
EQ_WIN_BAR_POS_4,
|
||||
EQ_WIN_BAR_POS_5,
|
||||
EQ_WIN_BAR_POS_6,
|
||||
EQ_WIN_BAR_POS_7,
|
||||
EQ_WIN_BAR_POS_8,
|
||||
EQ_WIN_BAR_POS_9,
|
||||
EQ_WIN_BAR_POS_10,
|
||||
EQ_WIN_BAR_POS_11,
|
||||
EQ_WIN_BAR_POS_12,
|
||||
EQ_WIN_BAR_POS_13,
|
||||
EQ_WIN_BAR_POS_14,
|
||||
EQ_WIN_BAR_POS_15,
|
||||
EQ_WIN_BAR_POS_16,
|
||||
EQ_WIN_BAR_POS_17,
|
||||
EQ_WIN_BAR_POS_18,
|
||||
EQ_WIN_BAR_POS_19,
|
||||
EQ_WIN_BAR_POS_20,
|
||||
EQ_WIN_BAR_POS_21,
|
||||
EQ_WIN_BAR_POS_22,
|
||||
EQ_WIN_BAR_POS_23,
|
||||
EQ_WIN_BAR_POS_24,
|
||||
EQ_WIN_BAR_POS_25,
|
||||
EQ_WIN_BAR_POS_26,
|
||||
EQ_WIN_BAR_POS_27,
|
||||
EQ_WIN_BAR_BTN_0,
|
||||
EQ_WIN_BAR_BTN_1,
|
||||
BALANCE_POS_0,
|
||||
BALANCE_POS_1,
|
||||
BALANCE_POS_2,
|
||||
BALANCE_POS_3,
|
||||
BALANCE_POS_4,
|
||||
BALANCE_POS_5,
|
||||
BALANCE_POS_6,
|
||||
BALANCE_POS_7,
|
||||
BALANCE_POS_8,
|
||||
BALANCE_POS_9,
|
||||
BALANCE_POS_10,
|
||||
BALANCE_POS_11,
|
||||
BALANCE_POS_12,
|
||||
BALANCE_POS_13,
|
||||
BALANCE_POS_14,
|
||||
BALANCE_POS_15,
|
||||
BALANCE_POS_16,
|
||||
BALANCE_POS_17,
|
||||
BALANCE_POS_18,
|
||||
BALANCE_POS_19,
|
||||
BALANCE_POS_20,
|
||||
BALANCE_POS_21,
|
||||
BALANCE_POS_22,
|
||||
BALANCE_POS_23,
|
||||
BALANCE_POS_24,
|
||||
BALANCE_POS_25,
|
||||
BALANCE_POS_26,
|
||||
BALANCE_POS_27,
|
||||
BALANCE_BTN_0,
|
||||
BALANCE_BTN_1,
|
||||
};
|
||||
|
||||
enum PlaylistParts {
|
||||
PLS_CORNER_UL_0,
|
||||
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,
|
||||
PLS_RFILL_1 = PLS_RFILL_0,
|
||||
PLS_RFILL2_0,
|
||||
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,
|
||||
PLS_WS_LE_1 = PLS_WS_LE_0,
|
||||
PLS_WS_RE_0,
|
||||
PLS_WS_RE_1,
|
||||
PLS_WS_MID_0,
|
||||
PLS_WS_MID_1 = PLS_WS_MID_0,
|
||||
PLS_LCBAR,
|
||||
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;
|
||||
|
||||
QPixmap *getPixmap (const QString& file);
|
||||
void BuildLetterMap (void);
|
||||
void BuildButtons (void);
|
||||
void BuildToggleButtons (void);
|
||||
void BuildTitleBar (void);
|
||||
void BuildSliders (void);
|
||||
void BuildOther (void);
|
||||
void BuildNumbers (void);
|
||||
void BuildPlaylist (void);
|
||||
void ParsePLEdit (void);
|
||||
void BuildEqualizer (void);
|
||||
|
||||
|
||||
QString m_skinname;
|
||||
QString m_path;
|
||||
|
||||
QMap<uint, QPixmap> m_items;
|
||||
QMap<uint, QPixmap> m_letterMap;
|
||||
QMap<uint, QPixmap> m_volume_bar;
|
||||
QMap<uint, QPixmap> m_balance;
|
||||
QMap<uint, QPixmap> m_numbers;
|
||||
QMap<uint, QPixmap> m_playlist;
|
||||
QMap<uint, QPixmap> m_equalizer;
|
||||
|
||||
QMap<QByteArray, QByteArray> m_pledit_txt;
|
||||
QList<QPixmap *> m_buttons;
|
||||
|
||||
bool m_volbtn;
|
||||
bool m_balbtn;
|
||||
|
||||
signals:
|
||||
void skinChanged (Skin *skin);
|
||||
};
|
||||
|
||||
#endif
|
75
src/SkinChooser.cpp
Normal file
75
src/SkinChooser.cpp
Normal file
|
@ -0,0 +1,75 @@
|
|||
#include "MainWindow.h"
|
||||
#include "Skin.h"
|
||||
#include "SkinChooser.h"
|
||||
|
||||
#include <QDir>
|
||||
#include <QIcon>
|
||||
#include <QFile>
|
||||
#include <QSettings>
|
||||
|
||||
SkinChooser::SkinChooser (QWidget *parent) : QMainWindow (parent)
|
||||
{
|
||||
|
||||
#ifndef _WIN32
|
||||
setWindowIcon (QIcon (":icon.png"));
|
||||
#endif
|
||||
setWindowFlags (Qt::Dialog);
|
||||
setWindowModality (Qt::ApplicationModal);
|
||||
setAttribute (Qt::WA_DeleteOnClose);
|
||||
|
||||
m_mw = dynamic_cast<MainWindow *>(parent);
|
||||
m_c = new QWidget (this);
|
||||
setCentralWidget (m_c);
|
||||
|
||||
m_vbox = new QVBoxLayout (m_c);
|
||||
m_label = new QLabel ("Available skins...", m_c);
|
||||
m_label->setFont (QFont ("Helvetica", 16));
|
||||
m_vbox->addWidget (m_label);
|
||||
|
||||
m_skin = new SkinList (m_c);
|
||||
m_vbox->addWidget (m_skin);
|
||||
|
||||
resize (500, 300);
|
||||
|
||||
}
|
||||
|
||||
SkinList::SkinList (QWidget *parent) : QListWidget (parent)
|
||||
{
|
||||
|
||||
setIconSize (QSize (137, 58));
|
||||
|
||||
QString path;
|
||||
path.append (QDir::homePath());
|
||||
path.append ("/.config/xmms2/clients/promoe/skins/");
|
||||
QDir d;
|
||||
|
||||
new SkinChooserItem (QIcon (":CleanAMP/main.png"), "CleanAMP (default)", ":CleanAMP/", this);
|
||||
|
||||
d.setPath (path);
|
||||
d.setFilter (QDir::Dirs);
|
||||
|
||||
QFileInfoList list = d.entryInfoList();
|
||||
for (int i = 0; i < list.size(); ++i) {
|
||||
QFileInfo fileInfo = list.at(i);
|
||||
QDir dir (fileInfo.filePath());
|
||||
QPixmap p = Skin::getPixmap ("main", dir);
|
||||
if (!p.isNull()) {
|
||||
new SkinChooserItem (QIcon (p), dir.dirName(), dir.absolutePath(), this);
|
||||
}
|
||||
}
|
||||
|
||||
connect (this, SIGNAL (itemClicked (QListWidgetItem *)), this, SLOT (changeSkin (QListWidgetItem *)));
|
||||
}
|
||||
|
||||
void
|
||||
SkinList::changeSkin (QListWidgetItem *item)
|
||||
{
|
||||
Skin *skin = Skin::getInstance ();
|
||||
SkinChooserItem *it = dynamic_cast<SkinChooserItem*> (item);
|
||||
|
||||
QSettings settings;
|
||||
|
||||
skin->setSkin (it->getPath ());
|
||||
settings.setValue ("skin/path", it->getPath ());
|
||||
}
|
||||
|
48
src/SkinChooser.h
Normal file
48
src/SkinChooser.h
Normal file
|
@ -0,0 +1,48 @@
|
|||
#include "MainWindow.h"
|
||||
|
||||
#include <QListWidget>
|
||||
#include <QLabel>
|
||||
#include <QVBoxLayout>
|
||||
#include <QMainWindow>
|
||||
|
||||
class SkinList : public QListWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
SkinList (QWidget *parent);
|
||||
~SkinList () {}
|
||||
|
||||
public slots:
|
||||
void changeSkin (QListWidgetItem *item);
|
||||
};
|
||||
|
||||
class SkinChooserItem : public QListWidgetItem
|
||||
{
|
||||
public:
|
||||
SkinChooserItem (QIcon i, QString n, QString p, QListWidget *parent) :
|
||||
QListWidgetItem (i, n, parent) {
|
||||
m_path = p;
|
||||
}
|
||||
~SkinChooserItem () {}
|
||||
QString getPath (void) { return m_path; }
|
||||
private:
|
||||
QString m_path;
|
||||
|
||||
};
|
||||
|
||||
class SkinChooser : public QMainWindow
|
||||
{
|
||||
public:
|
||||
SkinChooser (QWidget *parent);
|
||||
~SkinChooser (void) {}
|
||||
MainWindow *getMW (void) { return m_mw; }
|
||||
|
||||
private:
|
||||
QVBoxLayout *m_vbox;
|
||||
SkinList *m_skin;
|
||||
QLabel *m_label;
|
||||
QWidget *m_c;
|
||||
MainWindow *m_mw;
|
||||
|
||||
};
|
||||
|
48
src/SmallNumberDisplay.cpp
Normal file
48
src/SmallNumberDisplay.cpp
Normal file
|
@ -0,0 +1,48 @@
|
|||
#include "SmallNumberDisplay.h"
|
||||
#include "Skin.h"
|
||||
|
||||
SmallNumberDisplay::SmallNumberDisplay (QWidget *parent, int w) : PixWidget (parent)
|
||||
{
|
||||
m_w = w;
|
||||
setMinimumSize (w, 6);
|
||||
setMaximumSize (w, 6);
|
||||
m_pixmap = QPixmap (w, 6);
|
||||
}
|
||||
|
||||
void
|
||||
SmallNumberDisplay::setPixmaps (Skin *skin)
|
||||
{
|
||||
drawNumber ();
|
||||
}
|
||||
|
||||
void
|
||||
SmallNumberDisplay::setNumber (int num, int len)
|
||||
{
|
||||
snprintf (m_nums, len+1, "%02d", num);
|
||||
m_num = len;
|
||||
|
||||
drawNumber ();
|
||||
|
||||
update ();
|
||||
}
|
||||
|
||||
void
|
||||
SmallNumberDisplay::drawNumber ()
|
||||
{
|
||||
Skin *skin = Skin::getInstance ();
|
||||
|
||||
QPainter paint;
|
||||
paint.begin (&m_pixmap);
|
||||
paint.drawPixmap (m_pixmap.rect (),
|
||||
skin->getItem (Skin::TEXTBG),
|
||||
m_pixmap.rect ());
|
||||
|
||||
for (int i = 0; i < m_num; i++) {
|
||||
paint.drawPixmap (QRect (i*5, 0, 4, 6),
|
||||
skin->getLetter (m_nums[i]),
|
||||
skin->getLetter (m_nums[i]).rect ());
|
||||
}
|
||||
|
||||
paint.end ();
|
||||
}
|
||||
|
30
src/SmallNumberDisplay.h
Normal file
30
src/SmallNumberDisplay.h
Normal file
|
@ -0,0 +1,30 @@
|
|||
#ifndef __SMALLNUMBERDISPLAY_H__
|
||||
#define __SMALLNUMBERDISPLAY_H__
|
||||
|
||||
#include "PixWidget.h"
|
||||
#include <QPainter>
|
||||
|
||||
|
||||
class SmallNumberDisplay : public PixWidget
|
||||
{
|
||||
Q_OBJECT;
|
||||
|
||||
public:
|
||||
SmallNumberDisplay (QWidget *parent, int w);
|
||||
~SmallNumberDisplay () { };
|
||||
|
||||
void setNumber (int num, int len);
|
||||
int getNumber (void) const { return m_num; }
|
||||
|
||||
public slots:
|
||||
void setPixmaps (Skin *skin);
|
||||
|
||||
private:
|
||||
char m_nums[2];
|
||||
int m_num;
|
||||
int m_w;
|
||||
|
||||
void drawNumber (void);
|
||||
};
|
||||
|
||||
#endif
|
63
src/StereoMono.cpp
Normal file
63
src/StereoMono.cpp
Normal file
|
@ -0,0 +1,63 @@
|
|||
#include "StereoMono.h"
|
||||
#include "Skin.h"
|
||||
|
||||
StereoMono::StereoMono (QWidget *parent) : PixWidget (parent)
|
||||
{
|
||||
setMinimumSize (56, 12);
|
||||
setMaximumSize (56, 12);
|
||||
|
||||
m_pixmap = QPixmap (56, 12);
|
||||
}
|
||||
|
||||
void
|
||||
StereoMono::setPixmaps (Skin *skin)
|
||||
{
|
||||
m_pixmap_stereo_on = skin->getItem (Skin::STEREO_1);
|
||||
m_pixmap_stereo_off = skin->getItem (Skin::STEREO_0);
|
||||
m_pixmap_mono_on = skin->getItem (Skin::MONO_1);
|
||||
m_pixmap_mono_off = skin->getItem (Skin::MONO_0);
|
||||
|
||||
setStereoMono (m_stereo, m_mono);
|
||||
}
|
||||
|
||||
void
|
||||
StereoMono::drawPixmaps ()
|
||||
{
|
||||
QPainter paint;
|
||||
paint.begin (&m_pixmap);
|
||||
|
||||
paint.drawPixmap (QRect (0, 0, 27, 12),
|
||||
m_pixmap_mono,
|
||||
m_pixmap.rect ());
|
||||
|
||||
paint.drawPixmap (QRect (27, 0, 29, 12),
|
||||
m_pixmap_stereo,
|
||||
m_pixmap.rect ());
|
||||
paint.end ();
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
void
|
||||
StereoMono::setStereoMono (bool stereo, bool mono)
|
||||
{
|
||||
|
||||
if (stereo) {
|
||||
m_pixmap_stereo = m_pixmap_stereo_on;
|
||||
} else {
|
||||
m_pixmap_stereo = m_pixmap_stereo_off;
|
||||
}
|
||||
|
||||
if (mono) {
|
||||
m_pixmap_mono = m_pixmap_mono_on;
|
||||
} else {
|
||||
m_pixmap_mono = m_pixmap_mono_off;
|
||||
}
|
||||
|
||||
m_stereo = stereo;
|
||||
m_mono = mono;
|
||||
|
||||
drawPixmaps ();
|
||||
|
||||
}
|
||||
|
31
src/StereoMono.h
Normal file
31
src/StereoMono.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
#ifndef __STEREOMONO_H__
|
||||
#define __STEREOMONO_H__
|
||||
|
||||
#include "PixWidget.h"
|
||||
|
||||
class StereoMono : public PixWidget
|
||||
{
|
||||
public:
|
||||
StereoMono (QWidget *parent);
|
||||
~StereoMono () { }
|
||||
|
||||
void setStereoMono (bool, bool);
|
||||
|
||||
public slots:
|
||||
void setPixmaps (Skin *skin);
|
||||
|
||||
private:
|
||||
void drawPixmaps ();
|
||||
bool m_stereo;
|
||||
bool m_mono;
|
||||
|
||||
QPixmap m_pixmap_stereo_on;
|
||||
QPixmap m_pixmap_stereo_off;
|
||||
QPixmap m_pixmap_mono_on;
|
||||
QPixmap m_pixmap_mono_off;
|
||||
|
||||
QPixmap m_pixmap_mono;
|
||||
QPixmap m_pixmap_stereo;
|
||||
};
|
||||
|
||||
#endif
|
229
src/TextBar.cpp
Normal file
229
src/TextBar.cpp
Normal file
|
@ -0,0 +1,229 @@
|
|||
#include "MainWindow.h"
|
||||
#include "Display.h"
|
||||
#include "TextBar.h"
|
||||
|
||||
TextScroller::TextScroller (QWidget *parent, uint w,
|
||||
uint h, const QString &name) :
|
||||
QWidget (parent)
|
||||
{
|
||||
//XMMSHandler *xmmsh = XMMSHandler::getInstance ();
|
||||
Skin *skin = Skin::getInstance ();
|
||||
|
||||
connect (skin, SIGNAL (skinChanged (Skin *)),
|
||||
this, SLOT (setPixmaps(Skin *)));
|
||||
|
||||
QSettings s;
|
||||
|
||||
s.beginGroup ("display_" + name);
|
||||
|
||||
if (!s.contains("scroll"))
|
||||
s.setValue("scroll", true);
|
||||
|
||||
if (!s.contains("fontsize"))
|
||||
s.setValue("fontsize", 8);
|
||||
|
||||
if (!s.contains("ttf"))
|
||||
s.setValue("ttf", true);
|
||||
|
||||
m_name = name;
|
||||
m_h = h;
|
||||
m_w = w;
|
||||
m_x_off = 0;
|
||||
m_x2_off = 0;
|
||||
m_fontsize = s.value ("fontsize").toInt ();
|
||||
m_ttf = s.value ("ttf").toBool ();
|
||||
m_text = "Promoe 0.1";
|
||||
m_scroll = s.value ("scroll").toBool ();
|
||||
|
||||
s.endGroup ();
|
||||
|
||||
setMinimumSize(m_w + 2, m_h);
|
||||
setMaximumSize(m_w + 2, m_h);
|
||||
|
||||
m_timer = new QTimer (this);
|
||||
connect (m_timer, SIGNAL (timeout()), this, SLOT (addOffset ()));
|
||||
//connect (xmmsh, SIGNAL (settingsSaved ()), this, SLOT (settingsSaved ()));
|
||||
}
|
||||
|
||||
void
|
||||
TextScroller::settingsSaved (void)
|
||||
{
|
||||
QSettings s;
|
||||
s.beginGroup ("display_" + m_name);
|
||||
m_fontsize = s.value ("fontsize").toInt ();
|
||||
m_ttf = s.value ("ttf").toBool ();
|
||||
|
||||
if (m_scroll != s.value ("scroll").toBool ()) {
|
||||
m_x_off = 0;
|
||||
m_x2_off = 0;
|
||||
}
|
||||
|
||||
m_scroll = s.value ("scroll").toBool ();
|
||||
s.endGroup ();
|
||||
|
||||
setText (m_text);
|
||||
update ();
|
||||
}
|
||||
|
||||
void
|
||||
TextScroller::setPixmaps (Skin *skin)
|
||||
{
|
||||
QPalette pal = palette ();
|
||||
QBrush b = QBrush (skin->getItem (Skin::TEXTBG));
|
||||
pal.setBrush (QPalette::Window, b);
|
||||
setPalette (pal);
|
||||
|
||||
setText (m_text);
|
||||
update();
|
||||
}
|
||||
void
|
||||
TextScroller::addOffset ()
|
||||
{
|
||||
if (m_x2_off > 0) {
|
||||
m_x2_off --;
|
||||
} else if (m_x_off < m_pixmap.size().width()) {
|
||||
m_x_off ++;
|
||||
} else {
|
||||
m_x_off = 0;
|
||||
m_x2_off = 0;
|
||||
}
|
||||
|
||||
repaint ();
|
||||
m_timer->start (40);
|
||||
}
|
||||
|
||||
void
|
||||
TextScroller::setText (QString text)
|
||||
{
|
||||
m_text = text;
|
||||
|
||||
if (m_ttf) {
|
||||
drawQtFont (text);
|
||||
} else {
|
||||
drawBitmapFont (text);
|
||||
}
|
||||
update ();
|
||||
}
|
||||
|
||||
void
|
||||
TextScroller::drawBitmapFont (QString text)
|
||||
{
|
||||
Skin *skin = Skin::getInstance ();
|
||||
|
||||
int width = text.length() * 6;
|
||||
QString temp = text.toLower ();
|
||||
|
||||
if (width > m_w) {
|
||||
temp += QString::fromAscii (" -- ");
|
||||
m_pixmap = QPixmap (width + 6*6, m_h);
|
||||
|
||||
if (m_scroll) {
|
||||
m_timer->start (40);
|
||||
} else {
|
||||
m_timer->stop ();
|
||||
}
|
||||
} else {
|
||||
m_pixmap = QPixmap (m_w, m_h);
|
||||
}
|
||||
QByteArray temp2 = temp.toLatin1();
|
||||
const char *t = temp2.data();
|
||||
|
||||
QPainter (paint);
|
||||
|
||||
paint.begin (&m_pixmap);
|
||||
|
||||
paint.drawPixmap (m_pixmap.rect (),
|
||||
skin->getItem (Skin::TEXTBG),
|
||||
skin->getItem (Skin::TEXTBG).rect ());
|
||||
|
||||
for (uint i = 0; i < strlen (t); i++) {
|
||||
QPixmap p = skin->getLetter (t[i]);
|
||||
if (p.isNull ()) {
|
||||
p = skin->getLetter(' ');
|
||||
}
|
||||
|
||||
paint.drawPixmap (QRect ((i * 6), 0, 4, 6),
|
||||
p, p.rect());
|
||||
}
|
||||
|
||||
paint.end();
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
TextScroller::drawQtFont (QString text)
|
||||
{
|
||||
Skin *skin = Skin::getInstance ();
|
||||
|
||||
QFont font(skin->getPLeditValue ("font"));
|
||||
font.setPixelSize (m_fontsize);
|
||||
|
||||
QFontMetrics fM(font);
|
||||
QRect rect = fM.boundingRect (text);
|
||||
|
||||
QString (temp) = text;
|
||||
|
||||
if (rect.width() > m_w) {
|
||||
temp += QString::fromAscii (" -- ");
|
||||
QRect rect = fM.boundingRect (temp);
|
||||
|
||||
m_pixmap = QPixmap (rect.width(), m_h);
|
||||
|
||||
if (m_scroll) {
|
||||
m_timer->start (40);
|
||||
} else {
|
||||
m_timer->stop ();
|
||||
}
|
||||
|
||||
} else {
|
||||
m_pixmap = QPixmap (m_w, m_h);
|
||||
}
|
||||
|
||||
QPainter paint;
|
||||
paint.begin (&m_pixmap);
|
||||
paint.drawPixmap (m_pixmap.rect (),
|
||||
skin->getItem (Skin::TEXTBG),
|
||||
skin->getItem (Skin::TEXTBG).rect ());
|
||||
|
||||
paint.setFont (font);
|
||||
QColor c;
|
||||
c.setNamedColor (skin->getPLeditValue ("normal"));
|
||||
paint.setPen (c);
|
||||
paint.drawText (m_pixmap.rect (),
|
||||
Qt::AlignLeft | Qt::AlignVCenter,
|
||||
temp);
|
||||
paint.end ();
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
TextScroller::paintEvent (QPaintEvent *event)
|
||||
{
|
||||
int pad = 0;
|
||||
|
||||
if (m_pixmap.isNull ()) {
|
||||
return;
|
||||
}
|
||||
|
||||
int w2 = m_pixmap.size().width() - m_x_off;
|
||||
if (w2 < m_w) {
|
||||
pad = m_w - w2;
|
||||
}
|
||||
|
||||
QPainter (paint);
|
||||
paint.begin (this);
|
||||
paint.drawPixmap (QRect (m_x2_off, 0, m_w - pad, m_h),
|
||||
m_pixmap,
|
||||
QRect (m_x_off, 0, m_w, m_h));
|
||||
if (pad) {
|
||||
paint.drawPixmap (QRect (m_w - pad, 0, pad, m_h),
|
||||
m_pixmap,
|
||||
QRect (0, 0, pad, m_h));
|
||||
}
|
||||
paint.end ();
|
||||
}
|
||||
|
||||
TextScroller::~TextScroller ()
|
||||
{
|
||||
}
|
||||
|
55
src/TextBar.h
Normal file
55
src/TextBar.h
Normal file
|
@ -0,0 +1,55 @@
|
|||
#ifndef __TEXTBOX_H__
|
||||
#define __TEXTBOX_H__
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <QPixmap>
|
||||
#include <QPainter>
|
||||
#include <QWidget>
|
||||
#include <QFont>
|
||||
#include <QTimer>
|
||||
#include <QBrush>
|
||||
#include <QPalette>
|
||||
#include <QBitmap>
|
||||
|
||||
#include "Skin.h"
|
||||
|
||||
class TextScroller : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
TextScroller (QWidget *parent, uint, uint, const QString &);
|
||||
~TextScroller ();
|
||||
|
||||
void setText(QString text);
|
||||
void setFontSize (int i) { m_fontsize = i; }
|
||||
void setTTF (bool b) { m_ttf = b; }
|
||||
|
||||
public slots:
|
||||
void addOffset ();
|
||||
void setPixmaps(Skin *skin);
|
||||
void settingsSaved (void);
|
||||
|
||||
protected:
|
||||
QPixmap m_pixmap;
|
||||
void paintEvent (QPaintEvent *event);
|
||||
|
||||
private:
|
||||
int m_w;
|
||||
int m_h;
|
||||
int m_x_off;
|
||||
int m_x2_off;
|
||||
int m_fontsize;
|
||||
bool m_ttf;
|
||||
bool m_scroll;
|
||||
|
||||
QTimer *m_timer;
|
||||
QString m_text;
|
||||
QString m_name;
|
||||
|
||||
void drawBitmapFont (QString text);
|
||||
void drawQtFont (QString text);
|
||||
};
|
||||
|
||||
#endif
|
101
src/TimeDisplay.cpp
Normal file
101
src/TimeDisplay.cpp
Normal file
|
@ -0,0 +1,101 @@
|
|||
#include "MainDisplay.h"
|
||||
#include "TimeDisplay.h"
|
||||
#include "NumberDisplay.h"
|
||||
|
||||
#include "MainWindow.h"
|
||||
|
||||
#include <QPen>
|
||||
|
||||
TimeDisplay::TimeDisplay (QWidget *parent, int time) : PixWidget (parent)
|
||||
{
|
||||
uint w = 12;//+78;
|
||||
|
||||
m_w = w;
|
||||
|
||||
m_pixmap = QPixmap (m_w, 13);
|
||||
|
||||
setMinimumSize (m_w, 13);
|
||||
setMaximumSize (m_w, 13);
|
||||
move (37, 26);
|
||||
|
||||
//FIXME: let this be the parent
|
||||
/* XXX: colon disappear, how make transparent?
|
||||
m_number_min = new NumberDisplay (this, 24, 0);
|
||||
m_number_min->move (10, 0);
|
||||
m_number_sec = new NumberDisplay (this, 24, 0);
|
||||
m_number_sec->move (78-37, 0);
|
||||
*/
|
||||
|
||||
m_number_min = new NumberDisplay (parent, this,24, 0);
|
||||
m_number_min->move (37+10, 26);
|
||||
m_number_sec = new NumberDisplay (parent, this,24, 0);
|
||||
m_number_sec->move (78, 26);
|
||||
|
||||
connect (m_number_min, SIGNAL(clicked()), parent, SLOT(toggleTime()));
|
||||
connect (m_number_sec, SIGNAL(clicked()), parent, SLOT(toggleTime()));
|
||||
}
|
||||
void TimeDisplay::setPixmaps (Skin *skin)
|
||||
{
|
||||
drawMinus();
|
||||
m_number_min->setPixmaps (skin);
|
||||
m_number_sec->setPixmaps (skin);
|
||||
}
|
||||
TimeDisplay::~TimeDisplay ()
|
||||
{
|
||||
}
|
||||
void TimeDisplay::setTime (int time)
|
||||
{
|
||||
if (m_time == time) return;
|
||||
m_time = time;
|
||||
|
||||
uint showtime = abs(time);
|
||||
uint sec, min;
|
||||
|
||||
sec = (showtime / 1000) % 60;
|
||||
min = (showtime / 1000) / 60;
|
||||
|
||||
m_number_min->setNumber (min / 10, min % 10);
|
||||
m_number_sec->setNumber (sec / 10, sec % 10);
|
||||
|
||||
drawMinus ();
|
||||
}
|
||||
void
|
||||
TimeDisplay::drawMinus ()
|
||||
{
|
||||
Skin *skin = Skin::getInstance ();
|
||||
|
||||
// Draw background
|
||||
QBrush b (skin->getNumber (10));
|
||||
|
||||
QPainter paint;
|
||||
paint.begin (&m_pixmap);
|
||||
paint.fillRect (m_pixmap.rect (), b);
|
||||
MainDisplay *md = dynamic_cast<MainDisplay *>(parent());
|
||||
|
||||
if (md->getMW()->isTimemodeReverse()) {// draw a minus sign
|
||||
if (skin->getNumberSize() < 12) { // Skin hasn't got any, draw a line in correct color.
|
||||
QByteArray a = skin->getPLeditValue("normal");
|
||||
QColor c;
|
||||
c.setNamedColor(a);
|
||||
QPen pen(c);
|
||||
paint.setPen(pen);
|
||||
paint.drawLine (3,6,8,6);
|
||||
} else {
|
||||
paint.drawPixmap (0, 0, skin->getNumber (11));
|
||||
}
|
||||
}
|
||||
paint.end();
|
||||
|
||||
update ();
|
||||
}
|
||||
void
|
||||
TimeDisplay::mousePressEvent (QMouseEvent *event)
|
||||
{
|
||||
}
|
||||
void
|
||||
TimeDisplay::mouseReleaseEvent (QMouseEvent *event)
|
||||
{
|
||||
emit clicked();
|
||||
drawMinus ();
|
||||
}
|
||||
|
32
src/TimeDisplay.h
Normal file
32
src/TimeDisplay.h
Normal file
|
@ -0,0 +1,32 @@
|
|||
#ifndef __TIMEDISPLAY_H__
|
||||
#define __TIMEDISPLAY_H__
|
||||
|
||||
class TimeDisplay;
|
||||
|
||||
#include "PixWidget.h"
|
||||
#include "NumberDisplay.h"
|
||||
|
||||
class TimeDisplay : public PixWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
TimeDisplay (QWidget *parent, int time);
|
||||
~TimeDisplay ();
|
||||
void setTime (int);
|
||||
void drawMinus();
|
||||
public slots:
|
||||
void setPixmaps (Skin *skin);
|
||||
signals:
|
||||
void clicked(void);
|
||||
|
||||
protected:
|
||||
void mousePressEvent (QMouseEvent *event);
|
||||
void mouseReleaseEvent (QMouseEvent *event);
|
||||
int m_time;
|
||||
NumberDisplay *m_number_min;
|
||||
NumberDisplay *m_number_sec;
|
||||
|
||||
uint m_w;
|
||||
};
|
||||
|
||||
#endif
|
147
src/TitleBar.cpp
Normal file
147
src/TitleBar.cpp
Normal file
|
@ -0,0 +1,147 @@
|
|||
#include "MainWindow.h"
|
||||
#include "TitleBar.h"
|
||||
#include "Display.h"
|
||||
#include "SkinChooser.h"
|
||||
#include "MedialibWindow.h"
|
||||
#include "SettingsWindow.h"
|
||||
#include "Button.h"
|
||||
#include "BrowseDialog.h"
|
||||
|
||||
#include <QMenu>
|
||||
|
||||
TitleBar::TitleBar (QWidget *parent, bool shaded) : PixWidget (parent)
|
||||
{
|
||||
MainWindow *mw = dynamic_cast<MainWindow*>(window ());
|
||||
m_shaded = shaded;
|
||||
|
||||
setMinimumSize (275, 14);
|
||||
setMaximumSize (275, 14);
|
||||
|
||||
m_menubtn = new Button (this, Skin::MENUBUTTON_0, Skin::MENUBUTTON_1);
|
||||
connect (m_menubtn, SIGNAL (clicked ()), this, SLOT (showMenu ()));
|
||||
m_menubtn->move(6, 3);
|
||||
|
||||
m_minimize = new Button (this, Skin::MINIMIZE_0, Skin::MINIMIZE_1);
|
||||
connect (m_minimize, SIGNAL (clicked ()), mw, SLOT (showMinimized ()));
|
||||
m_minimize->move(244, 3);
|
||||
|
||||
m_shadebtn = new Button (this, Skin::SHADE_1_0, Skin::SHADE_1_1);
|
||||
connect (m_shadebtn, SIGNAL (clicked()), mw, SLOT (switchDisplay ()));
|
||||
m_shadebtn->move(254, 3);
|
||||
|
||||
m_closebtn = new Button (this, Skin::CLOSE_0, Skin::CLOSE_1);
|
||||
connect (m_closebtn, SIGNAL (clicked()), qApp, SLOT (quit ()));
|
||||
m_closebtn->move(264, 3);
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
TitleBar::showMenu (void)
|
||||
{
|
||||
QMenu qm(this);
|
||||
|
||||
QAction *a;
|
||||
|
||||
a = new QAction (tr ("Medialib browser"), this);
|
||||
a->setShortcut (tr ("Alt+M"));
|
||||
connect (a, SIGNAL (triggered ()), this, SLOT (showMlib ()));
|
||||
qm.addAction (a);
|
||||
a = new QAction (tr ("Server-side browser"), this);
|
||||
a->setShortcut (tr ("Alt+S"));
|
||||
connect (a, SIGNAL (triggered ()), this, SLOT (showServerB ()));
|
||||
qm.addAction (a);
|
||||
qm.addSeparator ();
|
||||
a = new QAction (tr ("Theme settings"), this);
|
||||
a->setShortcut (tr ("Alt+T"));
|
||||
connect (a, SIGNAL (triggered ()), this, SLOT (showTheme ()));
|
||||
qm.addAction (a);
|
||||
a = new QAction (tr ("Application settings"), this);
|
||||
a->setShortcut (tr ("Alt+A"));
|
||||
connect (a, SIGNAL (triggered ()), this, SLOT (showSettings ()));
|
||||
qm.addAction (a);
|
||||
a = new QAction (tr ("Server settings"), this);
|
||||
a->setShortcut (tr ("Alt+S"));
|
||||
qm.addAction (a);
|
||||
qm.addSeparator ();
|
||||
a = new QAction (tr ("Quit"), this);
|
||||
a->setShortcut (tr ("Ctrl+Q"));
|
||||
connect (a, SIGNAL (triggered ()), qApp, SLOT (quit ()));
|
||||
qm.addAction (a);
|
||||
|
||||
qm.exec(QPoint (window()->pos().x()+6, window()->pos().y()+3));
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
TitleBar::showMlib ()
|
||||
{
|
||||
/*
|
||||
MedialibWindow *mw = new MedialibWindow (window ());
|
||||
mw->show ();
|
||||
*/
|
||||
}
|
||||
|
||||
void
|
||||
TitleBar::showServerB ()
|
||||
{
|
||||
BrowseDialog *bd = new BrowseDialog (window ());
|
||||
bd->show ();
|
||||
}
|
||||
|
||||
void
|
||||
TitleBar::showSettings ()
|
||||
{
|
||||
SettingsWindow *sw = new SettingsWindow (window ());
|
||||
sw->show ();
|
||||
}
|
||||
|
||||
void
|
||||
TitleBar::showTheme ()
|
||||
{
|
||||
SkinChooser *sk = new SkinChooser (window());
|
||||
sk->show();
|
||||
}
|
||||
|
||||
void
|
||||
TitleBar::setPixmaps (Skin *skin)
|
||||
{
|
||||
if (m_shaded) {
|
||||
m_pixmap_active = skin->getItem (Skin::STATUSBAR_0);
|
||||
m_pixmap_inactive = skin->getItem (Skin::STATUSBAR_1);
|
||||
} else {
|
||||
m_pixmap_active = skin->getItem (Skin::TITLEBAR_0);
|
||||
m_pixmap_inactive = skin->getItem (Skin::TITLEBAR_1);
|
||||
}
|
||||
|
||||
if (underMouse()) {
|
||||
m_pixmap = m_pixmap_active;
|
||||
} else {
|
||||
m_pixmap = m_pixmap_inactive;
|
||||
}
|
||||
|
||||
update ();
|
||||
}
|
||||
|
||||
TitleBar::~TitleBar ()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
TitleBar::setActive (bool active)
|
||||
{
|
||||
if (active) {
|
||||
m_pixmap = m_pixmap_active;
|
||||
update ();
|
||||
} else {
|
||||
m_pixmap = m_pixmap_inactive;
|
||||
update ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
TitleBar::mouseDoubleClickEvent (QMouseEvent *event)
|
||||
{
|
||||
MainWindow *mw = dynamic_cast<MainWindow*>(window ());
|
||||
mw->switchDisplay ();
|
||||
}
|
||||
|
41
src/TitleBar.h
Normal file
41
src/TitleBar.h
Normal file
|
@ -0,0 +1,41 @@
|
|||
#ifndef __TITLEBAR_H__
|
||||
#define __TITLEBAR_H__
|
||||
|
||||
class TitleBar;
|
||||
|
||||
#include "PixWidget.h"
|
||||
|
||||
class Button;
|
||||
|
||||
class TitleBar : public PixWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
TitleBar (QWidget *parent, bool shaded);
|
||||
~TitleBar ();
|
||||
void setActive (bool active);
|
||||
|
||||
public slots:
|
||||
void setPixmaps (Skin *skin);
|
||||
void showMenu (void);
|
||||
void showServerB (void);
|
||||
void showTheme (void);
|
||||
void showMlib (void);
|
||||
void showSettings (void);
|
||||
|
||||
protected:
|
||||
void mouseDoubleClickEvent (QMouseEvent *event);
|
||||
|
||||
private:
|
||||
QPixmap m_pixmap_active;
|
||||
QPixmap m_pixmap_inactive;
|
||||
|
||||
Button *m_shadebtn;
|
||||
Button *m_menubtn;
|
||||
Button *m_closebtn;
|
||||
Button *m_minimize;
|
||||
|
||||
bool m_shaded;
|
||||
};
|
||||
|
||||
#endif
|
227
src/VolumeSlider.cpp
Normal file
227
src/VolumeSlider.cpp
Normal file
|
@ -0,0 +1,227 @@
|
|||
#include "XMMSHandler.h"
|
||||
#include <math.h>
|
||||
|
||||
#include "VolumeSlider.h"
|
||||
#include <QMouseEvent>
|
||||
|
||||
#include "Skin.h"
|
||||
#include "Button.h"
|
||||
|
||||
#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
|
||||
|
||||
Slider::Slider (QWidget *parent, uint name_min, uint name_max,
|
||||
uint name_on, uint name_off, int min, int max) : PixWidget (parent)
|
||||
{
|
||||
m_name_min = name_min;
|
||||
m_name_max = name_max;
|
||||
m_name_on = name_on;
|
||||
m_name_off = name_off;
|
||||
|
||||
m_min = min;
|
||||
m_max = max;
|
||||
|
||||
m_button = 0;
|
||||
|
||||
m_value = 0;
|
||||
m_value_index = (uint)((abs(m_min) / (double)(abs(m_min)+abs(m_max))) * (name_max-name_min));
|
||||
}
|
||||
|
||||
void
|
||||
Slider::setPixmaps (Skin *skin)
|
||||
{
|
||||
m_skin = skin;
|
||||
|
||||
m_pixmap_slider = m_skin->getItem(m_name_min+m_value_index);
|
||||
m_vertical = (m_pixmap_slider.height() > m_pixmap_slider.width()) ? true : false;
|
||||
|
||||
setMinimumSize(m_pixmap_slider.size());
|
||||
setMaximumSize(m_pixmap_slider.size());
|
||||
|
||||
resize(m_pixmap_slider.size());
|
||||
|
||||
if (!skin->getItem(m_name_on).isNull() && !skin->getItem(m_name_off).isNull()) {
|
||||
if (m_button) {
|
||||
delete m_button;
|
||||
}
|
||||
|
||||
m_button = new SliderButton (this, m_name_on, m_name_off, m_vertical);
|
||||
m_button->setPixmaps (m_skin);
|
||||
m_button->show ();
|
||||
|
||||
int tmp = (uint)((ceil(abs(m_min) / (double)(abs(m_min)+abs(m_max)))) * (m_name_max-m_name_min));
|
||||
if (m_vertical) {
|
||||
m_button->move(1, height()-m_button->height()-tmp);
|
||||
} else {
|
||||
m_button->move(tmp, 1);
|
||||
}
|
||||
} else {
|
||||
if (m_button) {
|
||||
delete m_button;
|
||||
m_button = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
void
|
||||
Slider::changePixmap ()
|
||||
{
|
||||
m_pixmap_slider = m_skin->getItem (m_name_min+m_value_index);
|
||||
update();
|
||||
}
|
||||
|
||||
void
|
||||
Slider::paintEvent (QPaintEvent *event)
|
||||
{
|
||||
QPainter paint;
|
||||
paint.begin (this);
|
||||
paint.drawPixmap (rect(), m_pixmap_slider, m_pixmap_slider.rect ());
|
||||
paint.end ();
|
||||
}
|
||||
|
||||
void
|
||||
Slider::mousePressEvent (QMouseEvent *event)
|
||||
{
|
||||
updatePos (event);
|
||||
}
|
||||
|
||||
void
|
||||
Slider::mouseMoveEvent (QMouseEvent *event)
|
||||
{
|
||||
updatePos (event);
|
||||
}
|
||||
|
||||
void
|
||||
Slider::mouseReleaseEvent (QMouseEvent *event)
|
||||
{
|
||||
updatePos (event);
|
||||
}
|
||||
|
||||
void
|
||||
Slider::updatePos (QMouseEvent *event)
|
||||
{
|
||||
QPoint p (event->pos ());
|
||||
int value;
|
||||
|
||||
if (m_vertical) {
|
||||
value = CLAMP(p.y(), 0, height());
|
||||
} else {
|
||||
value = CLAMP(p.x(), 0, width());
|
||||
}
|
||||
|
||||
setPos(value, true);
|
||||
if (m_button != 0) {
|
||||
m_button->setPos(value);
|
||||
}
|
||||
|
||||
emit valueChanged (m_value);
|
||||
}
|
||||
|
||||
void
|
||||
Slider::setValue (int value)
|
||||
{
|
||||
double frac;
|
||||
int pos;
|
||||
|
||||
frac = abs(value)/(double)(abs(m_min)+abs(m_max));
|
||||
if (m_vertical) {
|
||||
pos = (int)(height() * frac);
|
||||
} else {
|
||||
pos = (int)(width() * frac);
|
||||
}
|
||||
|
||||
setPos(pos, false);
|
||||
if (m_button != 0) {
|
||||
m_button->setPos(pos);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Slider::setPos (int value, bool tell)
|
||||
{
|
||||
double frac;
|
||||
|
||||
if (m_vertical) {
|
||||
frac = (height() - value) / (double) height();
|
||||
} else {
|
||||
frac = value / (double) width();
|
||||
}
|
||||
|
||||
/* calculate m_min <= m_value <= m_max */
|
||||
m_value = (uint)(frac * (abs(m_min) + abs(m_max)) + m_min);
|
||||
|
||||
/* calculate m_name_min <= m_value_index <= m_name_max */
|
||||
m_value_index = (uint) ceil (frac * (m_name_max - m_name_min));
|
||||
|
||||
|
||||
changePixmap();
|
||||
|
||||
if (tell) {
|
||||
emit valueChanged (m_value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SliderButton::SliderButton (QWidget *parent, uint normal, uint pressed,
|
||||
bool vertical) : Button (parent, normal, pressed, false)
|
||||
{
|
||||
m_slider = dynamic_cast<Slider *>(parent);
|
||||
m_vertical = vertical;
|
||||
m_diff = 0;
|
||||
m_moving = false;
|
||||
|
||||
if (m_vertical) {
|
||||
move(1, 0);
|
||||
} else {
|
||||
move(0, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
SliderButton::mousePressEvent (QMouseEvent *event)
|
||||
{
|
||||
if (m_vertical) {
|
||||
m_diff = y() - event->pos().y();
|
||||
} else {
|
||||
m_diff = x() - event->pos().x();
|
||||
}
|
||||
m_moving = true;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
SliderButton::mouseReleaseEvent (QMouseEvent *event)
|
||||
{
|
||||
m_moving = false;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
SliderButton::setPos (uint pos)
|
||||
{
|
||||
if (m_vertical) {
|
||||
int ypos = MIN(pos, (uint)m_slider->height()-height());
|
||||
move(1, ypos);
|
||||
} else {
|
||||
int xpos = MIN(pos, (uint)m_slider->width()-width());
|
||||
move(xpos, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
SliderButton::mouseMoveEvent (QMouseEvent *event)
|
||||
{
|
||||
QPoint p = m_slider->mapFromGlobal (event->globalPos ());
|
||||
int value;
|
||||
if (m_vertical) {
|
||||
value = CLAMP(p.y(), 0, m_slider->height());
|
||||
} else {
|
||||
value = CLAMP(p.x(), 0, m_slider->width());
|
||||
}
|
||||
|
||||
m_slider->setPos(value, true);
|
||||
setPos (value);
|
||||
}
|
77
src/VolumeSlider.h
Normal file
77
src/VolumeSlider.h
Normal file
|
@ -0,0 +1,77 @@
|
|||
#ifndef __VOLUMESLIDER_H__
|
||||
#define __VOLUMESLIDER_H__
|
||||
|
||||
class Slider;
|
||||
class MainDisplay;
|
||||
class Button;
|
||||
|
||||
#include "Button.h"
|
||||
|
||||
class SliderButton : public Button
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
SliderButton (QWidget *parent, uint normal, uint pressed, bool dir);
|
||||
void mouseMoveEvent (QMouseEvent *);
|
||||
void mousePressEvent (QMouseEvent *);
|
||||
void mouseReleaseEvent (QMouseEvent *);
|
||||
void setPos (uint);
|
||||
|
||||
|
||||
public slots:
|
||||
//void setValue (uint volume_base100);
|
||||
|
||||
private:
|
||||
void changePixmap (bool pressed);
|
||||
Slider *m_slider;
|
||||
bool m_vertical;
|
||||
int m_diff;
|
||||
bool m_moving;
|
||||
};
|
||||
|
||||
class Slider : public PixWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
Slider (QWidget *parent, uint min, uint max, uint on, uint off, int, int);
|
||||
|
||||
void paintEvent (QPaintEvent *event);
|
||||
|
||||
void mouseMoveEvent (QMouseEvent *);
|
||||
void mousePressEvent (QMouseEvent *);
|
||||
void mouseReleaseEvent (QMouseEvent *);
|
||||
|
||||
public slots:
|
||||
void setPixmaps (Skin *skin);
|
||||
void setPos (int value, bool tell);
|
||||
void setValue (int value);
|
||||
|
||||
signals:
|
||||
void valueChanged (int val);
|
||||
|
||||
private:
|
||||
void updatePos (QMouseEvent *event);
|
||||
void changePixmap ();
|
||||
|
||||
QPixmap m_pixmap_slider;
|
||||
SliderButton *m_button;
|
||||
|
||||
Skin *m_skin;
|
||||
|
||||
uint m_value_index;
|
||||
int m_value;
|
||||
|
||||
int m_position;
|
||||
|
||||
uint m_name_min;
|
||||
uint m_name_max;
|
||||
uint m_name_on;
|
||||
uint m_name_off;
|
||||
|
||||
int m_min;
|
||||
int m_max;
|
||||
|
||||
bool m_vertical;
|
||||
};
|
||||
|
||||
#endif
|
351
src/XMMSHandler.cpp
Normal file
351
src/XMMSHandler.cpp
Normal file
|
@ -0,0 +1,351 @@
|
|||
#include <xmmsclient/xmmsclient++.h>
|
||||
|
||||
#include "xmmsqt4.h"
|
||||
#include "XMMSHandler.h"
|
||||
#include "playlistmodel.h"
|
||||
|
||||
#include <cstdlib>
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
|
||||
#include <QErrorMessage>
|
||||
#include <QHash>
|
||||
#include <QFile>
|
||||
#include <QFileDialog>
|
||||
#include <QDir>
|
||||
|
||||
static bool log ( /*const std::string& text = ""*/ )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
XMMSHandler &XMMSHandler::getInstance ()
|
||||
{
|
||||
static XMMSHandler singleton(NULL, "Prome_Main");
|
||||
return singleton;
|
||||
}
|
||||
|
||||
XMMSHandler::XMMSHandler (QObject *parent, const std::string &name) : XClient (parent, name)
|
||||
{
|
||||
connect_handler();
|
||||
}
|
||||
|
||||
bool
|
||||
XMMSHandler::connect_handler (const char *ipcpath, const bool &sync, QWidget *parent)
|
||||
{
|
||||
/* try {
|
||||
m_client.connect(path);
|
||||
//TODO reenable checking of path
|
||||
//m_client.connect (path ? path : "");
|
||||
}
|
||||
catch (Xmms::connection_error& e) {
|
||||
QErrorMessage *err = new QErrorMessage ();
|
||||
err->showMessage ("Couldn't connect to XMMS2, please try again.");
|
||||
err->exec ();
|
||||
delete err;
|
||||
return false;
|
||||
}
|
||||
|
||||
m_client.setMainloop (new XmmsQT4 (m_client.getConnection ()));
|
||||
*/
|
||||
//TODO must be moved elsewere later
|
||||
m_playlist_model = new PlaylistModel(NULL, this, "_active");
|
||||
|
||||
connect(ipcpath, sync, parent);
|
||||
|
||||
using Xmms::bind;
|
||||
// m_client->playlist.listEntries () (bind (&XMMSHandler::playlist_list, this));
|
||||
// m_client->playlist.broadcastChanged () (bind (&XMMSHandler::playlist_changed, this));
|
||||
|
||||
m_client->medialib.broadcastEntryChanged () (bind (&XMMSHandler::medialib_entry_changed, this));
|
||||
|
||||
m_client->playback.currentID () (bind (&XMMSHandler::playback_current_id, this));
|
||||
m_client->playback.broadcastCurrentID () (bind (&XMMSHandler::playback_current_id, this));
|
||||
|
||||
m_client->playback.getStatus () (bind (&XMMSHandler::playback_status, this));
|
||||
m_client->playback.broadcastStatus () (bind (&XMMSHandler::playback_status, this));
|
||||
|
||||
m_client->playback.broadcastVolumeChanged () (bind (&XMMSHandler::volume_changed, this));
|
||||
|
||||
// TODO: Disabled for now. Seems to cause problems on startup
|
||||
// QObject::connect (&m_playtime_timer, SIGNAL (timeout ()),
|
||||
// this, SLOT (restartPlaytime ()));
|
||||
// m_playtime_timer.start(0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Xmms::Client *
|
||||
XMMSHandler::getClient ()
|
||||
{
|
||||
return m_client;
|
||||
}
|
||||
|
||||
void
|
||||
XMMSHandler::restartPlaytime ()
|
||||
{
|
||||
m_client->playback.getPlaytime () (Xmms::bind (&XMMSHandler::playback_playtime, this));
|
||||
}
|
||||
|
||||
bool
|
||||
XMMSHandler::medialib_entry_changed (const unsigned int &id)
|
||||
{
|
||||
if (id > 0) {
|
||||
requestMediainfo (id);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
XMMSHandler::playlistAddURL (const QString &s)
|
||||
{
|
||||
m_client->playlist.addUrl (s.toAscii ().constData ()) ();
|
||||
}
|
||||
void
|
||||
XMMSHandler::playlistRemove (uint pos)
|
||||
{
|
||||
m_client->playlist.removeEntry (pos) ();
|
||||
}
|
||||
|
||||
void
|
||||
XMMSHandler::playlistMove (uint pos, uint newpos)
|
||||
{
|
||||
m_client->playlist.moveEntry (pos, newpos) ();
|
||||
}
|
||||
|
||||
void
|
||||
XMMSHandler::requestMediainfo (uint id)
|
||||
{
|
||||
m_client->medialib.getInfo (id) (Xmms::bind (&XMMSHandler::medialib_info, this));
|
||||
}
|
||||
|
||||
void
|
||||
XMMSHandler::requestPlaylistList ()
|
||||
{
|
||||
// m_client->playlist.listEntries () (Xmms::bind (&XMMSHandler::playlist_list, this));
|
||||
}
|
||||
|
||||
void
|
||||
XMMSHandler::requestTrackChange (int pos)
|
||||
{
|
||||
m_client->playlist.setNext (pos) ();
|
||||
m_client->playback.tickle () ();
|
||||
}
|
||||
|
||||
bool
|
||||
XMMSHandler::playlist_list (const Xmms::List< unsigned int > &playlist)
|
||||
{
|
||||
emit playlistList (playlist);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
XMMSHandler::playback_status (const Xmms::Playback::Status &status)
|
||||
{
|
||||
emit playbackStatusChanged (status);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
XMMSHandler::playback_playtime (const unsigned int &time)
|
||||
{
|
||||
emit playtimeChanged (time);
|
||||
m_playtime_timer.start (500);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
XMMSHandler::playback_current_id (const unsigned int &id)
|
||||
{
|
||||
m_currentid = id;
|
||||
|
||||
if (id > 0) {
|
||||
requestMediainfo (id);
|
||||
}
|
||||
|
||||
emit currentID(id);
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
XMMSHandler::setPlaytime (uint pos)
|
||||
{
|
||||
m_client->playback.seekMs (pos) ();
|
||||
}
|
||||
|
||||
void
|
||||
XMMSHandler::DictToQHash (const std::string &key,
|
||||
const Xmms::Dict::Variant &value,
|
||||
QHash<QString, QString> &hash)
|
||||
{
|
||||
if (value.type () == typeid (int32_t)) {
|
||||
hash.insert (QString::fromLatin1 (key.c_str ()),
|
||||
QString::number (boost::get< int32_t > (value)));
|
||||
} else if (value.type () == typeid (uint32_t)) {
|
||||
hash.insert (QString::fromLatin1 (key.c_str ()),
|
||||
QString::number (boost::get< uint32_t > (value)));
|
||||
} else if (value.type () == typeid (std::string)) {
|
||||
hash.insert (QString::fromLatin1 (key.c_str ()),
|
||||
QString::fromUtf8 (boost::get< std::string > (value).c_str ()));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
XMMSHandler::PropDictToQHash (const std::string &key,
|
||||
const Xmms::Dict::Variant &value,
|
||||
const std::string &source,
|
||||
QHash<QString, QString> &hash)
|
||||
{
|
||||
if (value.type () == typeid (int32_t)) {
|
||||
hash.insert (QString::fromLatin1 (key.c_str ()),
|
||||
QString::number (boost::get< int32_t > (value)));
|
||||
} else if (value.type () == typeid (uint32_t)) {
|
||||
hash.insert (QString::fromLatin1 (key.c_str ()),
|
||||
QString::number (boost::get< uint32_t > (value)));
|
||||
} else {
|
||||
hash.insert (QString::fromLatin1 (key.c_str ()),
|
||||
QString::fromUtf8 (boost::get< std::string > (value).c_str()));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
uint
|
||||
XMMSHandler::medialibQuery (QString q)
|
||||
{
|
||||
XMMSResultDictList *r = m_xmmsc->medialib_select (q.toUtf8 ());
|
||||
r->connect (sigc::mem_fun (this, &XMMSHandler::medialib_select));
|
||||
m_mlibqs->append (r);
|
||||
}
|
||||
|
||||
void
|
||||
XMMSHandler::medialib_select (XMMSResultDictList *res)
|
||||
{
|
||||
QList<QHash<QString, QString> > l;
|
||||
|
||||
for (;res->listValid (); res->listNext()) {
|
||||
QHash<QString, QString> h(DictToQHash (static_cast<XMMSResultDict *>(res)));
|
||||
l.append (h);
|
||||
}
|
||||
|
||||
emit medialibResponse (res->getCID (), l);
|
||||
}
|
||||
*/
|
||||
|
||||
bool
|
||||
XMMSHandler::playlist_changed (const Xmms::Dict &list)
|
||||
{
|
||||
emit playlistChanged (list);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
XMMSHandler::medialib_info (const Xmms::PropDict &propdict)
|
||||
{
|
||||
unsigned int id = propdict.get<int32_t>("id");
|
||||
emit mediainfoChanged (id, propdict);
|
||||
|
||||
if (id == m_currentid) {
|
||||
emit currentSong (propdict);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
XMMSHandler::volume_error (const std::string &error)
|
||||
{
|
||||
qWarning ("couldn't get volume levels!");
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
XMMSHandler::volumeGet ()
|
||||
{
|
||||
m_client->playback.volumeGet () (Xmms::bind (&XMMSHandler::volume_get, this),
|
||||
Xmms::bind (&XMMSHandler::volume_error, this));
|
||||
}
|
||||
|
||||
void
|
||||
XMMSHandler::volumeSet (uint volume)
|
||||
{
|
||||
if(m_masterchan)
|
||||
{
|
||||
m_client->playback.volumeSet ("master", volume) ();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_client->playback.volumeSet ("left", volume) ();
|
||||
m_client->playback.volumeSet ("right", volume) ();
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
XMMSHandler::volume_changed (const Xmms::Dict &levels)
|
||||
{
|
||||
volume_get (levels);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
XMMSHandler::volume_get (const Xmms::Dict &levels)
|
||||
{
|
||||
QHash<QString, QString> hash;
|
||||
levels.each (boost::bind (&XMMSHandler::DictToQHash, this,
|
||||
_1, _2, boost::ref (hash)));
|
||||
QList<QString> Values = hash.values();
|
||||
QListIterator<QString> vol (Values);
|
||||
|
||||
uint right = atol (vol.next().toAscii());
|
||||
if(vol.hasNext())
|
||||
{
|
||||
uint left = atol (vol.next().toAscii());
|
||||
|
||||
if(left > right)
|
||||
emit getVolume (left);
|
||||
else
|
||||
emit getVolume (right);
|
||||
|
||||
m_masterchan = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
emit getVolume (right);
|
||||
m_masterchan = true;
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
void XMMSHandler::playlistClear ()
|
||||
{
|
||||
m_client->playlist.clear () ();
|
||||
}
|
||||
|
||||
void XMMSHandler::play ()
|
||||
{
|
||||
m_client->playback.start () ();
|
||||
}
|
||||
|
||||
void XMMSHandler::stop ()
|
||||
{
|
||||
m_client->playback.stop () ();
|
||||
}
|
||||
|
||||
void XMMSHandler::pause ()
|
||||
{
|
||||
m_client->playback.pause () ();
|
||||
}
|
||||
|
||||
void XMMSHandler::next ()
|
||||
{
|
||||
m_client->playlist.setNextRel (1) ();
|
||||
m_client->playback.tickle () ();
|
||||
}
|
||||
|
||||
void XMMSHandler::prev ()
|
||||
{
|
||||
m_client->playlist.setNextRel (-1) ();
|
||||
m_client->playback.tickle () ();
|
||||
}
|
||||
|
108
src/XMMSHandler.h
Normal file
108
src/XMMSHandler.h
Normal file
|
@ -0,0 +1,108 @@
|
|||
#ifndef __XMMS_HANDLER_H__
|
||||
#define __XMMS_HANDLER_H__
|
||||
|
||||
#include <xmmsclient/xmmsclient++.h>
|
||||
|
||||
#include "xclient.h"
|
||||
#include "xmmsqt4.h"
|
||||
|
||||
#include <QObject>
|
||||
#include <QHash>
|
||||
#include <QTimer>
|
||||
|
||||
class PlaylistModel;
|
||||
|
||||
class XMMSHandler : public XClient {
|
||||
Q_OBJECT
|
||||
public:
|
||||
static XMMSHandler &getInstance ();
|
||||
|
||||
XMMSHandler (QObject *parent, const std::string &name);
|
||||
~XMMSHandler () {};
|
||||
|
||||
bool connect_handler (const char *ipcpath = NULL, const bool &sync = false, QWidget *parent = NULL);
|
||||
|
||||
bool playback_playtime (const unsigned int &time);
|
||||
bool playlist_list (const Xmms::List< unsigned int > &playlist);
|
||||
bool playback_current_id (const unsigned int &id);
|
||||
bool medialib_info (const Xmms::PropDict &propdict);
|
||||
bool medialib_entry_changed (const unsigned int &id);
|
||||
bool playback_status (const Xmms::Playback::Status &status);
|
||||
bool volume_changed (const Xmms::Dict &levels);
|
||||
bool playlist_changed (const Xmms::Dict &list);
|
||||
|
||||
void requestMediainfo (uint id);
|
||||
void requestPlaylistList ();
|
||||
void requestTrackChange (int pos);
|
||||
void playlistAddURL (const QString& url);
|
||||
void playlistRemove (uint pos);
|
||||
void playlistMove (uint pos, uint newpos);
|
||||
|
||||
/*
|
||||
void medialib_select (XMMSResultDictList *res);
|
||||
|
||||
|
||||
*/
|
||||
/*
|
||||
uint medialibQuery (QString);
|
||||
void medialibQueryAdd (QString q) { delete m_xmmsc->medialib_add_to_playlist (q.toUtf8 ()); }
|
||||
*/
|
||||
|
||||
void volumeGet ();
|
||||
|
||||
//const XMMSClient *getXMMS () { return m_xmmsc; }
|
||||
|
||||
void updateSettings () { emit settingsSaved (); }
|
||||
|
||||
Xmms::Client *getClient ();
|
||||
|
||||
PlaylistModel *getPlaylistModel () {return m_playlist_model; }
|
||||
|
||||
public slots:
|
||||
void setPlaytime (uint pos);
|
||||
void restartPlaytime ();
|
||||
|
||||
void playlistClear ();
|
||||
void play ();
|
||||
void stop ();
|
||||
void pause ();
|
||||
void next ();
|
||||
void prev ();
|
||||
void volumeSet (uint volume);
|
||||
|
||||
signals:
|
||||
void settingsSaved ();
|
||||
void playbackStatusChanged (Xmms::Playback::Status status);
|
||||
void playtimeChanged (uint time);
|
||||
void mediainfoChanged (uint, const Xmms::PropDict &);
|
||||
void currentSong (const Xmms::PropDict &);
|
||||
void playlistList (const Xmms::List< unsigned int > &);
|
||||
void currentID (uint);
|
||||
void playlistChanged (const Xmms::Dict &);
|
||||
/*
|
||||
void medialibResponse (uint, const QList<QHash<QString, QString> > &);
|
||||
*/
|
||||
void getVolume (uint);
|
||||
|
||||
private:
|
||||
QTimer m_playtime_timer;
|
||||
|
||||
void DictToQHash (const std::string &key,
|
||||
const Xmms::Dict::Variant &value,
|
||||
QHash<QString, QString> &hash);
|
||||
void PropDictToQHash (const std::string &key,
|
||||
const Xmms::Dict::Variant &value,
|
||||
const std::string &source,
|
||||
QHash<QString, QString> &hash);
|
||||
|
||||
bool volume_get (const Xmms::Dict &levels);
|
||||
bool volume_error (const std::string &error);
|
||||
|
||||
XmmsQT4 *m_qt4;
|
||||
PlaylistModel *m_playlist_model;
|
||||
unsigned int m_currentid;
|
||||
bool m_masterchan;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
4
src/avahi.prf
Normal file
4
src/avahi.prf
Normal file
|
@ -0,0 +1,4 @@
|
|||
SOURCES += ServerBrowser.cpp
|
||||
HEADERS += ServerBrowser.h
|
||||
PKGCONFIG += avahi-client avahi-qt4
|
||||
DEFINES += HAVE_SERVERBROWSER
|
BIN
src/icon.png
Normal file
BIN
src/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.2 KiB |
BIN
src/noalbum.png
Normal file
BIN
src/noalbum.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.2 KiB |
BIN
src/noartist.png
Normal file
BIN
src/noartist.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.2 KiB |
BIN
src/nocover.png
Normal file
BIN
src/nocover.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.2 KiB |
BIN
src/nosong.png
Normal file
BIN
src/nosong.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.2 KiB |
30
src/promoe.qrc
Normal file
30
src/promoe.qrc
Normal file
|
@ -0,0 +1,30 @@
|
|||
<!DOCTYPE RCC><RCC version="1.0">
|
||||
<qresource>
|
||||
<file>icon.png</file>
|
||||
<file>noartist.png</file>
|
||||
<file>nosong.png</file>
|
||||
<file>noalbum.png</file>
|
||||
<file>CleanAMP/Eq_ex.png</file>
|
||||
<file>CleanAMP/GENEX.png</file>
|
||||
<file>CleanAMP/Gen.png</file>
|
||||
<file>CleanAMP/monoster.png</file>
|
||||
<file>CleanAMP/PLEDIT.TXT</file>
|
||||
<file>CleanAMP/ReadMe.txt</file>
|
||||
<file>CleanAMP/Thumbs.db</file>
|
||||
<file>CleanAMP/VIDEO.png</file>
|
||||
<file>CleanAMP/Volume.png</file>
|
||||
<file>CleanAMP/balance.png</file>
|
||||
<file>CleanAMP/cbuttons.png</file>
|
||||
<file>CleanAMP/eqmain.png</file>
|
||||
<file>CleanAMP/main.png</file>
|
||||
<file>CleanAMP/mb.png</file>
|
||||
<file>CleanAMP/numbers.png</file>
|
||||
<file>CleanAMP/playpaus.png</file>
|
||||
<file>CleanAMP/pledit.png</file>
|
||||
<file>CleanAMP/posbar.png</file>
|
||||
<file>CleanAMP/shufrep.png</file>
|
||||
<file>CleanAMP/text.png</file>
|
||||
<file>CleanAMP/titlebar.png</file>
|
||||
<file>CleanAMP/viscolor.txt</file>
|
||||
</qresource>
|
||||
</RCC>
|
348
src/qtmd5.cpp
Normal file
348
src/qtmd5.cpp
Normal file
|
@ -0,0 +1,348 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 1992-2006 Trolltech AS. All rights reserved.
|
||||
**
|
||||
** This file is part of the qmake application of the Qt Toolkit.
|
||||
**
|
||||
** This file may be used under the terms of the GNU General Public
|
||||
** License version 2.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of
|
||||
** this file. Please review the following information to ensure GNU
|
||||
** General Public Licensing requirements will be met:
|
||||
** http://www.trolltech.com/products/qt/opensource.html
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** review the following information:
|
||||
** http://www.trolltech.com/products/qt/licensing.html or contact the
|
||||
** sales department at sales@trolltech.com.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
/*
|
||||
Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
|
||||
rights reserved.
|
||||
|
||||
RSA Data Security, Inc. makes no representations concerning either
|
||||
the merchantability of this software or the suitability of this
|
||||
software for any particular purpose. It is provided "as is"
|
||||
without express or implied warranty of any kind.
|
||||
|
||||
License to copy and use this software is granted provided that it
|
||||
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
|
||||
Algorithm" in all material mentioning or referencing this software
|
||||
or this function.
|
||||
|
||||
License is also granted to make and use derivative works provided
|
||||
that such works are identified as "derived from the RSA Data
|
||||
Security, Inc. MD5 Message-Digest Algorithm" in all material
|
||||
mentioning or referencing the derived work.
|
||||
|
||||
These notices must be retained in any copies of any part of this
|
||||
documentation and/or software.
|
||||
*/
|
||||
|
||||
#include "qtmd5.h"
|
||||
|
||||
typedef unsigned char *POINTER;
|
||||
typedef unsigned short int UINT2;
|
||||
typedef unsigned long int UINT4;
|
||||
|
||||
typedef struct {
|
||||
UINT4 state[4]; // state(ABCD)
|
||||
UINT4 count[2]; // number of bits, modulo 2^64(lsb first)
|
||||
unsigned char buffer[64]; // input buffer
|
||||
} MD5_CTX;
|
||||
|
||||
static void MD5Init(MD5_CTX *);
|
||||
static void MD5Update(MD5_CTX *, unsigned char *, unsigned int);
|
||||
static void MD5Final(unsigned char [16], MD5_CTX *);
|
||||
static void MD5Transform(UINT4[4], unsigned char[64]);
|
||||
static void Encode(unsigned char *, UINT4 *, unsigned int);
|
||||
static void Decode(UINT4 *, unsigned char *, unsigned int);
|
||||
static void MD5_memset(POINTER, int, unsigned int);
|
||||
static void MD5_memcpy(POINTER output,POINTER input,unsigned int len);
|
||||
|
||||
// Constants for MD5Transform routine.
|
||||
enum {
|
||||
S11 = 7, S12 = 12, S13 = 17, S14 = 22, S21 = 5, S22 = 9, S23 = 14, S24 = 20,
|
||||
S31 = 4, S32 = 11, S33 = 16, S34 = 23, S41 = 6, S42 = 10, S43 = 15, S44 = 21
|
||||
};
|
||||
|
||||
static unsigned char PADDING[64] = {
|
||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
// F, G, H and I are basic MD5 functions.
|
||||
static inline UINT4 F(UINT4 x, UINT4 y, UINT4 z)
|
||||
{
|
||||
return (x & y) |((~x) & z);
|
||||
}
|
||||
|
||||
static inline UINT4 G(UINT4 x, UINT4 y, UINT4 z)
|
||||
{
|
||||
return (x & z) |(y &(~z));
|
||||
}
|
||||
|
||||
static inline UINT4 H(UINT4 x, UINT4 y, UINT4 z)
|
||||
{
|
||||
return x ^ y ^ z;
|
||||
}
|
||||
|
||||
static inline UINT4 I(UINT4 x, UINT4 y, UINT4 z)
|
||||
{
|
||||
return y ^(x |(~z));
|
||||
}
|
||||
|
||||
static inline UINT4 rotateLeft(UINT4 x, UINT4 n)
|
||||
{
|
||||
return (x << n) |(x >>(32-(n)));
|
||||
}
|
||||
|
||||
// FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
|
||||
// Rotation is separate from addition to prevent recomputation.
|
||||
static inline void FF(UINT4 &a, UINT4 b, UINT4 c, UINT4 d, UINT4 x, UINT4 s, UINT4 ac)
|
||||
{
|
||||
a += F(b, c, d) + x + ac;
|
||||
a = rotateLeft(a, s);
|
||||
a += b;
|
||||
}
|
||||
|
||||
static inline void GG(UINT4 &a, UINT4 b, UINT4 c, UINT4 d, UINT4 x, UINT4 s, UINT4 ac)
|
||||
{
|
||||
a += G(b, c, d) + x +(UINT4)(ac);
|
||||
a = rotateLeft(a, s);
|
||||
a += b;
|
||||
}
|
||||
|
||||
static inline void HH(UINT4 &a, UINT4 b, UINT4 c, UINT4 d, UINT4 x, UINT4 s, UINT4 ac)
|
||||
{
|
||||
a += H(b, c, d) + x +(UINT4)(ac);
|
||||
a = rotateLeft(a, s);
|
||||
a += b;
|
||||
}
|
||||
|
||||
static inline void II(UINT4 &a, UINT4 b, UINT4 c, UINT4 d, UINT4 x, UINT4 s, UINT4 ac)
|
||||
{
|
||||
a += I(b, c, d) + x +(UINT4)(ac);
|
||||
a = rotateLeft(a, s);
|
||||
a += b;
|
||||
}
|
||||
|
||||
// MD5 initialization. Begins an MD5 operation, writing a new context.
|
||||
static void MD5Init(MD5_CTX *context)
|
||||
{
|
||||
context->count[0] = context->count[1] = 0;
|
||||
|
||||
// Load magic initialization constants.
|
||||
context->state[0] = 0x67452301;
|
||||
context->state[1] = 0xefcdab89;
|
||||
context->state[2] = 0x98badcfe;
|
||||
context->state[3] = 0x10325476;
|
||||
}
|
||||
|
||||
// MD5 block update operation. Continues an MD5 message-digest
|
||||
// operation, processing another message block, and updating the
|
||||
// context.
|
||||
static void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputLen)
|
||||
{
|
||||
unsigned int i, index, partLen;
|
||||
// Compute number of bytes mod 64
|
||||
index =(unsigned int)((context->count[0] >> 3) & 0x3F);
|
||||
|
||||
// Update number of bits
|
||||
if ((context->count[0] +=((UINT4)inputLen << 3)) <((UINT4)inputLen << 3))
|
||||
context->count[1]++;
|
||||
|
||||
context->count[1] +=((UINT4)inputLen >> 29);
|
||||
partLen = 64 - index;
|
||||
|
||||
// Transform as many times as possible.
|
||||
if (inputLen >= partLen) {
|
||||
MD5_memcpy((POINTER)&context->buffer[index],(POINTER)input, partLen);
|
||||
MD5Transform(context->state, context->buffer);
|
||||
for (i = partLen; i + 63 < inputLen; i += 64)
|
||||
MD5Transform(context->state, &input[i]);
|
||||
index = 0;
|
||||
} else {
|
||||
i = 0;
|
||||
}
|
||||
|
||||
// Buffer remaining input
|
||||
MD5_memcpy((POINTER)&context->buffer[index],(POINTER)&input[i],
|
||||
inputLen-i);
|
||||
}
|
||||
|
||||
// MD5 finalization. Ends an MD5 message-digest operation, writing the
|
||||
// the message digest and zeroizing the context.
|
||||
static void MD5Final(unsigned char digest[16], MD5_CTX *context)
|
||||
{
|
||||
unsigned char bits[8];
|
||||
unsigned int index, padLen;
|
||||
|
||||
// Save number of bits
|
||||
Encode(bits, context->count, 8);
|
||||
|
||||
// Pad out to 56 mod 64.
|
||||
index =(unsigned int)((context->count[0] >> 3) & 0x3f);
|
||||
padLen =(index < 56) ?(56 - index) :(120 - index);
|
||||
MD5Update(context, PADDING, padLen);
|
||||
|
||||
// Append length(before padding)
|
||||
MD5Update(context, bits, 8);
|
||||
|
||||
// Store state in digest
|
||||
Encode(digest, context->state, 16);
|
||||
|
||||
// Zeroize sensitive information.
|
||||
MD5_memset((POINTER)context, 0, sizeof(*context));
|
||||
}
|
||||
|
||||
// MD5 basic transformation. Transforms state based on block.
|
||||
static void MD5Transform(UINT4 state[4], unsigned char block[64])
|
||||
{
|
||||
UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
|
||||
Decode(x, block, 64);
|
||||
|
||||
// Round 1
|
||||
FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */
|
||||
FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */
|
||||
FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */
|
||||
FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */
|
||||
FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */
|
||||
FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */
|
||||
FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */
|
||||
FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */
|
||||
FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */
|
||||
FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */
|
||||
FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
|
||||
FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
|
||||
FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
|
||||
FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
|
||||
FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
|
||||
FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
|
||||
|
||||
// Round 2
|
||||
GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */
|
||||
GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */
|
||||
GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
|
||||
GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */
|
||||
GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */
|
||||
GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */
|
||||
GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
|
||||
GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */
|
||||
GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */
|
||||
GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
|
||||
GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */
|
||||
GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */
|
||||
GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
|
||||
GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */
|
||||
GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */
|
||||
GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
|
||||
|
||||
// Round 3
|
||||
HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */
|
||||
HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */
|
||||
HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
|
||||
HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
|
||||
HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */
|
||||
HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */
|
||||
HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */
|
||||
HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
|
||||
HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
|
||||
HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */
|
||||
HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */
|
||||
HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */
|
||||
HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */
|
||||
HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
|
||||
HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
|
||||
HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */
|
||||
|
||||
// Round 4
|
||||
II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */
|
||||
II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */
|
||||
II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
|
||||
II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */
|
||||
II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
|
||||
II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */
|
||||
II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
|
||||
II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */
|
||||
II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */
|
||||
II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
|
||||
II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */
|
||||
II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
|
||||
II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */
|
||||
II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
|
||||
II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */
|
||||
II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */
|
||||
state[0] += a;
|
||||
state[1] += b;
|
||||
state[2] += c;
|
||||
state[3] += d;
|
||||
|
||||
// Zeroize sensitive information.
|
||||
MD5_memset((POINTER)x, 0, sizeof(x));
|
||||
}
|
||||
|
||||
// Encodes input(UINT4) into output(unsigned char). Assumes len is a
|
||||
// multiple of 4.
|
||||
static void Encode(unsigned char *output, UINT4 *input, unsigned int len)
|
||||
{
|
||||
unsigned int i, j;
|
||||
for (i = 0, j = 0; j < len; i++, j += 4) {
|
||||
output[j] = (unsigned char) (input[i] & 0xff);
|
||||
output[j+1] = (unsigned char) ((input[i] >> 8) & 0xff);
|
||||
output[j+2] = (unsigned char) ((input[i] >> 16) & 0xff);
|
||||
output[j+3] = (unsigned char) ((input[i] >> 24) & 0xff);
|
||||
}
|
||||
}
|
||||
|
||||
// Decodes input(unsigned char) into output(UINT4). Assumes len is a
|
||||
// multiple of 4.
|
||||
static void Decode(UINT4 *output, unsigned char *input, unsigned int len)
|
||||
{
|
||||
unsigned int i, j;
|
||||
for (i = 0, j = 0; j < len; i++, j += 4)
|
||||
output[i] =((UINT4)input[j]) |(((UINT4)input[j+1]) << 8) |
|
||||
(((UINT4)input[j+2]) << 16) |(((UINT4)input[j+3]) << 24);
|
||||
}
|
||||
|
||||
// Note: Replace "for loop" with standard memset if possible.
|
||||
static void MD5_memset(POINTER output, int value, unsigned int len)
|
||||
{
|
||||
unsigned int i;
|
||||
for (i = 0; i < len; i++)
|
||||
((char *)output)[i] =(char)value;
|
||||
}
|
||||
|
||||
// Note: Replace "for loop" with standard memcpy if possible.
|
||||
static void MD5_memcpy(POINTER output,POINTER input,unsigned int len)
|
||||
{
|
||||
unsigned int i;
|
||||
for (i = 0; i < len; i++)
|
||||
output[i] = input[i];
|
||||
}
|
||||
|
||||
void qtMD5(const QByteArray &src, unsigned char *digest)
|
||||
{
|
||||
MD5_CTX context;
|
||||
|
||||
MD5Init(&context);
|
||||
MD5Update(&context, (unsigned char *) src.data(), src.size());
|
||||
MD5Final(digest, &context);
|
||||
}
|
||||
|
||||
QString qtMD5(const QByteArray &src)
|
||||
{
|
||||
unsigned char digest[16];
|
||||
qtMD5(src, digest);
|
||||
|
||||
QString output, tmp;
|
||||
for (int i = 0; i < 16; ++i)
|
||||
output += tmp.sprintf("%02x", digest[i]);
|
||||
return output;
|
||||
}
|
56
src/qtmd5.h
Normal file
56
src/qtmd5.h
Normal file
|
@ -0,0 +1,56 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 1992-2006 Trolltech AS. All rights reserved.
|
||||
**
|
||||
** This file is part of the qmake application of the Qt Toolkit.
|
||||
**
|
||||
** This file may be used under the terms of the GNU General Public
|
||||
** License version 2.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of
|
||||
** this file. Please review the following information to ensure GNU
|
||||
** General Public Licensing requirements will be met:
|
||||
** http://www.trolltech.com/products/qt/opensource.html
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** review the following information:
|
||||
** http://www.trolltech.com/products/qt/licensing.html or contact the
|
||||
** sales department at sales@trolltech.com.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
/*
|
||||
Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
|
||||
rights reserved.
|
||||
|
||||
RSA Data Security, Inc. makes no representations concerning either
|
||||
the merchantability of this software or the suitability of this
|
||||
software for any particular purpose. It is provided "as is"
|
||||
without express or implied warranty of any kind.
|
||||
|
||||
License to copy and use this software is granted provided that it
|
||||
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
|
||||
Algorithm" in all material mentioning or referencing this software
|
||||
or this function.
|
||||
|
||||
License is also granted to make and use derivative works provided
|
||||
that such works are identified as "derived from the RSA Data
|
||||
Security, Inc. MD5 Message-Digest Algorithm" in all material
|
||||
mentioning or referencing the derived work.
|
||||
|
||||
These notices must be retained in any copies of any part of this
|
||||
documentation and/or software.
|
||||
*/
|
||||
|
||||
#ifndef QTMD5_H
|
||||
#define QTMD5_H
|
||||
|
||||
#include <qstring.h>
|
||||
#include <qbytearray.h>
|
||||
|
||||
void qtMD5(const QByteArray &src, unsigned char *digest);
|
||||
QString qtMD5(const QByteArray &src);
|
||||
|
||||
#endif // QTMD5_H
|
89
src/src.pro
Normal file
89
src/src.pro
Normal file
|
@ -0,0 +1,89 @@
|
|||
TEMPLATE = app
|
||||
|
||||
include (../config.pri)
|
||||
|
||||
COMPONENTS+=../lib/liblib.a
|
||||
LIBS += $$COMPONENTS
|
||||
PRE_TARGETDEPS = $$COMPONENTS
|
||||
|
||||
SOURCES += PixWidget.cpp \
|
||||
Skin.cpp \
|
||||
MainWindow.cpp \
|
||||
Display.cpp \
|
||||
MainDisplay.cpp \
|
||||
TitleBar.cpp \
|
||||
Button.cpp \
|
||||
TextBar.cpp \
|
||||
NumberDisplay.cpp \
|
||||
TimeDisplay.cpp \
|
||||
XMMSHandler.cpp \
|
||||
SmallNumberDisplay.cpp \
|
||||
StereoMono.cpp \
|
||||
PosBar.cpp \
|
||||
PlayStatus.cpp \
|
||||
ShadedDisplay.cpp \
|
||||
Playlist.cpp \
|
||||
PlaylistView.cpp \
|
||||
SkinChooser.cpp \
|
||||
PlaylistShade.cpp \
|
||||
qtmd5.cpp \
|
||||
SettingsWindow.cpp \
|
||||
PlaylistMenu.cpp \
|
||||
VolumeSlider.cpp \
|
||||
ClutterBar.cpp \
|
||||
Equalizer.cpp \
|
||||
FileDialog.cpp \
|
||||
BrowseModel.cpp \
|
||||
BrowseDialog.cpp
|
||||
|
||||
|
||||
HEADERS += PixWidget.h \
|
||||
Skin.h \
|
||||
MainWindow.h \
|
||||
Display.h \
|
||||
MainDisplay.h \
|
||||
TitleBar.h \
|
||||
Button.h \
|
||||
TextBar.h \
|
||||
NumberDisplay.h \
|
||||
TimeDisplay.h \
|
||||
XMMSHandler.h \
|
||||
SmallNumberDisplay.h \
|
||||
StereoMono.h \
|
||||
PosBar.h \
|
||||
PlayStatus.h \
|
||||
ShadedDisplay.h \
|
||||
Playlist.h \
|
||||
PlaylistView.h \
|
||||
SkinChooser.h \
|
||||
PlaylistShade.h \
|
||||
qtmd5.h \
|
||||
SettingsWindow.h \
|
||||
PlaylistMenu.h \
|
||||
VolumeSlider.h \
|
||||
ClutterBar.h \
|
||||
Equalizer.h \
|
||||
FileDialog.h \
|
||||
BrowseModel.h \
|
||||
BrowseDialog.h
|
||||
|
||||
TARGET = promoe
|
||||
DESTDIR = $$PWD/..
|
||||
|
||||
RESOURCES = promoe.qrc
|
||||
macx:RC_FILE = promoe.icns
|
||||
macx:INCLUDEPATH = /sw/include
|
||||
|
||||
QT += network
|
||||
;macx:QTPLUGIN += qjpeg
|
||||
QMAKE_LFLAGS += -L$$[QT_INSTALL_PLUGINS]/imageformats
|
||||
|
||||
CONFIG += link_pkgconfig
|
||||
|
||||
QMAKE_CXXFLAGS += -g
|
||||
;CONFIG += debug warn_on
|
||||
QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-parameter
|
||||
PKGCONFIG += xmms2-client xmms2-client-cpp
|
||||
|
||||
;CONFIG += avahi
|
||||
|
66
src/xmmsclient_methods.h
Normal file
66
src/xmmsclient_methods.h
Normal file
|
@ -0,0 +1,66 @@
|
|||
#ifndef XMMSCLIENTPP_METHODS_H
|
||||
#define XMMSCLIENTPP_METHODS_H
|
||||
XMMSResult *quit (void) { return new XMMSResult (xmmsc_quit (m_xmmsc)); }
|
||||
XMMSResult *plugin_list (uint32_t x) { return new XMMSResult (xmmsc_plugin_list (m_xmmsc, x)); }
|
||||
XMMSResult *main_stats (void) { return new XMMSResult (xmmsc_main_stats (m_xmmsc)); }
|
||||
XMMSResult *broadcast_quit (void) { return new XMMSResult (xmmsc_broadcast_quit (m_xmmsc)); }
|
||||
XMMSResult *playlist_shuffle (void) { return new XMMSResult (xmmsc_playlist_shuffle (m_xmmsc)); }
|
||||
XMMSResult *playlist_add (const char * x) { return new XMMSResult (xmmsc_playlist_add (m_xmmsc, x)); }
|
||||
XMMSResult *playlist_add_id (uint32_t x) { return new XMMSResult (xmmsc_playlist_add_id (m_xmmsc, x)); }
|
||||
XMMSResult *playlist_remove (uint32_t x) { return new XMMSResult (xmmsc_playlist_remove (m_xmmsc, x)); }
|
||||
XMMSResult *playlist_clear (void) { return new XMMSResult (xmmsc_playlist_clear (m_xmmsc)); }
|
||||
XMMSResultValueList<uint> *playlist_list (void) { return new XMMSResultValueList<uint> (xmmsc_playlist_list (m_xmmsc)); }
|
||||
XMMSResult *playlist_sort (char* x) { return new XMMSResult (xmmsc_playlist_sort (m_xmmsc, x)); }
|
||||
XMMSResult *playlist_set_next (uint32_t x) { return new XMMSResult (xmmsc_playlist_set_next (m_xmmsc, x)); }
|
||||
XMMSResult *playlist_set_next_rel (int32_t x) { return new XMMSResult (xmmsc_playlist_set_next_rel (m_xmmsc, x)); }
|
||||
XMMSResult *playlist_move (uint32_t x,uint32_t y) { return new XMMSResult (xmmsc_playlist_move (m_xmmsc, x, y)); }
|
||||
XMMSResultValue<uint> *playlist_current_pos (void) { return new XMMSResultValue<uint> (xmmsc_playlist_current_pos (m_xmmsc)); }
|
||||
XMMSResult *playlist_insert (int x,char * y) { return new XMMSResult (xmmsc_playlist_insert (m_xmmsc, x, y)); }
|
||||
XMMSResult *playlist_insert_id (int x,uint32_t y) { return new XMMSResult (xmmsc_playlist_insert_id (m_xmmsc, x, y)); }
|
||||
XMMSResultDict *broadcast_playlist_changed (void) { return new XMMSResultDict (xmmsc_broadcast_playlist_changed (m_xmmsc)); }
|
||||
XMMSResultValue<uint> *broadcast_playlist_current_pos (void) { return new XMMSResultValue<uint> (xmmsc_broadcast_playlist_current_pos (m_xmmsc)); }
|
||||
XMMSResult *playback_stop (void) { return new XMMSResult (xmmsc_playback_stop (m_xmmsc)); }
|
||||
XMMSResult *playback_tickle (void) { return new XMMSResult (xmmsc_playback_tickle (m_xmmsc)); }
|
||||
XMMSResult *playback_start (void) { return new XMMSResult (xmmsc_playback_start (m_xmmsc)); }
|
||||
XMMSResult *playback_pause (void) { return new XMMSResult (xmmsc_playback_pause (m_xmmsc)); }
|
||||
XMMSResultValue<uint> *playback_current_id (void) { return new XMMSResultValue<uint> (xmmsc_playback_current_id (m_xmmsc)); }
|
||||
XMMSResult *playback_seek_ms (uint32_t x) { return new XMMSResult (xmmsc_playback_seek_ms (m_xmmsc, x)); }
|
||||
XMMSResult *playback_seek_ms_rel (int x) { return new XMMSResult (xmmsc_playback_seek_ms_rel (m_xmmsc, x)); }
|
||||
XMMSResult *playback_seek_samples (uint32_t x) { return new XMMSResult (xmmsc_playback_seek_samples (m_xmmsc, x)); }
|
||||
XMMSResult *playback_seek_samples_rel (int x) { return new XMMSResult (xmmsc_playback_seek_samples_rel (m_xmmsc, x)); }
|
||||
XMMSResultValue<uint> *playback_playtime (void) { return new XMMSResultValue<uint> (xmmsc_playback_playtime (m_xmmsc)); }
|
||||
XMMSResultValue<uint> *playback_status (void) { return new XMMSResultValue<uint> (xmmsc_playback_status (m_xmmsc)); }
|
||||
XMMSResult *playback_volume_set (const char * x,uint32_t y) { return new XMMSResult (xmmsc_playback_volume_set (m_xmmsc, x, y)); }
|
||||
XMMSResultDict *playback_volume_get (void) { return new XMMSResultDict (xmmsc_playback_volume_get (m_xmmsc)); }
|
||||
XMMSResult *broadcast_playback_volume_changed (void) { return new XMMSResult (xmmsc_broadcast_playback_volume_changed (m_xmmsc)); }
|
||||
XMMSResultValue<uint> *broadcast_playback_status (void) { return new XMMSResultValue<uint> (xmmsc_broadcast_playback_status (m_xmmsc)); }
|
||||
XMMSResultValue<uint> *broadcast_playback_current_id (void) { return new XMMSResultValue<uint> (xmmsc_broadcast_playback_current_id (m_xmmsc)); }
|
||||
XMMSResultValue<uint> *signal_playback_playtime (void) { return new XMMSResultValue<uint> (xmmsc_signal_playback_playtime (m_xmmsc)); }
|
||||
XMMSResult *configval_set (char * x,char * y) { return new XMMSResult (xmmsc_configval_set (m_xmmsc, x, y)); }
|
||||
XMMSResultValueList<char*> *configval_list (void) { return new XMMSResultValueList<char*> (xmmsc_configval_list (m_xmmsc)); }
|
||||
XMMSResultValue<char*> *configval_get (char * x) { return new XMMSResultValue<char*> (xmmsc_configval_get (m_xmmsc, x)); }
|
||||
XMMSResult *configval_register (char * x,char * y) { return new XMMSResult (xmmsc_configval_register (m_xmmsc, x, y)); }
|
||||
XMMSResultValue<char*> *broadcast_configval_changed (void) { return new XMMSResultValue<char*> (xmmsc_broadcast_configval_changed (m_xmmsc)); }
|
||||
XMMSResult *broadcast_mediainfo_reader_status (void) { return new XMMSResult (xmmsc_broadcast_mediainfo_reader_status (m_xmmsc)); }
|
||||
XMMSResult *signal_visualisation_data (void) { return new XMMSResult (xmmsc_signal_visualisation_data (m_xmmsc)); }
|
||||
XMMSResult *signal_mediainfo_reader_unindexed (void) { return new XMMSResult (xmmsc_signal_mediainfo_reader_unindexed (m_xmmsc)); }
|
||||
XMMSResultDictList *medialib_select (const char * x) { return new XMMSResultDictList (xmmsc_medialib_select (m_xmmsc, x)); }
|
||||
XMMSResult *medialib_playlist_save_current (const char * x) { return new XMMSResult (xmmsc_medialib_playlist_save_current (m_xmmsc, x)); }
|
||||
XMMSResult *medialib_playlist_load (const char * x) { return new XMMSResult (xmmsc_medialib_playlist_load (m_xmmsc, x)); }
|
||||
XMMSResult *medialib_add_entry (const char * x) { return new XMMSResult (xmmsc_medialib_add_entry (m_xmmsc, x)); }
|
||||
XMMSResultDict *medialib_get_info (uint32_t x) { return new XMMSResultDict (xmmsc_medialib_get_info (m_xmmsc, x)); }
|
||||
XMMSResult *medialib_add_to_playlist (const char * x) { return new XMMSResult (xmmsc_medialib_add_to_playlist (m_xmmsc, x)); }
|
||||
XMMSResultValueList<char*> *medialib_playlists_list (void) { return new XMMSResultValueList<char*> (xmmsc_medialib_playlists_list (m_xmmsc)); }
|
||||
XMMSResultValueList<uint> *medialib_playlist_list (const char * x) { return new XMMSResultValueList<uint> (xmmsc_medialib_playlist_list (m_xmmsc, x)); }
|
||||
XMMSResult *medialib_playlist_import (const char * x,const char * y) { return new XMMSResult (xmmsc_medialib_playlist_import (m_xmmsc, x, y)); }
|
||||
XMMSResult *medialib_playlist_export (const char * x,const char * y) { return new XMMSResult (xmmsc_medialib_playlist_export (m_xmmsc, x, y)); }
|
||||
XMMSResult *medialib_playlist_remove (const char * x) { return new XMMSResult (xmmsc_medialib_playlist_remove (m_xmmsc, x)); }
|
||||
XMMSResult *medialib_path_import (const char * x) { return new XMMSResult (xmmsc_medialib_path_import (m_xmmsc, x)); }
|
||||
XMMSResult *medialib_rehash (uint32_t x) { return new XMMSResult (xmmsc_medialib_rehash (m_xmmsc, x)); }
|
||||
XMMSResult *medialib_get_id (const char * x) { return new XMMSResult (xmmsc_medialib_get_id (m_xmmsc, x)); }
|
||||
XMMSResult *medialib_remove_entry (int32_t x) { return new XMMSResult (xmmsc_medialib_remove_entry (m_xmmsc, x)); }
|
||||
XMMSResult *medialib_entry_property_set (uint32_t x,char * y,char * z) { return new XMMSResult (xmmsc_medialib_entry_property_set (m_xmmsc, x, y, z)); }
|
||||
XMMSResult *medialib_entry_property_set_with_source (uint32_t x,char * y,char * z,char * w) { return new XMMSResult (xmmsc_medialib_entry_property_set_with_source (m_xmmsc, x, y, z, w)); }
|
||||
XMMSResultValue<uint> *broadcast_medialib_entry_changed (void) { return new XMMSResultValue<uint> (xmmsc_broadcast_medialib_entry_changed (m_xmmsc)); }
|
||||
XMMSResult *broadcast_medialib_playlist_loaded (void) { return new XMMSResult (xmmsc_broadcast_medialib_playlist_loaded (m_xmmsc)); }
|
||||
#endif
|
112
src/xmmsclient_promoe.cpp
Normal file
112
src/xmmsclient_promoe.cpp
Normal file
|
@ -0,0 +1,112 @@
|
|||
#include <xmmsclient/xmmsclient.h>
|
||||
#include <sigc++/sigc++.h>
|
||||
|
||||
#include "xmmsclient_promoe.h"
|
||||
|
||||
static
|
||||
void generic_handler (xmmsc_result_t *res, void *userdata)
|
||||
{
|
||||
XMMSResult* r = static_cast<XMMSResult*>(userdata);
|
||||
if (!r) {
|
||||
cout << "********* FATAL ERROR ***********" << endl;
|
||||
cout << "The generic handler was called without a result!" << endl;
|
||||
return;
|
||||
}
|
||||
r->emit ();
|
||||
}
|
||||
|
||||
XMMSClient::XMMSClient (const char *name)
|
||||
{
|
||||
m_xmmsc = xmmsc_init (name);
|
||||
}
|
||||
|
||||
bool
|
||||
XMMSClient::connect (const char *path)
|
||||
{
|
||||
if (!xmmsc_connect (m_xmmsc, path)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
XMMSClient::~XMMSClient ()
|
||||
{
|
||||
xmmsc_unref (m_xmmsc);
|
||||
}
|
||||
|
||||
XMMSResult::XMMSResult (xmmsc_result_t *res)
|
||||
: m_res(res), m_inited(false), m_signal()
|
||||
{
|
||||
}
|
||||
|
||||
XMMSResult::XMMSResult (const XMMSResult &src)
|
||||
: m_res(src.m_res)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
XMMSResult::restart (void)
|
||||
{
|
||||
xmmsc_result_t *nres;
|
||||
nres = xmmsc_result_restart (m_res);
|
||||
xmmsc_result_unref (m_res);
|
||||
xmmsc_result_unref (nres);
|
||||
m_res = nres;
|
||||
}
|
||||
|
||||
void
|
||||
XMMSResult::connect (const sigc::slot<void, XMMSResult*>& slot_)
|
||||
{
|
||||
if (!m_inited) {
|
||||
xmmsc_result_notifier_set (m_res, &generic_handler, this);
|
||||
m_inited = true;
|
||||
}
|
||||
m_signal.connect (slot_);
|
||||
}
|
||||
|
||||
static void
|
||||
dict_foreach (const void *key,
|
||||
xmmsc_result_value_type_t type,
|
||||
const void *value,
|
||||
void *udata)
|
||||
{
|
||||
list<const char *> *i (static_cast<list<const char*>*>(udata));
|
||||
i->push_front (static_cast<const char*>(key));
|
||||
}
|
||||
|
||||
list<const char *>
|
||||
XMMSResultDict::getDictKeys (void)
|
||||
{
|
||||
list<const char *> i;
|
||||
|
||||
xmmsc_result_dict_foreach (m_res, dict_foreach, static_cast<void*>(&i));
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
static void
|
||||
propdict_foreach (const void *key,
|
||||
xmmsc_result_value_type_t type,
|
||||
const void *value,
|
||||
const char *source,
|
||||
void *udata)
|
||||
{
|
||||
list<const char *> *i (static_cast<list<const char*>*>(udata));
|
||||
i->push_front (static_cast<const char*>(key));
|
||||
}
|
||||
|
||||
list<const char *>
|
||||
XMMSResultDict::getPropDictKeys (void)
|
||||
{
|
||||
list<const char *> i;
|
||||
|
||||
xmmsc_result_propdict_foreach (m_res, propdict_foreach, static_cast<void*>(&i));
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
XMMSResult::~XMMSResult ()
|
||||
{
|
||||
xmmsc_result_unref (m_res);
|
||||
}
|
199
src/xmmsclient_promoe.h
Normal file
199
src/xmmsclient_promoe.h
Normal file
|
@ -0,0 +1,199 @@
|
|||
#ifndef __XMMSCLIENTPP_H
|
||||
#define __XMMSCLIENTPP_H
|
||||
|
||||
#include <sigc++/sigc++.h>
|
||||
#include <iostream>
|
||||
#include <xmmsclient/xmmsclient.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
class XMMSResult
|
||||
{
|
||||
public:
|
||||
XMMSResult (xmmsc_result_t*);
|
||||
XMMSResult (const XMMSResult &);
|
||||
virtual ~XMMSResult ();
|
||||
|
||||
uint getClass (void) { return xmmsc_result_get_class (m_res); }
|
||||
uint getType (void) { return xmmsc_result_get_type (m_res); }
|
||||
void restart (void);
|
||||
|
||||
/* error */
|
||||
bool isError (void) { return xmmsc_result_iserror (m_res); }
|
||||
const char *getError (void) { return xmmsc_result_get_error (m_res); }
|
||||
|
||||
/* wait for this resultset */
|
||||
void wait (void) const { xmmsc_result_wait (m_res); }
|
||||
|
||||
void connect (const sigc::slot<void, XMMSResult*>& slot_);
|
||||
void emit (void) { m_signal.emit(this); }
|
||||
|
||||
protected:
|
||||
xmmsc_result_t *m_res;
|
||||
|
||||
bool m_inited;
|
||||
sigc::signal<void, XMMSResult*> m_signal;
|
||||
};
|
||||
|
||||
|
||||
class XMMSResultList
|
||||
{
|
||||
public:
|
||||
XMMSResultList (xmmsc_result_t* res) : m_list_res(res) { }
|
||||
XMMSResultList (const XMMSResultList &src) : m_list_res(src.m_list_res) { }
|
||||
virtual ~XMMSResultList () { }
|
||||
|
||||
bool listValid (void) { return xmmsc_result_list_valid (m_list_res); }
|
||||
bool listNext (void) { return xmmsc_result_list_next (m_list_res); }
|
||||
bool listFirst (void) { return xmmsc_result_list_first (m_list_res); }
|
||||
|
||||
bool isList (void) { return xmmsc_result_is_list (m_list_res); }
|
||||
|
||||
private:
|
||||
xmmsc_result_t *m_list_res;
|
||||
};
|
||||
|
||||
|
||||
class XMMSResultDict : public XMMSResult
|
||||
{
|
||||
public:
|
||||
XMMSResultDict (xmmsc_result_t* res) : XMMSResult(res) { }
|
||||
XMMSResultDict (const XMMSResultDict &src) : XMMSResult(src) { }
|
||||
virtual ~XMMSResultDict () { }
|
||||
|
||||
void connect (const sigc::slot<void, XMMSResultDict*>& slot_) {
|
||||
XMMSResult::connect(sigc::retype(slot_));
|
||||
}
|
||||
|
||||
std::list<const char*> getPropDictKeys ();
|
||||
std::list<const char*> getDictKeys ();
|
||||
|
||||
uint getDictValueType (const char *key) {
|
||||
return xmmsc_result_get_dict_entry_type (m_res, key);
|
||||
}
|
||||
|
||||
int entryFormat (char *target, int len, const char *format) {
|
||||
return xmmsc_entry_format (target, len, format, m_res);
|
||||
}
|
||||
|
||||
bool getValue (const char* key, int *var) {
|
||||
return xmmsc_result_get_dict_entry_int32 (m_res, key, var);
|
||||
}
|
||||
bool getValue (const char* key, uint *var) {
|
||||
return xmmsc_result_get_dict_entry_uint32 (m_res, key, var);
|
||||
}
|
||||
bool getValue (const char* key, char **var) {
|
||||
return xmmsc_result_get_dict_entry_str (m_res, key, var);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template <class T>
|
||||
class XMMSResultValue : public XMMSResult
|
||||
{
|
||||
public:
|
||||
XMMSResultValue (xmmsc_result_t* res) : XMMSResult(res) { }
|
||||
XMMSResultValue (const XMMSResultValue<T> &src) : XMMSResult(src) { }
|
||||
virtual ~XMMSResultValue () { }
|
||||
|
||||
void connect (const sigc::slot<void, XMMSResultValue<T>*>& slot_) = 0;
|
||||
bool getValue (T *var) = 0;
|
||||
};
|
||||
|
||||
template <>
|
||||
class XMMSResultValue<int> : public XMMSResult
|
||||
{
|
||||
public:
|
||||
XMMSResultValue (xmmsc_result_t* res) : XMMSResult(res) { }
|
||||
XMMSResultValue (const XMMSResultValue<int> &src) : XMMSResult(src) { }
|
||||
virtual ~XMMSResultValue () { }
|
||||
|
||||
void connect (const sigc::slot<void, XMMSResultValue<int>*>& slot_) {
|
||||
XMMSResult::connect(sigc::retype(slot_));
|
||||
}
|
||||
|
||||
bool getValue (int *var) { return xmmsc_result_get_int (m_res, var); }
|
||||
};
|
||||
|
||||
template <>
|
||||
class XMMSResultValue<uint> : public XMMSResult
|
||||
{
|
||||
public:
|
||||
XMMSResultValue (xmmsc_result_t* res) : XMMSResult(res) { }
|
||||
XMMSResultValue (const XMMSResultValue<uint> &src) : XMMSResult(src) { }
|
||||
virtual ~XMMSResultValue () { }
|
||||
|
||||
void connect (const sigc::slot<void, XMMSResultValue<uint>*>& slot_) {
|
||||
XMMSResult::connect(sigc::retype(slot_));
|
||||
}
|
||||
|
||||
bool getValue (uint *var) { return xmmsc_result_get_uint (m_res, var); }
|
||||
};
|
||||
|
||||
template <>
|
||||
class XMMSResultValue<char*> : public XMMSResult
|
||||
{
|
||||
public:
|
||||
XMMSResultValue (xmmsc_result_t* res) : XMMSResult(res) { }
|
||||
XMMSResultValue (const XMMSResultValue<char*> &src) : XMMSResult(src) { }
|
||||
virtual ~XMMSResultValue () { }
|
||||
|
||||
void connect (const sigc::slot<void, XMMSResultValue<char*>*>& slot_) {
|
||||
XMMSResult::connect(sigc::retype(slot_));
|
||||
}
|
||||
|
||||
bool getValue (char **var) { return xmmsc_result_get_string (m_res, var); }
|
||||
};
|
||||
|
||||
|
||||
template <class T>
|
||||
class XMMSResultValueList : public XMMSResultList, public XMMSResultValue<T>
|
||||
{
|
||||
public:
|
||||
XMMSResultValueList (xmmsc_result_t* res)
|
||||
: XMMSResultList(res), XMMSResultValue<T>(res) { }
|
||||
XMMSResultValueList (const XMMSResultValueList<T> &src)
|
||||
: XMMSResultList(src), XMMSResultValue<T>(src) { }
|
||||
virtual ~XMMSResultValueList() { }
|
||||
|
||||
void connect (const sigc::slot<void, XMMSResultValueList<T>*>& slot_) {
|
||||
XMMSResult::connect(sigc::retype(slot_));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class XMMSResultDictList : public XMMSResultList, public XMMSResultDict
|
||||
{
|
||||
public:
|
||||
XMMSResultDictList (xmmsc_result_t* res)
|
||||
: XMMSResultList(res), XMMSResultDict(res) { }
|
||||
XMMSResultDictList (const XMMSResultDictList &src)
|
||||
: XMMSResultList(src), XMMSResultDict(src) { }
|
||||
virtual ~XMMSResultDictList() { }
|
||||
|
||||
void connect (const sigc::slot<void, XMMSResultDictList*>& slot_) {
|
||||
XMMSResult::connect(sigc::retype(slot_));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
class XMMSClient
|
||||
{
|
||||
public:
|
||||
XMMSClient (const char *name);
|
||||
~XMMSClient ();
|
||||
|
||||
bool connect (const char *path);
|
||||
|
||||
xmmsc_connection_t *getConn(void) { return m_xmmsc; }
|
||||
|
||||
#include "xmmsclient_methods.h"
|
||||
|
||||
private:
|
||||
xmmsc_connection_t *m_xmmsc;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue