mac: Redraw icon when menu is closed

This commit is contained in:
Cheng Zhao 2015-08-10 12:48:22 +08:00
parent 4b9ff309ec
commit 58dee04d5c
2 changed files with 23 additions and 2 deletions

View file

@ -9,6 +9,7 @@
#include <string> #include <string>
#include "atom/browser/ui/atom_menu_model.h"
#include "atom/browser/ui/tray_icon.h" #include "atom/browser/ui/tray_icon.h"
#include "base/mac/scoped_nsobject.h" #include "base/mac/scoped_nsobject.h"
@ -17,7 +18,8 @@
namespace atom { namespace atom {
class TrayIconCocoa : public TrayIcon { class TrayIconCocoa : public TrayIcon,
public AtomMenuModel::Observer {
public: public:
TrayIconCocoa(); TrayIconCocoa();
virtual ~TrayIconCocoa(); virtual ~TrayIconCocoa();
@ -30,6 +32,10 @@ class TrayIconCocoa : public TrayIcon {
void PopContextMenu(const gfx::Point& pos) override; void PopContextMenu(const gfx::Point& pos) override;
void SetContextMenu(ui::SimpleMenuModel* menu_model) override; void SetContextMenu(ui::SimpleMenuModel* menu_model) override;
protected:
// AtomMenuModel::Observer:
void MenuClosed() override;
private: private:
// Atom custom view for NSStatusItem. // Atom custom view for NSStatusItem.
base::scoped_nsobject<StatusItemView> status_item_view_; base::scoped_nsobject<StatusItemView> status_item_view_;
@ -37,6 +43,9 @@ class TrayIconCocoa : public TrayIcon {
// Status menu shown when right-clicking the system icon. // Status menu shown when right-clicking the system icon.
base::scoped_nsobject<AtomMenuController> menu_; base::scoped_nsobject<AtomMenuController> menu_;
// Used for unregistering observer.
AtomMenuModel* menu_model_; // weak ref.
DISALLOW_COPY_AND_ASSIGN(TrayIconCocoa); DISALLOW_COPY_AND_ASSIGN(TrayIconCocoa);
}; };

View file

@ -281,11 +281,13 @@ const CGFloat kVerticalTitleMargin = 2;
namespace atom { namespace atom {
TrayIconCocoa::TrayIconCocoa() { TrayIconCocoa::TrayIconCocoa() : menu_model_(nullptr) {
} }
TrayIconCocoa::~TrayIconCocoa() { TrayIconCocoa::~TrayIconCocoa() {
[status_item_view_ removeItem]; [status_item_view_ removeItem];
if (menu_model_)
menu_model_->RemoveObserver(this);
} }
void TrayIconCocoa::SetImage(const gfx::Image& image) { void TrayIconCocoa::SetImage(const gfx::Image& image) {
@ -319,10 +321,20 @@ void TrayIconCocoa::PopContextMenu(const gfx::Point& pos) {
} }
void TrayIconCocoa::SetContextMenu(ui::SimpleMenuModel* menu_model) { void TrayIconCocoa::SetContextMenu(ui::SimpleMenuModel* menu_model) {
// Substribe to MenuClosed event.
if (menu_model_)
menu_model_->RemoveObserver(this);
static_cast<AtomMenuModel*>(menu_model)->AddObserver(this);
// Create native menu.
menu_.reset([[AtomMenuController alloc] initWithModel:menu_model]); menu_.reset([[AtomMenuController alloc] initWithModel:menu_model]);
[status_item_view_ setMenuController:menu_.get()]; [status_item_view_ setMenuController:menu_.get()];
} }
void TrayIconCocoa::MenuClosed() {
[status_item_view_ setNeedsDisplay:YES];
}
// static // static
TrayIcon* TrayIcon::Create() { TrayIcon* TrayIcon::Create() {
return new TrayIconCocoa; return new TrayIconCocoa;