53 lines
1.8 KiB
Ruby
53 lines
1.8 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
# Class for creating and displaying alerts in the Curses TUI. This class also manages a little bit of concurrency
|
||
|
# We use mutex for sync so we don't break Curses, as Curses isn't thread safe
|
||
|
class Alert
|
||
|
attr_reader :message, :severity
|
||
|
|
||
|
def initialize(message, severity)
|
||
|
@message = message
|
||
|
@severity = severity
|
||
|
@curses_mutex = Mutex.new
|
||
|
end
|
||
|
|
||
|
def display
|
||
|
@curses_mutex.synchronize do
|
||
|
# Initialize color pairs
|
||
|
Curses.start_color
|
||
|
Curses.init_pair(1, Curses::COLOR_BLUE, Curses::COLOR_BLACK) # Info
|
||
|
Curses.init_pair(2, Curses::COLOR_RED, Curses::COLOR_BLACK) # Error
|
||
|
Curses.init_pair(3, Curses::COLOR_YELLOW, Curses::COLOR_BLACK) # Warning
|
||
|
|
||
|
# Create a new window for the alert at the bottom of the screen
|
||
|
alert_window = Curses::Window.new(1, Curses.cols, Curses.lines - 1, 0)
|
||
|
|
||
|
# Set the color attribute based on the severity of the alert
|
||
|
case @severity
|
||
|
when :info
|
||
|
alert_window.attron(Curses.color_pair(1) | Curses::A_NORMAL) # Blue color
|
||
|
when :warning
|
||
|
alert_window.attron(Curses.color_pair(3) | Curses::A_NORMAL) # Yellow color
|
||
|
when :error
|
||
|
alert_window.attron(Curses.color_pair(2) | Curses::A_NORMAL) # Red color
|
||
|
end
|
||
|
|
||
|
# Add the message to the window and refresh it to display the message
|
||
|
alert_window.addstr(@message)
|
||
|
alert_window.refresh
|
||
|
|
||
|
# Create a new thread to handle the delay and clearing of the alert
|
||
|
# This is done in a separate thread to prevent the entire program from
|
||
|
# pausing while the alert is displayed
|
||
|
Thread.new do
|
||
|
sleep(5) # Pause for 5 seconds
|
||
|
|
||
|
# Clear the alert
|
||
|
alert_window.clear
|
||
|
alert_window.refresh
|
||
|
alert_window.close
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|