diff --git a/common/notifications_manager.cpp b/common/notifications_manager.cpp index 4d49871b4d..d0bbeaa511 100644 --- a/common/notifications_manager.cpp +++ b/common/notifications_manager.cpp @@ -31,6 +31,7 @@ #include <wx/settings.h> #include <wx/stattext.h> #include <wx/string.h> +#include <wx/time.h> #include <paths.h> @@ -38,6 +39,7 @@ #include <widgets/kistatusbar.h> #include <widgets/ui_common.h> #include <json_common.h> +#include <kiplatform/ui.h> #include <core/wx_stl_compat.h> #include <core/json_serializers.h> @@ -51,6 +53,8 @@ #include <vector> +static long long g_last_closed_timer = 0; + NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE( NOTIFICATION, title, description, href, key, date ) class NOTIFICATION_PANEL : public wxPanel @@ -67,7 +71,10 @@ public: wxBoxSizer* mainSizer; mainSizer = new wxBoxSizer( wxVERTICAL ); - SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); + wxColour fg, bg; + KIPLATFORM::UI::GetInfoBarColours( fg, bg ); + SetBackgroundColour( bg ); + SetForegroundColour( fg ); m_stTitle = new wxStaticText( this, wxID_ANY, aNoti->title ); m_stTitle->Wrap( -1 ); @@ -155,7 +162,12 @@ public: bSizer1 = new wxBoxSizer( wxVERTICAL ); m_scrolledWindow = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, - wxSize( -1, -1 ), wxVSCROLL ); + wxSize( -1, -1 ), wxVSCROLL | wxBORDER_SIMPLE ); + wxColour fg, bg; + KIPLATFORM::UI::GetInfoBarColours( fg, bg ); + m_scrolledWindow->SetBackgroundColour( bg ); + m_scrolledWindow->SetForegroundColour( fg ); + m_scrolledWindow->SetScrollRate( 5, 5 ); m_contentSizer = new wxBoxSizer( wxVERTICAL ); @@ -183,9 +195,15 @@ public: void onFocusLoss( wxFocusEvent& aEvent ) { - // check if a child like say, the hyperlink texts got focus - if( !IsDescendant( aEvent.GetWindow() ) ) + if( IsDescendant( aEvent.GetWindow() ) ) + { + // Child (such as the hyperlink texts) got focus + } + else + { Close( true ); + g_last_closed_timer = wxGetLocalTimeMillis().GetValue(); + } aEvent.Skip(); } @@ -370,6 +388,15 @@ void NOTIFICATIONS_MANAGER::onListWindowClosed( wxCloseEvent& aEvent ) void NOTIFICATIONS_MANAGER::ShowList( wxWindow* aParent, wxPoint aPos ) { + // Debounce clicking on the icon with a list already showing. The button will get focus + // first, which will cause a focus-loss on the list (thereby closing it), and then we'd open + // it again without this guard. + if( wxGetLocalTimeMillis().GetValue() - g_last_closed_timer < 300 ) + { + g_last_closed_timer = 0; + return; + } + NOTIFICATIONS_LIST* list = new NOTIFICATIONS_LIST( this, aParent, aPos ); for( NOTIFICATION& job : m_notifications ) @@ -384,6 +411,7 @@ void NOTIFICATIONS_MANAGER::ShowList( wxWindow* aParent, wxPoint aPos ) list->SetPosition( aPos - windowSize ); list->Show(); + KIPLATFORM::UI::ForceFocus( list ); }