Я очень, очень не доволен меню и тулбаром!

October 30th, 2008 Begemot

Ужасть просто как недоволен 🙂 Про меню я уже писал частично, сейчас будет вторая серия – буду отрыватся по полной, возможна даже нецензурная лексика:)

1. Хреновое выравнивание, посмотрите что происходит с шоткатом F2 в обоих случаях

menu_shortcut

2. Опять же хреновое выравнивае, но уже для чекбоксов. Почему его тянет на лево?

checkbox

3. Стоковые названия\шоткаты для меню – классная задумка. Но посколько, под виндой шоткаты принято обозначать как ctrl+v, а wxWidgets использует ctrlv, то ради унификации интерфейса приходится жертвовать ими и прописывать все название и комбинации жестко.

4. Для тулбара можно указать две иконки, обычную и вторую для задисейбленного состояние. Для меню только одну. Можно указать одну и там и там, полагаясь на автоматическое создание задисейбленного изображения, но алгоритмы получения второй иконки у них разные – в результате фигня.

menu_toolbar_disable

5. тулбар вообще делает задисейбленную иконку крайне загадочно. Как будет выглядеть иконка, зависит от того какая идет перед ним, установленна ли вторая иконка для предществующей иконки и похоже еще от чего-то. Видите разницу, на рисунке сверху и на двух тут, три варианта…

toolbar_disable

6. wxMenu автоматически обрабатывает все шоткаты в меню и похоже это нельзя отключить, и это проблема:(

7. А это тулбар под вистой

toolbar_vista

Пока все что удалось вспомнить. И как они его там тестируют… ? Страшно представить, что же там будет под юкнисом то. Хотя может это только у меня дар и другие не замечают, может мне в тестеры пойти ?:)

Зато wxWidgets позволяет использовать png для иконок, а вот для дельфей такого нету, сегодня народ жаловался:)

Следует отметить что я использую wxAUI, и тулбар соответвенно, от его. Может с родным было бы лучше, надо проверить.

Да, вы главное не подумайте что я сильно расстроен wxWidgets, так просто пар спускаю:) А вообще ничего, можно пользоватся, творить. Я вот даже до беты дописался. так что не все так плохо! 🙂


Как выборочно отключить шоткаты в меню. Часть вторая – фигвам.

October 1st, 2008 Begemot

В прошлом посте писал о том как как выборочно отключить шоткаты в меню, всего пару дней мне понадобилось что бы заметить что все это не работает.

Подход основывался на изменении tilte для wxMenu – удаления шотката при закрытии меню и добавления при открытии. Я еще тогда пытался изменить код на Enable\Disable – чтобы оставить текст тайтла в одном месте (легче менять если понадобится). Но это не сработало, разбиратся почему я не стал. Теперь знаю.

При нажатии горячей клавиши ассоциированной с пунктом меню, фрейм получает сообщение об открытии меню и соответвенно отрабатывает OnOpenMenu. Поэтому не работала идея дисейблить пункты, так как при нажатии хоткея  сначала вызывался OnOpenMenu, который делает Enable(), после чего разумеется шоткат срабатывал.

Но оказалась, что подход с изменением тайтла тоже не годится. Так как мы отключаем автоматическую обработку только некоторых шоткатов. Все ломается стоит только пользователю  один раз воспользоваьтся любым из автоматически обрабатываемых.

Вызывается OnOpenMenu, добавляет сокращения ко всем пунктам, которые мы вручную отключаем, а вот OnCloseMenu, в данном случае не вызывается.

Полностью отказыватся от автоматический обработки, не хочется, хотя и придется если не найду выхода. Других путей решения задачи пока не нашел. У кого-то есть идеи?

Posted in Программирование | Tags: ,
Comments Off on Как выборочно отключить шоткаты в меню. Часть вторая – фигвам.


wxSearchCtrl или может я чего-то не понимаю?

September 11th, 2008 Begemot

Писец какой-то, нужно реализовать фильтрацию\поиск в приложении, вспомнаю что в wxWidgets есть специальный компонент для поиска – красивенький такой.

image

Ура думаю, сейчас быстро заюзаю, и напишу в блог в категорию ‘+1’. Как же заюзал, вообщем сегодня будем пороть  wxSearchCtrl.

  1. Логику человека который догадался разместить кнопку начала поиска слева (!), а очистки – справа мне наверное никогда не понять.
  2. Enter по умолчанию не забинден на кнопку начала поиска, а просто служит для навигации в диалоге, переход на следующий контрол
  3. Что бы иметь возможность отлавливать Enter, надо поставить флаг wxTE_PROCESS_ENTER. Но если создать контрол с этим флагом, то вдруг перестает работать tab(?)…
  4. Connect(wxID_ANY, xEVT_KEY_DOWN, wxKeyEventHandler(MainFrame::OnKeyDown), (wxObject*)NULL,

    this); для этого контрола не работает. А мне обязательно надо…

Если кто разбирался\работал\знает – я ничего не пропустил, может можно добится того чего я хочу?

Вот не могу понять, это действительно все так плохо сделано, или у меня какие-то извращенно завышенные желания. Может мне тестером пойти работать 🙂

p.s. Кто знает как отловить факт прихода\ухода фокуса для любого контрола в окне?


Учимся вводить только цифры в wxTextCtrl

September 8th, 2008 Begemot

Поразительная фигня, казалось бы простая задача  и должно быть готовое решение. И правда есть, только поразительно кривое:(

Итак, задача – необходимо дать возможность пользователю указать число, например в настройках, количество записей  для отображения где-нибудь… Первое что приходит в голову – wxSlider, ну знаете такой контрол со стрелочками. Так как у меня диапазон от нуля до 10 000, а возможность задать шаг инкрементации для стрелочек я не нашел, и равен он 1 – то этот вариант, оказывается издевательством над юзером.

Думаем дальше и вспоминаем, про wxTextCtrl и валидаторы. Радуемся и пишем код, что-то типа

m_Count = new wxTextCtrl( this, ID_MAXCLIPTEXT, _T(""), wxDefaultPosition, wxSize(50, -1), 0, wxTextValidator(wxFILTER_NUMERIC, &count));

Я ожидал что контрол будет давать вводить в себя только цифры. Я ошибся, он также пропускал точку и запятую, что еще хоть как-то можно понять, хотя его и не просили. Но еще оказались разрешенными: ‘+’ и ‘–’. Также он спокойно пропускал все буквы кирилицы. Похоже что контрол отфильтровывал только пробел, спецсимволы и латиницу. Хотя даже это можно ввести туда пользуясь драг анд дропом или простой вставкой. Вообщем я разочаровался.

Попробывал задать более конкретно wxFILTER_INCLUDE_CHAR_LIST и разрешил только цифры. “голосуй, не голосуй, все равно … “ (с). Теже траблы со вставкой текста из буфера и …. с кирилицей. Прямо наваждение какое-то.

Решил писать сам, вот что получилось

[sourcecode language=”cpp”]
h:
void OnMaxClipTextUpdated( wxCommandEvent& event );

wxTextCtrl* m_Count;

unsigned long maxCount;
long maxInsertionPoint;
wxString maxCountStr;
bool maxSetManually;

cpp:
EVT_TEXT( ID_MAXCLIPTEXT, COPDatabase::OnMaxClipTextUpdated )

m_Count = new wxTextCtrl( this, ID_MAXCLIPTEXT, _T(“”), wxDefaultPosition, wxSize(50, -1), 0);
m_Count->SetMaxLength(4);

void COPDatabase::OnMaxClipTextUpdated( wxCommandEvent& event )
{
if (maxSetManually) return;
wxString str=m_Count->GetValue();

if (str.empty() || (str==wxT(” “))) // вторая проверка нужна для случая когда юзер выделяет все в контроле и жмет пробел
{
maxCount=0;
str=wxT(“0”);
maxInsertionPoint=1;
// or if you want to let empty string – replace last 2 string to these – maxCountStr=wxEmptyString; maxInsertionPoint=0;
}

if (str.ToULong(&maxCount))
{ // successfully converted to ulong, check range now
if (maxCount>10000) maxCount=10000;
else if (maxCount<0) maxCount=0; maxInsertionPoint=m_Count->GetInsertionPoint();
maxCountStr=wxString::Format(wxT(“%i”), maxCount); // we should do like this! иначе траблы с пробелами, нулями..
}

maxSetManually=true;
m_Count->SetValue(maxCountStr);
maxSetManually=false;
m_Count->SetInsertionPoint(maxInsertionPoint);
}
[/sourcecode]

Код выглядит извратом, но именно в такой он превратился после нескольких итераций, и такой заработал лучше всего.

Поведение (юзабилити) не идеально, но твердую 4-ку я бы поставил. Хотя в случае если диапазон снизу ограничен не нулем, тогда поведение хреново будет, но у меня такого случая пока не было. Как выход можно исключить динамическую проверку диапазона, и перенести ее в код сохраняющий значение.

Еще совет, лучше поставить ограничение на длину вводимых символов, типа m_Count->SetMaxLength(4); для верхней границы 10000 и т.д.

Пользуйтесь. Высказывайтесь.


MiniFrame Looks Terrible in Gnome

August 2nd, 2008 Begemot

If you ever want to create a cross-platform program with an interface similar to Photoshop’s, i.e. using palettes with different tools, don’t use wxWidgets. The only thing that comes close to that sort of palette is wx’s MiniFrame, which can only minimize / iconize on Windows. In GNOME, the MiniFrame looks terrible, especially with Compiz enabled. It cannot be….

http://gayhacker.wordpress.com/2008/07/11/the-wxminiframe-problem/


Завершение программы при выходе из системы или EVT_QUERY_END_SESSION нам не всегда друг

April 8th, 2008 Begemot

Полюбуйтесь на это  – http://sourceforge.net/tracker/index.php?func=detail&aid=1428691&group_id=9863&atid=109863 . Багу больше 2x(!) лет, тянется еще с прошлого стабильного релиза. До сих пор не пофиксен. Status: Open.  А ведь есть специальные события даже  EVT_QUERY_END_SESSION и EVT_END_SESSION

Потратил полдня включая\выключая комп что бы найти приемлимый порядок команд для того что бы заставить его корректно выходить при выключении компа и сохранять настройки. И вчера уже собираясь выложить первую бету народу, обнаружил что под win2K не работает все равно. Мало того что не работает, так еще и подвисает при выходе. Сейчас опять буду е****я что бы работало везде.


C размаху головой об стену бьюсь

March 31st, 2008 Begemot

Начал делать опции, диалог набросал – вполне нормально получилось. А дальше траблы:

  1. Контрола для ввода горячей клавиши в wxWidgets нету. Из сторонних решений есть keybinder, но как я понять это достаточно мощный комбаин предназначенный немного для другого. Но попробую поковырять. Откровенно говоря подозреваю что такой контрол и ручками можно написать достаточно просто или вообще виндовый заюзать (хотя не уверен что это можно).
  2. Чекбоксы не поддерживают мультилайн. Хреново. \r\n не работает, хотя это было бы тоже не выход а костыли. Почему то у wxStaticText есть Wrap, а чекбокса нету.

 

Да если вас заинтересовал первый пункт, то наверное будет интересно узнать, что возможности сделать system wide hotkey под linux’om тоже нету. Разработчики библиотеки говорят – что линукс не дает такого апи. Хотя ходят слухи, что какие обходные пути есть. Дожевем до линукса посмотрим.


Антиспамеры зло

March 22nd, 2008 Begemot

Чего-то там правят в списках рассылки wx’совских, перенесли на новый сервер, поставили SpamAssassin.  Теперь все мои письма Blocked by SpamAssassin. Обращения на форум шадонета не помогло, письмо лично тому чуваку который анонсировал изменения в майл листах тоже без ответа. Так что теперь чукча не писатель, чукча читатель.

Posted in Uncategorized | Tags:
Comments Off on Антиспамеры зло


wxRichTextCtrl не фонтан

January 12th, 2008 Begemot

Как я и боялся wxRichTextCtrl не всегда адекватен. За час тестов я нашел кучу “странного поведения”, и раза 4 он херил мне стиль всего документа. В результате несложных манипуляций- то весь текст стает жирным, то центрированным, самый тяжелый случай – при ресайзе окна весь текст превратился в сплошной список, каждый пункт которого начинался с ‘1’ и всеб было bold & italik. Ну и как я могу дать подобное юзерам? Ответил Julian Smart’y на его предложение юзать wxRichTextCtrl, описанием багов и методикой воспроизведения одной из ситуаций, посмотрим что ответит – как никак он автор.

Уточню, речь шла о использовании wxRichTextCtrl  как РТФ редактора. Мысль о том, что можно попробывать эмулировать им простой эдит с расширенной функциональностью все еще не покидает меня – буду пробывать.

Posted in Oбщее | Tags: , ,
Comments Off on wxRichTextCtrl не фонтан


Мягкая часть тела с Edit’ами

January 10th, 2008 Begemot

Просто какая-то отвратительная ситуация с эдитами в мире, причем не  в wxWidgets а в целом. Не могу подобрать идеальный Edit Control для своей задачи, хотя требования у меня довольно простые, без особых наворотов.

Чего хочется:

  1. Функциональность обычного простого эдита (notepad)
  2. _Обязательно_ множественное undo\redo.
  3. _Желательно_ подсветка и клик на ссылках.
  4. Корректная работа с точки зрения пользователя.
  5. Хотелось бы иметь возможность в будущем (опционально) перейти на RTF если стукнет в голову.

Собственно если говорить про MSW и wxWidgets, есть 4 варианта:

  1. Обычный edit control (CEdit, wxTextCtrl, Notepad) – (2) обязательное условие не выполняется.
  2. RTF контрол (CRichTextCtrl, wxTextCtrl+wxTE_RICH, WordPad) – все пункты кроме (4) выполняются. На скорость работы и совместимость версией под линукс можно забить пока, но (4) условие не выполняется. Для пользователя контрол должен выглядеть простым (не ртф) – соответвенно вставять и копировать _только_ plain text, этого добиться не получается.
  3. wxWidgets версию RTF контрола wxRichTextCtrl (generic, ground-up implementation of a text control capable of showing multiple styles and images.) – Как-то она вообще не внушает доверия в плане работы, к тому же пункт (5) вызывает определенные проблемы.
  4. Scintilla – там что-то непонятное с RTF, с одной стороны он умеет с ним работать – сохранять файлы как RTF, копировать в буфер – но полноценной работы я не нашел.

Наверное забью я в итоге на пользователей (и на себя самого, потому что от отсутствия ундо я сам страдаю) и возьму для начала обычный edit.