Running Main Thread Method and Keyboard Navigating


(scriptingmd) #1

In my attempts to run Shane Stanley’s August 2015 DatePicker applescript on Script Debugger, I could run that applescript on a main thread in Script Debugger with the command:

my performSelectorOnMainThread:withObject:waitUntilDone:

That command allowed the DatePicker alert pane to display.

What methods might exist to navigate from a keyboard, rather than from a mouse?


(Shane Stanley) #2

Yes, that’s the way to run code on the main thread in Script Debugger.

It would be a standard dialog, so anything that works elsewhere. I can’t recall the script you’re referring to, so I can’t check.


(scriptingmd) #3

The Date Picker script, that I was referencing, included the following. I added one line to call performSelectorOnMainThread, based upon instructions listed at https://latenightsw.com/applescriptobjc-in-script-debugger-6/

-- Created 2015-08-20 by Shane Stanley
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
use script "BridgePlus"

-- create a view
set theView to current application's NSView's alloc()'s initWithFrame:(current application's NSMakeRect(0, 0, 100, 200))

-- create date picker
set datePicker to current application's NSDatePicker's alloc()'s initWithFrame:(current application's NSMakeRect(0, 0, 100, 100))

-- set style: choices are NSTextFieldAndStepperDatePickerStyle, NSClockAndCalendarDatePickerStyle, or NSTextFieldDatePickerStyle
datePicker's setDatePickerStyle:(current application's NSClockAndCalendarDatePickerStyle)

-- set elements: choices include NSHourMinuteDatePickerElementFlag, NSHourMinuteSecondDatePickerElementFlag, NSTimeZoneDatePickerElementFlag, NSYearMonthDatePickerElementFlag, and NSEraDatePickerElementFlag
datePicker's setDatePickerElements:((current application's NSYearMonthDayDatePickerElementFlag) + (current application's NSHourMinuteSecondDatePickerElementFlag as integer))


-- set initial date
datePicker's setDateValue:(current application's NSDate's |date|())

-- get the size it needs
set theSize to datePicker's fittingSize()

--resize the picker and view accordingly
theView's setFrameSize:theSize
datePicker's setFrameSize:theSize

-- add the picker to the view
theView's setSubviews:{datePicker}

-- create an alert
set theAlert to current application's NSAlert's alloc()'s init()

-- set up alert
tell theAlert
	its setMessageText:"Pick a date"
	its setInformativeText:"Any date"
	its addButtonWithTitle:"OK"
	its addButtonWithTitle:"Cancel"
	its setAccessoryView:theView
end tell

--  this line was added to bring the displayAlert function on the main thread.
set returnCode to my performSelectorOnMainThread:"displayAlert:" withObject:theAlert waitUntilDone:true

-- show alert in modal loop
on displayAlert:theAlert
	set returnCode to theAlert's runModal()
	if returnCode = (current application's NSAlertSecondButtonReturn) then error number -128
end displayAlert:

-- retrieve date
set theDate to ASify from (datePicker's dateValue()) -- or simply coerce to date in 10.11

(Shane Stanley) #4

That’s still doing some resizing that should be done on the main thread. Here it is with that fixed, plus simplified a little:

use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
use script "BridgePlus"

-- create a view
set theView to current application's NSView's alloc()'s initWithFrame:(current application's NSMakeRect(0, 0, 100, 200))

-- create date picker
set datePicker to current application's NSDatePicker's alloc()'s initWithFrame:(current application's NSMakeRect(0, 0, 100, 100))

-- set style: choices are NSTextFieldAndStepperDatePickerStyle, NSClockAndCalendarDatePickerStyle, or NSTextFieldDatePickerStyle
datePicker's setDatePickerStyle:(current application's NSClockAndCalendarDatePickerStyle)

-- set elements: choices include NSHourMinuteDatePickerElementFlag, NSHourMinuteSecondDatePickerElementFlag, NSTimeZoneDatePickerElementFlag, NSYearMonthDatePickerElementFlag, and NSEraDatePickerElementFlag
datePicker's setDatePickerElements:((current application's NSYearMonthDayDatePickerElementFlag) + (current application's NSHourMinuteSecondDatePickerElementFlag as integer))


-- set initial date
datePicker's setDateValue:(current application's NSDate's |date|())

----resize the picker 
my performSelectorOnMainThread:"resizePicker:" withObject:datePicker waitUntilDone:true
-- create an alert
set theAlert to current application's NSAlert's alloc()'s init()

-- set up alert
tell theAlert
	its setMessageText:"Pick a date"
	its setInformativeText:"Any date"
	its addButtonWithTitle:"OK"
	its addButtonWithTitle:"Cancel"
	its setAccessoryView:datePicker
end tell

--  this line was added to bring the displayAlert function on the main thread.
set returnCode to my performSelectorOnMainThread:"displayAlert:" withObject:theAlert waitUntilDone:true

-- retrieve date
set theDate to ASify from (datePicker's dateValue()) -- or simply coerce to date in 10.11

on resizePicker:datePicker
	---- get the size it needs
	set theSize to datePicker's fittingSize()
	----resize the picker 
	datePicker's setFrameSize:theSize
end resizePicker:

-- show alert in modal loop
on displayAlert:theAlert
	set returnCode to theAlert's runModal()
	if returnCode = (current application's NSAlertSecondButtonReturn) then error number -128
end displayAlert: