setvar function

void setvar(
  1. String name,
  2. dynamic value
)

setvar — corresponds to WML's <setvar name= value=>.

Implementation

void setvar(String name, dynamic value) {
  final ev = _currentEvaluator;
  if (ev == null) return;
  final dynamic v = (value is String) ? expression(value) : value;

  final lb = name.indexOf("[");
  final rb = name.indexOf("]");
  if (lb > 0 && rb > lb) {
    final aryName = name.substring(0, lb);
    final idxExpr = name.substring(lb + 1, rb);
    final k = expression(idxExpr);
    final idx = (k is num) ? k.toInt() : int.tryParse("$k") ?? 0;
    final cur = ev.getVar(aryName);
    var list = (cur is List) ? cur : <dynamic>[];
    try {
      while (list.length <= idx) {
        list.add(null);
      }
      list[idx] = v;
    } on TypeError {
      // a typed list (e.g. List<int> from Dart code) can't hold null or
      // other types: continue with a List<dynamic> copy
      list = List<dynamic>.of(list);
      while (list.length <= idx) {
        list.add(null);
      }
      list[idx] = v;
    }
    ev.setVar(aryName, list);
    _notifyVarChanged(aryName);
    return;
  }

  final dot = name.indexOf(".");
  if (dot > 0 && _currentRegistry != null) {
    final dsName = name.substring(0, dot);
    final field = name.substring(dot + 1);
    final ds = _currentRegistry!.find(dsName);
    if (ds != null && ds.active) {
      // Corresponds to lazarus_db_types.dart's DataSetState (the original
      // code used TTDataSetState.dsBrowse; here it's TDataSetState.dsBrowse)
      if (ds.state == TDataSetState.dsBrowse) ds.edit();
      ds.setFieldValues(field, v);
      return;
    }
  }

  ev.setVar(name, v);
  _notifyVarChanged(name);
}