?

Log in

No account? Create an account

Previous Entry | Next Entry

Недавно был анонсирован первый релиз development ветки wxWidgets 2.9.0. Об этом я уже писал у себя в журнале, сейчас же хочу поподробнее рассмотреть попавшиеся мне на глаза изменения, касающиеся грядущего 3.0.0.

Ну первое и самое главное - основная причина смены мажор-версии - полный переход на юникод во внутренностях библиотеки. ANSI сборки больше не будет. Все строки теперь будут в UTF-16 под виндой и в UTF-8 во всех остальных системах. Почему разные кодировки? Первое правило wxWidgets - максимальная нативность, а именно такие кодировки выбраны в качестве стандарта на этих платформах (да, да опять разделение на Windows и все остальные, правда здесь, надо отметить, причины исторического характера - когда MS вводила поддержку юникода в винды, UTF-8 ещё небыло). В связи с этим основательно переработан класс wxString. Среди самых заметных изменений - функция c_str() теперь возвращает не указатель на C-строку, как это было раньше, а некий "специальный прокси-объект" wxCStrData, который может быть сконвертирован в const char* и в const wchar_t*. Соответственно, в качестве параметра для стандартных C функций (например, printf), результат этого метода теперь не может быть передан. Кроме того, макросы wxT и _T больше не нужны, их теперь смело можно удалять отовсюду (больше не будет вечной путаницы между _T() и _()). Правда стоит заметить, что строки с юникодными символами должны объявляться с модификатором L: L"Salut \u00E0 toi!". Строки, содержащие только символы текущей локали (если оная, конечно, не является юникодом) можно объявлять как обычно, но так делать не рекомендуется. Подробнее см. http://docs.wxwidgets.org/trunk/overview_unicode.html.
Раз уж зашла речь о том, чего не будет - не будет больше OBDC. Разработчики wxWidgets выкинули его по причине того, что им некому заниматься, а кроссплатформенных библиотек для работы с БД, которые лучше работают и активнее развиваются, и так пруд пруди. Что ж, мир его праху. Удалены несколько классов из wxDataView. Функциональность wxDebugStreamBuf переложена на плечи wxLog. Удалены депрекейтед классы wxDllLoader, wxNotebookSizer. wxTextAttrEx объединён с wxTextAttr, а для обратной совместимости введён дефайн одного в другое. wxArray, wxScopedArray и wxNode теперь сделаны шаблонами. wxXmlProperty переименован в wxXmlAttribute, а вместо wxLogPassThrough появился wxLogInterposer. Кроме того, в документации из trunk почему-то не упоминаются классы wxFindDialogEvent, wxIndividualLayoutConstraint, wxLayoutConstraints, wxNotebookEvent, wxRichTextAttr, wxScrolledWindow и wxTreebookEvent, хотя в исходниках они есть - сам проверил =).
Из контриба удалены неподдерживаемые библиотеки "applet", "deprecated", "fl", "mmedia" и "plot", а "gizmos", "ogl", "net" и "foldbar" перенесены в wxCode. А вот "stc" и "svg" включены в состав wxWidgets в качестве библиотеки wxSTC.
Что ещё есть в исходниках, чего нет в документации сказать сложно - не так просто всё перекопать =). Вот, например, mzet82 подсказывает, что у класса wxTaskBarIcon есть недокументированный MSW-specific метод wxTaskBarIcon::ShowBalloon(). Что же касается того, что есть в документации на новый wxWidgets, чего нет доках 2.8, то diff показал свыше сотни новых классов, некоторые из которых я опишу чуть ниже.
А сейчас ещё пара слов о грустном: wxWidgets становится чуть менее кросс-платформенным. Официально урезана поддержка GTK+ и MacOS: вместо GTK+ 1.2, GTK+ 2.0 теперь заявлена только GTK+ 2.4 (работа с GTK+ 1.2.10 пока присутствует, но не поддерживается), а МакОСь поддерживается только начиная с версии OS X 10.4, вместо 8.6/9.x, как ранее. Отсутствие ANSI сборки автоматически требует наличия Microsoft Layer for Unicode для запуска wx`овых программ на Windows 95/98/ME. Кроме того, возможно wx`ы теперь не соберутся на некоторых устаревших компиляторах, которые плохо поддерживают работу с шаблонами. Ну и, плюс к этому, стоит отметить увеличение размера скомпилированных бинарников, что, впрочем, к финальному релизу 3.0.0 ещё может измениться.
Теперь о том, что же интересного добавлено в новой ветке wxWidgets. Новшеств очень много, поэтому здесь перечислю только те, которые показались интересными мне. Если Вам интересно что-то не попавшее в этот список - пишите, с удовольствием дополню перечень.

  • Как было сказано выше, добавлено много шаблонных классов: wxArray< T >, wxCharTypeBuffer< T >, wxList< T >, wxMessageQueue< T >, wxNode< T >, wxObjectDataPtr< T >, wxPersistentWindow< T >, wxPixelData< Image, PixelFormat >, wxScopedArray< T >, wxScopedCharTypeBuffer< T >, wxScopedPtr< T >, wxScrolled< T >, wxSharedPtr< T >, wxVector< T >, wxWeakRef< T >, wxWeakRefDynamic< T >.

  • Переработана подсистема 2D графики, добавлен новый API для рисования на базе wxGraphicsContext, поддерживающий свободную трансформацию, антиалиасинг и композитные режимы.

  • Переписано много кода, относящегося к event-loop`ам, таймерам и сокетам. Теперь они могут использоваться в консольных приложениях (используя только библиотеку wxBase).

  • Добавлен механизм безопасного размножения указателей. Данный механиз охватывает всё, что наследуется от wxEvtHandler (а точнее, от wxTrackable). Суть этого заключается в том, что если на один объект есть несколько указателей (специальных), то при удалении этого объекта они все станут NULL.

  • Реализован механизм автоматического сохранения/восстановления объектов - так называемые постоянные объекты. Суть в следующем: объект регистрируется в менеджере постоянных объектов, который при удалении этого объекта сохраняет его состояние, а при создании заново - восстанавливает, причём вне зависимости от того, завершалась ли программа между этими событиями, или нет. Постоянными могут быть некоторые окна (пока не очень много, но обещают, что их число будет постепенно расти) и пользовательские объекты.

  • Переработана система выделения идентификаторов. Теперь вместо функции, тупо уменьшающей значение ID, в которой даже не было контроля за переполнением ( static int NewControlId() { return --ms_lastControlId; }), за выделение новых идентификаторов отвечает специальный класс - wxIdManager. Я считаю это очень важным нововведением и, как-нибудь на досуге, постараюсь рассмотреть как всё это работает теперь.

  • Добавлен небольшой класс для определения текущего состояния модификаторных кнопок клавиатуры(Ctrl, Alt, Shift и тд.) - wxKeyboardState.

  • Обновлена подсистема логгирования. В частности, добавлен класс wxLogRecordInfo, позволяющий получить информацию о том, когда, в какой функции, в каком файле и на какой строке было сгенерировано сообщение. Кроме того, добавлено семейство классов wxMessageOutput для легковесного вывода строк. А в сетевой подсистеме появился специальный класс wxProtocolLog

  • Для простого обмена сообщениями между потоками добавлены очереди сообщений - wxMessageQueue.

  • Под виндами появилась возможность управлять дискми - wxFSVolume . Под *NIX этот класс не доступен и, видимо, пока не планируется... А жаль.

  • Новый класс для отображения уведомлений - wxNotificationMessage. Нативная реализация пока только для Maemo (кто не в курсе - мобильный Linux от Nokia), для всех остальных платформ пока немодальный диалог, но обещают потихонечку и для других нативность сделать.

  • wxDataViewCtrl, wxDataViewTreeCtrl и wxDataViewListCtrl - симпатичные контролы для отображения табличной информации.

  • Как уже упоминалось, в основную ветку был добавлен wxStyledTextCtrl - обёртка для Scintilla, которая представляет собой TextCtrl с подсветкой синтаксиса.

  • Ещё один новый тип табличек - wxPropertyGrid. Представляет собой таблицу пар "ключ-значение", такие таблицы широко используются для описания свойств каких-либо объектов в различных IDE, CAD и подобных программах. Кстати, под это дело даже отдельную библиотеку сделали.

  • Реализованы нативный wxBitmapComboBox и wxBitmapToggleButton. Что такое wxBitmapToggleButton понятно из названия, а wxBitmapComboBox - это ComboBox с иконками радом с текстом.

  • Добавлен новый сайзер wxWrapSizer, который может при необходимости переносить расположенные внутри него элементы на другие строки.

  • Нативная реализация wxCollapsiblePane в GTK+ и MacOS X (интересно, а виндовая реализация там нативная или нет? Cмотрится жутковато, в отличие от ГТК и МакОсь).

  • Нативная реализация wxCalendarCtrl в GTK+ и MSW.


Да, кстати, немаловажным нововведением является перевод документации на систему Doxygen. Доки стали явно более качественными и удобными.

GSoC2009
Всем, кто следит за развитием библиотеки, известно, что в рамках проекта Google Summer of Code в этом году развиваются сразу три темы: новый элемент управления по типу Риббонов, wxFileSystemWatcher - класс, отслеживающий изменения файловой системы, и проект по улучшению wxAUI. Наработки по первым двум, вероятно, будут внесены в третью версию wxWidgets. С wxAUI дела обстоят похуже - что-то там всё заглохло, но можно надеяться, что кто-нибудь допилит, потому что часть работы всё-таки там проделана.

Источники:
http://www.wxwidgets.org/
http://docs.wxwidgets.org/trunk/
{src_tree}/docs/changes.txt
http://www.opennet.ru/opennews/art.shtml?num=23377
http://begemotov.net/wxwidgets/
http://www.wxdesigner-software.de/WoWoW30.html
http://wx.ibaku.net/changelog/

UPD (16.09.09): Забыл про один очень важный момент - изменения в механизме динамического связывания. Вместо методов Connect/Disconnect появились новые Bind/Unbind, которые позволяют в качестве обработчика события назначать произвольную функцию. Старые методы пока не объявлены депрекейтед, но это только из-за их повсеместной распространённости и их использование в новом коде не рекомендуется.
UPD (16.09.09): А ещё сегодня добавили новый класс - wxAny, который является альтернативой старому wxVariant, реализованной через шаблоны.
UPD (09.10.09): На этой неделе добавили ещё один новый класс - wxInfoBar. Этот контрол представляет собой небольшую панельку, появляющуюся внутри родительского окна для уведомления пользователя о чём-то не особо важном. По умолчанию закрывается крестиком, но может содержать и обычные кнопки типа Да/Нет/Не знаю. Подобные панельки можно видеть, например, в Acrobat Reader, и в Foxit Reader при открытии pdf-файла с формой (там предлагают раскрасить поля формы).

Кросс-пост в wxwidgets.

Comments

( 4 comments — Leave a comment )
(Anonymous)
Sep. 23rd, 2009 06:20 am (UTC)
Добавлен очень полезный класс wxFileCtrl, который позволяет построить кастомный диалог открытия файла. Например, сделать в нем preview.
gremlinable
Sep. 23rd, 2009 06:27 am (UTC)
Да, это я тоже видел, но не счёл особо важной вещью. Хотя, пожалуй, Вы правы, надо посмотреть поподробнее.
(Anonymous)
Sep. 23rd, 2009 06:52 am (UTC)
>А сейчас ещё пара слов о грустном: wxWidgets становится чуть менее кросс-платформенным....

А надо ли тащить поддержку совсем старых версий?
http://sellme.ru/2009/09/pod-kakuju-versiju-mac-os-x-pisat.html -
там статистика использований версий макоса, так вот ниже 10.4 0.1% - вопросов больше нет?:)
Незнаю как с GTK но думаю похоже...
gremlinable
Sep. 24th, 2009 09:21 am (UTC)
Ну я и не говорю, что это прям такая трагедия, из-за которой надо всё бросать и идти вешаться =)
Просто лично мне довольно неприятно, когда, например, новые версии софтин, которыми я активно пользуюсь, перестают работать на Win2k и из-за этого мне приходится юзать безумно навороченный WinXP, который хавает раза в полтора-два больше системных ресурсов, а половина его фич мне нафиг не нужна... Благо, wx пока прекрасно и на Win9x работает, но если так пойдёт и дальше...
( 4 comments — Leave a comment )