Вопрос или проблема
У меня есть следующий AppleScript:
tell application "System Events"
set _P to a reference to (application process "Finder")
set _W to a reference to windows of _P
[_W's name, _W's size, _W's position]
end tell
Этот код вернет список имен окон Finder, затем список размеров окон {x,y}, затем список позиций окон {x,y}, вот так:
{{"имя окна 1", "имя окна 2", "имя окна 3"}, {{547, 420}, {537, 140}, {1324, 502}}, {{3674, 900}, {523, 194}, {3646, 865}}}
Как я могу разобрать эти данные так, чтобы они были отформатированы в виде списка имени, размера и позиции каждого окна, вот так?
{{"имя окна 1", {размер окна 1}, {позиция окна 1}},
{"имя окна 2", {размер окна 2}, {позиция окна 2}},
{"имя окна 3", {размер окна 3}, {позиция окна 3}}}
Конечная цель здесь – иметь возможность сохранять и позже восстанавливать именованные/нумерованные списки позиций окон для приложения (кроме Finder, так как я уже нашел другой метод, работающий для Finder, который, к сожалению, не работает с другими приложениями).
Ответ или решение
Для сортировки и форматирования вывода списков в AppleScript, чтобы получить массив свойств каждого элемента (в данном случае окон), вы можете использовать следующий подход. Мы соберем данные о каждом окне в едином формате, что позволит сохранить и восстановить позиции окон в будущем.
Шаги для реализации
-
Получение данных об окнах: Сначала соберем необходимые данные: названия окон, размеры и позиции.
-
Подготовка массива: Используем цикл для организации данных в нужном формате, где каждый элемент представляет собой массив с тремя свойствами: названием, размером и позицией окна.
-
Оптимизация хранения данных: Затем, после получения отсортированных данных, можно будет легко их сохранить или восстановить.
Пример кода AppleScript
Вот как это можно реализовать:
tell application "System Events"
set _P to a reference to (application process "Finder")
set _W to windows of _P
set windowList to {}
repeat with i from 1 to count _W
set windowName to name of item i of _W
set windowSize to size of item i of _W
set windowPosition to position of item i of _W
set end of windowList to {windowName, windowSize, windowPosition}
end repeat
end tell
-- windowList теперь содержит необходимый формат
log windowList
Объяснение кода
-
Сбор данных об окнах: Мы создаем ссылку на приложение Finder и получаем список всех окон (_W).
-
Цикл for: Используем
repeat with
для итерации по всем окнам. Для каждого окна мы извлекаем имя, размер и позицию. -
Формирование массива: Каждый элемент формируется как массив, который затем добавляется в
windowList
. Таким образом, в результате мы получаем список, содержащий название, размер и позицию каждого окна.
Заключение
Этот метод позволяет создать упорядоченный массив для дальнейшего использования, что удобно для сохранения и восстановления настроек окон не только в Finder, но и в других приложениях. Такой подход повышает гибкость работы с окнами и облегчает управление пользовательским интерфейсом на macOS. Использование AppleScript в данном контексте открывает новые возможности для автоматизации задач и улучшения системы контроля окон.