Importált rétegek stílusának szerkesztése

This commit is contained in:
2026-07-04 23:36:01 +02:00
parent 077b40967c
commit 2cf83149f0
12 changed files with 341 additions and 64 deletions
+2 -1
View File
@@ -1,9 +1,10 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:terepi_seged/core/style_editable.dart';
import 'package:terepi_seged/pages/map_survey/presentations/controllers/map_survey_controller.dart';
class ColorRow extends StatelessWidget {
final MapSurveyController ctrl;
final StyleEditable ctrl;
final double circleSize;
static const _palette = [
@@ -0,0 +1,81 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:terepi_seged/widgets/map_edit_tools/style_editable.dart';
import 'color_row.dart';
import 'opacity_slider.dart';
import 'stroke_slider.dart';
class ImportedLayerStyleSheet extends StatelessWidget {
final String layerName;
final LayerStyleSession session; // ← a közös interfész implementációja
final VoidCallback onSave;
final VoidCallback onReset;
const ImportedLayerStyleSheet({
required this.layerName,
required this.session,
required this.onSave,
required this.onReset,
});
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.fromLTRB(
20, 16, 20, MediaQuery.of(context).padding.bottom + 16),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface,
borderRadius: const BorderRadius.vertical(top: Radius.circular(16)),
),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Handle
Center(
child: Container(
width: 40,
height: 4,
margin: const EdgeInsets.only(bottom: 16),
decoration: BoxDecoration(
color: Colors.grey.shade300,
borderRadius: BorderRadius.circular(2)),
)),
Text(layerName,
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600),
overflow: TextOverflow.ellipsis),
const SizedBox(height: 20),
// ── Meglévő widgetek — ismerős felület ──────────────────
ColorRow(ctrl: session), // ← ugyanaz mint a geometriáknál
const SizedBox(height: 18),
OpacitySlider(ctrl: session),
const SizedBox(height: 10),
StrokeSlider(ctrl: session),
const SizedBox(height: 24),
// Gombok
Row(children: [
OutlinedButton(
onPressed: () {
onReset();
Get.back();
},
child: const Text('Visszaállítás'),
),
const Spacer(),
FilledButton(
onPressed: () {
onSave();
Get.back();
},
child: const Text('Alkalmaz'),
),
]),
],
),
);
}
}
@@ -1,11 +1,12 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:terepi_seged/core/style_editable.dart';
import 'package:terepi_seged/pages/map_survey/presentations/controllers/map_survey_controller.dart';
import 'labeled_slider.dart';
class OpacitySlider extends StatelessWidget {
final MapSurveyController ctrl;
final StyleEditable ctrl;
const OpacitySlider({required this.ctrl});
@override
@@ -1,11 +1,12 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:terepi_seged/core/style_editable.dart';
import 'package:terepi_seged/pages/map_survey/presentations/controllers/map_survey_controller.dart';
import 'labeled_slider.dart';
class StrokeSlider extends StatelessWidget {
final MapSurveyController ctrl;
final StyleEditable ctrl;
const StrokeSlider({required this.ctrl});
@override
@@ -0,0 +1,23 @@
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:get/get_rx/src/rx_types/rx_types.dart';
import 'package:terepi_seged/core/style_editable.dart';
class LayerStyleSession implements StyleEditable {
@override
Rx<Color> activeEditColor = Color(0xFF1565C0).obs;
@override
RxDouble activeEditOpacity = 0.35.obs;
@override
RxDouble activeEditStrokeWidth = 2.5.obs;
LayerStyleSession(
{required Color color,
required double opacity,
required double strokeWidth}) {
activeEditColor.value = color;
activeEditOpacity.value = opacity;
activeEditStrokeWidth.value = strokeWidth;
}
}