111 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'package:flutter/material.dart';
 | 
						|
import './common.dart';
 | 
						|
import './manager.dart';
 | 
						|
 | 
						|
final Map<String, LocationModel> _locationModels = {};
 | 
						|
final Map<String, OptionModel> _optionModels = {};
 | 
						|
 | 
						|
class OptionModel with ChangeNotifier {
 | 
						|
  String? v;
 | 
						|
 | 
						|
  String? get value => v;
 | 
						|
  set value(String? v) {
 | 
						|
    this.v = v;
 | 
						|
    notifyListeners();
 | 
						|
  }
 | 
						|
 | 
						|
  static String key(String location, PluginId id, String peer, String k) =>
 | 
						|
      '$location|$id|$peer|$k';
 | 
						|
}
 | 
						|
 | 
						|
class PluginModel with ChangeNotifier {
 | 
						|
  final List<UiType> uiList = [];
 | 
						|
  final Map<String, String> opts = {};
 | 
						|
 | 
						|
  void add(List<UiType> uiList) {
 | 
						|
    bool found = false;
 | 
						|
    for (var ui in uiList) {
 | 
						|
      for (int i = 0; i < this.uiList.length; i++) {
 | 
						|
        if (this.uiList[i].key == ui.key) {
 | 
						|
          this.uiList[i] = ui;
 | 
						|
          found = true;
 | 
						|
        }
 | 
						|
      }
 | 
						|
      if (!found) {
 | 
						|
        this.uiList.add(ui);
 | 
						|
      }
 | 
						|
    }
 | 
						|
    notifyListeners();
 | 
						|
  }
 | 
						|
 | 
						|
  String? getOpt(String key) => opts.remove(key);
 | 
						|
 | 
						|
  bool get isEmpty => uiList.isEmpty;
 | 
						|
}
 | 
						|
 | 
						|
class LocationModel with ChangeNotifier {
 | 
						|
  final Map<PluginId, PluginModel> pluginModels = {};
 | 
						|
 | 
						|
  void add(PluginId id, List<UiType> uiList) {
 | 
						|
    if (pluginModels[id] != null) {
 | 
						|
      pluginModels[id]!.add(uiList);
 | 
						|
    } else {
 | 
						|
      var model = PluginModel();
 | 
						|
      model.add(uiList);
 | 
						|
      pluginModels[id] = model;
 | 
						|
      notifyListeners();
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  void clear() {
 | 
						|
    pluginModels.clear();
 | 
						|
    notifyListeners();
 | 
						|
  }
 | 
						|
 | 
						|
  void remove(PluginId id) {
 | 
						|
    pluginModels.remove(id);
 | 
						|
    notifyListeners();
 | 
						|
  }
 | 
						|
 | 
						|
  bool get isEmpty => pluginModels.isEmpty;
 | 
						|
}
 | 
						|
 | 
						|
void addLocationUi(String location, PluginId id, List<UiType> uiList) {
 | 
						|
  if (_locationModels[location] == null) {
 | 
						|
    _locationModels[location] = LocationModel();
 | 
						|
  }
 | 
						|
  _locationModels[location]?.add(id, uiList);
 | 
						|
}
 | 
						|
 | 
						|
LocationModel? getLocationModel(String location) => _locationModels[location];
 | 
						|
 | 
						|
PluginModel? getPluginModel(String location, PluginId id) =>
 | 
						|
    _locationModels[location]?.pluginModels[id];
 | 
						|
 | 
						|
void clearPlugin(PluginId pluginId) {
 | 
						|
  for (var element in _locationModels.values) {
 | 
						|
    element.remove(pluginId);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void clearLocations() {
 | 
						|
  for (var element in _locationModels.values) {
 | 
						|
    element.clear();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
OptionModel getOptionModel(
 | 
						|
    String location, PluginId pluginId, String peer, String key) {
 | 
						|
  final k = OptionModel.key(location, pluginId, peer, key);
 | 
						|
  if (_optionModels[k] == null) {
 | 
						|
    _optionModels[k] = OptionModel();
 | 
						|
  }
 | 
						|
  return _optionModels[k]!;
 | 
						|
}
 | 
						|
 | 
						|
void updateOption(
 | 
						|
    String location, PluginId id, String peer, String key, String value) {
 | 
						|
  final k = OptionModel.key(location, id, peer, key);
 | 
						|
  _optionModels[k]?.value = value;
 | 
						|
}
 |