123 Commits

Author SHA1 Message Date
Tom Wagner
d7dd6033a6 graphview: Draw links using new gdk path API instead of cairo 2024-03-25 13:55:49 +01:00
Tom Wagner
f32559511d Update to latest gtk-rs crates 2024-03-25 10:08:38 +01:00
Dorinda Bassey
d1b9b0f11f update Helvum to track the latest pipewire0.8.0
update Helvum to track the latest pipewire0.8.0
2024-03-19 14:06:57 +01:00
Tom A. Wagner
4549ba6ff5 ui: Force LTR direction on the nodes port grid and on ports
Forces the direction on the nodes internal port grid and on the ports themselves
to be always left-to-right (LTR), to avoid the UI becoming messed up when defaulting
to right-to-left (RTL).

Previously, when using RTL, the side of input and output ports would be swapped,
causing the port handles to be inside the node instead of at the edge.
2023-12-09 16:01:11 +01:00
Denis Drakhnia
e78d6f5fb4 ui: Move view with middle mouse button. 2023-11-18 14:19:20 +02:00
Denis Drakhnia
96c079d29e ui: Display node media name in graph view 2023-10-13 11:40:21 +00:00
Tom A. Wagner
5d4931b418 pw: Set media.category property to manager
This will make the session manager give Helvum full permissions even when
used from flatpak or otherwise restricted, so that we can always change
the graph even if permissions become more restricted in the future.
2023-10-12 08:36:08 +00:00
Tom A. Wagner
b983ade736 ui: Move "disconnected" banner from headerbar into content
The change to AdwToolbarView put the disconnected banner into the toolbar, resulting in a weird-looking
separator when the bar is shown.

This moves the banner into the "content" widget of the AdwToolbarView to fix that issue.
2023-10-11 22:48:37 +02:00
Angelo Verlain
94d5e95695 use AdwToolbarView 2023-10-11 22:48:37 +02:00
Angelo Verlain Shema
e1f63ddd28 Use responsive design 2023-10-10 18:16:23 +00:00
Angelo Verlain
903df21ba3 attach about window 2023-10-06 17:46:59 +02:00
Tom A. Wagner
a1a4594a25 ui: Fix headerbar becoming too large
Removes the .toolbar class from a box in the headerbar and instead sets spacing property.

The .toolbar class added extra vertical padding, so the headerbar had to increase its size
2023-09-28 14:05:48 +02:00
Denis Drakhnia
20f64595ac pipewire connection: Show banner if disconnected 2023-09-28 12:25:04 +03:00
Tom Wagner
7d6aae70c5 pipewire connection: restart the outer loop 2023-09-27 14:08:10 +03:00
Denis Drakhnia
94323510aa pipewire connection: Reconnection to PipeWire server 2023-09-27 10:54:32 +00:00
Tom A. Wagner
bc006fe393 ui: Add "About" window to display version, authors, license, etc.
This adds a new adw::AboutWindow containing information about version, authors, license, links etc.
It is opened via a new menu button in the toolbar, which opens a menu containing an "About Helvum" button.

The version and authors are pulled from the Cargo.toml file.
2023-09-19 16:12:29 +02:00
Tom A. Wagner
b9929ba776 Run rustfmt 2023-09-19 08:27:11 +02:00
Tom A. Wagner
1db39fb71f css: Add more padding to node and port names, remove column spacing in ports grid 2023-09-18 18:02:00 +02:00
Tom A. Wagner
89f417f260 node: Remove transparency in dark mode, improve contrast to graphview in light mode 2023-08-28 20:58:54 +02:00
Tom A. Wagner
2343ef824e application: Set PreferDark color scheme
Run the app in dark mode by default, unless the user explicitely wants light mode.
2023-08-28 20:58:54 +02:00
Tom A. Wagner
8aade39aeb css: Improve padding of node title and ports 2023-08-28 20:58:54 +02:00
Tom A. Wagner
0cb40f5cab Node: Rework adding of ports, sort ports and hide seperator when node has no ports
This reworks the adding of a port to nodes, to avoid assigning multiple nodes
to the same grid cell when a node which was not the last in its column has previously
been removed. Instead, the grid is emptied and repopulated each time.

This also lets us sort the nodes each time by name.

Finally, this hides the seperator if a node has no nodes, as it is unneeded.
2023-08-28 20:58:54 +02:00
Tom A. Wagner
4ed7e1f4be graph: Redesign nodes and ports
Nodes now have a background using the libadwaita .card style class.

Ports now have a circular handle, which is positioned on the edge of the node so that half of the circle sticks out.
Ports are also no longer themed like a button and don't receive a color based on the guessed media type, in a future commit,
the handle will be colored instead.
2023-08-28 20:58:54 +02:00
Tom A. Wagner
af4051c3c2 ui: Port to libadwaita
This ports the application to libadwaita, enabling us to use the libadwaita stylesheet and
widgets to better implement the Gnome Human Interface Guidelines.
2023-08-28 19:47:37 +02:00
Tom A. Wagner
7f754b207c Color links and ports according to their formats
Format params for links and ports are now being watched for in the pipewire connection code.

The parsed media type is then set on the port widget / link object
and they are colored accordingly.

For ports, which were already colored before, this new method of determining the media type
should be more reliable and accurate as this uses the real Format/EnumFormat
params instead of parsing optional properties.
2023-08-20 10:55:25 +02:00
Tom A. Wagner
ba73d8cdcc pipewire connection: Move module to mod.rs in its folder 2023-08-18 10:24:54 +02:00
Tom A. Wagner
14f17b3f24 Stop using deprecated gtk::StyleContext::add_provider_for_display function 2023-08-17 21:00:18 +02:00
Tom A. Wagner
bf5c7e4636 Update dependencies 2023-08-17 20:14:23 +02:00
Tom A. Wagner
7145c83ae1 graph: Draw "fake" link during port drag-and-drop to visualize link creating
Cursor movement during port drag-and-drop on the graph is now being tracked
and a link is drawn from the dragged port to the cursor.

If the cursor is hovering a port the source port can link to,
the second end of the link instead attaches to the ports link anchor
so that the link "snaps" to the linkable port.
2023-08-04 14:58:05 +02:00
Tom A. Wagner
d99c5e253c port: Rework how port drag-and-drop is handled
Instead of different types for each direction to avoid linking ports
of the same direction, we reject the drop early if directions of both
ports are the same.

The direction check is easily extendable to also deny links between
ports of different media types in the future.
2023-08-03 21:40:35 +02:00
Tom A. Wagner
15df88a0af graph: Move port link anchor calculation into port widget 2023-08-03 21:12:15 +02:00
Tom A. Wagner
0b3b124cdf graph: Refactor graph item management into new graph_manager object
The graph widgets management (watching a glib receiver, adding and removing
Nodes, Ports and Links) currently done in the `Application` and `GraphView`
objects has been extracted into a new GraphManager object, which watches the
receiver instead, pushes changes directly to the widgets, and reacts to their signals.

This seperates widget logic and management logic cleanly instead of both
being mixed into the GraphView, and also reduces the code size for the
Application object.
2023-08-01 09:15:40 +02:00
Tom A. Wagner
a9ad1cccf0 fix clippy warnings 2023-08-01 09:13:16 +02:00
Tom A. Wagner
7a9bc84b8b port: Use glib::properties derive macro for properties 2023-08-01 09:09:57 +02:00
Tom A. Wagner
27b76b0fe1 node: Use glib::properties derive macro for properties 2023-08-01 09:09:46 +02:00
Tom A. Wagner
f986902929 graph: Move link data into new GObject subclass 2023-07-27 14:16:42 +02:00
Tom A. Wagner
475a83fab7 Restructure view module into ui folder, graph specific widgets into graph subfolder 2023-07-27 14:16:42 +02:00
Tom A. Wagner
0e699288e1 graph: Allocate proper size to nodes when zoomed
Previously, the allocated height and width to a node on the graph was divided by the zoom factor,
to account for the changed size from them being zoomed.

To zoom each node, we `size_allocate` it with a GskTransform that scales it.

However, using a scaling transform to allocate the node already takes care of scaling the height and
width, so us also scaling the height and width manually means we were overcompensating.

This resulted in the allocation becoming to big when zooming out, and to small when zooming in.

This is observable as labels will become smaller when zooming in and ellipsize their content.

The commit removes the extra manual scaling so nodes get allocated properly when zoomed.
2023-07-27 13:14:03 +02:00
Carlos Martín Nieto
84570f44bf port: add the dragged port as the drag icon
This makes it the port label follows your cursor around instead of the generic
text document icon that doesn't make a lot of sense here.
2023-03-14 19:52:54 +01:00
Tom A. Wagner
91d7e10bdc view: Improve layout of labels on nodes and ports
This sets a maximum width of 20 chars on labels on nodes and ports.
Longer labels will wrap to a second line.

For labels longer than two lines, the label is ellipsized at the end.
The full label can still be viewed via hovering for a tooltip.

Co-authored-by: Roger Roger <me@rogerrogert.de>
2023-02-12 20:58:34 +01:00
Roger Roger
fe05282f5a Prefer description over nick for node name 2023-02-12 20:38:18 +01:00
Tom A. Wagner
146fb65dc5 Update gtk and glib dependencies 2023-02-12 20:23:56 +01:00
Tom A. Wagner
b115e6f50c zooming: Add support for zooming via zoom gesture (two finger touchpad/touchscreen zooming) 2022-11-09 19:21:32 +00:00
Tom A. Wagner
1d10c179cc zooming: Add support for zooming by scrolling while holding CTRL 2022-11-09 19:21:32 +00:00
Tom A. Wagner
727326aca4 zooming: Add a control widget that allows for changing the zoom level of the graph
The new widget sits in the headerbar, and allows for changing the zoom level with "+" and "-" buttons, via text entry, and a dropdown where a list of predefined levels can be clicked.
2022-11-09 19:21:32 +00:00
Tom A. Wagner
56e73d33c9 graphview: Make graph widget zoomable via a zoom-factor property.
This adds a `zoom-factor` property.

Changing the property zooms in the entire widget including background, nodes, links, etc.
2022-11-09 19:21:32 +00:00
Tom A. Wagner
4bf586e66c view: graph: Implement gtk::Scrollable and do not render content outside the displayed area
The graphview widget now implements the gtk::Scrollable interface, so it is no longer wrapped inside a gtk::Viewport when used in a gtk::ScrollWindow anymore.
Instead, it repositions its content itself when scrolled, and also skips rendering any content that is not inside the visible area, which should improve performance
when the graph becomes big.

This commit also makes the canvas a fixed size, with much space to each side from the starting area.
This will hopefully improve user experience, as the view can now be moved around more freely, and nodes can be dragged left and above the starting area.
2022-08-25 13:07:37 +02:00
Tom A. Wagner
637ce104df view: Node,Port: Store pipewire Id as property on node, and make its name a property too. 2022-07-21 19:14:17 +02:00
Tom A. Wagner
df72a68815 graphview: draw the background grid via CSS instead of manually with cairo
This makes gtk draw the background grid for us via CSS, instead of manually drawing each line via cairo.

This improves performance, as the grid may now be drawn via GPU, and gets rid of the custom drawing code we had.
2022-05-03 14:04:54 +02:00
Tom A. Wagner
52e48cc0a7 Adjust license headers to reflect gpl-3.0-only license. 2022-04-19 10:14:01 +02:00