From 80797d6538b04012cfe885f02a3d9ecad5c86cd2 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sun, 26 Jun 2011 05:18:27 +0200 Subject: [PATCH 01/13] Add ConfigUi api to QtScriptResolver --- src/resolvers/qtscriptresolver.cpp | 173 ++++++++++++++++++++++++++++- src/resolvers/qtscriptresolver.h | 18 ++- 2 files changed, 188 insertions(+), 3 deletions(-) diff --git a/src/resolvers/qtscriptresolver.cpp b/src/resolvers/qtscriptresolver.cpp index 78508728a..e2e05ed45 100644 --- a/src/resolvers/qtscriptresolver.cpp +++ b/src/resolvers/qtscriptresolver.cpp @@ -24,6 +24,8 @@ #include "sourcelist.h" #include "utils/tomahawkutils.h" +#include + QtScriptResolverHelper::QtScriptResolverHelper( const QString& scriptPath, QObject* parent ) : QObject( parent ) @@ -57,12 +59,27 @@ QtScriptResolverHelper::compress( const QString& data ) return comp.toBase64(); } +QVariantMap +QtScriptResolverHelper::resolver() +{ + QVariantMap resolver; + resolver["config"] = m_resolverConfig; + resolver["scriptPath"] = m_scriptPath; + return resolver; +} + +void +QtScriptResolverHelper::setResolverConfig( QVariantMap config ) +{ + m_resolverConfig = config; +} QtScriptResolver::QtScriptResolver( const QString& scriptPath ) : Tomahawk::ExternalResolver( scriptPath ) , m_ready( false ) , m_stopped( false ) + , m_resolverHelper( new QtScriptResolverHelper( scriptPath, this ) ) { qDebug() << Q_FUNC_INFO << scriptPath; @@ -77,7 +94,7 @@ QtScriptResolver::QtScriptResolver( const QString& scriptPath ) m_engine->mainFrame()->setHtml( "" ); m_engine->mainFrame()->evaluateJavaScript( scriptFile.readAll() ); - m_engine->mainFrame()->addToJavaScriptWindowObject( "Tomahawk", new QtScriptResolverHelper( scriptPath, this ) ); + m_engine->mainFrame()->addToJavaScriptWindowObject( "Tomahawk", m_resolverHelper ); scriptFile.close(); QVariantMap m = m_engine->mainFrame()->evaluateJavaScript( "getSettings();" ).toMap(); @@ -85,6 +102,11 @@ QtScriptResolver::QtScriptResolver( const QString& scriptPath ) m_weight = m.value( "weight", 0 ).toUInt(); m_timeout = m.value( "timeout", 25 ).toUInt() * 1000; + // load config widget and apply settings + loadUi(); + QVariantMap config = m_engine->mainFrame()->evaluateJavaScript( "getConfig();" ).toMap(); + fillDataInWidgets( config ); + qDebug() << Q_FUNC_INFO << m_name << m_weight << m_timeout; m_ready = true; @@ -187,3 +209,152 @@ QtScriptResolver::stop() m_stopped = true; emit finished(); } + +void QtScriptResolver::loadUi() +{ + qDebug() << Q_FUNC_INFO; + + QVariantMap m = m_engine->mainFrame()->evaluateJavaScript( "getConfigUi();" ).toMap(); + + bool compressed = m.value( "compressed", "false" ).toBool(); + bool base64 = m.value( "base64", "false" ).toBool(); + + qDebug() << "Resolver has a preferences widget! compressed?" << compressed << m; + + QByteArray uiData = m[ "widget" ].toByteArray(); + if( base64 && compressed ) + uiData = qUncompress( QByteArray::fromBase64( uiData ) ); + else if( base64 ) + uiData = QByteArray::fromBase64( uiData ); + + if( m.contains( "images" ) ) + uiData = fixDataImagePaths( uiData, compressed, m[ "images" ].toMap() ); + + m_configWidget = QWeakPointer< QWidget >( widgetFromData( uiData, 0 ) ); + + m_dataWidgets = m_engine->mainFrame()->evaluateJavaScript( "getDataWidgets();" ).toList(); + + emit changed(); +} + + +QWidget* QtScriptResolver::configUI() const +{ + if( m_configWidget.isNull() ) + return 0; + else + return m_configWidget.data(); +} + +void QtScriptResolver::saveConfig() +{ + QVariant saveData = loadDataFromWidgets(); + qDebug() << Q_FUNC_INFO << saveData; + + m_resolverHelper->setResolverConfig( saveData.toMap() ); + m_engine->mainFrame()->evaluateJavaScript( "saveConfig();" ); +} + +QWidget* +QtScriptResolver::findWidget(QWidget* widget, const QStringList& widgetPath) +{ + qDebug() << Q_FUNC_INFO << widget->objectName() << widgetPath; + + if( !widget || !widget->isWidgetType() ) + return 0; + + if( widgetPath.isEmpty() ) + return widget; + + QString searchName = widgetPath.first(); + + foreach( QObject* child, widget->children() ) + { + if( child->isWidgetType() && child->objectName() == searchName ) + { + QStringList newWidgetPath = widgetPath; + newWidgetPath.removeFirst(); + return findWidget(qobject_cast< QWidget* >( child ), newWidgetPath); + } + } + + return 0; +} + + +QVariant QtScriptResolver::widgetData(QWidget* widget, const QString& property) +{ + for( int i = 0; i < widget->metaObject()->propertyCount(); i++ ) + { + if( widget->metaObject()->property( i ).name() == property ) + { + return widget->property( property.toLatin1() ); + } + } + + return QVariant(); +} + +void QtScriptResolver::setWidgetData(const QVariant& value, QWidget* widget, const QString& property) +{ + for( int i = 0; i < widget->metaObject()->propertyCount(); i++ ) + { + if( widget->metaObject()->property( i ).name() == property ) + { + widget->metaObject()->property( i ).write( widget, value); + return; + } + } +} + + +QVariantMap QtScriptResolver::loadDataFromWidgets() +{ + QVariantMap saveData; + foreach(const QVariant& dataWidget, m_dataWidgets) + { + QVariantMap data = dataWidget.toMap(); + + QStringList widgetPath; + foreach(const QVariant& pathItem, data["widget"].toList()) + { + widgetPath << pathItem.toString(); + } + + QWidget* widget= findWidget( m_configWidget.data(), widgetPath ); + + QString value = widgetData( widget, data["property"].toString() ).toString(); + + saveData[ data["name"].toString() ] = value; + } + + qDebug() << saveData; + + return saveData; +} + +void QtScriptResolver::fillDataInWidgets( const QVariantMap& data ) +{ + qDebug() << Q_FUNC_INFO << data; + foreach(const QVariant& dataWidget, m_dataWidgets) + { + QStringList widgetPath; + foreach(const QVariant& pathItem, dataWidget.toMap()["widget"].toList()) + { + widgetPath << pathItem.toString(); + } + + QWidget* widget= findWidget( m_configWidget.data(), widgetPath ); + if( !widget ) + { + qDebug() << Q_FUNC_INFO << "widget specified in resolver was not found:" << widgetPath; + Q_ASSERT(false); + return; + } + + QString propertyName = dataWidget.toMap()["property"].toString(); + QString name = dataWidget.toMap()["name"].toString(); + + setWidgetData( data[ name ], widget, propertyName ); + } +} diff --git a/src/resolvers/qtscriptresolver.h b/src/resolvers/qtscriptresolver.h index a9b439176..7e7966f36 100644 --- a/src/resolvers/qtscriptresolver.h +++ b/src/resolvers/qtscriptresolver.h @@ -39,13 +39,16 @@ Q_OBJECT public: QtScriptResolverHelper( const QString& scriptPath, QObject* parent ); + void setResolverConfig( QVariantMap config ); public slots: QString readFile( const QString& fileName ); QString compress( const QString& data ); + QVariantMap resolver(); private: QString m_scriptPath; + QVariantMap m_resolverConfig; }; class ScriptEngine : public QWebPage @@ -91,8 +94,8 @@ public: virtual unsigned int weight() const { return m_weight; } virtual unsigned int timeout() const { return m_timeout; } - virtual QWidget* configUI() const { return 0; } // TODO support properly for qtscript resolvers too! - virtual void saveConfig() {} + virtual QWidget* configUI() const; + virtual void saveConfig(); public slots: virtual void resolve( const Tomahawk::query_ptr& query ); @@ -102,12 +105,23 @@ signals: void finished(); private: + virtual void loadUi(); + QWidget* findWidget( QWidget* widget, const QStringList& widgetPath ); + void setWidgetData( const QVariant& value, QWidget* widget, const QString& property ); + QVariant widgetData( QWidget* widget, const QString& property ); + QVariantMap loadDataFromWidgets(); + void fillDataInWidgets( const QVariantMap& data ); + ScriptEngine* m_engine; QString m_name; unsigned int m_weight, m_timeout; bool m_ready, m_stopped; + + QtScriptResolverHelper* m_resolverHelper; + QWeakPointer< QWidget > m_configWidget; + QList< QVariant > m_dataWidgets; }; #endif // QTSCRIPTRESOLVER_H From de74c0c3fefd05f11ee9c32f441f20a4001e4352 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sun, 26 Jun 2011 05:22:06 +0200 Subject: [PATCH 02/13] Add newlines for muesli being able to read the code --- src/resolvers/qtscriptresolver.cpp | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/resolvers/qtscriptresolver.cpp b/src/resolvers/qtscriptresolver.cpp index e2e05ed45..0f73d8f2b 100644 --- a/src/resolvers/qtscriptresolver.cpp +++ b/src/resolvers/qtscriptresolver.cpp @@ -52,6 +52,7 @@ QtScriptResolverHelper::readFile( const QString& fileName ) return file.readAll(); } + QString QtScriptResolverHelper::compress( const QString& data ) { @@ -59,6 +60,7 @@ QtScriptResolverHelper::compress( const QString& data ) return comp.toBase64(); } + QVariantMap QtScriptResolverHelper::resolver() { @@ -68,6 +70,7 @@ QtScriptResolverHelper::resolver() return resolver; } + void QtScriptResolverHelper::setResolverConfig( QVariantMap config ) { @@ -210,7 +213,9 @@ QtScriptResolver::stop() emit finished(); } -void QtScriptResolver::loadUi() + +void +QtScriptResolver::loadUi() { qDebug() << Q_FUNC_INFO; @@ -238,7 +243,8 @@ void QtScriptResolver::loadUi() } -QWidget* QtScriptResolver::configUI() const +QWidget* +QtScriptResolver::configUI() const { if( m_configWidget.isNull() ) return 0; @@ -246,7 +252,9 @@ QWidget* QtScriptResolver::configUI() const return m_configWidget.data(); } -void QtScriptResolver::saveConfig() + +void +QtScriptResolver::saveConfig() { QVariant saveData = loadDataFromWidgets(); qDebug() << Q_FUNC_INFO << saveData; @@ -255,6 +263,7 @@ void QtScriptResolver::saveConfig() m_engine->mainFrame()->evaluateJavaScript( "saveConfig();" ); } + QWidget* QtScriptResolver::findWidget(QWidget* widget, const QStringList& widgetPath) { @@ -282,7 +291,8 @@ QtScriptResolver::findWidget(QWidget* widget, const QStringList& widgetPath) } -QVariant QtScriptResolver::widgetData(QWidget* widget, const QString& property) +QVariant +QtScriptResolver::widgetData(QWidget* widget, const QString& property) { for( int i = 0; i < widget->metaObject()->propertyCount(); i++ ) { @@ -295,7 +305,9 @@ QVariant QtScriptResolver::widgetData(QWidget* widget, const QString& property) return QVariant(); } -void QtScriptResolver::setWidgetData(const QVariant& value, QWidget* widget, const QString& property) + +void +QtScriptResolver::setWidgetData(const QVariant& value, QWidget* widget, const QString& property) { for( int i = 0; i < widget->metaObject()->propertyCount(); i++ ) { @@ -308,7 +320,8 @@ void QtScriptResolver::setWidgetData(const QVariant& value, QWidget* widget, con } -QVariantMap QtScriptResolver::loadDataFromWidgets() +QVariantMap +QtScriptResolver::loadDataFromWidgets() { QVariantMap saveData; foreach(const QVariant& dataWidget, m_dataWidgets) @@ -333,7 +346,9 @@ QVariantMap QtScriptResolver::loadDataFromWidgets() return saveData; } -void QtScriptResolver::fillDataInWidgets( const QVariantMap& data ) + +void +QtScriptResolver::fillDataInWidgets( const QVariantMap& data ) { qDebug() << Q_FUNC_INFO << data; foreach(const QVariant& dataWidget, m_dataWidgets) From 5d21dded5c1eb68ffa349cff79828a28359cb084 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sun, 26 Jun 2011 19:20:55 +0200 Subject: [PATCH 03/13] Implement new js-resolver api --- src/resolvers/qtscriptresolver.cpp | 38 ++++++++++++++++++++---------- src/resolvers/qtscriptresolver.h | 8 +++++-- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/resolvers/qtscriptresolver.cpp b/src/resolvers/qtscriptresolver.cpp index 0f73d8f2b..5e9694d97 100644 --- a/src/resolvers/qtscriptresolver.cpp +++ b/src/resolvers/qtscriptresolver.cpp @@ -62,7 +62,7 @@ QtScriptResolverHelper::compress( const QString& data ) QVariantMap -QtScriptResolverHelper::resolver() +QtScriptResolverHelper::resolverData() { QVariantMap resolver; resolver["config"] = m_resolverConfig; @@ -96,18 +96,18 @@ QtScriptResolver::QtScriptResolver( const QString& scriptPath ) } m_engine->mainFrame()->setHtml( "" ); - m_engine->mainFrame()->evaluateJavaScript( scriptFile.readAll() ); m_engine->mainFrame()->addToJavaScriptWindowObject( "Tomahawk", m_resolverHelper ); + m_engine->mainFrame()->evaluateJavaScript( scriptFile.readAll() ); scriptFile.close(); - QVariantMap m = m_engine->mainFrame()->evaluateJavaScript( "getSettings();" ).toMap(); + QVariantMap m = resolverSettings(); m_name = m.value( "name" ).toString(); m_weight = m.value( "weight", 0 ).toUInt(); m_timeout = m.value( "timeout", 25 ).toUInt() * 1000; // load config widget and apply settings loadUi(); - QVariantMap config = m_engine->mainFrame()->evaluateJavaScript( "getConfig();" ).toMap(); + QVariantMap config = resolverUserConfig(); fillDataInWidgets( config ); qDebug() << Q_FUNC_INFO << m_name << m_weight << m_timeout; @@ -139,7 +139,7 @@ QtScriptResolver::resolve( const Tomahawk::query_ptr& query ) if ( !query->isFullTextQuery() ) { - eval = QString( "resolve( '%1', '%2', '%3', '%4' );" ) + eval = QString( "Tomahawk.resolver.instance.resolve( '%1', '%2', '%3', '%4' );" ) .arg( query->id().replace( "'", "\\'" ) ) .arg( query->artist().replace( "'", "\\'" ) ) .arg( query->album().replace( "'", "\\'" ) ) @@ -147,7 +147,7 @@ QtScriptResolver::resolve( const Tomahawk::query_ptr& query ) } else { - eval = QString( "resolve( '%1', '%2', '%3', '%4' );" ) + eval = QString( "Tomahawk.resolver.instance.resolve( '%1', '%2', '%3', '%4' );" ) .arg( query->id().replace( "'", "\\'" ) ) .arg( query->fullTextQuery().replace( "'", "\\'" ) ) .arg( QString() ) @@ -219,7 +219,9 @@ QtScriptResolver::loadUi() { qDebug() << Q_FUNC_INFO; - QVariantMap m = m_engine->mainFrame()->evaluateJavaScript( "getConfigUi();" ).toMap(); + QVariantMap m = m_engine->mainFrame()->evaluateJavaScript( "Tomahawk.resolver.instance.getConfigUi();" ).toMap(); + m_dataWidgets = m["fields"].toList(); + bool compressed = m.value( "compressed", "false" ).toBool(); bool base64 = m.value( "base64", "false" ).toBool(); @@ -237,8 +239,6 @@ QtScriptResolver::loadUi() m_configWidget = QWeakPointer< QWidget >( widgetFromData( uiData, 0 ) ); - m_dataWidgets = m_engine->mainFrame()->evaluateJavaScript( "getDataWidgets();" ).toList(); - emit changed(); } @@ -260,18 +260,18 @@ QtScriptResolver::saveConfig() qDebug() << Q_FUNC_INFO << saveData; m_resolverHelper->setResolverConfig( saveData.toMap() ); - m_engine->mainFrame()->evaluateJavaScript( "saveConfig();" ); + m_engine->mainFrame()->evaluateJavaScript( "Tomahawk.resolver.instance.saveUserConfig();" ); } QWidget* QtScriptResolver::findWidget(QWidget* widget, const QStringList& widgetPath) { - qDebug() << Q_FUNC_INFO << widget->objectName() << widgetPath; - if( !widget || !widget->isWidgetType() ) return 0; + qDebug() << Q_FUNC_INFO << widget->objectName() << widgetPath; + if( widgetPath.isEmpty() ) return widget; @@ -373,3 +373,17 @@ QtScriptResolver::fillDataInWidgets( const QVariantMap& data ) setWidgetData( data[ name ], widget, propertyName ); } } + + +QVariantMap +QtScriptResolver::resolverSettings() +{ + return m_engine->mainFrame()->evaluateJavaScript( "Tomahawk.resolver.instance.getSettings();" ).toMap(); +} + + +QVariantMap +QtScriptResolver::resolverUserConfig() +{ + return m_engine->mainFrame()->evaluateJavaScript( "Tomahawk.resolver.instance.getUserConfig();" ).toMap(); +} diff --git a/src/resolvers/qtscriptresolver.h b/src/resolvers/qtscriptresolver.h index 7e7966f36..94994a954 100644 --- a/src/resolvers/qtscriptresolver.h +++ b/src/resolvers/qtscriptresolver.h @@ -44,7 +44,7 @@ public: public slots: QString readFile( const QString& fileName ); QString compress( const QString& data ); - QVariantMap resolver(); + QVariantMap resolverData(); private: QString m_scriptPath; @@ -75,7 +75,7 @@ public slots: protected: virtual void javaScriptConsoleMessage( const QString & message, int lineNumber, const QString & sourceID ) - { qDebug() << "JAVASCRIPT ERROR:" << message << lineNumber << sourceID; } + { qDebug() << "JAVASCRIPT:" << message << lineNumber << sourceID; } private: QtScriptResolver* m_parent; @@ -112,6 +112,10 @@ private: QVariantMap loadDataFromWidgets(); void fillDataInWidgets( const QVariantMap& data ); + // encapsulate javascript calls + QVariantMap resolverSettings(); + QVariantMap resolverUserConfig(); + ScriptEngine* m_engine; QString m_name; From 931ed5b91876dc1fe1fa4d19be15ffe5a5360a34 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Mon, 27 Jun 2011 00:12:29 +0200 Subject: [PATCH 04/13] Fix loading images from qtscriptresolvers --- src/resolvers/qtscriptresolver.cpp | 40 ++++++++++++++++++++++++------ src/resolvers/qtscriptresolver.h | 5 +++- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/resolvers/qtscriptresolver.cpp b/src/resolvers/qtscriptresolver.cpp index 5e9694d97..296d4ea10 100644 --- a/src/resolvers/qtscriptresolver.cpp +++ b/src/resolvers/qtscriptresolver.cpp @@ -34,8 +34,8 @@ QtScriptResolverHelper::QtScriptResolverHelper( const QString& scriptPath, QObje } -QString -QtScriptResolverHelper::readFile( const QString& fileName ) +QByteArray +QtScriptResolverHelper::readRaw( const QString& fileName ) { QString path = QFileInfo( m_scriptPath ).absolutePath(); // remove directories @@ -45,7 +45,8 @@ QtScriptResolverHelper::readFile( const QString& fileName ) QFile file( absoluteFilePath ); if ( !file.exists() ) { - return QString(); + Q_ASSERT(false); + return QByteArray(); } file.open( QIODevice::ReadOnly ); @@ -61,6 +62,20 @@ QtScriptResolverHelper::compress( const QString& data ) } +QString +QtScriptResolverHelper::readCompressed(const QString& fileName) +{ + return compress( readRaw( fileName ) ); +} + + +QString +QtScriptResolverHelper::readBase64(const QString& fileName) +{ + return readRaw( fileName ).toBase64(); +} + + QVariantMap QtScriptResolverHelper::resolverData() { @@ -224,18 +239,27 @@ QtScriptResolver::loadUi() bool compressed = m.value( "compressed", "false" ).toBool(); - bool base64 = m.value( "base64", "false" ).toBool(); - qDebug() << "Resolver has a preferences widget! compressed?" << compressed << m; QByteArray uiData = m[ "widget" ].toByteArray(); - if( base64 && compressed ) + + if( compressed ) uiData = qUncompress( QByteArray::fromBase64( uiData ) ); - else if( base64 ) + else uiData = QByteArray::fromBase64( uiData ); + QVariantMap images; + foreach(const QVariant& item, m[ "images" ].toList()) + { + QString key = item.toMap().keys().first(); + QVariant value = item.toMap().value(key); + images[key] = value; + } + if( m.contains( "images" ) ) - uiData = fixDataImagePaths( uiData, compressed, m[ "images" ].toMap() ); + uiData = fixDataImagePaths( uiData, compressed, images ); + + m_configWidget = QWeakPointer< QWidget >( widgetFromData( uiData, 0 ) ); diff --git a/src/resolvers/qtscriptresolver.h b/src/resolvers/qtscriptresolver.h index 94994a954..f55f50433 100644 --- a/src/resolvers/qtscriptresolver.h +++ b/src/resolvers/qtscriptresolver.h @@ -42,7 +42,10 @@ public: void setResolverConfig( QVariantMap config ); public slots: - QString readFile( const QString& fileName ); + QByteArray readRaw( const QString& fileName ); + QString readBase64( const QString& fileName ); + QString readCompressed( const QString& fileName ); + QString compress( const QString& data ); QVariantMap resolverData(); From bf46ca7b71ad715a06bc0a492c8c070ece5ea36f Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Mon, 27 Jun 2011 04:22:40 +0200 Subject: [PATCH 05/13] Add more api for qtscriptresolvers --- resources.qrc | 1 + src/resolvers/qtscriptresolver.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/resources.qrc b/resources.qrc index 4afb8151f..763a4d08e 100644 --- a/resources.qrc +++ b/resources.qrc @@ -97,5 +97,6 @@ ./data/sql/dbmigrate-22_to_23.sql ./data/sql/dbmigrate-23_to_24.sql ./data/sql/dbmigrate-24_to_25.sql + ./data/js/tomahawk.js diff --git a/src/resolvers/qtscriptresolver.cpp b/src/resolvers/qtscriptresolver.cpp index 296d4ea10..664ec321f 100644 --- a/src/resolvers/qtscriptresolver.cpp +++ b/src/resolvers/qtscriptresolver.cpp @@ -111,10 +111,21 @@ QtScriptResolver::QtScriptResolver( const QString& scriptPath ) } m_engine->mainFrame()->setHtml( "" ); + + // add c++ part of tomahawk javascript library m_engine->mainFrame()->addToJavaScriptWindowObject( "Tomahawk", m_resolverHelper ); + + // add rest of it + QFile jslib( RESPATH "js/tomahawk.js" ); + jslib.open( QIODevice::ReadOnly ); + m_engine->mainFrame()->evaluateJavaScript( jslib.readAll() ); + jslib.close(); + + // execute resolver m_engine->mainFrame()->evaluateJavaScript( scriptFile.readAll() ); scriptFile.close(); + QVariantMap m = resolverSettings(); m_name = m.value( "name" ).toString(); m_weight = m.value( "weight", 0 ).toUInt(); From 75ec478caed605973db3f3d7720948e63a881ef6 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Mon, 27 Jun 2011 21:06:36 +0200 Subject: [PATCH 06/13] Fix streaming from https-links --- src/libtomahawk/audio/audioengine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libtomahawk/audio/audioengine.cpp b/src/libtomahawk/audio/audioengine.cpp index f3f6362b6..0ee4a37da 100644 --- a/src/libtomahawk/audio/audioengine.cpp +++ b/src/libtomahawk/audio/audioengine.cpp @@ -520,7 +520,7 @@ AudioEngine::setCurrentTrack( const Tomahawk::result_ptr& result ) bool AudioEngine::isHttpResult( const QString& url ) const { - return url.startsWith( "http://" ); + return url.startsWith( "http://" ) || url.startsWith( "https://" ); } From d35fbd50484e0cd7a2f0b425e8453fc6e36056bb Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Mon, 27 Jun 2011 21:07:22 +0200 Subject: [PATCH 07/13] Make debug output more readable and assert on javascript failures --- src/resolvers/qtscriptresolver.cpp | 2 ++ src/resolvers/qtscriptresolver.h | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/resolvers/qtscriptresolver.cpp b/src/resolvers/qtscriptresolver.cpp index 664ec321f..642bac917 100644 --- a/src/resolvers/qtscriptresolver.cpp +++ b/src/resolvers/qtscriptresolver.cpp @@ -116,12 +116,14 @@ QtScriptResolver::QtScriptResolver( const QString& scriptPath ) m_engine->mainFrame()->addToJavaScriptWindowObject( "Tomahawk", m_resolverHelper ); // add rest of it + m_engine->setScriptPath( "tomahawk.js" ); QFile jslib( RESPATH "js/tomahawk.js" ); jslib.open( QIODevice::ReadOnly ); m_engine->mainFrame()->evaluateJavaScript( jslib.readAll() ); jslib.close(); // execute resolver + m_engine->setScriptPath( scriptPath ); m_engine->mainFrame()->evaluateJavaScript( scriptFile.readAll() ); scriptFile.close(); diff --git a/src/resolvers/qtscriptresolver.h b/src/resolvers/qtscriptresolver.h index f55f50433..20ac3fc47 100644 --- a/src/resolvers/qtscriptresolver.h +++ b/src/resolvers/qtscriptresolver.h @@ -70,6 +70,11 @@ public: settings()->setAttribute( QWebSettings::LocalStorageDatabaseEnabled, true ); } + void setScriptPath( const QString& scriptPath ) + { + m_scriptPath = scriptPath; + } + public slots: bool shouldInterruptJavaScript() { @@ -78,10 +83,11 @@ public slots: protected: virtual void javaScriptConsoleMessage( const QString & message, int lineNumber, const QString & sourceID ) - { qDebug() << "JAVASCRIPT:" << message << lineNumber << sourceID; } + { qDebug() << "JAVASCRIPT:" << m_scriptPath << message << lineNumber << sourceID; Q_ASSERT(false);} private: QtScriptResolver* m_parent; + QString m_scriptPath; }; From 6f0321f5851ec6e3736c60f1b52eec5228c7bab5 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Mon, 27 Jun 2011 21:33:44 +0200 Subject: [PATCH 08/13] Add tomahawk.js --- data/js/tomahawk.js | 259 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 259 insertions(+) create mode 100644 data/js/tomahawk.js diff --git a/data/js/tomahawk.js b/data/js/tomahawk.js new file mode 100644 index 000000000..0206a8b59 --- /dev/null +++ b/data/js/tomahawk.js @@ -0,0 +1,259 @@ + +// if run in phantomjs add fake Tomahawk environment +if(window.Tomahawk === undefined) +{ + alert("PHANTOMJS ENVIRONMENT"); + var Tomahawk = { + resolverData: function() + { + return { + scriptPath: function() + { + return "/home/tomahawk/resolver.js"; + } + }; + } + }; +} + +Tomahawk.resolver = { + scriptPath: Tomahawk.resolverData().scriptPath +}; + + +// javascript part of Tomahawk-Object API +Tomahawk.extend = function(object, members) { + var F = function() {}; + F.prototype = object; + var newObject = new F; + + for(var key in members) + { + newObject[key] = members[key]; + } + + return newObject; +} + + +// Resolver BaseObject, inherit it to implement your own resolver +var TomahawkResolver = { + scriptPath: function() + { + return Tomahawk.resolverData().scriptPath; + }, + getConfigUi: function() + { + return {}; + }, + getUserConfig: function() + { + var configJson = window.localStorage[this.scriptPath()]; + if(configJson === undefined) + configJson = "{}"; + + var config = JSON.parse(configJson); + + return config; + }, + saveUserConfig: function() + { + var config = Tomahawk.resolverData().config; + var configJson = JSON.stringify(config); + + window.localStorage[this.scriptPath()] = configJson; + } +}; + +/**** begin example implementation of a resolver ****/ + + +// implement the resolver +/* + * var DemoResolver = Tomahawk.extend(TomahawkResolver, + * { + * getSettings: function() + * { + * return { + * name: "Demo Resolver", + * weigth: 95, + * timeout: 5, + * limit: 10 + }; + }, + resolve: function( qid, artist, album, track ) + { + return { + qid: qid, + results: [ + { + artist: "Mokele", + album: "You Yourself are Me Myself and I am in Love", + track: "Hiding In Your Insides (php)", + source: "Mokele.co.uk", + url: "http://play.mokele.co.uk/music/Hiding%20In%20Your%20Insides.mp3", + bitrate: 160, + duration: 248, + size: 4971780, + score: 1.0, + extension: "mp3", + mimetype: "audio/mpeg" + } + ] + }; + } + } + ); + + // register the resolver + Tomahawk.resolver.instance = DemoResolver;*/ + +/**** end example implementation of a resolver ****/ + + +// help functions + +Tomahawk.valueForSubNode = function(node, tag) +{ + if(node === undefined) + throw new Error("Tomahawk.valueForSubnode: node is undefined!"); + + return node.getElementsByTagName(tag)[0].textContent; +}; + + +Tomahawk.syncRequest = function(url) +{ + var xmlHttpRequest = new XMLHttpRequest(); + xmlHttpRequest.open('GET', url, false); + xmlHttpRequest.send(null); + return xmlHttpRequest.responseText; +} + +/** +* +* Secure Hash Algorithm (SHA256) +* http://www.webtoolkit.info/ +* +* Original code by Angel Marin, Paul Johnston. +* +**/ + +Tomahawk.sha256=function(s){ + + var chrsz = 8; + var hexcase = 0; + + function safe_add (x, y) { + var lsw = (x & 0xFFFF) + (y & 0xFFFF); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); + } + + function S (X, n) { return ( X >>> n ) | (X << (32 - n)); } + function R (X, n) { return ( X >>> n ); } + function Ch(x, y, z) { return ((x & y) ^ ((~x) & z)); } + function Maj(x, y, z) { return ((x & y) ^ (x & z) ^ (y & z)); } + function Sigma0256(x) { return (S(x, 2) ^ S(x, 13) ^ S(x, 22)); } + function Sigma1256(x) { return (S(x, 6) ^ S(x, 11) ^ S(x, 25)); } + function Gamma0256(x) { return (S(x, 7) ^ S(x, 18) ^ R(x, 3)); } + function Gamma1256(x) { return (S(x, 17) ^ S(x, 19) ^ R(x, 10)); } + + function core_sha256 (m, l) { + var K = new Array(0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0xFC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x6CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2); + var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19); + var W = new Array(64); + var a, b, c, d, e, f, g, h, i, j; + var T1, T2; + + m[l >> 5] |= 0x80 << (24 - l % 32); + m[((l + 64 >> 9) << 4) + 15] = l; + + for ( var i = 0; i>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32); + } + return bin; + } + + function Utf8Encode(string) { + string = string.replace(/\r\n/g,"\n"); + var utftext = ""; + + for (var n = 0; n < string.length; n++) { + + var c = string.charCodeAt(n); + + if (c < 128) { + utftext += String.fromCharCode(c); + } + else if((c > 127) && (c < 2048)) { + utftext += String.fromCharCode((c >> 6) | 192); + utftext += String.fromCharCode((c & 63) | 128); + } + else { + utftext += String.fromCharCode((c >> 12) | 224); + utftext += String.fromCharCode(((c >> 6) & 63) | 128); + utftext += String.fromCharCode((c & 63) | 128); + } + + } + + return utftext; + } + + function binb2hex (binarray) { + var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; + var str = ""; + for(var i = 0; i < binarray.length * 4; i++) { + str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) + + hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF); + } + return str; + } + + s = Utf8Encode(s); + return binb2hex(core_sha256(str2binb(s), s.length * chrsz)); + +} From c276e58c55bf42b9585006120ca5b7296b0bf3d3 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Tue, 28 Jun 2011 13:47:35 +0200 Subject: [PATCH 09/13] Add default implementations of search and resolve to the QtScriptResolver API --- data/js/tomahawk.js | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/data/js/tomahawk.js b/data/js/tomahawk.js index 0206a8b59..3b7bc2525 100644 --- a/data/js/tomahawk.js +++ b/data/js/tomahawk.js @@ -48,20 +48,31 @@ var TomahawkResolver = { }, getUserConfig: function() { - var configJson = window.localStorage[this.scriptPath()]; - if(configJson === undefined) + var configJson = window.localStorage[ this.scriptPath() ]; + if( configJson === undefined ) configJson = "{}"; - var config = JSON.parse(configJson); + var config = JSON.parse( configJson ); return config; }, saveUserConfig: function() { var config = Tomahawk.resolverData().config; - var configJson = JSON.stringify(config); + var configJson = JSON.stringify( config ); - window.localStorage[this.scriptPath()] = configJson; + window.localStorage[ this.scriptPath() ] = configJson; + }, + resolve: function( qid, artist, album, title ) + { + return { + qid: qid, + results: [] + }; + }, + search: function( qid, searchString ) + { + return this.resolve( qid, "", "", searchString ); } }; From c9fb10362708d3b48f2cc6bb098bd0634f2f9817 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Tue, 28 Jun 2011 21:29:44 +0200 Subject: [PATCH 10/13] More API cleanup for QtScriptResolver --- data/js/tomahawk.js | 35 ++++++++++++++++++++++++++++-- src/resolvers/qtscriptresolver.cpp | 29 +++++++++++++++++++------ src/resolvers/qtscriptresolver.h | 4 ++++ 3 files changed, 59 insertions(+), 9 deletions(-) diff --git a/data/js/tomahawk.js b/data/js/tomahawk.js index 3b7bc2525..88e0a7bf7 100644 --- a/data/js/tomahawk.js +++ b/data/js/tomahawk.js @@ -4,6 +4,10 @@ if(window.Tomahawk === undefined) { alert("PHANTOMJS ENVIRONMENT"); var Tomahawk = { + fakeEnv: function() + { + return true; + }, resolverData: function() { return { @@ -12,14 +16,34 @@ if(window.Tomahawk === undefined) return "/home/tomahawk/resolver.js"; } }; + }, + log: function( message ) + { + console.log( message ); } }; } + Tomahawk.resolver = { scriptPath: Tomahawk.resolverData().scriptPath }; +Tomahawk.timestamp = function() { + return Math.round( new Date()/1000 ); +} + +Tomahawk.dumpResult = function( result ) { + var results = result.results; + Tomahawk.log("Dumping " + results.length + " results for query " + result.qid + "..."); + for(var i=0; imainFrame()->evaluateJavaScript( jslib.readAll() ); jslib.close(); - // execute resolver + // add resolver m_engine->setScriptPath( scriptPath ); m_engine->mainFrame()->evaluateJavaScript( scriptFile.readAll() ); scriptFile.close(); + // init resolver + resolverInit(); + QVariantMap m = resolverSettings(); m_name = m.value( "name" ).toString(); @@ -167,7 +176,7 @@ QtScriptResolver::resolve( const Tomahawk::query_ptr& query ) if ( !query->isFullTextQuery() ) { - eval = QString( "Tomahawk.resolver.instance.resolve( '%1', '%2', '%3', '%4' );" ) + eval = QString( "Tomahawk.resolver.instance.resolve( '%1', '%4', '%3', '%4' );" ) .arg( query->id().replace( "'", "\\'" ) ) .arg( query->artist().replace( "'", "\\'" ) ) .arg( query->album().replace( "'", "\\'" ) ) @@ -175,11 +184,9 @@ QtScriptResolver::resolve( const Tomahawk::query_ptr& query ) } else { - eval = QString( "Tomahawk.resolver.instance.resolve( '%1', '%2', '%3', '%4' );" ) + eval = QString( "Tomahawk.resolver.instance.search( '%1', '%2' );" ) .arg( query->id().replace( "'", "\\'" ) ) - .arg( query->fullTextQuery().replace( "'", "\\'" ) ) - .arg( QString() ) - .arg( QString() ); + .arg( query->fullTextQuery().replace( "'", "\\'" ) ); } QList< Tomahawk::result_ptr > results; @@ -415,7 +422,7 @@ QtScriptResolver::fillDataInWidgets( const QVariantMap& data ) QVariantMap QtScriptResolver::resolverSettings() { - return m_engine->mainFrame()->evaluateJavaScript( "Tomahawk.resolver.instance.getSettings();" ).toMap(); + return m_engine->mainFrame()->evaluateJavaScript( "Tomahawk.resolver.instance.settings;" ).toMap(); } @@ -424,3 +431,11 @@ QtScriptResolver::resolverUserConfig() { return m_engine->mainFrame()->evaluateJavaScript( "Tomahawk.resolver.instance.getUserConfig();" ).toMap(); } + + +QVariantMap +QtScriptResolver::resolverInit() +{ + return m_engine->mainFrame()->evaluateJavaScript( "Tomahawk.resolver.instance.init();" ).toMap(); +} + diff --git a/src/resolvers/qtscriptresolver.h b/src/resolvers/qtscriptresolver.h index 20ac3fc47..86475df4f 100644 --- a/src/resolvers/qtscriptresolver.h +++ b/src/resolvers/qtscriptresolver.h @@ -49,6 +49,9 @@ public slots: QString compress( const QString& data ); QVariantMap resolverData(); + void log( const QString& message); + bool fakeEnv() { return false; } + private: QString m_scriptPath; QVariantMap m_resolverConfig; @@ -124,6 +127,7 @@ private: // encapsulate javascript calls QVariantMap resolverSettings(); QVariantMap resolverUserConfig(); + QVariantMap resolverInit(); ScriptEngine* m_engine; From 1416c401726dd58f4f0f7632d18b26b3d5a24baf Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Tue, 28 Jun 2011 22:30:29 +0200 Subject: [PATCH 11/13] Be compatible with the old resolvers *shrug* --- src/resolvers/qtscriptresolver.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/resolvers/qtscriptresolver.cpp b/src/resolvers/qtscriptresolver.cpp index acf83631e..abe4e17de 100644 --- a/src/resolvers/qtscriptresolver.cpp +++ b/src/resolvers/qtscriptresolver.cpp @@ -26,6 +26,7 @@ #include +#define RESOLVER_LEGACY_CODE "var resolver = Tomahawk.resolver.instance ? Tomahawk.resolver.instance : TomahawkResolver;" QtScriptResolverHelper::QtScriptResolverHelper( const QString& scriptPath, QObject* parent ) : QObject( parent ) @@ -176,7 +177,7 @@ QtScriptResolver::resolve( const Tomahawk::query_ptr& query ) if ( !query->isFullTextQuery() ) { - eval = QString( "Tomahawk.resolver.instance.resolve( '%1', '%4', '%3', '%4' );" ) + eval = QString( RESOLVER_LEGACY_CODE "resolver.resolve( '%1', '%2', '%3', '%4' );" ) .arg( query->id().replace( "'", "\\'" ) ) .arg( query->artist().replace( "'", "\\'" ) ) .arg( query->album().replace( "'", "\\'" ) ) @@ -184,7 +185,12 @@ QtScriptResolver::resolve( const Tomahawk::query_ptr& query ) } else { - eval = QString( "Tomahawk.resolver.instance.search( '%1', '%2' );" ) + eval = QString( "if(Tomahawk.resolver.instance !== undefined) {" + " resolver.search( '%1', '%2' );" + "} else {" + " resolve( '%1', '', '', '%2' );" + "}" + ) .arg( query->id().replace( "'", "\\'" ) ) .arg( query->fullTextQuery().replace( "'", "\\'" ) ); } @@ -254,7 +260,7 @@ QtScriptResolver::loadUi() { qDebug() << Q_FUNC_INFO; - QVariantMap m = m_engine->mainFrame()->evaluateJavaScript( "Tomahawk.resolver.instance.getConfigUi();" ).toMap(); + QVariantMap m = m_engine->mainFrame()->evaluateJavaScript( RESOLVER_LEGACY_CODE "resolver.getConfigUi();" ).toMap(); m_dataWidgets = m["fields"].toList(); @@ -304,7 +310,7 @@ QtScriptResolver::saveConfig() qDebug() << Q_FUNC_INFO << saveData; m_resolverHelper->setResolverConfig( saveData.toMap() ); - m_engine->mainFrame()->evaluateJavaScript( "Tomahawk.resolver.instance.saveUserConfig();" ); + m_engine->mainFrame()->evaluateJavaScript( RESOLVER_LEGACY_CODE "resolver.saveUserConfig();" ); } @@ -422,20 +428,20 @@ QtScriptResolver::fillDataInWidgets( const QVariantMap& data ) QVariantMap QtScriptResolver::resolverSettings() { - return m_engine->mainFrame()->evaluateJavaScript( "Tomahawk.resolver.instance.settings;" ).toMap(); + return m_engine->mainFrame()->evaluateJavaScript( RESOLVER_LEGACY_CODE "if(resolver.settings) resolver.settings; else getSettings(); " ).toMap(); } QVariantMap QtScriptResolver::resolverUserConfig() { - return m_engine->mainFrame()->evaluateJavaScript( "Tomahawk.resolver.instance.getUserConfig();" ).toMap(); + return m_engine->mainFrame()->evaluateJavaScript( RESOLVER_LEGACY_CODE "resolver.getUserConfig();" ).toMap(); } QVariantMap QtScriptResolver::resolverInit() { - return m_engine->mainFrame()->evaluateJavaScript( "Tomahawk.resolver.instance.init();" ).toMap(); + return m_engine->mainFrame()->evaluateJavaScript( RESOLVER_LEGACY_CODE "resolver.init();" ).toMap(); } From 3d297795c2d8054a245cff90d9507cfcc4d1328d Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Thu, 30 Jun 2011 01:03:15 +0200 Subject: [PATCH 12/13] Be simplistic :D --- data/js/tomahawk.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/data/js/tomahawk.js b/data/js/tomahawk.js index 88e0a7bf7..278ced0c6 100644 --- a/data/js/tomahawk.js +++ b/data/js/tomahawk.js @@ -93,8 +93,7 @@ var TomahawkResolver = { resolve: function( qid, artist, album, title ) { return { - qid: qid, - results: [] + qid: qid }; }, search: function( qid, searchString ) From 25775b505137ecac7809aaac716413043754cf38 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Thu, 30 Jun 2011 01:27:49 +0200 Subject: [PATCH 13/13] Make the Resolver API expect a widgetName instead of a widgetPath We dont have gazillions of widgets in one dialog, so make the API a bit easier to use :) --- src/resolvers/qtscriptresolver.cpp | 37 +++++++++--------------------- src/resolvers/qtscriptresolver.h | 2 +- 2 files changed, 12 insertions(+), 27 deletions(-) diff --git a/src/resolvers/qtscriptresolver.cpp b/src/resolvers/qtscriptresolver.cpp index abe4e17de..4ff0e0151 100644 --- a/src/resolvers/qtscriptresolver.cpp +++ b/src/resolvers/qtscriptresolver.cpp @@ -315,26 +315,21 @@ QtScriptResolver::saveConfig() QWidget* -QtScriptResolver::findWidget(QWidget* widget, const QStringList& widgetPath) +QtScriptResolver::findWidget(QWidget* widget, const QString& objectName) { if( !widget || !widget->isWidgetType() ) return 0; - qDebug() << Q_FUNC_INFO << widget->objectName() << widgetPath; - - if( widgetPath.isEmpty() ) + if( widget->objectName() == objectName ) return widget; - QString searchName = widgetPath.first(); foreach( QObject* child, widget->children() ) { - if( child->isWidgetType() && child->objectName() == searchName ) - { - QStringList newWidgetPath = widgetPath; - newWidgetPath.removeFirst(); - return findWidget(qobject_cast< QWidget* >( child ), newWidgetPath); - } + QWidget* found = findWidget(qobject_cast< QWidget* >( child ), objectName); + + if( found ) + return found; } return 0; @@ -378,13 +373,8 @@ QtScriptResolver::loadDataFromWidgets() { QVariantMap data = dataWidget.toMap(); - QStringList widgetPath; - foreach(const QVariant& pathItem, data["widget"].toList()) - { - widgetPath << pathItem.toString(); - } - - QWidget* widget= findWidget( m_configWidget.data(), widgetPath ); + QString widgetName = data["widget"].toString(); + QWidget* widget= findWidget( m_configWidget.data(), widgetName ); QString value = widgetData( widget, data["property"].toString() ).toString(); @@ -403,16 +393,11 @@ QtScriptResolver::fillDataInWidgets( const QVariantMap& data ) qDebug() << Q_FUNC_INFO << data; foreach(const QVariant& dataWidget, m_dataWidgets) { - QStringList widgetPath; - foreach(const QVariant& pathItem, dataWidget.toMap()["widget"].toList()) - { - widgetPath << pathItem.toString(); - } - - QWidget* widget= findWidget( m_configWidget.data(), widgetPath ); + QString widgetName = dataWidget.toMap()["widget"].toString(); + QWidget* widget= findWidget( m_configWidget.data(), widgetName ); if( !widget ) { - qDebug() << Q_FUNC_INFO << "widget specified in resolver was not found:" << widgetPath; + qDebug() << Q_FUNC_INFO << "widget specified in resolver was not found:" << widgetName; Q_ASSERT(false); return; } diff --git a/src/resolvers/qtscriptresolver.h b/src/resolvers/qtscriptresolver.h index 6ea58c5e0..a988b1e9e 100644 --- a/src/resolvers/qtscriptresolver.h +++ b/src/resolvers/qtscriptresolver.h @@ -119,7 +119,7 @@ signals: private: virtual void loadUi(); - QWidget* findWidget( QWidget* widget, const QStringList& widgetPath ); + QWidget* findWidget( QWidget* widget, const QString& objectName ); void setWidgetData( const QVariant& value, QWidget* widget, const QString& property ); QVariant widgetData( QWidget* widget, const QString& property ); QVariantMap loadDataFromWidgets();