Интерфейсы независимые от 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.
Реализации
- QS.Dialog.GtkGuiDispatcher - Реализация для Gtk
- QS.Testing.Gui.GuiDispatcherForTests - Реализация для тестирования.