dateMenu: Hide "Open Calendar" item if calendar unavailable

The configured calendar application might not actually be installed.
Instead of failing with an error message, hide the menu item altogether
in this case.

https://bugzilla.gnome.org/show_bug.cgi?id=686050
This commit is contained in:
Florian Müllner 2012-10-12 20:59:31 +02:00
parent b561694bf0
commit 4342155748

View File

@ -113,6 +113,11 @@ const DateMenuButton = new Lang.Class({
this._openCalendarItem.actor.can_focus = false; this._openCalendarItem.actor.can_focus = false;
vbox.add(this._openCalendarItem.actor, {y_align: St.Align.END, expand: true, y_fill: false}); vbox.add(this._openCalendarItem.actor, {y_align: St.Align.END, expand: true, y_fill: false});
this._calendarSettings = new Gio.Settings({ schema: 'org.gnome.desktop.default-applications.office.calendar' });
this._calendarSettings.connect('changed::exec',
Lang.bind(this, this._calendarSettingsChanged));
this._calendarSettingsChanged();
// Whenever the menu is opened, select today // Whenever the menu is opened, select today
this.menu.connect('open-state-changed', Lang.bind(this, function(menu, isOpen) { this.menu.connect('open-state-changed', Lang.bind(this, function(menu, isOpen) {
if (isOpen) { if (isOpen) {
@ -146,6 +151,12 @@ const DateMenuButton = new Lang.Class({
this._sessionUpdated(); this._sessionUpdated();
}, },
_calendarSettingsChanged: function() {
let exec = this._calendarSettings.get_string('exec');
let fullExec = GLib.find_program_in_path(exec);
this._openCalendarItem.actor.visible = fullExec != null;
},
_setEventsVisibility: function(visible) { _setEventsVisibility: function(visible) {
this._openCalendarItem.actor.visible = visible; this._openCalendarItem.actor.visible = visible;
this._separator.visible = visible; this._separator.visible = visible;
@ -194,14 +205,13 @@ const DateMenuButton = new Lang.Class({
_onOpenCalendarActivate: function() { _onOpenCalendarActivate: function() {
this.menu.close(); this.menu.close();
let calendarSettings = new Gio.Settings({ schema: 'org.gnome.desktop.default-applications.office.calendar' }); let tool = this._calendarSettings.get_string('exec');
let tool = calendarSettings.get_string('exec');
if (tool.length == 0 || tool.substr(0, 9) == 'evolution') { if (tool.length == 0 || tool.substr(0, 9) == 'evolution') {
// TODO: pass the selected day // TODO: pass the selected day
let app = Shell.AppSystem.get_default().lookup_app('evolution-calendar.desktop'); let app = Shell.AppSystem.get_default().lookup_app('evolution-calendar.desktop');
app.activate(); app.activate();
} else { } else {
let needTerm = calendarSettings.get_boolean('needs-term'); let needTerm = this._calendarSettings.get_boolean('needs-term');
if (needTerm) { if (needTerm) {
let terminalSettings = new Gio.Settings({ schema: 'org.gnome.desktop.default-applications.terminal' }); let terminalSettings = new Gio.Settings({ schema: 'org.gnome.desktop.default-applications.terminal' });
let term = terminalSettings.get_string('exec'); let term = terminalSettings.get_string('exec');