1 module dinu.command.file; 2 3 4 import dinu; 5 6 7 string chompAll(string source, string what){ 8 while(source.chomp(what) != source) 9 source = source.chomp(what); 10 return source; 11 } 12 13 14 shared immutable class CommandFile: Command { 15 16 bool home; 17 string[] parts; 18 19 private this(){ 20 super(Type.file, ""); 21 parts = []; 22 home = false; 23 } 24 25 this(string name){ 26 this(Type.file, name); 27 } 28 29 this(Type type, string name, bool isDir=false){ 30 super(type, name.unixEscape, options.colorFile); 31 if(isDir) 32 parts = (name.chompPrefix(getcwd ~ "/") ~ "/").split('/'); 33 else 34 parts = name.chompPrefix(getcwd ~ "/").split('/'); 35 home = ( 36 name.chompPrefix("~".expandTilde) != name 37 || !name.startsWith("/") && getcwd == "~".expandTilde 38 ); 39 } 40 41 override string text(){ 42 return parts.join("/"); 43 } 44 45 override string prepFilter(string filter){ 46 if(!filter.length) 47 return ""; 48 auto slashes = filter.length - filter.chompAll("/").length; 49 if(filter.startsWith("..")) 50 return filter.expandTilde.absolutePath.buildNormalizedPath ~ "/".replicate(slashes); 51 else 52 return filter.expandTilde.buildNormalizedPath ~ "/".replicate(slashes); 53 } 54 55 override size_t score(){ 56 return 10; 57 } 58 59 override int draw(DrawEmpty draw, int[2] pos, bool selected, immutable(int)[] positions){ 60 foreach(hit; positions){ 61 auto p = hit - (filterText.length - text.length); 62 if(p < text.length){ 63 auto s = draw.width(text[0..p]); 64 draw.setColor([0.333, 0.333, 0.333]); 65 draw.rect([pos.x+s, pos.y-3], [draw.width(text[0..p+1])-s, 1.em]); 66 //draw.rect([pos.x+s, pos.y+1.em], [draw.width(text[0..p+1])-s, 1], "#999999"); 67 } 68 } 69 70 int advance = 0; 71 foreach(i, part; parts){ 72 if(i+1 < parts.length){ 73 draw.setColor(options.colorDir); 74 advance += draw.text([pos.x+advance, pos.y], part, 0); 75 draw.setColor(options.colorOutput); 76 advance += draw.text([pos.x+advance, pos.y], "/", 0); 77 }else{ 78 draw.setColor(options.colorFile); 79 advance += draw.text([pos.x+advance, pos.y], part, 0); 80 } 81 } 82 return advance; 83 } 84 85 override void run(string){ 86 options.configPath.openFile(name); 87 } 88 89 }