/* This file is part of the KDE project | |
Copyright (C) 2006-2007 Matthias Kretz <kretz@kde.org> | |
This library is free software; you can redistribute it and/or | |
modify it under the terms of the GNU Lesser General Public | |
License as published by the Free Software Foundation; either | |
version 2.1 of the License, or (at your option) version 3, or any | |
later version accepted by the membership of KDE e.V. (or its | |
successor approved by the membership of KDE e.V.), Nokia Corporation | |
(or its successors, if any) and the KDE Free Qt Foundation, which shall | |
act as a proxy defined in Section 6 of version 3 of the license. | |
This library is distributed in the hope that it will be useful, | |
but WITHOUT ANY WARRANTY; without even the implied warranty of | |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
Lesser General Public License for more details. | |
You should have received a copy of the GNU Lesser General Public | |
License along with this library. If not, see <http://www.gnu.org/licenses/>. | |
*/ | |
#ifndef PHONON_OBJECTDESCRIPTIONMODEL_H | |
#define PHONON_OBJECTDESCRIPTIONMODEL_H | |
#include "phonon_export.h" | |
#include "phonondefs.h" | |
#include "objectdescription.h" | |
#include <QtCore/QList> | |
#include <QtCore/QModelIndex> | |
#include <QtCore/QStringList> | |
QT_BEGIN_HEADER | |
QT_BEGIN_NAMESPACE | |
#ifndef QT_NO_PHONON_OBJECTDESCRIPTIONMODEL | |
namespace Phonon | |
{ | |
class ObjectDescriptionModelDataPrivate; | |
/** \internal | |
* \class ObjectDescriptionModelData objectdescriptionmodel.h Phonon/ObjectDescriptionModelData | |
* \brief Data class for models for ObjectDescription objects. | |
* | |
* \author Matthias Kretz <kretz@kde.org> | |
*/ | |
class PHONON_EXPORT ObjectDescriptionModelData | |
{ | |
public: | |
/** | |
* Returns the number of rows in the model. This value corresponds | |
* to the size of the list passed through setModelData. | |
* | |
* \param parent The optional \p parent argument is used in most models to specify | |
* the parent of the rows to be counted. Because this is a list if a | |
* valid parent is specified the result will always be 0. | |
* | |
* Reimplemented from QAbstractItemModel. | |
* | |
* \see QAbstractItemModel::rowCount | |
*/ | |
int rowCount(const QModelIndex &parent = QModelIndex()) const; | |
/** | |
* Returns data from the item with the given \p index for the specified | |
* \p role. | |
* If the view requests an invalid index, an invalid variant is | |
* returned. | |
* | |
* Reimplemented from QAbstractItemModel. | |
* | |
* \see QAbstractItemModel::data | |
* \see Qt::ItemDataRole | |
*/ | |
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; | |
/** | |
* Reimplemented to show unavailable devices as disabled (but still | |
* selectable). | |
*/ | |
Qt::ItemFlags flags(const QModelIndex &index) const; | |
/** | |
* Returns a list of indexes in the same order as they are in the | |
* model. The indexes come from the ObjectDescription::index | |
* method. | |
* | |
* This is useful to let the user define a list of preference. | |
*/ | |
QList<int> tupleIndexOrder() const; | |
/** | |
* Returns the ObjectDescription::index for the tuple | |
* at the given position \p positionIndex. For example a | |
* QComboBox will give you the currentIndex as the | |
* position in the list. But to select the according | |
* AudioOutputDevice using AudioOutputDevice::fromIndex | |
* you can use this method. | |
* | |
* \param positionIndex The position in the list. | |
*/ | |
int tupleIndexAtPositionIndex(int positionIndex) const; | |
/** | |
* Returns the MIME data that dropMimeData() can use to create new | |
* items. | |
*/ | |
QMimeData *mimeData(ObjectDescriptionType type, const QModelIndexList &indexes) const; | |
/** | |
* Moves the item at the given \p index up. In the resulting list | |
* the items at index.row() and index.row() - 1 are swapped. | |
* | |
* Connected views are updated automatically. | |
*/ | |
void moveUp(const QModelIndex &index); | |
/** | |
* Moves the item at the given \p index down. In the resulting list | |
* the items at index.row() and index.row() + 1 are swapped. | |
* | |
* Connected views are updated automatically. | |
*/ | |
void moveDown(const QModelIndex &index); | |
void setModelData(const QList<QExplicitlySharedDataPointer<ObjectDescriptionData> > &data); | |
QList<QExplicitlySharedDataPointer<ObjectDescriptionData> > modelData() const; | |
QExplicitlySharedDataPointer<ObjectDescriptionData> modelData(const QModelIndex &index) const; | |
Qt::DropActions supportedDropActions() const; | |
bool dropMimeData(ObjectDescriptionType type, const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); | |
bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()); | |
QStringList mimeTypes(ObjectDescriptionType type) const; | |
ObjectDescriptionModelData(QAbstractListModel *); | |
protected: | |
~ObjectDescriptionModelData(); | |
//ObjectDescriptionModelData(ObjectDescriptionModelDataPrivate *dd); | |
ObjectDescriptionModelDataPrivate *const d; | |
}; | |
/* Required to ensure template class vtables are exported on both symbian | |
and existing builds. */ | |
#if defined(Q_OS_SYMBIAN) && defined(Q_CC_RVCT) | |
// RVCT compiler (2.2.686) requires the export declaration to be on the class to export vtables | |
// MWC compiler works both ways | |
// GCCE compiler is unknown (it can't compile QtCore yet) | |
#define PHONON_TEMPLATE_CLASS_EXPORT PHONON_EXPORT | |
#define PHONON_TEMPLATE_CLASS_MEMBER_EXPORT | |
#else | |
// Windows builds (at least) do not support export declaration on templated class | |
// But if you export a member function, the vtable is implicitly exported | |
#define PHONON_TEMPLATE_CLASS_EXPORT | |
#define PHONON_TEMPLATE_CLASS_MEMBER_EXPORT PHONON_EXPORT | |
#endif | |
/** \class ObjectDescriptionModel objectdescriptionmodel.h Phonon/ObjectDescriptionModel | |
* \short The ObjectDescriptionModel class provides a model from | |
* a list of ObjectDescription objects. | |
* | |
* ObjectDescriptionModel is a readonly model that supplies a list | |
* using ObjectDescription::name() for the text and | |
* ObjectDescription::description() for the tooltip. If set the properties | |
* "icon" and "available" are used to set the decoration and disable the | |
* item (disabled only visually, you can still select and drag it). | |
* | |
* It also provides the methods moveUp() and moveDown() to order the list. | |
* Additionally drag and drop is possible so that | |
* QAbstractItemView::InternalMove can be used. | |
* The resulting order of the ObjectDescription::index() values can then be | |
* retrieved using tupleIndexOrder(). | |
* | |
* An example use case would be to give the user a QComboBox to select | |
* the output device: | |
* \code | |
* QComboBox *cb = new QComboBox(parentWidget); | |
* ObjectDescriptionModel *model = new ObjectDescriptionModel(cb); | |
* model->setModelData(BackendCapabilities::availableAudioOutputDevices()); | |
* cb->setModel(model); | |
* cb->setCurrentIndex(0); // select first entry | |
* \endcode | |
* | |
* And to retrieve the selected AudioOutputDevice: | |
* \code | |
* int cbIndex = cb->currentIndex(); | |
* AudioOutputDevice selectedDevice = model->modelData(cbIndex); | |
* \endcode | |
* | |
* \ingroup Frontend | |
* \author Matthias Kretz <kretz@kde.org> | |
*/ | |
template<ObjectDescriptionType type> | |
class PHONON_TEMPLATE_CLASS_EXPORT ObjectDescriptionModel : public QAbstractListModel | |
{ | |
public: | |
Q_OBJECT_CHECK | |
/** \internal */ | |
static PHONON_TEMPLATE_CLASS_MEMBER_EXPORT const QMetaObject staticMetaObject; | |
/** \internal */ | |
PHONON_TEMPLATE_CLASS_MEMBER_EXPORT const QMetaObject *metaObject() const; | |
/** \internal */ | |
PHONON_TEMPLATE_CLASS_MEMBER_EXPORT void *qt_metacast(const char *_clname); | |
//int qt_metacall(QMetaObject::Call _c, int _id, void **_a); | |
/** | |
* Returns the number of rows in the model. This value corresponds | |
* to the size of the list passed through setModelData. | |
* | |
* \param parent The optional \p parent argument is used in most models to specify | |
* the parent of the rows to be counted. Because this is a list if a | |
* valid parent is specified the result will always be 0. | |
* | |
* Reimplemented from QAbstractItemModel. | |
* | |
* \see QAbstractItemModel::rowCount | |
*/ | |
inline int rowCount(const QModelIndex &parent = QModelIndex()) const { return d->rowCount(parent); } //krazy:exclude=inline | |
/** | |
* Returns data from the item with the given \p index for the specified | |
* \p role. | |
* If the view requests an invalid index, an invalid variant is | |
* returned. | |
* | |
* Reimplemented from QAbstractItemModel. | |
* | |
* \see QAbstractItemModel::data | |
* \see Qt::ItemDataRole | |
*/ | |
inline QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const { return d->data(index, role); } //krazy:exclude=inline | |
/** | |
* Reimplemented to show unavailable devices as disabled (but still | |
* selectable). | |
*/ | |
inline Qt::ItemFlags flags(const QModelIndex &index) const { return d->flags(index); } //krazy:exclude=inline | |
/** | |
* Returns a list of indexes in the same order as they are in the | |
* model. The indexes come from the ObjectDescription::index | |
* method. | |
* | |
* This is useful to let the user define a list of preference. | |
*/ | |
inline QList<int> tupleIndexOrder() const { return d->tupleIndexOrder(); } //krazy:exclude=inline | |
/** | |
* Returns the ObjectDescription::index for the tuple | |
* at the given position \p positionIndex. For example a | |
* QComboBox will give you the currentIndex as the | |
* position in the list. But to select the according | |
* AudioOutputDevice using AudioOutputDevice::fromIndex | |
* you can use this method. | |
* | |
* \param positionIndex The position in the list. | |
*/ | |
inline int tupleIndexAtPositionIndex(int positionIndex) const { return d->tupleIndexAtPositionIndex(positionIndex); } //krazy:exclude=inline | |
/** | |
* Returns the MIME data that dropMimeData() can use to create new | |
* items. | |
*/ | |
inline QMimeData *mimeData(const QModelIndexList &indexes) const { return d->mimeData(type, indexes); } //krazy:exclude=inline | |
/** | |
* Moves the item at the given \p index up. In the resulting list | |
* the items at index.row() and index.row() - 1 are swapped. | |
* | |
* Connected views are updated automatically. | |
*/ | |
inline void moveUp(const QModelIndex &index) { d->moveUp(index); } //krazy:exclude=inline | |
/** | |
* Moves the item at the given \p index down. In the resulting list | |
* the items at index.row() and index.row() + 1 are swapped. | |
* | |
* Connected views are updated automatically. | |
*/ | |
inline void moveDown(const QModelIndex &index) { d->moveDown(index); } //krazy:exclude=inline | |
/** | |
* Constructs a ObjectDescription model with the | |
* given \p parent. | |
*/ | |
explicit inline ObjectDescriptionModel(QObject *parent = 0) : QAbstractListModel(parent), d(new ObjectDescriptionModelData(this)) {} //krazy:exclude=inline | |
/** | |
* Constructs a ObjectDescription model with the | |
* given \p parent and the given \p data. | |
*/ | |
explicit inline ObjectDescriptionModel(const QList<ObjectDescription<type> > &data, QObject *parent = 0) //krazy:exclude=inline | |
: QAbstractListModel(parent), d(new ObjectDescriptionModelData(this)) { setModelData(data); } | |
/** | |
* Sets the model data using the list provided by \p data. | |
* | |
* All previous model data is cleared. | |
*/ | |
inline void setModelData(const QList<ObjectDescription<type> > &data) { //krazy:exclude=inline | |
QList<QExplicitlySharedDataPointer<ObjectDescriptionData> > list; | |
for (int i = 0; i < data.count(); ++i) { | |
list += data.at(i).d; | |
} | |
d->setModelData(list); | |
} | |
/** | |
* Returns the model data. | |
* | |
* As the order of the list might have changed this can be different | |
* to what was set using setModelData(). | |
*/ | |
inline QList<ObjectDescription<type> > modelData() const { //krazy:exclude=inline | |
QList<ObjectDescription<type> > ret; | |
QList<QExplicitlySharedDataPointer<ObjectDescriptionData> > list = d->modelData(); | |
for (int i = 0; i < list.count(); ++i) { | |
ret << ObjectDescription<type>(list.at(i)); | |
} | |
return ret; | |
} | |
/** | |
* Returns one ObjectDescription of the model data for the given \p index. | |
*/ | |
inline ObjectDescription<type> modelData(const QModelIndex &index) const { return ObjectDescription<type>(d->modelData(index)); } //krazy:exclude=inline | |
/** | |
* This model supports drag and drop to copy or move | |
* items. | |
*/ | |
inline Qt::DropActions supportedDropActions() const { return d->supportedDropActions(); } //krazy:exclude=inline | |
/** | |
* Accept drops from other models of the same ObjectDescriptionType. | |
* | |
* If a valid \p parent is given the dropped items will be inserted | |
* above that item. | |
*/ | |
inline bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { //krazy:exclude=inline | |
return d->dropMimeData(type, data, action, row, column, parent); | |
} | |
/** | |
* Removes count rows starting with the given row. | |
* | |
* If a valid \p parent is given no rows are removed since this is a | |
* list model. | |
* | |
* Returns true if the rows were successfully removed; otherwise returns false. | |
*/ | |
inline bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) { //krazy:exclude=inline | |
return d->removeRows(row, count, parent); | |
} | |
/** | |
* Returns a list of supported drag and drop MIME types. Currently | |
* it only supports one type used internally. | |
*/ | |
inline QStringList mimeTypes() const { return d->mimeTypes(type); } //krazy:exclude=inline | |
protected: | |
ObjectDescriptionModelData *const d; | |
}; | |
typedef ObjectDescriptionModel<AudioOutputDeviceType> AudioOutputDeviceModel; | |
typedef ObjectDescriptionModel<AudioCaptureDeviceType> AudioCaptureDeviceModel; | |
typedef ObjectDescriptionModel<EffectType> EffectDescriptionModel; | |
typedef ObjectDescriptionModel<AudioChannelType> AudioChannelDescriptionModel; | |
typedef ObjectDescriptionModel<SubtitleType> SubtitleDescriptionModel; | |
/* | |
typedef ObjectDescriptionModel<VideoOutputDeviceType> VideoOutputDeviceModel; | |
typedef ObjectDescriptionModel<VideoCaptureDeviceType> VideoCaptureDeviceModel; | |
typedef ObjectDescriptionModel<AudioCodecType> AudioCodecDescriptionModel; | |
typedef ObjectDescriptionModel<VideoCodecType> VideoCodecDescriptionModel; | |
typedef ObjectDescriptionModel<ContainerFormatType> ContainerFormatDescriptionModel; | |
typedef ObjectDescriptionModel<VisualizationType> VisualizationDescriptionModel;*/ | |
} | |
#endif //QT_NO_PHONON_OBJECTDESCRIPTIONMODEL | |
QT_END_NAMESPACE | |
QT_END_HEADER | |
#endif // PHONON_OBJECTDESCRIPTIONMODEL_H | |
// vim: sw=4 ts=4 tw=80 |