Commit Graph

64 Commits

Author SHA1 Message Date
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
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
Tom A. Wagner
4075b66865 deps: Update gtk-rs to latest release 2022-01-17 12:00:00 +01:00
Tom A. Wagner
82a3e4f900 graphview: draw background automatically
This removes the manual painting of the background via cairo and adds the correct color to CSS instead,
which should hopefully improve performance as we do less cpu painting like this.
2021-11-24 16:11:16 +01:00
Tom A. Wagner
54d7ca83ae graphview: Define link and grid colors in style.css
Previously, these were defined directly in the code,
but defining them in the css helps seperating theming and behaviour
and makes the colors easier to tweak.
2021-11-13 20:08:47 +01:00
Tom A. Wagner
ce6cab8134 Run rustfmt 2021-10-13 12:01:22 +02:00
Tom A. Wagner
8a552d0712 graphview: Add missing }; to fix build. 2021-10-13 11:56:46 +02:00
halfbro
f76235674c Add small control point offset to links that connect from right to left (loopbacks) 2021-10-13 09:11:10 +00:00
Tom A. Wagner
92dcfd61a1 Add gpl snippets to the start of each rust source file. 2021-10-03 11:27:36 +02:00
Tom A. Wagner
497da8b953 graphview: Do not crash when the position of a node not on the graph is requested
While the position of a node not on the graph should never be requested, this seems to occur sometimes,
so instead of panicking, we only log an error now, or ignore that node if it wasn't
important.
2021-09-11 15:03:03 +02:00
Roger Roger
487dc3b2d3 Group nodes into columns by major type 2021-08-18 07:23:50 +00:00
Tom A. Wagner
179665778d view: Draw a dashed line for links that are not active 2021-07-08 13:37:37 +02:00
er888kh
be9339472e First nodes that GraphView::add_node creates, get pushed
to the left side of the screen. So by adding a constant offset,
we can avoid having possible links that are partly out of the view
just after starting the program
2021-07-06 09:39:34 +00:00
Tom A. Wagner
e29ffdeea8 view: Port: Do not inherit from gtk::Button
We do not need any button functionality, so it is more appropriate to inherit directly from gtk::Widget
2021-07-06 11:01:20 +02:00
Tom A. Wagner
add1a96b75 Deduplicate port dragging code and add some extra logging 2021-07-06 10:23:20 +02:00
Tom A. Wagner
9445e173f9 view: ports: Improve linking between ports.
Links can now created by dragging in both directions, so now from an input port to an output port, too.
The drag-n-drop handlers now use dedicated types for each direction, so that no mismatched things can be dropped on each other.
2021-06-28 13:54:53 +02:00
Tom A. Wagner
58794fe123 Remove unneeded Rc, Port is now a refcounted gobject 2021-06-28 13:29:46 +02:00
Tom A. Wagner
8d6fbe2997 Remove outdated doc comment 2021-06-28 13:29:46 +02:00
Tom A. Wagner
b0bf5e5281 Slightly improve logging 2021-06-28 13:29:46 +02:00
Tom A. Wagner
edc4064009 graphview: Place link curve control points more dynamically
Control points are now offset by half the x distance of the start and end points instead of a constant,
which makes the curve scale better with varying distance.
2021-06-28 10:48:09 +02:00
Tom A. Wagner
58cdcd859b graphview: Draw links in front of nodes, instead of behind them. 2021-06-26 12:34:48 +02:00
Tom A. Wagner
7977481689 Fix some pedantic clippy warnings 2021-06-26 12:10:36 +02:00
Tom A. Wagner
907ef328d2 Move state to pipewire thread instead of the gtk thread.
This will allow easier state-keeping later, when setting up info-listeners on structs.
2021-06-06 09:20:07 +02:00
Mathias Rav
3cd19f2d1d When dragging a node, don't snap its top-left corner to the cursor
Revamp the node dragging implementation, moving it into the GraphView
widget.

When a drag is initiated, the node widget's current position is stored.
Whenever the drag gesture is updated, the node widget's position is set
by adding the relative drag vector to the position at the start of the
drag.

A drag gesture on the node widget rather than the GraphView widget was
considered, but this seems to lead to a weird flickering effect when the
node is moved while the drag gesture on the node is active.

To avoid interfering with the drag handlers on the ports, check if the
GraphView drag gesture targets a port, in which case the handler does
nothing.
2021-05-10 18:21:00 +00:00
Tom A. Wagner
a9cd428a5a Change cursor to grab hand over output port.
This lets the user know the port can be dragged to create a link.
2021-05-08 18:44:50 +02:00
Tom A. Wagner
a5d8c871ee Update dependencies 2021-05-08 18:42:49 +02:00
Tom A. Wagner
be240231c0 Merge Controller and View structs into one Application struct.
The `View` sturct was mostly a layer of indirection, and the controller benefitted by absorbing the gtk::Application
subclass parts, so now those two are merged into a new gtk::Application subclass.
2021-05-08 18:06:52 +02:00
Tom A. Wagner
2cc684d57c Turn struct View into a gtk::Application subclass.
This lets us keep multiple reference-counted copies easier, and lets us emit signals to the controller.
2021-05-08 18:06:52 +02:00
Tom A. Wagner
b5071c09a0 Emit "link-toggled" signal when two ports widgets are connected 2021-05-08 18:06:37 +02:00
Tom A. Wagner
076fec7eb4 Modify architecture to run pipewire loop in second thread.
The pipewire loop now runs without interruption in a second thread and communicates with
the GTK thread via a channel in each direction, instead of checking for events once a second and using callbacks.

This allows changes to appear instantly in the view, instead of having to wait.
2021-05-05 21:48:00 +02:00
Tom A. Wagner
75aa0a30d0 Turn view::port::Port into a gtk::Button subclass 2021-04-02 14:53:58 +02:00
Tom A. Wagner
9b448f0a30 view: Add some comments to View struct 2021-04-01 16:24:21 +02:00
Tom A. Wagner
2cb155c5ee view: Refactor view to have a manager View struct.
The view struct creates, manages and runs the view, and handles all communication with components outside of the view.
2021-03-31 10:44:04 +02:00
Tom A. Wagner
48821be18d Move port coloring into view
The controller still determines the ports media type, but instead of coloring
the port itself, the media type is passed to the constructor, which then colors the port.
2021-03-28 21:03:43 +02:00
Emmanuel Gil Peyrot
279c792345 Update to build with latest glib
glib replaced its glib::object_subclass!() macro with
a #[glib::object_subclass] attribute, to simplify a bunch of things.

See fdc8459b39
2021-03-14 00:25:08 +01:00
Guillaume Desmottes
5784275d32 fix clippy warnings 2021-02-14 17:24:49 +01:00
Tom A. Wagner
5ac535ab37 Prevent nodes from being dragged out of the graph view 2021-02-10 10:58:01 +01:00
Tom A. Wagner
ec8de4a4a7 Color ports depending on the type of data (audio,video,midi) they carry 2021-02-09 12:51:35 +01:00
Tom A. Wagner
a3907a1832 Change Node from a frame subclass to a widget subclass. 2021-01-12 10:44:12 +01:00
Tom A. Wagner
5bf62eca6e Use log, env_logger crates to log warnings instead of using eprintln!() macro 2021-01-12 09:48:59 +01:00