···11+# Weekly Calendar Plugin
22+33+A weekly calendar plugin that makes use of Noctalia's [CalendarService.qml](https://github.com/noctalia-dev/noctalia-shell/blob/main/Services/Location/CalendarService.qml) to display events.
44+## Features
55+66+- **Bar Widget**: Show a quick tooltip to see current and upcoming events on hover (updates occur on click);
77+- **Panel**: Complete weekly calendar interface supporting both all-day and normal events with a native-like interface;
88+- **Keyboard Navigation**: Use arrow keys to navigate through your events;
99+- **Settings**: Choose time format, first day of the week, grid line colour and opacity.
1010+1111+## Installation
1212+1313+This plugin is part of the [noctalia-plugins](https://github.com/noctalia-dev/noctalia-plugins) repository, installation can either be done by:
1414+1. adding it as a source in the plugins section;
1515+2. cloning this into `~/.config/noctalia/plugins`.
1616+1717+## Configuration
1818+1919+- **First day of week**: Choose which day starts the week in the weekly calendar (Monday, Sunday or Saturday).
2020+- **Use 12-hour format**: Display time in 12-hour format (AM/PM) instead of 24-hour format.
2121+- **Grid Lines**: Depending on your theming, choose the color and opacity used for the grid lines for better visibility.
2222+2323+## IPC Commands
2424+2525+Currently there is `1` IPC command:
2626+2727+```bash
2828+# Toggle the panel
2929+qs -c noctalia-shell ipc call plugin:weekly-calendar togglePanel
3030+```
3131+3232+## Usage
3333+3434+As a result of relying on Noctalia's [CalendarService.qml](https://github.com/noctalia-dev/noctalia-shell/blob/main/Services/Location/CalendarService.qml), this plugin supports any calendar that works with `evolution-data-server`, covering all major calendar services (e.g. NextCloud, Google Calendar, and CalDAV / WebDAV servers).
3535+3636+The most straightforward ways to start is by either downloading `evolution` or `gnome-calendar` and set calendars through them.
3737+3838+## Minimum Requirements
3939+4040+- **Noctalia Shell**: 4.2.3 or later.
4141+- `evolution-data-server` (also needed for Noctalia's month calendar to display events)
4242+- **Python packages**: EDataServer, ECal, and ICalGLib. (see [calendar-events.py](https://github.com/noctalia-dev/noctalia-shell/blob/main/Scripts/python/src/calendar/calendar-events.py))
4343+
···11+{
22+ "bar_widget": {
33+ "settings": "Widget-Einstellungen",
44+ "now": "Jetzt",
55+ "next": "Nächste",
66+ "no_more_events_today": "Heute keine weiteren Ereignisse"
77+ },
88+ "panel": {
99+ "header": "Wochenkalender",
1010+ "today": "Heute",
1111+ "event": "Ereignis",
1212+ "events": "Ereignisse",
1313+ "allday": "ganztätig",
1414+ "no_service": "Kein Kalenderdienst",
1515+ "loading": "Lädt...",
1616+ "no_events": "Keine Ereignisse"
1717+ },
1818+ "settings": {
1919+ "weekStart": "Erster Tag der Woche",
2020+ "weekStart_description": "Wählen Sie, welcher Tag die Woche im Kalender beginnen soll.",
2121+ "monday": "Montag",
2222+ "sunday": "Sonntag",
2323+ "saturday": "Samstag",
2424+ "timeFormat": "12-Stunden-Zeitformat benutzen",
2525+ "timeFormat_description": "Zeit im 12‑Stunden‑Format (AM/PM) statt im 24‑Stunden‑Format anzeigen.",
2626+ "gridColor": "Rasterfarbe",
2727+ "gridColor_description": "Wähle die Farbe für die Kalender-Rasterlinien.",
2828+ "colorOutline": "Outline",
2929+ "colorOnSurfaceVariant": "OnSurfaceVariant",
3030+ "hourLineOpacity": "Opazität der Stundenlinien",
3131+ "hourLineOpacity_description": "Passe die Deckkraft der Stundenlinien an.",
3232+ "dayLineOpacity": "Opazität der Tageslinien",
3333+ "dayLineOpacity_description": "Passe die Deckkraft der Trennlinien zwischen Tagen an.",
3434+ "panelMode": "Panel-Modus",
3535+ "panelMode_description": "Wählen Sie das Layout (möglicherweise ist ein Neustart erforderlich)",
3636+ "panelAttach": "Panel an der Leiste angeheftet",
3737+ "panelCenter": "Zentriertes Panel"
3838+ }
3939+}
+39
weekly-calendar/i18n/en.json
···11+{
22+ "bar_widget": {
33+ "settings": "Widget Settings",
44+ "now": "Now",
55+ "next": "Next",
66+ "no_more_events_today": "No events remaining today"
77+ },
88+ "panel": {
99+ "header": "Weekly Calendar",
1010+ "today": "Today",
1111+ "event": "event",
1212+ "events": "events",
1313+ "allday": "all-day",
1414+ "no_service": "No calendar service",
1515+ "loading": "Loading...",
1616+ "no_events": "No events"
1717+ },
1818+ "settings": {
1919+ "weekStart": "First day of week",
2020+ "weekStart_description": "Choose which day starts the week in the calendar.",
2121+ "monday": "Monday",
2222+ "sunday": "Sunday",
2323+ "saturday": "Saturday",
2424+ "timeFormat": "Use 12-hour time format",
2525+ "timeFormat_description": "Display time in 12-hour format (AM/PM) instead of 24-hour format.",
2626+ "gridColor": "Grid Color",
2727+ "gridColor_description": "Choose the color used for calendar grid lines.",
2828+ "colorOutline": "Outline",
2929+ "colorOnSurfaceVariant": "OnSurfaceVariant",
3030+ "hourLineOpacity": "Hour Line Opacity",
3131+ "hourLineOpacity_description": "Adjust the opacity of hour lines.",
3232+ "dayLineOpacity": "Day Line Opacity",
3333+ "dayLineOpacity_description": "Adjust the opacity of day separator lines.",
3434+ "panelMode": "Panel Mode",
3535+ "panelMode_description": "Choose layout (may require reopening).",
3636+ "panelAttach": "Panel attached to bar",
3737+ "panelCenter": "Centered panel"
3838+ }
3939+}
+39
weekly-calendar/i18n/es.json
···11+{
22+ "bar_widget": {
33+ "settings": "Configuratión del widget",
44+ "now": "Ahora",
55+ "next": "Siguiente",
66+ "no_more_events_today": "No quedan eventos hoy"
77+ },
88+ "panel": {
99+ "header": "Calendario semanal",
1010+ "today": "Hoy",
1111+ "event": "evento",
1212+ "events": "eventos",
1313+ "allday": "todo el día",
1414+ "no_service": "Sin servicio de calendario",
1515+ "loading": "Cargando...",
1616+ "no_events": "Sin eventos"
1717+ },
1818+ "settings": {
1919+ "weekStart": "Primer día de la semana",
2020+ "weekStart_description": "Elige qué día empieza la semana en el calendario.",
2121+ "monday": "Lunes",
2222+ "sunday": "Domingo",
2323+ "saturday": "Sábado",
2424+ "timeFormat": "Utilice el formato de hora de 12 horas",
2525+ "timeFormat_description": "Mostrar la hora en formato de 12 horas (AM/PM) en lugar de 24 horas.",
2626+ "gridColor": "Color de la cuadrícula" ,
2727+ "gridColor_description": "Elige el color usado para las líneas de la cuadrícula del calendario.",
2828+ "colorOutline": "Outline",
2929+ "colorOnSurfaceVariant": "OnSurfaceVariant",
3030+ "hourLineOpacity": "Opacidad de las líneas de hora",
3131+ "hourLineOpacity_description": "Ajusta la opacidad de las líneas de hora.",
3232+ "dayLineOpacity": "Opacidad de las líneas diarias",
3333+ "dayLineOpacity_description": "Ajusta la opacidad de las líneas separadoras de día.",
3434+ "panelMode": "Modo del panel",
3535+ "panelMode_description": "Elegir diseño (puede requerir reapertura).",
3636+ "panelAttach": "Panel adjunto a la barra",
3737+ "panelCenter": "Panel centrado"
3838+ }
3939+}
+39
weekly-calendar/i18n/fr.json
···11+{
22+ "bar_widget": {
33+ "settings": "Paramètres du widget",
44+ "now": "Maintenant",
55+ "next": "Suivant",
66+ "no_more_events_today": "Plus d'événements aujourd'hui"
77+ },
88+ "panel": {
99+ "header": "Calendrier hebdomadaire",
1010+ "today": "Aujourd'hui",
1111+ "event": "événement",
1212+ "events": "événements",
1313+ "allday": "toute la journée",
1414+ "no_service": "Pas de service de calendrier",
1515+ "loading": "Chargement...",
1616+ "no_events": "Aucun événement"
1717+ },
1818+ "settings": {
1919+ "weekStart": "Début de la semaine",
2020+ "weekStart_description": "Choisissez quel jour commence la semaine dans le calendrier.",
2121+ "monday": "Lundi",
2222+ "sunday": "Dimanche",
2323+ "saturday": "Samedi",
2424+ "timeFormat": "Utiliser le format horaire de 12 heures",
2525+ "timeFormat_description": "Afficher l'heure au format 12 heures (AM/PM) au lieu du format 24 heures.",
2626+ "gridColor": "Couleur de la grille",
2727+ "gridColor_description": "Choisissez la couleur utilisée pour les lignes de la grille du calendrier.",
2828+ "colorOutline": "Outline",
2929+ "colorOnSurfaceVariant": "OnSurfaceVariant",
3030+ "hourLineOpacity": "Opacité des lignes horaires",
3131+ "hourLineOpacity_description": "Ajustez l'opacité des lignes horaires.",
3232+ "dayLineOpacity": "Opacité des lignes journalières",
3333+ "dayLineOpacity_description": "Ajustez l'opacité des lignes séparatrices de jour.",
3434+ "panelMode": "Mode du panneau",
3535+ "panelMode_description": "Choisir la disposition (peut nécessiter une réouverture).",
3636+ "panelAttach": "Panneau attaché à la barre",
3737+ "panelCenter": "Panneau centré"
3838+ }
3939+ }
+39
weekly-calendar/i18n/hu.json
···11+{
22+ "bar_widget": {
33+ "settings": "Widget beállítások",
44+ "now": "Most",
55+ "next": "Következő",
66+ "no_more_events_today": "Ma nincs több esemény"
77+ },
88+ "panel": {
99+ "header": "Heti naptár",
1010+ "today": "Ma",
1111+ "event": "esemény",
1212+ "events": "események",
1313+ "allday": "egész nap",
1414+ "no_service": "Nincs naptárszolgáltatás",
1515+ "loading": "Betöltés...",
1616+ "no_events": "Nincs esemény"
1717+ },
1818+ "settings": {
1919+ "weekStart": "A hét első napja",
2020+ "weekStart_description": "Válassza ki, melyik nap kezdje a hetet a naptárban.",
2121+ "monday": "Hétfő",
2222+ "sunday": "Vasárnap",
2323+ "saturday": "Szombat",
2424+ "timeFormat": "12 órás időformátum használata",
2525+ "timeFormat_description": "Az idő megjelenítése 12 órás formátumban (DE/DU) a 24 órás helyett.",
2626+ "gridColor": "Rácsszín",
2727+ "gridColor_description": "Válassza ki a naptár rácsvonalaihoz használt színt.",
2828+ "colorOutline": "Outline",
2929+ "colorOnSurfaceVariant": "OnSurfaceVariant",
3030+ "hourLineOpacity": "Óravonal átlátszósága",
3131+ "hourLineOpacity_description": "Állítsa be az óravonalak átlátszóságát.",
3232+ "dayLineOpacity": "Napi vonal átlátszósága",
3333+ "dayLineOpacity_description": "Állítsa be a napelválasztó vonalak átlátszóságát.",
3434+ "panelMode": "Panel mód",
3535+ "panelMode_description": "Válasszon elrendezést (újraindításra lehet szükség).",
3636+ "panelAttach": "Panel a sávhoz rögzítve",
3737+ "panelCenter": "Középre igazított panel"
3838+ }
3939+}
+39
weekly-calendar/i18n/it.json
···11+{
22+ "bar_widget": {
33+ "settings": "Impostazioni Widget",
44+ "now": "Ora",
55+ "next": "Prossimo",
66+ "no_more_events_today": "Nessun evento rimanente per oggi"
77+ },
88+ "panel": {
99+ "header": "Calendario settimanale",
1010+ "today": "Oggi",
1111+ "event": "evento",
1212+ "events": "eventi",
1313+ "allday": "giornata intera",
1414+ "no_service": "Nessun servizio per il calendario",
1515+ "loading": "Caricamento in corso...",
1616+ "no_events": "Nessun evento"
1717+ },
1818+ "settings": {
1919+ "weekStart": "Primo giorno della settimana",
2020+ "weekStart_description": "Scegli il giorno che fa iniziare la settimana.",
2121+ "monday": "Lunedì",
2222+ "sunday": "Domenica",
2323+ "saturday": "Sabato",
2424+ "timeFormat": "Usa sistema orario a 12 ore",
2525+ "timeFormat_description": "Mostra il tempo con il sistema orario a 12 ore (AM/PM) invece del sistema a 24 ore.",
2626+ "gridColor": "Colore griglia",
2727+ "gridColor_description": "Scegli il colore usato per le linee della griglia del calendario.",
2828+ "colorOutline": "Outline",
2929+ "colorOnSurfaceVariant": "OnSurfaceVariant",
3030+ "hourLineOpacity": "Opacità delle linee orarie",
3131+ "hourLineOpacity_description": "Regola l'opacità della linee orarie.",
3232+ "dayLineOpacity": "Opacità delle linee giornaliere",
3333+ "dayLineOpacity_description": "Regola l'opacità delle linee separatrici dei giorni.",
3434+ "panelMode": "Modalità del pannello",
3535+ "panelMode_description": "Scegli il layout (potrebbe essere necessario riaprirlo).",
3636+ "panelAttach": "Pannello attacato alla barra",
3737+ "panelCenter": "Pannello centrato"
3838+ }
3939+}
···11+{
22+ "bar_widget": {
33+ "settings": "Mîhengên widget",
44+ "now": "Niha",
55+ "next": "Piştî",
66+ "no_more_events_today": "Îro bêtir bûyer tune"
77+ },
88+ "panel": {
99+ "header": "Salnameya hefteyê",
1010+ "today": "Îro",
1111+ "event": "bûyer",
1212+ "events": "bûyerên",
1313+ "allday": "tîrojê",
1414+ "no_service": "Xizmeta salnameyê nîne",
1515+ "loading": "Bar dike...",
1616+ "no_events": "Bûyer tune"
1717+ },
1818+ "settings": {
1919+ "weekStart": "Roja yekem a hefteyê",
2020+ "weekStart_description": "Roja kîjanê di salnameyê de dest bi hefteyê dike hilbijêre.",
2121+ "monday": "Duşem",
2222+ "sunday": "Yekşem",
2323+ "saturday": "Şemî",
2424+ "timeFormat": "Formata demê ya 12-demjimêr bi kar bîne",
2525+ "timeFormat_description": "Demê di formata 12-demjimêr (BN/PN) de nîşan bide, ne di formata 24-demjimêr de.",
2626+ "gridColor": "Rengê torê",
2727+ "gridColor_description": "Rengê ku ji bo xêtên torê ya salnameyê tê bikar anîn hilbijêre.",
2828+ "colorOutline": "Outline",
2929+ "colorOnSurfaceVariant": "OnSurfaceVariant",
3030+ "hourLineOpacity": "Şeffafiya xêta saetê",
3131+ "hourLineOpacity_description": "Şeffafiya xêtên saetan saz bikin.",
3232+ "dayLineOpacity": "Şeffafiya xêta rojê",
3333+ "dayLineOpacity_description": "Şeffafiya xêtên jêderê rojê saz bikin.",
3434+ "panelMode": "Rewşa panelê",
3535+ "panelMode_description": "Hilbijêre şêweyê (dibe ku ji nû ve vekirinê hewce bike).",
3636+ "panelAttach": "Panel bi bar ve girêdayî ye",
3737+ "panelCenter": "Panela navendîkirî"
3838+ }
3939+}
+39
weekly-calendar/i18n/nl.json
···11+{
22+ "bar_widget": {
33+ "settings": "Widgetinstellingen",
44+ "now": "Nu",
55+ "next": "Volgende",
66+ "no_more_events_today": "Geen evenementen meer vandaag"
77+ },
88+ "panel": {
99+ "header": "Wekelijkse kalender",
1010+ "today": "Vandaag",
1111+ "event": "evenement",
1212+ "events": "evenementen",
1313+ "allday": "de hele dag",
1414+ "no_service": "Geen kalenderdienst",
1515+ "loading": "Laden...",
1616+ "no_events": "Geen evenementen"
1717+ },
1818+ "settings": {
1919+ "weekStart": "Eerste dag van de week",
2020+ "weekStart_description": "Kies welke dag de week in de kalender begint.",
2121+ "monday": "Maandag",
2222+ "sunday": "Zondag",
2323+ "saturday": "Zaterdag",
2424+ "timeFormat": "12-uurs tijdnotatie gebruiken",
2525+ "timeFormat_description": "Tijd weergeven in 12-uurs formaat (AM/PM) in plaats van 24-uurs formaat.",
2626+ "gridColor": "Rasterkleur",
2727+ "gridColor_description": "Kies de kleur die wordt gebruikt voor de rasterlijnen van de kalender.",
2828+ "colorOutline": "Outline",
2929+ "colorOnSurfaceVariant": "OnSurfaceVariant",
3030+ "hourLineOpacity": "Ondoorzichtigheid van uurlijnen",
3131+ "hourLineOpacity_description": "Pas de ondoorzichtigheid van uurlijnen aan.",
3232+ "dayLineOpacity": "Ondoorzichtigheid van daglijnen",
3333+ "dayLineOpacity_description": "Pas de ondoorzichtigheid van dag-scheidingslijnen aan.",
3434+ "panelMode": "Paneelmodus",
3535+ "panelMode_description": "Kies lay-out (mogelijk opnieuw openen vereist).",
3636+ "panelAttach": "Paneel bevestigd aan de balk",
3737+ "panelCenter": "Gecentreerd paneel"
3838+ }
3939+}
+39
weekly-calendar/i18n/pl.json
···11+{
22+ "bar_widget": {
33+ "settings": "Ustawienia widżetu",
44+ "now": "Teraz",
55+ "next": "Następne",
66+ "no_more_events_today": "Dziś brak dalszych wydarzeń"
77+ },
88+ "panel": {
99+ "header": "Kalendarz tygodniowy",
1010+ "today": "Dziś",
1111+ "event": "wydarzenie",
1212+ "events": "wydarzenia",
1313+ "allday": "cały dzień",
1414+ "no_service": "Brak usługi kalendarza",
1515+ "loading": "Ładowanie...",
1616+ "no_events": "Brak wydarzeń"
1717+ },
1818+ "settings": {
1919+ "weekStart": "Pierwszy dzień tygodnia",
2020+ "weekStart_description": "Wybierz, który dzień zaczyna tydzień w kalendarzu.",
2121+ "monday": "Poniedziałek",
2222+ "sunday": "Niedziela",
2323+ "saturday": "Sobota",
2424+ "timeFormat": "Użyj formatu 12-godzinnego",
2525+ "timeFormat_description": "Wyświetlaj czas w formacie 12-godzinnym (AM/PM) zamiast 24-godzinnego.",
2626+ "gridColor": "Kolor siatki",
2727+ "gridColor_description": "Wybierz kolor używany dla linii siatki w kalendarzu.",
2828+ "colorOutline": "Outline",
2929+ "colorOnSurfaceVariant": "OnSurfaceVariant",
3030+ "hourLineOpacity": "Przezroczystość linii godzin",
3131+ "hourLineOpacity_description": "Dopasuj przezroczystość linii godzin.",
3232+ "dayLineOpacity": "Przezroczystość linii dni",
3333+ "dayLineOpacity_description": "Dopasuj przezroczystość linii oddzielających dni.",
3434+ "panelMode": "Tryb panelu",
3535+ "panelMode_description": "Wybierz układ (może wymagać ponownego otwarcia).",
3636+ "panelAttach": "Panel przypięty do paska",
3737+ "panelCenter": "Panel wyśrodkowany"
3838+ }
3939+}
+39
weekly-calendar/i18n/pt.json
···11+{
22+ "bar_widget": {
33+ "settings": "Configurações do widget",
44+ "now": "Agora",
55+ "next": "Próximo",
66+ "no_more_events_today": "Sem mais eventos hoje"
77+ },
88+ "panel": {
99+ "header": "Calendário semanal",
1010+ "today": "Hoje",
1111+ "event": "evento",
1212+ "events": "eventos",
1313+ "allday": "o dia todo",
1414+ "no_service": "Sem serviço de calendário",
1515+ "loading": "Carregando...",
1616+ "no_events": "Sem eventos"
1717+ },
1818+ "settings": {
1919+ "weekStart": "Primeiro dia da semana",
2020+ "weekStart_description": "Escolha qual dia comença a semana no calendário.",
2121+ "monday": "Segunda-feira",
2222+ "sunday": "Domingo",
2323+ "saturday": "Sábado",
2424+ "timeFormat": "Usar formato de 12 horas",
2525+ "timeFormat_description": "Exibir a hora no formato de 12 horas (AM/PM) em vez do formato de 24 horas.",
2626+ "gridColor": "Cor da grade",
2727+ "gridColor_description": "Escolha a cor usada para as linhas da grade do calendário.",
2828+ "colorOutline": "Outline",
2929+ "colorOnSurfaceVariant": "OnSurfaceVariant",
3030+ "hourLineOpacity": "Opacidade das linhas de hora",
3131+ "hourLineOpacity_description": "Ajuste a opacidade das linhas de hora.",
3232+ "dayLineOpacity": "Opacidade das linhas diárias",
3333+ "dayLineOpacity_description": "Ajuste a opacidade das linhas separadoras de dia.",
3434+ "panelMode": "Modo do painel",
3535+ "panelMode_description": "Escolha o layout (pode ser necessário reabrir).",
3636+ "panelAttach": "Painel anexado à barra",
3737+ "panelCenter": "Painel centralizado"
3838+ }
3939+}