extends Control var data var gui_program var tui_program var other var packages = [] var installed_packages = [] var packages_to_delete = [] var output = [] var root_tree onready var Tree = $Panel/Tree onready var ConsoleDisplay = $ConsolePanel/RichTextLabel var color_delete = Color(0.9,0.2,0.2,0.6) var color_installed = Color(0.7, 0.7,0.2,0.5) var color_toinstall = Color(0.5,1,0.5,1) func get_installed_packages(): var buffer = [] installed_packages = [] # warning-ignore:return_value_discarded OS.execute("pkg_info", [], true, buffer, true) if buffer: for p in buffer[0].split("\n"): installed_packages.append(p.split(" ")[0]) func _ready(): get_installed_packages() # the last parameter is a path to the packages database var db_path = OS.get_cmdline_args()[-1] var file = File.new() file.open(db_path, 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(): ConsoleDisplay.text = "" if packages.size() > 0: ConsoleDisplay.text = "You are going to install these packages:\n" for l in packages: ConsoleDisplay.text += "- " + l + "\n" if packages_to_delete.size() > 0: ConsoleDisplay.text += "You are going to remove these packages:\n" for l in packages_to_delete: ConsoleDisplay.text += "- " + l + "\n" if packages_to_delete.size() > 0 or packages.size() > 0: ConsoleDisplay.text += "\n\nClick on Accept to apply changes" $ConsolePanel/Accept.visible = true else: ConsoleDisplay.text = "No change to make" $ConsolePanel/Accept.visible = false $ConsolePanel/Cancel.visible = true $ConsolePanel.visible = true func _on_Tree_multi_selected(): var item = 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_toinstall) 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_delete) 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_installed) item.set_metadata(0, "installed") func _on_LineEdit_text_entered(text): Tree.clear() root_tree = Tree.create_item() Tree.set_hide_root(true) gui_program = Tree.create_item() gui_program.set_text(0, "Graphical programs") gui_program.collapsed = false tui_program = Tree.create_item(Tree) tui_program.set_text(0, "Terminal/console programs") tui_program.collapsed = false other = Tree.create_item(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 = Tree.create_item(gui_program) elif str(s["tui"]) == "True": root = Tree.create_item(tui_program) else: root = 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 packages_to_delete: root.set_metadata(0, "to_delete") root.set_custom_bg_color(0, color_delete) elif s["pkgname"] in installed_packages: root.set_metadata(0, "installed") root.set_custom_bg_color(0, color_installed) elif s["pkgname"] in packages: root.set_metadata(0, "for_install") root.set_custom_bg_color(0, color_toinstall) func reset_display(): $ConsolePanel.hide() $ConsolePanel/Accept.hide() packages = [] packages_to_delete = [] get_installed_packages() _on_LineEdit_text_entered($Panel/LineEdit.text) func _on_Accept_pressed(): $ConsolePanel/Accept.visible = false $ConsolePanel/Cancel.visible = false ConsoleDisplay.text = "" if packages_to_delete.size() > 0: OS.execute("xterm", ["-e", "doas", "pkg_delete", "-Ivx"] + packages_to_delete, true, output, true) if packages.size() > 0: OS.execute("xterm", ["-e", "doas", "pkg_add", "-Ivx"] + packages, true, output, true) reset_display() func _on_Cancel_pressed(): $ConsolePanel.visible = false $ConsolePanel/Cancel.visible = false func _on_Control_resized(): if Tree: Tree.rect_size = self.rect_size func _on_Search_Descr_pressed(): if root_tree: _on_LineEdit_text_entered($Panel/LineEdit.text)