Added server side browsing via xmmsc_xform_media_browse()

This commit is contained in:
Tobias Rundstrom 2006-08-23 17:16:38 -04:00
parent 70c6c3832f
commit 95ff470248
12 changed files with 525 additions and 9 deletions

169
BrowseDialog.cpp Normal file
View file

@ -0,0 +1,169 @@
#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>
BrowseDialog::BrowseDialog (QWidget *parent) : QDialog (parent)
{
setSizeGripEnabled(true);
QGridLayout *grid = new QGridLayout (this);
m_list = new QListView (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->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);
}

38
BrowseDialog.h Normal file
View file

@ -0,0 +1,38 @@
#ifndef __BROWSEDIALOG_H__
#define __BROWSEDIALOG_H__
#include "BrowseModel.h"
#include <QDialog>
#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:
QListView *m_list;
QComboBox *m_lookInCombo;
QLineEdit *m_lookInEdit;
QLineEdit *m_fileNameEdit;
QComboBox *m_fileTypeCombo;
BrowseModel *m_model;
QItemSelectionModel *m_selections;
};
#endif

162
BrowseModel.cpp Normal file
View file

@ -0,0 +1,162 @@
#include "XMMSHandler.h"
#include "BrowseModel.h"
#include <QAbstractTableModel>
#include <QString>
#include <QIcon>
#include <QWidget>
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) {
const char *tmp;
Xmms::Dict d = *res;
if (!d.contains ("path"))
continue;
tmp = xmmsc_result_decode_url (NULL, d.get<std::string> ("path").c_str ());
QString path = QString::fromUtf8 (tmp);
free ((char *)tmp);
QString name;
if (d.contains ("name")) {
name = QString::fromStdString ((*res).get<std::string> ("name"));
} else {
name = path.mid (path.lastIndexOf ("/")+1);
}
bool isdir = (*res).get<int32_t> ("isdir");
if (m_filter_dot && name.startsWith ("."))
// skip these files
continue;
m_list.append (new BrowseModelItem (path, name, isdir));
}
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));
}

86
BrowseModel.h Normal file
View file

@ -0,0 +1,86 @@
#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;
};
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

View file

@ -1,4 +1,5 @@
#include "MainWindow.h"
#include "BrowseDialog.h"
#include "Playlist.h"
#include "PlaylistList.h"
@ -361,7 +362,16 @@ PlaylistWidget::menuAddDir ()
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 ();
@ -369,6 +379,7 @@ PlaylistWidget::menuAddFile ()
for (int i = 0; i < files.count(); i++) {
XMMSHandler::getInstance ().playlistAddURL ("file://" + files.value(i));
}
}
}

View file

@ -41,11 +41,15 @@ SettingsWindow::SettingsWindow (QWidget *parent) : QMainWindow (parent)
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
@ -53,12 +57,11 @@ SettingsWindow::okButton (void)
{
m_mainwindow->saveSettings ();
m_playlistwin->saveSettings ();
m_medialib->saveSettings ();
close ();
XMMSHandler::getInstance ().updateSettings ();
}
/*
SettingsTabMedialib::SettingsTabMedialib (QWidget *parent) : QWidget (parent)
{
QSettings s;
@ -231,6 +234,7 @@ SettingsTabMedialib::saveSettings ()
s.setValue ("medialib_album/size", m_albumsize->currentText ());
s.setValue ("medialib_song/size", m_songsize->currentText ());
}
*/
SettingsTabPlaylist::SettingsTabPlaylist (QWidget *parent) : QWidget (parent)
{
@ -270,6 +274,24 @@ SettingsTabPlaylist::SettingsTabPlaylist (QWidget *parent) : QWidget (parent)
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 ();
}
@ -279,6 +301,7 @@ 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)

View file

@ -35,6 +35,7 @@ class SettingsTabPlaylist : public QWidget {
private:
QSpinBox *m_fontsize;
QSpinBox *m_shadesize;
QCheckBox *m_remote_fs;
};
class SettingsTabMain : public QWidget {

View file

@ -5,6 +5,7 @@
#include "MedialibWindow.h"
#include "SettingsWindow.h"
#include "Button.h"
#include "BrowseDialog.h"
#include <QMenu>
@ -45,6 +46,10 @@ TitleBar::showMenu (void)
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"));
@ -76,6 +81,13 @@ TitleBar::showMlib ()
*/
}
void
TitleBar::showServerB ()
{
BrowseDialog *bd = new BrowseDialog (window ());
bd->show ();
}
void
TitleBar::showSettings ()
{

View file

@ -18,6 +18,7 @@ class TitleBar : public PixWidget
public slots:
void setPixmaps (Skin *skin);
void showMenu (void);
void showServerB (void);
void showTheme (void);
void showMlib (void);
void showSettings (void);

View file

@ -77,6 +77,13 @@ XMMSHandler::connect (const char *path)
return true;
}
Xmms::Client *
XMMSHandler::getClient ()
{
return &m_client;
}
void
XMMSHandler::restartPlaytime ()
{

View file

@ -48,6 +48,8 @@ class XMMSHandler : public QObject {
void updateSettings () { emit settingsSaved (); }
Xmms::Client *getClient ();
public slots:
void setPlaytime (uint pos);
void restartPlaytime ();

View file

@ -25,7 +25,9 @@ SOURCES += XmmsQT4.cpp \
VolumeSlider.cpp \
ClutterBar.cpp \
Equalizer.cpp \
FileDialog.cpp
FileDialog.cpp \
BrowseModel.cpp \
BrowseDialog.cpp
HEADERS += XmmsQT4.h \
@ -55,7 +57,9 @@ HEADERS += XmmsQT4.h \
VolumeSlider.h \
ClutterBar.h \
Equalizer.h \
FileDialog.h
FileDialog.h \
BrowseModel.h \
BrowseDialog.h