Commit Graph

38230 Commits

Author SHA1 Message Date
1ec966d964 launchpad pro: allow clear+cue buttons to ... clear a cue 2023-09-06 14:46:24 -06:00
68678aa957 triggerbox: add API to clear a cue (row) 2023-09-06 14:46:24 -06:00
da4d2a645f
remove tempo-mapping bar, tempo_meta group. this reverts 8fbf2c and related 2023-09-06 19:31:00 +02:00
784d2ecce4
Add the tool for Grid, and accompanying buttons and event-handling 2023-09-06 19:30:56 +02:00
268d1d33c7
Add invisible Rectangle to initiates Tempo(grid) drags 2023-09-06 19:14:14 +02:00
f339236c5b
Add icon for the Grid tool 2023-09-06 19:13:59 +02:00
80a813ff1c
Fix use-after-free when undoing marker creation
Create a marker by ctrl-click, hover over it and then ctrl+z
undo. This used to crash in Editor::get_preferred_edit_position()
gtk2_ardour/editor.cc:5179, checking for entered_marker->position()
2023-09-06 17:37:11 +02:00
c2ce0bcb4a
Amend 101744b8, allow when and start to point to the same variable 2023-09-06 01:01:30 +02:00
3851a93e39
Update selection-markers on track and time selection 2023-09-06 00:02:36 +02:00
10ff5ad599
Use section delete for Editor::Delete operation 2023-09-06 00:02:31 +02:00
6e87a46ba4
convention for selection (as used on track headers) is red border, red tint 2023-09-05 23:08:30 +02:00
29430ac550
NO-OP: clang-format 2023-09-05 23:08:30 +02:00
68ccbc8ac3
Arrangement: locate on double-click 2023-09-05 23:08:30 +02:00
e5e40c751f
if user moves selection markers, convert selection to a timeline section 2023-09-05 23:08:30 +02:00
4217a68852
Arranger: implement bi-directional selection 2023-09-05 23:08:30 +02:00
5ceb66c902
Arranger: allow renaming by context-menu 2023-09-05 23:08:29 +02:00
101744b812
Add method to find a section location by position 2023-09-05 23:08:29 +02:00
5c888f2b90
Fix deadlock when cut/pasting section to itself 2023-09-05 23:08:29 +02:00
5223d05854 launchpad pro: various improvements and fixes 2023-09-04 19:41:25 -06:00
269699c340 temporal: fix get_grid() to work in the presence of "weird" BBT markers 2023-09-04 19:41:25 -06:00
13bdfda81a temporal: add Meter::round_up_to_beat_div()
reimplement round_up_to_beat() in terms of round_up_to_beat_div()
2023-09-04 19:41:25 -06:00
f1f5df7c9a temporal: add BBT_Time::round_up_to_beat_div() 2023-09-04 19:41:25 -06:00
7c5e7ddf59 temporal: improve operator<<() for MusicTimePoint (BBT markers) 2023-09-04 19:41:25 -06:00
cf9f9db48b
Set length of new percussive hits to 1 tick
This prevents overlap of successive hits.

Ardour 7 added a new duration select drop-down menu,
which defaults to "Auto" (musical grid) and removed
the special case when drawing percussive notes.
It was possible to accidentally create overlapping notes,
without the user being aware of doing so.
2023-09-04 23:26:54 +02:00
7d95334c0d fix thinko in e53a7 which resulted in unmatched tempo-map UNDO transactions 2023-09-04 08:48:49 -05:00
774adfb33c
Fix rounding of arrangement markers 2023-09-01 21:53:26 +02:00
a6844279ad arranger-treeview 'search' function was stealing keybd events 2023-09-01 07:18:22 -05:00
0d89bc5789 fix height of tempo ruler curve elements
These were being drawn in a way that failed to really convey relative
tempos very well. This is now better, though perhaps there are other
improvements possible
2023-08-31 18:25:18 -06:00
0266d98a3b temporal: add TempoMap::{max,min}_notes_per_minute() API 2023-08-31 18:23:40 -06:00
cda0d6ce9f temporal: fix totally broken implementation of TempoMap::shift (timepos...) 2023-08-31 18:22:59 -06:00
c778a6df67 ripple backwards when cutting a section 2023-08-31 18:22:25 -06:00
69cfe9d3f9 add missing ripple during cut/copy/paste of sections 2023-08-31 18:21:56 -06:00
da9140a390 polish the way we print tempo numerics in tempo ruler 2023-08-31 10:34:48 -06:00
43d6d4187c display tempo with only 1 digit of decimals 2023-08-31 10:34:48 -06:00
4969fb9e0b libpbd: tweak for printing pthread ID (windows is int/*nix is ptr) 2023-08-31 10:34:48 -06:00
b5b4be96e3
Use "Arrangement" in GUI instead of Section (amend 2f6a0abf) 2023-08-31 16:12:50 +02:00
1bc795509b
Use "Arrangement" in GUI instead of Section (amend 2f6a0abf) 2023-08-31 05:29:29 +02:00
b162ffbca8
Clear Arrangement rects when closing a session 2023-08-31 00:58:51 +02:00
c4cb8dbda9 arithmetic simplification 2023-08-30 16:07:48 -06:00
864b660abe lppro: working send faders, some work on color & pulse for select buttons 2023-08-30 16:06:14 -06:00
e664acc16e lppro: working pan fader controls 2023-08-30 16:06:14 -06:00
75802cc47b lppro: momentary mode for all fader layouts 2023-08-30 16:06:14 -06:00
ee0d5cfc40 lppro: working gain faders 2023-08-30 16:06:14 -06:00
bc7f25e52c libpbd: AbstractUI must call & destroy sigc::trackable callbacks in its destructor
AbstractUI IS-A BaseUI IS-A EventLoop
                       IS-A sigc::trackable

If we have sent a call_slot() request to an EventLoop that has not executed
when the object involved in the call_slot() functor is destroyed, we need to
ensure that the request is invalidated.

To do this, We register "notify" callbacks with the sigc::trackable that is a
base class of the object involved in the functor given to
call_slot(). sigc::trackable will call these "notify" callbacks from its
destructor.

So when the call_slot() functor's relevant object dies, and its sigc::trackable
base class is destroyed, it will invoke all of its the "notify" callbacks, which will
in turn call EventLoop::invalidate_request() and this hopefully marks all the
queued call_slot() functors as "do not call".

However, invalidate_request() requires a lock, and access to the lock is
granted via a pure virtual, EventLoop::slot_invalidation_lock(). In the
heirarchy cited above, this is implemented by AbstractUI.

When we destroy an AbstractUI, ~AbstractUI() is called first, and this destroys
the lock and changes the VTT so that ::slot_invalidation_lock() becomes a pure
virtual again.

Eventually we will call ~trackable() which in turns runs all the "notify"
callbacks, and then removes them. But when these callbacks end up in
EventLoop::invalidate_request(), we try to call ::slot_invalidation_lock() and
C++ will abort because of its (now) pure virtual status.

Therefore, we must invoke the "notify" callbacks before the
::slot_invalidation_lock() becomes pure, and that means inside ~AbstractUI, as
an explicit call to trackable::notify_callbacks().

This has not appeared before (remarkably), but became an issue when the
Launchpad Pro support code's main object (derived from MIDISurface and hence
from AbstractUI) "failed" to use sub-objects for its various methods. So when
it connects to, for example, the Session::RouteAddedOrRemoved signal, it is
connecting itself (derived from a sigc::trackable). When the Launchpad Pro
object is destroyed, it tries to invalidate all the call_slot() requests, but
this requires access to an event loop lock - owned by the Launchpad Pro event
loop, which is already destroyed!

Other surfaces have generally avoided this by using other objects to provide
methods of dealing with signals from libardour objects.
2023-08-30 16:06:14 -06:00
187557df57 midi surfaces: use an event loop invalidator for call_slot() 2023-08-30 16:06:14 -06:00
d5ad9ff033 libpbd/guis: move __invalidator() into PBD::EventLoop
we allow use of/dependency on sigc::trackable there, so this is
both legal but also sensible.

Leave the macro definition of invalidator(x) in gtkmm2ext/gui_thread.h
because it doesn't hurt and makes some sense for it to be there. No
reason for a source module that needs invalidator(x) to load EventLoop
decl.
2023-08-30 16:06:14 -06:00
f5f48b421e lppro: get long press working, add undo/redo/metronome 2023-08-30 16:06:14 -06:00
9ee7c33737 lppro: solo, mute, rec-enable basics 2023-08-30 16:06:14 -06:00
a6e9d6ecd1 lppro: fix selection button color when "off" 2023-08-30 16:06:14 -06:00
784fa82081 lppro: selection enabled and displayed 2023-08-30 16:06:13 -06:00