Commit graph

409 commits

Author SHA1 Message Date
Sophie Herold
d6ab100062 image: Use FileList in ContentProvider
Makes dragging an image out of Loupe work in most cases.
There seems to be an issue with dragging from flatpak to host.
Removing the png from the provider seems to avoid gdk crashes
but not 100% sure that was the cause.
2022-11-28 19:34:18 +01:00
Sophie Herold
b202c1d2d2 i18n: Remove regex usage 2022-11-26 02:03:53 +01:00
Sophie Herold
f1593203a0 window: Add missing shortcuts
Add shortcuts
- F9 Image properties
- F10 Main menu
- Ctrl +/- for zoom
- Ctrl 0 for best fit
- Ctrl [Shift] R for rotate
- Escape to leave fullscrenen
Updated help overlay accordingly.
2022-11-25 15:46:35 +01:00
Christopher Davis
583794a3ec general: Use glib::Object::builder for objects w/ props
Builders are more idiomatic rust code than the old
pattern.
2022-11-24 13:06:53 -05:00
Christopher Davis
d1d53e4f4a properties_view: Use ParamSpec builders for props 2022-11-24 13:06:53 -05:00
Sophie Herold
3876f55b4c about: Change app name to Loupe and update devs
- Rename to Loupe to avoid confusion during incubation
  and potentially allow for release on Flathub
- Replace GNOME as developer since it violates software policy
- Put a more useful copyright statement
- Add me as developer
2022-11-23 21:10:03 +00:00
Christopher Davis
aa781d3864 application: Use gio::ActionEntryBuilder for actions
Allows us to drop the action! macro and usage of the clone! macro
in the application file.

The first occurrence of clone! is now in window.rs, so the comment
explaining it has moved there.
2022-11-23 19:56:51 +00:00
Christopher Davis
94086b1650 properties_view: Add comment explaining the purpose of build_dimensions()
Sophie Herold mentioned that it's not entirely clear why we're
loading the image data again here. This comment should explain why
to future readers.
2022-11-23 01:30:14 +00:00
Sophie Herold
029c0c9244 image: Add zoom and scrolling support
Zoom via
- Scroll event controller
- Zoom gesture
- Overlay buttons
- Fixed zoom level shortcuts (1=100%, 2=200%)
Scrolling via
- Scrolled window
- Drag gesture
Changes
- Implement best-fit via calculating a zoom level
- Gesture for carousel no longer working because of scrolled window
- Split control overlays into two to not steal inputs in area between

Closes #17
2022-11-23 00:57:43 +01:00
Sophie Herold
73a1702c47 meson: Cleanup and fix warnings 2022-11-10 19:48:34 +00:00
Sophie Herold
49e595cda2 image: Support rotate gesture 2022-11-10 20:25:11 +01:00
Sophie Herold
c2e3bb2f83 menus: Add rotate left and right buttons 2022-11-06 17:58:02 +01:00
Sophie Herold
57f573f98a ui: Fix quotation marks 2022-11-04 20:48:32 +01:00
Sophie Herold
0f7115fe8b imageMetadata: Implement debug 2022-11-04 20:12:44 +01:00
Sophie Herold
db69cbe64e window: Do not panic on failed drag-and-drop 2022-11-04 20:12:15 +01:00
Sophie Herold
165861568c imageView: Fix two panics when file not exists 2022-11-04 19:28:48 +01:00
Sophie Herold
369b71b15c code: Fix clippy warnings 2022-11-04 19:27:43 +01:00
Sophie Herold
a2e6767584 image: Add rotation and auto rotate based on exif 2022-11-04 18:52:33 +01:00
Sophie Herold
3d6564377a cargo: Update dependencies 2022-11-03 00:57:18 +01:00
Christopher Davis
20c336b17f image_view: Fix carousel scrolling when loading files in same dir
With https://gitlab.gnome.org/GNOME/libadwaita/-/merge_requests/652
merged
we no longer crash when loading files from the same directory.
Now that we don't crash, we've exposed a logic error: we were
changing the state of the carousel while scrolling through it,
which ends with the carousel in a weird state.

This commit delays clearing and refilling the carousel until
after the `page-changed` signal is emitted.
2022-08-19 12:06:07 -04:00
Elton A Rodrigues
8679734a43 general: change wallpaper to background
- Change wallpaper term to background(string and code)
- Remove toast error when cancel background portal
2022-08-18 09:42:25 -03:00
Christopher Davis
ca6e6c639c application: Port to AdwAboutWindow 2022-08-06 00:54:34 -04:00
Christopher Davis
81273c736e general: Update libadwaita-rs
Allows us to clean up our imports a bit.
2022-08-06 00:48:52 -04:00
Christopher Davis
1db46013d9 general: Add translation infrastructure 2022-08-05 19:09:17 -04:00
Christopher Davis
58a77ec9fa properties_view: Only show decimal places when dimensions are fractional 2022-08-05 17:56:07 -04:00
Christopher Davis
36cf667cc8 properties_view: Use glib::format_size() for file size
This handles appropriate localized unit names and rounding for us.
2022-08-05 17:19:47 -04:00
Christopher Davis
d8e8541059 build: Replace deprecated build_root() and source_root() calls
Also use variables since we call these functions multiple times
- might as well cache them since they stay the same the whole
time.
2022-08-05 00:39:50 -04:00
Christopher Davis
d443107146 build: Drop join_paths() in favor of / 2022-08-05 00:39:50 -04:00
Christopher Davis
8fd63ab9b7 build: Drop custom cargo script 2022-08-05 00:39:50 -04:00
Christopher Davis
d921cd8044 window: Take toast text as impl AsRef instead of &impl AsRef 2022-08-04 01:04:04 -04:00
Christopher Davis
37f170b165 general: Name spawned threads
This is for easier debugging in case a panic happens -
instead of dealing with "thread <unnamed> paniced...", etc.,
we get a name relevant to our context.
2022-08-03 19:53:32 -04:00
Christopher Davis
d99215bfd1 general: Use gtk_macros::spawn!()
Makes the code a tad cleaner because we're not manually
getting `glib::MainContext` every time we want to spawn
a future.
2022-08-03 19:37:03 -04:00
Christopher Davis
386b41e482 properties_view: Ignore result of sending SVG metadata across threads
`parse_svg_file_future()` is called in a cancellable async
block. This means that after it's called it can be cancelled,
which drops the receiver. When we fetch the metadata, we try
sending the result to the dropped receiver.

This is expected behavior in this case - the receiver
being gone at the time of sending the metadata is perfectly
valid. However, previously we would cause the thread to panic.
This didn't break anything but made for scary log message.

Since this is expected behavior we can use `_` to tell the
compiler that we don't care about the outcome of sending.
This is valid in this instance because we will only get an
error if the receiver is gone.
2022-08-02 21:15:45 -04:00
Christopher Davis
ba4661031f Implement Properties
Implement a properties sidebar. In order to prevent
the UI from freezing, we use futures to load and cancel
loading file information. We also make use of
`gdk_pixbuf` and `svg_metadata` in order to get the file's
metadata before the file fully loads, meaning there's
little to no delay between changing files and seeing
the metadata for large images.

The properties widget uses expressions and
properties to avoid glue code for setting each label,
allowing us to have a clean separation between UI
and data.
2022-08-02 19:31:44 -04:00
Christopher Davis
1e95dd4cbb image_view: Expose file as a property instead of filename
The GFile is more useful for other data. The window can
use expressions to calculate an appropriate title, so
we no longer need to call `set_title()` or connect to
a signal manually.

This commit also adjusts the `uri()` and `print()`
functions to use `active_file()`
2022-08-02 19:30:08 -04:00
Christopher Davis
9ba6cced6c window,image_view: Move fullscreen controls to the image view
Allan Day's latest mockups have the fullscreen icon on the bottom
left of the image. This commit moves the icon there, using a
GtkExpression for the icon name.
2022-07-14 17:35:20 -04:00
Christopher Davis
689f975bf0 window: Add copy button to top left
Allan Day's latest mockups put a copy button in the top left
of the window. This commits adds the button and the toast along
with it.
2022-07-14 16:27:38 -04:00
Christopher Davis
5f7aa595db file_model: Use binary search to find index
Binary search is a fast method to sort for an item within
a sorted list. We have a sorted list, so we can take advantage
of binary search instead of having a linear traversal through
the list.

Because binary search requires a sorted list, we need to use
the same logic for sorting and searching. Here we factor out
the filename comparison logic into `util::compare_by_name()`.
In the future we may want to have a module for sorting algorithm
logic and checking what sorting algortihm Nautilus uses.
2022-07-14 15:25:03 -04:00
Christopher Davis
d609c4e0b2 image_view: Adjust model index name
Previously we used `prev_index` everywhere, which could
get confusing - it's not really the "previous" index
until we've moved. So, only `page_changed_cb ()` refers
to it as `prev_index`. Everywhere else it's called
`current_model_index`.

In accordance with this change, we can get rid
of a call to `current_page()` and `index_of()`
since we already know the index of the current page.
2022-07-14 13:30:38 -04:00
Christopher Davis
6e869ebb1b window: Remove unecessary String cast in pick_file()
Per clippy lints
2022-06-29 20:10:37 -04:00
Christopher Davis
f0973f6cf6 window: map().flatten() -> and_then()
Per clippy lints
2022-06-29 20:09:45 -04:00
Christopher Davis
e8511bf5d5 image_view: Pass model to update_action_state()
Due to the latest refactoring passes, it was possible
for the model to be borrowed twice when navigating
to a file. This commit makes model an argument
to update_action_state() so we don't need to acquire
another borrow. We have the model already in all cases
where we use update_action_state().
2022-06-29 18:45:45 -04:00
Christopher Davis
ddb02d0eb7 image_view: Rename N_PAGES to BUFFER
This is for better readability. Also changes the comment,
which I forgot to update while reworking how we handle the
model.
2022-06-29 18:25:45 -04:00
Christopher Davis
8c56e2c66a file_model: Make index_of() return a u32
We only ever use it as a u32 elsewhere, so cut out
the casting.
2022-06-29 16:58:11 -04:00
Christopher Davis
70054971d9 file_model: Add file() function
Adds a function to get the file at a given index directly,
instead of going through GListModel::item().
2022-06-29 16:51:16 -04:00
Christopher Davis
e13ecb4df4 file_model: Remove next() and previous() functions
These functions required iterating to find the
index of a file and then adding one to it.
We can be smarter, using an index we already
have and adding or subtracting where appropriate.
2022-06-29 13:37:55 -04:00
Christopher Davis
10cdb2c519 image_view: Create functions to fill and clear carousel
This way we don't need to duplicate code for this functionality.
2022-06-29 12:22:39 -04:00
Christopher Davis
8612c317ba image_view: Implement loading a file within the current model
Currently broken due to a crash in AdwAnimation
2022-06-29 12:22:28 -04:00
Christopher Davis
8acf76bd5e image_view: Clear the carousel when creating a new model
This way we properly handle switching directories within the
same window.
2022-06-28 21:28:55 -04:00
Christopher Davis
3557b15034 image_view: Rework model loading and page navigation
Rework the model loading to not care about the edges.
Now we only care about where we are in the model and
the number of buffer pages. This algorithm handles
the edges without special casing.
2022-06-28 18:59:33 -04:00