From 77e37d6de0143eddf4eef7c469f1369ec741f691 Mon Sep 17 00:00:00 2001
From: D3V1L0N <167227445+D3V1L0N@users.noreply.github.com>
Date: Wed, 24 Apr 2024 05:09:00 +0530
Subject: [PATCH] [add] progress dialog
---
blackbox/ui/ProgressDialog.py | 400 ++++++++++++++++++++++++++++++++++
1 file changed, 400 insertions(+)
create mode 100644 blackbox/ui/ProgressDialog.py
diff --git a/blackbox/ui/ProgressDialog.py b/blackbox/ui/ProgressDialog.py
new file mode 100644
index 0000000..73d42bf
--- /dev/null
+++ b/blackbox/ui/ProgressDialog.py
@@ -0,0 +1,400 @@
+# This class is used to create a modal dialog window showing progress of a package install/uninstall and general package information
+
+import os
+import gi
+import Functions as fn
+from ui.MessageDialog import MessageDialog
+from gi.repository import Gtk, Gdk, GdkPixbuf, Pango, GLib
+
+gi.require_version("Gtk", "3.0")
+
+base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
+# base_dir = os.path.dirname(os.path.realpath(__file__))
+
+
+class ProgressDialog(Gtk.Dialog):
+ def __init__(self, action, package, command, package_metadata):
+ Gtk.Dialog.__init__(self)
+
+ self.package_found = True
+ # this gets package information using pacman -Si or pacman -Qi whichever returns output
+ # package_metadata = fn.get_package_information(pkg.name)
+
+ # if a mirrorlist isn't configured properly, pacman will not be able to query its repository
+ # so the following is a condition to make sure the data returned isn't an error
+
+ if type(package_metadata) is dict:
+ package_progress_dialog_headerbar = Gtk.HeaderBar()
+ package_progress_dialog_headerbar.set_show_close_button(True)
+ self.set_titlebar(package_progress_dialog_headerbar)
+
+ self.connect("delete-event", package_progress_dialog_on_close, self, action)
+
+ if action == "install":
+ self.set_title("BlackBox - installing package %s" % package.name)
+
+ elif action == "uninstall":
+ self.set_title("BlackBox - removing package %s" % package.name)
+
+ self.btn_package_progress_close = Gtk.Button(label="OK")
+ self.btn_package_progress_close.connect(
+ "clicked",
+ on_package_progress_close_response,
+ self,
+ )
+ self.btn_package_progress_close.set_sensitive(False)
+ self.btn_package_progress_close.set_size_request(100, 30)
+ self.btn_package_progress_close.set_halign(Gtk.Align.END)
+
+ self.set_resizable(True)
+ self.set_size_request(850, 700)
+ self.set_modal(True)
+ self.set_border_width(10)
+ self.set_position(Gtk.WindowPosition.CENTER_ON_PARENT)
+ self.set_icon_from_file(os.path.join(base_dir, "images/blackbox.png"))
+
+ lbl_pacman_action_title = Gtk.Label(xalign=0, yalign=0)
+ lbl_pacman_action_title.set_text("Running command:")
+
+ lbl_pacman_action_value = Gtk.Label(xalign=0, yalign=0)
+ lbl_pacman_action_value.set_markup("%s" % command)
+
+ stack = Gtk.Stack()
+ stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
+ stack.set_transition_duration(350)
+ stack.set_hhomogeneous(False)
+ stack.set_vhomogeneous(False)
+
+ stack_switcher = Gtk.StackSwitcher()
+ stack_switcher.set_orientation(Gtk.Orientation.HORIZONTAL)
+ stack_switcher.set_stack(stack)
+ stack_switcher.set_homogeneous(True)
+
+ package_progress_grid = Gtk.Grid()
+
+ self.infobar = Gtk.InfoBar()
+ self.infobar.set_name("infobar_info")
+
+ content = self.infobar.get_content_area()
+ content.add(lbl_pacman_action_title)
+ content.add(lbl_pacman_action_value)
+
+ self.infobar.set_revealed(True)
+
+ lbl_padding_header1 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding_header1.set_text("")
+
+ package_progress_grid.attach(lbl_padding_header1, 0, 1, 1, 1)
+ package_progress_grid.attach(self.infobar, 0, 2, 1, 1)
+
+ package_progress_grid.set_property("can-focus", True)
+ Gtk.Window.grab_focus(package_progress_grid)
+
+ lbl_padding1 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding1.set_text("")
+
+ lbl_padding2 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding2.set_text("")
+ lbl_padding2.set_halign(Gtk.Align.END)
+
+ package_progress_grid.attach(lbl_padding1, 0, 3, 1, 1)
+
+ package_progress_scrolled_window = Gtk.ScrolledWindow()
+ self.package_progress_textview = Gtk.TextView()
+ self.package_progress_textview.set_property("editable", False)
+ self.package_progress_textview.set_property("monospace", True)
+ self.package_progress_textview.set_border_width(10)
+ self.package_progress_textview.set_vexpand(True)
+ self.package_progress_textview.set_hexpand(True)
+ buffer = self.package_progress_textview.get_buffer()
+ self.package_progress_textview.set_buffer(buffer)
+
+ package_progress_scrolled_window.set_size_request(700, 430)
+
+ package_progress_scrolled_window.add(self.package_progress_textview)
+ package_progress_grid.attach(package_progress_scrolled_window, 0, 4, 1, 1)
+
+ vbox_close = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+
+ vbox_close.pack_start(lbl_padding2, True, True, 0)
+ vbox_close.pack_start(self.btn_package_progress_close, True, True, 0)
+
+ stack.add_titled(package_progress_grid, "Progress", "Package Progress")
+
+ # package information
+ box_outer = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)
+
+ listbox = Gtk.ListBox()
+ listbox.set_selection_mode(Gtk.SelectionMode.NONE)
+ box_outer.pack_start(listbox, True, True, 0)
+
+ # package name
+ row_package_title = Gtk.ListBoxRow()
+ vbox_package_title = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_title.add(vbox_package_title)
+ lbl_package_name_title = Gtk.Label(xalign=0)
+ lbl_package_name_title.set_markup("Package Name")
+
+ lbl_package_name_value = Gtk.Label(xalign=0)
+ lbl_package_name_value.set_text(package_metadata["name"])
+ vbox_package_title.pack_start(lbl_package_name_title, True, True, 0)
+ vbox_package_title.pack_start(lbl_package_name_value, True, True, 0)
+
+ listbox.add(row_package_title)
+
+ # repository
+
+ row_package_repo = Gtk.ListBoxRow()
+ vbox_package_repo = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+ row_package_repo.add(vbox_package_repo)
+ lbl_package_repo_title = Gtk.Label(xalign=0)
+ lbl_package_repo_title.set_markup("Repository")
+
+ lbl_package_repo_value = Gtk.Label(xalign=0)
+ lbl_package_repo_value.set_text(package_metadata["repository"])
+ vbox_package_repo.pack_start(lbl_package_repo_title, True, True, 0)
+ vbox_package_repo.pack_start(lbl_package_repo_value, True, True, 0)
+
+ listbox.add(row_package_repo)
+
+ # description
+
+ row_package_description = Gtk.ListBoxRow()
+ vbox_package_description = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_description.add(vbox_package_description)
+ lbl_package_description_title = Gtk.Label(xalign=0)
+ lbl_package_description_title.set_markup("Description")
+
+ lbl_package_description_value = Gtk.Label(xalign=0)
+ lbl_package_description_value.set_text(package_metadata["description"])
+ vbox_package_description.pack_start(
+ lbl_package_description_title, True, True, 0
+ )
+ vbox_package_description.pack_start(
+ lbl_package_description_value, True, True, 0
+ )
+
+ listbox.add(row_package_description)
+
+ # arch
+
+ row_package_arch = Gtk.ListBoxRow()
+ vbox_package_arch = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+ row_package_arch.add(vbox_package_arch)
+ lbl_package_arch_title = Gtk.Label(xalign=0)
+ lbl_package_arch_title.set_markup("Architecture")
+
+ lbl_package_arch_value = Gtk.Label(xalign=0)
+ lbl_package_arch_value.set_text(package_metadata["arch"])
+ vbox_package_arch.pack_start(lbl_package_arch_title, True, True, 0)
+ vbox_package_arch.pack_start(lbl_package_arch_value, True, True, 0)
+
+ listbox.add(row_package_arch)
+
+ # url
+
+ row_package_url = Gtk.ListBoxRow()
+ vbox_package_url = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+ row_package_url.add(vbox_package_url)
+ lbl_package_url_title = Gtk.Label(xalign=0)
+ lbl_package_url_title.set_markup("URL")
+
+ lbl_package_url_value = Gtk.Label(xalign=0)
+ lbl_package_url_value.set_markup(
+ "%s"
+ % (package_metadata["url"], package_metadata["url"])
+ )
+ vbox_package_url.pack_start(lbl_package_url_title, True, True, 0)
+ vbox_package_url.pack_start(lbl_package_url_value, True, True, 0)
+
+ listbox.add(row_package_url)
+
+ # download size
+
+ row_package_size = Gtk.ListBoxRow()
+ vbox_package_size = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+ row_package_size.add(vbox_package_size)
+ lbl_package_size_title = Gtk.Label(xalign=0)
+ lbl_package_size_title.set_markup("Download size")
+
+ lbl_package_size_value = Gtk.Label(xalign=0)
+ lbl_package_size_value.set_text(package_metadata["download_size"])
+ vbox_package_size.pack_start(lbl_package_size_title, True, True, 0)
+ vbox_package_size.pack_start(lbl_package_size_value, True, True, 0)
+
+ listbox.add(row_package_size)
+
+ # installed size
+
+ row_package_installed_size = Gtk.ListBoxRow()
+ vbox_package_installed_size = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_installed_size.add(vbox_package_installed_size)
+ lbl_package_installed_size_title = Gtk.Label(xalign=0)
+ lbl_package_installed_size_title.set_markup("Installed size")
+
+ lbl_package_installed_size_value = Gtk.Label(xalign=0)
+ lbl_package_installed_size_value.set_text(
+ package_metadata["installed_size"]
+ )
+ vbox_package_installed_size.pack_start(
+ lbl_package_installed_size_title, True, True, 0
+ )
+ vbox_package_installed_size.pack_start(
+ lbl_package_installed_size_value, True, True, 0
+ )
+
+ listbox.add(row_package_installed_size)
+
+ # build date
+
+ row_package_build_date = Gtk.ListBoxRow()
+ vbox_package_build_date = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_build_date.add(vbox_package_build_date)
+ lbl_package_build_date_title = Gtk.Label(xalign=0)
+ lbl_package_build_date_title.set_markup("Build date")
+
+ lbl_package_build_date_value = Gtk.Label(xalign=0)
+ lbl_package_build_date_value.set_text(package_metadata["build_date"])
+ vbox_package_build_date.pack_start(
+ lbl_package_build_date_title, True, True, 0
+ )
+ vbox_package_build_date.pack_start(
+ lbl_package_build_date_value, True, True, 0
+ )
+
+ listbox.add(row_package_build_date)
+
+ # packager
+
+ row_package_maintainer = Gtk.ListBoxRow()
+ vbox_package_maintainer = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_maintainer.add(vbox_package_maintainer)
+ lbl_package_maintainer_title = Gtk.Label(xalign=0)
+ lbl_package_maintainer_title.set_markup("Packager")
+
+ lbl_package_maintainer_value = Gtk.Label(xalign=0)
+ lbl_package_maintainer_value.set_text(package_metadata["packager"])
+ vbox_package_maintainer.pack_start(
+ lbl_package_maintainer_title, True, True, 0
+ )
+ vbox_package_maintainer.pack_start(
+ lbl_package_maintainer_value, True, True, 0
+ )
+
+ listbox.add(row_package_maintainer)
+
+ # depends on
+
+ expander_depends_on = Gtk.Expander()
+ expander_depends_on.set_use_markup(True)
+ expander_depends_on.set_resize_toplevel(True)
+ expander_depends_on.set_label("Depends on")
+
+ row_package_depends_on = Gtk.ListBoxRow()
+ expander_depends_on.add(row_package_depends_on)
+ vbox_package_depends_on = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_depends_on.add(vbox_package_depends_on)
+
+ if len(package_metadata["depends_on"]) > 0:
+ treestore_depends = Gtk.TreeStore(str, str)
+
+ for item in package_metadata["depends_on"]:
+ treestore_depends.append(None, list(item))
+
+ treeview_depends = Gtk.TreeView(model=treestore_depends)
+
+ renderer = Gtk.CellRendererText()
+ column = Gtk.TreeViewColumn("Package", renderer, text=0)
+
+ treeview_depends.append_column(column)
+
+ vbox_package_depends_on.pack_start(treeview_depends, True, True, 0)
+
+ else:
+ lbl_package_depends_value = Gtk.Label(xalign=0, yalign=0)
+ lbl_package_depends_value.set_text("None")
+
+ vbox_package_depends_on.pack_start(
+ lbl_package_depends_value, True, True, 0
+ )
+
+ listbox.add(expander_depends_on)
+
+ # conflicts with
+
+ expander_conflicts_with = Gtk.Expander()
+ expander_conflicts_with.set_use_markup(True)
+ expander_conflicts_with.set_resize_toplevel(True)
+ expander_conflicts_with.set_label("Conflicts with")
+
+ row_package_conflicts_with = Gtk.ListBoxRow()
+ expander_conflicts_with.add(row_package_conflicts_with)
+ vbox_package_conflicts_with = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_conflicts_with.add(vbox_package_conflicts_with)
+
+ if len(package_metadata["conflicts_with"]) > 0:
+ treestore_conflicts = Gtk.TreeStore(str, str)
+
+ for item in package_metadata["conflicts_with"]:
+ treestore_conflicts.append(None, list(item))
+
+ treeview_conflicts = Gtk.TreeView(model=treestore_conflicts)
+
+ renderer = Gtk.CellRendererText()
+ column = Gtk.TreeViewColumn("Package", renderer, text=0)
+
+ treeview_conflicts.append_column(column)
+
+ vbox_package_conflicts_with.pack_start(
+ treeview_conflicts, True, True, 0
+ )
+
+ else:
+ lbl_package_conflicts_with_value = Gtk.Label(xalign=0, yalign=0)
+ lbl_package_conflicts_with_value.set_text("None")
+
+ vbox_package_conflicts_with.pack_start(
+ lbl_package_conflicts_with_value, True, True, 0
+ )
+
+ listbox.add(expander_conflicts_with)
+
+ package_metadata_scrolled_window = Gtk.ScrolledWindow()
+
+ package_metadata_scrolled_window.add(box_outer)
+
+ stack.add_titled(
+ package_metadata_scrolled_window, "Package Information", "Information"
+ )
+
+ self.vbox.add(stack_switcher)
+ self.vbox.add(stack)
+ self.vbox.add(vbox_close)
+
+
+def on_package_progress_close_response(self, widget):
+ self.pkg_dialog_closed = True
+ fn.logger.debug("Closing package progress dialog")
+ widget.hide()
+ widget.destroy()
+
+
+def package_progress_dialog_on_close(widget, data, self, action):
+ self.pkg_dialog_closed = True
+ fn.logger.debug("Closing package progress dialog")
+ widget.hide()
+ widget.destroy()
\ No newline at end of file