# Диалоги

Диалоги используются для отображения сообщений, запроса подтверждения или ввода данных и информирования пользователя о выполнении продолжительной операции.

Для работы с диалогами используется объект:

```scala
ru.bitec.app.gtk.gl.Dialogs
```

В `Avi` этот объект доступен через переменную `dialogs`.

Для выбора объекта или нескольких объектов можно открыть выборку в режиме `openLookup()`. Этот сценарий описан на странице **«Выборка»**.

## Стандартные диалоги

### Отображение сообщения

Метод `showMessage()` отображает текст в модальном окне.

Пример:

```scala
dialogs.showMessage(
  "Текст, который увидит пользователь"
)
```

Окно блокирует работу с формой до его закрытия пользователем.

### Диалог со стандартными кнопками

Метод `showMsgDialog()` открывает диалог указанного типа с сообщением и набором стандартных кнопок.

Типы диалогов определены в:

```scala
ru.bitec.app.gtk.gl.msgdlg.MsgDlg
```

Типы кнопок определены в:

```scala
ru.bitec.app.gtk.gl.msgdlgbutton.MsgDlgButton
```

Пример диалога подтверждения с кнопками **Да** и **Нет**:

```scala
val dialogResult = dialogs.showMsgDialog(
  MsgDlg.confirmation,
  "Включить автонумерацию?",
  List(
    MsgDlgButton.yes,
    MsgDlgButton.no
  )
)

if (dialogResult == MsgDlgButton.yes) {
  // Обработка нажатия кнопки «Да»
} else if (dialogResult == MsgDlgButton.no) {
  // Обработка нажатия кнопки «Нет»
}
```

Результат метода содержит выбранную пользователем кнопку.

### Диалог с произвольными кнопками

Метод `showButtonsDialog()` открывает диалог с произвольным набором кнопок.

Метод используется, если требуемые варианты ответа отсутствуют среди стандартных кнопок `MsgDlgButton`.

Пример:

```scala
dialogs.showButtonsDialog(
  caption = "",
  text = "Удалить форму или убрать ссылку на вид отчетности?",
  colCount = 2,
  buttons = List(
    List("Удалить"),
    List("Убрать ссылку")
  ),
  imageCollectionName = "ToolBarPrimaryHot",
  focusButtonNumber = 0L
) match {
  case 0L =>
    // Обработка нажатия кнопки «Удалить»

  case 1L =>
    // Обработка нажатия кнопки «Убрать ссылку»
}
```

Параметры метода:

* `caption` — заголовок окна;
* `text` — текст сообщения;
* `colCount` — количество колонок для размещения кнопок;
* `buttons` — набор кнопок;
* `imageCollectionName` — коллекция изображений;
* `focusButtonNumber` — номер кнопки, которая получает фокус при открытии диалога.

Метод возвращает номер выбранной кнопки. Нумерация начинается с `0`.

### Запрос строки

Метод `showPromptDialog()` открывает диалог для ввода строки.

В метод передаются:

* заголовок окна;
* текст диалога;
* значение по умолчанию.

Пример:

```scala
val dialogResult = dialogs
  .showPromptDialog(
    "Заголовок окна",
    "Текст диалога",
    "Значение по умолчанию"
  )
  .ns

if (dialogResult.isNotNullOrEmpty) {
  // Обработка введённого значения
}
```

Результат метода содержит введённую пользователем строку.

### Запрос подтверждения

Метод `showConfirmDialog()` открывает диалог типа **Подтверждение** с кнопками **Да** и **Нет**.

Пример:

```scala
val dialogResult =
  dialogs.showConfirmDialog(
    "Текст диалога"
  )

if (dialogResult) {
  // Пользователь нажал «Да»
}
```

Метод возвращает `true`, если пользователь подтвердил действие.

## Информационное окно

Информационное окно используется, чтобы сообщить пользователю о выполнении продолжительной операции.

Для работы с ним применяются методы:

* `showInfoForm()` — отображает информационное окно;
* `hideInfoForm()` — скрывает информационное окно;
* `withInfoForm()` — отображает информационное окно на время выполнения переданной функции.

### Управление информационным окном

Метод `showInfoForm()` отображает окно с переданным текстом. Пользователь не может самостоятельно закрыть это окно.

Для закрытия необходимо вызвать `hideInfoForm()`.

Пример:

```scala
dialogs.showInfoForm(
  "Внимание, идет загрузка Госреестра типов СИ"
)

try {
  thisApi().download()
} finally {
  dialogs.hideInfoForm()
}
```

Вызов `hideInfoForm()` размещён в блоке `finally`, поэтому информационное окно будет скрыто и после успешного выполнения операции, и при возникновении ошибки.

### Выполнение функции с информационным окном

Метод `withInfoForm()` отображает информационное окно, выполняет переданную функцию и скрывает окно после её завершения.

Предыдущий пример можно записать следующим образом:

```scala
dialogs.withInfoForm(
  "Внимание, идет загрузка Госреестра типов СИ"
) {
  thisApi().download()
}
```

Метод обеспечивает закрытие информационного окна после завершения переданной функции.

## Диалог настройки стиля

Метод `showEditPaintStyleDialog()` открывает диалог настройки стилей оформления текстовых полей.

Метод используется, когда пользователю необходимо предоставить возможность изменить параметры оформления через интерфейс системы.
