Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions src/imp/imp_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,20 @@ void ImpLayer::add_view_angle_actions()
false);
box->pack_start(*view_angle_button, true, true, 0);

gesture_rotate = Gtk::GestureRotate::create(*canvas);
gesture_rotate->signal_begin().connect([this](GdkEventSequence *seq) { gesture_rotate_angle_orig = view_angle; });
gesture_rotate->signal_update().connect([this](GdkEventSequence *seq) {
auto angle = gesture_rotate_angle_orig - angle_from_rad(gesture_rotate->get_angle_delta());
constexpr int snap_points[] = {0, 16384, 32768, 49152, 65536};
for (int p : snap_points) {
if (std::abs(angle - p) < (preferences.zoom.touchpad_rotate_snap_threshold * 65536) / 360) {
angle = p;
break;
}
}
set_view_angle(angle);
});

auto right_button = Gtk::manage(new Gtk::Button);
right_button->set_image_from_icon_name("object-rotate-right-symbolic");
right_button->signal_clicked().connect([this] { trigger_action(ActionID::ROTATE_VIEW_RIGHT); });
Expand Down
2 changes: 2 additions & 0 deletions src/imp/imp_layer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ class ImpLayer : public ImpBase {
void set_view_angle(int angle);
Gtk::Label *view_angle_label = nullptr;
Gtk::Button *view_angle_button = nullptr;
Glib::RefPtr<Gtk::GestureRotate> gesture_rotate;
int gesture_rotate_angle_orig = 1;

class ViewAngleWindow *view_angle_window = nullptr;
sigc::connection view_angle_window_conn;
Expand Down
19 changes: 19 additions & 0 deletions src/pool-prj-mgr/preferences/preferences_window_misc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,25 @@ MiscPreferencesEditor::MiscPreferencesEditor(Preferences &prefs) : preferences(p
preferences, preferences.zoom.touchpad_pan));
gr->add_row(*r);
}

{
auto r = Gtk::manage(new PreferencesRowNumeric<int>(
"Touchpad rotate snap threshold",
"How aggressively to snap to 90-degree angles when rotating with touchpad gestures", preferences,
preferences.zoom.touchpad_rotate_snap_threshold));
auto &sp = r->get_spinbutton();
sp.set_range(0, 360);
sp.set_increments(1, 1);
sp.set_width_chars(5);
sp.set_alignment(1);
sp.signal_output().connect([&sp] {
int v = sp.get_value_as_int();
sp.set_text(std::to_string(v) + " °");
return true;
});
r->bind();
gr->add_row(*r);
}
{
auto r = Gtk::manage(new PreferencesRowBoolButton("Keyboard zoom center", "Where to zoom in using keyboard",
"Cursor", "Screen center", preferences,
Expand Down
2 changes: 2 additions & 0 deletions src/preferences/preferences.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ json ZoomPreferences::serialize() const
j["smooth_zoom_3d"] = smooth_zoom_3d;
j["touchpad_pan"] = touchpad_pan;
j["zoom_factor"] = zoom_factor;
j["touchpad_rotate_snap_threshold"] = touchpad_rotate_snap_threshold;
j["keyboard_zoom_to_cursor"] = keyboard_zoom_to_cursor;
return j;
}
Expand All @@ -225,6 +226,7 @@ void ZoomPreferences::load_from_json(const json &j)
smooth_zoom_3d = j.value("smooth_zoom_3d", false);
touchpad_pan = j.value("touchpad_pan", false);
zoom_factor = j.value("zoom_factor", 50);
touchpad_rotate_snap_threshold = j.value("touchpad_rotate_snap_threshold", 15);
keyboard_zoom_to_cursor = j.value("keyboard_zoom_to_cursor", false);
}

Expand Down
1 change: 1 addition & 0 deletions src/preferences/preferences.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ class ZoomPreferences {
bool smooth_zoom_3d = false;
bool touchpad_pan = false;
float zoom_factor = 50;
int touchpad_rotate_snap_threshold = 15;
bool keyboard_zoom_to_cursor = false;

void load_from_json(const json &j);
Expand Down