psilogic: (Default)
psilogic ([personal profile] psilogic) wrote2010-07-30 01:08 am
Entry tags:

Bard 0.1.3

Долгими зимними вечерами продолжаю ваять "Bard". Готова очередная бета: версия 0.1.3.

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

Эта версия - серьезный шаг, поскольку полностью переработано "ядро" - хранение промежуточных редактируемых данных. Переработка позволила сделать операции Undo/Redo практически мгновенными, понаделать легко и просто "preview" - но ценой отказа от немедленного save после каждой операции. Как следствие, autosave и autobackup убраны, теперь работа с файлом выглядит совершенно "стандартно": можно закрыть без сохранения и т.п.

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

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

Что касается испытаний для Wine, то пока все плохо. Первая попытка поставить убунту провалилась - инсталлятор линукса сначала показал 731% прогресса исполнения, а потом заявил, что отсутствует root file system или что-то в этом роде и предложил исправить дело в "partitioning menu", которое вызвать никак нельзя. На этом все и зависло. Я воспользовался инсталлятором убунты поверх винды (wubi.exe) и сказал ставить ее на свободный диск F. Там NTFS, подозреваю, что проблема в этом - хотя я надеялся, что инсталляшка по крайней мере сформатирует тот диск. Ан нет. Интересно, FAT32 ее устроит?

- Полный список изменений на странице загрузки
- Прямая ссылка для скачивания инсталлятора (11 Мб)
- Список возможностей редактора

[personal profile] no1u1w1w6c 2010-08-04 04:04 pm (UTC)(link)
Qt сама по себе няшненькая. это единственное, что оправдывает существование c++.

[identity profile] psilogic.livejournal.com 2010-08-04 07:18 pm (UTC)(link)
ну у меня, если забыть о одноплатформенности по архитектуре похоже на Qt - разнообразные layout-ы, кастомные контролы, которые выглядят почти как стандартные :)

вот только систему слотов-сигналов так и не появилось повода сделать - для реакций совсем другая схема

[personal profile] no1u1w1w6c 2010-08-04 07:24 pm (UTC)(link)
похожих — их много. а Qt — одна. %-)

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

я не к тому, что твоя библиотека хуёвая, я к тому, что Qt охуенная. %-)

[identity profile] psilogic.livejournal.com 2010-08-04 07:32 pm (UTC)(link)
вообще говоря, документация - это 50% крутости библиотеки. бывают охуенные по функцио-аналу библиотеки, но документация - сгенеренная или вовсе "читайте исходнЯки". с дрожью вспоминаю, как я ипался с FFMPEG...

[personal profile] no1u1w1w6c 2010-08-04 07:40 pm (UTC)(link)
>вообще говоря, документация — это 50% крутости библиотеки
совершенно согласен, да. но мы же все знаем, как программисты обожают писать документацию… read the source, Luke!

[personal profile] no1u1w1w6c 2010-08-04 07:25 pm (UTC)(link)
>для реакций совсем другая схема
а какая? и ваще: покажи код, не жлобься. интересно же. обещаю ругаццо только по делу (скрестил за спиной пальцы %-).

[identity profile] psilogic.livejournal.com 2010-08-04 07:45 pm (UTC)(link)
схема из двух основных частей

1 - мессаги от виндов попадают в одно из окон, а потом начинают перекидываться по цепочке примерно в таком порядке, в каком имеют наибольший шанс быть "съеденными":

- от общей функции (типа handle(msg, WPARAM, LPARAM)) к частной (типа handle_key)
- от derived-класса к based-классу
- от child-окна к layout-у в котором оно лежит и далее по ветви к корню (parent-окну)

в какой-то момент мессагу кто-то съедает, просто прекратив пересылку по цепочке

там, где в QT пишется слот, я пишу виртуальную функцию, которая принимает мессаги нужного типа.

пример:

GDurationPlacer - это layout из десятка мелких окошек, который позволяет вводить время-длительность

bool GDurationPlacer::handle_changed(GChangedMessage &ev) //сообщения об важных изменениях
{
	GVisual *s= ev.source;
	if (NULL != s)
	{
		if (s == spBlock) // пришло сообщение от чайлда spBlock
		{
			convertToTime();
			send_changed_message(); //послать вверх сообщение от себя самого
		}
		else if (s == spMin || s == spSec || s == spMsec) 
		{
			convertToBlocks();
			send_changed_message();
		}
	}
    return GBaseClass::handle_changed(ev);//обработчик базового класса
}



про вторую часть щаз напишу

[personal profile] no1u1w1w6c 2010-08-04 07:52 pm (UTC)(link)
а. то есть, стандарный старенький вариант, да. в принципе, мне лично неудобен, система подписки на сигналы лучше, мне кажется. в принципе, для неё даже отдельный препроцессор не нужен, можно на шаблонах нахреначить — libsig++, например.

то есть, в глубине Qt тоже, конечно, набор хандлеров, но он хорошо замаскирован. %-)

правда, в твоём варианте проще делать перехватчики, которые слопают или поменяют мессагу. в Qt есть фильтры, конечно, но выглядят как рукав на спине.

зыж а за скобочки на отдельных строках надо убивать, да. и за подчёркивания, потому что camelCase рулит. ну не смог удержаться! %-)

[identity profile] psilogic.livejournal.com 2010-08-04 08:00 pm (UTC)(link)
Да, стандартный лежит в основе - а то что к нему добавлено - так это аккуратный "поток" сообщений от одного объекта к другому, пока не доедят. что приятно - да, с .moc-ами заморачиваться не нужно, нет никаких жутких макросов {AFX-чего-то там} как в MFC

У меня обычно подчеркиваниями "выделяются" хандлеры и всякие коллбэки - так удобнее, сразу ясно, что вот handle_changed/send_changed_message будут дергать по событиям (handle_ - извне, send_ - вовне). А вот convertToTime - это некая функция общего вида.

[personal profile] no1u1w1w6c 2010-08-04 08:06 pm (UTC)(link)
в принципе, с теми же моками проблем нет, потому что qmake генерит вполне себе рабочий Makefile. я, правда, make ненавижу лютой ненавистью, а написать обёртку для любимого jam всё никак не соберусь.

а подчёркивания я ненавижу потому, что с паскаля начинал. а там сие не принято. %-)

mfc же — это ваще лютый пиздец, по-моему. не знаю, кто его придумал, но этому человеку надо отрезать половину жопы. это ж надо умудриться — иметь в руках c++ и так бездарно просрать все его полезные фичи.

Qt мне, кстати, нравится ещё и тем, что с ним stl нахуй не нужен. а stl я иррационально ненавижу.

[identity profile] psilogic.livejournal.com 2010-08-04 08:12 pm (UTC)(link)
ггг
у меня от STL только std::map, используемая в нескольких глубокожопных местах :) а так - тонна самопальных контейнеров. не так чтобы сильно отличающихся от STL по идеологии, просто больше функций и не надо писать длиннющие std::vector<хуй>::iterator...

особливо я люблю GBag - это хрень, куда можно сериализовать все подряд и потом доставать обратно

[identity profile] psilogic.livejournal.com 2010-08-04 07:54 pm (UTC)(link)
2- а вторая часть связана с "фенечками" которые бывают нужны относительно редко. для них слишком накладно иметь отдельные "эвенты" которые каждый раз гонять по цепочке.

поэтому делаются эдакие "аддоны". у каждого окна есть некий "разъем", куда попадают сообщения. к этому "разъему" можно подключить 1 или несколько "аддонов", которые будут слушать собщения этого окна и добавлять функциональность, вызывая "редкие" виртуальные функции, но только для этого окна

пример.

"аддон" GPipka :)) реализует любые "кнопкоподобные" элементы окон, начиная от обычной кнопки и кончая закладками в таббаре, кнопками тулбара и прочая и прочая. GPipka конструируется окном с "кнопкоподобными" элементами и начинает слать особые "пипочные" сообщения:

- "а вот юзер навел на меня мышу, можно я отрисуюсь? только перечисли фоажки, как отрисоваться выпукло, с подсветкой, с градиентом или еще как"
- "а вот юзер таки на меня кликнул - давай делай что надо"

- и собственно главному окну стается минимум функционала: сказать, где у него "кнопкоподобное", не "задисаблено" ли оно - ну и отреагировать на нажатие

[personal profile] no1u1w1w6c 2010-08-04 07:59 pm (UTC)(link)
так это, по моему, и есть сигналослоты, только немножко наизнанку вывернуте, не?

[identity profile] psilogic.livejournal.com 2010-08-04 08:06 pm (UTC)(link)
imho совсем из другой оперы. это ты как если бы в Qt обработчик сигнала конструировал из нескольких стандартных разноуровневых модулей, которые реализуют куски поведения. скажем, часто бывает надо нажать мышой и куда-то потянуть - вот чтобы каждый раз не писать код, который слушает мышку, реагирует на нажатие, реагирует на отпускание, отслеживает изменение, корректно все завершает - пишется 1 раз "аддон" GMouseDragger, которые потом присобачивается к окну и генерирует уже выокоуровневые сообщения типа: "мышь начала тянуть"/"мышь тянет"/"мышь закончила". А поверх этого может быть другой аддон, который на этих сообщениях реализует, скажем, drag-drop

[personal profile] no1u1w1w6c 2010-08-04 08:13 pm (UTC)(link)
а, да, до меня потом дошло.

кстати, в Qt так тоже можно, тащемта.

а вот чем мне мок нравится, например — это тем, что в классе можно найти слот по сигнатуре. я так делаю консольные команды: класс с кучей приватных слотов и один парзер-диспетчер. удобно: дописал метод — и команда магически начала распознаваться. всё никак не соберусь сделать подобное для чистых сей, блин.

[identity profile] psilogic.livejournal.com 2010-08-04 08:25 pm (UTC)(link)
опять же иногда удобно слот указать как параметр, а обычный сишный синтаксис со всякими .* и ->* он какой-то слишком громоздкий для этого

[personal profile] no1u1w1w6c 2010-08-04 08:37 pm (UTC)(link)
сишный синтаксис вообще ублюдочен. а сипипишный — втройне или даже больше. кто ж знал, что эта бешеная макроассемблерная херня всех перекусает?

[identity profile] psilogic.livejournal.com 2010-08-04 08:54 pm (UTC)(link)
бггг *LOL*

ушел спать :))