From a54f217173cdf6471129f022dcb5a5977479a566 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 7 Oct 2016 19:12:28 +0200 Subject: [PATCH] Use CalamaresUtils::lookupAndCall in PythonQtViewStep. This is done to support both Pythonic and Qt style method names, i.e. both "isNextEnabled" and "is_next_enabled" is ok in a Python module. Also better documentation in PythonQtViewStep, and stub for setConfigurationMap. Finally, proper handling of PythonQtViewStep Python-facing basewidget: with this change, a call to PQVS::widget() only triggers a widget relayout if it's necessary, and leaves it alone otherwise. --- .../viewpages/PythonQtViewStep.cpp | 65 +++++++++++++++---- .../viewpages/PythonQtViewStep.h | 7 ++ 2 files changed, 61 insertions(+), 11 deletions(-) diff --git a/src/libcalamaresui/viewpages/PythonQtViewStep.cpp b/src/libcalamaresui/viewpages/PythonQtViewStep.cpp index ae3c369f6..131eec3d0 100644 --- a/src/libcalamaresui/viewpages/PythonQtViewStep.cpp +++ b/src/libcalamaresui/viewpages/PythonQtViewStep.cpp @@ -19,12 +19,15 @@ #include "PythonQtViewStep.h" #include "utils/Logger.h" #include "utils/CalamaresUtilsGui.h" +#include "utils/PythonQtUtils.h" #include #include #include +namespace Calamares +{ PythonQtViewStep::PythonQtViewStep( PythonQtObjectPtr cxt, QObject* parent ) @@ -32,13 +35,17 @@ PythonQtViewStep::PythonQtViewStep( PythonQtObjectPtr cxt, , m_widget( new QWidget() ) , m_cxt( cxt ) { + // The @calamares_module decorator should have filled _calamares_module_typename + // for us. QString className = m_cxt.getVariable( "_calamares_module_typename" ).toString(); + // Instantiate an object of the class marked with @calamares_module and + // store it as _calamares_module. PythonQt::self()->evalScript( m_cxt, QString( "_calamares_module = %1()" ) .arg( className ) ); m_obj = PythonQt::self()->lookupObject( m_cxt, "_calamares_module" ); - Q_ASSERT( !m_obj.isNull() ); + Q_ASSERT( !m_obj.isNull() ); // no entry point, no party m_widget->setLayout( new QVBoxLayout ); CalamaresUtils::unmarginLayout( m_widget->layout() ); @@ -49,18 +56,37 @@ PythonQtViewStep::PythonQtViewStep( PythonQtObjectPtr cxt, QString PythonQtViewStep::prettyName() const { - return PythonQt::self()->call( m_obj, "prettyName" ).toString(); + return CalamaresUtils::lookupAndCall( m_obj, + { "prettyName", + "pretty_name" } ).toString(); } QWidget* PythonQtViewStep::widget() { - m_widget->layout()->deleteLater(); - m_widget->setLayout( new QVBoxLayout ); - CalamaresUtils::unmarginLayout( m_widget->layout() ); + if ( m_widget->layout()->count() > 1 ) + cDebug() << "WARNING: PythonQtViewStep wrapper widget has more than 1 child. " + "This should never happen."; + + bool nothingChanged = m_cxt.evalScript( + "_calamares_module_basewidget.contains(_calamares_module.widget())" ).toBool(); + if ( nothingChanged ) + return m_widget; + + // Else, we either don't have a child widget, or we have a child widget that + // was previously set and doesn't apply any more since the Python module + // set a new one. + + // First we clear the layout, which should only ever have 1 item. + // We only remove from the layout and not delete because Python is in charge + // of memory management for these widgets. + while ( m_widget->layout()->itemAt( 0 ) ) + m_widget->layout()->takeAt( 0 ); + m_cxt.evalScript( "_calamares_module_basewidget.layout().addWidget(_calamares_module.widget())" ); + return m_widget; } @@ -68,42 +94,50 @@ PythonQtViewStep::widget() void PythonQtViewStep::next() { - + CalamaresUtils::lookupAndCall( m_obj, { "next" } ); } void PythonQtViewStep::back() { - + CalamaresUtils::lookupAndCall( m_obj, { "back" } ); } bool PythonQtViewStep::isNextEnabled() const { - return PythonQt::self()->call( m_obj, "isNextEnabled" ).toBool(); + return CalamaresUtils::lookupAndCall( m_obj, + { "isNextEnabled", + "is_next_enabled" } ).toBool(); } bool PythonQtViewStep::isBackEnabled() const { - return PythonQt::self()->call( m_obj, "isBackEnabled" ).toBool(); + return CalamaresUtils::lookupAndCall( m_obj, + { "isBackEnabled", + "is_back_enabled" } ).toBool(); } bool PythonQtViewStep::isAtBeginning() const { - return PythonQt::self()->call( m_obj, "isAtBeginning" ).toBool(); + return CalamaresUtils::lookupAndCall( m_obj, + { "isAtBeginning", + "is_at_beginning" } ).toBool(); } bool PythonQtViewStep::isAtEnd() const { - return PythonQt::self()->call( m_obj, "isAtEnd" ).toBool(); + return CalamaresUtils::lookupAndCall( m_obj, + { "isAtEnd", + "is_at_end" } ).toBool(); } @@ -115,6 +149,13 @@ PythonQtViewStep::jobs() const } +void +PythonQtViewStep::setConfigurationMap( const QVariantMap& configurationMap ) +{ +#warning "Not implemented yet." +} + + QWidget* PythonQtViewStep::createScriptingConsole() { @@ -123,3 +164,5 @@ PythonQtViewStep::createScriptingConsole() m_cxt.getVariable( "_calamares_module_typename" ).toString() ); return console; } + +} diff --git a/src/libcalamaresui/viewpages/PythonQtViewStep.h b/src/libcalamaresui/viewpages/PythonQtViewStep.h index fd5cf68b8..2643a3848 100644 --- a/src/libcalamaresui/viewpages/PythonQtViewStep.h +++ b/src/libcalamaresui/viewpages/PythonQtViewStep.h @@ -23,6 +23,9 @@ #include +namespace Calamares +{ + class PythonQtViewStep : public Calamares::ViewStep { Q_OBJECT @@ -45,6 +48,8 @@ public: QList< Calamares::job_ptr > jobs() const override; + void setConfigurationMap( const QVariantMap& configurationMap ) override; + QWidget* createScriptingConsole(); protected: @@ -56,4 +61,6 @@ private: friend class PythonQtViewStepDecorator; }; +} + #endif // PYTHONQTVIEWSTEP_H