mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 20:37:35 +00:00
LibGUI+Notification: Add mutable notifications
This commit puts all of the remaining pieces in place. This adds a mechanism to update the text, title, and icon of an image. If an image is not provided, the default ladybug will be shown.
This commit is contained in:
parent
147a2c4ca2
commit
8f6894d250
7 changed files with 119 additions and 7 deletions
|
@ -85,6 +85,52 @@ void Notification::close()
|
|||
m_showing = false;
|
||||
m_disposed = true;
|
||||
}
|
||||
|
||||
bool Notification::update()
|
||||
{
|
||||
VERIFY(m_showing);
|
||||
VERIFY(!m_disposed);
|
||||
if (!m_connection->is_connected()) {
|
||||
m_showing = false;
|
||||
m_disposed = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool is_checked = false;
|
||||
|
||||
if (m_text_dirty || m_title_dirty) {
|
||||
auto response = m_connection->send_sync<Messages::NotificationServer::UpdateNotificationText>(m_text, m_title);
|
||||
m_text_dirty = false;
|
||||
m_title_dirty = false;
|
||||
|
||||
is_checked = true;
|
||||
if (!response->still_showing()) {
|
||||
m_showing = false;
|
||||
m_disposed = true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_icon_dirty) {
|
||||
auto response = m_connection->send_sync<Messages::NotificationServer::UpdateNotificationIcon>(m_icon ? m_icon->to_shareable_bitmap() : Gfx::ShareableBitmap());
|
||||
m_icon_dirty = false;
|
||||
|
||||
is_checked = true;
|
||||
if (!response->still_showing()) {
|
||||
m_showing = false;
|
||||
m_disposed = true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_checked) {
|
||||
auto response = m_connection->send_sync<Messages::NotificationServer::IsShowing>();
|
||||
m_showing = response->still_showing();
|
||||
if (!m_showing) {
|
||||
m_disposed = true;
|
||||
}
|
||||
}
|
||||
return m_showing;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -40,23 +40,39 @@ public:
|
|||
virtual ~Notification() override;
|
||||
|
||||
const String& text() const { return m_text; }
|
||||
void set_text(const String& text) { m_text = text; }
|
||||
void set_text(const String& text)
|
||||
{
|
||||
m_text_dirty = true;
|
||||
m_text = text;
|
||||
}
|
||||
|
||||
const String& title() const { return m_title; }
|
||||
void set_title(const String& title) { m_title = title; }
|
||||
void set_title(const String& title)
|
||||
{
|
||||
m_title_dirty = true;
|
||||
m_title = title;
|
||||
}
|
||||
|
||||
const Gfx::Bitmap* icon() const { return m_icon; }
|
||||
void set_icon(const Gfx::Bitmap* icon) { m_icon = icon; }
|
||||
void set_icon(const Gfx::Bitmap* icon)
|
||||
{
|
||||
m_icon_dirty = true;
|
||||
m_icon = icon;
|
||||
}
|
||||
|
||||
void show();
|
||||
bool update();
|
||||
void close();
|
||||
|
||||
private:
|
||||
Notification();
|
||||
|
||||
String m_title;
|
||||
bool m_title_dirty;
|
||||
String m_text;
|
||||
bool m_text_dirty;
|
||||
RefPtr<Gfx::Bitmap> m_icon;
|
||||
bool m_icon_dirty;
|
||||
|
||||
NonnullRefPtr<NotificationServerConnection> m_connection;
|
||||
bool m_showing { false };
|
||||
|
|
|
@ -69,4 +69,29 @@ OwnPtr<Messages::NotificationServer::CloseNotificationResponse> ClientConnection
|
|||
return make<Messages::NotificationServer::CloseNotificationResponse>();
|
||||
}
|
||||
|
||||
OwnPtr<Messages::NotificationServer::UpdateNotificationIconResponse> ClientConnection::handle(const Messages::NotificationServer::UpdateNotificationIcon& message)
|
||||
{
|
||||
auto window = NotificationWindow::get_window_by_id(client_id());
|
||||
if (window) {
|
||||
window->set_image(message.icon());
|
||||
}
|
||||
return make<Messages::NotificationServer::UpdateNotificationIconResponse>(window);
|
||||
}
|
||||
|
||||
OwnPtr<Messages::NotificationServer::UpdateNotificationTextResponse> ClientConnection::handle(const Messages::NotificationServer::UpdateNotificationText& message)
|
||||
{
|
||||
auto window = NotificationWindow::get_window_by_id(client_id());
|
||||
if (window) {
|
||||
window->set_text(message.text());
|
||||
window->set_title(message.title());
|
||||
}
|
||||
return make<Messages::NotificationServer::UpdateNotificationTextResponse>(window);
|
||||
}
|
||||
|
||||
OwnPtr<Messages::NotificationServer::IsShowingResponse> ClientConnection::handle(const Messages::NotificationServer::IsShowing&)
|
||||
{
|
||||
auto window = NotificationWindow::get_window_by_id(client_id());
|
||||
return make<Messages::NotificationServer::IsShowingResponse>(window);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -46,6 +46,9 @@ private:
|
|||
virtual OwnPtr<Messages::NotificationServer::GreetResponse> handle(const Messages::NotificationServer::Greet&) override;
|
||||
virtual OwnPtr<Messages::NotificationServer::ShowNotificationResponse> handle(const Messages::NotificationServer::ShowNotification&) override;
|
||||
virtual OwnPtr<Messages::NotificationServer::CloseNotificationResponse> handle(const Messages::NotificationServer::CloseNotification& message) override;
|
||||
virtual OwnPtr<Messages::NotificationServer::UpdateNotificationIconResponse> handle(const Messages::NotificationServer::UpdateNotificationIcon& message) override;
|
||||
virtual OwnPtr<Messages::NotificationServer::UpdateNotificationTextResponse> handle(const Messages::NotificationServer::UpdateNotificationText& message) override;
|
||||
virtual OwnPtr<Messages::NotificationServer::IsShowingResponse> handle(const Messages::NotificationServer::IsShowing& message) override;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -5,5 +5,11 @@ endpoint NotificationServer = 95
|
|||
|
||||
ShowNotification([UTF8] String text, [UTF8] String title, Gfx::ShareableBitmap icon) => ()
|
||||
|
||||
UpdateNotificationText([UTF8] String text, [UTF8] String title) => (bool still_showing)
|
||||
|
||||
UpdateNotificationIcon(Gfx::ShareableBitmap icon) => (bool still_showing)
|
||||
|
||||
IsShowing() => (bool still_showing)
|
||||
|
||||
CloseNotification() => ()
|
||||
}
|
||||
|
|
|
@ -28,20 +28,17 @@
|
|||
#include <AK/HashMap.h>
|
||||
#include <AK/Vector.h>
|
||||
#include <LibGUI/BoxLayout.h>
|
||||
#include <LibGUI/Button.h>
|
||||
#include <LibGUI/Desktop.h>
|
||||
#include <LibGUI/Icon.h>
|
||||
#include <LibGUI/Label.h>
|
||||
#include <LibGUI/Widget.h>
|
||||
#include <LibGfx/Bitmap.h>
|
||||
#include <LibGfx/Font.h>
|
||||
#include <LibGfx/FontDatabase.h>
|
||||
#include <LibGfx/ShareableBitmap.h>
|
||||
|
||||
namespace NotificationServer {
|
||||
|
||||
static HashMap<u32, RefPtr<NotificationWindow>> s_windows;
|
||||
static const Gfx::Bitmap* default_image = GUI::Icon::default_icon("ladybug").bitmap_for_size(16);
|
||||
static const Gfx::Bitmap* default_image = Gfx::Bitmap::load_from_file("/res/icons/32x32/ladybug.png");
|
||||
|
||||
void update_notification_window_locations()
|
||||
{
|
||||
|
@ -133,4 +130,19 @@ RefPtr<NotificationWindow> NotificationWindow::get_window_by_id(i32 id)
|
|||
return window.value_or(nullptr);
|
||||
}
|
||||
|
||||
void NotificationWindow::set_text(const String& value)
|
||||
{
|
||||
m_text_label->set_text(value);
|
||||
}
|
||||
|
||||
void NotificationWindow::set_title(const String& value)
|
||||
{
|
||||
m_title_label->set_text(value);
|
||||
}
|
||||
|
||||
void NotificationWindow::set_image(const Gfx::ShareableBitmap& image)
|
||||
{
|
||||
m_image->set_bitmap(image.is_valid() ? image.bitmap() : default_image);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -40,6 +40,10 @@ public:
|
|||
virtual ~NotificationWindow() override;
|
||||
void set_original_rect(Gfx::IntRect original_rect) { m_original_rect = original_rect; };
|
||||
|
||||
void set_text(const String&);
|
||||
void set_title(const String&);
|
||||
void set_image(const Gfx::ShareableBitmap&);
|
||||
|
||||
static RefPtr<NotificationWindow> get_window_by_id(i32 id);
|
||||
|
||||
private:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue