Интерфейсы независимые от GUI - QualitySolution/QSProjects GitHub Wiki

Простые диалоги

Для вывода простых сообщений и вопросов при этом не привязываясь к графическому инструментарию, можно нужно использовать два интерфейса: IInteractiveMessage и IInteractiveQuestion В целях более простой передачи через зависимостей, для классов которым требуется и выводить сообщения и задавать вопросы есть объединенный интерфейс сервиса IInteractiveService. Которые реализую функции обоих интерфейсов.

Примеры использования

Вызвать вывод сообщения пользователю, например об ошибке.

interactive.ShowMessage(ImportanceLevel.Error, "Ты все сломал, больше так не делай!");

Задать пользователю вопрос, можно так. Здесь будет 2 кнопки "Да" и "Нет". Ответ функции True если пользователь нажал "Да", False если нажал "Нет" или закрыл диалог крестиком.

interactive.Question("Все совсем плохо. Продолжить?");

Более сложный вариант со своим набором кнопок. Ответом возвращается название выбранной кнопки. null если пользователь закрыл диалог крестиком.

interactive.Question(new [] {"Все очень плохо", "Я переживу", "Ничего не делай!"}, "Все совсем плохо? Продолжим?");

Реализации

На текущий момент есть реализации:

  • Gtk - GtkMessageDialogsInteractive, GtkQuestionDialogsInteractive, GtkInteractiveService
  • Console - ConsoleInteractiveService, ConsoleInteractiveQuestion, ConsoleInteractiveMessage

Отображение прогресса

Существует интерфейс IProgressBarDisplayable реализующий управление прогресс баром без зависимости(это еще надо проверять, насколько он совместим к примеру с WPF) к определенной GUI.

Реализации

  • QS.Widgets.ProgressWidget - Реализация виджета на GTK.
  • QS.Dialog.ModalProgressCreator - Реализация создающая модальное окно с прогрессом текущей операции. Создает оно ProgressWindowViewModel с помощью INavigationManager.
  • QS.Dialog.ViewModels.ProgressWindowViewModel - Вью модель модального окна отображающая прогресс операции. После создания позволяет обратится к свойству Progress резализующее IProgressBarDisplayable.

Остановка выполнения

ModalProgressCreator и ProgressWindowViewModel поддерживают остановку(отмену) пользователем выполняемой операции.

ProgressWindowViewModel

Если используется чистая ProgressWindowViewModel, то она должна быть создана с параметром userCanCancel = true (значение по умолчанию false), чтобы создаваемый диалог был с крестиком. Пользователь сможет нажать на крестик остановив операцию, при этом ViewModel перед закрытием вызовет отмену для CancellationTokenSource диалога.

ModalProgressCreator

С ModalProgressCreator работа происходить чуть иначе, в любом момент до запуска процесса(вызова Start) создателю можно проставить свойство UserCanCancel = true, после этого все созданные модальные прогрессы будут отменяемыми. Не забывайте получать токены отмены после запуска процесса через свойство CancellationToken, обработка не остановится сама, вам надо проверять факт отмены процесса через токен.

Вызов GUI из другого потока

Все известные GUI работают в однопоточном режиме. Обращение компонентам GUI из других потоков крайне не рекомендуется. Поэтому для универсального кода, знающего про эти особенности GUI, можно использовать интерфейс QS.Dialog.IGuiDispatcher.

Реализации