Scrolling
Moderators: FourthWorld, heatherlaine, Klaus, kevinmiller
-
- Posts: 108
- Joined: Mon Mar 20, 2017 5:13 am
Scrolling
Good day,
I've reviewed this livecode lesson:
http://lessons.livecode.com/m/4071/l/44 ... chitecture
I'm currently using this, however if the user selects a pop-up menu it will keep scrolling to the mouseloc. How do I stop the scrolling if the user selects a pop-up menu?
I've reviewed this livecode lesson:
http://lessons.livecode.com/m/4071/l/44 ... chitecture
I'm currently using this, however if the user selects a pop-up menu it will keep scrolling to the mouseloc. How do I stop the scrolling if the user selects a pop-up menu?
-
- VIP Livecode Opensource Backer
- Posts: 7255
- Joined: Sat Apr 08, 2006 8:31 pm
- Location: Minneapolis MN
- Contact:
Re: Scrolling
That lesson needs to be updated, it's 7 years out of date and much has changed since then. You no longer need to set the compositor, tilesize, etc. and it isn't necessary to track mouseMove to determine the scroll.
I'm not at my computer right now but maybe someone here can post an example of the newer method. Once you implement that, the problem may go away, or you can block it if you need to.
I'm not at my computer right now but maybe someone here can post an example of the newer method. Once you implement that, the problem may go away, or you can block it if you need to.
Jacqueline Landman Gay | jacque at hyperactivesw dot com
HyperActive Software | http://www.hyperactivesw.com
HyperActive Software | http://www.hyperactivesw.com
-
- Posts: 108
- Joined: Mon Mar 20, 2017 5:13 am
Re: Scrolling
Thanks for the info, does anyone have an updated version?
-
- VIP Livecode Opensource Backer
- Posts: 7255
- Joined: Sat Apr 08, 2006 8:31 pm
- Location: Minneapolis MN
- Contact:
Re: Scrolling
Sorry for the delay, I meant to post sooner but I've been swamped with work and family. Below are the standard library handlers I use for creating and managing native scrollers on mobile. It does not require you to track mouse events, instead LC sends a "scrollerDidScroll" message to the script that created the scroller, with parameters that indicate the current scroll positions.
If the user taps on another control, you shouldn't get that message at all.
The createScroller handler sets the scroll of the group to 0 before setting up the native scroller. This is needed to align the scroller correctly. After setup, the scroll is returned to original value. There appears to be a problem with that in LC 9.x which I will be submitting a report about, but if you're okay with having the initial scroll at 0 (which is usually the case anyway) then it all works fine.
If the user taps on another control, you shouldn't get that message at all.
Code: Select all
command createScroller pName -- scrolling groups
-- pName = any valid grp identifier, may work on fields too
if not isMobile() then exit CreateScroller
deleteMobileControl pName -- delete any existing
put (the rect of control pName) into tRect
put the hScrollBar of control pName into tHScroller
put the vScrollBar of control pName into tVScroller
put the hScroll of control pName into tHScroll
put the vScroll of control pName into tVScroll
set the hScrollBar of control pName to false -- remove fld scrollbars on mobile
set the vScrollBar of control pName to false
set the hScroll of control pName to 0 -- init before creating native scroller
set the vScroll of control pName to 0
mobileControlCreate "scroller", pName
mobileControlSet pName, "rect", tRect
put ("0,0," & (the formattedwidth of control pName) & "," & the formattedheight of control pName) into tContentRect
mobileControlSet pName, "contentRect", tContentRect
mobileControlSet pName, "hScroll", 0
mobileControlSet pName, "vScroll", 0
mobileControlSet pName, "hIndicator", tHScroller
mobileControlSet pName, "vIndicator", tVScroller
set the hScroll of control pName to tHScroll -- restore orig scroll
set the vScroll of control pName to tVScroll
mobileControlSet pName, "hScroll", tHScroll
mobileControlSet pName, "vScroll", tVScroll
mobileControlSet pName, "visible", true
end createScroller
on scrollerDidScroll pHScroll, pVScroll -- sent by LC when user scrolls
put mobileControlTarget() into tControlID -- short name
set the defaultstack to the topstack
try
set the hscroll of control tControlID to pHScroll
set the vscroll of control tControlID to pVScroll
catch tErr
ANSWER tErr &cr& the executionContexts -- for debugging
end try
end scrollerDidScroll
command deleteAllMobileControls -- delete all everywhere
if not isMobile() then exit deleteAllMobileControls
repeat for each line l in mobileControls()
deleteMobileControl l
end repeat
end deleteAllMobileControls
command deleteMobileControl pName -- deletes a single existing mobile control
-- pName = any valid grp identifier
-- native controls should be deleted when no longer needed
if not isMobile() then exit deleteMobileControl -- do nothing on desktop
repeat while pName is among the lines of mobileControls()
mobileControlDelete pName
end repeat
end deleteMobileControl
function isMobile
return the environment = "mobile"
end isMobile
Jacqueline Landman Gay | jacque at hyperactivesw dot com
HyperActive Software | http://www.hyperactivesw.com
HyperActive Software | http://www.hyperactivesw.com
-
- Posts: 108
- Joined: Mon Mar 20, 2017 5:13 am
Re: Scrolling
Thank you for your help.
What I need to do is figure out how to stop scrolling upon using a control within the scrolling field, then resume upon completion/leave of that control.
What I need to do is figure out how to stop scrolling upon using a control within the scrolling field, then resume upon completion/leave of that control.
-
- VIP Livecode Opensource Backer
- Posts: 7255
- Joined: Sat Apr 08, 2006 8:31 pm
- Location: Minneapolis MN
- Contact:
Re: Scrolling
Controls can't be embedded in a field, so how is the layout arranged exactly? Do you have a control placed on top of the field? Does it move along with the field?
Jacqueline Landman Gay | jacque at hyperactivesw dot com
HyperActive Software | http://www.hyperactivesw.com
HyperActive Software | http://www.hyperactivesw.com
-
- Posts: 108
- Joined: Mon Mar 20, 2017 5:13 am
Re: Scrolling
The control is within the field and moves with it.
-
- VIP Livecode Opensource Backer
- Posts: 7255
- Joined: Sat Apr 08, 2006 8:31 pm
- Location: Minneapolis MN
- Contact:
Re: Scrolling
I probably wasn't clear. I think you must mean that you have a field, and an option button that sits on top of the field. In that case you must have grouped the field and the button together and are scrolling the group.
The script in the LC lesson doesn't account for this setup. The fix is to not use that script and instead use the one I posted. Pass the name of the group as the parameter. So if the name of your group is "my Group" you'd use: createScroller "my Group". The scrollerDidScroll handler will scroll the group normally but will not do anything when the user is touching the menu button.
Call createScroller in a preOpenCard or openCard handler and when you don't need the scroller any more, remove it with deleteMobileControl "my Group".
The script in the LC lesson doesn't account for this setup. The fix is to not use that script and instead use the one I posted. Pass the name of the group as the parameter. So if the name of your group is "my Group" you'd use: createScroller "my Group". The scrollerDidScroll handler will scroll the group normally but will not do anything when the user is touching the menu button.
Call createScroller in a preOpenCard or openCard handler and when you don't need the scroller any more, remove it with deleteMobileControl "my Group".
Jacqueline Landman Gay | jacque at hyperactivesw dot com
HyperActive Software | http://www.hyperactivesw.com
HyperActive Software | http://www.hyperactivesw.com
-
- Posts: 108
- Joined: Mon Mar 20, 2017 5:13 am
Re: Scrolling
Lol, still having trouble.
Code: Select all
command createScroller RegisterGroup -- scrolling groups
-- "RegisterGroup" = any valid grp identifier, may work on fields too
if not isMobile() then exit CreateScroller
deleteMobileControl "RegisterGroup" -- delete any existing
put (the rect of control "RegisterGroup") into tRect
put the hScrollBar of control "RegisterGroup" into tHScroller
put the vScrollBar of control "RegisterGroup" into tVScroller
put the hScroll of control "RegisterGroup" into tHScroll
put the vScroll of control "RegisterGroup" into tVScroll
set the hScrollBar of control "RegisterGroup" to false -- remove fld scrollbars on mobile
set the vScrollBar of control "RegisterGroup" to false
set the hScroll of control "RegisterGroup" to 0 -- init before creating native scroller
set the vScroll of control "RegisterGroup" to 0
mobileControlCreate "scroller", "RegisterGroup"
mobileControlSet "RegisterGroup", "rect", tRect
put ("0,0," & (the formattedwidth of control "RegisterGroup") & "," & the formattedheight of control "RegisterGroup") into tContentRect
mobileControlSet "RegisterGroup", "contentRect", tContentRect
mobileControlSet "RegisterGroup", "hScroll", 0
mobileControlSet "RegisterGroup", "vScroll", 0
mobileControlSet "RegisterGroup", "hIndicator", tHScroller
mobileControlSet "RegisterGroup", "vIndicator", tVScroller
set the hScroll of control "RegisterGroup" to tHScroll -- restore orig scroll
set the vScroll of control "RegisterGroup" to tVScroll
mobileControlSet "RegisterGroup", "hScroll", tHScroll
mobileControlSet "RegisterGroup", "vScroll", tVScroll
mobileControlSet "RegisterGroup", "visible", true
end createScroller
on scrollerDidScroll pHScroll, pVScroll -- sent by LC when user scrolls
put mobileControlTarget() into tControlID -- short name
set the defaultstack to the topstack
try
set the hscroll of control tControlID to pHScroll
set the vscroll of control tControlID to pVScroll
catch tErr
ANSWER tErr &cr& the executionContexts -- for debugging
end try
end scrollerDidScroll
command deleteAllMobileControls -- delete all everywhere
if not isMobile() then exit deleteAllMobileControls
repeat for each line l in mobileControls()
deleteMobileControl l
end repeat
end deleteAllMobileControls
command deleteMobileControl RegisterGroup -- deletes a single existing mobile control
-- "RegisterGroup" = any valid grp identifier
-- native controls should be deleted when no longer needed
if not isMobile() then exit deleteMobileControl -- do nothing on desktop
repeat while "RegisterGroup" is among the lines of mobileControls()
mobileControlDelete RegisterGroup
end repeat
end deleteMobileControl
function isMobile
return the environment = "mobile"
end isMobile
-
- VIP Livecode Opensource Backer
- Posts: 7255
- Joined: Sat Apr 08, 2006 8:31 pm
- Location: Minneapolis MN
- Contact:
Re: Scrolling
What doesn't work exactly? I did notice you've mixed up variables and literals a bit but that should only affect the deleteMobileControl handler in this case.
The handlers were meant to use variables everywhere but if you want to use quoted literals instead then they should be consistent.
The handlers were meant to use variables everywhere but if you want to use quoted literals instead then they should be consistent.
Jacqueline Landman Gay | jacque at hyperactivesw dot com
HyperActive Software | http://www.hyperactivesw.com
HyperActive Software | http://www.hyperactivesw.com
-
- VIP Livecode Opensource Backer
- Posts: 4013
- Joined: Sun Jan 07, 2007 9:12 pm
- Location: Bochum, Germany
Re: Scrolling
Hi Quinton,
in your code
you put the parameter RegisterGroup in quotes. That assumes you have a group named "RegisterGroup".
I think what you want is to create a scroller for the group passed as parameter to command createScroller. If you quote "RegisterGroup" this is not the parameter passed but the literal "RegisterGroup".
That is what Jacque is alluding to in her reply except she pointed to only to the deleteMobileControl handler. But you also do it in the createScroller handler.
to call command createScroller you could create the parameter like this
Try to remove the quotes from RegisterGroup.
Kind regards
Bernd
in your code
Code: Select all
command createScroller RegisterGroup -- scrolling groups
-- "RegisterGroup" = any valid grp identifier, may work on fields too
if not isMobile() then exit CreateScroller
deleteMobileControl "RegisterGroup" -- delete any existing
put (the rect of control "RegisterGroup") into tRect
put the hScrollBar of control "RegisterGroup" into tHScroller
put the vScrollBar of control "RegisterGroup" into tVScroller
put the hScroll of control "RegisterGroup" into tHScroll
put the vScroll of control "RegisterGroup" into tVScroll
I think what you want is to create a scroller for the group passed as parameter to command createScroller. If you quote "RegisterGroup" this is not the parameter passed but the literal "RegisterGroup".
That is what Jacque is alluding to in her reply except she pointed to only to the deleteMobileControl handler. But you also do it in the createScroller handler.
to call command createScroller you could create the parameter like this
Code: Select all
put "id" && the id of control "myControl" into tRegisterGroup
createScroller tRegisterGroup -- invoke createScroller
Kind regards
Bernd