render method

  1. @override
ValueProvider render(
  1. JSONRender render,
  2. DivElement output,
  3. dynamic node,
  4. dynamic nodeOriginal,
  5. NodeKey nodeKey,
)
override

Implementation

@override
ValueProvider render(JSONRender render, DivElement output, dynamic node,
    dynamic nodeOriginal, NodeKey nodeKey) {
  var geo = parseLatitudeLongitude(node);
  var nodeIsMap = node is Map;

  Element geoElem;
  ValueProvider valueProvider;

  if (render.renderMode == JSONRenderMode.input) {
    var geoStr = geo.toString();

    var input = InputElement()
      ..value = geoStr
      ..type = 'text';

    input.onDoubleClick.listen((e) {
      var geo2 = Geolocation.fromCoords(input.value!);
      openGoogleMaps(geo2);
    });

    var button = SpanElement()
      ..innerHtml = ' ⊕'
      ..style.fontSize = '125%'
      ..style.cursor = 'pointer';

    button.onClick.listen((e) async {
      print('Getting CurrentGeolocation...');
      var myGeolocation = await Geolocation.getCurrentGeolocation();
      print('CurrentGeolocation: $myGeolocation');
      input.value = myGeolocation.toString();
    });

    geoElem = createDivInline();

    geoElem.children.add(input);
    geoElem.children.add(button);

    valueProvider = (parent) {
      final value = input.value!;
      var geo2 = Geolocation.fromCoords(value)!;

      if (nodeIsMap) {
        return {'latitude': geo2.latitude, 'longitude': geo2.longitude};
      } else {
        return geo2;
      }
    };
  } else {
    var geoStr = geo.toString();

    var elem = SpanElement()..text = geoStr;

    elem.onClick.listen((e) {
      copyElementToClipboard(elem);
      openGoogleMaps(geo);
    });

    geoElem = elem;

    valueProvider = (parent) => nodeOriginal;
  }

  output.children.add(SpanElement()..innerHtml = '📍');
  output.children.add(geoElem);

  this.applyCSS(render, output, extraElements: [geoElem]);

  return valueProvider;
}