Статьи

Редактор диалогов

В более сложных плагинах, чем те, которые мы рассматривали, может понадобиться, чтобы пользователь изменил какие-либо настройки или выбрал необходимые опции. В этом может помочь простой встроенный редактор диалогов ManuScript (к сожалению, доступный только в Windows версии Sibelius). Диалоги могут быть созданы также как методы и переменные во встроенном редакторе плагинов – нужно просто выбрать ‘Dialogs’ и нажать кнопку ‘Add’.
Для показа диалогов из методов ManuScript, мы используем встроенный вызов Sibelius.ShowDialog(dialogName, Self), где dialogName – имя диалога, который мы хотим показать, а Self - ‘специальная’ переменная, которая ссылается на этот плагин (сообщает Sibelius, кому принадлежит диалог). Управление будет возвращено методу, только когда диалог будет закрыт пользователем.
Это, конечно, бесполезно, если мы не можем редактировать диалог. Чтобы посмотреть, как этот редактор работает, посмотрим имеющийся плагин Add String Fingering, выберем диалог с названием window, и нажмём Edit. Появится этот диалог, а также длинная тонкая палитра элементов управления. Они расположены следующим образом, сверху вниз:
• Radio button (Переключатель)
• Check box (Флажок)
• Button (Кнопка)
• Static text (Статический текст)
• Editable text (Изменяемый текст)
• Combo box (Выпадающий список)
• List box (Список)
Диалог Add String Fingering не использует все доступные типы элементов управления, но действительно демонстрирует четыре из них, а именно флажки, статический текст, выпадающий список и кнопки. Каждый элемент управления в диалоге может быть выбран для редактирования простым щелчком по нему; вокруг него появятся маленькие чёрные ‘ручки’, которые позволят изменять его размер. Элементы управления могут перемещаться внутри диалога простым перетаскиванием. Для создания нового элемента управления просто перетащите соответствующую иконку из палитры компонентов в сам диалог, и новый элемент соответствующего типа будет создан.
Очень часто используемая функция редактора диалогов – окно Свойств, которое может быть доступно, если щёлкнуть мышью с нажатой клавишей Control или щёлкнуть правой кнопкой мыши, а потом выбрать Properties в контекстном меню. Если никакой элемент управления не выбран, это позволит устанавливать различные опции для самого диалога, такие как ширина, высота и название. При выбранном элементе управления окно свойств изменяется в зависимости от его типа, но большинство опций одинаковы для всех элементов управления. Вот они:
• Text: текст, находящийся в элементе управления
• Position (X, Y): расположение элемента управления в диалоге относительно верхнего левого угла
• Size (width, height): размер элемента управления
• Variable storing control’s value: Глобальная переменная ManuScript, которая будет соответствовать значению этого элемента управления, когда плагин запущен
• Method called when clicked: Метод ManuScript, который будет запущен, когда пользователь щёлкнет по элементу управления.
• Click closes dialog: выберите эту опцию, если хотите, чтобы диалог закрывался при щелчке по этому элементу управления. Дополнительные опции ‘returning True / False’ определяют значение, которое возвратит метод Sibelius.ShowDialog, если диалог будет закрыт этим способом.
• Give this control focus: выберите эту опцию, если хотите, чтобы ‘фокус ввода’ был установлен на этом элементе управления при открытии диалога, т.е. к нему будет применяться ввод с клавиатуры пользователя. Главным образом это полезно для изменяемого текста.
Выпадающие и обычные списки имеют дополнительное свойство – переменную, из которой берутся значения, которые будут в них содержаться после запуска. Как и для сохранения текущего значения элемента управления, это должна быть глобальная переменная. Однако, в этом случае она должна иметь специальный формат, определяющий не одну строку, а список строк. Посмотрите переменную _ComboItems в Add String Fingering для примера – вот что она напоминает:
_ComboItems
{
   "1"
   "2"
   "3"
   "4"
   "1 and 3"
   "2 and 4"
}

Переключатели также имеют дополнительное свойство, которое появилось в версии 2.1 Sibelius, позволяющее определить группы переключателей. Когда пользователь щёлкает по переключателю, отключаются только переключатели из той же самой группы; все остальные остаются без изменений. Это чрезвычайно полезно для более сложных диалогов. Например, плагин `Add Chord Symbols’ использует это свойство.
Для определения группы переключателей, выберите те из них, которые будут первыми в группе, и установите в их свойствах флажок “Start a new radio group”. Затем установите порядок создания элементов управления, нажав на “Set Creation Order” в контекстном меню диалога. Возле каждого элемента управления появятся числа, соответствующие порядку, в котором они будут создаваться при открытии диалога. Они могут быть изменены путём последовательного нажатия на элементах управления в том порядке, в каком Вы хотите, чтобы они создавались. Группы переключателей будут определены, как содержащие все переключатели между теми, у которых в свойствах установлено “Start a new radio group” (или от одного такого переключателя до конца диалога).
Так, чтобы сделать группу переключателей правильно работающей, убедитесь, что каждая группа создана в правильном порядке, начальный переключатель создаётся первым, а затем идут все остальные переключатели этой группы. В конце нажмите “Set Creation Order” в меню для отключения этого режима.
Другие свойства доступны для статического текста (они определяют выравнивание по правому или левому краю) и кнопок (позволяющие определить одну кнопку как кнопку по умолчанию). В качестве примеров всего этого посмотрите имеющиеся плагины, часть из которых имеет довольно сложные диалоги.

Обозрение других возможностей
Плагин Parallel 5ths and 8ves иллюстрирует наличие множества методов. Плагин Proof-read показывает, как один плагин может вызывать другой – он почти ничего не делает кроме вызовов плагинов CheckPizzicato, CheckSuspectClefs, CheckRepeats and CheckHarpPedaling. Таким образом, Вы можете создать метаплагин, который будет использовать другие как библиотеки. Круто!
(Вы, как объектно-ориентированный программист, должны знать, что плагин тоже является объектом в партитуре, так что один плагин может использовать методы и переменные других.)