summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2025-12-23 21:59:01 +0100
committerCarl Hetherington <cth@carlh.net>2025-12-23 21:59:01 +0100
commitbef268517ad3857956644500b5f4f6bad306c4be (patch)
treea1e566e53b8f39b73b662ec9bc798bcee37cdf13 /src
parentc9742fc2ecffeca8a7283684ed89a8d405a52a09 (diff)
Adjust selection logic a bit, and tidy it up.
Diffstat (limited to 'src')
-rw-r--r--src/wx/content_timeline.cc73
1 files changed, 38 insertions, 35 deletions
diff --git a/src/wx/content_timeline.cc b/src/wx/content_timeline.cc
index 52e0cb8ca..aef560eab 100644
--- a/src/wx/content_timeline.cc
+++ b/src/wx/content_timeline.cc
@@ -568,59 +568,62 @@ ContentTimeline::left_down_select(wxMouseEvent& ev)
auto content_view = dynamic_pointer_cast<TimelineContentView>(view);
_down_view.reset ();
-
- if (content_view) {
- _down_view = content_view;
- _down_view_position = content_view->content()->position ();
- }
+ _first_move = false;
if (dynamic_pointer_cast<TimelineTimeAxisView>(view)) {
+ /* Seek when clicking in the time axis */
int vsx, vsy;
_main_canvas->GetViewStart(&vsx, &vsy);
_viewer.seek(DCPTime::from_seconds((ev.GetPosition().x + vsx * _x_scroll_rate) / _pixels_per_second.get_value_or(1)), true);
}
- for (auto i: _views) {
- auto cv = dynamic_pointer_cast<TimelineContentView>(i);
- if (!cv) {
- continue;
- }
-
- if (!ev.ShiftDown ()) {
- cv->set_selected (view == i);
+ if (!content_view) {
+ /* Click outside all content selects none */
+ for (auto i: _views) {
+ if (auto cv = dynamic_pointer_cast<TimelineContentView>(i)) {
+ cv->set_selected(false);
+ }
}
+ return;
}
- if (content_view && ev.ShiftDown ()) {
- content_view->set_selected (!content_view->selected ());
- }
-
- _first_move = false;
+ _down_view = content_view;
+ _down_view_position = content_view->content()->position ();
- if (_down_view) {
- /* Pre-compute the points that we might snap to */
+ if (ev.ShiftDown()) {
+ /* Toggle */
+ content_view->set_selected (!content_view->selected ());
+ } else if (!content_view->selected()) {
+ /* Select one */
for (auto i: _views) {
- auto cv = dynamic_pointer_cast<TimelineContentView>(i);
- if (!cv || cv == _down_view || cv->content() == _down_view->content()) {
- continue;
+ if (auto cv = dynamic_pointer_cast<TimelineContentView>(i)) {
+ cv->set_selected(view == i);
}
+ }
+ }
+
+ /* Pre-compute the points that we might snap to */
+ for (auto i: _views) {
+ auto cv = dynamic_pointer_cast<TimelineContentView>(i);
+ if (!cv || cv == _down_view || cv->content() == _down_view->content()) {
+ continue;
+ }
- auto film = _film.lock ();
- DCPOMATIC_ASSERT (film);
+ auto film = _film.lock ();
+ DCPOMATIC_ASSERT (film);
- _start_snaps.push_back (cv->content()->position());
- _end_snaps.push_back (cv->content()->position());
- _start_snaps.push_back (cv->content()->end(film));
- _end_snaps.push_back (cv->content()->end(film));
+ _start_snaps.push_back (cv->content()->position());
+ _end_snaps.push_back (cv->content()->position());
+ _start_snaps.push_back (cv->content()->end(film));
+ _end_snaps.push_back (cv->content()->end(film));
- for (auto i: cv->content()->reel_split_points(film)) {
- _start_snaps.push_back (i);
- }
+ for (auto i: cv->content()->reel_split_points(film)) {
+ _start_snaps.push_back (i);
}
-
- /* Tell everyone that things might change frequently during the drag */
- _down_view->content()->set_change_signals_frequent (true);
}
+
+ /* Tell everyone that things might change frequently during the drag */
+ _down_view->content()->set_change_signals_frequent (true);
}