Page 1 of 1

Dynamic #PRIM_MD.Tab

Posted: Mon Mar 21, 2022 5:31 pm
by jimwatterson
I want to add #PRIM_MD.TabItem items to #PRIM_MD.Tab at run time. I don't know how many I will need.

I've tried the code below and, although it executes, I don't see any tabs.

I can't find any examples.

Anyone got any clues.

Evtroutine Handling(#Com_owner.Initialize)

Define_Com Class(#PRIM_MD.TabItem) Name(#newtab) Reference(*DYNAMIC)

#SYS_WEB.Console.Log( 'Init' )

Begin_Loop Using(#x) To(10)

#SYS_WEB.Console.Log( #x.AsString )

#newtab <= *New #PRIM_MD.TabItem
#newtab.Parent <= #tab
#newtab.Caption := #x.AsString
#newtab.DisplayPosition := #x
#newtab.Tabposition := #x
#newtab.Height := 50
#newtab.Width := 100
#newtab.Visible := True

End_Loop

#SYS_WEB.Console.Log( 'End Init' )

Endroutine

End_Com

Re: Dynamic #PRIM_MD.Tab

Posted: Tue Mar 22, 2022 12:39 am
by Dino
Use a collection of tab_items...

Code: Select all

Begin_Com Role(*EXTENDS #PRIM_WEB) Theme(#SYS_THEME<MaterialDesignBlue>)

Define_Com Class(#PRIM_MD.Tab) Name(#Tab) DisplayPosition(1) Height(50) Left(36) Parent(#COM_OWNER) TabPosition(1) ThemeDrawStyle('DarkTitle') Top(68) Width(500)
* Define_Com Class(#PRIM_MD.TabItem) Name(#TabItem) Caption('ITEM 1') DisplayPosition(1) Height(50) Left(0) Parent(#Tab) TabPosition(1) TabStop(True) Top(0)
* Define_Com Class(#PRIM_MD.TabItem) Name(#TabItem1) Caption('ITEM 2') DisplayPosition(2) Height(50) Left(100) Parent(#Tab) TabPosition(2) TabStop(True) Top(0)

Define Field(#x) Type(*Dec) Length(3) Decimals(0)
Define_Com Class(#PRIM_KCOL<#PRIM_MD.TabItem #STD_NUM>) Name(#TabSheets) Reference(*Dynamic) Style(Collection)

Evtroutine Handling(#Com_owner.Initialize)
If_Ref Com(#TabSheets) Is_Not(*null)
Set_Ref Com(#TabSheets) To(*null)
Endif

Set_Ref Com(#TabSheets) To(*Create_as #PRIM_KCOL<#PRIM_MD.TabItem #STD_NUM>)

Begin_Loop Using(#x) To(10)
Set_Ref Com(#TabSheets<#x>) To(*CREATE_AS #PRIM_MD.TabItem)
Set Com(#TabSheets<#x>) Width(50) DisplayPosition(#x) TabPosition(#x) Parent(#Tab) Caption(#x.AsString) Height(50) Visible(True) Left(#x * 50)
End_Loop
Endroutine
End_Com

Re: Dynamic #PRIM_MD.Tab

Posted: Tue Mar 22, 2022 8:21 am
by jimwatterson
Thanks Dino, as usual worked out of the box!

I've added this routine to tell me what has been clicked and it works

Evtroutine Handling(#Tab.Click) Origin(#origin)

Define_Com Class(#PRIM_MD.TabItem) Name(#t) Reference(*DYNAMIC)

#t <= (#origin *As #PRIM_MD.TabItem)

#SYS_WEB.Console.Log( ('selected=' + #t.Caption) )

Endroutine

What I need to do now is select the first item programatically on load but there doesn't seem to be an active item property on the tab or tabitem?

Re: Dynamic #PRIM_MD.Tab

Posted: Tue Mar 22, 2022 9:12 am
by BrendanB
jim,

for a collection:

Code: Select all

*Global collection for the VIEW -- do not define inside a method...
define_com class(#prim_lcol<#prim_md.tabItem>) name(#TabItems)
I would use the ComponentTag (eg #TabItems<1>.ComponentTag ) to set an identifier for the Tab
After creating your TabItems you can do:

Code: Select all

Evtroutine Handling(#TabItems<>.Click) com_sender(#Sender)

* #Sender will be the individual tab item...
case of (#Sender.ComponentTag)
* do what is require for individual tab.
endcase
#com_self.SetActiveTab(#Sender.ComponentTag
endroutine
to 'select' a tab -- you simply need it assigned a VISIBLE VIEW (so if they dont have one, then use #com_self or #com_owner, but make sure to set all the other tabs to *Null.

Code: Select all

mthroutine Named(SetActiveTab)
define_map for(*input) class(#prim_alph) name(#TabIdentifier)

for each(#Entry) in(#TabItems)

#Entry.View <= *Null
if (#Entry.ComponentTag = #TabIdentifier)

#Entry.View <= #com_self
endif
endfor
endroutine