# editor.py """ Редактор состава смеси. Позволяет добавлять, изменять ингредиенты и сохранять состав в проект. """ from core.classes import Ingredient from core.fs import save_project_partial from core.table_io import handle_table_output def safe_float(prompt, default=None): """Безопасный ввод числа с возможностью значения по умолчанию.""" while True: val = input(prompt) if val.strip() == "" and default is not None: return default try: return float(val) except ValueError: print("Ошибка! Введите число.") def display_ingredients(mixture): """Выводит список ингредиентов в виде таблицы.""" if not mixture.ings: print("Список ингредиентов пуст.") return headers = ["№", "Название", "%", "Разбавление", "Плотность"] rows = [] for i, info in enumerate(mixture.ings, start=1): rows.append([ str(i), info.name + (" (растворитель)" if i == 1 else ""), f"{info.value:.1f}", f"{info.dilution:.2f}", f"{info.density:.2f}" ]) handle_table_output(headers, rows, title="Список ингредиентов") def editor_menu(mixture): """ Подменю редактора состава. Изменяет объект mixture напрямую. """ while True: print("\n" + "=" * 50) print("РЕДАКТОР СОСТАВА") print("1. Добавить ингредиент") print("2. Показать все ингредиенты") print("3. Изменить количество ингредиента (%)") print("4. Изменить разбавление и плотность") print("5. Сохранить состав в проект") print("(Enter - выход в главное меню)") print("=" * 50) choice = input("Выберите пункт: ").strip() if choice == "": break if choice == "1": name = input("Название: ") unit = input("Единица: ") value = safe_float("Количество (%): ") if value < 0: print("Процент не может быть отрицательным!") continue dilution = safe_float("Разбавление (по умолчанию 1): ", default=1.0) density = safe_float("Плотность (по умолчанию 1): ", default=1.0) ing = Ingredient(name, unit, value) mixture.add_ingredient(ing, dilution, density) print(f"Добавлено: {ing.name} = {ing.value:.1f}%") elif choice == "2": display_ingredients(mixture) elif choice == "3": if len(mixture.ings) <= 1: print("Нельзя изменить единственный ингредиент (растворитель) напрямую.") continue display_ingredients(mixture) try: idx = int(input("Номер ингредиента: ")) - 1 if idx == 0: print("Нельзя менять растворитель напрямую.") continue if idx < 0 or idx >= len(mixture.ings): print("Неверный номер!") continue new_val = safe_float(f"Новое количество для {mixture.ings[idx].name} (%): ") if new_val < 0: print("Процент не может быть отрицательным!") continue mixture.ings[idx].value = new_val mixture.comp_solvent_percent() print(f"Обновлено! Растворитель теперь: {mixture.ings[0].value:.1f}%") except ValueError: print("Ошибка!") elif choice == "4": if not mixture.ings: print("Список пуст.") continue display_ingredients(mixture) try: idx = int(input("Номер ингредиента: ")) - 1 if idx < 0 or idx >= len(mixture.ings): print("Неверный номер!") continue info = mixture.ings[idx] new_dil = safe_float(f"Новое разбавление для {info.name} (было {info.dilution:.2f}): ", default=info.dilution) new_den = safe_float(f"Новая плотность для {info.name} (было {info.density:.2f}): ", default=info.density) info.dilution = new_dil info.density = new_den print("Параметры обновлены!") except ValueError: print("Ошибка!") elif choice == "5": save_project_partial(mixture=mixture) print("Состав сохранён в проект.") else: print("Неверный пункт.")