Re: [SailfishDevel] ComboBox issue (initialization)

2014-09-10 Thread François K .
Hi !

- Mail original -
 Hello. You need to set currentIndex after your model data
 initialized,
 not object. You can initialize at onCountChanged or make special
 signal
 from signal and listen it.


Thanks a lot Andrey, that solved my problem.

I think I need some doc about that kind of stuff (data initialization, where to 
put it, how, when, why...). Does someone have any good pointer about these 
issues ?

Thanks,

-- 
François
___
SailfishOS.org Devel mailing list
To unsubscribe, please send a mail to devel-unsubscr...@lists.sailfishos.org

[SailfishDevel] ComboBox issue (initialization)

2014-09-09 Thread François K .
Hi :)

I have a ComboBox issue !

The ComboBox I want to use is made of dynamic items. I build it with a 
ListModel and a Repeater as follow :

ComboBox {
id: project

label: qsTr(Project)
menu: ContextMenu {
MenuItem { text: qsTr(Not set) }

Repeater {
model: ProjectsModel { id: projects }
delegate: MenuItem { text: model.value }
}
}
}

It works pretty well (yay QML !).

Now I would like to initialize the ComboBox value. I tried several things (see 
after) and none of them worked.
I hope you guys can give me some help/tip :)



1. First I tried to set its value directly. It doesn't really work well :

  * The text that appears is the good one - OK
  * When I open the ComboBox to chose another value, the highlighted item is 
not the good one (which means that the ComboBox doesn't compute currentIndex 
and currentItem automagically when one set the ComboBox value) ;
  * Moreover, when I select another item in the menu, the currentIndex and 
currentItem are changed as expected, but the value of the ComboBox doesn't 
change.

Here is the code that highlights the problem :

ComboBox {
id: project

label: qsTr(Project)
menu: ContextMenu {
MenuItem { text: qsTr(Not set) }

Repeater {
model: ProjectsModel { id: projects }
delegate: MenuItem { text: model.value }
}
}

value: Some Value

onCurrentIndexChanged: {
console.log(currentIndex just changed to : , currentIndex);
}

onCurrentItemChanged: {
console.log(currentItem just changed to : , currentItem.text);
}

onValueChanged: {
console.log(value just changed to : , value);
}
}

And the output :

[D] onValueChanged:159 - value just changed to : Foo
[...]
[D] onCurrentItemChanged:155 - currentItem just changed to : Bar
[D] onCurrentIndexChanged:151 - currentIndex just changed to : 2

What I expected to see :

[D] onValueChanged:159 - value just changed to : Foo
[...]
[D] onCurrentItemChanged:155 - currentItem just changed to : Bar
[D] onCurrentIndexChanged:151 - currentIndex just changed to : 2
[D] onValueChanged:159 - value just changed to : Bar



2. Then I tried to set currentIndex. There, for some reason that I don't 
explain, it seems that the ComboBox always resets :

Component {

// Some other stuff here

ComboBox {
id: project

label: qsTr(Project)
menu: ContextMenu {
MenuItem { text: qsTr(Not set) }

Repeater {
model: ProjectsModel { id: projects }
delegate: MenuItem { text: model.value }
}
}

onCurrentIndexChanged: {
console.log(currentIndex just changed to : , currentIndex);
}

onCurrentItemChanged: {
console.log(currentItem just changed to : , currentItem.text);
}

onValueChanged: {
console.log(value just changed to : , value);
}
}

Component.onCompleted: {
// Here I get the task object from the database.
var task = Storage.getTask(id);

if(task !== null)
{
for(var i=0 ; iprojects.count ; i++)
{
if(task.project === projects.get(i).value)
{
project.currentIndex = i + 1; // We have to +1 because of 
the Not set MenuItem.
break;
}
}
}
}
}

And the output :

[D] onCurrentIndexChanged:151 - currentIndex just changed to : 2
[D] onCurrentIndexChanged:151 - currentIndex just changed to : 0


I also noticed that, in this case, it reverts to 0 because I have a hardcoded 
MenuItem at index 0.
If I remove the first hardcoded Not set MenuItem, ComboBox.currentIndex 
reverts to -1.
If I have only hardcoded MenuItems, it works as expected.



By the way, I think it could be great for the ComboBox to behave like HTML’s 
select :
MenuItem could have a text and a value property. Setting a ComboBox value would 
automatically update currentItem and currentIndex.
Something like this :

ComboBox {
menu: ContextMenu {
MenuItem {
text: qsTr(Some item)
value: some_item
}
MenuItem {
text: qsTr(Another item)
value: another_item
}
}

Component.onCompleted: {
value = another_item; // This would highlight the second item, set 
currentIndex to 1 and currentItem accordingly.
}
}

Of course, one could still set currentIndex or currentItem, and it would update 
everything accordingly.

I'd be glad to work on this if you agree :)


Thanks for your attention.

My best wishes,

-- 
François
___
SailfishOS.org Devel mailing list
To unsubscribe, please send a mail to devel-unsubscr...@lists.sailfishos.org

Re: [SailfishDevel] ComboBox issue (initialization)

2014-09-09 Thread Andrey Kozhevnikov
Hello. You need to set currentIndex after your model data initialized, 
not object. You can initialize at onCountChanged or make special signal 
from signal and listen it.


09.09.2014 19:07, François K. пишет:

Hi :)

I have a ComboBox issue !

The ComboBox I want to use is made of dynamic items. I build it with a 
ListModel and a Repeater as follow :

ComboBox {
 id: project

 label: qsTr(Project)
 menu: ContextMenu {
 MenuItem { text: qsTr(Not set) }

 Repeater {
 model: ProjectsModel { id: projects }
 delegate: MenuItem { text: model.value }
 }
 }
}

It works pretty well (yay QML !).

Now I would like to initialize the ComboBox value. I tried several things (see 
after) and none of them worked.
I hope you guys can give me some help/tip :)



1. First I tried to set its value directly. It doesn't really work well :

   * The text that appears is the good one - OK
   * When I open the ComboBox to chose another value, the highlighted item is 
not the good one (which means that the ComboBox doesn't compute currentIndex 
and currentItem automagically when one set the ComboBox value) ;
   * Moreover, when I select another item in the menu, the currentIndex and 
currentItem are changed as expected, but the value of the ComboBox doesn't 
change.

Here is the code that highlights the problem :

ComboBox {
 id: project

 label: qsTr(Project)
 menu: ContextMenu {
 MenuItem { text: qsTr(Not set) }
 
 Repeater {

 model: ProjectsModel { id: projects }
 delegate: MenuItem { text: model.value }
 }
 }

 value: Some Value

 onCurrentIndexChanged: {
 console.log(currentIndex just changed to : , currentIndex);
 }

 onCurrentItemChanged: {
 console.log(currentItem just changed to : , currentItem.text);
 }

 onValueChanged: {
 console.log(value just changed to : , value);
 }
}

And the output :

[D] onValueChanged:159 - value just changed to : Foo
[...]
[D] onCurrentItemChanged:155 - currentItem just changed to : Bar
[D] onCurrentIndexChanged:151 - currentIndex just changed to : 2

What I expected to see :

[D] onValueChanged:159 - value just changed to : Foo
[...]
[D] onCurrentItemChanged:155 - currentItem just changed to : Bar
[D] onCurrentIndexChanged:151 - currentIndex just changed to : 2
[D] onValueChanged:159 - value just changed to : Bar



2. Then I tried to set currentIndex. There, for some reason that I don't explain, it 
seems that the ComboBox always resets :

Component {

 // Some other stuff here

 ComboBox {
 id: project

 label: qsTr(Project)
 menu: ContextMenu {
 MenuItem { text: qsTr(Not set) }

 Repeater {
 model: ProjectsModel { id: projects }
 delegate: MenuItem { text: model.value }
 }
 }

 onCurrentIndexChanged: {
 console.log(currentIndex just changed to : , currentIndex);
 }

 onCurrentItemChanged: {
 console.log(currentItem just changed to : , currentItem.text);
 }

 onValueChanged: {
 console.log(value just changed to : , value);
 }
 }

 Component.onCompleted: {
 // Here I get the task object from the database.
 var task = Storage.getTask(id);

 if(task !== null)
 {
 for(var i=0 ; iprojects.count ; i++)
 {
 if(task.project === projects.get(i).value)
 {
 project.currentIndex = i + 1; // We have to +1 because of the 
Not set MenuItem.
 break;
 }
 }
 }
 }
}

And the output :

[D] onCurrentIndexChanged:151 - currentIndex just changed to : 2
[D] onCurrentIndexChanged:151 - currentIndex just changed to : 0


I also noticed that, in this case, it reverts to 0 because I have a hardcoded 
MenuItem at index 0.
If I remove the first hardcoded Not set MenuItem, ComboBox.currentIndex 
reverts to -1.
If I have only hardcoded MenuItems, it works as expected.



By the way, I think it could be great for the ComboBox to behave like HTML’s 
select :
MenuItem could have a text and a value property. Setting a ComboBox value would 
automatically update currentItem and currentIndex.
Something like this :

ComboBox {
 menu: ContextMenu {
 MenuItem {
 text: qsTr(Some item)
 value: some_item
 }
 MenuItem {
 text: qsTr(Another item)
 value: another_item
 }
 }

 Component.onCompleted: {
 value = another_item; // This would highlight the second item, set 
currentIndex to 1 and currentItem accordingly.
 }
}

Of course, one could still set currentIndex or currentItem, and it would update 
everything accordingly.

I'd be glad to work on this if you agree :)


Thanks for your