[PB Cocoa] Methods, Tips & Tricks

Mac OSX specific forum
User avatar
Shardik
Addict
Addict
Posts: 1989
Joined: Thu Apr 21, 2005 2:38 pm
Location: Germany

Re: [PB Cocoa] Methods, Tips & Tricks

Post by Shardik »

Change location of tabs in PanelGadget:

Code: Select all

#NSTopTabsBezelBorder    = 0
#NSLeftTabsBezelBorder   = 1
#NSBottomTabsBezelBorder = 2
#NSRightTabsBezelBorder  = 3

OpenWindow(0, 270, 100, 300, 310, "Change tab location")
PanelGadget(0, 10, 10, WindowWidth(0) - 20, 180)
AddGadgetItem (0, -1, "Tab 1")
AddGadgetItem (0, -1, "Tab 2")
CloseGadgetList()
Frame3DGadget(1, 30, 210, WindowWidth(0) - 60, 80, "Tab location")
OptionGadget(2, 130, GadgetY(1) + 20, 80, 20, "Top")
OptionGadget(3, 50, GadgetY(1) + 35, 80, 20, "Left")
OptionGadget(4, 130, GadgetY(1) + 50, 80, 20, "Bottom")
OptionGadget(5, 210, GadgetY(1) + 35, 80, 20, "Right")
SetGadgetState(2, #True)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      SelectedGadget = EventGadget()

      If SelectedGadget >= 2 And SelectedGadget <= 5
        CocoaMessage(0, GadgetID(0), "setTabViewType:", SelectedGadget - 2)
      EndIf
  EndSelect
ForEver
Change color theme of selected tab in PanelGadget:

Code: Select all

If OSVersion() > #PB_OS_MacOSX_10_6
  MessageRequester("Info", "Sorry, but 'setColorTint:' seems to be broken beginning with Lion...")
  End
EndIf

#NSBlueControlTint = 1
#NSClearControlTint = 7

OpenWindow(0, 270, 100, 300, 250, "Change tab selection color")
PanelGadget(0, 10, 10, WindowWidth(0) - 20, 160)
AddGadgetItem (0, -1, "Tab 1")
AddGadgetItem (0, -1, "Tab 2")
CloseGadgetList()
Frame3DGadget(1, 50, 180, WindowWidth(0) - 100, 50, "Tab selection color")
OptionGadget(2, 70, GadgetY(1) + 20, 80, 20, "Blue")
OptionGadget(3, 150, GadgetY(1) + 20, 80, 20, "Graphite")
SetGadgetState(2, #True)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 2
          CocoaMessage(0, GadgetID(0), "setControlTint:", #NSBlueControlTint)
        Case 3
          CocoaMessage(0, GadgetID(0), "setControlTint:", #NSClearControlTint)
      EndSelect
  EndSelect
ForEver
Update: Sorry for all Lion and Mountain Lion users, but the above example doesn't work in all MacOS X versions following Snow Leopard. I therefore added an error message for Lion and newer MacOS X versions. It seems that "setColorTint:" is broken beginning with Lion at least in the NSTabView (PanelGadget) and NSProgressIndicator (ProgressBarGadget):
http://stackoverflow.com/questions/1053 ... int-broken
http://stackoverflow.com/questions/7720 ... -no-effect
User avatar
kenmo
Addict
Addict
Posts: 1967
Joined: Tue Dec 23, 2003 3:54 am

Re: [PB Cocoa] Methods, Tips & Tricks

Post by kenmo »

Hello Wilbert! I don't fully know what CocoaMessage() is doing, but thank you for all these quick and useful examples!
This Sound example plays MP3 for me but it won't seem to load OGG Vorbis... is it possible?

Also there is a significant delay, I think it is loading the whole file into memory, is it possible to stream it instead, similar to the native PB Sound library?

I'm trying to find an alternate method to stream OGG music on Mac... the Sound library crashes in some conditions (I posted a bug report)... tomorrow I will try the Movie library but it's usually not recommended for games I think.
wilbert
PureBasic Expert
PureBasic Expert
Posts: 3870
Joined: Sun Aug 08, 2004 5:21 am
Location: Netherlands

Re: [PB Cocoa] Methods, Tips & Tricks

Post by wilbert »

kenmo wrote:This Sound example plays MP3 for me but it won't seem to load OGG Vorbis... is it possible?

Also there is a significant delay, I think it is loading the whole file into memory, is it possible to stream it instead, similar to the native PB Sound library?
I don't know about other users but I don't experience the delay.

As for playing ogg, that won't work. It uses the decoders built into the system.
It can play MP3 and AAC but to play OGG, you will need the PureBasic commands.
User avatar
kenmo
Addict
Addict
Posts: 1967
Joined: Tue Dec 23, 2003 3:54 am

Re: [PB Cocoa] Methods, Tips & Tricks

Post by kenmo »

About the delay, I should mention I am using it in a 60 FPS game... so even a slight delay can be noticeable.

That's strange that they don't support OGG... it's an open standard and I thought it was pretty common these days.

I think I can get the PB library working properly, but still thanks for your Cocoa example!
wombats
Enthusiast
Enthusiast
Posts: 663
Joined: Thu Dec 29, 2011 5:03 pm

Re: [PB Cocoa] Methods, Tips & Tricks

Post by wombats »

Hi,

I've been trying to download the lib, but the download link (http://www.waterlijn.info/pb/cocoa/CocoaMsg_source.zip) hasn't been working for a few days now. :/
wilbert
PureBasic Expert
PureBasic Expert
Posts: 3870
Joined: Sun Aug 08, 2004 5:21 am
Location: Netherlands

Re: [PB Cocoa] Methods, Tips & Tricks

Post by wilbert »

wombats wrote:Hi,

I've been trying to download the lib, but the download link hasn't been working for a few days now. :/
It works fine when I try it.
Can anyone else confirm the download problem ?
Last edited by wilbert on Wed May 31, 2017 3:11 pm, edited 1 time in total.
Mindphazer
Enthusiast
Enthusiast
Posts: 340
Joined: Mon Sep 10, 2012 10:41 am
Location: Savoie

Re: [PB Cocoa] Methods, Tips & Tricks

Post by Mindphazer »

Working for me too.
MacBook Pro 14" M1 Pro - 16 Gb - MacOS 14 - Iphone 15 Pro Max - iPad at home
...and unfortunately... Windows at work...
wombats
Enthusiast
Enthusiast
Posts: 663
Joined: Thu Dec 29, 2011 5:03 pm

Re: [PB Cocoa] Methods, Tips & Tricks

Post by wombats »

I wonder why it's not working for me, then. D: I've tried several times, with different browsers, and it just won't go.

"Oops! Google Chrome could not connect to http://www.waterlijn.info"

Edit: I just tried it through a proxy, and it downloaded. Thanks for making this!
wilbert
PureBasic Expert
PureBasic Expert
Posts: 3870
Joined: Sun Aug 08, 2004 5:21 am
Location: Netherlands

Re: [PB Cocoa] Methods, Tips & Tricks

Post by wilbert »

Fred will include the command into PureBasic itself in the future so you won't need a separate library anymore.
It will be under a different name since the current name CocoaMessage is not in line with the other PureBasic commands.
In case you already have a lot of code using CocoaMessage when it is added, you can of course use a small macro to use it with its current name or do a search and replace.
wombats
Enthusiast
Enthusiast
Posts: 663
Joined: Thu Dec 29, 2011 5:03 pm

Re: [PB Cocoa] Methods, Tips & Tricks

Post by wombats »

That's good to know.

I downloaded this because I wanted to see if I could get the ListIcon gadget to select items when the gadget is right-clicked. I've looked around online, and I can't seem to get anything to work with CocoaMessage.

I found this (http://stackoverflow.com/questions/7637 ... ight-click), but I'm not sure how to make it work in PB...I've never looked at Cocoa before, so it's all pretty confusing for me. Could you offer any pointers, do you think?
wilbert
PureBasic Expert
PureBasic Expert
Posts: 3870
Joined: Sun Aug 08, 2004 5:21 am
Location: Netherlands

Re: [PB Cocoa] Methods, Tips & Tricks

Post by wilbert »

wombats wrote:I downloaded this because I wanted to see if I could get the ListIcon gadget to select items when the gadget is right-clicked.
Something like this should do the trick but maybe someone knows an easier solution

Code: Select all

EnableExplicit

Define AllowMultipleSelection = #YES

Define CursorLocation.NSPoint
Define ListIconGadgetID.i, SelectedRow.i, IndexSet.i

OpenWindow(0, 200, 100, 430, 125, "ListIcon Example")
ListIconGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 50, "Name", 110)
AddGadgetColumn(0, 1, "Address", GadgetWidth(0) - GetGadgetItemAttribute(0, 0, #PB_ListIcon_ColumnWidth) - 8)
AddGadgetItem(0, -1, "Harry Rannit" + #LF$ + "12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(0, -1, "Ginger Brokeit" + #LF$ + "130 PureBasic Road, BigTown, CodeCity")
AddGadgetItem(0, -1, "Didi Foundit" + #LF$ + "321 Logo Drive, Mouse House, Downtown")

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      If EventGadget() = 0 And EventType() = #PB_EventType_RightClick
        CursorLocation\x = WindowMouseX(0)
        CursorLocation\y = WindowHeight(0) - WindowMouseY(0)
        ListIconGadgetID = GadgetID(0)
        CocoaMessage(@CursorLocation, ListIconGadgetID, "convertPoint:@", @CursorLocation, "fromView:", #nil)
        CocoaMessage(@SelectedRow, ListIconGadgetID, "rowAtPoint:@", @CursorLocation)
        CocoaMessage(@IndexSet, 0, "NSIndexSet indexSetWithIndex:", SelectedRow)
        CocoaMessage(0, ListIconGadgetID, "selectRowIndexes:", IndexSet, "byExtendingSelection:", AllowMultipleSelection)
      EndIf
  EndSelect
ForEver
Edit:
Updated the code so it uses EnableExplicit and added option to specify allowing multiple selection.
Last edited by wilbert on Sat Dec 01, 2012 6:38 pm, edited 2 times in total.
User avatar
Shardik
Addict
Addict
Posts: 1989
Joined: Thu Apr 21, 2005 2:38 pm
Location: Germany

Re: [PB Cocoa] Methods, Tips & Tricks

Post by Shardik »

This is a somewhat simpler approach which doesn't allow multi-selection by a right click like wilbert's example. It determines the location of the right click, converts the location to the row index and simply selects that row with SetGadgetState():

Code: Select all

EnableExplicit

Define CursorLocation.NSPoint
Define RowHeight.CGFloat
Define SelectedRow.I

OpenWindow(0, 200, 100, 430, 96, "ListIcon Example")
ListIconGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20, "Name", 110)
AddGadgetColumn(0, 1, "Address", GadgetWidth(0) - GetGadgetItemAttribute(0, 0, #PB_ListIcon_ColumnWidth) - 8)
AddGadgetItem(0, -1, "Harry Rannit" + #LF$ + "12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(0, -1, "Ginger Brokeit" + #LF$ + "130 PureBasic Road, BigTown, CodeCity")
AddGadgetItem(0, -1, "Didi Foundit" + #LF$ + "321 Logo Drive, Mouse House, Downtown")

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      If EventGadget() = 0 And EventType() = #PB_EventType_RightClick
        CursorLocation\x = WindowMouseX(0)
        CursorLocation\y = WindowHeight(0) - WindowMouseY(0)
        CocoaMessage(@CursorLocation, GadgetID(0), "convertPoint:@", @CursorLocation, "fromView:", 0)
        SelectedRow = CocoaMessage(0, GadgetID(0), "rowAtPoint:@", @CursorLocation)
        SetGadgetState(0, SelectedRow)
      EndIf
  EndSelect
ForEver
Update: I changed the detection of the right mouse click's location from

Code: Select all

        CursorLocation\x = WindowMouseX(0) - GadgetX(0)
        CursorLocation\y = WindowMouseY(0) - GadgetY(0) - 17
        SelectedRow = CocoaMessage(0, GadgetID(0), "rowAtPoint:@", @CursorLocation)
        SetGadgetState(0, SelectedRow)
to Wilbert's updated approach

Code: Select all

        CursorLocation\x = WindowMouseX(0)
        CursorLocation\y = WindowHeight(0) - WindowMouseY(0)
        CocoaMessage(@CursorLocation, GadgetID(0), "convertPoint:@", @CursorLocation, "fromView:", 0)
        SelectedRow = CocoaMessage(0, GadgetID(0), "rowAtPoint:@", @CursorLocation)
        SetGadgetState(0, SelectedRow)
because my previous solution didn't correctly select a row in ListIconGadgets with a scrollbar. Thank you for your hint and heads up via PM, Wilbert!
Last edited by Shardik on Sun Dec 02, 2012 8:40 am, edited 1 time in total.
wombats
Enthusiast
Enthusiast
Posts: 663
Joined: Thu Dec 29, 2011 5:03 pm

Re: [PB Cocoa] Methods, Tips & Tricks

Post by wombats »

Thank you both! That's wonderful.
User avatar
Shardik
Addict
Addict
Posts: 1989
Joined: Thu Apr 21, 2005 2:38 pm
Location: Germany

Re: [PB Cocoa] Methods, Tips & Tricks

Post by Shardik »

Select entire column in ListIconGadget by clicking on column header and get index of selected column:

Code: Select all

OpenWindow(0, 200, 100, 430, 125, "Select entire column by clicking on column header")
ListIconGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 50, "Name", 110)
AddGadgetColumn(0, 1, "Address", GadgetWidth(0) - GetGadgetItemAttribute(0, 0, #PB_ListIcon_ColumnWidth) - 8)
AddGadgetItem(0, -1, "Harry Rannit" + #LF$ + "12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(0, -1, "Ginger Brokeit" + #LF$ + "130 PureBasic Road, BigTown, CodeCity")
AddGadgetItem(0, -1, "Didi Foundit" + #LF$ + "321 Logo Drive, Mouse House, Downtown")
ButtonGadget(1, WindowWidth(0) / 2 - 90, WindowHeight(0) - 30, 180, 25, "Display selected column")

; ----- Allow selection of entire column by clicking on column header
CocoaMessage(0, GadgetID(0), "setAllowsColumnSelection:", #YES)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      If EventGadget() = 1 And EventType() = #PB_EventType_LeftClick
        ; ----- Get selected column
        SelectedColumn = CocoaMessage(0, GadgetID(0), "selectedColumn")

        If SelectedColumn = -1
          Debug "No column is currently selected!"
        Else
          Debug "Column " + Str(SelectedColumn) + " is currently selected!"
        EndIf
      EndIf
  EndSelect
ForEver
wilbert
PureBasic Expert
PureBasic Expert
Posts: 3870
Joined: Sun Aug 08, 2004 5:21 am
Location: Netherlands

Re: [PB Cocoa] Methods, Tips & Tricks

Post by wilbert »

Save an image to a file using png encoding.

Code: Select all

Procedure WriteImageData(File, Image)
  Protected ImageReps = CocoaMessage(0, ImageID(Image), "representations")
  Protected PNGData = CocoaMessage(0, 0, "NSBitmapImageRep representationOfImageRepsInArray:", ImageReps, "usingType:", #NSPNGFileType, "properties:", #nil)
  Protected Length = CocoaMessage(0, PNGData, "length")
  If Length
    ProcedureReturn WriteData(File, CocoaMessage(0, PNGData, "bytes"), Length)  
  Else
    ProcedureReturn -1
  EndIf
EndProcedure


If CreateImage(1, 255, 255)
  StartDrawing(ImageOutput(1))
  For k=0 To 255
    FrontColor(RGB(k,0, k))
    Line(0, k, 255, 1)
  Next
  StopDrawing()
EndIf

If CreateFile(0, "MyImages.dat")
  WriteImageData(0, 1)
  CloseFile(0) 
EndIf
Post Reply