アラートダイアログ上に複数のポップアップメニュー(項目数可変)を表示し、指定リスト(配列)からの選択を行うAppleScriptです。
以前、Segmented Controlで作ったものがありましたが、Segmented Controlだと絶望的に実用性がないので、ポップアップボタンに差し替えてみたものです。
AppleScript名:アラートダイアログ上にNSBoxを介してPopup Menuを表示 |
— Created 2019-11-14 by Takaaki Naganoya — 2019 Piyomaru Software use AppleScript version "2.5" use scripting additions use framework "Foundation" use framework "AppKit" property NSBox : a reference to current application’s NSBox property NSView : a reference to current application’s NSView property NSAlert : a reference to current application’s NSAlert property NSScrollView : a reference to current application’s NSScrollView property NSRunningApplication : a reference to current application’s NSRunningApplication property returnCode : 0 property returnSels : {} set paramObj to {myMessage:"項目選択", mySubMessage:"以下の各項目を選択してください。", segmentMes:{{"Red1", "Blue1", "Yellow1", "Brown1", "White1", "Cyan1", "Grey1"}, {"Red2", "Blue2", "Yellow2", "Brown2", "White2", "Cyan2", "Grey2"}, {"Red3", "Blue3", "Yellow3", "Brown3", "White3", "Cyan3", "Grey3"}, {"Red4", "Blue4", "Yellow4", "Brown4", "White4", "Cyan4", "Grey4"}, {"Red5", "Blue5", "Yellow5", "Brown5", "White5", "Cyan5", "Grey5"}}, segmentTitles:{"1st Segments", "2nd Segments", "3rd Segments", "4th Segments", "5th Segments"}} –my chooseMultipleSegments:paramObj my performSelectorOnMainThread:"chooseMultipleSegments:" withObject:paramObj waitUntilDone:true return my returnSels –> {1, 2, 3, 4, 5} on chooseMultipleSegments:paramObj set aMainMes to (myMessage of paramObj) as string set aSubMes to (mySubMessage of paramObj) as string set segMes2DList to (segmentMes of paramObj) as list set segTitleList to (segmentTitles of paramObj) as list set aTmpY to (length of segMes2DList) * 60 –BoX + Segmented Control をつくる set segsList to {} set boxLIst to {} set segsCount to 0 set tmpMaxX to 400 set aCount to 1 repeat with i in segMes2DList set a1Button to (current application’s NSPopUpButton’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, tmpMaxX – 30, 30)) pullsDown:false) a1Button’s removeAllItems() (a1Button’s addItemsWithTitles:(i)) set aDBounds to a1Button’s |bounds|() set tmpWidth to getWidth(aDBounds) of me set aBox to (NSBox’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, aTmpY – segsCount – 60, tmpMaxX – 10, 60))) (aBox’s setTitle:(item aCount of segTitleList)) (aBox’s addSubview:a1Button) (aBox’s setBorderType:0) –NSNoBorder, this method is depreceted in macOS 10.14. Which is alternative? if tmpWidth > tmpMaxX then set tmpMaxX to tmpWidth set the end of segsList to a1Button –選択検出用 set the end of boxLIst to aBox –表示用 set segsCount to segsCount + 60 set aCount to aCount + 1 end repeat — create a view set theView to NSView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, tmpMaxX + 10, aTmpY + 20)) theView’s setSubviews:boxLIst — create a Scroll View set aScroll to NSScrollView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, tmpMaxX + 10, 300)) aScroll’s setDocumentView:theView aScroll’s documentView()’s scrollPoint:(current application’s NSMakePoint(0, aTmpY + 10)) –Force scroll to top theView’s enclosingScrollView()’s setHasHorizontalScroller:false theView’s enclosingScrollView()’s setHasVerticalScroller: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:aScroll end tell — show alert in modal loop NSRunningApplication’s currentApplication()’s activateWithOptions:0 my performSelectorOnMainThread:"doModal:" withObject:(theAlert) waitUntilDone:true if (my returnCode as number) = 1001 then error number -128 set my returnSels to {} repeat with i in segsList set tmpSegSel to (i’s indexOfSelectedItem()) as number set the end of (my returnSels) to tmpSegSel + 1 end repeat end chooseMultipleSegments: on doModal:aParam set (my returnCode) to aParam’s runModal() end doModal: on clickedSeg:aSender set aSel to aSender’s selectedSegment() end clickedSeg: on getWidth(aDBounds) if class of aDBounds = list then –macOS 10.13 or later return item 1 of item 1 of aDBounds else –macOS 10.10….10.12 return width of |size| of aDBounds end if end getWidth |
More from my site
(Visited 197 times, 1 visits today)