cleaned and called numbering per tree when its done
This commit is contained in:
		
							parent
							
								
									160fe25be3
								
							
						
					
					
						commit
						654520ad3a
					
				
					 1 changed files with 75 additions and 159 deletions
				
			
		| 
						 | 
				
			
			@ -1,5 +1,3 @@
 | 
			
		|||
import 'dart:js_interop';
 | 
			
		||||
import 'package:web/web.dart' as web;
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'api_service.dart';
 | 
			
		||||
import 'structs.dart';
 | 
			
		||||
| 
						 | 
				
			
			@ -25,59 +23,53 @@ class _CollapsableEmailsState extends State<CollapsableEmails> {
 | 
			
		|||
  List<String> emailsHTML = []; //html of the emails in the thread
 | 
			
		||||
  // build attachments with the forldar name and id
 | 
			
		||||
  Set<int> _expandedEmails = {}; //open emails
 | 
			
		||||
  List viewtypeIDs = []; //IDs of the viewtypes, order matters
 | 
			
		||||
  List heightOfViewTypes = []; //the height of each viewtype
 | 
			
		||||
 | 
			
		||||
  List<SerializableMessage> emailsInThread = [];
 | 
			
		||||
  bool _isLoaded = false;
 | 
			
		||||
  static bool _isListenerRegistered = false;
 | 
			
		||||
  static bool left = true;
 | 
			
		||||
  static bool right = true;
 | 
			
		||||
  web.EventListener? _listener;
 | 
			
		||||
  List<String> hirarchy = ["h1", "h2", "h3", "h4", "h5", "h6", "p"];
 | 
			
		||||
  Map<String, int> hirarchyDict = {
 | 
			
		||||
    "h1": 1,
 | 
			
		||||
    "h2": 2,
 | 
			
		||||
    "h3": 3,
 | 
			
		||||
    "h4": 4,
 | 
			
		||||
    "h5": 6,
 | 
			
		||||
    "h6": 7,
 | 
			
		||||
    "h5": 5,
 | 
			
		||||
    "h6": 6,
 | 
			
		||||
    "p": 8,
 | 
			
		||||
    "ul": 8,
 | 
			
		||||
    "li": 8,
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  List<String> tagsCollected = [];
 | 
			
		||||
  String markdown = '';
 | 
			
		||||
  List<String> allMarkdown = [];
 | 
			
		||||
  List<List<String>> sentinel = [];
 | 
			
		||||
  int level = 0;
 | 
			
		||||
  AugmentTree zoomTreeRoot = AugmentTree();
 | 
			
		||||
  late AugmentTree currentZoomNode;
 | 
			
		||||
  // late AugmentTree currentZoomNode;
 | 
			
		||||
  late List<AugmentTree> currentZoomTree = [];
 | 
			
		||||
  bool zoomOut = false;
 | 
			
		||||
  bool zoomIn = true;
 | 
			
		||||
  late List<AugmentTree> threadNodes = [];
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  void initState() {
 | 
			
		||||
    super.initState();
 | 
			
		||||
    threadNodes = [];
 | 
			
		||||
    currentZoomTree = [];
 | 
			
		||||
    _markdownConverter();
 | 
			
		||||
    // _registerViewFactory(widget.threadHTML);
 | 
			
		||||
    _serializableData(widget.threadIDs); // this
 | 
			
		||||
    _markdown2Tree(markdown);
 | 
			
		||||
    _keyListener();
 | 
			
		||||
    _buildForZooms();
 | 
			
		||||
    _markdown2Tree(allMarkdown);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  void dispose() {
 | 
			
		||||
    if (_listener != null) {
 | 
			
		||||
      web.window.document.removeEventListener('keydown', _listener!);
 | 
			
		||||
      _listener = null;
 | 
			
		||||
      _isListenerRegistered = false;
 | 
			
		||||
    }
 | 
			
		||||
    super.dispose();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void _markdownConverter() async {
 | 
			
		||||
    markdown = html2md.convert(widget.threadHTML[0]);
 | 
			
		||||
    for (int email = 0; email < widget.threadHTML.length; email++) {
 | 
			
		||||
      String markdown = html2md.convert(widget.threadHTML[email]);
 | 
			
		||||
      allMarkdown.add(markdown);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void _add2Tree(AugmentTree tree, md.Element node2add) {
 | 
			
		||||
| 
						 | 
				
			
			@ -89,7 +81,6 @@ class _CollapsableEmailsState extends State<CollapsableEmails> {
 | 
			
		|||
    //1. a node that comes is lower than the root.children last, if so it goes beneath it
 | 
			
		||||
    if (tree.children.isEmpty) {
 | 
			
		||||
      // new level to be created when totally empty
 | 
			
		||||
      print('is empty');
 | 
			
		||||
      tree.children.add(newNode);
 | 
			
		||||
      newNode.parent = tree;
 | 
			
		||||
    } else if (tree.children.isNotEmpty &&
 | 
			
		||||
| 
						 | 
				
			
			@ -128,99 +119,69 @@ class _CollapsableEmailsState extends State<CollapsableEmails> {
 | 
			
		|||
        _add2Tree(tree.children.last, node2add);
 | 
			
		||||
      } else if ((hirarchyDict[node2add.tag] ?? -1) ==
 | 
			
		||||
          (hirarchyDict[tree.children.last.ogTag] ?? -1)) {
 | 
			
		||||
        // print("equals??");
 | 
			
		||||
        tree.children.add(newNode);
 | 
			
		||||
        newNode.parent = tree;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void _markdown2Tree(String text) {
 | 
			
		||||
  void _markdown2Tree(List<String> text) {
 | 
			
		||||
    print("started markdown2tree");
 | 
			
		||||
    final List<md.Node> nakedList = md.Document().parseLines(text.split('\n'));
 | 
			
		||||
    List<String> pList = [];
 | 
			
		||||
    List<String> h1List = [];
 | 
			
		||||
    List<String> h2List = [];
 | 
			
		||||
    List<String> h3List = [];
 | 
			
		||||
    List<String> h4List = [];
 | 
			
		||||
    List<String> h5List = [];
 | 
			
		||||
    List<String> h6List = [];
 | 
			
		||||
 | 
			
		||||
    for (int emailsMD = 0; emailsMD < text.length; emailsMD++) {
 | 
			
		||||
      final List<md.Node> nakedList =
 | 
			
		||||
          md.Document().parseLines(text[emailsMD].split('\n'));
 | 
			
		||||
      zoomTreeRoot = AugmentTree();
 | 
			
		||||
      for (var node in nakedList) {
 | 
			
		||||
        //maybe do an add function, but isn't this it?
 | 
			
		||||
        if (node is md.Element) {
 | 
			
		||||
        // print(node.textContent);
 | 
			
		||||
          AugmentTree temp = AugmentTree();
 | 
			
		||||
          temp.data = node.textContent;
 | 
			
		||||
          temp.ogTag = node.tag;
 | 
			
		||||
          if (node.tag == 'h1') {
 | 
			
		||||
          h1List.add(node.textContent);
 | 
			
		||||
            // make this O(1)
 | 
			
		||||
            _add2Tree(zoomTreeRoot, node);
 | 
			
		||||
          } else if (node.tag == 'h2') {
 | 
			
		||||
            // i dont add any since i dont have it, maybe the function makes sense
 | 
			
		||||
          h2List.add(node.textContent);
 | 
			
		||||
            _add2Tree(zoomTreeRoot, node); // fix this
 | 
			
		||||
          } else if (node.tag == 'h3') {
 | 
			
		||||
          h3List.add(node.textContent);
 | 
			
		||||
            _add2Tree(zoomTreeRoot, node);
 | 
			
		||||
          } else if (node.tag == 'h4') {
 | 
			
		||||
          h4List.add(node.textContent); //this broke it
 | 
			
		||||
            _add2Tree(zoomTreeRoot, node); // change to temp
 | 
			
		||||
          } else if (node.tag == 'h5') {
 | 
			
		||||
          h5List.add(node.textContent);
 | 
			
		||||
          print(node.textContent);
 | 
			
		||||
            _add2Tree(zoomTreeRoot, node);
 | 
			
		||||
          } else if (node.tag == 'h6') {
 | 
			
		||||
          h6List.add(node.textContent);
 | 
			
		||||
            _add2Tree(zoomTreeRoot, node); // fix this
 | 
			
		||||
          } else if (node.tag == 'p' || node.tag == 'ul' || node.tag == 'li') {
 | 
			
		||||
          pList.add(node.textContent);
 | 
			
		||||
            _add2Tree(zoomTreeRoot, node); // fix this
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      zoomTreeRoot.addNumbering();
 | 
			
		||||
      threadNodes.add(zoomTreeRoot);
 | 
			
		||||
      currentZoomTree.add(zoomTreeRoot);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.sentinel = [h1List, h2List, h3List, h4List, h5List, h6List, pList];
 | 
			
		||||
    sentinel.removeWhere((hList) => hList.isEmpty);
 | 
			
		||||
    currentZoomNode = zoomTreeRoot;
 | 
			
		||||
    if (!mounted) return;
 | 
			
		||||
    setState(() {
 | 
			
		||||
      _isLoaded = true;
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void handleKeyDownMD(web.Event event) async {
 | 
			
		||||
    final keyEvent = event as web.KeyboardEvent;
 | 
			
		||||
 | 
			
		||||
    if (!mounted) return;
 | 
			
		||||
    if (keyEvent.key == 'a') {
 | 
			
		||||
      print("key a");
 | 
			
		||||
      setState(() {
 | 
			
		||||
        level = (level - 1).clamp(0, sentinel.length - 1);
 | 
			
		||||
      });
 | 
			
		||||
    } else if (keyEvent.key == "b") {
 | 
			
		||||
      print("b");
 | 
			
		||||
      setState(() {
 | 
			
		||||
        level = (level + 1).clamp(0, sentinel.length - 1);
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void _goToChildren(int index) async {
 | 
			
		||||
    final target = currentZoomNode.children[index];
 | 
			
		||||
  void _goToChildren(int indexThread, int index) async {
 | 
			
		||||
    final target = currentZoomTree[indexThread].children[index];
 | 
			
		||||
    if (target.children.isNotEmpty) {
 | 
			
		||||
      setState(() {
 | 
			
		||||
        currentZoomNode = target;
 | 
			
		||||
        currentZoomTree[indexThread] = target;
 | 
			
		||||
      });
 | 
			
		||||
    } else {
 | 
			
		||||
      print("This child has no further children.");
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void _goToParent() async {
 | 
			
		||||
    if (currentZoomNode.parent != null) {
 | 
			
		||||
  void _goToParent(int indexThread) async {
 | 
			
		||||
    if (currentZoomTree[indexThread].parent != null) {
 | 
			
		||||
      setState(() {
 | 
			
		||||
        currentZoomNode = currentZoomNode.parent!;
 | 
			
		||||
        currentZoomTree[indexThread] = currentZoomTree[indexThread].parent!;
 | 
			
		||||
      });
 | 
			
		||||
    } else {
 | 
			
		||||
      print("Already at root.");
 | 
			
		||||
| 
						 | 
				
			
			@ -230,82 +191,30 @@ class _CollapsableEmailsState extends State<CollapsableEmails> {
 | 
			
		|||
  void _serializableData(String threadID) async {
 | 
			
		||||
    emailsInThread = await ApiService().threadsInSerializable(threadID);
 | 
			
		||||
    print("done thread serializable");
 | 
			
		||||
 | 
			
		||||
    if (!mounted) return;
 | 
			
		||||
    setState(() {
 | 
			
		||||
      _isLoaded = true;
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void handleKeyDownHTML(web.Event event) {
 | 
			
		||||
    final keyEvent = event as web.KeyboardEvent;
 | 
			
		||||
 | 
			
		||||
    if (keyEvent.key == 'G') {
 | 
			
		||||
      print('You pressed the "G" key!');
 | 
			
		||||
      final rightPurpleNums = web.document.getElementsByClassName("right");
 | 
			
		||||
      _CollapsableEmailsState.right = !_CollapsableEmailsState.right;
 | 
			
		||||
      final newOpacity = _CollapsableEmailsState.right ? '1.0' : '0.0';
 | 
			
		||||
      for (int i = 0; i < rightPurpleNums.length; i++) {
 | 
			
		||||
        final currentElement = rightPurpleNums.item(i) as web.HTMLElement;
 | 
			
		||||
        currentElement.style.opacity = newOpacity;
 | 
			
		||||
      }
 | 
			
		||||
    } else if (keyEvent.key == 'H') {
 | 
			
		||||
      print('You pressed the "H" key!');
 | 
			
		||||
      final leftPurpleNums = web.document.getElementsByClassName("left");
 | 
			
		||||
      _CollapsableEmailsState.left = !_CollapsableEmailsState.left;
 | 
			
		||||
      final newOpacity = _CollapsableEmailsState.left ? '1.0' : '0.0';
 | 
			
		||||
      for (int i = 0; i < leftPurpleNums.length; i++) {
 | 
			
		||||
        final currentElement = leftPurpleNums.item(i) as web.HTMLElement;
 | 
			
		||||
        currentElement.style.opacity = newOpacity;
 | 
			
		||||
      }
 | 
			
		||||
    } else if (keyEvent.key == 'm') {
 | 
			
		||||
      print("you pressed 'm'");
 | 
			
		||||
      final purpleNums = web.document.getElementsByClassName("purplenumber");
 | 
			
		||||
      _CollapsableEmailsState.left = true;
 | 
			
		||||
      _CollapsableEmailsState.right = true;
 | 
			
		||||
 | 
			
		||||
      for (int i = 0; i < purpleNums.length; i++) {
 | 
			
		||||
        final currentElement = purpleNums.item(i) as web.HTMLElement;
 | 
			
		||||
        currentElement.style.opacity = '1.0';
 | 
			
		||||
      }
 | 
			
		||||
    } else if (keyEvent.key == 'n') {
 | 
			
		||||
      print("you pressed 'n'");
 | 
			
		||||
      final purpleNums = web.document.getElementsByClassName("purplenumber");
 | 
			
		||||
      _CollapsableEmailsState.left = false;
 | 
			
		||||
      _CollapsableEmailsState.right = false;
 | 
			
		||||
 | 
			
		||||
      for (int i = 0; i < purpleNums.length; i++) {
 | 
			
		||||
        final currentElement = purpleNums.item(i) as web.HTMLElement;
 | 
			
		||||
        currentElement.style.opacity = '0.0';
 | 
			
		||||
      }
 | 
			
		||||
    } else if (keyEvent.key == 'w') {
 | 
			
		||||
      print("you pressed 'w'");
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void _keyListener() {
 | 
			
		||||
    if (_isListenerRegistered) return;
 | 
			
		||||
    _isListenerRegistered = true;
 | 
			
		||||
 | 
			
		||||
    // Convert the top-level function to JS-compatible
 | 
			
		||||
    // _listener = handleKeyDownHTML.toJS;
 | 
			
		||||
    _listener = handleKeyDownMD.toJS;
 | 
			
		||||
 | 
			
		||||
    web.window.document.addEventListener('keydown', _listener!);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Widget _buildForZooms({Key? key}) {
 | 
			
		||||
  Widget _buildForZooms(int indexThread) {
 | 
			
		||||
    // IF I GIVE IT THE INDEX????
 | 
			
		||||
    if (!_isLoaded) {
 | 
			
		||||
      return const Center(child: CircularProgressIndicator()); // loading screen
 | 
			
		||||
    }
 | 
			
		||||
    final canZoomOut = currentZoomNode.parent != null;
 | 
			
		||||
 | 
			
		||||
    final AugmentTree currentZoomNodeForThisEmail =
 | 
			
		||||
        currentZoomTree[indexThread];
 | 
			
		||||
 | 
			
		||||
    final canZoomOut = currentZoomNodeForThisEmail.parent != null;
 | 
			
		||||
 | 
			
		||||
    return ListView.builder(
 | 
			
		||||
      key: key,
 | 
			
		||||
      itemCount: currentZoomNode.children.length,
 | 
			
		||||
      itemCount: currentZoomNodeForThisEmail.children.length,
 | 
			
		||||
      itemBuilder: (context, index) {
 | 
			
		||||
        final childNode = currentZoomNode.children[index];
 | 
			
		||||
        final childNode = currentZoomNodeForThisEmail.children[index];
 | 
			
		||||
        final canZoomIn = childNode.children.isNotEmpty;
 | 
			
		||||
 | 
			
		||||
        // currentZoomNodeForThisEmail.addNumbering();
 | 
			
		||||
        return Padding(
 | 
			
		||||
          padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 6.0),
 | 
			
		||||
          child: Material(
 | 
			
		||||
| 
						 | 
				
			
			@ -323,12 +232,13 @@ class _CollapsableEmailsState extends State<CollapsableEmails> {
 | 
			
		|||
                    children: [
 | 
			
		||||
                      OutlinedButton(
 | 
			
		||||
                        onPressed:
 | 
			
		||||
                            canZoomOut ? () => _goToParent() : null,
 | 
			
		||||
                            canZoomOut ? () => _goToParent(indexThread) : null,
 | 
			
		||||
                        child: Icon(Icons.north_west_sharp),
 | 
			
		||||
                      ),
 | 
			
		||||
                      OutlinedButton(
 | 
			
		||||
                        onPressed:
 | 
			
		||||
                            canZoomIn ? () => _goToChildren(index) : null,
 | 
			
		||||
                        onPressed: canZoomIn
 | 
			
		||||
                            ? () => _goToChildren(indexThread, index)
 | 
			
		||||
                            : null,
 | 
			
		||||
                        child: Icon(Icons.south_east_sharp),
 | 
			
		||||
                      ),
 | 
			
		||||
                    ],
 | 
			
		||||
| 
						 | 
				
			
			@ -336,12 +246,17 @@ class _CollapsableEmailsState extends State<CollapsableEmails> {
 | 
			
		|||
                  SizedBox(width: 12.0),
 | 
			
		||||
                  Expanded(
 | 
			
		||||
                    child: MarkdownBlock(
 | 
			
		||||
                      data: currentZoomNode
 | 
			
		||||
                          .children[index].data, // one string of markdown
 | 
			
		||||
                      data: childNode.data,
 | 
			
		||||
                      // data: currentZoomNode
 | 
			
		||||
                      //     .children[index].data, // one string of markdown
 | 
			
		||||
                      config: MarkdownConfig
 | 
			
		||||
                          .darkConfig, // or lightConfig depending on theme
 | 
			
		||||
                    ),
 | 
			
		||||
                  ),
 | 
			
		||||
                  Text(
 | 
			
		||||
                    childNode.numbering,
 | 
			
		||||
                    style: TextStyle(color: Color(Colors.purple[400]!.value)),
 | 
			
		||||
                  )
 | 
			
		||||
                ],
 | 
			
		||||
              ),
 | 
			
		||||
            ),
 | 
			
		||||
| 
						 | 
				
			
			@ -382,7 +297,8 @@ class _CollapsableEmailsState extends State<CollapsableEmails> {
 | 
			
		|||
                            minHeight: 100,
 | 
			
		||||
                            maxHeight: MediaQuery.of(context).size.height * 0.6,
 | 
			
		||||
                          ),
 | 
			
		||||
                          child: _buildForZooms(key: ValueKey(currentZoomNode)),
 | 
			
		||||
                          child: _buildForZooms(index), //show the tree
 | 
			
		||||
                          // child: _buildForZooms(key: ValueKey(currentZoomNode)),
 | 
			
		||||
                        ),
 | 
			
		||||
                      Divider(),
 | 
			
		||||
                    ],
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue