slint-ui / slint

Slint is a declarative GUI toolkit to build native user interfaces for Rust, C++, or JavaScript apps.
https://slint.dev
Other
16.93k stars 568 forks source link

`double-clicked` adds visible delay to `clicked` callback #4235

Closed qarmin closed 8 months ago

qarmin commented 8 months ago

Slint nightly

Enabling double-clicked callback slows down clicked callback which is called a lot of later than alone

https://github.com/slint-ui/slint/assets/41945903/089a0cb0-6cac-4742-a18c-64c489768a03

CODE - not works in web, because it is version 1.3.2, but double-clicked is available in newer version

ogoffart commented 8 months ago

This is documented in the documentation: https://slint.dev/snapshots/master/docs/slint/src/language/builtins/elements#toucharea

  • double-clicked(): Invoked when double-clicked. The mouse is pressed and released twice on this element in a short period of time. Assigning this callback will cause the clicked callback to get delayed, so that Slint can detect whether the first click was a click or the first half of a double click.

We discussed this and thought this was the best course of action because we didn't want the clicked callback to be emitted if the user double clicked. Perhaps we should also emit the clicked directly if the mouse is moved though. @hunger: thought?

If you really want to react to clicks as well, then using the pointer-event might be the way.

not works in web, because it is version 1.3.2, but double-clicked is available in newer version

FYI, you can use the snapshots/master URL: [Code](https://slint.dev/snapshots/master/editor/?snippet=import+{+Button%2C+VerticalBox+%2C+HorizontalBox%2C+TabWidget%2C+ListView%2C+StandardListView%2C+StandardTableView%2C+CheckBox%2C+ScrollView}+from+%22std-widgets.slint%22%3B%0A%0Aexport+component+SelectableTableView+inherits+Rectangle+{%0A++++callback+item_opened(string)%3B%0A++++in+property+%3C[string]%3E+columns%3B%0A++++in-out+property+%3C[{checked%3A+bool%2C+selected_row%3Abool%2C+header_row%3Abool%2C+val%3A+[string]}]%3E+values%3A+[%0A++++++++{checked%3A+false%2C+selected_row%3A+false%2C+header_row%3A+true%2C+val%3A+[%22kropkarz%22%2C+%22%2FXd1%22%2C+%2224.10.2023%22]}+%2C%0A++++++++{checked%3A+false%2C+selected_row%3A+false%2C+header_row%3A+false%2C+val%3A+[%22witasphere%22%2C+%22%2FXd1%2FImagerren2%22%2C+%2225.11.1991%22]}+%2C%0A++++++++{checked%3A+false%2C+selected_row%3A+false%2C+header_row%3A+false%2C+val%3A+[%22witasphere%22%2C+%22%2FXd1%2FImagerren2%22%2C+%2225.11.1991%22]}+%2C%0A++++++++{checked%3A+true%2C+selected_row%3A+false%2C+header_row%3A+false%2C+val%3A+[%22lokkaler%22%2C+%22%2FXd1%2FVide2%22%2C+%2201.23.1911%22]}%0A++++]%3B%0A++++in-out+property+%3C[length]%3E+column_sizes%3A+[30px%2C+80px%2C+150px%2C+160px]%3B%0A++++private+property+%3Cint%3E+column_number%3A+column-sizes.length+%2B+1%3B%0A++++%2F%2F+This+idx%2C+starts+from+zero%2C+but+since+first+is+always+a+checkbox%2C+and+is+not+in+model.val+values%2C+remove+1+from+idx%0A++++in-out+property+%3Cint%3E+parentPathIdx%3B%0A++++in-out+property+%3Cint%3E+fileNameIdx%3B%0A++++in-out+property+%3Cint%3E+selected_item%3A+-1%3B%0A++++out+property+%3Clength%3E+list_view_width%3A+max(self.width+-+20px%2C+column_sizes[0]+%2B+column_sizes[1]+%2B+column_sizes[2]+%2B+column_sizes[3]+%2B+column_sizes[4]+%2B+column_sizes[5]+%2B+column_sizes[6]+%2B+column_sizes[7]+%2B+column_sizes[8]+%2B+column_sizes[9]+%2B+column_sizes[10]+%2B+column_sizes[11])%3B%0A%0A++++VerticalBox+{%0A++++++++padding%3A+0px%3B%0A++++++++ScrollView+{%0A++++++++++++height%3A+30px%3B%0A++++++++++++viewport-x+%3C%3D%3E+list_view.viewport-x%3B%0A++++++++++++vertical-stretch%3A+0%3B%0A%0A++++++++++++HorizontalLayout+{%0A++++++++++++++++spacing%3A+5px%3B%0A++++++++++++++++for+title+[idx]+in+root.columns%3A+HorizontalLayout+{%0A++++++++++++++++++++width%3A+root.column-sizes[idx]%3B%0A++++++++++++++++++++Text+{%0A++++++++++++++++++++++++overflow%3A+elide%3B%0A++++++++++++++++++++++++text%3A+title%3B%0A++++++++++++++++++++}%0A%0A++++++++++++++++++++Rectangle+{%0A++++++++++++++++++++++++width%3A+1px%3B%0A++++++++++++++++++++++++background%3A+gray%3B%0A++++++++++++++++++++++++TouchArea+{%0A++++++++++++++++++++++++++++width%3A+5px%3B%0A++++++++++++++++++++++++++++x%3A+(parent.width+-+self.width)+%2F+2%3B%0A++++++++++++++++++++++++++++property+%3Clength%3E+cached%3B%0A++++++++++++++++++++++++++++pointer-event(event)+%3D%3E+{%0A++++++++++++++++++++++++++++++++if+(event.button+%3D%3D+PointerEventButton.left+%26%26+event.kind+%3D%3D+PointerEventKind.down)+{%0A++++++++++++++++++++++++++++++++++++self.cached+%3D+root.column_sizes[idx]%3B%0A++++++++++++++++++++++++++++++++}%0A++++++++++++++++++++++++++++}%0A++++++++++++++++++++++++++++moved+%3D%3E+{%0A++++++++++++++++++++++++++++++++if+(self.pressed)+{%0A++++++++++++++++++++++++++++++++++++root.column_sizes[idx]+%2B%3D+(self.mouse-x+-+self.pressed-x)%3B%0A++++++++++++++++++++++++++++++++++++if+(root.column_sizes[idx]+%3C+20px)+{%0A++++++++++++++++++++++++++++++++++++++++root.column_sizes[idx]+%3D+20px%3B%0A++++++++++++++++++++++++++++++++++++}%0A++++++++++++++++++++++++++++++++}%0A++++++++++++++++++++++++++++}%0A++++++++++++++++++++++++++++mouse-cursor%3A+ew-resize%3B%0A++++++++++++++++++++++++}%0A++++++++++++++++++++}%0A++++++++++++++++}%0A++++++++++++}%0A++++++++}%0A%0A++++++++list_view+%3A%3D+ListView+{%0A++++++++++++padding%3A+0px%3B%0A++++++++++++min-width%3A+100px%3B%0A++++++++++++for+r+[idx]+in+root.values%3A+Rectangle+{%0A++++++++++++++++width%3A+list_view_width%3B%0A++++++++++++%0A++++++++++++++++border-radius%3A+5px%3B%0A++++++++++++++++height%3A+20px%3B%0A++++++++++++++++background%3A+r.header-row+%3Fred+%3A+(r.selected-row+%3F+blue+%3A+yellow)%3B%0A++++++++++++++++touch_area+%3A%3D+TouchArea+{%0A++++++++++++++++++++clicked+%3D%3E+{%0A++++++++++++++++++++++++debug(%22Clicked%22)%3B%0A++++++++++++++++++++++++if+(!r.header_row)+{%0A++++++++++++++++++++++++++++r.selected_row+%3D+!r.selected_row%3B%0A++++++++++++++++++++++++++++if+(root.selected-item+%3D%3D+-1)+{%0A++++++++++++++++++++++++++++++++root.selected-item+%3D+idx%3B%0A++++++++++++++++++++++++++++}+else+{%0A++++++++++++++++++++++++++++++++if+(r.selected_row+%3D%3D+true)+{%0A++++++++++++++++++++++++++++++++++++root.values[root.selected-item].selected_row+%3D+false%3B%0A++++++++++++++++++++++++++++++++++++root.selected-item+%3D+idx%3B%0A++++++++++++++++++++++++++++++++}+else+{%0A++++++++++++++++++++++++++++++++++++%2F%2F+root.selected-item+%3D+-1%3B+%2F%2F+TODO+check+if+this+can+be+disabled+-+looks+that+GTK+not+allows+to+unselect+item%0A++++++++++++++++++++++++++++++++}%0A++++++++++++++++++++++++++++}%0A%0A++++++++++++++++++++++++}%0A++++++++++++++++++++}%0A++++++++++++++++++++double-clicked+%3D%3E+{%0A++++++++++++++++++++++++debug(%22Double%22)%3B%0A++++++++++++++++++++++++%2F%2F+TODO+Double+click+is+not+available+for+right+click+button%0A++++++++++++++++++++++++%2F%2F+Callabler.item_opened(r.val[root.parentPathIdx+-+1]+%2B+%22%2F%22+%2B+r.val[root.fileNameIdx+-+1])%0A++++++++++++++++++++}%0A++++++++++++++++}%0A%0A++++++++++++++++HorizontalLayout+{%0A++++++++++++++++++++CheckBox+{%0A++++++++++++++++++++++++visible%3A+!r.header-row%3B%0A++++++++++++++++++++++++checked%3A+r.checked+%26%26+!r.header-row%3B%0A++++++++++++++++++++++++width%3A+root.column-sizes[0]%3B%0A++++++++++++++++++++++++toggled+%3D%3E+{%0A++++++++++++++++++++++++++++r.checked+%3D+self.checked%3B%0A++++++++++++++++++++++++}%0A++++++++++++++++++++}%0A%0A++++++++++++++++++++HorizontalLayout+{%0A++++++++++++++++++++++++spacing%3A+5px%3B%0A++++++++++++++++++++++++for+f+[idx]+in+r.val%3A+Text+{%0A++++++++++++++++++++++++++++width%3A+root.column-sizes[idx+%2B+1]%3B%0A++++++++++++++++++++++++++++text%3A+f%3B%0A++++++++++++++++++++++++++++font-size%3A+12px%3B%0A++++++++++++++++++++++++++++vertical-alignment%3A+center%3B%0A++++++++++++++++++++++++++++overflow%3A+elide%3B%0A++++++++++++++++++++++++}%0A++++++++++++++++++++}%0A++++++++++++++++}%0A++++++++++++}%0A++++++++}%0A++++}%0A%0A++++public+function+deselect_selected_item()+{%0A++++++++if+(root.selected_item+!%3D+-1)+{%0A++++++++++++root.values[root.selected-item].selected_row+%3D+false%3B%0A++++++++++++root.selected-item+%3D+-1%3B%0A++++++++}%0A++++}%0A%0A++++%2F%2F+TODO+this+should+work+with+multiple+selection+and+shift+and+control+key+-+problably+logic+will+need+to+be+set+in+global+state%0A++++public+function+released_key(event%3A+KeyEvent)+{%0A++++++++if+(event.text+%3D%3D+%22+%22)+{%0A++++++++++++if+(root.selected_item+!%3D+-1)+{%0A++++++++++++++++root.values[root.selected_item].checked+%3D+!root.values[root.selected_item].checked%3B%0A++++++++++++}%0A++++++++}+else+if+(event.text+%3D%3D+Key.DownArrow)+{%0A++++++++++++if+(root.selected_item+!%3D+-1)+{%0A++++++++++++++++if+(root.values.length+-+1+%3D%3D+root.selected_item)+{%0A++++++++++++++++++++%2F%2F+Last+element%2C+so+unselect+it%0A++++++++++++++++++++root.values[root.selected_item].selected_row+%3D+false%3B%0A++++++++++++++++++++root.selected_item+%3D+-1%3B%0A++++++++++++++++}+else+{%0A++++++++++++++++++++%2F%2F+Select+next+item%2C+if+next+item+is+header+row%2C+then+select+second%0A++++++++++++++++++++%2F%2F+This+should+be+safe%2C+because+header+row+should+never+be+last+item%0A++++++++++++++++++++root.values[root.selected_item].selected_row+%3D+false%3B%0A++++++++++++++++++++if+(root.values[root.selected_item+%2B+1].header_row)+{%0A++++++++++++++++++++++++root.selected_item+%2B%3D+2%3B%0A++++++++++++++++++++}+else+{%0A++++++++++++++++++++++++root.selected_item+%2B%3D+1%3B%0A++++++++++++++++++++}%0A++++++++++++++++++++root.values[root.selected_item].selected_row+%3D+true%3B%0A++++++++++++++++}%0A++++++++++++}+else+{%0A++++++++++++++++%2F%2F+Select+last+item+if+nothing+is+selected%0A++++++++++++++++if+(root.values.length+%3E+0)+{%0A++++++++++++++++++++if+(root.values[0].header_row)+{%0A++++++++++++++++++++++++root.selected_item+%3D+1%3B%0A++++++++++++++++++++}+else+{%0A++++++++++++++++++++++++root.selected_item+%3D+0%3B%0A++++++++++++++++++++}%0A++++++++++++++++++++root.values[root.selected_item].selected_row+%3D+true%3B%0A++++++++++++++++}%0A++++++++++++}%0A++++++++}+else+if+(event.text+%3D%3D+Key.UpArrow)+{%0A++++++++++++if+(root.selected_item+!%3D+-1)+{%0A++++++++++++++++if+(root.selected_item+%3D%3D+0)+{%0A++++++++++++++++++++%2F%2F+First+element%2C+so+unselect+it%0A++++++++++++++++++++root.values[root.selected_item].selected_row+%3D+false%3B%0A++++++++++++++++++++root.selected_item+%3D+-1%3B%0A++++++++++++++++}+else+{%0A++++++++++++++++++++root.values[root.selected_item].selected_row+%3D+false%3B%0A++++++++++++++++++++%2F%2F+Select+previous+item%2C+if+previous+item+is+header+row%2C+then+select+second+previous+item%0A++++++++++++++++++++%2F%2F+This+is+safe%2C+because+if+there+is+non+header+row+upper%2C+then+can+be+easily+selected%2C%0A++++++++++++++++++++%2F%2F+but+otherwise+is+done+-2+which+for+1+(smallest+possible+item+to+set+with+header+row)+gives+-1%2C+so+gives%0A++++++++++++++++++++%2F%2F+this+non+selected+row%0A++++++++++++++++++++if+(root.values[root.selected_item+-+1].header_row)+{%0A++++++++++++++++++++++++root.selected_item+-%3D+2%3B%0A++++++++++++++++++++}+else+{%0A++++++++++++++++++++++++root.selected_item+-%3D+1%3B%0A++++++++++++++++++++}%0A++++++++++++++++++++if+(root.selected_item+!%3D+-1)+{%0A++++++++++++++++++++++++root.values[root.selected_item].selected_row+%3D+true%3B%0A++++++++++++++++++++}%0A++++++++++++++++}%0A++++++++++++}+else+{%0A++++++++++++++++%2F%2F+Select+last+item+if+nothing+is+selected%0A++++++++++++++++if+(root.values.length+%3E+0)+{%0A++++++++++++++++++++root.selected_item+%3D+root.values.length+-+1%3B%0A++++++++++++++++++++root.values[root.selected_item].selected_row+%3D+true%3B%0A++++++++++++++++}%0A++++++++++++}%0A++++++++}%0A++++}%0A}%0A&style=native)

ogoffart commented 8 months ago

@tronical and I had a discussion internally , and we came to the conclusion that preventing the clicked to be fired was probably a bad idea.

Se we're going to change the behavior so that clicked is always emited (twice) on double click. (So we'd have clicked, clicked, double-clicked). This seems to align with what other framework are doing.

hunger commented 8 months ago

This should be fixed now. Thank you for your patience.