extends Node2D var data var gui_program var tui_program var other var packages = [] var installed_packages = [] var packages_to_delete = [] var output = [] var root_tree func get_installed_packages(): var buffer = [] installed_packages = [] # warning-ignore:return_value_discarded OS.execute("pkg_info", [], true, buffer, true) for p in buffer[0].split("\n"): installed_packages.append(p.split(" ")[0]) func _ready(): get_installed_packages() var file = File.new() file.open("pkg.json", File.READ) var content_as_text = file.get_as_text() data = parse_json(content_as_text) $Panel/LineEdit.grab_focus() # click on APPLY CHANGES func _on_Button_pressed(): $Panel/Panel/RichTextLabel.text = "" if packages.size() > 0: $Panel/Panel/RichTextLabel.text = "You are going to install these packages:\n" for l in packages: $Panel/Panel/RichTextLabel.text += "- " + l + "\n" if packages_to_delete.size() > 0: $Panel/Panel/RichTextLabel.text += "You are going to remove these packages:\n" for l in packages_to_delete: $Panel/Panel/RichTextLabel.text += "- " + l + "\n" $Panel/Panel/RichTextLabel.text += "\n\nClick on Accept to apply changes" $Panel/Panel/Accept.visible = true $Panel/Panel/Cancel.visible = true $Panel/Panel.visible = true func _on_Tree_multi_selected(): var item = $Panel/Tree.get_selected() if item.get_parent() == root_tree: return(0) var status = item.get_metadata(0) if status == "for_install": # we don't want to install it item.set_metadata(0, null) item.clear_custom_bg_color(0) packages.erase(item.get_text(0)) elif not status: # we install it packages.append(item.get_text(0)) item.set_custom_bg_color(0, Color(0.5,1,0.5,1)) item.set_metadata(0, "for_install") elif status == "installed": # we delete it packages_to_delete.append(item.get_text(0)) item.set_custom_bg_color(0, Color(0.9,0.2,0.2,0.6)) item.set_metadata(0, "to_delete") elif status == "to_delete": # we keep it packages_to_delete.erase(item.get_text(0)) item.set_custom_bg_color(0, Color(0.7, 0.7,0.2,0.5)) item.set_metadata(0, "installed") func _on_LineEdit_text_entered(text): $Panel/Tree.clear() root_tree = $Panel/Tree.create_item() $Panel/Tree.set_hide_root(true) gui_program = $Panel/Tree.create_item() gui_program.set_text(0, "Graphical programs") gui_program.collapsed = false tui_program = $Panel/Tree.create_item($Panel/Tree) tui_program.set_text(0, "Terminal/console programs") tui_program.collapsed = false other = $Panel/Tree.create_item($Panel/Tree) other.set_text(0, "Other programs") other.collapsed = false for d in data.size(): var s = data[d] var root var found = false if text == "" or not text: found = true elif text.to_upper() in s["pkgname"].to_upper(): found = true elif s["comment"] and text.to_upper() in s["comment"].to_upper(): found = true elif $Panel/Search_Descr.pressed == true and s["descr"] and text.to_upper() in s["descr"].to_upper(): found = true if found == false: continue if str(s["gui"]) == "True": root = $Panel/Tree.create_item(gui_program) elif str(s["tui"]) == "True": root = $Panel/Tree.create_item(tui_program) else: root = $Panel/Tree.create_item(other) root.set_text(0, s["pkgname"]) if s["comment"]: root.set_text(1, s["comment"]) root.set_text(1, s["descr"]) if s["pkgname"] in installed_packages: root.set_metadata(0, "installed") root.set_custom_bg_color(0, Color(0.7, 0.7,0.2,0.5)) func _on_Hide_pressed(): $Panel/Panel.visible = false $Panel/Panel/Hide.visible = false $Panel/Panel/Accept.visible = false packages = [] packages_to_delete = [] print("Regenerating display") get_installed_packages() _on_LineEdit_text_entered($Panel/LineEdit.text) func _on_Accept_pressed(): $Panel/Panel/Accept.visible = false $Panel/Panel/Hide.visible = true $Panel/Panel/Cancel.visible = false $Panel/Panel/RichTextLabel.text = "" if packages_to_delete.size() > 0: if $Panel/doas_nopass.pressed: OS.execute("doas", ["pkg_delete", "-Ivx"] + packages_to_delete, true, output, true) else: OS.execute("xterm", ["-e", "doas", "pkg_delete", "-Ivx"] + packages_to_delete, true, output, true) for l in output: $Panel/Panel/RichTextLabel.text += l if packages.size() > 0: if $Panel/doas_nopass.pressed: print(OS.execute("doas", ["pkg_add", "-Ivx"] + packages, true, output, true)) else: print(OS.execute("xterm", ["-e", "doas", "pkg_add", "-Ivx"] + packages, true, output, true)) for l in output: $Panel/Panel/RichTextLabel.text += l if not $Panel/doas_nopass.pressed: _on_Hide_pressed() func _on_Cancel_pressed(): $Panel/Panel.visible = false $Panel/Panel/Cancel.visible = false