AppManager/src/Node2D.gd

164 lines
4.8 KiB
GDScript

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)