Оборачивание любых обработчиков в прогресс-диалог (runprogress)
Любой предположительно-долгий обработчик теперь проще простого обернуть в виде прогресс-диалога, чтобы задержка не выглядела зависанием, а показывала красивое вращающееся колесико. И для этого не надо ничего писать, просто нужно переключить Действие из run в runprogress. Это для предположительно долгих синхронных обработчиков (runasync напротив, не блокирует экран) в процессах (в ActiveCV и фоновом сервисе – нет). Теперь симпл лучше совместим с неспешными платформами.
В принципе теперь нет нужды запускать это из кода, но на всякий также переработал питон-команду RunPyThreadProgressDef, которая запускает аналогично выполнение функции, переданной в параметре в виде прогресс-бара.
Уведомления с прогрессом в шторке уведомлений
Из долгих процедур можно отправлять прогресс выполнения в шторку уведомлений, чтобы пользователь понимал, на каком этапе находится выполнение. Доступно только из python-обработчиков. Вызывается методом UpdateProgressNotification из класса SimpleUtilites. В качестве параметра передается json с настройкой, собственно прогресса выполнения, заголовка, тела и id уведомления (по id происходит обновление ранее выведенного уведомления)
Проверка биометрии (отпечатки пальцев и распознавание лиц)
Если устройство поддерживает датчик отпечатка пальца или распознавание лиц, то можно вызвать стандартный диалог проверки биометрических данных. Причем, можно сделать это при запуске, тогда это будет проверкой на вход в приложение/конфигурацию. А можно просто запустить из процесса.
Запуск командой "ShowBiometric" где в параметрах настраивается заголовок текст и обработчики, которые будут выполняться в случае успешной аутентификации, неуспешной и ошибки (ошибка – это когда, например биометрия не поддерживается)
Диалог проверки ПИН-кода
Если, например, нет возможности использовать биометрию, можно использовать экран ввода ПИН-кода в тех же сценариях – при старте и произвольным запуском из процесса. Это именно диалог, причем вся логика – на разработчике (проверка пина, первоначальное обучение и т.д.) Также как в биометрии генерятся события и передается введенный пользователем пин. Можно отключить кнопку «назад», так чтобы диалог висел и не закрывался, пока не будет введен нужный ПИН.
Плавающие кнопки (floating action button)
Теперь доступны кастомные плавающие кнопки в том же ряду и в том же оформлении, что и кнопки штрихкода, OCR, голоса и т.д. На них нельзя вывести текст, но можно вывести иконку. Либо одну из дефолтных (поле Иконка) либо Awesome по тому же принципу что и везде. Но с Awesome небольшая неприятность – андроидовские функции измерения размера текста не совсем корректно отрабатывают на Awesome - шрифте, из-за этого иконка не всегда отцентрована идеально, поэтому дополнительно можно указать коррекцию по горизонтали и вертикали (показано в примере)
Упрощённая поддержка автозаполнения в «Выпадающий список» и «Поле ввода с автозаполнением»
Если база – SQL и есть таблицы, которые могут быть источником для автозаполнения, то достаточно написать SELECT-запрос в значении элемента и он автоматически подключится к таблице
Поле объекта
Это что-то среднее между кнопкой и полем ввода, с выделяющимся дизайном. На самом деле это поле ввода, ввод в который предполагается выбором – т.е. по нажатии на поле должно открыться поле выбора, а после выбора значение встать в поле. Это может быть выбор значения из справочника или документа. Такое широко используется в документно-ориетированных системах, например 1С.
Доступно событие простого нажатия и долгого нажатия: например по обычному нажатию-выбор значения, по длинному – открыть экран с дополнительной информацией по значению
Предполагается совместное использование с ShowScreen/BackScreen и ShowProcessResult/FinishProcessResult
Новые управляющие команды и переменные
Переключение внутри процесса
BackScreen, без параметра – команда, использующаяся только совместно с ShowScreen, переключает на экран, с которого был запущен ShowScreen.
Запуск процессов/экранов с возвратом результата
ShowProcessResult , <имя процесса|имя экрана> запускает процесс и выбранный экран, ожидая что в нем произойдет вызов FinishProcessResult. Стек переменных при этом на запускаемый и запускающий процесс – общий. Для того чтобы обработать именно нужное событие а не просто событие (по умолчанию listener=<имя вызываемого процесса>) совместно с этой командой можно установить имя события, которое будет сгенерировано после вызова FinishProcessResult , командой SetResultListener , <имя события>
FinishProcessResult, без параметров – завершает процесс с генерацией события в вызывающем процессе
SetResultListener , <имя события> - устанавливает имя события при завершении процесса
Новые стандартные переменные
parent_screen – экран, из которого запущен текущий экран (если он был запущен ShowScreen)
current_process_name – имя текущего процесса
current_screen_name – имя текущего экрана
Новые возможности управления полями ввода
Подсветка полей ввода
Для того чтобы обозначить пользователю корректный или некорректный ввод, можно выделить неярким красным или зеленым цветом поля ввода списком
SetRed, <список переменных полей ввода через “;”> - выделяет список полей красным
SetGreen, <список переменных полей ввода через “;”> - выделяет список полей зеленым
Отключение событий
Некоторые поля ввода такие как дата, галка генерируют события по факту ввода, а это не всегда нужно. Поэтому теперь есть команда, которой можно выключить все события всех полей ввода в процессе
disable_events, без параметров – отключает события всех полей ввода (кроме кнопок, элементов меню и других элементов, нажатия на которые в явном виде указывают на намерение пользователя инициировать ввод)
Подключение событий и «Современное поле ввода»
Иногда нужно чтобы введенные данные в поля ввода например сразу писались в БД. Для этого в параметр «Современное поле ввода» добавлен флаг "events" , установка которого в true означает что события будут генерироваться при люом изменении текста, поле при этом будет оставаться в фокусе (перерисовки экрана не происходит)
Переопределение поиска в тулбаре
В кастомные списки карточек (customcards) и кастомные таблицы (customtable) добавлен признак "override_search" суть которого сводится к тому, что поиск не будет производиться по таблице-источнику как при обычном поиске, а будет генерироваться событие Search при каждом вводе текста в поле поиска, чтобы разработчик сам мог выполнить поисковый запрос и заменить значение списка. Поиск автоматический удобен, но какие бы большие списки не поддерживались (а они могут быть и на сотни тысяч записей), всегда есть предел. И если в БД миллионы записей то логичнее искать средствами сервера, выдавая результат поиска. Кроме того пользовательских интерфейс не стоит перегружать слишком большими списками – их неудобно листать.
Открытие векторного редактора в режиме редактирования заданного файла
Иногда нужно предоставить пользователю самому например нарисовать карту склада, но чтобы он не заморачивался с файлами. Например у вас если справочник зон или складов и к каждому привязана своя карта (ведь карты складов – это очень нарядно и к тому же позволяет на лету решать задачу коммивояжера, что несет в себе положительный экономический эффект) и вы хотите чтобы пользователь открыл, заполнил и закрыл карту.
Для этого достаточно запустить команду RunVectorEditor, она откроет нужный файл, если его нет – создаст. И из кнопок доступно только сохранение без диалога выбора
RunVectorEditor, <путь к файлу карты *.sug> - открывает векторный редактор в режиме редактирования файла, без возможности смены. В случае успешного сохранения будет сгенерировано событие “vector_editor”
Поддержка функций с произвольным числом аргументов (*args)
Иногда удобно передавать переменные не через стек переменных а через определение функции, но при этом удобно указывать произвольное число аргументов. Для этого добавлен новый тип обработчика – pythonargs и метод можно писать как имя_функции(аргумент1, аргумент2… аргумент N) при этом определние функции 1м параметром все равно должно включать hashMap.
Функция в конструкторе может выглядеть так
В коде:
def foo(hashMap,*args):
param1 = args[0]
param2 = args[1]
param3 = args[2]
return hashMap
Поддержка pymongo
О интеграции с NoSQL MongoDB я еще потом подробно напишу и выпущу пару интересных релизов с ее участием. Пока только сообщаю, что библиотека поддерживается. И вот пример подключения и несколько примеров работы. Отмечу что MongoDB с ее JSON-ориентированной работой с документами отлично ложится на симпл- разработку и работать с ней очень и очень просто. Также как и CouchDB, но Mongo более распространённая.
from pymongo import MongoClient
i = 0
mongo_global.py:
def get_database():
# Provide the mongodb atlas url to connect python to mongodb using pymongo
CONNECTION_STRING ="mongodb://user:password@192.168.1.1:27017/simple_db"
# Create a connection using MongoClient. You can import MongoClient or use pymongo.MongoClient
client = MongoClient(CONNECTION_STRING)
# Create the database for our example (we will use the same database throughout the tutorial
return client['simple_db']
mongodb = get_database()
test.py:
import mongo_global
def mongo_input(hashMap,_files=None,_data=None):
dbname = mongo_global.mongodb
collection_name = dbname["user_1_items"]
item_1 = {
"item_name" : "Oven",
"price" : 55,
"category" : "kitchen appliance"
}
collection_name.insert_many([item_1])
hashMap.put("vibrate","")
return hashMap
Телеграмм-канал проекта, в котором масса всего полезного: https://t.me/devsimpleui