Lattice-Automation / seqviz

a JavaScript DNA, RNA, and protein sequence viewer
https://tools.latticeautomation.com/seqviz
MIT License
246 stars 53 forks source link

implement one row linear viewer #205

Open bugzpodder opened 1 year ago

bugzpodder commented 1 year ago

fixes #179

https://codesandbox.io/s/dawn-haze-ey1k3v?file=/demo/package.json

jjti commented 1 year ago

Seeing one small thing @bugzpodder where the annotation wrapping edges are showing up along the linear viewer like:

Screenshot from 2023-05-06 15-58-25

That should be fixable down in Annotations around among all this nonsense for edges and stuff: https://github.com/Lattice-Automation/seqviz/blob/develop/src/Linear/Annotations.tsx#L130-L182

bugzpodder commented 1 year ago

Looks a bit better but still not ideal. not too familiar with SVG but ideally can make the edge invisible or same as background color but couldn't really figure it out.

Screenshot 2023-05-06 at 11 48 14 PM
jjti commented 1 year ago

@bugzpodder I'm toying around with something like what's in this example PR's commit: https://github.com/Lattice-Automation/seqviz/pull/211/commits/95fa0620b810a0e1bc595a2f6d9468684223e7ed

We'd literally have only a single SeqBlock that covers the entire sequence.

Some pros/cons of that different approach in that commit above:

Pros:

Cons:

where render is false if the passed first/lastIndex are way outside the viewer's current viewer, and the corresponding component shouldn't bother rendering at all for performance reasons. For example, in Linear/Index.tsx, we'd skip rendering ticks if we see the ticks index is so far outside the Viewer that it'd never show up anyway like:

    return tickIndexes.map(p => {
      let { x: tickFromLeft, render } = findXAndWidth(p - 1, p - 1); // for midpoint
      if (!render) {
        return null;
      }
      tickFromLeft += charWidth / 2;

I'm open to other thoughts/opinions on this. And I realize it's a bit of a drift in approach from the PR, but I think it might be less total work...

bugzpodder commented 1 year ago

I think that's a really neat idea. If we can render using just a partial block and do some optimizations so the svg path are only drawn for whats in the viewport that would obviously be best.

definitely prefer that since its much easier to reason with and code.

leshane commented 1 year ago

This is awesome. Looks like we've made some progress with this PR. Can we carry this over the finish line? @jjti @bugzpodder

bugzpodder commented 1 year ago

@leshane I think @jjti is planning a simpler implementation. The issue with my version is that when two blocks are connected together you see some weird artifacts: https://github.com/Lattice-Automation/seqviz/pull/205#issuecomment-1537557173