[libcalamares] Support calling a slot on retranslation

- sometimes a slot is easier than a lambda. Introduce
   a macro CALAMARES_RETRANSLATE_SLOT that calls a given
   slot in an object on language change.
 - extend the retranslator with support for calling slots:
   - use Qt's signal/slot mechanism alongside the private
     list of functions to call
   - provide convenience for obtaining the retranslator of
     an object.
This commit is contained in:
Adriaan de Groot 2019-08-29 14:53:03 +02:00
parent e3f933259b
commit f1971eed86
2 changed files with 24 additions and 8 deletions

View File

@ -118,8 +118,8 @@ translatorLocaleName()
return s_translatorLocaleName; return s_translatorLocaleName;
} }
void Retranslator*
Retranslator::attachRetranslator( QObject* parent, std::function< void( void ) > retranslateFunc ) Retranslator::retranslatorFor( QObject* parent )
{ {
Retranslator* r = nullptr; Retranslator* r = nullptr;
for ( QObject* child : parent->children() ) for ( QObject* child : parent->children() )
@ -127,16 +127,17 @@ Retranslator::attachRetranslator( QObject* parent, std::function< void( void ) >
r = qobject_cast< Retranslator* >( child ); r = qobject_cast< Retranslator* >( child );
if ( r ) if ( r )
{ {
break; return r;
} }
} }
if ( !r ) return new Retranslator( parent );
{ }
r = new Retranslator( parent );
}
r->m_retranslateFuncList.append( retranslateFunc ); void
Retranslator::attachRetranslator( QObject* parent, std::function< void( void ) > retranslateFunc )
{
retranslatorFor( parent )->m_retranslateFuncList.append( retranslateFunc );
retranslateFunc(); retranslateFunc();
} }
@ -159,6 +160,7 @@ Retranslator::eventFilter( QObject* obj, QEvent* e )
{ {
func(); func();
} }
emit languageChange();
} }
} }
// pass the event on to the base // pass the event on to the base

View File

@ -46,10 +46,17 @@ class Retranslator : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
/// @brief Call @p retranslateFunc when the language changes
static void attachRetranslator( QObject* parent, std::function< void( void ) > retranslateFunc ); static void attachRetranslator( QObject* parent, std::function< void( void ) > retranslateFunc );
/// @brief What retranslator belongs to @p parent (may create one)
static Retranslator* retranslatorFor( QObject* parent );
/// @brief Call @p retranslateFunc when the language changes
void addRetranslateFunc( std::function< void( void ) > retranslateFunc ); void addRetranslateFunc( std::function< void( void ) > retranslateFunc );
signals:
void languageChange();
protected: protected:
bool eventFilter( QObject* obj, QEvent* e ) override; bool eventFilter( QObject* obj, QEvent* e ) override;
@ -65,5 +72,12 @@ private:
#define CALAMARES_RETRANSLATE( body ) CalamaresUtils::Retranslator::attachRetranslator( this, [=] { body } ); #define CALAMARES_RETRANSLATE( body ) CalamaresUtils::Retranslator::attachRetranslator( this, [=] { body } );
#define CALAMARES_RETRANSLATE_WIDGET( widget, body ) \ #define CALAMARES_RETRANSLATE_WIDGET( widget, body ) \
CalamaresUtils::Retranslator::attachRetranslator( widget, [=] { body } ); CalamaresUtils::Retranslator::attachRetranslator( widget, [=] { body } );
#define CALAMARES_RETRANSLATE_SLOT( slotfunc ) \
{ \
this->connect( CalamaresUtils::Retranslator::retranslatorFor( this ), \
&CalamaresUtils::Retranslator::languageChange, \
this, \
slotfunc ); \
}
#endif #endif