Xojo Conferences
XDCMay2019MiamiUSA

Platforms to show: All Mac Windows Linux Cross-Platform

/MacFrameworks/Image Capture/Camera Browser
Function:
Required plugins for this example: MBS AVFoundation Plugin, MBS MacBase Plugin, MBS MacCF Plugin, MBS MacCG Plugin, MBS MacCocoa Plugin, MBS MacControls Plugin, MBS Main Plugin
You find this example project in your Plugins Download as a Xojo project file within the examples folder: /MacFrameworks/Image Capture/Camera Browser
This example is the version from Wed, 15th Jul 2014.
Project "Camera Browser.rbp"
Class App Inherits Application
Const kEditClear = "&Löschen"
Const kFileQuit = "Beenden"
Const kFileQuitShortcut = ""
End Class
Class MainWindow Inherits Window
Control Label1 Inherits Label
ControlInstance Label1 Inherits Label
End Control
Control List Inherits Listbox
ControlInstance List Inherits Listbox
EventHandler Function CellTextPaint(g As Graphics, row As Integer, column As Integer, x as Integer, y as Integer) As Boolean if column = 0 then dim pic as Picture = me.CellTag(row, column) if pic<>Nil then g.DrawPicture pic, 0, 0, 50, 50, 0, 0, pic.Width, pic.Height Return true end if end if End EventHandler
EventHandler Sub Change() HList.DeleteAllRows FList.DeleteAllRows SyncButton.Enabled = false TakeButton.Enabled = false if me.ListIndex >= 0 then openCamera end if UpdateButtons End EventHandler
End Control
Control tab Inherits TabPanel
ControlInstance tab Inherits TabPanel
End Control
Control HList Inherits Listbox
ControlInstance HList Inherits Listbox
EventHandler Sub Change() UpdateButtons End EventHandler
EventHandler Sub ExpandRow(row As Integer) dim v as Variant = me.RowTag(row) if v isa ICCameraFolderMBS then dim c as ICCameraFolderMBS = v dim items() as ICCameraItemMBS = c.contents for each it as ICCameraItemMBS in items AddItem it next end if End EventHandler
End Control
Control FList Inherits Listbox
ControlInstance FList Inherits Listbox
EventHandler Function CellTextPaint(g As Graphics, row As Integer, column As Integer, x as Integer, y as Integer) As Boolean if column = 0 then dim pic as Picture = me.CellTag(row, column) if pic<>Nil then g.DrawPicture pic, 0, 0, 50, 50, 0, 0, pic.Width, pic.Height Return true end if end if End EventHandler
EventHandler Sub Change() UpdateButtons End EventHandler
End Control
Control SyncButton Inherits PushButton
ControlInstance SyncButton Inherits PushButton
EventHandler Sub Action() dim camera as ICCameraDeviceMBS = selectedCamera if camera<>nil then camera.requestSyncClock end if End EventHandler
End Control
Control TakeButton Inherits PushButton
ControlInstance TakeButton Inherits PushButton
EventHandler Sub Action() dim camera as ICCameraDeviceMBS = selectedCamera if camera<>nil then camera.requestTakePicture end if End EventHandler
End Control
Control DownloadButton Inherits PushButton
ControlInstance DownloadButton Inherits PushButton
EventHandler Sub Action() downloadFiles SelectedFiles End EventHandler
End Control
Control DeleteButton Inherits PushButton
ControlInstance DeleteButton Inherits PushButton
EventHandler Sub Action() deletefiles SelectedFiles End EventHandler
End Control
Control ReadButton Inherits PushButton
ControlInstance ReadButton Inherits PushButton
EventHandler Sub Action() readFiles SelectedFiles End EventHandler
End Control
EventHandler Sub Open() events = new MyImageCaptureEvents DeviceBrowser = new ICDeviceBrowserMBS DeviceBrowser.browsedDeviceTypeMask = Bitwise.BitOr(ICDeviceMBS.ICDeviceLocationTypeMaskLocal, ICDeviceMBS.ICDeviceLocationTypeMaskRemote, ICDeviceMBS.ICDeviceTypeMaskCamera) DeviceBrowser.start FList.ColumnAlignment(2) = Listbox.AlignRight FList.ColumnAlignment(3) = Listbox.AlignRight FList.ColumnAlignment(4) = Listbox.AlignRight FList.ColumnAlignment(5) = Listbox.AlignRight HList.ColumnAlignment(2) = Listbox.AlignRight HList.ColumnAlignment(3) = Listbox.AlignRight HList.ColumnAlignment(4) = Listbox.AlignRight HList.ColumnAlignment(5) = Listbox.AlignRight End EventHandler
Sub AddDevice(camera as ICCameraDeviceMBS) Cameras.Append camera List.AddRow "", camera.Name List.RowTag(List.LastIndex) = camera dim image as CGImageMBS = camera.Icon dim pic as Picture = image.Picture List.CellTag(List.LastIndex,0) = pic End Sub
Sub AddItem(it as ICCameraItemMBS) if it isa ICCameraFolderMBS then dim f as ICCameraFolderMBS = ICCameraFolderMBS(it) dim c as integer = f.contents.Ubound+1 dim size as string = str(c)+" items" if c = 1 then size = "one item" HList.AddFolder "" HList.Cell(HList.LastIndex,1) = f.Name HList.Cell(HList.LastIndex,3) = size HList.RowTag(HList.LastIndex) = f ShowMetaData HList, HList.LastIndex, f ShowThumbnail HList, HList.LastIndex, f elseif it isa ICCameraFileMBS then dim f as ICCameraFileMBS = ICCameraFileMBS(it) dim size as string = str(f.FileSize/1024,"-0")+" KB" HList.AddRow "", f.Name, "", size HList.RowTag(HList.LastIndex) = f ShowThumbnail HList, HList.LastIndex, f ShowMetaData HList, HList.LastIndex, f end if End Sub
Sub CheckCamera() dim camera as ICCameraDeviceMBS = selectedCamera SyncButton.Enabled = Camera.canSyncClock TakeButton.Enabled = Camera.canTakePicture dim files() as ICCameraFileMBS = camera.mediaFiles for each f as ICCameraFileMBS in files dim size as string = str(f.FileSize/1024,"-0")+" KB" FList.AddRow "", f.Name, "", size FList.RowTag(FList.LastIndex) = f ShowMetaData FList, FList.LastIndex, f ShowThumbnail FList, FList.LastIndex, f next dim items() as ICCameraItemMBS = camera.contents for each it as ICCameraItemMBS in items AddItem it next End Sub
Function SelectedFiles() As ICCameraFileMBS() dim files() as ICCameraFileMBS if Tab.Value = 0 then dim u as integer = FList.ListCount-1 for i as integer = 0 to u if FList.Selected(i) then files.Append FList.RowTag(i) end if next else dim u as integer = HList.ListCount-1 for i as integer = 0 to u if HList.Selected(i) then files.Append HList.RowTag(i) end if next end if Return files End Function
Sub ShowMetaData(list as listbox, row as integer, f as ICCameraItemMBS) dim d as Dictionary = f.MetadataIfAvailable if d<>Nil then dim make as string dim model as string dim width as string dim height as string dim datum as string dim Exif as Dictionary = d.Lookup("{Exif}", nil) dim Tiff as Dictionary = d.Lookup("{TIFF}", nil) If Tiff<>nil then make = tiff.Lookup("Make", "") model = tiff.Lookup("Model", "") end if If Exif<>nil then datum = Exif.Lookup("DateTimeOriginal", "") width = Exif.Lookup("PixelWidth", "") height = Exif.Lookup("PixelHeight", "") end if List.Cell(row,2) = datum List.Cell(row,4) = Width List.Cell(row,5) = height List.Cell(row,6) = make List.Cell(row,7) = model end if End Sub
Sub ShowThumbnail(list as listbox, row as integer, f as ICCameraItemMBS) dim image as CGImageMBS = f.thumbnailIfAvailable if image<>nil then dim pic as Picture = image.Picture if pic<>Nil then if FList = list then list.CellTag(row,0) = pic elseif list = HList then list.RowPicture(row) = pic.ProportinalScaled(16,16) end if end if end if End Sub
Sub UpdateButtons() dim l as listbox if tab.Value = 0 then l = FList else l = HList end if if l.SelCount > 0 then DownloadButton.Enabled = true ReadButton.Enabled = true DeleteButton.Enabled = true else DownloadButton.Enabled = false ReadButton.Enabled = false DeleteButton.Enabled = false end if End Sub
Function canDelete() As Boolean dim files() as ICCameraFileMBS = SelectedFiles for each f as ICCameraFileMBS in files if not f.locked then Return true end if next End Function
Function canDownload() As Boolean if HList.SelCount > 0 or FList.SelCount > 0 then Return true end if End Function
Sub deletefiles(files() as ICCameraFileMBS) dim camera as ICCameraDeviceMBS = selectedCamera camera.requestDeleteFiles files End Sub
Sub didReceiveMetadataForItem(item as ICCameraItemMBS) // got metadata or thumbnail dim u as integer = fList.ListCount-1 for i as integer = 0 to u dim f as ICCameraItemMBS = fList.RowTag(i) if f = item then ShowMetaData FList, i, f end if next u = hList.ListCount-1 for i as integer = 0 to u dim f as ICCameraItemMBS = hList.RowTag(i) if f = item then ShowMetaData FList, i, f end if next End Sub
Sub didReceiveThumbnailForItem(item as ICCameraItemMBS) // got metadata or thumbnail dim u as integer = fList.ListCount-1 for i as integer = 0 to u dim f as ICCameraItemMBS = fList.RowTag(i) if f = item then ShowThumbnail FList, i, f end if next u = hList.ListCount-1 for i as integer = 0 to u dim f as ICCameraItemMBS = hList.RowTag(i) if f = item then ShowThumbnail FList, i, f end if next End Sub
Sub didRemoveDevice(d as ICDeviceMBS) dim u as integer = List.ListCount-1 for i as integer = 0 to u if list.RowTag(i) = d then List.RemoveRow i end if next End Sub
Sub didRemoveItems(items() as ICCameraItemMBS) // remove items from both lists dim u as integer = FList.ListCount-1 for i as integer = u downto 0 dim v as Variant = Flist.RowTag(i) if items.IndexOf(v) >= 0 then FList.RemoveRow i end if next u = HList.ListCount-1 for i as integer = u downto 0 dim v as Variant = HList.RowTag(i) if items.IndexOf(v) >= 0 then HList.RemoveRow i end if next End Sub
Sub downloadFiles(files() as ICCameraFileMBS) dim options as new Dictionary dim cfurl as CFURLMBS = NewCFURLMBSFile(SpecialFolder.Desktop) options.Value(ICCameraDeviceMBS.ICDownloadsDirectoryURL) = cfurl for each f as ICCameraFileMBS in files dim d as ICDeviceMBS = f.Device if d isa ICCameraDeviceMBS then dim c as ICCameraDeviceMBS = ICCameraDeviceMBS(d) c.requestDownloadFile f, options end if next End Sub
Sub openCamera() dim camera as ICCameraDeviceMBS = selectedCamera if camera<>Nil then camera.requestOpenSession end if End Sub
Sub readFiles(files() as ICCameraFileMBS) for each f as ICCameraFileMBS in files dim d as ICDeviceMBS = f.Device if d isa ICCameraDeviceMBS then dim c as ICCameraDeviceMBS = ICCameraDeviceMBS(d) c.requestReadDataFromFile f, 0, f.fileSize end if next End Sub
Function selectedCamera() As ICCameraDeviceMBS if List.ListIndex >= 0 then Return List.RowTag(List.ListIndex) end if End Function
Note "Untitled"
Property Cameras() As ICCameraDeviceMBS
Property DeviceBrowser As ICDeviceBrowserMBS
Property events As MyImageCaptureEvents
End Class
MenuBar MenuBar1
MenuItem FileMenu = "&Ablage"
MenuItem FileQuit = "#App.kFileQuit"
MenuItem EditMenu = "&Bearbeiten"
MenuItem EditUndo = "&Rückgängig"
MenuItem UntitledMenu1 = "-"
MenuItem EditCut = "&Ausschneiden"
MenuItem EditCopy = "&Kopieren"
MenuItem EditPaste = "&Einfügen"
MenuItem EditClear = "#App.kEditClear"
MenuItem UntitledMenu0 = "-"
MenuItem EditSelectAll = "&Alles auswählen"
End MenuBar
Class MyImageCaptureEvents Inherits ImageCaptureEventsMBS
EventHandler Sub cameraDeviceDidAddItem(camera as ICCameraDeviceMBS, item as ICCameraItemMBS) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub cameraDeviceDidAddItems(camera as ICCameraDeviceMBS, items() as ICCameraItemMBS) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub cameraDeviceDidBecomeReadyWithCompleteContentCatalog(camera as ICCameraDeviceMBS) System.DebugLog CurrentMethodName MainWindow.CheckCamera End EventHandler
EventHandler Sub cameraDeviceDidChangeCapability(camera as ICCameraDeviceMBS) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub cameraDeviceDidCompleteDeleteFilesWithError(camera as ICCameraDeviceMBS, error as NSErrorMBS) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub cameraDeviceDidDownloadFile(file as ICCameraFileMBS, error as NSErrorMBS, options as Dictionary, device as ICCameraDeviceMBS) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub cameraDeviceDidReadData(data as Memoryblock, file as ICCameraFileMBS, error as NSErrorMBS, device as ICCameraDeviceMBS) System.DebugLog CurrentMethodName dim f as FolderItem = SpecialFolder.Desktop.Child(file.Name) dim b as BinaryStream = BinaryStream.Create(f) b.Write data End EventHandler
EventHandler Sub cameraDeviceDidReceiveDownloadProgressForFile(file as ICCameraFileMBS, downloadedBytes as UInt64, maxBytes as UInt64) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub cameraDeviceDidReceiveMetadataForItem(camera as ICCameraDeviceMBS, item as ICCameraItemMBS) System.DebugLog CurrentMethodName MainWindow.didReceiveMetadataForItem item End EventHandler
EventHandler Sub cameraDeviceDidReceivePTPEvent(camera as ICCameraDeviceMBS, eventData as MemoryBlock) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub cameraDeviceDidReceiveThumbnailForItem(camera as ICCameraDeviceMBS, item as ICCameraItemMBS) System.DebugLog CurrentMethodName MainWindow.didReceiveThumbnailForItem item End EventHandler
EventHandler Sub cameraDeviceDidRemoveItem(camera as ICCameraDeviceMBS, item as ICCameraItemMBS) System.DebugLog CurrentMethodName MainWindow.didRemoveItems array(item) End EventHandler
EventHandler Sub cameraDeviceDidRemoveItems(camera as ICCameraDeviceMBS, items() as ICCameraItemMBS) System.DebugLog CurrentMethodName MainWindow.didRemoveItems items End EventHandler
EventHandler Sub cameraDeviceDidRenameItems(camera as ICCameraDeviceMBS, items() as ICCameraItemMBS) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub cameraDeviceDidSendPTPCommand(command as Memoryblock, data as Memoryblock, response as MemoryBlock, error as NSErrorMBS, device as ICCameraDeviceMBS) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub cameraDeviceDidUploadFile(fileURL as string, file as FolderItem, error as NSErrorMBS, device as ICCameraDeviceMBS) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub deviceBrowserDeviceDidChangeName(browser as ICDeviceBrowserMBS, device as ICDeviceMBS) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub deviceBrowserDeviceDidChangeSharingState(browser as ICDeviceBrowserMBS, device as ICDeviceMBS) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub deviceBrowserDidAddDevice(browser as ICDeviceBrowserMBS, device as ICDeviceMBS, moreComing as boolean) System.DebugLog CurrentMethodName if BitwiseAnd(device.type, device.ICDeviceTypeMaskCamera) = device.ICDeviceTypeMaskCamera then MainWindow.AddDevice ICCameraDeviceMBS(device) end if End EventHandler
EventHandler Sub deviceBrowserDidEnumerateLocalDevices(browser as ICDeviceBrowserMBS) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub deviceBrowserDidRemoveDevice(browser as ICDeviceBrowserMBS, device as ICDeviceMBS, moreGoing as boolean) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub deviceBrowserRequestsSelectDevice(browser as ICDeviceBrowserMBS, device as ICDeviceMBS) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub deviceDidBecomeReady(device as ICDeviceMBS) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub deviceDidChangeName(device as ICDeviceMBS) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub deviceDidChangeSharingState(device as ICDeviceMBS) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub deviceDidCloseSessionWithError(device as ICDeviceMBS, error as NSErrorMBS) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub deviceDidEncounterError(device as ICDeviceMBS, error as NSErrorMBS) System.DebugLog CurrentMethodName MsgBox error.LocalizedDescription End EventHandler
EventHandler Sub deviceDidOpenSessionWithError(device as ICDeviceMBS, error as NSErrorMBS) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub deviceDidReceiveButtonPress(device as ICDeviceMBS, buttonType as String) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub deviceDidReceiveCustomNotification(device as ICDeviceMBS, notification as Dictionary, data as Memoryblock) System.DebugLog CurrentMethodName End EventHandler
EventHandler Sub deviceDidReceiveStatusInformation(device as ICDeviceMBS, status as Dictionary) System.DebugLog CurrentMethodName 'MainWindow.didReceiveStatusInformation Status End EventHandler
EventHandler Sub deviceDidRemove(device as ICDeviceMBS) System.DebugLog CurrentMethodName MainWindow.didRemoveDevice device End EventHandler
EventHandler Sub deviceDidSendMessage(messageCode as UInt32, data as Memoryblock, error as NSErrorMBS, device as ICDeviceMBS) System.DebugLog CurrentMethodName End EventHandler
End Class
Module UtilModule
Sub AddRow(extends p as PopupMenu, text as string, tag as Variant) p.AddRow text p.RowTag(p.ListCount-1) = tag End Sub
Function ProportinalScaled(extends pic as Picture, Width as integer, Height as Integer) As Picture // Calculate scale factor dim faktor as Double = min( Height / Pic.Height, Width / Pic.Width) // Calculate new size dim w as integer = Pic.Width * faktor dim h as integer = Pic.Height * faktor // create new picture dim NewPic as new Picture(w,h,32) // draw picture in the new size NewPic.Graphics.DrawPicture Pic, 0, 0, w, h, 0, 0, Pic.Width, Pic.Height // return result Return NewPic End Function
End Module
FileTypes1
Filetype image/jpeg
End FileTypes1
End Project

See also:

Feedback, Comments & Corrections

The items on this page are in the following plugins: MBS MacFrameworks Plugin.




Links
MBS FileMaker Plugins