Metadata-Version: 2.4
Name: cstplus
Version: 1.0.0
Summary: Современная GUI-библиотека на базе customtkinter с декларативным API и method chaining
Author: cstplus team
License: MIT
Project-URL: Homepage, https://github.com/cstplus/cstplus
Project-URL: Documentation, https://github.com/cstplus/cstplus#readme
Project-URL: Repository, https://github.com/cstplus/cstplus.git
Keywords: gui,tkinter,customtkinter,ui,desktop,wrapper
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: Software Development :: User Interfaces
Classifier: Topic :: Software Development :: Widget Sets
Requires-Python: >=3.8
Description-Content-Type: text/markdown
Requires-Dist: customtkinter>=5.0.0
Provides-Extra: dev
Requires-Dist: pytest>=7.0.0; extra == "dev"
Requires-Dist: build>=0.10.0; extra == "dev"
Requires-Dist: twine>=4.0.0; extra == "dev"

# cstplus — Современная GUI-библиотека на Python

**cstplus** — это надстройка над `customtkinter`, предоставляющая простой, декларативный и "функциональный" интерфейс для создания современных интерфейсов с использованием текучего интерфейса (method chaining).

## Установка

```bash
pip install customtkinter
```

## Быстрый старт

```python
import cstplus as cst

with cst.App("Мое приложение", theme="dark") as app:
    # Настройка сетки
    app.layout.add_row(0, weight=1).add_column(0, weight=1)

    # Создание виджетов
    label = cst.Label(app, text="Привет, мир!").grid(row=0, column=0)
    btn = cst.Button(app, text="Нажми").command(lambda: print("Clicked")).pack(pady=10)

    # Подписка на события
    bus = cst.EventBus()
    bus.subscribe("button_click", lambda: label.text("Нажато!"))
```

## Компоненты

### App
Основной класс приложения. Наследуется от `customtkinter.CTk`.

```python
app = cst.App("Заголовок", theme="dark", width=800, height=600)
app.run()

# Или с контекстным менеджером:
with cst.App("Заголовок", theme="dark") as app:
    # виджеты
    pass  # app.run() вызывается автоматически
```

**Методы:**
- `set_theme("light"|"dark"|"system")` — установить тему
- `set_layout("grid"|"pack")` — установить менеджер геометрии
- `layout` — свойство для доступа к Layout
- `event_bus` — свойство для доступа к EventBus
- `theme_manager` — свойство для доступа к ThemeManager

### Button
Кнопка с текучим интерфейсом.

```python
btn = cst.Button(app, text="Кнопка")
btn.text("Новый текст")\
   .command(lambda: print("Click"))\
   .style(fg_color="#3498db", hover_color="#2980b9")\
   .grid(row=0, column=0)
```

**Методы:**
- `.text(str)` — установить текст
- `.command(callback)` — установить обработчик нажатия
- `.style(**kwargs)` — настроить стиль (fg_color, hover_color, text_color, и т.д.)
- `.pack(**kwargs)`, `.grid(row, column, **kwargs)`, `.place(x, y, **kwargs)` — разместить виджет
- `.enable()`, `.disable()` — включить/выключить кнопку

### Label
Метка (надпись) с текучим интерфейсом.

```python
label = cst.Label(app, text="Текст")
label.text("Новый текст")\
     .font(size=20, weight="bold")\
     .color("#ff0000")\
     .grid(row=0, column=0)
```

**Методы:**
- `.text(str)` — установить текст
- `.font(family, size, weight, slant, underline)` — настроить шрифт
- `.color(hex)` — установить цвет текста
- `.align("left"|"center"|"right")` — выровнять текст

### Entry
Поле ввода с текучим интерфейсом.

```python
entry = cst.Entry(app)
entry.placeholder("Введите имя")\
     .variable(string_var)\
     .validate(lambda x: len(x) < 100)\
     .grid(row=0, column=0)

# Получить/установить значение
text = entry.get()
entry.set("новое значение")
entry.clear()
```

**Методы:**
- `.placeholder(str)` — установить текст-подсказку
- `.variable(StringVar)` — привязать переменную
- `.validate(callback)` — установить функцию валидации
- `.get()`, `.set(str)`, `.clear()` — работа с текстом

### Window
Дочернее окно (Toplevel).

```python
win = cst.Window(app)
win.title("Дочернее окно")\
   .size(400, 300)\
   .modal(True)\
   .center_on_parent()

# Разместить виджеты в окне
label = cst.Label(win, text="Внутри окна").pack()
```

**Методы:**
- `.title(str)` — установить заголовок
- `.size(width, height)` — установить размер
- `.position(x, y)` — установить позицию
- `.modal(bool)` — сделать модальным
- `.resizable(width, height)` — разрешить изменение размера
- `.show()`, `.hide()`, `.destroy()` — управление окном
- `.center_on_parent()` — центрировать относительно родителя

### ThemeManager
Управление темами и цветами.

```python
tm = cst.ThemeManager()
tm.set_theme("dark")
colors = tm.get_colors()
print(colors.primary_color)

# Создать кастомную тему
tm.create_theme("ocean", primary_color="#0066cc", bg_color="#001133")
```

**Методы:**
- `set_theme(name)` — установить тему
- `get_colors()` — получить цвета текущей темы
- `get_color(color_name)` — получить конкретный цвет
- `create_theme(name, **colors)` — создать тему
- `add_theme(name, ThemeColors)` — добавить тему

### EventBus
Шина событий для обмена данными между виджетами.

```python
bus = cst.EventBus()
bus.subscribe("click", lambda data: print(f"Клик: {data}"))
bus.emit("click", {"x": 10, "y": 20})
```

**Методы:**
- `subscribe(event_name, callback)` — подписаться на событие
- `unsubscribe(event_name, callback)` — отписаться
- `emit(event_name, data)` — опубликовать событие
- `clear()` — очистить все подписки

### Layout
Менеджер сетки для grid-раскладки.

```python
app.layout.add_row(0, weight=1)\
          .add_row(1, weight=2)\
          .add_column(0, weight=1)\
          .add_column(1, weight=1)\
          .configure()

# Или быстро:
app.layout.setup_grid(rows=3, columns=3, weight=1).configure()
```

**Методы:**
- `add_row(index, weight, min_size)` — добавить строку
- `add_column(index, weight, min_size)` — добавить столбец
- `add_rows(count, start, weight)` — добавить несколько строк
- `add_columns(count, start, weight)` — добавить несколько столбцов
- `setup_grid(rows, columns, weight)` — быстро настроить сетку
- `configure()` — применить конфигурацию

## Архитектура

```
cstplus/
├── __init__.py          # Основной экспорт API
├── core/
│   ├── __init__.py
│   ├── app.py           # Класс App
│   ├── widgets.py       # Button, Label, Entry, Window
│   ├── styles.py        # ThemeManager, ThemeColors
│   ├── events.py        # EventBus
│   └── layout.py        # Layout
└── example.py           # Пример использования
```

## Особенности

1. **Композиция вместо наследования** — виджеты хранятся в атрибуте `.widget`
2. **Method chaining** — все методы возвращают `self`
3. **Современный Python** — тайп-хинты, dataclasses, enum
4. **Чистый код** — только стандартная библиотека + customtkinter

## Лицензия

MIT
