mirror of
https://gitlab.freedesktop.org/pipewire/helvum
synced 2026-03-15 11:36:11 +08:00
zooming: Add support for zooming by scrolling while holding CTRL
This commit is contained in:
committed by
Tom Wagner
parent
727326aca4
commit
1d10c179cc
@@ -37,7 +37,11 @@ mod imp {
|
|||||||
|
|
||||||
use std::cell::{Cell, RefCell};
|
use std::cell::{Cell, RefCell};
|
||||||
|
|
||||||
use gtk::{gdk::RGBA, graphene::Rect, gsk::ColorStop};
|
use gtk::{
|
||||||
|
gdk::{self, RGBA},
|
||||||
|
graphene::Rect,
|
||||||
|
gsk::ColorStop,
|
||||||
|
};
|
||||||
use log::warn;
|
use log::warn;
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
|
|
||||||
@@ -82,6 +86,7 @@ mod imp {
|
|||||||
obj.set_overflow(gtk::Overflow::Hidden);
|
obj.set_overflow(gtk::Overflow::Hidden);
|
||||||
|
|
||||||
self.setup_node_dragging();
|
self.setup_node_dragging();
|
||||||
|
self.setup_scroll_zooming();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn dispose(&self, _obj: &Self::Type) {
|
fn dispose(&self, _obj: &Self::Type) {
|
||||||
@@ -291,6 +296,39 @@ mod imp {
|
|||||||
obj.add_controller(&drag_controller);
|
obj.add_controller(&drag_controller);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn setup_scroll_zooming(&self) {
|
||||||
|
let obj = self.instance();
|
||||||
|
|
||||||
|
// We're only interested in the vertical axis, but for devices like touchpads,
|
||||||
|
// not capturing a small accidental horizontal move may cause the scroll to be disrupted if a widget
|
||||||
|
// higher up captures it instead.
|
||||||
|
let scroll_controller =
|
||||||
|
gtk::EventControllerScroll::new(gtk::EventControllerScrollFlags::BOTH_AXES);
|
||||||
|
|
||||||
|
scroll_controller.connect_scroll(|eventcontroller, _, delta_y| {
|
||||||
|
let event = eventcontroller.current_event().unwrap(); // We are inside the event handler, so it must have an event
|
||||||
|
|
||||||
|
if event
|
||||||
|
.modifier_state()
|
||||||
|
.contains(gdk::ModifierType::CONTROL_MASK)
|
||||||
|
{
|
||||||
|
let widget = eventcontroller
|
||||||
|
.widget()
|
||||||
|
.downcast::<super::GraphView>()
|
||||||
|
.unwrap();
|
||||||
|
widget.set_zoom_factor(
|
||||||
|
(widget.zoom_factor() + (0.1 * -delta_y))
|
||||||
|
.clamp(super::GraphView::ZOOM_MIN, super::GraphView::ZOOM_MAX),
|
||||||
|
);
|
||||||
|
|
||||||
|
gtk::Inhibit(true)
|
||||||
|
} else {
|
||||||
|
gtk::Inhibit(false)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
obj.add_controller(&scroll_controller);
|
||||||
|
}
|
||||||
|
|
||||||
fn snapshot_background(&self, widget: &super::GraphView, snapshot: >k::Snapshot) {
|
fn snapshot_background(&self, widget: &super::GraphView, snapshot: >k::Snapshot) {
|
||||||
// Grid size and line width during neutral zoom (factor 1.0).
|
// Grid size and line width during neutral zoom (factor 1.0).
|
||||||
const NORMAL_GRID_SIZE: f32 = 20.0;
|
const NORMAL_GRID_SIZE: f32 = 20.0;
|
||||||
|
|||||||
Reference in New Issue
Block a user