From d2a2a1541679905dc4c7c909aacfb1a0742f9ee2 Mon Sep 17 00:00:00 2001 From: D3V1L0N <167227445+D3V1L0N@users.noreply.github.com> Date: Wed, 24 Apr 2024 04:46:45 +0530 Subject: [PATCH] [add] new file "MessageDialog.py" --- blackbox/ui/MessageDialog.py | 118 +++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 blackbox/ui/MessageDialog.py diff --git a/blackbox/ui/MessageDialog.py b/blackbox/ui/MessageDialog.py new file mode 100644 index 0000000..45cc776 --- /dev/null +++ b/blackbox/ui/MessageDialog.py @@ -0,0 +1,118 @@ +# This class is used to create a modal dialog window showing detailed information about an event + +import os +import gi +import Functions as fn + +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk + +base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) +# base_dir = os.path.dirname(os.path.realpath(__file__)) + + +class MessageDialog(Gtk.Dialog): + # message_type is a string, either one of "info", "warning", "error" to show which infobar to display + # extended argument when set to true shows a textview inside the dialog + # extended argument when set to false only shows a standard dialog + def __init__( + self, title, subtitle, first_msg, secondary_msg, message_type, extended + ): + Gtk.Dialog.__init__(self) + + headerbar = Gtk.HeaderBar() + headerbar.set_title(title) + headerbar.set_show_close_button(True) + + self.set_resizable(True) + + self.set_border_width(10) + + self.set_titlebar(headerbar) + + btn_ok = Gtk.Button(label="OK") + btn_ok.set_size_request(100, 30) + btn_ok.connect("clicked", on_message_dialog_ok_response, self) + btn_ok.set_halign(Gtk.Align.END) + self.set_icon_from_file(os.path.join(base_dir, "images/blackbox.png")) + + infobar = Gtk.InfoBar() + + if message_type == "info": + infobar.set_name("infobar_info") + if message_type == "error": + infobar.set_name("infobar_error") + if message_type == "warning": + infobar.set_name("infobar_warning") + + lbl_title_message = Gtk.Label(xalign=0, yalign=0) + lbl_title_message.set_markup("%s" % subtitle) + content = infobar.get_content_area() + content.add(lbl_title_message) + + infobar.set_revealed(True) + + lbl_padding1 = Gtk.Label(xalign=0, yalign=0) + lbl_padding1.set_text("") + + lbl_padding2 = Gtk.Label(xalign=0, yalign=0) + lbl_padding2.set_text("") + + grid_message = Gtk.Grid() + + grid_message.attach(infobar, 0, 0, 1, 1) + grid_message.attach(lbl_padding1, 0, 1, 1, 1) + + if extended is True: + scrolled_window = Gtk.ScrolledWindow() + textview = Gtk.TextView() + textview.set_property("editable", False) + textview.set_property("monospace", True) + textview.set_border_width(10) + textview.set_vexpand(True) + textview.set_hexpand(True) + + msg_buffer = textview.get_buffer() + msg_buffer.insert( + msg_buffer.get_end_iter(), + "Event timestamp = %s\n" + % fn.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + ) + msg_buffer.insert(msg_buffer.get_end_iter(), "%s\n" % first_msg) + msg_buffer.insert(msg_buffer.get_end_iter(), "%s\n" % secondary_msg) + + # move focus away from the textview, to hide the cursor at load + headerbar.set_property("can-focus", True) + Gtk.Window.grab_focus(headerbar) + + scrolled_window.add(textview) + + grid_message.attach(scrolled_window, 0, 2, 1, 1) + grid_message.attach(lbl_padding2, 0, 3, 1, 1) + + self.set_default_size(800, 600) + + else: + # do not display textview + lbl_first_message = Gtk.Label(xalign=0, yalign=0) + lbl_first_message.set_text(first_msg) + + lbl_second_message = Gtk.Label(xalign=0, yalign=0) + lbl_second_message.set_markup("%s" % secondary_msg) + + grid_message.attach(lbl_first_message, 0, 2, 1, 1) + grid_message.attach(lbl_second_message, 0, 3, 1, 1) + + self.set_default_size(600, 100) + self.set_resizable(False) + + vbox_close = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5) + vbox_close.pack_start(btn_ok, True, True, 1) + + self.vbox.add(grid_message) + self.vbox.add(vbox_close) + + +def on_message_dialog_ok_response(self, widget): + # widget.hide() + widget.destroy()