CodeEditTextView - An Xcode-inspired code editor view written in Swift powered by tree-sitter for CodeEdit

Overview

CodeEditTextView

An Xcode-inspired code editor view written in Swift powered by tree-sitter for CodeEdit. Features include syntax highlighting (based on the provided theme), code completion, find and replace, text diff, validation, current line highlighting, minimap, inline messages (warnings and errors), bracket matching, and more.

github-cover-CodeEditTextView

Github Tests Documentation GitHub Repo stars GitHub forks Discord Badge

⚠️ CodeEditTextView is currently in development and it is not ready for production use.
Please check back later for updates on this project. Contributors are welcome as we build out the features mentioned above!

Documentation

This package is fully documented here.

Usage

import CodeEditTextView

struct ContentView: View {

    @State var text = "let x = 1.0"
    @State var theme = EditorTheme(...)
    @State var font = NSFont.monospacedSystemFont(ofSize: 11, weight: .regular)
    @State var tabWidth = 4
    @State var lineHeight = 1.2

    var body: some View { 
        CodeEditTextView(
            $text,
            language: .swift,
            theme: $theme,
            font: $font,
            tabWidth: $tabWidth,
            lineHeight: $lineHeight
        )
    }
}

Currently Supported Languages

See issue #15 for more information on supported languages.

Dependencies

Special thanks to both Marcin Krzyzanowski & Matt Massicotte for the great work they've done!

Package Source Author
STTextView GitHub Marcin Krzyzanowski
SwiftTreeSitter GitHub Matt Massicotte

License

Licensed under the MIT license.

Comments
  • How to choose only JSON methods when import this repo?

    How to choose only JSON methods when import this repo?

    When I tried to use CodeEditTetView on macOS, and only used to parse JSON, I found that it depends on many parsing libraries in other languages, is there a way to remove other libraries according to personal needs?

    Because I only need methods related to json parsing.

    image

    Thanks!

    opened by Jinxiansen 7
  • Incremental Highlighting

    Incremental Highlighting

    Description

    This PR adds incremental highlighting to the text editor. When an edit occurs, it applies the edit in tree-sitter and calculates what other indices may need re-highlighting. This lets us take full advantage of tree-sitter and make our editor much more efficient for large code files.

    Todo

    • [x] Apply Edits to tree-sitter
    • [x] Calculate changed ranges due to an edit
    • [x] Invalidate ranges & queue highlights after an edit
    • [x] Query tree-sitter for highlights for a range
    • [x] Restrict all highlights to visible text
    • [x] Highlight newly visible text on scroll
    • [x] ~Fix memory bug~

    Related Issues

    #27 πŸš€ Performance: Incremental Highlighting #45 #55 #21

    Checklist

    • [x] I read and understood the contributing guide as well as the code of conduct
    • [x] My changes generate no new warnings
    • [x] My code builds and runs on my machine
    • [x] I documented my code
    • [x] Review requested
    opened by thecoolwinter 5
  • 🐞 Font doesn't apply consistently

    🐞 Font doesn't apply consistently

    Description

    When using a custom font, the editor appears to only apply that font to select areas when the file has syntax highlighting.

    To Reproduce

    1. Open CodeEdit Settings > Text Editing.
    2. Change the font to anything other than the default.
    3. Open a file in CodeEdit.
    4. Notice the inconsistent font application.

    Expected behavior

    The same font should be used throughout the entire editor view, regardless of syntax highlighting.

    Version information

    CodeEdit: 1.0 Hash: (Commit) 095abfec2475ca053bb7783572e4ae9a38d514ea MacOS: 13.0 beta 4 (22A5311f) Xcode: 14.0 beta 4 (14A5284g)

    Additional context

    This is an example screenshot demoing the behavior. I've set my font to Fira Code Retina (size 13). Notice that, here, the identifier "Foundation" uses the correct font, as well as the line gutter, whereas everything else doesn't.

    image bug 
    opened by alicerunsonfedora 3
  • Add base text color to default attributes

    Add base text color to default attributes

    Description

    Adds the default text color to the default attributes applied to text in the editor. Fixes an issue where the base text color wouldn't change when changing themes.

    Issues

    Checklist

    • [x] I read and understood the contributing guide as well as the code of conduct
    • [x] My changes generate no new warnings
    • [x] My code builds and runs on my machine
    • [x] I documented my code
    • [x] Review requested
    opened by thecoolwinter 3
  • 🐞 Text changes from bold to not bold when typing

    🐞 Text changes from bold to not bold when typing

    https://user-images.githubusercontent.com/88234730/177717085-9b40d21b-b6b4-4365-a423-a3c3437905b3.mov

    When typing in a file (doesn't matter what the file extension is, so long as CodeEdit can syntax highlight it), the text changes from bold to non-bold, and/or the font size changes.

    opened by KaiTheRedNinja 3
  • Fix for non-updating text

    Fix for non-updating text

    This fixes an issue where the text Binding wouldn't update. CodeEditTextView would receive updates to input just fine, but the client wouldn't get any updates about the changes in the string.

    opened by Wouter01 2
  • Change target version of STTextView

    Change target version of STTextView

    A bug was fixed at this commit: https://github.com/krzyzanowskim/STTextView/commit/6a3ed085c26ba06fcd365c5056b31755cbddfa87 A release tag need to be created for STTextView, so it's a logic change to target the version of SPM to from:

    opened by emoonadev 2
  • [chore]: Actions - Cache Dependencies

    [chore]: Actions - Cache Dependencies

    In order to cut down the time of our CI with Github Actions, dependencies are now cached using actions/cache.

    This action plugin checks Package.resolved and when there are no changes, it downloads the cached build folder instead of fetching each dependency one-by-one.

    This saves about ~5-7 minutes per test run. Once there are changes in Package.resolved, of course, it will result in a longer test run.

    Screen Shot 2022-10-04 at 20 30 23

    opened by lukepistrol 2
  • Swift package needs updating

    Swift package needs updating

    Hello!

    The maintainer of the Swift tree-sitter parser has just merged in SPM support. I'd like to remove my personal branch, but wanted to let you know first before I do that. Unlike some other parsers, the branch with-generated-files is still required.

    https://github.com/alex-pinkus/tree-sitter-swift/tree/with-generated-files

    PRIORITY 
    opened by mattmassicotte 2
  • 🐞 Pasted text uses wrong color (black) in dark mode

    🐞 Pasted text uses wrong color (black) in dark mode

    Description

    Pasted text is black despite using dark mode.

    To Reproduce

    1. open new CodeEdit window
    2. paste some text

    Expected behavior

    Text should be white on dark background but is black.

    Version information

    CodeEdit: 1.0 (1) macOS: 13.1

    Additional context

    1

    bug duplicate 
    opened by foss- 1
  • πŸš€ Binary Frameworks for `tree-sitter` parsers

    πŸš€ Binary Frameworks for `tree-sitter` parsers

    Current Situation

    Currently all tree-sitter parsers are fetched from source every time Swift Package Manager resolves dependencies. This can easily take a couple of minutes even with a good internet connection. This also applies to the CodeEdit repo.

    Proposal

    Since Languages usually don't need to be updated very often, they could be bundled as pre-built *.xcframework binaries in an extra repository. This would also include the CodeLanguage class. By doing so the fetching occurs only from a single Swift Package which in turn hugely benefits package resolution.

    Further Information

    Once there are additional languages or updates to existing ones, it's as simple as running a script to re-build the frameworks.

    I know this sounds like a lot of overhead but I think in the long term this will pay off since waiting for packages to fetch/resolve on a daily basis definitely adds up.

    I'm curious what you guys think about this!

    question performance hacktoberfest 
    opened by lukepistrol 1
  • Support a text wrapping preference in the textview

    Support a text wrapping preference in the textview

    Background

    This addresses bug #84 , and fulfills some of the requirements of #66 (the rest of which will be implemented in CodeEdit in a nascent PR).

    Technical Details

    Two things to note:

    1. This will likely regress highlighting behavior- more detailed discussion available on this discord channel, but TLDR: @thecoolwinter has plans to obviate the need for the removed NSLayoutManager code when he migrates that work to TextKit 2.

    2. I went ahead and removed the invocation of STTextView's static scrollableTextView() helper function. It sets a number of properties which are immediately overwritten by our code in loadView(). It only obfuscates what's really happening here.

    opened by ben-p-commits 2
  • Add support for indenting wrapped lines

    Add support for indenting wrapped lines

    Is your feature request related to a problem? Please describe.

    In the enhancement requested by https://github.com/CodeEditApp/CodeEdit/issues/868, the request to add configurable indentation to wrapped lines is beyond the current capabilities of CodeEditTextView.

    image

    Describe the solution you'd like

    Add a parameter or option which allows custom indentation to be added for wrapped lines. May require enhancement + PR in STTextView

    Additional Context

    Example behavior in Xcode:

    4 spaces

    image image

    12 spaces

    image image
    opened by ben-p-commits 0
  • 🐞 Cursor remains arrow when over editor

    🐞 Cursor remains arrow when over editor

    Description

    Cursor remains an arrow when hovering over editor.

    To Reproduce

    Hover over the editor.

    Expected behavior

    When hovering over editor, cursor should change to an I-beam to indicate editable text.

    bug 
    opened by austincondiff 5
  • 🐞 Pasted text won't get formatted

    🐞 Pasted text won't get formatted

    Description

    Pasted text will just appear black and small instead of formatted.

    https://user-images.githubusercontent.com/93644977/199779964-5bd6e52f-b683-41e2-8cc1-21fbf8f27aa6.mov

    To Reproduce

    1. Open a file inside of a project
    2. Copy some unformatted text from another program
    3. Paste it

    Expected behavior

    Should just be formatted like any other text.

    Version information

    CodeEdit: 1.0 (1) macOS: 13.0 Beta (22A5311f) Xcode: 14.1 (14B47b)

    Additional context

    No response

    bug 
    opened by pabloscloud 3
  • 🐞 Text doesn't re-wrap on width change

    🐞 Text doesn't re-wrap on width change

    Description

    When changing the width of the view the text won't unwrap or wrap lines as the width changes. However, if you scroll away from the text and scroll back to it, it is laid out correctly.

    This might just require forcing a layout when the view's width changes.

    To reproduce

    • Open a file with a long line of text
    • Change the width of the screen so that the long line should either wrap more or unwrap
    • Scroll away so the text is no longer visible
    • Scroll back up to the original line (it should now be wrapped correctly according to the new width)

    Expected Behavior

    The lines should update as the view width changes, instead of needing a scroll to re-layout.

    Additional Context

    https://user-images.githubusercontent.com/35942988/198495074-e7c43f4d-48c3-4e21-8297-cf8ee66de283.mov

    Relate Issues

    • CodeEditApp/CodeEdit#868

    This issue should be worked on with the above issue.

    bug 
    opened by thecoolwinter 3
Releases(0.2.2)
  • 0.2.2(Jan 4, 2023)

    What's Changed

    • Fix for non-updating text by @Wouter01 in https://github.com/CodeEditApp/CodeEditTextView/pull/102

    New Contributors

    • @Wouter01 made their first contribution in https://github.com/CodeEditApp/CodeEditTextView/pull/102

    Full Changelog: https://github.com/CodeEditApp/CodeEditTextView/compare/0.2.1...0.2.2

    Source code(tar.gz)
    Source code(zip)
  • 0.2.1(Jan 2, 2023)

    What's Changed

    • update dependencies by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/101

    Full Changelog: https://github.com/CodeEditApp/CodeEditTextView/compare/0.2.0...0.2.1

    Source code(tar.gz)
    Source code(zip)
  • 0.2.0(Dec 9, 2022)

    What's Changed

    • Editor Overscroll by @yusufozgul in https://github.com/CodeEditApp/CodeEditTextView/pull/100

    New Contributors

    • @yusufozgul made their first contribution in https://github.com/CodeEditApp/CodeEditTextView/pull/100

    Full Changelog: https://github.com/CodeEditApp/CodeEditTextView/compare/0.1.6...0.2.0

    Source code(tar.gz)
    Source code(zip)
  • 0.1.6(Dec 2, 2022)

    What's Changed

    • update 'CodeEditLanguages' to 0.1.4 by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/98

    Full Changelog: https://github.com/CodeEditApp/CodeEditTextView/compare/0.1.5...0.1.6

    Source code(tar.gz)
    Source code(zip)
  • 0.1.5(Nov 20, 2022)

    What's Changed

    • update 'STTextView' to 0.1.2 by @denizak in https://github.com/CodeEditApp/CodeEditTextView/pull/96

    New Contributors

    • @denizak made their first contribution in https://github.com/CodeEditApp/CodeEditTextView/pull/96

    Full Changelog: https://github.com/CodeEditApp/CodeEditTextView/compare/0.1.4...0.1.5

    Source code(tar.gz)
    Source code(zip)
  • 0.1.4(Nov 13, 2022)

    What's Changed

    • Fix/docc generation by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/91
    • make build-docc.sh executable by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/92
    • remove swift-docc-plugin since it is no longer needed by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/93
    • [documentation]: add images, link to CodeEditLanguages by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/94

    Full Changelog: https://github.com/CodeEditApp/CodeEditTextView/compare/0.1.3...0.1.4

    Source code(tar.gz)
    Source code(zip)
  • 0.1.3(Nov 12, 2022)

    What's Changed

    • update 'STTextView' to 0.1.1 by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/90

    Full Changelog: https://github.com/CodeEditApp/CodeEditTextView/compare/0.1.2...0.1.3

    Source code(tar.gz)
    Source code(zip)
  • 0.1.2(Nov 5, 2022)

    What's Changed

    • update 'CodeEditLanguages' to 0.1.2 by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/89

    Full Changelog: https://github.com/CodeEditApp/CodeEditTextView/compare/0.1.1...0.1.2

    Source code(tar.gz)
    Source code(zip)
  • 0.1.1(Oct 29, 2022)

    What's Changed

    • [chore]: update CodeEditLanguages dependency by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/88

    Full Changelog: https://github.com/CodeEditApp/CodeEditTextView/compare/0.1.0...0.1.1

    Source code(tar.gz)
    Source code(zip)
  • 0.1.0(Oct 29, 2022)

    What's Changed

    • updated docs by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/1
    • [feat]: Added python language support for tree-sitter highlighting by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/2
    • [feat]: Added java language support by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/3
    • [feat]: Added CSS language support by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/4
    • [feat]: Added C and Rust language support by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/5
    • Update README.md by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/6
    • [feat]: Added JavaScript and PHP language support by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/8
    • Add Supported Languages by @Angelk90 in https://github.com/CodeEditApp/CodeEditTextView/pull/7
    • [feat]: Added C++ and C# language support by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/9
    • bump to official repo for C, Java, JavaScript, PHP & Rust by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/10
    • bumped C# to official repo; tests added by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/11
    • bump to official repo for C++ & Go by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/12
    • [feat]: Added JSX language support by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/13
    • [feat]: Added Bash language support by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/14
    • Add Docs for adding more languages by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/17
    • added link to Add-Languages inside CodeLangauge docs by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/18
    • reverted to STTextView version prior Swift 5.7 by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/26
    • README icon and cover image by @austincondiff in https://github.com/CodeEditApp/CodeEditTextView/pull/35
    • Update dependencies by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/49
    • Add base text color to default attributes by @thecoolwinter in https://github.com/CodeEditApp/CodeEditTextView/pull/48
    • Updated tree-sitter-swift to official repo by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/52
    • chore: added CaptureNames enum, added tests by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/53
    • Add support for Zig by @Prince213 in https://github.com/CodeEditApp/CodeEditTextView/pull/68
    • Use official repository for tree-sitter-zig by @Prince213 in https://github.com/CodeEditApp/CodeEditTextView/pull/69
    • Incremental Highlighting by @thecoolwinter in https://github.com/CodeEditApp/CodeEditTextView/pull/59
    • Improved Line Number Appearance by @austincondiff in https://github.com/CodeEditApp/CodeEditTextView/pull/71
    • [Feat]: Add language support for Haskell by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/74
    • [Feat]: Add language support for Elixir / Update docs for Zig by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/73
    • [chore]: Actions - Cache Dependencies by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/75
    • [Chore]: update dependencies to latest version by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/82
    • update dependencies to official repo by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/85
    • Add ability to set cursor position by @ezraberch in https://github.com/CodeEditApp/CodeEditTextView/pull/83
    • [chore]: Refactor to use binary framework for tree-sitter language grammars by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/86
    • use fixed version of 'CodeEditLanguages' by @lukepistrol in https://github.com/CodeEditApp/CodeEditTextView/pull/87

    New Contributors

    • @lukepistrol made their first contribution in https://github.com/CodeEditApp/CodeEditTextView/pull/1
    • @Angelk90 made their first contribution in https://github.com/CodeEditApp/CodeEditTextView/pull/7
    • @austincondiff made their first contribution in https://github.com/CodeEditApp/CodeEditTextView/pull/35
    • @thecoolwinter made their first contribution in https://github.com/CodeEditApp/CodeEditTextView/pull/48
    • @Prince213 made their first contribution in https://github.com/CodeEditApp/CodeEditTextView/pull/68
    • @ezraberch made their first contribution in https://github.com/CodeEditApp/CodeEditTextView/pull/83

    Full Changelog: https://github.com/CodeEditApp/CodeEditTextView/commits/0.1.0

    Source code(tar.gz)
    Source code(zip)
Owner
CodeEdit
CodeEdit App for macOS – Elevate your code editing experience. Open source, free forever.
CodeEdit
Synx - A command-line tool that reorganizes your Xcode project folder to match your Xcode groups

A command-line tool that reorganizes your Xcode project folder to match your Xcode groups. Xcode Finder Installation $ gem install synx Usage Basic ⚠

Venmo 6.1k Jan 2, 2023
Swift package to interact with Xcode Code Snippets in a type-safe manner

XCSnippets Swift package to provide type-safe interaction with (user-defined) Xcode Code Snippets Overview import XCSnippets let directory = Persiste

Marco Eidinger 4 Oct 11, 2022
Swift package to interact with Xcode Code Snippets in a type-safe manner

XCSnippets Swift package to provide type-safe interaction with (user-defined) Xcode Code Snippets Overview import XCSnippets let directory = Persiste

Marco Eidinger 3 Jun 24, 2022
XcodeCodeSnippets - Code snippets for Xcode.

XcodeCodeSnippets A set of snippets for Xcode. Requirements Xcode 7.3.1 or later. Installation To install or update the snippets you need: Quit Xcode

Ivan Smetanin 33 Oct 14, 2022
Swift-VIPER-Module - Xcode template for VIPER Architecture written in Swift 4

⚠️ Deprecated ⚠️ This library is deprecated. When you decide to use VIPER architecture in your project, it is very tired create new modules, because y

Juanpe CatalΓ‘n 533 Nov 17, 2022
ViperC - Xcode template for VIPER Architecture for both Objective-C and Swift.

ViperC Xcode template for VIPER Architecture for both Objective-C and Swift. ViperC creates modules for you when you want to use VIPER architecture in

Abdullah Selek 79 Nov 2, 2022
VIPERModuleTemplate - Template of VIPER Module for Xcode

Once you've decided to use a VIPER architecture in your app, you should know about the routine. For each screen/module you should create at least 6 fi

Bogdan Evsenev 17 Dec 10, 2021
Xcode-developer-disk-image-all-platforms - A repo which shares all developer disk images for iOS, tvOS, watchOS

Disclaimer: The available resources and files from this repo are uploaded from many contributors. The files are unverified, untested, and could have n

Hai K 253 Dec 21, 2022
Awesome-gitignore-templates - A curated collection of useful gitignore templates for different programming languages while pushing your code to git. 😊 πŸ“

Awesome Gitignore Templates A curated collection of useful gitignore templates for different programming languages while pushing your code to git. ??

Aashish Tamsya 19 Jun 11, 2022
Swift-project-template - πŸͺ Easily generate Swift projects with Cookiecutter

swift-project-template ?? Cookiecutter template for Swift iOS projects. Features: Xcode 11 and Swift 5.0 support AppCode support Custom project struct

Artem Novichkov 86 Jul 8, 2022
Awesome-swift-platforms - A curated list of Swift on different platforms

Embedded Swift A curated list of Swift on different platforms. Nintendo Switch S

Devran Cosmo Uenal 4 Feb 6, 2022
Swift wrappers for the tree-sitter incremental parsing system

SwiftTreeSitter Swift wrappers for the tree-sitter incremental parsing system. Remember that tree-sitter has both runtime and per-language dependencie

Chime 153 Dec 8, 2022
A Collection of Tree-Sitter Parsers for Syntax Highlighting

CodeEditLanguages A collection of tree-sitter languages for syntax highlighting. Overview This package includes a binary framework CodeLanguagesContai

CodeEdit 16 Dec 30, 2022
Profile-Tree - Profile in Tree structure developed in UIKit

Profile-Tree Profile in Tree structure developed in UIKit Screenshot Video Profi

null 1 Oct 7, 2022
CodeEdit App for macOS – Elevate your code editing experience. Open source, free forever.

CodeEdit for macOS CodeEdit is a code editor built by the community, for the community, written entirely and unapologetically for macOS. Features incl

CodeEdit 15.8k Dec 31, 2022
A fully fledged syscfg editor. Just the editor. Written in pure swift.

MagicCFG Reloaded The SysCFG Writing Utility - UPDATED, OSV Report Bug Table of Contents About MagicCFG Reloaded Getting Started Roadmap Contact Credi

Jan Fabel 47 Dec 31, 2022
🐝 Draw Xcode targets and dependencies tree

?? Bee Draw Xcode targets and dependencies tree.

Vyacheslav Khorkov 20 Dec 19, 2022
React-native-photo-editor - Photo editor using native modules for iOS and Android

?? Image editor using native modules for iOS and Android. Inherit from 2 available libraries, ZLImageEditor (iOS) and PhotoEditor (Android)

Baron Ha. 244 Jan 5, 2023
XTextHandler - Xcode Source Editor Extension Tools (Xcode 8 Plugins)

Download Let's Swift! xTextHandler has been rewritten in Swift. The Objective-C version can be found in: https://github.com/cyanzhong/xTextHandler-obj

Ying Zhong (Inactive) 1.5k Sep 7, 2022
List tree data souce to display hierachical data structures in lists-like way. It's UI agnostic, just like view-model and doesn't depend on UI framework

SwiftListTreeDataSource List tree data souce to display hierachical data structures in lists-like way. It's UI agnostic, just like view-model, so can

Dzmitry Antonenka 26 Nov 26, 2022