ChanServ changed the topic of #libreoffice-ru to: Канал поддержки русскоязычных пользователей LibreOffice | Wiki TDF http://tdf.io/wikiru | On-line документация http://tdf.io/helpru | Логи канала: http://goo.gl/gzwdwU
kompi has joined #libreoffice-ru
<tagezi> mikekaganski: тык
JohnDoe_71Rus has joined #libreoffice-ru
<mikekaganski> ?
<tagezi> вопрос по рекурсию
<tagezi> мне нужно условие сделать для выхода, у меня их 2, это наличие следующего уровня, и достижение необходимого уровня
<tagezi> но у меня в функции нет математики
<tagezi> как определить что достигло нужного уровня?
<tagezi> а
<mikekaganski> Мы же про SvxHlinkDlgMarkWnd::FillTree?
<tagezi> я слепой по ходу
<tagezi> да
<tagezi> там есть чистенная математика, сейчас попробую
<mikekaganski> разобрался?
<tagezi> да я даже как-то не подумал что в nEntries += FillTree( xLTS->getLinks(), pEntry ); nEntries - это число
<mikekaganski> хм
<mikekaganski> я думал про другое
<mikekaganski> не пойму что-то, но попробуй
<tagezi> не, так оно не работает
<mikekaganski> int FillTree( int nCurrentLevel, const css::uno::Reference< css::container::XNameAccess >& xLinks, SvTreeListEntry* pParentEntry =nullptr );
<mikekaganski> насколько я понимаю, эта функция вызывается в двух местах: в RefreshFromDoc, и сама себя
<tagezi> да, в начале nEntries = 0
<tagezi> а дальше он соответствует номеру заголовка в уровне
<mikekaganski> Вот и пусть она из RefreshFromDoc вызывается с уровнем MAXLEVEL, а сама себя вызывает с уровнем nCurrentLevel-1
<tagezi> как я понимаю
<mikekaganski> и когда nCurrentLevel = 0, дальше сама себя не вызывает
<tagezi> сламал :)
<mikekaganski> урра! наконец-то хоть кто-то ... :)))
<tagezi> да вроде логику не поменял
<tagezi> всё то же самое, только с вызовом
<mikekaganski> но большая часть замечаний пока не учтена? только рекурсию поправил и вызов без строки с пробелом?
<tagezi> в hxx не сделал
<tagezi> mikekaganski: почему класс меню не нужен?
<mikekaganski> а он разве где-то у тебя использован?
<mikekaganski> я поискал и не нашёл
<tagezi> а попап?
<mikekaganski> tagezi: kexit lfq ccskre
<mikekaganski> лучше дай ссылку
<tagezi> проще попробовать убрать
<tagezi> mikekaganski: зачем нужен метод ГетЛевел?
<mikekaganski> Не нужен, я уже понял :)
<mikekaganski> это были размышления по ходу, я тогда ещё не подумал, что всю логику по проверке того, не равен ли уровень уже принятому, можно убрать в окно
<tagezi> почему константу нужно убирать из заголовка?
<tagezi> вероятность что она изменьтся, ну очень мала
<mikekaganski> зачем имя, которое не используется нигде, кроме этого файла, нужно вне этого файла? Инкапсуляция
<tagezi> описания отдельно, выполнение отдельно
<mikekaganski> нет
<tagezi> эм
<tagezi> всегда думал, что ашки нужны для описания
<mikekaganski> заголовок нужен у нас не для разделения описания и реализации, а для совместного использования в разных единицах компиляции. В других проектах может быть иначе
<tagezi> почему m_nOutlineLevel не нужна?
<mikekaganski> а зачем она в дереве? достаточно в окне
<tagezi> не понял
<tagezi> mpParentWnd->SetOutlineLevel( m_nOutlineLevel );
<tagezi> ты предлагаешь реализовать метод получения уровня из окна?
<mikekaganski> mpParentWnd->SetOutlineLevel( nOutlineLevel );
<mikekaganski> nSelectedPopupEntry
<tagezi> и какждый раз вызыкать пересборку?
<mikekaganski> почему? mpParentWnd->SetOutlineLevel сам проверит, не поменялась ли *его* m_nOutlineLevel
<tagezi> ну, да, наверное ты прав, так будет меньше кода
<tagezi> объясни мне по поводу override
<tagezi> насколько я понимаю, это нужно чтобы потомок мог менять эту функцию, нет?
<tagezi> для обращения этого не нужно
<tagezi> то есть, если я думаю, что ктото когда-то решит её перегрузить в потомке, то лучше поставить override, но для безопасности, лучше этого не делать
<tagezi> я с тобой скоро научусь программировать, такими темпами :)
<tagezi> да, меню не нужно.. эм
<tagezi> блин, никак не могу привыкнуть с тем что заголовки включаются из предыдущего лвла
<mikekaganski> override говорит о том, что ты здесь переопределяешь виртуальную функцию предка. Если у предка нет такой функции, либо она не виртуальна, здесь возникнет ошибка - то есть ты делаешь проверку на правильность переопределения
<tagezi> mikekaganski: я люблю плюсики, но это они не решают главную проблему :)
<mikekaganski> какую?
<tagezi> почему пересталоо проверять уровень
<mikekaganski> прошу прощения?
<tagezi> ну, до этого, оно останавливалось на определённом, выбраном уровне, а теперь нет
<mikekaganski> так, поподробнее, с картинками. Я пока не могу собрать и проверить
<tagezi> ну, первое.. перестало выставлять выбранный уровень в списке попап
<tagezi> авротое, перестало ограничивать уровень заголовков в дереве
<mikekaganski> так, ясно. Для первого всё же нужно getOutlineLevel() у окна, и использовать его в pSubPop1->CheckItem( mpParentWnd->getOutlineLevel() );
<mikekaganski> причём это getOutlineLevel() можно определить прямо в заголовке (это тривиальная функция)
<tagezi> эм.. почему для этого была плоха переменная? :)
<mikekaganski> getOutlineLevel() { return mnOutlineLevel; }
<mikekaganski> потому что это (а) дублирование информации в двух местах (с предусловием всегдашнего соответствия), (б) использование лишней памяти без какого-либо выигрыша
<kompi> дайте Майку 10 рук и полновластие в Либре и он перевернет Либру
<mikekaganski> слушай, а про "перестало ограничивать..." - не пойму, вроде должно работать
<tagezi> ну, вот да, логика-то не поменялась
<kompi> mikekaganski: Экспорт полей MailMerge в форматы DOCX и DOC tdf#67207 (Mike Kaganski, Collabora) помоги по русски это написать
<mikekaganski> не могу, лучше, чем ты это здесь написал, я не могу
<kompi> майл мерге - это же рассылка?
<kompi> или в данном случае это просто тип поля?
jrj has quit [Quit: Leaving]
<tagezi> nCurrentLevel всегда больше нуля
<mikekaganski> Это тип поля, относящийся к рассылке
<tagezi> оно вообще меняется в приделах 1 только
<mikekaganski> не понял
<tagezi> если уровень установлен как 10, то принимаемые значения только 10, 9, 8
<tagezi> если 5, то 5,4
<mikekaganski> надо просто проанализировать
<mikekaganski> расскажи мне, когда у тебя пользователь выбрал пункт 1, уровень равен 1, и нужно показать только единственный верхний уровень, так?
<tagezi> да, нужно понять как вернуть текущий уровень, а не считать его
<mikekaganski> а когда пользователь выбрал 10, mnCurrentLevel равен 10?
<mikekaganski> вернуть куда? где это чисо необходимо?
<tagezi> в регрессии
<tagezi> ой
<mikekaganski> можно ведь наоборот - от 0 до mnCurrentLevel - просто проанализируй, как там по логике
<kompi> mikekaganski: то, что tooltip остается на экране, когда я переключил окно с Либры на любое иное - это бага?
<mikekaganski> Не совсем... ЛО ещё и менюшки оставляет :)
<kompi> менюшки ты правил же?
<mikekaganski> но хотелось бы изменить
<mikekaganski> нет
<mikekaganski> правил Каолан, я просто участвовал в багрепорте
<mikekaganski> и поправлено было не это
<tagezi> эм... если выбрать уровень 1, то значения 1 и 0, но собирается всё
<tagezi> и кроме того, в этом примере нет заголовков первого уровня
<mikekaganski> освежи мне память, в каком патче работало как надо?
<tagezi> в 5
<tagezi> оно по крайне мере убиралось
<tagezi> но, вот я сомневаюсь что правильно
<mikekaganski> блин, надо мне попробовать у себя
<tagezi> так, там нужны не просто вхождения в функцию, а смотреть какой уровень
<mikekaganski> Ну не должно быть так!
<tagezi> я так понимаю, чтоо при этой рекурсии вообще пофигу какой следующий уровень
<mikekaganski> там же каждый раз функция не просто вызывается, в неё передаётся последним параметром "родительский" уровень
<tagezi> но в моем примере всего 2 уровня, второй и 8
<mikekaganski> хм.......
<tagezi> вру
<mikekaganski> вот те на
<tagezi> 6, 9 и 10
<mikekaganski> ну, тогда смотри глубще, и используй аргумент nCurrentLevel как указатель на текущий уровень
<kompi> а что вы курочаете?
<tagezi> ну вот и я про тоже, нужно понять как получить текущий уровень, тогда будет всеравно сколько их
<mikekaganski> Но тогда 5 не должна была работать точно так же!
<tagezi> да, она работала по другому :)
<tagezi> не правильно, но убирала хуть что-то.. или всё :)
<mikekaganski> поймал :) Я имею ввиду, она должна была работать так же, как и в последней версии
<tagezi> нет, потому что там член
<tagezi> член не возвращает значение
<mikekaganski> ?
<tagezi> из него всё время только отнималось, каждый раз, когда входило в рекурсию
<mikekaganski> ты его менял от текущего до 0
<tagezi> да
<mikekaganski> и сейчас меняешь число от текущего до 0
<mikekaganski> но вот только если окно решит перерисоваться без менюшки, член уже будет 0
<tagezi> да, но каждый раз при выходе из уровня рекурсии значение возвращается теперь
<mikekaganski> да
<mikekaganski> так и должно быть, мы не должны перерисовку делать одноразовой (не для повторного применения) :)
<tagezi> проблема в том, что у меня 3 уровня, но уровень этих уровней не равен этим значениям :)
<tagezi> короче, правильно будет по любому получать текущий уровень и сравнивать его с нужным
<tagezi> всё остальное будет приводить к ошибкам
<mikekaganski> Ну, тогда вообще не нужен будет этот параметр-уровень, оно просто может сравниваться, что "не больше установленного максимума"
<tagezi> да
<mikekaganski> блин, строки 494, 503, 513 - просто перенести раз в 515
<mikekaganski> tagezi: а как это делается в навигаторе?
tagezi_ has joined #libreoffice-ru
tagezi has quit [Ping timeout: 255 seconds]
<tagezi_> mikekaganski: да, посмотрю
tagezi_ is now known as tagezi
<kompi> 6.0.0.2 вышел
<kompi> ыыы
<kompi> mikekaganski: оно само мне ставит редист от МС
<mikekaganski> ну, так и предполагалось
<kompi> но без админских прав тогда либра не ставится. А как же портативная сборка тогда будет работать?
<mikekaganski> хоть нормально ставит-то?
<mikekaganski> а портативная сборка тут причём?
<kompi> ну будет портативка 6.0? она же захочет тоже редист?
<mikekaganski> она всегда должна была либо включать в себя редист, либо полагаться на системный
<kompi> вот!
<kompi> я хз, как там оно
<mikekaganski> тут ничего не изменилось
<kompi> поставилось, однако почему инсталлер САМ закрылся?
<kompi> без моей реакции на кнопку Готово?
<mikekaganski> а разве раньше было не так?
<mikekaganski> проверь, если можно
<kompi> раньше заканчивалась установка и диалог инсталлера висел с активной кнопкой "Готово"
<kompi> я должен был на нее нажать
<kompi> и тогда диалог закрывался
<tagezi> нельзя получить уровень?
<mikekaganski> kompi: я прошу: проверь.
<kompi> дома
<mikekaganski> ок. Память - вещь ненадёжная.
<mikekaganski> tagezi: наверняка можно. Вопрос - как именно.
<tagezi> ну, вот вся документация на это
<tagezi> в навигаторе я вообще что-то не могу разобраться
<tagezi> там толи это вообще другими метолами решено, толи я где-то не догоняю переходы
<mikekaganski> сейчас попробую
<tagezi> само определение того что там нужно изменить уровень отображения заголовка, там 3 слоя абстракции
<tagezi> и тут я теряюсь
<mikekaganski> хмм... наверное, полная пересборка?
<tagezi> такое ощущение что там вообще без всяких рекурсий сделано
<tagezi> но это же не удобно.. и сложно просчитать ошибку
<mikekaganski> или cui/inc/strings не будет сильно пересобирать мир?
<mikekaganski> ух ты, уже
<tagezi> что?
<mikekaganski> собралось
<tagezi> да там чуть чуть вообще
<kompi> здравствуйте, это libreoffice-dev-ru?
* kompi боянит =(
<mikekaganski> да дело ж не в чутьчутести, а в том, затрагивает ли изменение 1 байта этого заголовка достаточно много другого барахла или нет :)
<tagezi> не, там файлов 12 всего
<mikekaganski> tagezi: напомни, что там за файл для теста
<tagezi> эм
<tagezi> cui/inc/strings
<mikekaganski> я про документ
<tagezi> да яд тупанул
<tagezi> они сказать что скопировали ссылку успели, а скопировать её нет
<tagezi> вот как ты мне его тогда скинул, так я и гоняю его
<tagezi> он хороший, исключения тоже видны
<tagezi> только нужно понять глазами какой уровень заголовка что
<tagezi> насколько я понимаю, через XPropertySet не вернусть, там только два свойства, имя и битмап, которые возвращаеются
* tagezi хочет грабли для кода на днюху
<tagezi> у меня такое ощущение, что на уровне кда вообще нет понятия уровня заголовка :)
<mikekaganski> да уж, там не совсем не рекурсия
<mikekaganski> нек совсем та
<mikekaganski> сначала получается список элементов верхнего уровня (таблицы, заголовки, ...)
<tagezi> угу, не совсем та, не совсем там, и не совмен не рекурсия :)
<mikekaganski> потом для каждого получается объект-контейнер
<mikekaganski> и уже этот объект добавляется в потомки
<tagezi> ну может оно и правильно, но переписывать пол ЛО не хочется
<tagezi> хочется решить малой кровью
<tagezi> пока
<tagezi> потом можно будет это уже усовершенствовать.. например все деревья сделать одинаково везде, и в одном месте
<tagezi> тогда, с ещё небольшой доработкой их можно будет забирать из скриптов, без мата, плясок и другого непотребства
<kompi> mikekaganski: расскажи ему про ящики
<kompi> mikekaganski: я 26 буду в МСК=)
<mikekaganski> хорошо. Особенно хорошо, что не 24 :)
<mikekaganski> а то у дочки др
<kompi> угу
<tagezi> это теория американца, которая была до Тюринга?
<mikekaganski> ?
<kompi> я опять хз, как там со временем будет у меня
<tagezi> про ящики
<kompi> :D
<kompi> mikekaganski: жги
<kompi> он ждет
<mikekaganski> ну уж нет, пусть историю читает :)))
<tagezi> машина Тюринга была придумана за пол годо до него и показывалась на бесконечной ленте, рядом с которой стоял мужик и поковал ящики
<tagezi> а Тюринг придумал сам термин "машина" и убрал мужика :)
<tagezi> mikekaganski: тоже классно... можешь статью писать :)
<tagezi> будет не абзац, а структура Кагаского :)
<mikekaganski> :)))
<mikekaganski> будет не абзац, а полный абзац!
<tagezi> в MIT на уроке: "А теперь создаем структуру Коганского, с одним листом " :)
<tagezi> фамилию твою переврал, прости
<mikekaganski> :))) это норм
<kompi> tagezi: прочитал?
<tagezi> да
<tagezi> самое страшное, что ведь можно использовать 2 нитки
<tagezi> :D
<kompi> самое страшное, что под ящиками может оказаться две простыни в клеточку
<tagezi> он привык думать абстрактно.. для него это проще
<tagezi> попа какая-то
<kompi> tagezi: думать абстрактно проще, чем думать о ГУИ
<tagezi> думать абстрактно, не так уж и проще
<tagezi> если его выражение записать на языке теории множеств, то получится строгая система, надкоторой будет понятно как делать любые операции
<tagezi> но ты вообще нихрена не поймешь
<kompi> =(
<tagezi> потому что проще думать конкретно: есть банан, есть обезьяна держащая банан, есть хочется, значит нужно взять дубину и дать обезьяне по голове
<tagezi> забрать банан и поесть
<JohnDoe_71Rus> пока искал дубину, обезьяна с бананом убежала
<tagezi> бегающая обезьяна с бананом - это миф :)
<kompi> tagezi: я и думал в тот раз конкретно и для себя, как для юзера я проблему понял
<tagezi> существует 2 способа решить как не получить в лоб граблями, на которые наступаешь: убрать грабли; найти обход этого места
<tagezi> второе, в программировании СПО проще сделать :)
<tagezi> если ещё и не своими руками, так вообще замечательно :)
<tagezi> я вон, уже неделю парюсь с этим меню.. просто менб блин
<JohnDoe_71Rus> и меню... и себю...
<tagezi> mikekaganski: вот смотри, pEntry имеет метод GetPos
<tagezi> это не то что нужно?
<mikekaganski> да.... придётся тебе немного поправить вот это: SwXLinkNameAccessWrapper::getByName
<mikekaganski> и там вызывать вот это: SwTextNode->GetActualListLevel()
<mikekaganski> и дополнить вот это: SwXOutlineTarget
<tagezi> нихрена себе
<tagezi> и понять как включить патьм это всё в куи
<tagezi> вообще не представляю что с этим сделать нужно
<tagezi> mikekaganski: а как ты к этому пришёл?
<tagezi> я вообще не уверен что это таже самая Link, что и в дереве
<tagezi> и не понятно, причем тут вообще sw :) я к нему не обращаюсь ни разу :)
kompi has quit [Quit: Page closed]
<mikekaganski> погоди, я за дочей, пока не могу объяснять
<mikekaganski> SvxHlinkDlgMarkWnd::RefreshFromDoc получает документ, потом получает из него интерфейс XLinkTargetSupplier, и из него - объект XNameAccess с помощью getLinks(). Для документа Writer всё это выливается в вызов SwXLinkNameAccessWrapper::getLinks()
<mikekaganski> То есть дальше, в FillTree, на первом круге, мы будем обращаться к этому объекту - SwXLinkNameAccessWrapper - за списком имён элементов
<mikekaganski> блин, поторопился
<mikekaganski> на самом деле на первом круге мы будем обращаться к результату SwXTextDocument::getLinks
<mikekaganski> то есть к объекту SwXLinkTargetSupplier
<mikekaganski> SwXLinkTargetSupplier::getElementNames возвращает список из 7 элементов
<mikekaganski> затем в SwXLinkTargetSupplier::getByName, когда имя соответсвует заголовкам (sOutlines, STR_CONTENT_TYPE_OUTLINE), уже возвращается объект SwXLinkNameAccessWrapper
<mikekaganski> с суффиксом "|outline"
<mikekaganski> Затем в SwXLinkNameAccessWrapper::getElementNames перебираются все параграфы таблицы соотвествующих объектов документа, создаются их имена с помощью нумератора, и выводятся в списке
<mikekaganski> В SwXLinkNameAccessWrapper::getByName с помощью такого же перебора проверяется, что такое имя существует, и если да, то возвращается объект SwXOutlineTarget, который имеет всего один параметр - ту самую строку.
<mikekaganski> То есть он ничего не знает ни о своём уровне, ни о параграфе, к которому относится, ни о документе - ни о чём
<mikekaganski> В SwXOutlineTarget::getPropertyValue можно увидеть, что этот объект знает всего лишь об одном - о своём имени, которое и может возвратить
<tagezi> зачемискать имя объекта по имени объекта? :)
<mikekaganski> Ну, это для общности
<mikekaganski> Моя первая мысль была сохранять в этот объект ещё что-то, например, ссылку на параграф, к которому это относится. Или хотя бы уровень
<mikekaganski> Но пока я тут гулял, я подумал, что в конце концов, щёлкнув по элементу списка, в диалоге как-то находится же тот элемент, на который мы создаём ссылку
<tagezi> почему не создается один полноценныйобъект (ну или ссылка на него) и не получается доступ к любому его параметру
<tagezi> а вдруг я хочу его изменить, вот прямо тут
* tagezi не знает зачем пока :)
<mikekaganski> значит, нужно посмотреть, как это происходит, и повторить, чтобы не городить изменений, пока ты не унифицировал всё
<tagezi> ну, найти элемент можно по имени
<tagezi> тут больше не нужно ничего
<tagezi> и скорее всего имя и название - это разные вещи... имя уникально, а отображаемое название могут быть одинаковы
<tagezi> саму идею я вроде понимаю, попытаюсь сделать
<mikekaganski> Навигатор Writer наполняется в SwContentType::FillMemberList
JohnDoe_71Rus has quit [Quit: KVIrc 4.9.3 Aria http://www.kvirc.net/]
kompi has joined #libreoffice-ru
<kompi> mikekaganski: дома установка 6.0.0.2 прошла штатно, редист ставился молча, ничего от меня не требуя
<kompi> mikekaganski: если будет желание "пообучать" меня макросам, то маякни
<mikekaganski> kompi: а у тебя дома что, отключён UAC?
<mikekaganski> или редист не ставился? (если он у тебя там уже стоит, то он не должен ставиться)
<kompi> ставился, открывалось отдельное окно
<kompi> UAC отключен конечно
<mikekaganski> а, ну тогда он и не должен спрашивать ничего
<mikekaganski> а что касается последнего ОК?
<mikekaganski> ты проверил на старом инсталлере?
<kompi> на каком старом?
<mikekaganski> 6.0.0.1 или 5-4
<kompi> я проверил на 6.0.0.2, Готово меня ждало и панель помигала кнопкой
<kompi> так что это какой-то локальный глюк на работе
<mikekaganski> а, ок
<kompi> блин
<kompi> а Питоньяка-то я не скачал сюда..или скачал?
<kompi> аа оно у меня тут бог знает когда скачано
<kompi> mikekaganski: а давай сделаем круче, напиши к коду макроса комментарии, а я на это дело погляжу и попытаюсь отследить логику
kompi has quit [Quit: Page closed]
kompi has joined #libreoffice-ru
kompi has quit [Client Quit]