{
   "name" : "SCD/TXT File Merger GUI (select or drag a folder)",
   "author" : "prko",
   "ancestor_list" : [],
   "description" : "",
   "labels" : [],
   "code" : "(\r\nvar mergeFiles, window, selectButton, dragArea, displayText, extField, extFieldInitialString, mergeButton, selectedFolder;\r\n\r\nmergeFiles = { |currentDir, extension|\r\n\tvar outputFileName, sourceFiles;\r\n\t\r\n\tif (currentDir.isNil or: { extension.isNil or: { extension.isEmpty } }) {\r\n\t\t\"Error: No folder or extension provided.\".warn;\r\n\t} {\r\n\t\toutputFileName = \"_merged_.\" ++ extension;\r\n\t\t\r\n\t\tsourceFiles = (currentDir +/+ \"*.\" ++ extension).pathMatch.select { |path|\r\n\t\t\tpath.basename != outputFileName\r\n\t\t}.sort;\r\n\t\t\r\n\t\tif (sourceFiles.isEmpty) {\r\n\t\t\t(\"No .\" ++ extension ++ \" files found in: \" ++ currentDir).postln;\r\n\t\t} {\r\n\t\t\t(\"Number of .\" ++ extension ++ \" files found: \" ++ sourceFiles.size).postln;\r\n\t\t\t\r\n\t\t\tFile.use(currentDir +/+ outputFileName, \"w\", { |outFile|\r\n\t\t\t\tsourceFiles.do { |path|\r\n\t\t\t\t\tvar fileName = path.basename;\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\toutFile.write(\"\\n/* \" ++ fileName ++ \" */\\n\\n\" ++ File.readAllString(path) ++ \"\\n\\n\");\r\n\t\t\t\t\t\t(\"Appended: \" ++ fileName).postln;\r\n\t\t\t\t\t} {\r\n\t\t\t\t\t\t(\"Warning: Could not read \" ++ fileName).warn;\r\n\t\t\t\t\t};\r\n\t\t\t\t};\r\n\t\t\t\t(\"Success! All files merged into: \" ++ outputFileName).postln;\r\n\t\t\t});\r\n\t\t};\r\n\t};\r\n};\r\n\r\nwindow = Window(\"File Merger\",\r\n\tRect.aboutPoint(Window.screenBounds.center, 200, 50)).front;\r\n\r\n// 1a. Select a folder\r\nselectButton = Button()\r\n.states_([[\"1a. Select a folder\"]])\r\n.action_ {\r\n\tFileDialog({ |path|\r\n\t\tselectedFolder = path[0];\r\n\t\tdisplayText.string = \"Selected Folder: \" ++ selectedFolder;\r\n\t}, fileMode: 2);\r\n};\r\n\r\n// 1b. Drag a folder\r\ndragArea = DragSink()\r\n.string_(\"1b. Drag a folder\")\r\n.align_(\\center)\r\n.background_(Color.gray(0.8))\r\n.receiveDragHandler_ {\r\n\tvar path = View.currentDrag;\r\n\tif (path.isKindOf(String)\r\n\t\tand: { File.exists(path) }\r\n\t\tand: { File.type(path) == \\directory }\r\n\t) {\r\n\t\tselectedFolder = path;\r\n\t\tdisplayText.string = \"Selected Folder: \" ++ selectedFolder;\r\n\t} {\r\n\t\t\"Invalid folder dragged.\".warn;\r\n\t};\r\n};\r\n\r\n// Middle: display selected folder\r\ndisplayText = StaticText().align_(\\center).string_(\"Selected Folder: None\");\r\n\r\n// 2. Extension input\r\nextFieldInitialString = \"2. File Extension (txt or scd) to Merge\";\r\nextField = TextField()\r\n.string_(extFieldInitialString)\r\n.stringColor_(Color.gray)\r\n.focusGainedAction_ {\r\n\tif (extField.string == extFieldInitialString) {\r\n\t\textField.string_(\"\").stringColor_(Color.black);\r\n\t};\r\n}\r\n.focusLostAction_ {\r\n\tif (extField.string.trim.isEmpty) {\r\n\t\textField.string_(extFieldInitialString).stringColor_(Color.gray);\r\n\t};\r\n};\r\n\r\n// 3. Merge\r\nmergeButton = Button()\r\n.states_([[\"3. Merge\"]])\r\n.action_ {\r\n\tvar extension = extField.string.trim;\r\n\tif (extension == extFieldInitialString) { extension = \"\" };\r\n\tmergeFiles.(selectedFolder, extension);\r\n};\r\n\r\nwindow.layout = VLayout(\r\n\tHLayout(selectButton, dragArea),\r\n\tdisplayText,\r\n\tHLayout(extField, mergeButton)\r\n);\r\n\r\nwindow.onClose = { \"Window closed.\".postln };\r\n)",
   "id" : "1-5iL",
   "is_private" : null
}
