Commit Graph
329 Commits
Author SHA1 Message Date
mindonwarp be55238eaa views: Redraw month view rows after changing week-start-day
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/822>
2026-09-26 17:22:00 +00:00
mindonwarp 1fd99f71b2 views: Redraw week view after changing week-start-day
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/822>
2026-09-26 17:22:00 +00:00
mindonwarp fc5cf5229c gui: Extend the GcalView interface with a method to redraw the weekday layout
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/822>
2026-09-26 17:22:00 +00:00
mindonwarp 107d4a067e gui: Use the new GcalContext API to get week start day once
This gets the globally set start-of-week setting on application startup.
Making the views redraw themselves on setting change while running will
be a later step.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/822>
2026-09-26 17:22:00 +00:00
mindonwarp acd8fbaf69 utils: Use ISO weekday numbering for 'get_first_weekday' function
Change the 'get_first_weekday' function to number the weekdays
Monday(1)-Sunday(7) like ISO does. Change the function name to reflect
that. Add tests for different locales, although the tests depend on
system-installed locales.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/822>
2026-09-26 17:22:00 +00:00
Zelda Ahmed bff0f6dac1 views/agenda: Drop GcalAgendaViewDayRow
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/809>
2026-09-26 13:02:27 +01:00
Zelda Ahmed 11ef9db5c2 views/agenda: Rework scrolling to use gtk_list_view_scroll_to
Since we refactored all events widgets and date headers to be
constructed by GtkListView directly, we are able to use
`gtk_list_view_scroll_to` to jump to the top of the list when opening
the agenda view, and changing date, instead of needing a complicated
timer and GSource callback

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/809>
2026-09-26 13:02:27 +01:00
Zelda Ahmed 7694e9846d views/agenda: Use ListView factories for creating the date headers
Similar to the previous commit, we now create the date header label
using the model provided directly from `ListView:header-factory`, by
querying the date of the day the item is in the section of.

This requires copying the auxiliary method `new_date_header_string ()`
from `gcal-agenda-view-day-item.c` to `gcal-agenda-view.c` for
generating the appropriate using facing string for the header

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/809>
2026-09-26 13:02:27 +01:00
Zelda Ahmed 55d9cc68bc views/agenda: Use ListView item factory for creating event widgets
Instead of having the `GtkListView` create a row for each day containing
their own internal `GtkListBox` to store the event widgets, move the
creation of event widgets to the `GtkListView`'s item factory.

The motivation for this change is having internal listbox's inside a
`GtkListView` is problematic for keyboard navigation, because the user
can either:

- The event widgets in the internal listbox's can not be activated by
  pressing Space/Enter on a focused event widget if the listbox row's are set to be focusable.
- If the internal listbox's rows are set to be unfocusable, the user is
  not able to navigate the event widgets using the arrow keys, Page
  Up/Down or Home/End.

To use `GtkListView:factory` to generate the event widgets, we first
wrap the filtered day model inside the list view around a
`GtkFlattenListModel` to concatenate all the containing
`GcalAgendaViewItem` (which contain a given event and the date it occurs
on) in the day models together. This gives us a model of all events that
can be turned into event widgets, and a model of day sections to create
headers for each day in the next commit.

This approach was taken because we do not get the activated row widget,
unlike with the previously used `GtkListBox` where the row widget is
passed as an argument in `::row-activated`, and there is no feasible
other way to obtain the correct event widget from a `GtkListView`.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/809>
2026-09-26 13:02:27 +01:00
Zelda Ahmed 3f1bc3edf0 view/agenda-view-day: Use a map model to create GcalAgendaViewItems for each event of the day
Required some small changes to `gcal-agenda-day-row.c` to keep the
application working - `create_day_row_func` was tweaked to query the
given item for the event, instead of assuming the event is the item
itself. This will be removed (alongside the rest of GcalAgendaDayRow) in
a later commit

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/809>
2026-09-26 13:02:27 +01:00
Zelda Ahmed 4ea2fcfcbe guis/views: Introduce GcalAgendaViewItem
GcalAgendaViewItem is an auxiliary object that will be used instead of
the raw events by GcalAgendaViewDay in a later commit to construct the
event widgets inside the main ListView of the agenda view as opposed to
a creating them inside of a `GtkListBox` inside each row of the
ListView.

Holding a reference to the event widget will be necessary in later
commits, so when a ListView row is activated, we can query its model of
GcalAgendaViewItem's with the given activated position, and pass the
correct item's event widget to `gcal_view_event_activated ()`

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/809>
2026-09-26 13:02:27 +01:00
Hari Rana bf8e9929e3 views/month-cell: Unstyle cells when overflow button is focused
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/835>
2026-09-25 19:13:29 +00:00
Hari Rana 02ad105088 views/month-view: Avoid selecting cells when pressing overflow button
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/835>
2026-09-25 19:13:29 +00:00
Hari Rana 65896c6ece utils: Prefix macros with GCAL_
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/842>
2026-09-20 12:44:24 +00:00
Hari Rana 117c032d95 utils: Prefix every function with gcal_util_
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/842>
2026-09-20 12:44:24 +00:00
Hari Rana 0d1d339581 views: Document transfer none in gcal_view_set_date()
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/838>
2026-09-19 09:12:05 -04:00
Hari Rana 2f393ab117 views/month-view: Free GDateTime when setting active date
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/838>
2026-09-19 09:08:56 -04:00
Felipe Alves pipe-felipe 56128e0574 views/week-view: Fix inverted Ctrl+scroll zoom direction
Ctrl+scrolling with a mouse wheel zoomed in the opposite direction
than expected: scrolling up zoomed out and scrolling down zoomed in,
which is inconsistent with other GNOME apps such as Loupe and
Nautilus.

Negate the scroll delta in both smooth (touchpad) and discrete
(mouse wheel) scrolling cases, so scrolling up now zooms in.

Fixes #1633

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/815>
2026-08-28 22:01:23 +00:00
Anthony Zang 7693feb248 views/month: Cancel active animation before starting new ones
Before, two finger scrolls on mint cinnamon (X11 scroll instead of
wayland) caused month view to crash. g_clear_obj... orphan would an
animation allowing two animations to exist at once, causing conflict
when the orphan continued in the background. The two animations would be
generated due to X11's legacy support of both discrete notch scrolling
and the two finger smooth scrolling.

I replaced g_clear... with cancel_row_offset_animation in
snap_to_top_row which ensures that the orphaned animation is dead prior
to reassigning variables.

Fixes: https://gitlab.gnome.org/GNOME/gnome-calendar/-/work_items/1616
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/801>
2026-08-28 21:48:26 +00:00
Hari Rana b2b6002573 views/month-view: Skip view when tabbing backward with Control on event widget
When an event widget is focused, there is no way to skip the entire
view with key combinations.

This patch addresses this by allowing the user to skip the entire
view when pressing Ctrl+Shift+Tab.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/817>
2026-08-26 21:16:41 -04:00
Hari Rana 3c044ce77c views/month-view: Skip view when tabbing with Control on month cell
We want to skip the entire view, because, otherwise, it runs
gcal_month_view_row_focus_underlying_cell().

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/817>
2026-08-26 21:11:15 -04:00
Hari Rana e1bc583597 views/month-view: Use debug messages
Given the complexity of keyboard navigation in the month view, it
may be useful to rely on debug entries/exits to debug edge cases.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/817>
2026-08-26 20:08:28 -04:00
Hari Rana 2e5379982b views/month-view-row: Replace "adjacent with "overlaying" event
"Adjacent" is incorrect because we are focusing the event that is
in front of the month cell.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/816>
2026-08-25 22:02:50 -04:00
Hari Rana 14869fa02b views/month-view-row: Replace "adjacent" with "underlying" cell
"Adjacent" is incorrect because we are focusing the cell that is
behind the event widget.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/816>
2026-08-25 22:02:50 -04:00
Hari Rana 11e4d8ee8d views/month-view: Allow focusing adjacent event widget from cell
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/741>
2026-08-25 15:42:59 +00:00
Hari Rana ec967ea2b9 views/month-view-row: Add method for focusing adjacent event widget
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/741>
2026-08-25 15:42:59 +00:00
Hari Rana f7c4f7b25a views/month-view-row: Calculate spacings in code
Visually, this comes with the benefit of not having the first
and last visible event widgets take additional margins, as spacing
is only applied between event widgets.

This will also allow us to make use of gtk_widget_pick() without
having to rely on hardcoding 1 on the y axis.

The current approach has a one pixel margin at the top and bottom
of each event widget, which offsets the vertical position of
every event widget by one pixel. In order to pick the first
event widget, we'd want to call
gcal_month_cell_get_header_height() because this is where the
first event widget is placed. If we were to invoke
gtk_widget_pick() with (x, 0), where x is
half the width of the month cell, the returned value would be
NULL because gtk_widget_pick() does not account for margins,
so it would need to be (x, 1), with 1 hardcoded.

Since this patch removes that offset, we can simply use
(x, 0) without having to hardcode 1.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/813>
2026-08-19 09:39:33 -04:00
Hari Rana f19ad343de views/week-header: Add row spacing
This adds back the margins lost from event widgets, without
taking additional pixels on the first and last event widgets.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/813>
2026-08-19 09:37:58 -04:00
Hari Rana 7886ef6f19 views/month-view-row: Get header height during calculations
This is needed for the next commit, which adds gaps between
event widgets.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/813>
2026-08-19 09:25:14 -04:00
Kaiky CintraandRyan Oliveira 3a6d120863 views/month-view: Implement drag and drop handling on month view
Replicate the week grid implementation of drag-and-drop to
allow events to be dropped on top of other events in the month view.

Closes: #1092

Co-authored-by: Ryan Oliveira <ryan.oliveiraf@usp.br>
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/806>
2026-08-14 22:24:01 +00:00
Kaiky Cintra 3aed975bf5 views/month-cell: Remove drag and drop handling from month cell
Co-authored by: Ryan Oliveira ryan.oliveiraf@usp.br

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/806>
2026-08-14 22:24:01 +00:00
Hari Rana 4fc242fd7c views/agenda-view-day-row: Adjust focusability of row and event widget
For unknown reasons, the `::row-activated` signal is not emitted
whenever the user presses an activation button on the keyboard
such as Enter or Space, even though the list box row has focus.

Ideally, we want the list box rows to be activatable, so that
activating them will simply emit the "event-activated" signal and
pop up the popover.

Since this doesn't work, the next best thing is to make the event
widgets themselves focusable and the list box rows unfocusable.
This will unfortunately lose the ability to navigate with arrow
keys, as well as Home/End and Page Up/Down. However, the user will
at least be able to activate them and access events in
the agenda view.

A `FIXME` label has been added because this should be fixed as soon
as possible.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/807>
2026-08-14 21:40:58 +00:00
Hari Rana 506b07fe1c views/agenda-view-day-row: Describe row
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/807>
2026-08-14 21:40:58 +00:00
Hari Rana 63db10cc92 views/agenda: Make list items unfocusable
Without this, the entire row would become focusable, which is
an undesired functionality for people who navigate with a keyboard.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/807>
2026-08-14 21:40:58 +00:00
Hari Rana 68d820b2f7 Revert "views/month-view: Remove offset"
For a while, we have been setting child visibility to false, which
hid the horizontal line separators. However, I started scrolling in
the month view today and came to realize that they were disappearing
sporadically when scrolling upwards.

This happens because we use the `box-shadow` CSS property to apply the
box shadow a pixel above the month view row, which keeps it visible
in the view even when the month view row itself is no longer in
the page. Adding a pixel fixes that.

This reverts commit f4702dde1f.
2026-07-28 08:14:43 -04:00
Hari Rana 5f21144fbb views/month-view-row: Additive inverse in right-to-left languages
"Additive inverse" basically means transforming a positive number
into a negative equivalent, or vice-versa; for example, from 5 to -5.

Instead of inverting conditions in right-to-left languages to
compare the X coordinate, a much simpler approach to this is to
normalize the X coordinate by applying additive inverse in
right-to-left languages.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/744>
2026-07-05 14:56:44 -04:00
Hari Rana 1f06a71ee0 views/month-cell: Set child visible instead of sensitive
When hovering over the bottom side of a month cell regardless of
the sensitivity state of the overflow button, it queries the
button's tooltip text. Using `gtk_widget_set_child_visible()`
fixes that issue.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/743>
2026-07-04 23:04:29 -04:00
Hari Rana cc6edfed79 views/month-cell: Replace overlay with box and empty bin
Since we don't make use of the overlay anymore, it's best to remove
it altogether.

This also changes the behavior of the widgets a bit: It adds an
empty AdwBin widget which expands vertically, allowing us to avoid
aligning the header and overflow button.

The pattern goes from reducible (where we deduct the overflow
height to retrieve the content) to additive (where we add the
overflow height to the content height), which requires us to
adapt GcalMonthViewRow with this new behavior.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/743>
2026-07-04 23:04:29 -04:00
Hari Rana 4f9cba85fb views/month-view: Set ceiled height of each row
Fixes: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/work_items/1290>
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/772>
2026-05-28 06:27:37 -04:00
Hari Rana 7ebd9f2744 views/month-view-row: Add property to negate the compensated pixel
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/772>
2026-05-28 06:27:37 -04:00
Georges Basile Stavracas Neto 5a693f2a25 views/month: Port to GListModel
This was an oversight from the original MR.

Pass the GListModel to the month popover, and let it filter itself
out. Use GtkListBox model utilities for automatically managing the
event widgets.

Closes: https://gitlab.gnome.org/GNOME/gnome-calendar/-/work_items/1582
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/767>
2026-05-20 14:33:13 -04:00
Georges Basile Stavracas Neto 59ee1db556 views/month: Show first invisible rows above and below
But mark them as not child visible. This should make keyboard
navigation work again, as the focused rows don't change actual
visible state, and thus are keyboard navigatable and don't lose
focus.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/769>
2026-05-20 18:26:37 +00:00
Georges Basile Stavracas Neto c9c455b6d8 views/month: Only recalculate layout blocks when needed
The tick callback can be fired *after* the GtkWidget.map() vfunc is
called, in which case the recalculate_layout_blocks() will run with
an already recalculated layout, which is invalid.

Only call recalculate_layout_blocks() when the blocks are invalidated.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/768>
2026-05-20 13:45:52 -03:00
Georges Basile Stavracas Neto 298593456a view/month: Drop GtkBoolFilter from rows
They're slower and showed up in the profilings. Use a custom filter
for now.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/765>
2026-05-19 19:25:49 -03:00
Georges Basile Stavracas Neto 601acef508 views/month: Use variable for better readability
The second part of the if condition is not obvious, so use a variable
with a proper name to make it easier to understand.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/758>
2026-05-19 22:20:10 +00:00
Georges Basile Stavracas Neto 573e1dc042 views/month: Simplify layout blocks recalculation
We can merge two of the three branches, and thus cleanup a function
that is only used there.

Suggested by Hari.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/758>
2026-05-19 22:20:10 +00:00
Georges Basile Stavracas Neto c0127fa2af views/week-header: Reuse event widgets using the new pool
Same deal as the Month view.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/758>
2026-05-19 22:20:10 +00:00
Georges Basile Stavracas Neto bbc041eed9 views/month: Recycle event widgets using the pool
Create a new GcalEventWidgetPool shared between all month view rows.
The event widgets are distributed to rows as needed.

When rows are done with the event widget, the give them back to the
pool so that other rows can reuse them.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/758>
2026-05-19 22:20:10 +00:00
Georges Basile Stavracas Neto 3692747362 views/week-grid: Reuse event widgets
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/758>
2026-05-19 22:20:10 +00:00
Georges Basile Stavracas Neto 4205e08be6 views/month: Reuse event widgets
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/758>
2026-05-19 22:20:10 +00:00