Cant find RightClick (TabBarGadget + Scintilla)

Just starting out? Need help? Post your questions and find answers here.
User avatar
rmenezes
User
User
Posts: 14
Joined: Sat Oct 11, 2014 11:28 pm

Cant find RightClick (TabBarGadget + Scintilla)

Post by rmenezes »

Cheers!

I'm still trying to wrap my head around PB. So far, I am very pleased with it.

I seem to have hit a wall here though: In a multi-Scintilla scenario and a TabBarGadget as "switcher", where do I trap the RightClick event? In my app I use this event to start a spellcheck where the caret is. It works fine when I have only one Scintilla instance... Any ideas?

Here is a testbase to illustrate the situation:

Code: Select all

XIncludeFile "TabBarGadget.pbi"
EnableExplicit

#main = 0
#tabs = 999
#sci = 1000

Procedure DoRightClick()
  Debug "[RightClick]"
EndProcedure

Procedure UpdateTabs()
  Protected i, tabSel, sciNum
  tabSel = GetTabBarGadgetItemPosition(#tabs, #TabBarGadgetItem_Selected)
  For i=0 To CountTabBarGadgetItems(#tabs)-1
    sciNum = #sci+i
    If tabSel = i
      HideGadget(sciNum, #False)
      SetActiveGadget(sciNum)
      BindGadgetEvent(sciNum, @DoRightClick(), #PB_Event_RightClick) ; <----- No good.
    Else
      UnbindGadgetEvent(sciNum, @DoRightClick(), #PB_Event_RightClick) ; <----- Maybe no good.
      HideGadget(sciNum, #True)
    EndIf
  Next
EndProcedure

Procedure CreateNewSci()
  Protected tabPos, sciNum, tabName.s
  tabName = "New " + Str(CountTabBarGadgetItems(#tabs)+1)
  tabPos = AddTabBarGadgetItem(#tabs, #PB_Default, tabName)
  sciNum = #sci+tabPos
  ScintillaGadget(sciNum, 0, GadgetHeight(#tabs), WindowWidth(#main), WindowHeight(#main)-GadgetHeight(#tabs), 0)
  SetActiveGadget(sciNum)
  SetTabBarGadgetState(#tabs, tabPos)
EndProcedure

Procedure DoGadgetEvent()
  Select EventType()
    Case #TabBarGadget_EventType_Change
      UpdateTabs()
    Case #TabBarGadget_EventType_NewItem
      CreateNewSci()
  EndSelect
EndProcedure

OpenWindow(#main, 0, 0, 600, 700, "MultiSciTest", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TabBarGadget(#tabs, 0, 0, WindowWidth(#main), #TabBarGadget_DefaultHeight, #TabBarGadget_NoTabMoving | #TabBarGadget_NewTab, #main)
InitScintilla()
CreateNewSci()
BindGadgetEvent(#tabs, @DoGadgetEvent())

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow

End
Sorry if this has been answered before (if so, could anybody point me the way?)

Peace.

Ricardo
Nullius in verba.
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8451
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Re: Cant find RightClick (TabBarGadget + Scintilla)

Post by netmaestro »

Code: Select all

XIncludeFile "TabBarGadget.pbi"

EnableExplicit

#main = 0
#tabs = 999
#sci = 1000

Procedure DoRightClick()
  Debug "[RightClick]"
EndProcedure

Procedure UpdateTabs()
  Protected i, tabSel, sciNum
  tabSel = GetTabBarGadgetItemPosition(#tabs, #TabBarGadgetItem_Selected)
  For i=0 To CountTabBarGadgetItems(#tabs)-1
    sciNum = #sci+i
    If tabSel = i
      HideGadget(sciNum, #False)
      SetActiveGadget(sciNum)
      BindGadgetEvent(sciNum, @DoRightClick(), #PB_Event_RightClick) ; <----- No good.
    Else
      UnbindGadgetEvent(sciNum, @DoRightClick(), #PB_Event_RightClick) ; <----- Maybe no good.
      HideGadget(sciNum, #True)
    EndIf
  Next
EndProcedure

Procedure DoScintillaEvent()                 ;  new line <=========================================================================
  If EventType() = #PB_EventType_RightClick  ;  new line <=========================================================================
    Debug "right click"                      ;  new line <=========================================================================
  EndIf                                      ;  new line <=========================================================================
EndProcedure

Procedure CreateNewSci()
  Protected tabPos, sciNum, tabName.s
  tabName = "New " + Str(CountTabBarGadgetItems(#tabs)+1)
  tabPos = AddTabBarGadgetItem(#tabs, #PB_Default, tabName)
  sciNum = #sci+tabPos
  ScintillaGadget(sciNum, 0, GadgetHeight(#tabs), WindowWidth(#main), WindowHeight(#main)-GadgetHeight(#tabs), 0)
  BindGadgetEvent(sciNum, @DoScintillaEvent())  ;  new line <========================================================================
  SetActiveGadget(sciNum)
  SetTabBarGadgetState(#tabs, tabPos)
EndProcedure

Procedure DoGadgetEvent()
  Select EventType()
    Case #TabBarGadget_EventType_Change
      UpdateTabs()
    Case #TabBarGadget_EventType_NewItem
      CreateNewSci()
  EndSelect
EndProcedure

OpenWindow(#main, 0, 0, 600, 700, "MultiSciTest", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TabBarGadget(#tabs, 0, 0, WindowWidth(#main), #TabBarGadget_DefaultHeight, #TabBarGadget_NoTabMoving | #TabBarGadget_NewTab, #main)
InitScintilla()
CreateNewSci()
BindGadgetEvent(#tabs, @DoGadgetEvent())

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow

End
BERESHEIT
User avatar
rmenezes
User
User
Posts: 14
Joined: Sat Oct 11, 2014 11:28 pm

Re: Cant find RightClick (TabBarGadget + Scintilla)

Post by rmenezes »

Wow!

Grazie Maestro, right on the money.

Ricardo
Nullius in verba.
mestnyi
Addict
Addict
Posts: 1098
Joined: Mon Nov 25, 2013 6:41 am

Re: Cant find RightClick (TabBarGadget + Scintilla)

Post by mestnyi »

You have two errors 1 ) Put "#PB_EventType_RightClick" in place "#PB_Event_RightClick"
and 2) there is an event "#TabBarGadget_EventType_Change", so you should call UpdateTabs () :)
User avatar
rmenezes
User
User
Posts: 14
Joined: Sat Oct 11, 2014 11:28 pm

Re: Cant find RightClick (TabBarGadget + Scintilla)

Post by rmenezes »

@Mestnyi.

But tab events are already being trapped (right before main event loop) :

Code: Select all

Procedure DoGadgetEvent()
  Select EventType()
    Case #TabBarGadget_EventType_Change
      UpdateTabs()
    Case #TabBarGadget_EventType_NewItem
      CreateNewSci()
  EndSelect
EndProcedure

OpenWindow(#main, 0, 0, 600, 700, "MultiSciTest", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TabBarGadget(#tabs, 0, 0, WindowWidth(#main), #TabBarGadget_DefaultHeight, #TabBarGadget_NoTabMoving | #TabBarGadget_NewTab, #main)
InitScintilla()
CreateNewSci()
BindGadgetEvent(#tabs, @DoGadgetEvent()) ; <---------------- trap this gadgets events

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow

End
Is that what you meant?

On thing that the sample code doesn't show is an "UnbindGadgetEvent" trap for when the tab/sci editor is closed. It is there in the final version. I didn't put it here to keep the post clean :)

Thanks for the interest, though.

Ricardo
Nullius in verba.
mestnyi
Addict
Addict
Posts: 1098
Joined: Mon Nov 25, 2013 6:41 am

Re: Cant find RightClick (TabBarGadget + Scintilla)

Post by mestnyi »

No events , that's what I said

Code: Select all

XIncludeFile "TabBarGadget.pbi"
Procedure DoGadgetEvent()
  Select EventType()
    Case #TabBarGadget_EventType_Change
      Debug "NO EVENT"
    Case #TabBarGadget_EventType_NewItem
      
  EndSelect
EndProcedure
#main=1
#tabs=2
OpenWindow(#main, 0, 0, 600, 700, "MultiSciTest", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TabBarGadget(#tabs, 0, 0, WindowWidth(#main), #TabBarGadget_DefaultHeight, #TabBarGadget_NoTabMoving | #TabBarGadget_NewTab, #main)
InitScintilla()

BindGadgetEvent(#tabs, @DoGadgetEvent()) ; <---------------- trap this gadgets events

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow

End
so works, I can not understand what is

Code: Select all

XIncludeFile "TabBarGadget.pbi"
EnableExplicit

#main = 0
#tabs = 999
#sci = 1000

Procedure DoRightClick()
  Debug "[RightClick]"
EndProcedure

Procedure UpdateTabs()
  Protected i, tabSel, sciNum
  tabSel = GetTabBarGadgetItemPosition(#tabs, #TabBarGadgetItem_Selected)
  For i=0 To CountTabBarGadgetItems(#tabs)-1
    sciNum = #sci+i
    If tabSel = i
      HideGadget(sciNum, #False)
      SetActiveGadget(sciNum)
      BindGadgetEvent(sciNum, @DoRightClick(), #PB_EventType_RightClick) ; <----- No good.
    Else
      UnbindGadgetEvent(sciNum, @DoRightClick(), #PB_EventType_RightClick) ; <----- Maybe no good.
      HideGadget(sciNum, #True)
    EndIf
  Next
EndProcedure

Procedure CreateNewSci()
  Protected tabPos, sciNum, tabName.s
  tabName = "New " + Str(CountTabBarGadgetItems(#tabs)+1)
  tabPos = AddTabBarGadgetItem(#tabs, #PB_Default, tabName)
  sciNum = #sci+tabPos
  ScintillaGadget(sciNum, 0, GadgetHeight(#tabs), WindowWidth(#main), WindowHeight(#main)-GadgetHeight(#tabs), 0)
  SetActiveGadget(sciNum)
  SetTabBarGadgetState(#tabs, tabPos)
EndProcedure

Procedure DoGadgetEvent()
  Select EventType()
    Case #TabBarGadget_EventType_Change
      UpdateTabs()
    Case #TabBarGadget_EventType_NewItem
      CreateNewSci()
  EndSelect
EndProcedure

OpenWindow(#main, 0, 0, 600, 700, "MultiSciTest", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TabBarGadget(#tabs, 0, 0, WindowWidth(#main), #TabBarGadget_DefaultHeight, #TabBarGadget_NoTabMoving | #TabBarGadget_NewTab, #main)
InitScintilla()
CreateNewSci()

UpdateTabs() ;<--------

BindGadgetEvent(#tabs, @DoGadgetEvent())

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow

End
User avatar
rmenezes
User
User
Posts: 14
Joined: Sat Oct 11, 2014 11:28 pm

Re: Cant find RightClick (TabBarGadget + Scintilla)

Post by rmenezes »

You're right. Maybe because the inner BindGadgetEvent in UpdateTabs? Anyway, I've cleaned up the code and here is a working version of it:

Code: Select all

XIncludeFile "TabBarGadget.pbi"
EnableExplicit

#main = 0
#tabs = 999
#sci = 1000

Procedure UpdateTabs()
  Protected i, tabSel, sciNum
  tabSel = GetTabBarGadgetItemPosition(#tabs, #TabBarGadgetItem_Selected)
  For i=0 To CountTabBarGadgetItems(#tabs)-1
    sciNum = #sci+i
    If tabSel = i
      HideGadget(sciNum, #False)
      SetActiveGadget(sciNum)
    Else
      HideGadget(sciNum, #True)
    EndIf
  Next
EndProcedure

Procedure DoScintillaEvent()
  If EventType() = #PB_EventType_RightClick
    Debug "Right click on tab "+Str(GetTabBarGadgetItemPosition(#tabs, #TabBarGadgetItem_Selected)+1)
  EndIf
EndProcedure

Procedure CreateNewSci()
  Protected tabPos, sciNum, tabName.s
  tabName = "New " + Str(CountTabBarGadgetItems(#tabs)+1)
  tabPos = AddTabBarGadgetItem(#tabs, #PB_Default, tabName)
  sciNum = #sci+tabPos
  ScintillaGadget(sciNum, 0, GadgetHeight(#tabs), WindowWidth(#main), WindowHeight(#main)-GadgetHeight(#tabs), 0)
  BindGadgetEvent(sciNum, @DoScintillaEvent())
  SetActiveGadget(sciNum)
  SetTabBarGadgetState(#tabs, tabPos)
EndProcedure

Procedure DoGadgetEvent()
  Select EventType()
    Case #TabBarGadget_EventType_Change
      UpdateTabs()
    Case #TabBarGadget_EventType_NewItem
      CreateNewSci()
  EndSelect
EndProcedure

OpenWindow(#main, 0, 0, 600, 700, "MultiSciTest", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TabBarGadget(#tabs, 0, 0, WindowWidth(#main), #TabBarGadget_DefaultHeight, #TabBarGadget_NoTabMoving | #TabBarGadget_NewTab, #main)
InitScintilla()
CreateNewSci()
BindGadgetEvent(#tabs, @DoGadgetEvent())

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow

End
Thanks guys.

Ricardo
Nullius in verba.
Post Reply