UNPKG

vscode-todo-plus

Version:

Manage todo lists with ease. Powerful, easy to use and customizable.

119 lines (69 loc) 2.52 kB
/* IMPORT */ import * as _ from 'lodash'; import * as vscode from 'vscode'; import Utils from '../utils'; import File from './items/file'; import Item from './items/item'; import Group from './items/group'; import Placeholder from './items/placeholder'; import Todo from './items/todo'; import View from './view'; /* FILES */ //TODO: Collapse/Expand without rebuilding the tree https://github.com/Microsoft/vscode/issues/54192 class Files extends View { id = 'todo.views.1files'; clear = false; expanded = false; filePathRe = /^(?!~).*(?:\\|\/)/; getTreeItem ( item: Item ): vscode.TreeItem { if ( item.collapsibleState !== vscode.TreeItemCollapsibleState.None ) { item.collapsibleState = this.expanded ? vscode.TreeItemCollapsibleState.Expanded : vscode.TreeItemCollapsibleState.Collapsed; } return item; } async getChildren ( item?: Item ): Promise<Item[]> { if ( this.clear ) { setTimeout ( this.refresh.bind ( this ), 0 ); return []; } let obj = item ? item.obj : await Utils.files.get (); while ( obj && '' in obj ) obj = obj['']; // Collapsing unnecessary groups if ( _.isEmpty ( obj ) ) return [new Placeholder ( 'No todo files found' )]; if ( obj.textEditor ) { const items = [], lineNr = obj.hasOwnProperty ( 'lineNr' ) ? obj.lineNr : -1; Utils.ast.walkChildren ( obj.textEditor, lineNr, data => { data.textEditor = obj.textEditor; data.filePath = obj.filePath; data.lineNr = data.line.lineNumber; let isGroup = false; Utils.ast.walkChildren ( obj.textEditor, data.line.lineNumber, () => { isGroup = true; return false; }); const label = _.trimStart ( data.line.text ), item = isGroup ? new Group ( data, label ) : new Todo ( data, label ); items.push ( item ); }); if ( !items.length ) return [new Placeholder ( 'The file is empty' )]; return items; } else { const keys = Object.keys ( obj ).sort (); return keys.map ( key => { const val = obj[key]; if ( this.filePathRe.test ( key ) ) { const uri = Utils.view.getURI ( val ); return new File ( val, uri ); } else { return new Group ( val, key, this.config.embedded.view.icons ); } }); } } refresh ( clear? ) { this.clear = !!clear; super.refresh (); } } /* EXPORT */ export default new Files ();