From 59f11e9b67dce50cacda4b8e56b4cc0728fae659 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sat, 24 Jul 2021 12:16:19 +0200 Subject: [PATCH] i18n: make retranslator more consistent - Improve naming. - Both lambda and slot versions call the code immediately. --- src/calamares/CalamaresWindow.cpp | 2 +- src/libcalamares/utils/Retranslator.cpp | 5 +++ src/libcalamares/utils/Retranslator.h | 33 ++++++++++++++----- .../viewpages/PythonQtViewStep.cpp | 2 +- 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index 63d145e32..d95b87933 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -134,7 +134,7 @@ getWidgetSidebar( Calamares::DebugWindowManager* debug, { QPushButton* debugWindowBtn = new QPushButton; debugWindowBtn->setObjectName( "debugButton" ); - CALAMARES_RETRANSLATE_WIDGET( + CALAMARES_RETRANSLATE_FOR( debugWindowBtn, debugWindowBtn->setText( QCoreApplication::translate( CalamaresWindow::staticMetaObject.className(), "Show debug information" ) ); ); diff --git a/src/libcalamares/utils/Retranslator.cpp b/src/libcalamares/utils/Retranslator.cpp index a63e24bad..2e71fc011 100644 --- a/src/libcalamares/utils/Retranslator.cpp +++ b/src/libcalamares/utils/Retranslator.cpp @@ -233,6 +233,11 @@ Retranslator* Retranslator::instance() return &s_instance; } +void Retranslator::attach(QObject* o, std::function f) +{ + connect( instance(), &Retranslator::languageChanged, o, f ); + f(); +} void setAllowLocalTranslation( bool allow ) diff --git a/src/libcalamares/utils/Retranslator.h b/src/libcalamares/utils/Retranslator.h index da0cc5723..9d8617cbd 100644 --- a/src/libcalamares/utils/Retranslator.h +++ b/src/libcalamares/utils/Retranslator.h @@ -81,8 +81,12 @@ class Retranslator : public QObject { Q_OBJECT public: + /// @brief Gets the global (single) Retranslator object static Retranslator* instance(); + /// @brief Helper function for attaching lambdas + static void attach( QObject* o, std::function< void( void ) > f); + signals: void languageChanged(); @@ -96,32 +100,43 @@ private: } // namespace CalamaresUtils -// Implementation detail: connects the retranslator to a slot or function -#define CALAMARES_RETRANSLATE_FOR( object, body ) \ - QObject::connect( CalamaresUtils::Retranslator::instance(), &CalamaresUtils::Retranslator::languageChanged, object, body ) - /** @brief Call code for this object when language changes * * @p body should be a code block (it does not need braces) that can be wrapped * up as a lambda. When the language changes, the lambda is called. Note that * this macro should be used in constructors or other code that is run only * once, since otherwise you will end up with multiple calls to @p body. + * + * NOTE: unlike plain QObject::connect(), the body is **also** called + * immediately after setting up the connection. This allows + * setup and translation code to be mixed together. */ -#define CALAMARES_RETRANSLATE( body ) CALAMARES_RETRANSLATE_FOR( this, [=] { body } ) +#define CALAMARES_RETRANSLATE( body ) CalamaresUtils::Retranslator::attach( this, [=] { body } ) /** @brief Call code for the given object (widget) when language changes * * This is identical to CALAMARES_RETRANSLATE, except the @p body is called - * for the given widget, not this object. + * for the given object, not this object. * - * NOTE: this macro is deprecated. + * NOTE: unlike plain QObject::connect(), the body is **also** called + * immediately after setting up the connection. This allows + * setup and translation code to be mixed together. */ -#define CALAMARES_RETRANSLATE_WIDGET( widget, body ) CALAMARES_RETRANSLATE_FOR( widget, [=] { body } ) +#define CALAMARES_RETRANSLATE_FOR( object, body ) CalamaresUtils::Retranslator::attach( object, [=] { body } ) /** @brief Call a slot in this object when language changes * * Given a slot (in method-function-pointer notation), call that slot when the * language changes. This is shorthand for connecting the Retranslator's * signal to the given slot. + * + * NOTE: unlike plain QObject::connect(), the slot is **also** called + * immediately after setting up the connection. This allows + * setup and translation code to be mixed together. */ -#define CALAMARES_RETRANSLATE_SLOT( slotfunc ) CALAMARES_RETRANSLATE_FOR( this, slotfunc ) +#define CALAMARES_RETRANSLATE_SLOT( slotfunc ) \ + do \ + { \ + connect( CalamaresUtils::Retranslator::instance(), &CalamaresUtils::Retranslator::languageChanged, this, slotfunc ); \ + (this->*slotfunc)(); \ + } while ( false ) #endif diff --git a/src/libcalamaresui/viewpages/PythonQtViewStep.cpp b/src/libcalamaresui/viewpages/PythonQtViewStep.cpp index 29c65472f..df3c11994 100644 --- a/src/libcalamaresui/viewpages/PythonQtViewStep.cpp +++ b/src/libcalamaresui/viewpages/PythonQtViewStep.cpp @@ -48,7 +48,7 @@ PythonQtViewStep::PythonQtViewStep( PythonQtObjectPtr cxt, QObject* parent ) CalamaresUtils::unmarginLayout( m_widget->layout() ); m_cxt.addObject( "_calamares_module_basewidget", m_widget ); - CALAMARES_RETRANSLATE_WIDGET( + CALAMARES_RETRANSLATE_FOR( m_widget, CalamaresUtils::lookupAndCall( m_obj, { "retranslate" }, { CalamaresUtils::translatorLocaleName() } ); ) }