LINUX.ORG.RU

А вот кому IDE для C++?

 ,


0

1

Всем привет. Написал себе IDE для плюсов(строго под линукс), от лени, и от того, что другие не нравились. Написана на плюсах, с использованием wxWidgets, плюс clang либа. вот выложил видос как создать проект, сбилдить и пустить аппу.

https://www.youtube.com/watch?v=5DtzFbrjpVw

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

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

исходники не выкладываю. поскольку работаю на убунте 20.04, то приветствуются персоны с этой убунтой, чтобы не пересобирать аппу. Если есть вопросы - пишите сюда.

также в этом эккаунте на ютубе, есть и более ранние видео об IDE, где можно получить приблизительное представление о ее фичах, с учетом, что она модернизировалась за это время.

добавленное видео: https://www.youtube.com/watch?v=73qxNBq2Thk

нерафинированный видос - парсинг сорса в фоне. https://www.youtube.com/watch?v=nFyKyAsZEvk

Алексей.

★★★

Последнее исправление: cetjs2 (всего исправлений: 3)
Ответ на: комментарий от anonymous

В детский садик принесли новые погремушки …

А мне вот две погремушки понравились.

1) Возможность загрузки в виде объекта /не как xml, а именно объект/ в объектную мета дата базу *.docx или *.xslx.

2) Разработать не сложное API для программного поиска/замены ...  

3) Возможность сохранить объект в *.docx или *.xslx

За основу ни какой проект браться не будет.

Уже играюсь!

anonymous
()
Ответ на: комментарий от fernandos

У вас своё лично определение свободы

Опять маняврирование пошло.

LikeABoss
()

исходники не выкладываю. поскольку работаю на убунте 20.04, то приветствуются персоны с этой убунтой, чтобы не пересобирать аппу. Если есть вопросы - пишите сюда.

Алексей, не осуждаю вас за то, что исходники не выкладываете.

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

В данном случае вы разработали новый tools /IDE/.
Скорее всего в IDE ничего инновационного не будет …

anonymous
()
Ответ на: комментарий от anonymous

В данном случае вы разработали новый tools /IDE/. Скорее всего в IDE ничего инновационного не будет.

не выкладываю в основном потому, что не считаю код «доведенным до кондиции».

я начал делать эту иде по двум причинам.

  1. было свободное время, и хотелось заняться чем-то не только интересным, но и полезным.

  2. хотелось написать что-то оконное для линуха, используя wxWidgets.

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

  4. Были какие-то смутные подозрения, что ide может быть простым, и в то же время удобным для навигации по коду, работе с ошибками и проектами.

  5. Долгое время перед этим работал в Codeblocks,и он меня достал. Там нет поддержки гита, неудобная навигация по ошибкам, собственный парсер плюсов-который в силу простоты не мог нормально автокомплитить и искать декларации и реализации, неудобный интерфейс вообще и все такое. Хотел было с ними связаться чтобы покоммитить им, но посмотрел исходники… увидел что там такие навороты… и понял, что разбираться неохота.

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

чем отличается от CodeBlocks например.

-более наворочанными маркерами - то есть пометками и разметками кода на предмет ошибок, варнингов, поисков и прочее.

-лифтинг опасных варнингов в ошибки - типа невозврата результата из функции.

-разметка варнингов/ошибок по признаку принадлежности их к проекту или внешнему к проекту коду.

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

-clang парсер, для автокомплита и прочей семантической работы.

ну и так далее.

каких фич пока нет.

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

  • рефакторинг. понятно как делать, но в силу не такой уж постоянной необходимости, хотя порой и хочется, пока не сделано.

  • ну еще… форматирование кода может быть, но есть внешние тулзы для этого вообще-то.

  • ну может подсветку привязать к clang парсеру, и выделять типы другим цветом.

есть только один трабл, что мне покоя не дает.

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

поскольку ide перехватывает исключения и делает посмертный дамп - то видно где упало.

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

alysnix ★★★
() автор топика
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

@alysnix, РАД ЗА ТЕБЯ!

Так надоели на ЛОР, «мегающие светодиодами», а здесь тред

РАЗРАБОТЧИКА!

Респект ТЕБЕ!

anonymous
()
Ответ на: комментарий от alysnix

… локализовать ошибку не могу в силу редкости. а когда она падает, я занимаюсь каким-то другим проектом и локализовывать нет времени

У меня в основном такая бяка /иногда/ происходит при обращении к полю через nullptr …
То бишь Объект->Поле, а Объект == nullptr.

Данным верить НЕЛЬЗЯ!
anonymous
()
Ответ на: комментарий от anonymous

У меня в основном такая бяка /иногда/

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

но в принципе я просто перезапускаю ide и все. последняя вижуал студия от майкрософта вообще падает регулярно, если ее потеребить.

alysnix ★★★
() автор топика
Ответ на: комментарий от alysnix

но в принципе я просто перезапускаю ide и все. последняя вижуал студия от майкрософта вообще падает регулярно, если ее потеребить.

С 2013 и по сей день использую Visual Studio 2013.
Основная причина - неприятие новых стандартов C++.

Sorry за повтор.

У меня свой API, который покрывает всю потребность в STL.
Если чего-то там «не достает», расширяю API.

В результате все шустро работает /но это не упрек STL/.
Зато у меня к примеру вектор может содержать поля разного типа, …
Да и сотни ограничений STL, … канули в лета.

Сегодня вот с утра начал рефакторинг своего API, потому как местами все же STL используется.

В чем профит.

Исходники можно скомпилировать любым древним компилятором /вплоть до MSDOS/.

Вообщем разработку OLE и объектно-ориентированной базы не ПОДСАЖИВАЮ НА ИГЛУ СТАНДАРТОВ.

Не утверждаю, что на 100% прав, но для выше упомянутых проектов ИМХО выбран именно такой подход …

Тасовать байтики можно эффективно и без всяких STL …

anonymous
()
Ответ на: комментарий от anonymous

Не утверждаю, что на 100% прав, но для выше упомянутых проектов ИМХО выбран именно такой подход …

Многое сделано и более того апробировано в API, использующего API core моих библиотек, а core еще существенно будет расширено.

Зачем мне публиковать, то что каждый день расширяется?
На радость Microsoft, …?

Вопрос не такой простой, как может показаться.
Самое простое объяснение - ЖМОТ.

Ok!

Let it be
anonymous
()
Ответ на: комментарий от anonymous

С 2013 и по сей день использую Visual Studio 2013.

Фу, она же 11й стандарт поддерживает и вообще на богомерзком си-шарпе написана. Качай студию 6.0, не позорься.

anonymous
()

Если будет кроссплатформенной и с амбициями на развитие + будет уметь cmake, буду донатить.

normann ★★★
()
Ответ на: комментарий от normann

Если будет кроссплатформенной и с амбициями на развитие + будет уметь cmake, буду донатить.

она изначально все билдит через cmake. то есть при билде генерится, из описания проекта, cmakelists.txt, запускается cmake с опцией бекенда - gnu-make или ninja. соотвественно в опциях проекта есть выбор бекэнда для билда. там и отладчик есть - используется gdb.

там можно посмотреть смейклист просто кнопочкой для текущего проекта. вот что она дает для самой ide

# this file is automatically generated by Ide
# generated for target: effective
cmake_minimum_required(VERSION 2.8)
project(CodeBee)

# Set Project base path variable:
set(__project_base  /home/alyss/HOBBY/CodeEditor/Editor2)

### Set Output Path variable:
set(__output_dir  /home/alyss/.local/bin)

### Declare packages to find
find_package(wxWidgets COMPONENTS core base stc richtext aui propgrid adv xml qa)

### Declare libs to locate
find_library(LIB_0 ALSL /home/alyss/HOBBY/CodeEditor/COMMON/ALSL/_build_)
if(NOT LIB_0)
  message(FATAL_ERROR "library <ALSL /home/alyss/HOBBY/CodeEditor/COMMON/ALSL/_build_> not found" )
endif()


### Set Target Name variable:
set(__target   CodeBee)

### Declare sources to link:
set(__Src 
${__project_base}/src/ed_common.cpp
${__project_base}/src/ed_doc.cpp
${__project_base}/src/ed_events.cpp
${__project_base}/src/ed_system.cpp
${__project_base}/src/ed_types.cpp
${__project_base}/src/cl_base.cpp
${__project_base}/src/cl_parser.cpp
${__project_base}/src/ed_book.cpp
${__project_base}/src/ed_edit.cpp
${__project_base}/src/ed_edit_aux.cpp
${__project_base}/src/ed_find.cpp
${__project_base}/src/ed_injections.cpp
${__project_base}/src/ed_tasks.cpp
${__project_base}/src/ed_dictionary.cpp
${__project_base}/src/ed_history.cpp
${__project_base}/src/ed_jobs.cpp
${__project_base}/src/ed_keys.cpp
${__project_base}/src/ed_plug_loader.cpp
${__project_base}/src/ed_plugin.cpp
${__project_base}/src/ed_problems.cpp
${__project_base}/src/ed_script.cpp
${__project_base}/src/ed_service.cpp
${__project_base}/src/ed_bm.cpp
${__project_base}/src/ed_dbg.cpp
${__project_base}/src/ed_icons.cpp
${__project_base}/src/ed_lang.cpp
${__project_base}/src/ed_styles.cpp
${__project_base}/src/ed_dbg_pane.cpp
${__project_base}/src/ed_pan_files.cpp
${__project_base}/src/ed_pan_prb.cpp
${__project_base}/src/ed_pan_sln.cpp
${__project_base}/src/ed_panes.cpp
${__project_base}/src/ed_sym_browser.cpp
${__project_base}/src/in_lexer.cpp
${__project_base}/src/in_parser.cpp
${__project_base}/src/in_prep.cpp
${__project_base}/src/in_sourcer.cpp
${__project_base}/src/in_token.cpp
${__project_base}/src/ide_sdk.cpp
${__project_base}/src/ed_props.cpp
${__project_base}/src/ed_settings.cpp
${__project_base}/src/ed_solution.cpp
${__project_base}/src/ed_tools.cpp
${__project_base}/src/ed_git.cpp
${__project_base}/src/main.cpp
)

### Declare target:
add_executable(${__target} ${__Src})
set_target_properties(${__target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${__output_dir})
set(CMAKE_C_COMPILER "g++")
set(CMAKE_CXX_COMPILER "g++")
target_compile_options(${__target} PRIVATE -g -m64 -std=c++17 -pipe -pthread -Wall -Wextra -pedantic -pedantic-errors -Wredundant-decls -Wcast-align -Wundef -Wfloat-equal -Wunreachable-code -Wmissing-include-dirs -Wpointer-arith -Wwrite-strings -Wswitch -Wswitch-default -Wswitch-bool -Wnon-virtual-dtor -Wctor-dtor-privacy -Og )
target_compile_options(${__target} PRIVATE -Wdelete-non-virtual-dtor )
target_compile_definitions(${__target} PRIVATE -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ )
target_include_directories(${__target} PRIVATE /usr/lib/llvm-11/include)
target_include_directories(${__target} PRIVATE /usr/lib/x86_64-linux-gnu/wx/include/gtk3-unicode-3.0)
target_include_directories(${__target} PRIVATE /usr/include/wx-3.0)
target_include_directories(${__target} PRIVATE /home/alyss/HOBBY/CodeEditor/COMMON)
target_link_libraries(${__target} PRIVATE ${LIB_0})
target_link_libraries(${__target} PRIVATE ${wxWidgets_LIBRARIES})
target_link_libraries(${__target} PRIVATE clang-11)
target_link_libraries(${__target} PRIVATE dl)

alysnix ★★★
() автор топика
Последнее исправление: alysnix (всего исправлений: 1)

в 2021 году

  • самописная IDE

  • для C++

  • нет LSP/Tree-sitter

удачи…

P.S. Раз в n месяцев захожу на ЛОР посмотреть, что тут изменилось с 00х, и как-то не особо вижу развития.

anonymous
()
Ответ на: в 2021 году от anonymous

нет LSP/Tree-sitter

разговор об лсп имеет смысл, но у меня просто свой лсп для с++.

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

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

самописная IDE

вообще-то все ide самописные, а не богом надиктованные в арабской пустыне.

alysnix ★★★
() автор топика
Ответ на: комментарий от alysnix

нет LSP/Tree-sitter
самописная IDE

Не слушайте мудаков всяких.

normann ★★★
()
Ответ на: комментарий от alysnix

она изначально все билдит через cmake

есть выбор бекэнда для билда

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

normann ★★★
()
Ответ на: комментарий от normann

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

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

надо взять какой-нить реальный смейк файл и попытаться его распарсить.

если есть предложения, то предлагайте… типа уметь распарсить смейк файл от такой-то опенсорсной системы.

alysnix ★★★
() автор топика
Ответ на: комментарий от normann

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

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

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

alysnix ★★★
() автор топика
Ответ на: комментарий от alysnix

если есть предложения, то предлагайте… типа уметь распарсить смейк файл от такой-то опенсорсной системы

Как вариант использовать extra generators для создания проекта от известной IDE, и уже из этого проекта сделать импорт.

Ещё QtCreator делает импорт из make, можно глянуть в сорцах, как это работает.

u-235
()
Ответ на: комментарий от u-235

Ещё QtCreator делает импорт из make, можно глянуть в сорцах, как это работает.

посмотрю…

но как это может работать в общем случае, если например списки сорцов в смейклисте генерятся функцией… что например читает какой-то внешний файл или выхлоп от какого внешнего скрипта.

alysnix ★★★
() автор топика
Ответ на: комментарий от alysnix

QtCreator делает импорт из make

Не заметил опечатки – QtCreator делает импорт из cmake.

u-235
()

Какая-то бестолковая хрень, судя по видео. Я такое в универе для fasm пейсал.

для сутденческой поделки сойдет

anonymous
()
Ответ на: комментарий от alysnix

Сделай лучче поддержку QBS а не говно смаке. В кубсе ничо парсить не надо, он сам а режиме сессии отдаст всю нужную инфу о проекте, дефайны, списки хидеров и сорсов, списки выходных артифактов и многое другое.

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

kuzulis ★★
()
Последнее исправление: kuzulis (всего исправлений: 1)
Ответ на: комментарий от kuzulis

Сделай лучче поддержку QBS а не говно смаке.

Qbs не попсовый. Самые рейтингуемые на сегодня…судя по всяким поплистам - CMake, Nynia, gnu make. Вот я и делал под первый… поскольку он поддерживает и оба прочих. а гну мейк - это грустно совсем.

alysnix ★★★
() автор топика
Ответ на: комментарий от alysnix

Qbs не попсовый.

Ну, с такими критериями (попсовый/непопсовый) надо на десяточке сидеть …

anonymous
()
Ответ на: комментарий от anonymous

Ну, с такими критериями (попсовый/непопсовый) надо на десяточке сидеть

попсовость - в данном случае популярность.

ну вот, первое что нашел - https://www.slant.co/topics/4263/~open-source-build-systems-for-c-c

тут qbs на 10ом месте. какой смысл пилить сборку на тулзе, что на 10м месте-то?

кстати… а это о чем? https://www.opennet.ru/opennews/art.shtml?num=49519

alysnix ★★★
() автор топика
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

попсовость - в данном случае популярность.

миллионы мух не могут ошибаться. они как жрали говно так и будут жрать, их ничем не переубедить. это что то генетическое )))

kuzulis ★★
()
Ответ на: комментарий от alysnix

кстати… а это о чем?

да похрен на КуТе компани, уже и без них ничуть не хуже

kuzulis ★★
()
Ответ на: комментарий от alysnix

какой смысл пилить сборку на тулзе,

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

kuzulis ★★
()
Последнее исправление: kuzulis (всего исправлений: 1)
Ответ на: комментарий от alysnix

в общем, начни с чего то действительно простого, удобного и современного, я про кубс (что потребует минимальных затрат). а поддержку 30 летней говнятины можешь и напотом прикрутить :)

kuzulis ★★
()
Последнее исправление: kuzulis (всего исправлений: 2)
Ответ на: комментарий от kuzulis

то что она генерит смакелист - так это вообще дичь какая то, а не умение

все ide стараются прикрыть, ну или сделать максимально абстрактным процесс билда. потому что процентов 80-90 проектов можно собрать автоматически просто по древу файлов в проекте и каким-то там опциям.

строить свою билд систему(когда их и так полно) - нет смысла, берешь готовую и все и генеришь ее входные файлы автоматом. остается вопрос - какую взять. смейк был взят как самый попсовый.

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

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

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

alysnix ★★★
() автор топика
Ответ на: комментарий от alysnix

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

kuzulis ★★
()
Последнее исправление: kuzulis (всего исправлений: 1)
Ответ на: комментарий от Benis

ну и кто это сейчас юзает? разве что вендузятники на винде:) это исключение из правил. мы говорим сейчас про велосипедную самописную ИДЕ, а не про корпоративный продукт. тем более сейчас уже и времена не те, не взлетит :)

kuzulis ★★
()
Последнее исправление: kuzulis (всего исправлений: 2)
Ответ на: комментарий от fsb4000

С отличной поддержкой CMake…

ну, не такая уж там отличная поддержка, но она билдит проекты из моей ide, по моему сгенеренному cmake файлу. но в таком случае она работает не со своим солюшеном, а в режиме некого фолдера в котором есть смейклистс.txt… правда падает иногда….:)

то есть у нее есть переносимость проектов на уровне работы в режиме «фолдера проекта на cmake» или как там это называется, забыл.

alysnix ★★★
() автор топика
Ответ на: комментарий от kuzulis

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

как она может брать все это из «конкретной» билд системы, если этих билдсистем пара десятков, все со своими тараканами и текстовым синтаксисом… она должна для совместимости с другими ide какие билдсистемы поддерживать? список напиши.

alysnix ★★★
() автор топика

Какие киллер-фичи по сравнению с другими ide на wxWidgets, такими как codeblocks, codelite?

grem ★★★★★
()
Ответ на: комментарий от Benis

«умеет» обычно сводится к выполнить сборку? Или при этом есть дополнительные фичи?

Что для кодблокс, что для кодлайт в cmake есть конвертеры cmake-файла в файл проекта.

grem ★★★★★
()
Ответ на: комментарий от grem

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

alysnix ★★★
() автор топика
Последнее исправление: alysnix (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.