Skip to content

Commit 8fa84c2

Browse files
Romain Mardulynmatthias
authored andcommitted
WT-11868: make new signal work with lazy loading
Make currentWidgetChanged() signal work correcly when using WMenuItem with the lazy loading policy.
1 parent ff52d6a commit 8fa84c2

File tree

3 files changed

+35
-13
lines changed

3 files changed

+35
-13
lines changed

src/Wt/WMenu.C

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -230,13 +230,7 @@ WMenuItem *WMenu::insertItem(int index, std::unique_ptr<WMenuItem> item)
230230
contentsStack_->setLoadPolicy(contentsStack_->count()-1, result->loadPolicy_);
231231

232232
if (contentsStack_->count() == 1) {
233-
setCurrent(0);
234-
if (loaded()) {
235-
currentItem()->loadContents();
236-
}
237-
contentsStack_->setCurrentWidget(contents);
238-
239-
renderSelected(result, true);
233+
select(0, false);
240234
} else
241235
renderSelected(result, false);
242236
} else
@@ -308,12 +302,24 @@ void WMenu::select(int index, bool changePath)
308302

309303
selectVisual(current_, changePath, true);
310304

305+
WMenuItem *item;
306+
311307
if (index != -1) {
312-
WMenuItem *item = itemAt(index);
308+
item = itemAt(index);
313309
item->show();
314-
if (loaded())
310+
if (loaded()) {
311+
bool itemLoaded = item->contentsLoaded();
315312
item->loadContents();
316313

314+
//if the item was not loaded before selectVisual we emit the signal
315+
if (!itemLoaded &&
316+
contentsStack_ &&
317+
contentsStack_->loadPolicies_[contentsStack_->currentIndex_] == ContentLoading::Lazy) {
318+
WContainerWidget* container = dynamic_cast<WContainerWidget*>(contentsStack_->currentWidget());
319+
contentsStack_->currentWidgetChanged().emit(container->widget(0));
320+
}
321+
}
322+
317323
observing_ptr<WMenu> self = this;
318324

319325
if (changePath && emitPathChange_) {
@@ -515,8 +521,9 @@ void WMenu::undoSelectVisual()
515521
app->setInternalPath(prevPath);
516522
}
517523

518-
if (contentsStack_)
524+
if (contentsStack_) {
519525
contentsStack_->setCurrentIndex(prevStackIndex);
526+
}
520527
}
521528

522529
WMenuItem *WMenu::currentItem() const

src/Wt/WMenu.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,13 @@ class WT_API WMenu : public WCompositeWidget
331331
*
332332
* Inserts a menu item. Use this form to insert specialized WMenuItem
333333
* implementations.
334+
*
335+
* \note When using the WMenu with a WStackedWidget, the first WMenuItem
336+
* added will be automatically selected. This implies that this
337+
* function can trigger the itemSelectRendered() and
338+
* itemSelected() signals.
334339
*
335-
* \sa insertItem(WMenuItem *item)
340+
* \sa insertItem(WMenuItem *item), itemSelected(), itemSelectRendered()
336341
*/
337342
virtual WMenuItem *insertItem(int index, std::unique_ptr<WMenuItem> item);
338343

src/Wt/WStackedWidget.C

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ void WStackedWidget::setCurrentIndex(int index, const WAnimation& animation,
101101
bool autoReverse)
102102
{
103103
if (!animation.empty() &&
104-
WApplication::instance()->environment().supportsCss3Animations() &&
104+
WApplication::instance()->environment().supportsCss3Animations() &&
105105
((isRendered() && javaScriptDefined_) || !canOptimizeUpdates())) {
106106
if (canOptimizeUpdates() && index == currentIndex_)
107107
return;
@@ -133,7 +133,17 @@ void WStackedWidget::setCurrentIndex(int index, const WAnimation& animation,
133133
doJavaScript(jsRef() + ".wtObj.setCurrent("
134134
+ widget(currentIndex_)->jsRef() + ");");
135135
}
136-
currentWidgetChanged().emit(currentWidget());
136+
137+
if (loadPolicies_[currentIndex_] == ContentLoading::Lazy) {
138+
WContainerWidget* container = dynamic_cast<WContainerWidget*>(currentWidget());
139+
140+
// If the container is empty, the content is not yet loaded. We rely on the function calling this one to emit the signal.
141+
if (container->count()) {
142+
currentWidgetChanged().emit(container->widget(0));
143+
}
144+
} else {
145+
currentWidgetChanged().emit(currentWidget());
146+
}
137147
}
138148

139149
void WStackedWidget::loadAnimateJS()

0 commit comments

Comments
 (0)