- Split app.py into route blueprints (files, layers, images, polygon, mask, krita) - Create services layer (polygon_storage, comfyui, file_browser) - Extract config constants to config.py - Split templates into Jinja partials (base, components, modals) - Add browse dialog for visual file navigation - Add /api/browse endpoint for directory listing
112 lines
3.4 KiB
Python
112 lines
3.4 KiB
Python
"""Layer operations routes for ORA Editor."""
|
|
|
|
from flask import Blueprint, request, jsonify
|
|
|
|
from ora_editor.ora_ops import (
|
|
load_ora, add_masked_layer, rename_layer, delete_layer,
|
|
reorder_layer, set_layer_visibility
|
|
)
|
|
|
|
layers_bp = Blueprint('layers', __name__)
|
|
|
|
|
|
@layers_bp.route('/api/layers', methods=['GET'])
|
|
def api_layers():
|
|
"""Get the current layer structure."""
|
|
ora_path = request.args.get('ora_path')
|
|
|
|
if not ora_path:
|
|
return jsonify({'success': False, 'error': 'Missing ora_path parameter'}), 400
|
|
|
|
try:
|
|
loaded = load_ora(ora_path)
|
|
|
|
layers = []
|
|
for layer in loaded['layers']:
|
|
layers.append({
|
|
'name': layer['name'],
|
|
'src': layer['src'],
|
|
'group': layer.get('group'),
|
|
'visible': layer.get('visible', True)
|
|
})
|
|
|
|
return jsonify({'success': True, 'layers': layers})
|
|
except Exception as e:
|
|
return jsonify({'success': False, 'error': str(e)}), 500
|
|
|
|
|
|
@layers_bp.route('/api/layer/add', methods=['POST'])
|
|
def api_layer_add():
|
|
"""Add a new masked layer."""
|
|
data = request.get_json()
|
|
|
|
required = ['ora_path', 'entity_name', 'mask_path']
|
|
for field in required:
|
|
if field not in data:
|
|
return jsonify({'success': False, 'error': f'Missing {field} parameter'}), 400
|
|
|
|
ora_path = data['ora_path']
|
|
entity_name = data['entity_name']
|
|
mask_path = data['mask_path']
|
|
source_layer = data.get('source_layer', 'base')
|
|
|
|
result = add_masked_layer(ora_path, entity_name, mask_path, source_layer)
|
|
|
|
return jsonify(result)
|
|
|
|
|
|
@layers_bp.route('/api/layer/rename', methods=['POST'])
|
|
def api_layer_rename():
|
|
"""Rename a layer."""
|
|
data = request.get_json()
|
|
|
|
required = ['ora_path', 'old_name', 'new_name']
|
|
for field in required:
|
|
if field not in data:
|
|
return jsonify({'success': False, 'error': f'Missing {field} parameter'}), 400
|
|
|
|
result = rename_layer(data['ora_path'], data['old_name'], data['new_name'])
|
|
return jsonify(result)
|
|
|
|
|
|
@layers_bp.route('/api/layer/delete', methods=['POST'])
|
|
def api_layer_delete():
|
|
"""Delete a layer."""
|
|
data = request.get_json()
|
|
|
|
required = ['ora_path', 'layer_name']
|
|
for field in required:
|
|
if field not in data:
|
|
return jsonify({'success': False, 'error': f'Missing {field} parameter'}), 400
|
|
|
|
result = delete_layer(data['ora_path'], data['layer_name'])
|
|
return jsonify(result)
|
|
|
|
|
|
@layers_bp.route('/api/layer/reorder', methods=['POST'])
|
|
def api_layer_reorder():
|
|
"""Reorder a layer."""
|
|
data = request.get_json()
|
|
|
|
required = ['ora_path', 'layer_name', 'direction']
|
|
for field in required:
|
|
if field not in data:
|
|
return jsonify({'success': False, 'error': f'Missing {field} parameter'}), 400
|
|
|
|
result = reorder_layer(data['ora_path'], data['layer_name'], data['direction'])
|
|
return jsonify(result)
|
|
|
|
|
|
@layers_bp.route('/api/layer/visibility', methods=['POST'])
|
|
def api_layer_visibility():
|
|
"""Set layer visibility."""
|
|
data = request.get_json()
|
|
|
|
required = ['ora_path', 'layer_name', 'visible']
|
|
for field in required:
|
|
if field not in data:
|
|
return jsonify({'success': False, 'error': f'Missing {field} parameter'}), 400
|
|
|
|
result = set_layer_visibility(data['ora_path'], data['layer_name'], data['visible'])
|
|
return jsonify(result)
|