diff --git a/data/Makefile.am b/data/Makefile.am index 4e73e037a..8d7eedf08 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -25,6 +25,8 @@ dist_images_DATA = \ themedir = $(pkgdatadir)/theme dist_theme_DATA = \ theme/add-workspace.svg \ + theme/calendar-arrow-left.svg \ + theme/calendar-arrow-right.svg \ theme/close-window.svg \ theme/close.svg \ theme/corner-ripple.png \ diff --git a/js/ui/calendar.js b/js/ui/calendar.js index 9dd5b305e..017a98b87 100644 --- a/js/ui/calendar.js +++ b/js/ui/calendar.js @@ -55,89 +55,53 @@ function _getDigitWidth(actor){ return width; } -function _getCalendarDayAbbreviation(day_number) { - let ret; - switch (day_number) { - case 0: - /* Translators: Abbreviation used in calendar grid - * widget. Note: all calendar abbreviations are always shown - * together and in order, e.g. "S M T W T F S" +function _getCalendarDayAbbreviation(dayNumber) { + let abbreviations = [ + /* Translators: Calendar grid abbreviation for Sunday. + * + * NOTE: These abbreviations are always shown together and in + * order, e.g. "S M T W T F S". */ - ret = _("S"); - break; - - case 1: - /* Translators: Calendar abbreviation for Monday */ - ret = _("M"); - break; - - case 2: - /* Translators: Calendar abbreviation for Tuesday */ - ret = _("T"); - break; - - case 3: - /* Translators: Calendar abbreviation for Wednesday */ - ret = _("W"); - break; - - case 4: - /* Translators: Calendar abbreviation for Thursday */ - ret = _("T"); - break; - - case 5: - /* Translators: Calendar abbreviation for Friday */ - ret = _("F"); - break; - - case 6: - /* Translators: Calendar abbreviation for Saturday */ - ret = _("S"); - break; - } - return ret; + _("S"), + /* Translators: Calendar grid abbreviation for Monday */ + _("M"), + /* Translators: Calendar grid abbreviation for Tuesday */ + _("T"), + /* Translators: Calendar grid abbreviation for Wednesday */ + _("W"), + /* Translators: Calendar grid abbreviation for Thursday */ + _("T"), + /* Translators: Calendar grid abbreviation for Friday */ + _("F"), + /* Translators: Calendar grid abbreviation for Saturday */ + _("S") + ]; + return abbreviations[dayNumber]; } -function _getEventDayAbbreviation(day_number) { - let ret; - switch (day_number) { - case 0: - /* Translators: Abbreviation used in event list for Sunday */ - ret = _("Su"); - break; - - case 1: - /* Translators: Abbreviation used in event list for Monday */ - ret = _("M"); - break; - - case 2: - /* Translators: Abbreviation used in event list for Tuesday */ - ret = _("T"); - break; - - case 3: - /* Translators: Abbreviation used in event list for Wednesday */ - ret = _("W"); - break; - - case 4: - /* Translators: Abbreviation used in event list for Thursday */ - ret = _("Th"); - break; - - case 5: - /* Translators: Abbreviation used in event list for Friday */ - ret = _("F"); - break; - - case 6: - /* Translators: Abbreviation used in event list for Saturday */ - ret = _("S"); - break; - } - return ret; +function _getEventDayAbbreviation(dayNumber) { + let abbreviations = [ + /* Translators: Event list abbreviation for Sunday. + * + * NOTE: These abbreviations are normally not shown together + * so they need to be unique (e.g. Tuesday and Thursday cannot + * both be 'T'). + */ + _("Su"), + /* Translators: Event list abbreviation for Monday */ + _("M"), + /* Translators: Event list abbreviation for Tuesday */ + _("T"), + /* Translators: Event list abbreviation for Wednesday */ + _("W"), + /* Translators: Event list abbreviation for Thursday */ + _("Th"), + /* Translators: Event list abbreviation for Friday */ + _("F"), + /* Translators: Event list abbreviation for Saturday */ + _("S") + ]; + return abbreviations[dayNumber]; } // ------------------------------------------------------------------------ @@ -203,7 +167,7 @@ FakeEventSource.prototype = { // '10-oclock pow-wow' is an event occuring IN THE PAST every four days at 10am for(let n = 0; n < 10; n++) { - let t = new Date(now.getTime() - n*4*86400*1000); + let t = new Date(now.getTime() - n * 4 * 86400 * 1000); t.setHours(10); summary = '10-oclock pow-wow (n=' + n + ')'; this._fake_tasks.push(new CalendarTask(t, summary)); @@ -211,7 +175,7 @@ FakeEventSource.prototype = { // '11-oclock thing' is an event occuring every three days at 11am for(let n = 0; n < 10; n++) { - let t = new Date(now.getTime() + n*3*86400*1000); + let t = new Date(now.getTime() + n * 3 * 86400 * 1000); t.setHours(11); summary = '11-oclock thing (n=' + n + ')'; this._fake_tasks.push(new CalendarTask(t, summary)); @@ -219,7 +183,7 @@ FakeEventSource.prototype = { // 'Weekly Meeting' is an event occuring every seven days at 1:45pm (two days displaced) for(let n = 0; n < 5; n++) { - let t = new Date(now.getTime() + (n*7+2)*86400*1000); + let t = new Date(now.getTime() + (n * 7 + 2) * 86400 * 1000); t.setHours(13); t.setMinutes(45); summary = 'Weekly Meeting (n=' + n + ')'; @@ -227,10 +191,10 @@ FakeEventSource.prototype = { } // 'Get Married' is an event that actually reflects reality (Dec 4, 2010) :-) - this._fake_tasks.push(new CalendarTask(new Date(2010,11,4,16,0), 'Get Married')); + this._fake_tasks.push(new CalendarTask(new Date(2010, 11, 4, 16, 0), 'Get Married')); // ditto for 'NE Patriots vs NY Jets' - this._fake_tasks.push(new CalendarTask(new Date(2010,11,6,20,30), 'NE Patriots vs NY Jets')); + this._fake_tasks.push(new CalendarTask(new Date(2010, 11, 6, 20, 30), 'NE Patriots vs NY Jets')); // An event for tomorrow @6:30pm that is added/removed every five // seconds (to check that the ::changed signal works) @@ -289,13 +253,13 @@ Signals.addSignalMethods(FakeEventSource.prototype); /* ------------------------------------------------------------------------ */ -// @event_source is an object implementing the EventSource API, e.g. the +// Calendar: +// @eventSource: is an object implementing the EventSource API, e.g. the // getTasks(), hasTasks() methods and the ::changed signal. +// @eventList: is the EventList object to control // -// @event_list is the EventList object to control -// -function Calendar(event_source, event_list) { - this._init(event_source, event_list); +function Calendar(eventSource, eventList) { + this._init(eventSource, eventList); } Calendar.prototype = { @@ -303,7 +267,7 @@ Calendar.prototype = { this._event_source = event_source; this._event_list = event_list; - this._event_source.connect('changed', Lang.bind(this, this._onEventSourceChanged)); + this._event_source.connect('changed', Lang.bind(this, this._update)); // FIXME: This is actually the fallback method for GTK+ for the week start; // GTK+ by preference uses nl_langinfo (NL_TIME_FIRST_WEEKDAY). We probably @@ -390,7 +354,6 @@ Calendar.prototype = { // We need to figure out the abbreviated localized names for the days of the week; // we do this by just getting the next 7 days starting from right now and then putting // them in the right cell in the table. It doesn't matter if we add them in order - // let iter = new Date(this.selected_date); iter.setSeconds(0); // Leap second protection. Hah! iter.setHours(12); @@ -464,10 +427,6 @@ Calendar.prototype = { this._update(); }, - _onEventSourceChanged: function() { - this._update(); - }, - _update: function() { this._dateLabel.text = this.selected_date.toLocaleFormat(this._headerFormat); @@ -487,13 +446,9 @@ Calendar.prototype = { let now = new Date(); let row = 2; - let dayButtons = []; - this._dayButtons = dayButtons; while (true) { let button = new St.Button({ label: iter.getDate().toString() }); - dayButtons.push(button); - let iterStr = iter.toUTCString(); button.connect('clicked', Lang.bind(this, function() { let newly_selected_date = new Date(iterStr); @@ -566,18 +521,20 @@ function EventsList(event_source) { EventsList.prototype = { _init: function(event_source) { this.actor = new St.BoxLayout({ vertical: true, style_class: 'events-header-vbox'}); - // FIXME: Evolution backend is currently disabled - // this.evolutionTasks = new EvolutionEventsSource(); - this._event_source = event_source; }, _addEvent: function(dayNameBox, timeBox, eventTitleBox, includeDayName, day, time, desc) { if (includeDayName) { - dayNameBox.add(new St.Label({ style_class: 'events-day-dayname', text: day}), {x_fill: false}); + dayNameBox.add(new St.Label( { style_class: 'events-day-dayname', + text: day } ), + { x_fill: false } ); } - timeBox.add(new St.Label({ style_class: 'events-day-time', text: time}), {x_fill: false}); - eventTitleBox.add(new St.Label({ style_class: 'events-day-task', text: desc})); + timeBox.add(new St.Label( { style_class: 'events-day-time', + text: time} ), + { x_fill: false } ); + eventTitleBox.add(new St.Label( { style_class: 'events-day-task', + text: desc} )); }, _addPeriod: function(header, begin, end, includeDayName) { diff --git a/js/ui/dateMenu.js b/js/ui/dateMenu.js index b11aa0c8d..0afa6061e 100644 --- a/js/ui/dateMenu.js +++ b/js/ui/dateMenu.js @@ -11,6 +11,7 @@ const St = imports.gi.St; const Gettext = imports.gettext.domain('gnome-shell'); const _ = Gettext.gettext; +const Util = imports.misc.util; const Main = imports.ui.main; const PanelMenu = imports.ui.panelMenu; const PopupMenu = imports.ui.popupMenu; @@ -23,10 +24,6 @@ const CLOCK_FORMAT_KEY = 'clock-format'; const CLOCK_SHOW_DATE_KEY = 'show-date'; const CLOCK_SHOW_SECONDS_KEY = 'show-seconds'; -function DateMenuButton() { - this._init(); -} - function on_vert_sep_repaint (area) { let cr = area.get_context(); @@ -51,6 +48,10 @@ function on_vert_sep_repaint (area) cr.fill(); }; +function DateMenuButton() { + this._init(); +} + DateMenuButton.prototype = { __proto__: PanelMenu.Button.prototype, @@ -72,7 +73,7 @@ DateMenuButton.prototype = { this.menu.addActor(hbox); // Fill up the first column - // + vbox = new St.BoxLayout({vertical: true, name: 'calendarVBox1'}); hbox.add(vbox); @@ -88,7 +89,7 @@ DateMenuButton.prototype = { vbox.add(this._calendar.actor); // Add vertical separator - // + item = new St.DrawingArea({ style_class: 'calendar-vertical-separator', pseudo_class: 'highlighted' }); item.set_width(25); // TODO: don't hard-code the width @@ -101,7 +102,6 @@ DateMenuButton.prototype = { hbox.add(this._event_list.actor); // Whenever the menu is opened, select today - // this.menu.connect('open-state-changed', Lang.bind(this, function(menu, is_open) { if (is_open) { let now = new Date(); @@ -110,31 +110,25 @@ DateMenuButton.prototype = { })); // Done with hbox for calendar and event list - // // Add separator item = new PopupMenu.PopupSeparatorMenuItem(); this.menu.addMenuItem(item); // Add button to get to the Date and Time settings - item = new PopupMenu.PopupImageMenuItem(_("Date and Time Settings"), 'gnome-shell-clock-preferences'); - item.connect('activate', Lang.bind(this, this._onPreferencesActivate)); - this.menu.addMenuItem(item); + this.menu.addAction(_("Date and Time Settings"), + Lang.bind(this, this._onPreferencesActivate)); // Track changes to clock settings this._desktopSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' }); this._clockSettings = new Gio.Settings({ schema: 'org.gnome.shell.clock' }); - this._desktopSettings.connect('changed', Lang.bind(this, this._clockSettingsChanged)); - this._clockSettings.connect('changed', Lang.bind(this, this._clockSettingsChanged)); + this._desktopSettings.connect('changed', Lang.bind(this, this._updateClockAndDate)); + this._clockSettings.connect('changed', Lang.bind(this, this._updateClockAndDate)); // Start the clock this._updateClockAndDate(); }, - _clockSettingsChanged: function() { - this._updateClockAndDate(); - }, - _updateClockAndDate: function() { let format = this._desktopSettings.get_string(CLOCK_FORMAT_KEY); let showDate = this._clockSettings.get_boolean(CLOCK_SHOW_DATE_KEY); @@ -199,15 +193,6 @@ DateMenuButton.prototype = { }, _onPreferencesActivate: function() { - Main.overview.hide(); - this._spawn(['gnome-control-center', 'datetime']); + Util.spawnDesktop('gnome-datetime-panel'); }, - - _spawn: function(args) { - // FIXME: once Shell.Process gets support for signalling - // errors we should pop up an error dialog or something here - // on failure - let p = new Shell.Process({'args' : args}); - p.run(); - } }; diff --git a/js/ui/panel.js b/js/ui/panel.js index 2543d6ab4..a7bfc9f09 100644 --- a/js/ui/panel.js +++ b/js/ui/panel.js @@ -493,121 +493,6 @@ AppMenuButton.prototype = { Signals.addSignalMethods(AppMenuButton.prototype); -function ClockButton() { - this._init(); -} - -ClockButton.prototype = { - _init: function() { - this.actor = new St.Bin({ style_class: 'panel-button', - reactive: true, - can_focus: true, - x_fill: true, - y_fill: false, - track_hover: true }); - this.actor._delegate = this; - this.actor.connect('button-press-event', - Lang.bind(this, this._toggleCalendar)); - - this._clock = new St.Label(); - this.actor.set_child(this._clock); - - this._calendarPopup = null; - - this._desktopSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' }); - this._clockSettings = new Gio.Settings({ schema: 'org.gnome.shell.clock' }); - - this._desktopSettings.connect('changed', Lang.bind(this, this._updateClock)); - this._clockSettings.connect('changed', Lang.bind(this, this._updateClock)); - - // Start the clock - this._updateClock(); - }, - - closeCalendar: function() { - if (!this._calendarPopup || !this._calendarPopup.isOpen) - return; - - this._calendarPopup.hide(); - - this.actor.remove_style_pseudo_class('pressed'); - }, - - openCalendar: function() { - this._calendarPopup.show(); - - this.actor.add_style_pseudo_class('pressed'); - }, - - _toggleCalendar: function() { - if (this._calendarPopup == null) { - this._calendarPopup = new CalendarPopup(); - this._calendarPopup.actor.hide(); - } - - if (!this._calendarPopup.isOpen) - this.openCalendar(); - else - this.closeCalendar(); - }, - - _updateClock: function() { - let format = this._desktopSettings.get_string(CLOCK_FORMAT_KEY); - let showDate = this._clockSettings.get_boolean(CLOCK_SHOW_DATE_KEY); - let showSeconds = this._clockSettings.get_boolean(CLOCK_SHOW_SECONDS_KEY); - - let clockFormat; - switch (format) { - case '24h': - if (showDate) - /* Translators: This is the time format with date used - in 24-hour mode. */ - clockFormat = showSeconds ? _("%a %b %e, %R:%S") - : _("%a %b %e, %R"); - else - /* Translators: This is the time format without date used - in 24-hour mode. */ - clockFormat = showSeconds ? _("%a %R:%S") - : _("%a %R"); - break; - case '12h': - default: - if (showDate) - /* Translators: This is a time format with date used - for AM/PM. */ - clockFormat = showSeconds ? _("%a %b %e, %l:%M:%S %p") - : _("%a %b %e, %l:%M %p"); - else - /* Translators: This is a time format without date used - for AM/PM. */ - clockFormat = showSeconds ? _("%a %l:%M:%S %p") - : _("%a %l:%M %p"); - break; - } - - let displayDate = new Date(); - let msecRemaining; - if (showSeconds) { - msecRemaining = 1000 - displayDate.getMilliseconds(); - if (msecRemaining < 50) { - displayDate.setSeconds(displayDate.getSeconds() + 1); - msecRemaining += 1000; - } - } else { - msecRemaining = 60000 - (1000 * displayDate.getSeconds() + - displayDate.getMilliseconds()); - if (msecRemaining < 500) { - displayDate.setMinutes(displayDate.getMinutes() + 1); - msecRemaining += 60000; - } - } - - this._clock.set_text(displayDate.toLocaleFormat(clockFormat)); - Mainloop.timeout_add(msecRemaining, Lang.bind(this, this._updateClock)); - return false; - } -}; - function Panel() { this._init(); }