@@ -8,11 +8,7 @@ using namespace QtMvvm;
88QQmlViewPlaceholder::QQmlViewPlaceholder (QQuickItem *parent) :
99 QQuickItem{parent}
1010{
11- // auto presenting
12- connect (this , &QQmlViewPlaceholder::viewModelTypeChanged,
13- this , &QQmlViewPlaceholder::presentIfReady);
14- connect (this , &QQmlViewPlaceholder::autoPresentChanged,
15- this , &QQmlViewPlaceholder::presentIfReady);
11+ setImplicitSize (0 , 0 ); // init to 0
1612
1713 // size changes
1814 connect (this , &QQmlViewPlaceholder::widthChanged,
@@ -23,18 +19,12 @@ QQmlViewPlaceholder::QQmlViewPlaceholder(QQuickItem *parent) :
2319 this , &QQmlViewPlaceholder::resizeView);
2420}
2521
26- bool QQmlViewPlaceholder::presentItem (const QVariant & item)
22+ bool QQmlViewPlaceholder::presentItem (QQuickItem * item)
2723{
28- // check if the parameter is valid
29- auto quickItem = item.value <QQuickItem*>();
30- if (!quickItem) {
31- qmlWarning (this ) << " presentItem called with invalid item of type: " << item.typeName ();
32- return false ;
33- }
34-
3524 // handle already existing view case
3625 if (_loadedView) {
3726 if (_replaceViews) { // quick discard without reenableing all children
27+ disconnectSizeChanges (false );
3828 _loadedView->setVisible (false );
3929 _loadedView->deleteLater ();
4030 _loadedView = nullptr ;
@@ -45,11 +35,12 @@ bool QQmlViewPlaceholder::presentItem(const QVariant &item)
4535 }
4636
4737 // add
48- _loadedView = quickItem;
49- quickItem->setParent (this );
50- quickItem->setParentItem (this );
38+ _loadedView = item;
39+ _loadedView->setParent (this );
40+ _loadedView->setParentItem (this );
41+ connectSizeChanges ();
5142 resizeView ();
52- quickItem ->setVisible (true );
43+ _loadedView ->setVisible (true );
5344
5445 // hide all children
5546 for (auto child : childItems ()) {
@@ -87,52 +78,11 @@ bool QQmlViewPlaceholder::closeAction()
8778 return false ;
8879}
8980
90- void QQmlViewPlaceholder::setParentViewModel (ViewModel *parentViewModel)
91- {
92- // first: clear the auto-connected viewmodel, if required
93- if (_clearParentVmCon && _parentVmCon)
94- disconnect (_parentVmCon);
95-
96- // then: set property as usual
97- if (_parentViewModel == parentViewModel)
98- return ;
99-
100- _parentViewModel = parentViewModel;
101- emit parentViewModelChanged (_parentViewModel);
102-
103- // check the vm parent for a presenter method
104- auto view = qobject_cast<QQuickItem*>(_parentViewModel->parent ());
105- if (view) {
106- if (view->metaObject ()->indexOfMethod (" presentItem(QVariant)" ) == -1 )
107- qmlWarning (this ) << R"( Parent item of "parentViewModel" does not have a "presentItem" method. Check the ViewPlaceholder documentation!)" ;
108- } else
109- qmlWarning (this ) << R"( Parent item of "parentViewModel" is not an Item)" ;
110-
111- presentIfReady ();
112- }
113-
11481QQuickItem *QQmlViewPlaceholder::loadedView () const
11582{
11683 return _loadedView;
11784}
11885
119- void QQmlViewPlaceholder::componentComplete ()
120- {
121- // auto-set the vm if not already set
122- if (!_parentViewModel)
123- getParentViewModel ();
124-
125- // last step: call base implementation, then present
126- QQuickItem::componentComplete ();
127- _isReady = true ;
128- presentIfReady ();
129- }
130-
131- void QQmlViewPlaceholder::presentView ()
132- {
133- CoreApp::show (qUtf8Printable (_viewModelType), _showParams, _parentViewModel);
134- }
135-
13686void QQmlViewPlaceholder::discardView ()
13787{
13888 // hide view
@@ -145,57 +95,46 @@ void QQmlViewPlaceholder::discardView()
14595 }
14696
14797 // now delete it
98+ disconnectSizeChanges (true );
14899 _loadedView->deleteLater ();
149100 _loadedView = nullptr ;
150101 emit loadedViewChanged (nullptr );
151102}
152103
153- void QQmlViewPlaceholder::parentItemVmChanged (ViewModel *viewModel )
104+ void QQmlViewPlaceholder::resizeView ( )
154105{
155- // set vm without clearing the connection
156- _clearParentVmCon = false ;
157- setParentViewModel (viewModel );
158- _clearParentVmCon = true ;
106+ if (_loadedView && _autoResizeView) {
107+ _loadedView-> setWidth ( width ()) ;
108+ _loadedView-> setHeight ( height () );
109+ }
159110}
160111
161- void QQmlViewPlaceholder::presentIfReady ()
112+ void QQmlViewPlaceholder::updateImpHeight ()
162113{
163- if (_isReady &&
164- _autoPresent &&
165- !_loadedView &&
166- _parentViewModel &&
167- !_viewModelType.isEmpty ())
168- presentView ();
114+ setImplicitHeight (_loadedView->implicitHeight ());
169115}
170116
171- void QQmlViewPlaceholder::resizeView ()
117+ void QQmlViewPlaceholder::updateImpWidth ()
172118{
173- if (_loadedView && _autoResizeView) {
174- _loadedView->setWidth (width ());
175- _loadedView->setHeight (height ());
176- }
119+ setImplicitWidth (_loadedView->implicitWidth ());
120+ }
121+
122+ void QQmlViewPlaceholder::connectSizeChanges ()
123+ {
124+ connect (_loadedView, &QQuickItem::implicitWidthChanged,
125+ this , &QQmlViewPlaceholder::updateImpWidth);
126+ connect (_loadedView, &QQuickItem::implicitHeightChanged,
127+ this , &QQmlViewPlaceholder::updateImpHeight);
128+ setImplicitSize (_loadedView->implicitWidth (),
129+ _loadedView->implicitHeight ());
177130}
178131
179- void QQmlViewPlaceholder::getParentViewModel ( )
132+ void QQmlViewPlaceholder::disconnectSizeChanges ( bool resetSize )
180133{
181- auto pItem = parentItem ();
182- if (!pItem)
183- return ;
184-
185- QQmlProperty vmProp{pItem, QStringLiteral (" viewModel" )};
186- if (!vmProp.isValid ())
187- return ;
188-
189- // set the vm from the property
190- auto vm = vmProp.read ().value <ViewModel*>();
191- if (vm)
192- setParentViewModel (vm); // no warning here - might be ok for lazy presented vms
193-
194- // connect to further changes, via helper slot
195- auto cSlotIndex = metaObject ()->indexOfSlot (" parentItemVmChanged(QtMvvm::ViewModel*)" );
196- Q_ASSERT (cSlotIndex != -1 );
197- if (_parentVmCon)
198- disconnect (_parentVmCon);
199- _parentVmCon = connect (pItem, vmProp.property ().notifySignal (),
200- this , metaObject ()->method (cSlotIndex));
134+ disconnect (_loadedView, &QQuickItem::implicitWidthChanged,
135+ this , &QQmlViewPlaceholder::updateImpWidth);
136+ disconnect (_loadedView, &QQuickItem::implicitHeightChanged,
137+ this , &QQmlViewPlaceholder::updateImpHeight);
138+ if (resetSize)
139+ setImplicitSize (0 , 0 );
201140}
0 commit comments