[Interest] Awkwardness of delegates in heterogenous ListViews

Elvis Stansvik elvstone at gmail.com
Thu Jun 9 08:41:22 CEST 2016


Den 9 juni 2016 8:20 fm skrev "Elvis Stansvik" <elvstone at gmail.com>:
>
> 2016-06-09 7:54 GMT+02:00 Elvis Stansvik <elvstone at gmail.com>:
> > 2016-06-08 23:59 GMT+02:00 Jason H <jhihn at gmx.com>:
> >> I'm coming into this late, but can't you just set up:
> >>
> >> Item { // delegate
> >>
> >>   Item {
> >>     id: view1
> >>      visible: some_data_item_property == true
> >>   }
> >>   Item {
> >>     id: view2
> >>     visible: !view1.visible
> >>   }
> >> }
> >>
> >> Then make view1 and view2 your different delegates? You're just going
after
> >> two diferent views, right?
> >
> > Well it's ~5, but indeed that seems to work great! A little test:
> >
> >
> > import QtQuick 2.4
> > import QtQuick.Window 2.2
> >
> > import "."
> >
> > Window {
> >     title: "Test"
> >     width: 600
> >     height: 900
> >     visible: true
> >
> >     ListModel {
> >         id: listModel
> >         dynamicRoles: true
> >         Component.onCompleted: {
> >             append({
> >                 "type": "color",
> >                 "name": "foo",
> >                 "value": "red"
> >             });
> >             append({
> >                 "type": "flag",
> >                 "name": "bar",
> >                 "value": false
> >             });
> >             append({
> >                 "type": "choice",
> >                 "name": "bar",
> >                 "value": "Foo",
> >                 "choices": ["Foo", "Bar"]
> >             });
> >         }
> >     }
> >
> >     ListView {
> >         anchors.fill: parent
> >
> >         model: listModel
> >         delegate: Rectangle {
> >             implicitHeight: {
> >                 if (type === "color")
> >                     return colorDelegate.implicitHeight
> >                 if (type === "flag")
> >                     return flagDelegate.implicitHeight
> >                 if (type === "choice")
> >                     return choiceDelegate.implicitHeight
> >             }
> >             Text {
> >                 id: colorDelegate
> >                 text: value + " (color)"
> >                 visible: type === "color"
> >             }
> >             Text {
> >                 id: flagDelegate
> >                 text: value + " (flag)"
> >                 visible: type === "flag"
> >             }
> >             Text {
> >                 id: choiceDelegate
> >                 text: value + " (choice)"
> >                 visible: type === "choice"
> >             }
> >         }
> >     }
> > }
> >
>
> It does not really solve the "problem" though. Say one of my delegates
> is a ColorDelegate for when the item represents a color, and I want to
> provide editing (my model has a setColor(index, color)).
>
> I will then have to use parent.ListView.view.model.setColor(index,

Another reason I have for accessing view through the ListView attached
property is getting the view width, since I want some of my delegates to
stretch across the full width of the view, and to do that I have to use
parent.ListView.view.width, thus assuming that the parent is the real
delegate.

It would have been convenient if the view itself was directly accessible in
the delegate and its children, in the same way as the index is, instead of
as an attached property on the delegate.

Elvis
> color), thereby tying the color delegate to this way of working: It
> can't be reused in another context where I have a model known to
> consist of only colors (well not without artificially nesting it
> inside something else, like an invisible Rectangle, so that the
> reference to setColor works).
>
> On the C++ side, it's a bit easier to make delegates that are reusable
> in these two situations, since you work with createEditor and friends
> instead.
>
> Elvis
>
> >
> > I wonder why I haven't seen this approach before while searching around.
> >
> > Elvis
> >
> >>
> >> Sent: Wednesday, June 08, 2016 at 11:49 AM
> >> From: "Elvis Stansvik" <elvstone at gmail.com>
> >> To: "Kristoffersen, Even (NO14)" <Even.Kristoffersen at honeywell.com>,
> >> "interest at qt-project.org Interest" <interest at qt-project.org>
> >>
> >> Subject: Re: [Interest] Awkwardness of delegates in heterogenous
ListViews
> >>
> >> 2016-06-08 15:41 GMT+02:00 Kristoffersen, Even (NO14)
> >> <Even.Kristoffersen at honeywell.com>:
> >>> Have you tried something like this in the delegate?
> >>>
> >>> property alias some_descriptive_name: parent
> >>
> >> It seems it's not allowed to use parent as the target of an alias (?):
> >>
> >> file:///home/estan/qte/qte/qml/ItemDelegate.qml:5 Invalid alias
reference.
> >> Unable to find id "parent"
> >>
> >> And this would still tie my "subdelegates" to this structure. They
could not
> >> be reused in other places, where lists are homogenous and I'm not
using the
> >> Loader approach.
> >>
> >> But I guess there's really no way to make a delegate that can be used
in
> >> both the "normal" situation and in the indirect-through-Loader
approach.
> >>
> >> Elvis
> >>
> >>>
> >>> (Not tested, just an idea)
> >>>
> >>> -Even
> >>>
> >>> -----Original Message-----
> >>> From: Interest
> >>> [mailto:interest-bounces+even.kristoffersen=
honeywell.com at qt-project.org] On
> >>> Behalf Of Elvis Stansvik
> >>> Sent: 8. juni 2016 15:34
> >>> To: interest at qt-project.org Interest <interest at qt-project.org>
> >>> Subject: Re: [Interest] Awkwardness of delegates in heterogenous
ListViews
> >>>
> >>> 2016-06-08 15:32 GMT+02:00 Elvis Stansvik <elvstone at gmail.com>:
> >>>> Hi all,
> >>>>
> >>>> I'm currently using a "type" role in my items and then a Loader as
> >>>> delegate, to give a level of indirection and let me choose the actual
> >>>> delegate based on the "type" of the item.
> >>>>
> >>>> This explains it better (from my ListView):
> >>>>
> >>>> delegate: Loader {
> >>>> sourceComponent: {
> >>>> switch (type) {
> >>>> case "color":
> >>>> return colorDelegate
> >>>> case "flag":
> >>>> return flagDelegate
> >>>> ...
> >>>> }
> >>>> }
> >>>>
> >>>> Component {
> >>>> id: colorDelegate
> >>>>
> >>>> ColorDelegate { }
> >>>> }
> >>>>
> >>>> Component {
> >>>> id: flagDelegate
> >>>>
> >>>> FlagDelegate { }
> >>>> }
> >>>>
> >>>> ...
> >>>> }
> >>>>
> >>>> What I don't like with this approach is that inside my delegates,
e.g.
> >>>> ColorDelegate.qml, I have to use parent.ListView.view.model to get a
> >>>
> >>> I should clarify: I have to use this notation since it is the parent
(the
> >>> Loader) which is the real delegate and has the ListView attached
properties.
> >>>
> >>> Elvis
> >>>
> >>>> reference to the model (needed for editing operations). The use of
> >>>> "parent" here assumes a certain layout, but I see no other way :(
> >>>>
> >>>> How have others solved the issue of delegates for heterogenous lists?
> >>>>
> >>>> Best regards,
> >>>> Elvis
> >>> _______________________________________________
> >>> Interest mailing list
> >>> Interest at qt-project.org
> >>> http://lists.qt-project.org/mailman/listinfo/interest
> >>
> >> _______________________________________________ Interest mailing list
> >> Interest at qt-project.org
> >> http://lists.qt-project.org/mailman/listinfo/interest
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20160609/155d2e72/attachment.html>


More information about the Interest mailing list