1// Aseprite
2// Copyright (C) 2020-2022 Igara Studio S.A.
3// Copyright (C) 2001-2017 David Capello
4//
5// This program is distributed under the terms of
6// the End-User License Agreement for Aseprite.
7
8#ifdef HAVE_CONFIG_H
9#include "config.h"
10#endif
11
12#include "app/ui/notifications.h"
13
14#include "app/notification_delegate.h"
15#include "app/ui/skin/skin_theme.h"
16#include "base/launcher.h"
17#include "ui/menu.h"
18#include "ui/paint_event.h"
19#include "ui/size_hint_event.h"
20
21namespace app {
22
23using namespace ui;
24
25class NotificationItem : public MenuItem {
26public:
27 NotificationItem(INotificationDelegate* del)
28 : MenuItem(del->notificationText()),
29 m_delegate(del) {
30 }
31
32protected:
33 void onClick() override {
34 MenuItem::onClick();
35 m_delegate->notificationClick();
36 }
37
38private:
39 INotificationDelegate* m_delegate;
40};
41
42Notifications::Notifications()
43 : Button("")
44 , m_flagStyle(skin::SkinTheme::get(this)->styles.flag())
45 , m_red(false)
46{
47}
48
49void Notifications::addLink(INotificationDelegate* del)
50{
51 m_popup.addChild(new NotificationItem(del));
52 m_red = true;
53}
54
55void Notifications::onSizeHint(SizeHintEvent& ev)
56{
57 ev.setSizeHint(gfx::Size(16, 10)*guiscale()); // TODO hard-coded flag size
58}
59
60void Notifications::onPaint(PaintEvent& ev)
61{
62 Graphics* g = ev.graphics();
63
64 PaintWidgetPartInfo info;
65 if (hasMouseOver()) info.styleFlags |= ui::Style::Layer::kMouse;
66 if (m_red) info.styleFlags |= ui::Style::Layer::kFocus;
67 if (isSelected()) info.styleFlags |= ui::Style::Layer::kSelected;
68
69 theme()->paintWidgetPart(
70 g, m_flagStyle, clientBounds(), info);
71}
72
73void Notifications::onClick(ui::Event& ev)
74{
75 m_red = false;
76 invalidate();
77
78 gfx::Rect bounds = this->bounds();
79 m_popup.showPopup(
80 gfx::Point(
81 bounds.x - m_popup.sizeHint().w,
82 bounds.y2()),
83 display());
84}
85
86} // namespace app
87