X custom charset что это значит при звонке
QML — больше, чем просто GUI
Пятница, как известно, — конец рабочей недели, лучшее время для развлечения и игр. А лучшие игры — это те, которые увлекательны, в которых надо немножко подумать, и в которые можно сыграть с друзьями. Одну из таких игр я и решил написать.
Этот пост не является очередным переводом или вольным изложением разнообразных QML Howto и Quick Start. Скорее, это описание подводных камней, с которыми можно столкнуться при написании реального приложения.
Когда Qt Quick/QML только было заявлено, от Нокии звучали слова, что «в перспективе не только пользовательский интерфейс будет писаться на Qt Quick, но и вся логика несложных приложений будет написана на яваскрипте, программистам не потребуется написать ни строчки кода на плюсах». Заявление было ещё более провокационное, чем мой заголовок, и сразу меня заинтересовало: я решил попробовать написать несложную игру без единой строчки кода на плюсах.
Об остальном мы узнаем под катом.
Версия первая, или война с драг-н-дропом
В качестве отправной точки была выбрана игра Цаар — настольная логическая игра для двух игроков. Я искренне надеюсь, что моя коварная реализация данной игры не вызовет негодования правообладателей, но тем не менее рекомендую заинтересовавшимся её купить — в живом виде она куда интереснее, чем в моём исполнении.
А мы возвращаемся к разработке. Первым делом я десять минут созерцал игровое поле (на рисунке сверху): во всех приличных играх оно, как известно, прямоугольное. По истечении десяти минут я сказал: «Ага!», дополнил картинку узлами так, чтобы образовалась прямоугольная сетка, после чего написал функцию для проверки, существует ли узел на самом деле.
Я так подробно расписываю свои экзистенциальные метания и так мало привожу кода, чтобы прям сейчас добавить: это самые большие проблемы, с которыми я встретился в процессе. Это действительно так. Спозиционировать поле на форме, сгенерировать и расставить фишки, сделать самодельные кнопки и вывод статуса — нет проблем! Анимировать перемещение фишек — 2 строчки! Разрешать и запрещать игроку двигать различные фишки в зависимости от фазы хода — всё это в QML делается настолько элементарно, что я могу только предложить почитать официальный мануал с примерами. К окончанию работы, js-файл со всей основной логикой, включая пустые строки и комментарии, занимал аж 173 строки или 6 функций.
Ах нет, пожалуй, я вспомнил один момент, который меня изумил и вынудил написать костылик. Этот момент называется: drag’n’drop. Да, это звучит странно, но драг-н-дроп в чуть менее, чем полностью графическом тулките сделан хреново. «Таскать» можно, оказывается, не элемента, а MouseArea, который на нём лежит. Единственное, что мы можем — это определить, какими кнопками можно жмякать, и какие ограничения по координатам у нас есть. Нельзя, как при работе с системой, обработать событие «в меня чем-то кинули, что это», нельзя разрешить кидаться элементом только в определенные объекты. Можно только обработать события pressed и released. Дальше крутись как хочешь. А в примерах, если мне не изменяет память, такими глупостями вообще занимаются только со всякими Grid’ами и List’ами, никаких тебе произвольно спозиционированных элементов. Видимо из-за этого, кстати, сказать элементу «мне то, как тебя кинули, не понравилось, вернись на место», тоже нельзя. Я же говорю, разработчики только о разборе RSS думали.
Поэтому пришлось поступать следующим образом. Свойством элемента, очевидно, являются не его координаты на экране — x и y — а позиция на доске. Координаты высчитываются исходя из позиции. При событиях pressed и released мы запоминаем исходную позицию и вычисляем, в какую новую пытались кинуть элементом. После этого вызываем функцию, отвечающую за перемещение элемента. Если функция говорит нам, что перемещение невозможно, нам надо сделать с элементом что? Правильно, вернуть в исходную позицию. Смотрите внимательно за руками:
Видите это присваивание минус единицы? Ага. Дело в том, что в QML, если присвоить свойству то значение, которое в нём уже лежит (oX и oY), то движок считает, что свойство не изменилось, и не пересчитывает всё, то что с ним связано, в нашем случае это абсолютные координаты на экране. Приходится присваивать некоторое заведомо отличающееся значение, и только потом исходное.
Сама реализация драг-н-дропа выглядит вот так:
И вот на этом все проблемы действительно закончились. В игру можно было поиграть, выиграть за белых, выиграть за чёрных. Но — на одном компьютере. Это было скучно, я жаждал игры по сети с друзьями. И тут на сцену выходит вторая итерация разработки, гораздо более интересная.
Где в этот момент я начал задумываться и о третьей проблеме, но пока до неё ещё не дошло, мы поговорим о сети.
Как я обнаружил, в QML очень бедная и грустная поддержка работы с сетью. У нас есть Ajax-запросы из javascript-движка (причём, только асинхронные), и у нас есть активно измусоленный во всех примерах XmlListModel. Мне не хотелось бы верить, что весь QML был создан исключительно для лёгкого разбора RSS-потоков.
Как бы то ни было, забегая вперёд, скажу, что самой наглядной иллюстрацией бедности работы с сетью в QML является следующая строчка:
Если коротко, я хотел бы при закрытии игры отправлять на сервер сообщение, что я отключился и сессию можно убивать. Проблема вся в том, что при приходе сигнала я создаю асинхронный ajax-запрос, «отправляю» его, а дальше… а дальше наш цикл событий (event loop) успешно продолжает работу и штатно завершает работу программы — ведь причиной сигнала был нажатый крестик в углу окна. Вуаля! Запрос никогда на самом деле не успеет дойти до сервера. Никогда. Но я пытаюсь, я верю в лучшее.
Ну а пока это всё в будущем, сейчас я ещё смотрю на два варианта общения с сетью и, естественно, отбрасываю XmlListModel. Не будь установки использовать только QML, разумеется, можно было бы просто открыть сокет, но я решил выжать всё необходимое из яваскрипта.
С одной стороны, без этого приложение, наверное, не стало бы таким интересным, как сейчас. С другой — я поимел кучу проблем. Об этом и расскажу.
Я перерыл интернет, я обнаружил инструкцию — принудительно сменить кодировку ответа на x-custom-charset — я обнаружил, что js-движок в Qt это не позволяет, и сменил кодировку прямо на сервере. После этого я скачал готовую библиотеку BinaryReader.js, которая уверяла, что способна читать текст по байтам и попробовал читать результат ещё и ей. Всё было тщетно — JS упорно отдавал мне 0xff вместо моего байта. На своё счастье я обнаружил, что индексы всех разрешенных для фишек ячеек — чётные. Я стал делить их пополам при передаче, и это позволило читать данные, как положено. В итоге код оброс ещё всего одним компонентом на 170 строк, который взаимодействовал с сервером и позволял насладиться полноценной сетевой игрой, а я подошёл к последней проблеме — о ней сразу после рекламы.
Версия третья, или куда пихать?
Интерфейсы на QML проектируются действительно очень легко и быстро, даже такими интерфейсо-ненавистниками, как я.
На QML можно написать игру или приложение, работающее с онлайн-сервисом. Если аккуратно обогнуть спрятанные грабли, то простота и удобство вас очень приятно удивят.
При толике желания из всего кода можно сделать один приятный бинарник со всеми включенными ресурсами, который и распространять
Работа с сетью всё-таки хромает. Мне кажется, разработчики игр для мобильных устройств (особенно в свете пиара NFC и тому подобного) были бы счастливы, будь у них возможность нормально установить соединение между устройствами, не вылезая на уровень C++
Искоробочный пример в qtcreator — сломан. Это страшный минус. Когда неправильно работает приложенный к IDE хеллоуворлд, это кидает страшную тень на всю библиотеку. В данном случае это наезд в сторону разработчиков QtCreator, а не самой технологии. Тем не менее, имейте в виду. Возможно, в версиях более поздних, чем моя 2.2.1, эту проблему исправили.
Судя по отпиленному синхронному режиму в XMLHttpRequest и кривой работе с побайтовым чтением, у меня сложилось ощущение, что JS-движок в Qt местами ущербен. Будьте аккуратнее.
Желающие сыграть в эту замечательную игру могут прочитать правила (возможно, их русская версия от Игроведа будет понятнее), скомпилировать игру командой qmake && make, и сыграть — только помните, что вам нужен партнёр, который тоже подключится к серверу.
Пользователи 32-битной Ubuntu 11.10 (может, и других систем, не обещаю) могут без затей скачать архив: sorokdva.net/tzaar/tzaar.tar.gz и запустить уже собранный бинарник. Для работы нужен пакет libqtwebkit-qmlwebkitplugin.
И если кому-то вдруг показалось, что это я усиленно ругаю QML, то я напомню два момента. Первый: на QML я написал игру в свободное время за, в общей сложности, максимум 40 часов (на самом деле меньше). Второй: на традиционном Qt и с его работой с графикой я написать игру не смог. И это должно уже говорить само за себя. А я в общем-то не то чтобы неосилятор.
X custom charset что это значит при звонке
Краткое описание:
Телефон и Контакты с гибкой настройкой (более 6000 опций) и поддержкой большинства современных Dual SIM устройств с 2-мя и 3-мя сим картами.
— блокировка вызовов с нежелательных номеров
— подсистема «Прямой вызов» для упрощения посылки вызовов (автоматизированная подстановка номеров для посылки вызова)
— правила набора (преобразование набираемых номеров, выбор SIM-карты для Dual SIM устройств)
— правила форматирования (преобразование отображаемых номеров)
— поддержка номеров РОРС РЖД
— создание и отображение сегодняшних событий контактов (дни рождения, годовщины и т.д.)
— онлайн-каталоги пользовательских Конфигураций и Тем
— встроенный каталог из 100 Тем для стандартной конфигурации
Краткий отзыв:
Всегда писал, что это не просто звонилка, это сложный конструктор, который удовлетворит любого привередливого пользователя, как основными функциями совершения звонков, так и возможностью подстроить на свой вкус внешний вид. Главное, чтобы у пользователя хватило терпения разобраться во всех настройках.
Краткий отзыв:
Вам тесно в стандартной звонилке и есть чёткий запрос настроить всё под «себя»?
AGContacts обладает для этого громадным набором инструментов и гибкими настройками, что позволяет реализовать свои узконаправленные потребности и особые сценарии использования звонилки.
Краткий отзыв:
Программа очень нравится потому, что удобна для меня в пользовании.
Краткий отзыв:
Норм!
Лень писать) пару дней попользовался бесплатной версией и перешёл на полную, уже второй телефон с этой программой, всем доволен.
Оценка:
от 0-ля до 5 звёзд (5 звёзд: ★★★★★ | 4 звезды: ★★★★☆ | 3 звезды: ★★★☆☆ | 2 звезды: ★★☆☆☆ | 1 звезда: ★☆☆☆☆ | 0 звезд: ☆☆☆☆☆)
Краткий отзыв:
краткий отзыв одним-двумя предложениями для помещения в раздел отзывов в шапке темы вместе оценкой
Достоинства:
— первое достоинство
.
— последнее достоинство
Недостатки:
— первый недостаток
.
— последний недостаток
Отзыв:
отзыв в произвольной форме
Решение проблем с экранами входящих/исходящих звонков:
Часто задаваемые вопросы (ЧаВо, FAQ):
Каталог пользовательских Конфигураций и Тем:
Для выбора Конфигураций и Тем программы можно использовать механизмы, которые описаны в FAQ:
Выбор Конфигураций и Тем
Очень красивая конфигурация со своей логикой работы. Работает при любых разрешениях экрана.
Очень красивая конфигурация со своей логикой работы. Работает при любых разрешениях экрана.
Очень красивая конфигурация со своей логикой работы. Работает при любых разрешениях экрана.
Очень красивая конфигурация со своей логикой работы. Рекомендуется для устройств с разрешением экрана от 720*1280 и больше.
Очень красивая тема для конфигурации Boss. Хром и метал, стильные иконки! Рекомендуется для устройств с разрешением экрана от 720*1280 и больше.
Очень красивая конфигурация со своей логикой работы. Работает при любых разрешениях экрана.
Очень красивая конфигурация со своей логикой работы. Работает при любых разрешениях экрана.
Очень красивое, но крайне необычное графическое решение. Интереснейшая задумка. Размытые линии, высокая степень прозрачности окон, эффект присутствия. Конфигурация находится в работе, но вполне годится и для повседневного использования. На мой взгляд, рекомендуется для устройств с большими экранами и высоким разрешением. Впечатления на Xiaomi Max 2, как будто попадаешь в картинную галерею.
Очень красивое графическое решение, полностью своя логика работы программы, абсолютно оригинальный подход к реализации «звонилки». Грандиозная по трудоёмкости разработка! Для правильного использования необходимо читать описание Конфигурации от автора. Скриншоты также рекомендую смотреть в авторском посте.
Веселая конфигурация в синих тонах. Классная шуточная реализация экранов вызовов! Если стало скучно, жизнь можно раскрасить этой конфигурацией 🙂
Чёрно-красное ультимативное графическое решение. Очень красиво и стильно!
Прозрачная конфигурация над обоями рабочего стола. Графическое решение базируется на конфигурации из онлайн-каталога «ПриродныеМотивы.Тропики».
Другой вариант прозрачной конфигурация над обоями рабочего стола. Графическое решение базируется на конфигурации из онлайн-каталога «ПриродныеМотивы.Лес».
Золотая лихорадка в разгаре! 🙂 Немного не хватает блеска бриллиантов, но это настоящее золото. из алюминия 🙂 Конфигурация собрана на основе Aluminum.
На мой взгляд, одна из самых красивых конфигураций! Потрясающая графика! По умолчанию рассчитана на высокие разрешения экрана.
Цель: воссоздать интерфейс True Phone для легкой миграции пользователей. Графика не переделывалась, чтобы не было стопроцентного плагиата. Естественно, не все удалось воспроизвести, т.к. функционал все же различен.
Любителям погонять с ветерком! Шикарное графическое решение. Кожа, грубая строчка, скорость. скорость. скорость 🙂 Рекомендуется для устройств с высоким разрешением экрана.
Конфигурация в красно-черно-золотых тонах. Как всегда, изумительное графическое решение от RequeLine! Своя логика работы. Рекомендуется для устройств с высоким разрешением экрана.
Конфигурация со своей логикой работы в стиле и духе программы Google Контакты с тёмной темой. Грандиозная по трудоёмкости новая разработка JuFCK! Для устройств с высоким разрешением экрана. Перед установкой ОБЯЗАТЕЛЬНО читать инструкцию по использованию (!) 🙂
Конфигурация с анимациями на кнопках и некоторых фонах (только под последнюю альфа-версию). Атмосферное графическое решение от RequeLine! Рекомендуется только для устройств с высоким разрешением экрана.
Демоверсия конфигурации с анимированными обоями и кнопками (только под последнюю альфа-версию). Психоделический фон Главного экрана, можно медитировать 🙂 Графическое решение базируется на конфигурации из онлайн-каталога «ПриродныеМотивы.Тропики».
Демоверсия конфигурации с подложкой номеронабирателя. Сделана в стиле Motorola RAZR.
1. Скриншоты программы в режимах Контакты, История и Избранное выше приведены в ознакомительных целях с Samsung Galaxy S4 Mini (экран 540×960 точек, минимальный размер системного шрифта).
2. Полное описание и другую важную информацию вместе с оригинальными авторскими скриншотами рекомендуется смотреть в постах с Конфигурациями 🙂
Примеры различных настроек интерфейса InCallUI:
Каталог заготовок для кнопок и других элементов оформления:
aContact+++ Next v2.0.41130.741
Будем считать эту версию первой публичной (начало обсуждения см. отсюда в ветке aContact+++). В целом, программа уже достигла приемлемого уровня, когда ее могут использовать конечные пользователи. Поэтому вместо статуса «технический просмотр» сразу будем считать все версии начиная с текущей релизами. 🙂
Да, в данной версии добавлена возможность настройки высоты кнопок клавиатуры в портретной и альбомной ориентациях экрана.
Скачать:
— ссылки на загрузку программы доступны в шапке темы
Изменения относительно v2.0.41129.721:
Э. э, так это как раз и есть единый новый стиль для диалогов 🙂 Так все диалоги сейчас сделаны. Согласен, отнюдь не самое удачное дизайнерское решение. Там технические проблемы с переделкой диалогов, серьезно заняться еще не успел. Будет иначе, спасибо за напоминание.
P.S. Вспомнил, как раз окно выбора симок по новой технологии сделано было 🙂 Руки не дошли кучу диалогов править.
P.P.S. В следующей версии будет иначе, нашел техническое решение. Осталось только придумать новый стиль оформления для заголовков диалогов.
Naghual80, нет, я имел в виду стиль заголовков всех диалогов (см. скриншот 6 в шапке). Сейчас уже поменял, вместо обведения и фона с закругленными полями сделал более классический вариант (аля в диалоге выбора симки на 5-м скриншоте). Текущий вариант просто был плох, т.к. было не очевидно, что это заголовок. Больше напоминало выбранный пункт списка.
aContact+++ Next v2.0.41201.764
Изменен стиль заголовков для всех диалогов на более классический вариант, чем был в программе.
Скачать:
— ссылки на загрузку программы доступны в шапке темы
Изменения относительно v2.0.41130.741:
Как поддержка тем устроится, будет возможность настройки темы целиком под себя, т.е. настройки не только цветов текста, но и всех элементов, включая кнопки и т.д. Сейчас в программе все задается цветовыми палитрами, достаточно их переопеределить и все. Просто в настройки пока не вынесено из-за ведущихся доработок дизайна.
Спасибо, если честно, давно это вообще не смотрел. На самом деле, там для доработки висит большой блок. Надо статус соединения перехватывать, но не так, как сделано сейчас. Тогда появится нормальная функциональность многих фич типа «вибрация при соединении» и т.п. В общем, это будет комплексно дорабатываться.
Технически то сделать не сложно, но уж больно «большие» Настройки тогда будут. Да и замедляет все же работу интерфейса это, правда, только если включать перекрытие настроек программы по умолчанию. Подумаю.
И вот только когда мама
P.S. Кнопки клавиатуры случайно не редактировались?
P.P.S. А если снести программу полностью и поставить заново с настройками по умолчанию?
Так я её уже сколько раз сносил, этож ещё с предыдущим aContact+++ вопрос задавал про поиск :yes2:
Абсолютно не сложно ru.agc.acontactnext_preferences.xml ( 9.55 КБ )
faza74, я сейчас посмотрел алгоритм, похоже локализовал проблему. На всякий случай, хочу уточнить, на твоих скриншотах, где «неправильно» найдено, контакты действительно большими буквами вбиты? В смысле, имена в верхнем регистре прописными буквами? Похоже, именно в этом вся проблема и есть.
В общем, видимо, разобрались. Поиск работает правильно и штатно, что уже слава богу. Ну а в следующей версии будет гениальная опция для тех, у кого есть контакты с именем и фамилией в верхнем регистре 🙂