アラートダイアログ上にsegmented controlを複数表示して、複数選択項目を取得するAppleScriptです。
複数選択項目にpopup buttonではなくsegmented controlを使う必要性というのは、あんまりないですが………すべての選択項目が見える状態で少量の選択項目から1つを選ぶような用途には使えるのではないでしょうか。
segmented controlをそれぞれBoxに入れ、Viewにまとめ、Scroll viewに突っ込んでいますが、あまり効果があるんだかないんだか不明です。
AppleScript名:アラートダイアログ上にsegmented controlを表示 v4 |
— Created 2019-03-26 by Takaaki Naganoya — 2019 Piyomaru Software use AppleScript version "2.5" use scripting additions use framework "Foundation" use framework "AppKit" –Scroll Viewをつかってみた 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 NSSegmentedControl : a reference to current application’s NSSegmentedControl property NSRunningApplication : a reference to current application’s NSRunningApplication property NSSegmentStyleTexturedRounded : a reference to current application’s NSSegmentStyleTexturedRounded 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 return my returnSels –> {1, 2, 3, 4, 5} on chooseMultipleSegments:paramObj set aMainMes to myMessage of paramObj set aSubMes to mySubMessage of paramObj set segMes2DList to segmentMes of paramObj set segTitleList to segmentTitles of paramObj set aTmpY to (length of segMes2DList) * 60 –BoX + Segmented Control をつくる set segsList to {} set boxLIst to {} set segsCount to 0 set tmpMaxX to 500 set aCount to 1 repeat with i in segMes2DList set aSeg to makeSegmentedControlWithStartY(i, aTmpY – segsCount – 40, 500, 40) of me set aDBounds to aSeg’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, 500, 60))) (aBox’s setTitle:(item aCount of segTitleList)) (aBox’s addSubview:aSeg) if tmpWidth > tmpMaxX then set tmpMaxX to tmpWidth set the end of segsList to aSeg –選択検出用 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, aTmpY)) theView’s setSubviews:boxLIst — create a Scroll View set aScroll to NSScrollView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, tmpMaxX, aTmpY)) aScroll’s setDocumentView:theView theView’s enclosingScrollView()’s setHasHorizontalScroller:false theView’s enclosingScrollView()’s setHasVerticalScroller:false — 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 selectedSegment()) 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 makeSegmentedControlWithStartY(titleList, aStartY, 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(20, aHeight – 35, aWidth, aHeight – 40)) aSeg’s setTrackingMode:0 aSeg’s setTarget:me aSeg’s setAction:"clickedSeg:" aSeg’s setSelectedSegment:0 return aSeg end makeSegmentedControlWithStartY 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 |