@@ -44,6 +44,16 @@ Item {
4444 ? resolvedAnimDir .replace (/ \/ + $ / , " " ).split (" /" ).pop ()
4545 : " animations"
4646
47+ // Relative path from the target file's directory to the animations folder
48+ // e.g. target=~/.config/niri/modules/animations.kdl, animDir=~/.config/niri/animations
49+ // → relativePath = "../animations"
50+ readonly property string relativePath: {
51+ if (resolvedAnimDir === " " || resolvedTargetFile === " " ) return folderName
52+ var targetDir = resolvedTargetFile .split (" /" ).slice (0 , - 1 ).join (" /" )
53+ // Will be computed properly via python in applyFile, this is just for display
54+ return resolvedAnimDir
55+ }
56+
4757 // ── Processes ─────────────────────────────────────────────────────────────
4858
4959 Process {
5767 ` ls "${ root .resolvedAnimDir } "/*.kdl 2>/dev/null | xargs -n1 basename 2>/dev/null | grep -v "^${ targetBasename} $"` ]
5868 listFiles .running = true
5969
70+ // Read current include match any path ending with folder name and kdl
6071 readCurrentInclude .command = [" bash" , " -c" ,
61- ` grep -oP '${ root .folderName } /[^"/ ]+\\ .kdl' "${ root .resolvedTargetFile } " 2>/dev/null | head -1 | xargs -I{} basename {} 2>/dev/null || true` ]
72+ ` grep -oP 'include " \\ K[^"]+/ ${ root .folderName } /[^"]+\\ .kdl(?=") ' "${ root .resolvedTargetFile } " 2>/dev/null | head -1 | xargs -I{} basename {} 2>/dev/null || true` ]
6273 readCurrentInclude .running = true
6374 }
6475 }
@@ -112,12 +123,32 @@ Item {
112123 root .writing = true
113124 root .statusMessage = " "
114125
115- var folder = root .folderName
126+ var animDir = root .resolvedAnimDir
116127 var target = root .resolvedTargetFile
128+ var folder = root .folderName
117129
118130 writeInclude .command = [
119- " bash" , " -c" ,
120- ` sed -i '/^include "\\ .\\ /` + folder + ` \\ /.*\\ .kdl"$/d' '` + target + ` ' && sed -i -e '$a\\ ' '` + target + ` ' && printf 'include "./${ folder} /${ filename} "\\ n' >> '` + target + ` '`
131+ " python3" , " -c" ,
132+ " import sys, os, re\n " +
133+ " anim_dir = sys.argv[1]\n " +
134+ " target = sys.argv[2]\n " +
135+ " filename = sys.argv[3]\n " +
136+ " folder = sys.argv[4]\n " +
137+ " target_dir = os.path.dirname(os.path.abspath(target))\n " +
138+ " rel = os.path.relpath(anim_dir, target_dir)\n " +
139+ " include_line = f'include \" ./{rel}/{filename}\" '\n " +
140+ " try:\n " +
141+ " f = open(target); lines = f.readlines(); f.close()\n " +
142+ " except FileNotFoundError:\n " +
143+ " lines = []\n " +
144+ // Remove lines that match any relative path ending in folder name + kdl
145+ " pat = re.compile(r'^include \" [^\" ]*/' + folder + r'/[^\" ]+\\ .kdl\"\\ s*$')\n " +
146+ " lines = [l for l in lines if not pat.match(l.strip())]\n " +
147+ " if lines and not lines[-1].endswith('\\ n'):\n " +
148+ " lines[-1] += '\\ n'\n " +
149+ " lines.append(include_line + '\\ n')\n " +
150+ " f = open(target, 'w'); f.writelines(lines); f.close()" ,
151+ animDir, target, filename, folder
121152 ]
122153 writeInclude .running = true
123154 }
0 commit comments