From 035ad1cd2e3e6a28e145723a441339f4a8cafdd0 Mon Sep 17 00:00:00 2001 From: Ali Tavakoli Date: Sat, 22 Feb 2025 19:08:59 +0330 Subject: [PATCH] Set default direction of WHBoxLayout to document direction. This feature makes it much easier to create RTL applications and more importantly, bilingual (bidirectional) applications. --- src/Wt/WBoxLayout.C | 18 +++++++++--------- src/Wt/WBoxLayout.h | 5 +++-- src/Wt/WHBoxLayout.C | 21 ++++++++++++++++++++- src/Wt/WHBoxLayout.h | 5 +++++ 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/Wt/WBoxLayout.C b/src/Wt/WBoxLayout.C index fc555a5c9f..c3eb60af74 100644 --- a/src/Wt/WBoxLayout.C +++ b/src/Wt/WBoxLayout.C @@ -53,7 +53,7 @@ std::unique_ptr WBoxLayout::removeItem(WLayoutItem *item) int index = indexOf(item); if (index != -1) { - switch (direction_) { + switch (direction()) { case LayoutDirection::RightToLeft: if ((impl() && implementation() != LayoutImplementation::Flex) || !implementationIsFlexLayout()) index = grid_.columns_.size() - 1 - index; @@ -107,10 +107,10 @@ int WBoxLayout::count() const return grid_.rows_.size() * grid_.columns_.size(); } -void WBoxLayout::setDirection(LayoutDirection direction) +void WBoxLayout::setDirection(LayoutDirection dir) { - if (direction_ != direction) { - direction_ = direction; + if (direction() != dir) { + direction_ = dir; } } @@ -207,7 +207,7 @@ bool WBoxLayout::setStretchFactor(WLayout *layout, int stretch) void WBoxLayout::setStretchFactor(int i, int stretch) { - switch (direction_) { + switch (direction()) { case LayoutDirection::RightToLeft: if ((impl() && implementation() != LayoutImplementation::Flex) || !implementationIsFlexLayout()) i = grid_.columns_.size() - 1 - i; @@ -229,7 +229,7 @@ void WBoxLayout::insertItem(int index, std::unique_ptr item, { WLayoutItem *it = item.get(); - switch (direction_) { + switch (direction()) { case LayoutDirection::RightToLeft: if ((impl() && implementation() != LayoutImplementation::Flex) || !implementationIsFlexLayout()) index = grid_.columns_.size() - index; @@ -270,8 +270,8 @@ std::unique_ptr WBoxLayout::createSpacer(const WLength& size) std::unique_ptr spacer(new Spacer()); if (size.toPixels() > 0) { - if (direction_ == LayoutDirection::LeftToRight || - direction_ == LayoutDirection::RightToLeft) + if (direction() == LayoutDirection::LeftToRight || + direction() == LayoutDirection::RightToLeft) spacer->setMinimumSize(size, WLength::Auto); else spacer->setMinimumSize(WLength::Auto, size); @@ -289,7 +289,7 @@ void WBoxLayout::setResizable(int index, bool enabled, setPreferredImplementation(LayoutImplementation::JavaScript); } - switch (direction_) { + switch (direction()) { case LayoutDirection::RightToLeft: if ((impl() && implementation() != LayoutImplementation::Flex) || !implementationIsFlexLayout()) index = grid_.columns_.size() - 1 - index; diff --git a/src/Wt/WBoxLayout.h b/src/Wt/WBoxLayout.h index 3c231d35f9..6a2347e632 100644 --- a/src/Wt/WBoxLayout.h +++ b/src/Wt/WBoxLayout.h @@ -121,13 +121,13 @@ class WT_API WBoxLayout : public WLayout * * \sa direction() */ - void setDirection(LayoutDirection direction); + virtual void setDirection(LayoutDirection dir); /*! \brief Returns the layout direction. * * \sa setDirection() */ - LayoutDirection direction() const { return direction_; } + virtual LayoutDirection direction() { return direction_; } /*! \brief Sets spacing between each item. * @@ -386,6 +386,7 @@ class WT_API WBoxLayout : public WLayout virtual bool implementationIsFlexLayout() const override; protected: + WBoxLayout(){} void insertItem(int index, std::unique_ptr item, int stretch, WFlags alignment); diff --git a/src/Wt/WHBoxLayout.C b/src/Wt/WHBoxLayout.C index 13aa2442a7..235b9ac2cc 100644 --- a/src/Wt/WHBoxLayout.C +++ b/src/Wt/WHBoxLayout.C @@ -5,11 +5,30 @@ */ #include "Wt/WHBoxLayout.h" +#include "Wt/WApplication.h" namespace Wt { WHBoxLayout::WHBoxLayout() - : WBoxLayout(LayoutDirection::LeftToRight) + : syncDirection_(false) { } +void WHBoxLayout::setDirection (LayoutDirection dir) +{ + syncDirection_ = true; + WBoxLayout::setDirection (dir); +} + +LayoutDirection WHBoxLayout::direction (void) +{ + + if (false == syncDirection_) + { + + syncDirection_ = true; + WBoxLayout::setDirection (WApplication::instance()->layoutDirection()); + } + + return (WBoxLayout::direction()); +} } diff --git a/src/Wt/WHBoxLayout.h b/src/Wt/WHBoxLayout.h index d1c868464d..92758ce0e0 100644 --- a/src/Wt/WHBoxLayout.h +++ b/src/Wt/WHBoxLayout.h @@ -57,6 +57,11 @@ class WT_API WHBoxLayout : public WBoxLayout /*! \brief Creates a new horizontal box layout. */ WHBoxLayout(); + void setDirection (LayoutDirection dir) override; + LayoutDirection direction(void) override; + +private: + bool syncDirection_; }; }