スライダーをダイアログ上に表示して、ユーザーの入力を求めるAppleScriptです。
最近はこうした箱庭ダイアログシリーズも書き方がこなれてきて、ランタイム環境に依存せずに(実際は、特定の環境で動かないということが少なくなりつつ)実行できるようになってきました。
スライダーコントロールはこうした箱庭シリーズの初期にいろいろいじくって試していたものですが、あまりに初期すぎて書き方が古いものが多かったので、最新のこなれた書き方で書き直しておきました。
ただ、スライダーコントロールが単体でダイアログ上に配置されていても、実際にハマる用途が存在せず、単なるデモンストレーションに終始してしまいそうであります。
アラートダイアログの通知メッセージ(一番大きな文字で表示される)をスライダーで変更することができなかったので、ダイアログのタイトルでスライダーの値を表示するようにしています。スライダーが必要な状況というのは、いくつかのパラメータを一緒に設定するケースが多いはずなので、やっぱり単体で設定できても意味がないような気がとてもします。
AppleScript名:slider+buttonを作成 v5 |
— Created 2020-5-17 by Takaaki Naganoya — 2020 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" property NSAlert : a reference to current application’s NSAlert property NSSlider : a reference to current application’s NSSlider property NSSplitView : a reference to current application’s NSSplitView property NSTickMarkBelow : a reference to current application’s NSTickMarkBelow property NSRunningApplication : a reference to current application’s NSRunningApplication property NSScreenSaverWindowLevel : a reference to current application’s NSScreenSaverWindowLevel property windisp : false property wController : false property aSliderValMSG : "" property sliderRes : 0 set aMaxVal to 12 set aButtonMSG to "OK" set winWidth to 400 set aSliderValMSG to "Slider Value : " set paramObj to {myMax:aMaxVal, myBMes:aButtonMSG, mySliderMes:aSliderValMSG, myWidth:winWidth} –my getSliderValue:paramObj my performSelectorOnMainThread:"getSliderValue:" withObject:(paramObj) waitUntilDone:true return sliderRes on getSliderValue:paramObj set aMaxVal to (myMax of paramObj) as real set aButtonMSG to (myBMes of paramObj) as string set aSliderValMSG to (mySliderMes of paramObj) as string set winWidth to (myWidth of paramObj) as real set (my aSliderValMSG) to aSliderValMSG set aView to NSSplitView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, winWidth, 40)) aView’s setVertical:false –Sliderをつくる set aSlider to makeSider(aMaxVal) of me aView’s setSubviews:{aSlider} — set up alert set theAlert to NSAlert’s alloc()’s init() tell theAlert its setMessageText:"" –its setInformativeText:aSubMes its addButtonWithTitle:"OK" its addButtonWithTitle:"Cancel" its setAccessoryView:aView set aWin to its |window|() set bList to buttons() end tell aWin’s setTitle:(my aSliderValMSG & (sliderRes as text)) aWin’s setLevel:NSScreenSaverWindowLevel — 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 sliderRes to (aSlider’s intValue()) as number end getSliderValue: on doModal:aParam set (my returnCode) to aParam’s runModal() end doModal: on sliderChanged:aSender set sliderRes to aSender’s intValue() set parentWin to aSender’s |window|() parentWin’s setTitle:(my aSliderValMSG & (sliderRes as text)) end sliderChanged: on makeSider(aMaxNum) set aSlider to NSSlider’s alloc()’s init() aSlider’s setMaxValue:aMaxNum aSlider’s setMinValue:1 aSlider’s setNumberOfTickMarks:aMaxNum aSlider’s setKnobThickness:50 aSlider’s setAllowsTickMarkValuesOnly:true aSlider’s setTickMarkPosition:(NSTickMarkBelow) set sliderRes to (aMaxNum div 2) aSlider’s setIntValue:sliderRes aSlider’s setTarget:me aSlider’s setAction:("sliderChanged:") return aSlider end makeSider |