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()