It may have been a bit silent the last few weeks around ABMaterial, but behind the scenes I have been working practically around the clock on maybe the biggest new feature since Chipmunk was introduced: Drag & Drop!
In 3.50, it will be possible to drag ABMContainers (and hence about anything in it) from one cell to another.
Let's watch a video demonstration first:
Pretty cool hè!
How it works:
I explain the basics here, the DragDrop demo project included in the ABMaterial 3.50 download will show all tricks shown in the demo video.
1. Page_ParseEvent() gets a little bit of extra code to sync the moves made in the browser with our server
2. Next we define a 'DRAG' group:
3. We add cells to this 'DRAG' group we want to drag & drop between. The last 'null' parameter can be any ABMComponent you want to use a title of the cell (e.g. the COLUMN X ABMLabel in the demo).
4. We add our draggable ABMContainers to the cells. Note: they MUST be added with AddArrayComponent!
Here we also enable them to be draggable with cont.EnableDragDropZone(). There is also a shortcut method to enable/disable all 'Zones/Cells' in a group with cont.EnableDragDropAllZonesFromGroup() in one go.
5. There are three events you will receive (all on Page level):
And this is basically it! Very simple without having to write any HTML, CSS, PHP or Javascript
I'm finishing up ABMaterial 3.50, ABMonitor and ABTreeTableView now and early next week I think I may be able to release it to the donators.
Cheers,
Alain
In 3.50, it will be possible to drag ABMContainers (and hence about anything in it) from one cell to another.
Let's watch a video demonstration first:
Pretty cool hè!
How it works:
I explain the basics here, the DragDrop demo project included in the ABMaterial 3.50 download will show all tricks shown in the demo video.
1. Page_ParseEvent() gets a little bit of extra code to sync the moves made in the browser with our server
B4X:
...
If SubExists(Me, eventName) Then
Params.Remove("eventname")
Params.Remove("eventparams")
' BEGIN NEW DRAGDROP
If eventName = "page_dropped" Then
page.ProcessDroppedEvent(Params)
End If
' END NEW DRAGDROP
Select Case Params.Size
...
2. Next we define a 'DRAG' group:
B4X:
' name, minimum height of a cell
page.DragDropCreateGroup("DRAG", 150)
3. We add cells to this 'DRAG' group we want to drag & drop between. The last 'null' parameter can be any ABMComponent you want to use a title of the cell (e.g. the COLUMN X ABMLabel in the demo).
B4X:
page.DragDropAddZone("DRAG", "DRAGCELL1", page.Cell(3,1),null)
page.DragDropAddZone("DRAG", "DRAGCELL2", page.Cell(3,2),null)
page.DragDropAddZone("DRAG", "DRAGCELL3", page.Cell(3,3),null)
4. We add our draggable ABMContainers to the cells. Note: they MUST be added with AddArrayComponent!
Here we also enable them to be draggable with cont.EnableDragDropZone(). There is also a shortcut method to enable/disable all 'Zones/Cells' in a group with cont.EnableDragDropAllZonesFromGroup() in one go.
B4X:
page.Cell(3,1).AddArrayComponent(CreateCard("1", True, True, True, "I may be dragged everywhere", "../images/list1.jpg"), "Cards")
...
Sub CreateCard(ID As String, AllowInCell1 As Boolean, AllowInCell2 As Boolean, AllowInCell3 As Boolean, Title As String, image As String) As ABMContainer
Dim cont As ABMContainer
cont.Initialize(page, ID, "")
cont.AddRows(1,True,"").AddCells12(1, "")
cont.BuildGrid
cont.IsTextSelectable = False
If AllowInCell1 Then
' can be dragged to zone 1 of 'DRAG'
cont.EnableDragDropZone("DRAG","DRAGCELL1",True)
End If
If AllowInCell2 Then
' can be dragged to zone 2 of 'DRAG'
cont.EnableDragDropZone("DRAG","DRAGCELL2",True)
End If
If AllowInCell3 Then
' can be dragged to zone 3 of 'DRAG'
cont.EnableDragDropZone("DRAG","DRAGCELL3",True)
End If
cont.EnableDragDropZone("DRAG","DRAGCELL4",True) ' for the sidebar
Dim card As ABMCard
card.InitializeAsCard(page, "card", "MY CARD", Title, ABM.CARD_SMALL, "")
card.Image = image
card.AddAction("Press me")
' add the card to the page
cont.Cell(1,1).AddComponent(card)
Return cont
End Sub
5. There are three events you will receive (all on Page level):
B4X:
Sub Page_DragStart(component As String, source As String)
Log("Drag start: " & component)
End Sub
Sub Page_DragCancelled(component As String, source As String)
Log("Drag cancelled: " & component)
End Sub
' there are four parameters: component, source , target, before
Sub Page_Dropped(Params As Map)
Log("Dropped: " & Params.Get("component"))
End Sub
And this is basically it! Very simple without having to write any HTML, CSS, PHP or Javascript
I'm finishing up ABMaterial 3.50, ABMonitor and ABTreeTableView now and early next week I think I may be able to release it to the donators.
Cheers,
Alain