38 #include <KApplication>
40 #include <QtCore/QVariant>
41 #include <QtCore/QtAlgorithms>
42 #include <QtGui/QSpinBox>
43 #include <QtGui/QCheckBox>
44 #include <QtGui/QDoubleSpinBox>
45 #include <QtCore/QMimeData>
55 setHorizontalHeaderLabels(QStringList() << i18nc(
"Header in a table holding DBus functions",
"Application / Node"));
58 dbusServiceItem->setEditable(
false);
59 appendRow(dbusServiceItem);
64 sort(0, Qt::AscendingOrder);
68 if(index.isValid() && index.parent().isValid()){
69 return data(index.parent(), Qt::UserRole).toString();
75 if(index.isValid() && index.parent().isValid()){
76 return data(index, Qt::DisplayRole).toString();
83 for(
int i = 0; i < rowCount(); i++){
85 if(!appItem->index().parent().isValid()){
86 if(appItem->data(Qt::UserRole).toString() == action->
application()){
89 while((nodeItem = appItem->child(j++)) != 0){
90 if(nodeItem->data(Qt::DisplayRole) == action->
node()){
91 kDebug() <<
"Found item at index:" << nodeItem->index();
92 return nodeItem->index();
100 kDebug() <<
"inserting item because app seems not to be registered at DBus";
102 dbusServiceItem->setEditable(
false);
103 appendRow(dbusServiceItem);
105 dbusServiceItem->appendRow(item);
106 return item->index();
108 kDebug() <<
"Not found and not inserting... Returning invalid index";
109 return QModelIndex();
119 setData(item, Qt::UserRole);
120 setFlags(Qt::ItemIsEnabled);
125 foreach(
const QString &
object, objects) {
131 if (role == Qt::DisplayRole || role == Qt::EditRole) {
132 return trimAppname(QStandardItem::data(Qt::UserRole).toString());
134 return QStandardItem::data(role);
137 QString DBusServiceItem::trimAppname(
const QString& appName) {
138 int lastIndex = appName .lastIndexOf(QLatin1String(
"." )) + 1;
139 if (lastIndex < appName.size()) {
141 QString domainName = appName;
142 s.remove(0, lastIndex);
143 domainName.remove(lastIndex -1, domainName.length());
144 return s.append(QLatin1String(
" (" )).append( domainName).append(QLatin1Char(
')' ));
156 qRegisterMetaType<Prototype*>(
"Prototype*");
167 for (QMultiMap<QString, Prototype>::const_iterator i = functionMap.constBegin(); i != functionMap.constEnd(); ++i){
168 appendRow(i.key(), i.value());
171 sort(0, Qt::AscendingOrder);
175 void DBusFunctionModel::appendRow(
const QString &interface,
Prototype prototype) {
176 QList<QStandardItem*> itemList;
178 item->setData(qVariantFromValue(prototype), Qt::UserRole);
179 item->setData(interface, Qt::UserRole + 1);
180 itemList.append(item);
183 if(!argString.isEmpty()){
184 argString += QLatin1String(
", " );
186 argString += QLatin1String(QVariant::typeToName(arg.
value().type()));
188 argString += QLatin1Char(
' ' ) + arg.
description();
193 QStandardItemModel::appendRow(itemList);
197 return QStandardItemModel::item(index)->data(Qt::UserRole).value<
Prototype>();
202 return QStandardItemModel::item(index)->data(Qt::UserRole+1).toString();
207 for(
int i = 0; i < rowCount(); i++){
210 return functionItem->index();
215 QList<QStandardItem*> itemList;
217 item->setData(qVariantFromValue(action->
function()), Qt::UserRole);
218 itemList.append(item);
221 if(!argString.isEmpty()){
222 argString += QLatin1String(
", " );
224 argString += QLatin1String(QVariant::typeToName(arg.
value().type()));
226 argString += QLatin1Char(
' ' ) + arg.
description();
231 QStandardItemModel::appendRow(itemList);
232 return item->index();
234 kDebug() <<
"Not found and not inserting... Returning invalid index";
235 return QModelIndex();
239 if (orientation == Qt::Horizontal) {
240 if (role == Qt::DisplayRole) {
243 return i18n(
"Function");
245 return i18n(
"Parameters");
264 QList<QStandardItem*> itemList;
266 itemList.last()->setEditable(
false);
273 if (orientation == Qt::Horizontal) {
274 if (role == Qt::DisplayRole) {
277 return i18n(
"Description");
279 return i18n(
"Value");
287 QList<Argument> argList;
288 for(
int i = 0; i < rowCount(); i++){
289 argList.append(qVariantValue<Argument>(item(i, 1)->data(Qt::EditRole)));
306 unsigned int maxInt = -1;
307 Argument arg = qVariantValue<Argument>(index.model()->data(index, Qt::EditRole));
308 kDebug() <<
"creaing edtor for:" << arg.
description() <<
"value:" << arg.
value();
309 switch (arg.
value().type()) {
311 case QVariant::LongLong: {
312 QSpinBox *spinBox =
new QSpinBox(parent);
313 spinBox->setMaximum(maxInt/2);
314 spinBox->setMinimum(maxInt/2* -1);
315 spinBox->setValue(arg.
value().toInt());
319 case QVariant::UInt: {
320 QSpinBox *spinBox =
new QSpinBox(parent);
321 spinBox->setMaximum(maxInt/2);
322 spinBox->setValue(arg.
value().toUInt());
326 case QVariant::Double: {
327 QDoubleSpinBox *dSpinBox =
new QDoubleSpinBox(parent);
328 dSpinBox->setValue(arg.
value().toDouble(NULL));
332 case QVariant::Bool: {
334 comboBox->addItem(i18nc(
"Value is true",
"True"));
335 comboBox->addItem(i18nc(
"Value is false",
"False"));
336 comboBox->setCurrentIndex(arg.
value().toBool() ? 0 : 1);
340 case QVariant::StringList: {
341 KLineEdit *listLineEdit =
new KLineEdit(parent);
342 listLineEdit->setToolTip(i18n(
"A comma-separated list of Strings"));
345 foreach(
const QString &tmp, arg.
value().toStringList()) {
346 if (!value.isEmpty()) {
347 value.append(QLatin1Char(
',' ));
351 listLineEdit->setText(value);
353 editor = listLineEdit;
356 case QVariant::ByteArray:
357 case QVariant::String:
359 KLineEdit *lineEdit =
new KLineEdit(parent);
360 lineEdit->setText(arg.
value().toString());
369 Argument arg = qVariantValue<Argument>(index.model()->data(index, Qt::EditRole));
370 switch (arg.
value().type()) {
373 case QVariant::LongLong: {
374 QSpinBox *spinBox =
static_cast<QSpinBox*
>(editor);
378 case QVariant::Double: {
379 QDoubleSpinBox *doubleSpinBox =
static_cast<QDoubleSpinBox*
>(editor);
380 doubleSpinBox->setValue(arg.
value().toDouble(NULL));
383 case QVariant::Bool: {
385 comboBox->setCurrentIndex(arg.
value().toBool() ? 0 : 1);
388 case QVariant::StringList: {
389 KLineEdit *listLineEdit =
static_cast<KLineEdit*
>(editor);
392 foreach(
const QString &tmp, arg.
value().toStringList()) {
393 if (!value.isEmpty()) {
394 value.append(QLatin1Char(
',' ));
398 listLineEdit->setText(value);
401 case QVariant::ByteArray:
402 case QVariant::String:
404 KLineEdit *lineEdit =
static_cast<KLineEdit*
>(editor);
405 lineEdit->setText(arg.
value().toString());
412 Argument arg = qVariantValue<Argument>(index.model()->data(index, Qt::EditRole));
413 switch (arg.
value().type()) {
416 case QVariant::LongLong:
417 value = QVariant(static_cast<QSpinBox*>(editor)->value());
419 case QVariant::Double:
420 value = QVariant(static_cast<QDoubleSpinBox*>(editor)->value());
423 value = QVariant(static_cast<KComboBox*>(editor)->currentIndex() == 0 ?
true :
false);
425 case QVariant::StringList:
426 value = QVariant(static_cast<KLineEdit*>(editor)->text().split(QLatin1Char(
',' )));
428 case QVariant::ByteArray:
429 case QVariant::String:
431 value = QVariant(static_cast<KLineEdit*>(editor)->text());
434 kDebug() <<
"setting value" << value;
436 model->setData(index, qVariantFromValue(arg), Qt::EditRole);
440 editor->setGeometry(option.rect);
451 setFlags(Qt::ItemIsEnabled);
455 setData(qVariantFromValue(arg), Qt::EditRole);
456 kDebug() <<
"creating model item:" << arg.
value() <<
"type:" << arg.
value().type();
457 if (arg.
value().type() == QVariant::StringList) {
458 setToolTip(i18n(
"A comma-separated list of Strings"));
464 if(role == Qt::DisplayRole) {
465 Argument arg = qVariantValue<Argument>(QStandardItem::data(Qt::EditRole));
466 if(arg.
value().type() == QVariant::StringList) {
469 foreach(
const QString &tmp, arg.
value().toStringList()) {
470 if (!retList.isEmpty()) {
471 retList.append(QLatin1Char(
',' ));
475 return QVariant(retList);
480 return QStandardItem::data(role);
492 setHorizontalHeaderLabels(QStringList() << i18n(
"Profile Name"));
497 tooltip.append(profile->
description()).append(QLatin1String(
"\n" ));
499 tooltip.append(i18n(
"Author: %1 (Version: %2)", profile->
author(), profile->
version()));
500 item->setToolTip(tooltip);
501 item->setData(qVariantFromValue(profile), Qt::UserRole);
502 item->setEditable(
false);
510 return qVariantValue<Profile*>(index.data(Qt::UserRole));
516 for(
int i = 0; i < rowCount(); i++){
517 kDebug() <<
"checking item" << item(i)->data(Qt::UserRole).value<
Profile*>()->profileId() <<
"for" << action->
profileId();
519 if(profileItem->data(Qt::UserRole).value<
Profile*>()->profileId() == action->
profileId()){
520 return profileItem->index();
524 return QModelIndex();
550 if (orientation == Qt::Horizontal) {
551 if (role == Qt::DisplayRole) {
554 return i18nc(
"Profile name",
"Name");
556 return i18n(
"Description");
568 for(
int i = 0; i < rowCount(); i++){
571 return templateItem->index();
575 return QModelIndex();
579 QList<QStandardItem*> row;
581 item->setData(qVariantFromValue(actionTemplate), Qt::UserRole);
597 QStandardItemModel::appendRow(row);
601 return (QStandardItemModel::flags(index) & ~Qt::ItemIsEditable);
612 qRegisterMetaType<Remote*>(
"Remote*");
613 qRegisterMetaType<Mode*>(
"Mode*");
617 qRegisterMetaType<Remote*>(
"Remote*");
618 qRegisterMetaType<Mode*>(
"Mode*");
624 setHorizontalHeaderLabels(QStringList() << i18n(
"Remotes and modes") << i18n(
"Button"));
626 QList<QStandardItem*> itemList;
628 itemList.append(item);
630 item->setData(qVariantFromValue(remote), Qt::UserRole);
631 itemList.append(item);
637 if(index.isValid() && index.parent().isValid()){
638 return qVariantValue<Remote*>(index.parent().data(Qt::UserRole));
641 return qVariantValue<Remote*>(index.data(Qt::UserRole));
647 if(index.isValid() && index.parent().isValid()){
648 return qVariantValue<Mode*>(index.data(Qt::UserRole));
651 return qVariantValue<Remote*>(index.data(Qt::UserRole))->masterMode();
657 for(
int i = 0; i < rowCount(); i++){
659 if(remoteItem->data(Qt::UserRole).value<
Remote*>()->masterMode() ==
mode){
660 return remoteItem->index();
662 for(
int j = 0; j < rowCount(remoteItem->index()); j++){
663 QStandardItem *modeItem = itemFromIndex(index(j, 0, remoteItem->index()));
664 if(modeItem->data(Qt::UserRole).value<
Mode*>() == mode){
665 return modeItem->index();
670 return QModelIndex();
674 if(index.isValid() && index.parent().isValid()){
675 if(role == Qt::DisplayRole){
676 switch(index.column()){
683 }
else if(index.isValid()){
684 if(role == Qt::FontRole){
686 QFont font = KApplication::font();
687 font.setItalic(
true);
693 if(role == Qt::TextColorRole){
695 return KGlobalSettings::inactiveTextColor();
699 return QStandardItemModel::data(index, role);
703 if(index.isValid()) {
704 return (QStandardItemModel::flags(index) | Qt::ItemIsDropEnabled);
707 return QStandardItemModel::flags(index);
712 if (!data->hasFormat(QLatin1String(
"kremotecontrol/action" )))
715 if (action == Qt::IgnoreAction)
721 QByteArray encodedData = data->data(QLatin1String(
"kremotecontrol/action" ));
722 QDataStream stream(&encodedData, QIODevice::ReadOnly);
724 quint64 actionPointer;
725 stream >> actionPointer;
726 Action *droppedAction =
reinterpret_cast<Action*
>(actionPointer);
727 kDebug() <<
"action pointer is" << droppedAction <<
"name is" << droppedAction->
name();
737 types << QLatin1String(
"kremotecontrol/action" );
742 return Qt::CopyAction | Qt::MoveAction;
746 setData(qVariantFromValue(remote), Qt::UserRole);
748 if(mode->
name() != QLatin1String(
"Master" )){
749 QList<QStandardItem*> itemList;
751 item->setData(qVariantFromValue(mode), Qt::UserRole);
753 QFont font = KApplication::font();
757 item->setIcon(KIcon(mode->
iconName()));
758 itemList.append(item);
760 item->setData(qVariantFromValue(mode), Qt::UserRole);
761 itemList.append(item);
768 Remote *remote = qVariantValue<Remote*>(QStandardItem::data(Qt::UserRole));
769 if(role == Qt::DisplayRole) {
770 return remote->
name();
772 if(role == Qt::DecorationRole){
776 return KIcon(remote->
masterMode()->
iconName(), 0, QStringList() << QLatin1String(
"emblem-important"));
779 if(role == Qt::ToolTipRole) {
781 return i18n(
"This remote control is currently not available.");
784 return QStandardItem::data(role);
788 setHorizontalHeaderLabels(QStringList() << i18n(
"Button") << i18n(
"Application") << i18n(
"Function"));
793 removeRows(0, rowCount());
796 item->setData(qVariantFromValue(action), Qt::UserRole);
802 if(role == Qt::DisplayRole){
803 Action *
action = qVariantValue<Action*>(item(index.row())->
data(Qt::UserRole));
804 switch(index.column()){
808 return action->
name();
813 return QStandardItemModel::data(index, role);
818 return qVariantValue<Action*>(item(index.row())->
data(Qt::UserRole));
824 for(
int i = 0; i < rowCount(); i++){
825 QModelIndex actionIndex = index(i, 0);
827 if(actionItem->data(Qt::UserRole).value<
Action*>() == action){
828 return actionItem->index();
832 return QModelIndex();
836 if (index.isValid()) {
837 return (QStandardItemModel::flags(index) | Qt::ItemIsDragEnabled);
840 return QStandardItemModel::flags(index);
844 QMimeData *
mimeData =
new QMimeData();
845 QByteArray encodedData;
847 QDataStream stream(&encodedData, QIODevice::WriteOnly);
849 QModelIndex index = indexes.first();
850 if(index.isValid()) {
852 kDebug() <<
"index:" << index <<
"dragging action pointer is" << dragAction <<
"name is" << dragAction->
name();
853 quint64 actionPointer =
reinterpret_cast<quint64
>(dragAction);
854 stream << actionPointer;
857 mimeData->setData(QLatin1String(
"kremotecontrol/action" ), encodedData);
862 return Qt::CopyAction | Qt::MoveAction;
Action * action(const QModelIndex &index) const
Qt::DropActions supportedDropActions() const
ActionModel(QObject *parent=0)
QModelIndex findOrInsert(const DBusAction *action, bool insert=false)
QString profileId() const
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
void refresh(const Profile *profile)
QVector< Action * > actions() const
virtual QString description() const =0
DBusFunctionModel(QObject *parent)
Remote * remote(const QModelIndex &index) const
void modeChanged(Mode *mode)
ActionTemplateModel(QObject *parent=0)
Prototype function() const
void setEditorData(QWidget *editor, const QModelIndex &index) const
void setValue(const QVariant &value)
QVariant data(const QModelIndex &index, int role) const
RemoteItem(Remote *remote)
Qt::ItemFlags flags(const QModelIndex &index) const
static DBusInterface * getInstance()
virtual QVariant data(int role=Qt::UserRole+1) const
QModelIndex find(const ProfileAction *action) const
void refresh(const RemoteList &remoteList)
virtual Action * clone() const =0
QModelIndex findOrInsert(const DBusAction *action, bool insert=false)
QList< Profile * > allProfiles()
RemoteModel(const RemoteList &remoteList, QObject *parent=0)
Qt::ItemFlags flags(const QModelIndex &index) const
Profile * profile(const QModelIndex &index) const
QStringList mimeTypes() const
QVector< Mode * > allModes() const
virtual QVariant data(const QModelIndex &index, int role) const
QVariant headerData(int section, Qt::Orientation orientation, int role) const
QString description() const
Mode * mode(const QModelIndex &index) const
void refresh(const QString &app, const QString &node)
virtual QString name() const =0
QMultiMap< QString, Prototype > functions(const QString &program, const QString &object)
Prototype function() const
virtual QVariant data(int role) const
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
QString buttonName() const
QString actionTemplateId() const
Qt::DropActions supportedDragActions() const
DBusServiceModel(QObject *parent=0)
Created on: 01.02.2009.
QModelIndex find(Mode *mode) const
QList< ProfileActionTemplate > actionTemplates() const
ProfileModel(QObject *parent=0)
QList< Argument > arguments() const
QString node(const QModelIndex &index) const
QModelIndex find(Action *action) const
QVariant headerData(int section, Qt::Orientation orientation, int role) const
QList< Argument > args() const
QString application(const QModelIndex &index) const
ArgumentsModel(QObject *parent=0)
ArgumentDelegate(QObject *parent=0)
void addAction(Action *action)
Add the given Action to the Mode.
QModelIndex find(const ProfileAction *action) const
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
ArgumentsModelItem(const QString &text)
QMimeData * mimeData(const QModelIndexList &indexes) const
Mode * masterMode() const
Profile * profile(const QString &profileId)
QString application() const
DBusServiceItem(const QString &item)
Mode * defaultMode() const
Qt::ItemFlags flags(const QModelIndex &index) const
void refresh(const Prototype &prototype)
virtual QVariant data(int role) const
Prototype getPrototype(int index) const
QString getInterface(int index) const
QString actionName() const
ProfileActionTemplate actionTemplate(const QModelIndex &index) const
void appendRow(ProfileActionTemplate actionTemplate)
QString description() const
QVariant headerData(int section, Qt::Orientation orientation, int role) const
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
QString description() const