Перейти к содержанию

Второе голосование по какой-то программке


Интересуетесь ли вы в развитии программки?  

9 проголосовавших

  1. 1. Интересуетесь ли вы в развитии программки?

    • Да, хорошая вещь.
      7
    • Да, но мало функций (напишу в комментариях)
      0
    • Почему ты до сих пор это не удалил?
      2


Рекомендуемые сообщения

В теме 131 сообщение

8 часов назад, quark-gluon plasma сказал:

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

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

Да хоть компьютер НАСА, хоть все HDD мира, их не хватит.

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, Хeрoбрин сказал:

А мало ли он обфускацию сделает, чтобы я специально ничего не понял?

Если я сделаю обфускацию, то я тоже ничего не буду понимать.

Ссылка на комментарий
Поделиться на другие сайты

12 часов назад, Хeрoбрин сказал:

Можешь скинуть структуру кода без обфускации?

Держи структуру кода без обфускации и прочих вещей мешающих тебе понимать код:

Спойлер

Project/

├── main.py
│   └── Editor(root) - запуск приложения

├── editor.py
│   └── class Editor - главный класс, связывающий все компоненты редактора
│       ├── __init__() - инициализирует окно, менеджеры, настройки и привязывает события
│       ├── apply_theme() - применяет текущую тему ко всем виджетам
│       ├── toggle_theme() - переключает тёмную/светлую тему и сохраняет настройку
│       ├── dec_brush() - уменьшает размер кисти на 1
│       ├── inc_brush() - увеличивает размер кисти на 1
│       ├── toggle_grid() - включает/выключает отображение сетки
│       ├── save_state() - сохраняет состояние карты в историю отмены
│       ├── undo_op() - отменяет последнее действие и восстанавливает предыдущее состояние
│       ├── redo_op() - повторяет отменённое действие
│       ├── clear_layer() - очищает указанный слой
│       ├── clear_all_layers() - очищает все слои карты
│       ├── save_png() - экспортирует карту в PNG
│       ├── save_json() - сохраняет проект в JSON-файл
│       ├── load_json() - загружает проект из JSON-файла
│       ├── resize_map() - открывает диалог изменения размера карты со сдвигом содержимого
│       ├── center_map() - центрирует карту в окне, автоматически подбирая масштаб
│       ├── import_tex() - импортирует PNG-текстуры из файловой системы
│       ├── del_tex() - открывает диалог удаления загруженных текстур
│       ├── load_preset() - вызывает консольный выбор пресета для загрузки
│       ├── save_preset() - запрашивает имя через консоль и сохраняет пресет
│       ├── save_preset_with_name(name) - сохраняет текущую карту как пресет с заданным именем
│       ├── update_status() - обновляет текст в строке состояния
│       ├── on_mouse_move() - обрабатывает движение мыши, показывает координаты в статусе
│       ├── on_canvas_right_press() - начинает панорамирование по правой кнопке
│       ├── on_canvas_right_drag() - перемещает камеру при панорамировании
│       ├── on_mousewheel() - масштабирует карту колёсиком мыши
│       ├── zoom_in() - увеличивает масштаб
│       ├── zoom_out() - уменьшает масштаб
│       ├── on_closing() - сохраняет настройки перед закрытием окна
│       ├── copy_selection() - копирует выделенную область в буфер обмена
│       ├── cut_selection() - вырезает выделенную область в буфер обмена
│       ├── paste_selection() - вставляет содержимое буфера в текущий слой
│       ├── move_selection(dx, dy) - перемещает выделенную область на смещение
│       ├── replace_texture_all_layers(old, new) - заменяет одну текстуру на другую во всех слоях
│       ├── set_brush_size(size) - устанавливает размер кисти
│       ├── enable_selection_tool() - активирует инструмент выделения
│       ├── open_brush_config() - открывает окно настройки кастомных кистей
│       ├── _delete_textures_callback(answer) - внутренний обработчик удаления текстур
│       └── _update_window_theme(window) - рекурсивно обновляет тему дочерних окон

├── editor_core.py
│   ├── class ThemeManager - управляет применением цветовой темы ко всем виджетам
│   │   ├── register_widget(name, widget) - сохраняет виджет для последующего обновления
│   │   ├── apply_theme() - применяет текущие цвета к зарегистрированным виджетам
│   │   ├── _apply_theme_to_frame(frame, colors) - рекурсивно красит Frame и его детей
│   │   └── _apply_theme_to_spinbox(spinbox, colors) - устанавливает цвета для Spinbox
│   │
│   ├── class LayerManager - управляет текущим слоём и операциями со слоями
│   │   ├── set_active_layer(idx) - переключает активный слой
│   │   ├── add_layer() - добавляет новый слой (с проверкой лимита)
│   │   ├── remove_layer() - удаляет текущий слой (кроме единственного)
│   │   ├── toggle_visibility() - показывает/скрывает текущий слой
│   │   ├── clear_current() - очищает активный слой
│   │   ├── prev_layer() - переключается на предыдущий слой
│   │   ├── next_layer() - переключается на следующий слой
│   │   └── get_active_layer_obj() - возвращает объект Layer текущего слоя
│   │
│   ├── class Camera - отвечает за панорамирование, масштаб и преобразование координат
│   │   ├── set_map_size(w, h) - обновляет размеры карты для камеры
│   │   ├── set_canvas_size(w, h) - обновляет размеры холста
│   │   ├── world_to_screen(x, y) - переводит координаты клетки в экранные пиксели
│   │   ├── screen_to_world(sx, sy) - переводит пиксели в координаты клетки
│   │   ├── clamp() - ограничивает смещение, чтобы карта не выходила за пределы экрана
│   │   ├── pan_start(x, y) - запоминает начальную точку панорамирования
│   │   ├── pan_move(x, y) - обновляет смещение при движении мыши
│   │   └── zoom_at(factor, cx, cy) - масштабирует относительно указанной точки
│   │
│   ├── class Selection - хранит прямоугольную область выделения
│   │   ├── set_rect(x1, y1, x2, y2, layer_idx) - устанавливает область и слой
│   │   ├── clear() - сбрасывает выделение
│   │   └── get_rect() - возвращает координаты выделенной области
│   │
│   └── class DrawingEngine - выполняет отрисовку тайлов, сетки, примитивов и обрабатывает рисование
│       ├── start_primitive(prim_type) - начинает режим рисования примитива
│       ├── cancel_primitive() - отменяет текущий примитив и удаляет предпросмотр
│       ├── _clear_primitive_preview() - удаляет временные изображения примитива
│       ├── _update_primitive_preview(x1,y1,x2,y2) - отображает предпросмотр примитива текущей текстурой
│       ├── _finalize_primitive() - применяет примитив к карте и сохраняет состояние
│       ├── _get_circle_points(cx,cy,radius) - вычисляет координаты окружности
│       ├── _get_contour_points(x1,y1,x2,y2) - возвращает клетки контура примитива
│       ├── _line_points(x0,y0,x1,y1) - алгоритм Брезенхема для линии
│       ├── redraw_visible_tiles() - перерисовывает только видимую область с учётом кэша
│       ├── full_redraw() - полностью очищает холст и перерисовывает всё
│       ├── _draw_visible_tiles() - отображает тайлы в области экрана
│       ├── _draw_grid_and_selection() - рисует сетку и прямоугольник выделения
│       ├── update_cell(x,y,layer_idx,tex_name) - обновляет один тайл на холсте
│       ├── update_grid() - перерисовывает только сетку и выделение
│       ├── on_press(e) - обработка нажатия мыши: начало рисования, выделения, примитива
│       ├── on_drag(e) - рисует кистью по линии или обновляет примитив/выделение
│       ├── on_release(e) - завершает рисование, примитив или перемещение выделения
│       ├── _start_selection(e) - начинает новое выделение
│       ├── _update_selection(e) - обновляет размеры выделения при движении мыши
│       ├── _start_move_selection(e) - начинает перемещение выделенной области
│       ├── _move_selection_drag(e) - перемещает выделение при движении мыши
│       ├── _line(x0,y0,x1,y1) - возвращает все клетки на отрезке
│       ├── _brush(x,y) - рисует кистью в указанной клетке
│       ├── _apply(px,py) - применяет текущий инструмент по координатам экрана
│       ├── _apply_pipette(xc,yc) - берёт текстуру с указанной клетки и выбирает её как инструмент
│       ├── _apply_flood_fill(xc,yc) - выполняет заливку выбранной текстурой
│       ├── _flood_fill_scanline(x,y,new_tex) - алгоритм заливки с устранением рекурсии
│       └── pick_texture(event) - альтернативный способ пипетки

├── editor_ui.py
│   └── class UIManager - строит интерфейс и управляет виджетами
│       ├── setup(parent) - создаёт все элементы интерфейса в указанном фрейме
│       ├── _setup_canvas(parent) - создаёт холст для рисования и привязывает события
│       ├── _setup_toolbar_panel(parent) - панель с инструментами, хотбаром, размером кисти
│       ├── _setup_layer_panel(parent) - панель управления слоями
│       ├── _setup_bottom_panel(parent) - нижняя панель с кнопками действий
│       ├── _setup_status_bar(parent) - строка состояния внизу окна
│       ├── _bind_hotbar_keys() - привязывает цифровые клавиши к слотам хотбара
│       ├── _bind_escape() - привязывает Escape для снятия выделения и отмены примитивов
│       ├── clear_hotbar_selection() - убирает подсветку выбранного слота хотбара
│       ├── highlight_hotbar_slot_by_texture(texture_name) - подсвечивает слот с указанной текстурой
│       ├── _activate_primitive(prim_type) - активирует режим рисования примитива через кнопку
│       ├── refresh_hotbar() - обновляет отображение хотбара
│       ├── _open_hotbar_settings() - открывает окно настройки хотбара
│       ├── _on_canvas_resize(event) - обновляет камеру при изменении размера холста
│       ├── _add_layer_callback() - обработчик кнопки "+" для слоя
│       ├── _remove_layer_callback() - обработчик кнопки "-" для слоя
│       ├── _open_layer_manager() - выводит список слоёв
│       ├── _build_action_buttons() - создаёт кнопки экспорта, импорта, отмены и т.д.
│       ├── _add_separator(parent) - добавляет вертикальный разделитель на панель
│       ├── _clear_callback() - очищает все слои по кнопке
│       ├── _spinbox_changed() - обрабатывает изменение номера слоя через спинбокс
│       ├── update_layer_ui() - обновляет спинбокс и чекбокс видимости согласно текущему слою
│       ├── update_visibility_check() - синхронизирует чекбокс с видимостью текущего слоя
│       ├── update_status(text) - устанавливает текст в строке состояния
│       └── update_theme() - обновляет темы всех виджетов интерфейса

├── config.py
│   ├── class Config (CFG) - глобальные настройки редактора и цветовые схемы
│   │   ├── cell_size - размер клетки в пикселях
│   │   ├── max_layers - максимальное количество слоёв
│   │   ├── undo_limit - глубина истории отмены
│   │   ├── brush_min, brush_max - минимальный и максимальный размер кисти
│   │   ├── dark_colors, light_colors - словари цветов для тёмной и светлой темы
│   │   ├── colors (property) - возвращает цвета текущей темы
│   │   └── set_theme(theme) - переключает тему
│   │
│   ├── class ProgressDialog - диалог с прогресс-баром для длительных операций
│   │   ├── update(value, message) - обновляет значение прогресса и текст
│   │   ├── is_cancelled() - проверяет, нажата ли кнопка отмены
│   │   └── close() - закрывает диалог
│   │
│   └── class Settings - сохранение/загрузка пользовательских настроек в JSON
│       ├── load() - загружает настройки из файла settings.json
│       ├── save() - сохраняет текущие настройки
│       ├── get(key, default) - возвращает значение настройки
│       ├── set(key, value) - устанавливает значение и сохраняет
│       ├── add_recent_file(filepath) - добавляет файл в список недавних
│       ├── get_recent_files() - возвращает список недавних файлов
│       └── get_theme(), set_theme(theme) - управление темой в настройках

├── core.py
│   ├── path(rel, internal) - возвращает абсолютный путь к ресурсу
│   │
│   ├── class TexMgr - загрузка текстур, иконок, масштабирование под зум
│   │   ├── load_blocks(folder, log_func) - загружает PNG из папки, сохраняет оригиналы
│   │   ├── load_icons(folder) - загружает иконки для кнопок
│   │   ├── update_block_size(zoom) - перегенерирует текстуры под новый размер клетки
│   │   ├── get_block(name) - возвращает PhotoImage текстуры для отрисовки
│   │   ├── get_thumb(name) - возвращает уменьшенную иконку
│   │   ├── get_icon(name) - возвращает иконку инструмента
│   │   └── get_original(name) - возвращает оригинальный PIL.Image
│   │
│   ├── class UndoMgr - стек отмены/повтора с глубоким копированием состояния
│   │   ├── can_undo() - есть ли действия для отмены
│   │   ├── can_redo() - есть ли действия для повтора
│   │   ├── save(state) - сохраняет состояние в историю
│   │   ├── undo_op(cur) - отменяет последнее действие, возвращает предыдущее состояние
│   │   └── redo_op(cur) - повторяет действие, возвращает следующее состояние
│   │
│   ├── class Layer - один слой карты: двумерный массив имён текстур
│   │   ├── get_state() - возвращает словарь с grid для сериализации
│   │   ├── set_state(state, tex_mgr) - загружает сетку из словаря, конвертирует индексы в имена
│   │   ├── clear() - заполняет слой пустыми клетками
│   │   ├── resize(w, h, shift_x, shift_y) - изменяет размер слоя со сдвигом содержимого
│   │   ├── copy_rect(x1,y1,x2,y2) - копирует прямоугольную область в список списков
│   │   ├── paste_rect(x1,y1,data) - вставляет данные из copy_rect в указанную позицию
│   │   ├── fill_rect(x1,y1,x2,y2,tex_name) - заливает прямоугольник текстурой
│   │   ├── move_rect(x1,y1,x2,y2,dx,dy) - перемещает область
│   │   └── replace_texture(old_tex, new_tex) - заменяет одну текстуру на другую в слое
│   │
│   ├── class Map - коллекция слоёв, размеры карты, видимость слоёв
│   │   ├── get() - сериализует всю карту
│   │   ├── set(state) - загружает карту из сериализованного состояния
│   │   ├── add_layer() - добавляет новый пустой слой
│   │   ├── remove_layer(idx) - удаляет слой
│   │   ├── clear_layer(idx) - очищает указанный слой
│   │   ├── clear_all() - очищает все слои
│   │   ├── resize(w, h, shift_x, shift_y) - изменяет размер всех слоёв
│   │   ├── get_active_layer(idx) - возвращает объект Layer по индексу
│   │   ├── get_num_layers() - количество слоёв
│   │   └── replace_texture_all_layers(old, new) - замена текстуры во всех слоях
│   │
│   └── class FileMgr - операции с файлами (JSON, пресеты)
│       ├── save_json(path) - сохраняет карту в JSON
│       ├── load_json(path) - загружает карту из JSON
│       ├── save_preset(name) - сохраняет текущую карту как пресет
│       ├── load_preset(name) - загружает пресет по имени
│       ├── list_presets() - возвращает список имён пресетов
│       └── delete_preset(name) - удаляет файл пресета

├── brush.py
│   ├── class CustomBrush - кастомная кисть с матрицей формы
│   │   ├── _compute_offsets() - вычисляет смещения активных клеток относительно центра
│   │   └── get_offsets() - возвращает список смещений
│   │
│   ├── class BrushManager - управление стандартным режимом и кастомными кистями
│   │   ├── load_custom_brushes() - загружает JSON-файлы кисти
│   │   ├── save_custom_brush(brush) - сохраняет кисть в файл
│   │   ├── delete_custom_brush(name) - удаляет файл кисти
│   │   ├── set_standard_mode() - переключает на стандартную квадратную кисть
│   │   ├── set_custom_brush(name) - активирует кастомную кисть по имени
│   │   └── get_offsets(size) - возвращает смещения в зависимости от режима
│   │
│   └── class BrushConfigWindow - окно для создания/редактирования кастомных кистей
│       (содержит методы построения сетки, рисования формы, сохранения)

├── hotbar.py
│   ├── class HotbarSlot - данные одного слота хотбара
│   │
│   ├── class HotbarManager - хранит 9 слотов, загрузка/сохранение в JSON
│   │   ├── load() - загружает конфигурацию
│   │   ├── save() - сохраняет текущее состояние
│   │   ├── set_slot(index, texture_name) - назначает текстуру на слот
│   │   ├── get_slot(index) - возвращает текстуру или None
│   │   ├── clear_slot(index) - очищает слот
│   │   ├── is_empty(index) - проверяет, пуст ли слот
│   │   ├── find_empty_slot() - возвращает индекс первого пустого слота
│   │   ├── get_first_filled_slot() - первый непустой слот
│   │   └── find_slot_by_texture(texture_name) - ищет слот с указанной текстурой
│   │
│   ├── class HotbarWidget - визуальное отображение хотбара в интерфейсе
│   │   ├── _build() - создаёт контейнер и 9 слотов
│   │   ├── _create_slot(parent, idx) - создаёт кнопку и фрейм для одного слота
│   │   ├── _on_click(idx) - обработчик клика по слоту
│   │   ├── _on_press(idx, event) - начало перетаскивания слота
│   │   ├── _on_release(idx, event) - завершение перетаскивания
│   │   ├── clear_selection() - снимает подсветку выбранного слота
│   │   ├── select_slot(idx) - подсвечивает слот как выбранный
│   │   ├── select_slot_by_texture(texture_name) - подсвечивает слот по текстуре
│   │   ├── refresh() - обновляет все слоты
│   │   ├── update_slot(idx) - обновляет конкретный слот
│   │   └── update_theme() - обновляет цвета в соответствии с текущей темой
│   │
│   └── class HotbarConfigWindow - окно для настройки привязки текстур к слотам
│       ├── _build() - строит интерфейс: сетка слотов, список текстур, поиск
│       ├── _update_slots_display() - отображает миниатюры в слотах
│       ├── _clear_slot(slot_index) - очищает выбранный слот
│       ├── _clear_all_slots() - очищает все слоты
│       ├── _populate_textures() - заполняет список доступных текстур из TexMgr
│       ├── _filter_textures() - фильтрует текстуры по строке поиска
│       ├── _assign_to_slot(tex_name) - привязывает текстуру к первому свободному слоту
│       ├── _refresh_textures() - перезагружает текстуры из папки
│       └── _refresh_texture_list(tex_mgr) - обновляет список после внешних изменений

├── console.py
│   └── class ConsoleManager - интерактивная консоль с историей и автодополнением
│       ├── create(parent) - создаёт виджеты консоли
│       ├── on_mousewheel(event) - прокрутка текста и поля ввода колёсиком
│       ├── _sync_scroll(*args) - синхронизирует скролл между полем ввода и номерами строк
│       ├── _on_console_focus() - фиксирует, что фокус в консоли
│       ├── console_has_focus() - возвращает True, если поле ввода активно
│       ├── _get_current_word() - возвращает слово под курсором и его позицию
│       ├── _get_completions(prefix) - возвращает список команд/пресетов, начинающихся с prefix
│       ├── _hide_completion_popup() - закрывает всплывающее окно автодополнения
│       ├── _show_completion_popup(matches, prefix) - показывает окно со списком вариантов
│       ├── _auto_complete() - обрабатывает Tab: автодополнение команды или показ списка
│       ├── _replace_current_word(new_word) - заменяет текущее слово в строке ввода
│       ├── _history_up() - переход к предыдущей команде
│       ├── _history_down() - переход к следующей команде
│       ├── _set_input_text(text) - устанавливает текст в поле ввода
│       ├── _on_paste(event) - вставка из буфера обмена
│       ├── _update_line_numbers() - обновляет нумерацию строк рядом с полем ввода
│       ├── update_theme() - применяет текущую тему к консоли
│       ├── _execute_multiline() - выполняет многострочную команду 
│       ├── _print(message, msg_type) - выводит сообщение в историю консоли
│       ├── _print_command(command) - выводит приглашение и введённую команду
│       ├── _execute_command_line(command) - разбирает и выполняет команду
│       ├── _handle_input(command) - передаёт ввод в callback при ожидании ответа
│       ├── _handle_preset_selection(command) - обрабатывает выбор пресета
│       ├── _load_preset_file(preset_name) - загружает выбранный пресет
│       ├── ask_input(question, callback) - запрашивает ввод строки у пользователя
│       └── show_preset_selection(presets) - показывает список пресетов и ждёт выбора

└── console_cmd.py
    └── class ConsoleCommands - реализация всех консольных команд
        ├── execute(command, parts) - вызывает нужную _cmd_*
        ├── _cmd_help() - выводит справку
        ├── _cmd_circle(parts) - рисует круг
        ├── _draw_circle(cx,cy,radius,fill,tex_name) - внутренняя отрисовка круга
        ├── _cmd_rect(parts) - рисует прямоугольник
        ├── _draw_rectangle(x1,y1,x2,y2,fill,tex_name) - внутренняя отрисовка прямоугольника
        ├── _cmd_line(parts) - рисует линию
        ├── _draw_line(x1,y1,x2,y2,thickness,tex_name) - рисует линию с толщиной
        ├── _get_line_points(x1,y1,x2,y2) - возвращает клетки на линии
        ├── _cmd_layers() - выводит информацию о слоях в консоль
        ├── _cmd_layer(parts) - управление слоями
        ├── _cmd_tool() - показывает текущий инструмент
        ├── _cmd_clear(parts) - очищает текущий слой или все слои
        ├── _cmd_clear_console() - очищает историю консоли
        ├── _cmd_presets() - выводит список доступных пресетов
        ├── _cmd_save_preset() - сохраняет текущую карту как пресет
        ├── _cmd_delete_preset(parts) - удаляет указанный пресет
        ├── _cmd_load_preset() - загружает пресет
        ├── _cmd_replace(parts) - заменяет одну текстуру на другую во всех слоях
        └── _cmd_brush(parts) - устанавливает размер кисти

 

Ссылка на комментарий
Поделиться на другие сайты

3 минуты назад, minecart сказал:

Держи структуру кода без обфускации и прочих вещей мешающих тебе понимать код:

  Скрыть контент

Project/

├── main.py
│   └── Editor(root) - запуск приложения

├── editor.py
│   └── class Editor - главный класс, связывающий все компоненты редактора
│       ├── __init__() - инициализирует окно, менеджеры, настройки и привязывает события
│       ├── apply_theme() - применяет текущую тему ко всем виджетам
│       ├── toggle_theme() - переключает тёмную/светлую тему и сохраняет настройку
│       ├── dec_brush() - уменьшает размер кисти на 1
│       ├── inc_brush() - увеличивает размер кисти на 1
│       ├── toggle_grid() - включает/выключает отображение сетки
│       ├── save_state() - сохраняет состояние карты в историю отмены
│       ├── undo_op() - отменяет последнее действие и восстанавливает предыдущее состояние
│       ├── redo_op() - повторяет отменённое действие
│       ├── clear_layer() - очищает указанный слой
│       ├── clear_all_layers() - очищает все слои карты
│       ├── save_png() - экспортирует карту в PNG
│       ├── save_json() - сохраняет проект в JSON-файл
│       ├── load_json() - загружает проект из JSON-файла
│       ├── resize_map() - открывает диалог изменения размера карты со сдвигом содержимого
│       ├── center_map() - центрирует карту в окне, автоматически подбирая масштаб
│       ├── import_tex() - импортирует PNG-текстуры из файловой системы
│       ├── del_tex() - открывает диалог удаления загруженных текстур
│       ├── load_preset() - вызывает консольный выбор пресета для загрузки
│       ├── save_preset() - запрашивает имя через консоль и сохраняет пресет
│       ├── save_preset_with_name(name) - сохраняет текущую карту как пресет с заданным именем
│       ├── update_status() - обновляет текст в строке состояния
│       ├── on_mouse_move() - обрабатывает движение мыши, показывает координаты в статусе
│       ├── on_canvas_right_press() - начинает панорамирование по правой кнопке
│       ├── on_canvas_right_drag() - перемещает камеру при панорамировании
│       ├── on_mousewheel() - масштабирует карту колёсиком мыши
│       ├── zoom_in() - увеличивает масштаб
│       ├── zoom_out() - уменьшает масштаб
│       ├── on_closing() - сохраняет настройки перед закрытием окна
│       ├── copy_selection() - копирует выделенную область в буфер обмена
│       ├── cut_selection() - вырезает выделенную область в буфер обмена
│       ├── paste_selection() - вставляет содержимое буфера в текущий слой
│       ├── move_selection(dx, dy) - перемещает выделенную область на смещение
│       ├── replace_texture_all_layers(old, new) - заменяет одну текстуру на другую во всех слоях
│       ├── set_brush_size(size) - устанавливает размер кисти
│       ├── enable_selection_tool() - активирует инструмент выделения
│       ├── open_brush_config() - открывает окно настройки кастомных кистей
│       ├── _delete_textures_callback(answer) - внутренний обработчик удаления текстур
│       └── _update_window_theme(window) - рекурсивно обновляет тему дочерних окон

├── editor_core.py
│   ├── class ThemeManager - управляет применением цветовой темы ко всем виджетам
│   │   ├── register_widget(name, widget) - сохраняет виджет для последующего обновления
│   │   ├── apply_theme() - применяет текущие цвета к зарегистрированным виджетам
│   │   ├── _apply_theme_to_frame(frame, colors) - рекурсивно красит Frame и его детей
│   │   └── _apply_theme_to_spinbox(spinbox, colors) - устанавливает цвета для Spinbox
│   │
│   ├── class LayerManager - управляет текущим слоём и операциями со слоями
│   │   ├── set_active_layer(idx) - переключает активный слой
│   │   ├── add_layer() - добавляет новый слой (с проверкой лимита)
│   │   ├── remove_layer() - удаляет текущий слой (кроме единственного)
│   │   ├── toggle_visibility() - показывает/скрывает текущий слой
│   │   ├── clear_current() - очищает активный слой
│   │   ├── prev_layer() - переключается на предыдущий слой
│   │   ├── next_layer() - переключается на следующий слой
│   │   └── get_active_layer_obj() - возвращает объект Layer текущего слоя
│   │
│   ├── class Camera - отвечает за панорамирование, масштаб и преобразование координат
│   │   ├── set_map_size(w, h) - обновляет размеры карты для камеры
│   │   ├── set_canvas_size(w, h) - обновляет размеры холста
│   │   ├── world_to_screen(x, y) - переводит координаты клетки в экранные пиксели
│   │   ├── screen_to_world(sx, sy) - переводит пиксели в координаты клетки
│   │   ├── clamp() - ограничивает смещение, чтобы карта не выходила за пределы экрана
│   │   ├── pan_start(x, y) - запоминает начальную точку панорамирования
│   │   ├── pan_move(x, y) - обновляет смещение при движении мыши
│   │   └── zoom_at(factor, cx, cy) - масштабирует относительно указанной точки
│   │
│   ├── class Selection - хранит прямоугольную область выделения
│   │   ├── set_rect(x1, y1, x2, y2, layer_idx) - устанавливает область и слой
│   │   ├── clear() - сбрасывает выделение
│   │   └── get_rect() - возвращает координаты выделенной области
│   │
│   └── class DrawingEngine - выполняет отрисовку тайлов, сетки, примитивов и обрабатывает рисование
│       ├── start_primitive(prim_type) - начинает режим рисования примитива
│       ├── cancel_primitive() - отменяет текущий примитив и удаляет предпросмотр
│       ├── _clear_primitive_preview() - удаляет временные изображения примитива
│       ├── _update_primitive_preview(x1,y1,x2,y2) - отображает предпросмотр примитива текущей текстурой
│       ├── _finalize_primitive() - применяет примитив к карте и сохраняет состояние
│       ├── _get_circle_points(cx,cy,radius) - вычисляет координаты окружности
│       ├── _get_contour_points(x1,y1,x2,y2) - возвращает клетки контура примитива
│       ├── _line_points(x0,y0,x1,y1) - алгоритм Брезенхема для линии
│       ├── redraw_visible_tiles() - перерисовывает только видимую область с учётом кэша
│       ├── full_redraw() - полностью очищает холст и перерисовывает всё
│       ├── _draw_visible_tiles() - отображает тайлы в области экрана
│       ├── _draw_grid_and_selection() - рисует сетку и прямоугольник выделения
│       ├── update_cell(x,y,layer_idx,tex_name) - обновляет один тайл на холсте
│       ├── update_grid() - перерисовывает только сетку и выделение
│       ├── on_press(e) - обработка нажатия мыши: начало рисования, выделения, примитива
│       ├── on_drag(e) - рисует кистью по линии или обновляет примитив/выделение
│       ├── on_release(e) - завершает рисование, примитив или перемещение выделения
│       ├── _start_selection(e) - начинает новое выделение
│       ├── _update_selection(e) - обновляет размеры выделения при движении мыши
│       ├── _start_move_selection(e) - начинает перемещение выделенной области
│       ├── _move_selection_drag(e) - перемещает выделение при движении мыши
│       ├── _line(x0,y0,x1,y1) - возвращает все клетки на отрезке
│       ├── _brush(x,y) - рисует кистью в указанной клетке
│       ├── _apply(px,py) - применяет текущий инструмент по координатам экрана
│       ├── _apply_pipette(xc,yc) - берёт текстуру с указанной клетки и выбирает её как инструмент
│       ├── _apply_flood_fill(xc,yc) - выполняет заливку выбранной текстурой
│       ├── _flood_fill_scanline(x,y,new_tex) - алгоритм заливки с устранением рекурсии
│       └── pick_texture(event) - альтернативный способ пипетки

├── editor_ui.py
│   └── class UIManager - строит интерфейс и управляет виджетами
│       ├── setup(parent) - создаёт все элементы интерфейса в указанном фрейме
│       ├── _setup_canvas(parent) - создаёт холст для рисования и привязывает события
│       ├── _setup_toolbar_panel(parent) - панель с инструментами, хотбаром, размером кисти
│       ├── _setup_layer_panel(parent) - панель управления слоями
│       ├── _setup_bottom_panel(parent) - нижняя панель с кнопками действий
│       ├── _setup_status_bar(parent) - строка состояния внизу окна
│       ├── _bind_hotbar_keys() - привязывает цифровые клавиши к слотам хотбара
│       ├── _bind_escape() - привязывает Escape для снятия выделения и отмены примитивов
│       ├── clear_hotbar_selection() - убирает подсветку выбранного слота хотбара
│       ├── highlight_hotbar_slot_by_texture(texture_name) - подсвечивает слот с указанной текстурой
│       ├── _activate_primitive(prim_type) - активирует режим рисования примитива через кнопку
│       ├── refresh_hotbar() - обновляет отображение хотбара
│       ├── _open_hotbar_settings() - открывает окно настройки хотбара
│       ├── _on_canvas_resize(event) - обновляет камеру при изменении размера холста
│       ├── _add_layer_callback() - обработчик кнопки "+" для слоя
│       ├── _remove_layer_callback() - обработчик кнопки "-" для слоя
│       ├── _open_layer_manager() - выводит список слоёв
│       ├── _build_action_buttons() - создаёт кнопки экспорта, импорта, отмены и т.д.
│       ├── _add_separator(parent) - добавляет вертикальный разделитель на панель
│       ├── _clear_callback() - очищает все слои по кнопке
│       ├── _spinbox_changed() - обрабатывает изменение номера слоя через спинбокс
│       ├── update_layer_ui() - обновляет спинбокс и чекбокс видимости согласно текущему слою
│       ├── update_visibility_check() - синхронизирует чекбокс с видимостью текущего слоя
│       ├── update_status(text) - устанавливает текст в строке состояния
│       └── update_theme() - обновляет темы всех виджетов интерфейса

├── config.py
│   ├── class Config (CFG) - глобальные настройки редактора и цветовые схемы
│   │   ├── cell_size - размер клетки в пикселях
│   │   ├── max_layers - максимальное количество слоёв
│   │   ├── undo_limit - глубина истории отмены
│   │   ├── brush_min, brush_max - минимальный и максимальный размер кисти
│   │   ├── dark_colors, light_colors - словари цветов для тёмной и светлой темы
│   │   ├── colors (property) - возвращает цвета текущей темы
│   │   └── set_theme(theme) - переключает тему
│   │
│   ├── class ProgressDialog - диалог с прогресс-баром для длительных операций
│   │   ├── update(value, message) - обновляет значение прогресса и текст
│   │   ├── is_cancelled() - проверяет, нажата ли кнопка отмены
│   │   └── close() - закрывает диалог
│   │
│   └── class Settings - сохранение/загрузка пользовательских настроек в JSON
│       ├── load() - загружает настройки из файла settings.json
│       ├── save() - сохраняет текущие настройки
│       ├── get(key, default) - возвращает значение настройки
│       ├── set(key, value) - устанавливает значение и сохраняет
│       ├── add_recent_file(filepath) - добавляет файл в список недавних
│       ├── get_recent_files() - возвращает список недавних файлов
│       └── get_theme(), set_theme(theme) - управление темой в настройках

├── core.py
│   ├── path(rel, internal) - возвращает абсолютный путь к ресурсу
│   │
│   ├── class TexMgr - загрузка текстур, иконок, масштабирование под зум
│   │   ├── load_blocks(folder, log_func) - загружает PNG из папки, сохраняет оригиналы
│   │   ├── load_icons(folder) - загружает иконки для кнопок
│   │   ├── update_block_size(zoom) - перегенерирует текстуры под новый размер клетки
│   │   ├── get_block(name) - возвращает PhotoImage текстуры для отрисовки
│   │   ├── get_thumb(name) - возвращает уменьшенную иконку
│   │   ├── get_icon(name) - возвращает иконку инструмента
│   │   └── get_original(name) - возвращает оригинальный PIL.Image
│   │
│   ├── class UndoMgr - стек отмены/повтора с глубоким копированием состояния
│   │   ├── can_undo() - есть ли действия для отмены
│   │   ├── can_redo() - есть ли действия для повтора
│   │   ├── save(state) - сохраняет состояние в историю
│   │   ├── undo_op(cur) - отменяет последнее действие, возвращает предыдущее состояние
│   │   └── redo_op(cur) - повторяет действие, возвращает следующее состояние
│   │
│   ├── class Layer - один слой карты: двумерный массив имён текстур
│   │   ├── get_state() - возвращает словарь с grid для сериализации
│   │   ├── set_state(state, tex_mgr) - загружает сетку из словаря, конвертирует индексы в имена
│   │   ├── clear() - заполняет слой пустыми клетками
│   │   ├── resize(w, h, shift_x, shift_y) - изменяет размер слоя со сдвигом содержимого
│   │   ├── copy_rect(x1,y1,x2,y2) - копирует прямоугольную область в список списков
│   │   ├── paste_rect(x1,y1,data) - вставляет данные из copy_rect в указанную позицию
│   │   ├── fill_rect(x1,y1,x2,y2,tex_name) - заливает прямоугольник текстурой
│   │   ├── move_rect(x1,y1,x2,y2,dx,dy) - перемещает область
│   │   └── replace_texture(old_tex, new_tex) - заменяет одну текстуру на другую в слое
│   │
│   ├── class Map - коллекция слоёв, размеры карты, видимость слоёв
│   │   ├── get() - сериализует всю карту
│   │   ├── set(state) - загружает карту из сериализованного состояния
│   │   ├── add_layer() - добавляет новый пустой слой
│   │   ├── remove_layer(idx) - удаляет слой
│   │   ├── clear_layer(idx) - очищает указанный слой
│   │   ├── clear_all() - очищает все слои
│   │   ├── resize(w, h, shift_x, shift_y) - изменяет размер всех слоёв
│   │   ├── get_active_layer(idx) - возвращает объект Layer по индексу
│   │   ├── get_num_layers() - количество слоёв
│   │   └── replace_texture_all_layers(old, new) - замена текстуры во всех слоях
│   │
│   └── class FileMgr - операции с файлами (JSON, пресеты)
│       ├── save_json(path) - сохраняет карту в JSON
│       ├── load_json(path) - загружает карту из JSON
│       ├── save_preset(name) - сохраняет текущую карту как пресет
│       ├── load_preset(name) - загружает пресет по имени
│       ├── list_presets() - возвращает список имён пресетов
│       └── delete_preset(name) - удаляет файл пресета

├── brush.py
│   ├── class CustomBrush - кастомная кисть с матрицей формы
│   │   ├── _compute_offsets() - вычисляет смещения активных клеток относительно центра
│   │   └── get_offsets() - возвращает список смещений
│   │
│   ├── class BrushManager - управление стандартным режимом и кастомными кистями
│   │   ├── load_custom_brushes() - загружает JSON-файлы кисти
│   │   ├── save_custom_brush(brush) - сохраняет кисть в файл
│   │   ├── delete_custom_brush(name) - удаляет файл кисти
│   │   ├── set_standard_mode() - переключает на стандартную квадратную кисть
│   │   ├── set_custom_brush(name) - активирует кастомную кисть по имени
│   │   └── get_offsets(size) - возвращает смещения в зависимости от режима
│   │
│   └── class BrushConfigWindow - окно для создания/редактирования кастомных кистей
│       (содержит методы построения сетки, рисования формы, сохранения)

├── hotbar.py
│   ├── class HotbarSlot - данные одного слота хотбара
│   │
│   ├── class HotbarManager - хранит 9 слотов, загрузка/сохранение в JSON
│   │   ├── load() - загружает конфигурацию
│   │   ├── save() - сохраняет текущее состояние
│   │   ├── set_slot(index, texture_name) - назначает текстуру на слот
│   │   ├── get_slot(index) - возвращает текстуру или None
│   │   ├── clear_slot(index) - очищает слот
│   │   ├── is_empty(index) - проверяет, пуст ли слот
│   │   ├── find_empty_slot() - возвращает индекс первого пустого слота
│   │   ├── get_first_filled_slot() - первый непустой слот
│   │   └── find_slot_by_texture(texture_name) - ищет слот с указанной текстурой
│   │
│   ├── class HotbarWidget - визуальное отображение хотбара в интерфейсе
│   │   ├── _build() - создаёт контейнер и 9 слотов
│   │   ├── _create_slot(parent, idx) - создаёт кнопку и фрейм для одного слота
│   │   ├── _on_click(idx) - обработчик клика по слоту
│   │   ├── _on_press(idx, event) - начало перетаскивания слота
│   │   ├── _on_release(idx, event) - завершение перетаскивания
│   │   ├── clear_selection() - снимает подсветку выбранного слота
│   │   ├── select_slot(idx) - подсвечивает слот как выбранный
│   │   ├── select_slot_by_texture(texture_name) - подсвечивает слот по текстуре
│   │   ├── refresh() - обновляет все слоты
│   │   ├── update_slot(idx) - обновляет конкретный слот
│   │   └── update_theme() - обновляет цвета в соответствии с текущей темой
│   │
│   └── class HotbarConfigWindow - окно для настройки привязки текстур к слотам
│       ├── _build() - строит интерфейс: сетка слотов, список текстур, поиск
│       ├── _update_slots_display() - отображает миниатюры в слотах
│       ├── _clear_slot(slot_index) - очищает выбранный слот
│       ├── _clear_all_slots() - очищает все слоты
│       ├── _populate_textures() - заполняет список доступных текстур из TexMgr
│       ├── _filter_textures() - фильтрует текстуры по строке поиска
│       ├── _assign_to_slot(tex_name) - привязывает текстуру к первому свободному слоту
│       ├── _refresh_textures() - перезагружает текстуры из папки
│       └── _refresh_texture_list(tex_mgr) - обновляет список после внешних изменений

├── console.py
│   └── class ConsoleManager - интерактивная консоль с историей и автодополнением
│       ├── create(parent) - создаёт виджеты консоли
│       ├── on_mousewheel(event) - прокрутка текста и поля ввода колёсиком
│       ├── _sync_scroll(*args) - синхронизирует скролл между полем ввода и номерами строк
│       ├── _on_console_focus() - фиксирует, что фокус в консоли
│       ├── console_has_focus() - возвращает True, если поле ввода активно
│       ├── _get_current_word() - возвращает слово под курсором и его позицию
│       ├── _get_completions(prefix) - возвращает список команд/пресетов, начинающихся с prefix
│       ├── _hide_completion_popup() - закрывает всплывающее окно автодополнения
│       ├── _show_completion_popup(matches, prefix) - показывает окно со списком вариантов
│       ├── _auto_complete() - обрабатывает Tab: автодополнение команды или показ списка
│       ├── _replace_current_word(new_word) - заменяет текущее слово в строке ввода
│       ├── _history_up() - переход к предыдущей команде
│       ├── _history_down() - переход к следующей команде
│       ├── _set_input_text(text) - устанавливает текст в поле ввода
│       ├── _on_paste(event) - вставка из буфера обмена
│       ├── _update_line_numbers() - обновляет нумерацию строк рядом с полем ввода
│       ├── update_theme() - применяет текущую тему к консоли
│       ├── _execute_multiline() - выполняет многострочную команду 
│       ├── _print(message, msg_type) - выводит сообщение в историю консоли
│       ├── _print_command(command) - выводит приглашение и введённую команду
│       ├── _execute_command_line(command) - разбирает и выполняет команду
│       ├── _handle_input(command) - передаёт ввод в callback при ожидании ответа
│       ├── _handle_preset_selection(command) - обрабатывает выбор пресета
│       ├── _load_preset_file(preset_name) - загружает выбранный пресет
│       ├── ask_input(question, callback) - запрашивает ввод строки у пользователя
│       └── show_preset_selection(presets) - показывает список пресетов и ждёт выбора

└── console_cmd.py
    └── class ConsoleCommands - реализация всех консольных команд
        ├── execute(command, parts) - вызывает нужную _cmd_*
        ├── _cmd_help() - выводит справку
        ├── _cmd_circle(parts) - рисует круг
        ├── _draw_circle(cx,cy,radius,fill,tex_name) - внутренняя отрисовка круга
        ├── _cmd_rect(parts) - рисует прямоугольник
        ├── _draw_rectangle(x1,y1,x2,y2,fill,tex_name) - внутренняя отрисовка прямоугольника
        ├── _cmd_line(parts) - рисует линию
        ├── _draw_line(x1,y1,x2,y2,thickness,tex_name) - рисует линию с толщиной
        ├── _get_line_points(x1,y1,x2,y2) - возвращает клетки на линии
        ├── _cmd_layers() - выводит информацию о слоях в консоль
        ├── _cmd_layer(parts) - управление слоями
        ├── _cmd_tool() - показывает текущий инструмент
        ├── _cmd_clear(parts) - очищает текущий слой или все слои
        ├── _cmd_clear_console() - очищает историю консоли
        ├── _cmd_presets() - выводит список доступных пресетов
        ├── _cmd_save_preset() - сохраняет текущую карту как пресет
        ├── _cmd_delete_preset(parts) - удаляет указанный пресет
        ├── _cmd_load_preset() - загружает пресет
        ├── _cmd_replace(parts) - заменяет одну текстуру на другую во всех слоях
        └── _cmd_brush(parts) - устанавливает размер кисти

 

И это всё занимает 3500+ строк?

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Хeрoбрин сказал:

И это всё занимает 3500+ строк?

Тебя что-то удивляет? Открой код на гитхабе
Уже кстати 3910 строк

Ссылка на комментарий
Поделиться на другие сайты

3 hours ago, Хeрoбрин said:

Да хоть компьютер НАСА, хоть все HDD мира, их не хватит.

ты не доказал это математически, потому что не умешь считать, а значит ты осознанно соврал, значит ты только врёшь, значит тебя нельзя воспринимать всеръёз.

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, quark-gluon plasma сказал:

ты не доказал это математически, потому что не умешь считать, а значит ты осознанно соврал, значит ты только врёшь, значит тебя нельзя воспринимать всеръёз.

Ты хотя бы сам проведи расчёты, для изображения всех атомов средней новостройки нужно 1000 кветтабайт данных, или же 10²¹ терабайт, такого количества нет в мире.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Хeрoбрин сказал:

Ты хотя бы сам проведи расчёты, для изображения всех атомов средней новостройки нужно 1000 кветтабайт данных, или же 10²¹ терабайт, такого количества нет в мире.

Я сделал ограничитель размера карты, так что давайте ругаться на другие темы

Ссылка на комментарий
Поделиться на другие сайты

18 минут назад, Samuraiii сказал:

Давайте итоги подводить что ли

Нет, только не это! На форуме станет скучно

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, Samuraiii сказал:

Ну тогда давайте дальше спорить 

Ок.

18 часов назад, minecart сказал:

Я сделал ограничитель размера карты, так что давайте ругаться на другие темы

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

Ссылка на комментарий
Поделиться на другие сайты

6 минут назад, Хeрoбрин сказал:

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

Пользователь всегда может скачать исходник и отредактировать код как ему вздумается. Лицензия это позволяет

Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, minecart сказал:

Пользователь всегда может скачать исходник и отредактировать код как ему вздумается. Лицензия это позволяет

А если он не знает код?

Ссылка на комментарий
Поделиться на другие сайты

7 часов назад, Хeрoбрин сказал:

А если он не знает код?

Ничего сложного тут нет. В коде editor.py в методе resize_map есть строки:

if new_w > 500:
    self.console._print("Ширина не может превышать 500 клеток", "error")
    return
if new_h > 250:
    self.console._print("Высота не может превышать 250 клеток", "error")
    return
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, minecart сказал:

Ничего сложного тут нет. В коде editor.py в методе resize_map есть строки:

if new_w > 500:
    self.console._print("Ширина не может превышать 500 клеток", "error")
    return
if new_h > 250:
    self.console._print("Высота не может превышать 250 клеток", "error")
    return

Добавь это в Read me.

Ссылка на комментарий
Поделиться на другие сайты

  • Radiant388 закрыто и открыто это тема
В 08.06.2026 в 20:22, minecart сказал:

Ты щас про что или про кого

Про твою программу

В 09.06.2026 в 03:08, Хeрoбрин сказал:

Сказал чел с tf2 нейропомойкой.

Сказал хер по брил, ой то есть хер о брин

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, support сказал:

Про твою программу

Категорически с Вашим мнением не согласен, AI тут никакие не юзались.

6 часов назад, support сказал:

Сказал хер по брил, ой то есть хер о брин

Вообще-то джеке7

Ссылка на комментарий
Поделиться на другие сайты

12 часов назад, minecart сказал:

Вообще-то джеке7

джек 7 это в теккенне такой персонаж есть
 

12 часов назад, minecart сказал:

Категорически с Вашим мнением не согласен, AI тут никакие не юзались.

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

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, support сказал:

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

Нормальное утверждение состоит из тезиса и аргументов - это даже в школе проходят. Если ты являешься опытным программистом, то прошу подтвердить свои слова. 

Ссылка на комментарий
Поделиться на другие сайты

В 14.06.2026 в 12:02, Samuraiii сказал:

опытным программистом

я вообще то великий сотрудник поддержки. как вы посмели так со мной разговаривать?? вы решили оспорить мои знания в программировании?

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...