mirror of
https://gitlab.freedesktop.org/pipewire/helvum
synced 2026-03-15 11:36:11 +08:00
ui: Move view with middle mouse button.
This commit is contained in:
@@ -93,6 +93,9 @@ mod imp {
|
|||||||
// Memorized data for an in-progress zoom gesture
|
// Memorized data for an in-progress zoom gesture
|
||||||
pub zoom_gesture_initial_zoom: Cell<Option<f64>>,
|
pub zoom_gesture_initial_zoom: Cell<Option<f64>>,
|
||||||
pub zoom_gesture_anchor: Cell<Option<(f64, f64)>>,
|
pub zoom_gesture_anchor: Cell<Option<(f64, f64)>>,
|
||||||
|
|
||||||
|
// This keeps track of an ongoing move view gesture.
|
||||||
|
pub move_view_state: Cell<(f64, f64)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for GraphView {
|
impl Default for GraphView {
|
||||||
@@ -108,6 +111,7 @@ mod imp {
|
|||||||
port_drag_cursor: Cell::new(Point::new(0.0, 0.0)),
|
port_drag_cursor: Cell::new(Point::new(0.0, 0.0)),
|
||||||
zoom_gesture_initial_zoom: Default::default(),
|
zoom_gesture_initial_zoom: Default::default(),
|
||||||
zoom_gesture_anchor: Default::default(),
|
zoom_gesture_anchor: Default::default(),
|
||||||
|
move_view_state: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -136,6 +140,7 @@ mod imp {
|
|||||||
self.setup_port_drag_and_drop();
|
self.setup_port_drag_and_drop();
|
||||||
self.setup_scroll_zooming();
|
self.setup_scroll_zooming();
|
||||||
self.setup_zoom_gesture();
|
self.setup_zoom_gesture();
|
||||||
|
self.setup_move_view();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn dispose(&self) {
|
fn dispose(&self) {
|
||||||
@@ -465,6 +470,48 @@ mod imp {
|
|||||||
self.obj().add_controller(zoom_gesture);
|
self.obj().add_controller(zoom_gesture);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn setup_move_view(&self) {
|
||||||
|
let drag_controller = gtk::GestureDrag::new();
|
||||||
|
|
||||||
|
drag_controller.set_button(gtk::gdk::BUTTON_MIDDLE);
|
||||||
|
|
||||||
|
// TODO: set `all-scroll` cursor while dragging view
|
||||||
|
|
||||||
|
drag_controller.connect_drag_begin(|drag_controller, _, _| {
|
||||||
|
let widget = drag_controller
|
||||||
|
.widget()
|
||||||
|
.downcast::<super::GraphView>()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
widget.imp().move_view_state.set((0.0, 0.0));
|
||||||
|
});
|
||||||
|
|
||||||
|
drag_controller.connect_drag_update(|drag_controller, x, y| {
|
||||||
|
let widget = drag_controller
|
||||||
|
.widget()
|
||||||
|
.downcast::<super::GraphView>()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let imp = widget.imp();
|
||||||
|
let state = imp.move_view_state.replace((x, y));
|
||||||
|
let delta_x = state.0 - x;
|
||||||
|
let delta_y = state.1 - y;
|
||||||
|
|
||||||
|
let hadjustment_ref = imp.hadjustment.borrow();
|
||||||
|
let vadjustment_ref = imp.vadjustment.borrow();
|
||||||
|
let hadjustment = hadjustment_ref.as_ref().unwrap();
|
||||||
|
let vadjustment = vadjustment_ref.as_ref().unwrap();
|
||||||
|
|
||||||
|
let new_hadjustment = hadjustment.value() + delta_x;
|
||||||
|
let new_vadjustment = vadjustment.value() + delta_y;
|
||||||
|
|
||||||
|
hadjustment.set_value(new_hadjustment);
|
||||||
|
vadjustment.set_value(new_vadjustment);
|
||||||
|
});
|
||||||
|
|
||||||
|
self.obj().add_controller(drag_controller);
|
||||||
|
}
|
||||||
|
|
||||||
fn draw_link(
|
fn draw_link(
|
||||||
&self,
|
&self,
|
||||||
link_cr: &cairo::Context,
|
link_cr: &cairo::Context,
|
||||||
|
|||||||
Reference in New Issue
Block a user