Как отсортировать вывод списков в AppleScript в массив свойств каждого элемента?

Вопрос или проблема

У меня есть следующий 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, чтобы получить массив свойств каждого элемента (в данном случае окон), вы можете использовать следующий подход. Мы соберем данные о каждом окне в едином формате, что позволит сохранить и восстановить позиции окон в будущем.

Шаги для реализации

  1. Получение данных об окнах: Сначала соберем необходимые данные: названия окон, размеры и позиции.

  2. Подготовка массива: Используем цикл для организации данных в нужном формате, где каждый элемент представляет собой массив с тремя свойствами: названием, размером и позицией окна.

  3. Оптимизация хранения данных: Затем, после получения отсортированных данных, можно будет легко их сохранить или восстановить.

Пример кода 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

Объяснение кода

  1. Сбор данных об окнах: Мы создаем ссылку на приложение Finder и получаем список всех окон (_W).

  2. Цикл for: Используем repeat with для итерации по всем окнам. Для каждого окна мы извлекаем имя, размер и позицию.

  3. Формирование массива: Каждый элемент формируется как массив, который затем добавляется в windowList. Таким образом, в результате мы получаем список, содержащий название, размер и позицию каждого окна.

Заключение

Этот метод позволяет создать упорядоченный массив для дальнейшего использования, что удобно для сохранения и восстановления настроек окон не только в Finder, но и в других приложениях. Такой подход повышает гибкость работы с окнами и облегчает управление пользовательским интерфейсом на macOS. Использование AppleScript в данном контексте открывает новые возможности для автоматизации задач и улучшения системы контроля окон.

Оцените материал
Добавить комментарий

Капча загружается...