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 }