アラートダイアログ上にNSBrowserとMkMapViewを表示するサンプルScriptです。アーケードゲーム「戦場の絆II」を置いてある日本国内のゲームセンターを地図上に表示します。
以前のバージョンでは、前作「戦場の絆」の導入店舗を地図表示していましたが、サービス終了にともない、動作しなくなっていました。そこで、続編である「戦場の絆II」の導入店舗一覧を取得・表示するように書き換えました。
Webサイトへの問い合わせ+地図表示を行うために、インターネット接続が必要です。また、データ取得用のライブラリが別途必要なため、動作確認のためには、以下のスクリプトバンドルをまるごと(ライブラリ入り)ダウンロードして実行する必要があります。
–> Download Script with Library
AppleScript名:アラートダイアログ上にBrowser+Map Viewを表示 v3(絆II).scptd |
— – Created by: Takaaki Naganoya – Created on: 2022/07/27 — – Copyright © 2019-2022 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use framework "AppKit" use framework "MapKit" use scripting additions use skLib : script "senjoNoKizunaLib" property NSView : a reference to current application’s NSView property NSAlert : a reference to current application’s NSAlert property NSColor : a reference to current application’s NSColor property NSBrowser : a reference to current application’s NSBrowser property MKMapView : a reference to current application’s MKMapView property NSScrollView : a reference to current application’s NSScrollView property NSMutableArray : a reference to current application’s NSMutableArray property MKMapTypeHybrid : a reference to current application’s MKMapTypeHybrid property MKMapTypeSatellite : a reference to current application’s MKMapTypeSatellite property MKMapTypeStandard : a reference to current application’s MKMapTypeStandard property NSSegmentedControl : a reference to current application’s NSSegmentedControl property NSRunningApplication : a reference to current application’s NSRunningApplication property NSAlertSecondButtonReturn : a reference to current application’s NSAlertSecondButtonReturn property NSSegmentStyleTexturedRounded : a reference to current application’s NSSegmentStyleTexturedRounded property zLevel : 17 property aMaxViewWidth : 1200 property aMaxViewHeight : 600 property theResult : 0 property returnCode : 0 property theDataSource : {} property aSelection : {} property aMapView : missing value property aBrowser : missing value property skDataList : {} property prefList : {"北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県", "茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県", "新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", "岐阜県", "静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府", "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県", "徳島県", "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県"} –if my skDataList = {} then set my skDataList to current application’s NSMutableArray’s arrayWithArray:(getSenjoNokizunaGameCenterDataList() of skLib) –end if set tmpLen to length of (my skDataList as list) set aSelection to {} set paramObj to {myMessage:"Choose a Game Center", mySubMessage:("Choose an appropriate Game Center from list (" & tmpLen as string) & ") to play Senjo-no-Kizuna"} my performSelectorOnMainThread:"chooseItemByBrowser:" withObject:(paramObj) waitUntilDone:true if (my returnCode as number) = 1001 then error number -128 return my aSelection –> {loc_id:"QIEXj9er5QSA_Y42-OjPNg", gcName:"THE 3RD PLANET ジャングルパーク鹿児島", latitude:31.5703088, longitude:130.5653137, address:"鹿児島県 鹿児島市 与次郎 1-11-1 フレスポジャングルパーク2F"} on chooseItemByBrowser:paramObj set aMainMes to myMessage of paramObj set aSubMes to mySubMessage of paramObj — create a view set theView to NSView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, aMaxViewWidth, aMaxViewHeight)) set aMapView to MKMapView’s alloc()’s initWithFrame:(current application’s NSMakeRect(410, 30, aMaxViewWidth – 410, aMaxViewHeight – 30)) tell aMapView its setMapType:(MKMapTypeStandard) its setZoomEnabled:true its setScrollEnabled:true its setPitchEnabled:true its setRotateEnabled:true its setShowsCompass:true its setShowsZoomControls:true its setShowsScale:true its setShowsUserLocation:true its setDelegate:me end tell — make browser view with scroll view set aScrollWithTable to makeBrowserView(prefList, 400, aMaxViewHeight) of me –Segmented Controlをつくる set segTitleList to {"Map", "Satellite", "Satellite + Map"} set aSeg to makeSegmentedControl(segTitleList, 410, 0, 150, 20) of me –Compose Views in NSView theView’s setSubviews:{aScrollWithTable, aMapView, aSeg} –Move to frontmost (By edama2) current application’s NSApplication’s sharedApplication()’s setActivationPolicy:(current application’s NSApplicationActivationPolicyRegular) current application’s NSApp’s activateIgnoringOtherApps:(true) — set up alert set theAlert to NSAlert’s alloc()’s init() tell theAlert its setMessageText:aMainMes its setInformativeText:aSubMes its addButtonWithTitle:"OK" its addButtonWithTitle:"Cancel" its setAccessoryView:theView end tell — show alert in modal loop NSRunningApplication’s currentApplication()’s activateWithOptions:0 my performSelectorOnMainThread:"doModal:" withObject:(theAlert) waitUntilDone:true end chooseItemByBrowser: on doModal:aParam set (my returnCode) to aParam’s runModal() end doModal: on makeBrowserView(aList as list, aWidth as number, aHeight as number) set (my theDataSource) to NSMutableArray’s arrayWithArray:aList set aScroll to NSScrollView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, aWidth, aHeight)) set aBrowser to NSBrowser’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, aWidth, aHeight)) aBrowser’s setDelegate:(me) aBrowser’s setTarget:(me) aBrowser’s setAction:"browserCellSelected:" aBrowser’s setMinColumnWidth:120 aBrowser’s setSeparatesColumns:true aBrowser’s setMaxVisibleColumns:2 aBrowser’s setAutohidesScroller:true aBrowser’s setTakesTitleFromPreviousColumn:true –aBrowser’s setBackgroundColor:(NSColor’s greenColor()) aScroll’s setDocumentView:aBrowser aBrowser’s enclosingScrollView()’s setHasHorizontalScroller:true aBrowser’s enclosingScrollView()’s setHasVerticalScroller:true return aScroll end makeBrowserView –NSBrowser Event Handlers on browser:aView numberOfRowsInColumn:aColumn if aColumn = 0 then return my theDataSource’s |count|() else if aColumn = 1 then set aPath to (text 2 thru -1 of ((aView’s |path|()) as string)) as string –ここが問題だったもよう set tmpArray to (my filterRecListByLabel1(skDataList, "address BEGINSWITH ’" & aPath & "’")) as list return (length of tmpArray) else return 0 end if end browser:numberOfRowsInColumn: on browser:aView willDisplayCell:(aCell) atRow:(rowIndex as integer) column:(colIndex as integer) if colIndex = 0 then –Prefectures aCell’s setTitle:((item (rowIndex + 1) of prefList) as string) aCell’s setLeaf:false else if colIndex = 1 then –Each Game Centers in the Prefecture set aPath to text 2 thru -1 of ((aView’s |path|()) as string) set tmpArray to my filterRecListByLabel1(skDataList, "address BEGINSWITH ’" & aPath & "’") set tmpItem to (tmpArray’s objectAtIndex:rowIndex) set aGameCenterName to (tmpItem’s gcName) as string aCell’s setTitle:(aGameCenterName) aCell’s setLeaf:true else if colIndex ≥ 2 then error "Wrong NSBrowser status" end if end browser:willDisplayCell:atRow:column: on browserCellSelected:aSender set aPath to my aBrowser’s |path|() set aList to (aPath’s pathComponents()) as list set aLen to length of aList if aLen = 3 then –set aPref to contents of item 2 of aList set aGc to contents of last item of aList set tmpArray to my filterRecListByLabel1(skDataList, "gcName == ’" & aGc & "’") –set tmpArray to my filterRecListByLabel1(skDataList, "gcName == " & aGc) set tmpItem to contents of first item of (tmpArray as list) copy tmpItem to my aSelection set aLatitude to (latitude of tmpItem) as real set aLongitude to (longitude of tmpItem) as real tell aMapView set aLocation to current application’s CLLocationCoordinate2DMake(aLatitude, aLongitude) its setCenterCoordinate:aLocation zoomLevel:(zLevel) animated:false end tell end if end browserCellSelected: –NSArrayに入れたNSDictionaryを、指定の属性ラベルの値で抽出 on filterRecListByLabel1(aRecList, aPredicate as string) set aPredicate to current application’s NSPredicate’s predicateWithFormat:aPredicate set filteredArray to aRecList’s filteredArrayUsingPredicate:aPredicate return filteredArray end filterRecListByLabel1 –Segmented Controlをつくる on makeSegmentedControl(titleList, startX, startY, aWidth, aHeight) set aLen to length of titleList set aSeg to NSSegmentedControl’s alloc()’s init() aSeg’s setSegmentCount:aLen set aCount to 0 repeat with i in titleList set j to contents of i (aSeg’s setLabel:j forSegment:aCount) set aCount to aCount + 1 end repeat aSeg’s setTranslatesAutoresizingMaskIntoConstraints:false aSeg’s setSegmentStyle:(NSSegmentStyleTexturedRounded) aSeg’s setFrame:(current application’s NSMakeRect(startX, startY, aWidth, aHeight)) aSeg’s setTrackingMode:0 aSeg’s setTarget:me aSeg’s setAction:"clickedSeg:" aSeg’s setSelectedSegment:0 return aSeg end makeSegmentedControl –Segmented Controlのクリック時のイベントハンドラ on clickedSeg:aSender set aSel to aSender’s selectedSegment() set tList to {MKMapTypeStandard, MKMapTypeSatellite, MKMapTypeHybrid} set tmpType to contents of item (aSel + 1) of tList aMapView’s setMapType:(tmpType) set selSeg to aSel end clickedSeg: |