Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
track.h
1// SPDX-FileCopyrightText: © 2018-2024 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#ifndef __GUI_WIDGETS_TRACK_H__
5#define __GUI_WIDGETS_TRACK_H__
6
7#include "common/utils/types.h"
8#include "gui/backend/gtk_widgets/gtk_wrapper.h"
9
10#define TRACK_WIDGET_TYPE (track_widget_get_type ())
11G_DECLARE_FINAL_TYPE (TrackWidget, track_widget, Z, TRACK_WIDGET, GtkWidget)
12
15class Track;
16class AutomationTrack;
17TYPEDEF_STRUCT_UNDERSCORED (ArrangerWidget);
18TYPEDEF_STRUCT_UNDERSCORED (MeterWidget);
19TYPEDEF_STRUCT_UNDERSCORED (TrackCanvasWidget);
20TYPEDEF_STRUCT_UNDERSCORED (FaderButtonsWidget);
21
27
29constexpr int TRACK_BUTTON_SIZE = 18;
30
32constexpr int TRACK_BUTTON_PADDING = 6;
33
36
37#define TRACK_BOT_BUTTONS_SHOULD_BE_VISIBLE(height) \
38 (height \
39 >= (TRACK_BUTTON_SIZE + TRACK_BUTTON_PADDING_FROM_EDGE) * 2 \
40 + TRACK_BUTTON_PADDING)
41
42constexpr int TRACK_COLOR_AREA_WIDTH = 18;
43
44constexpr const char * TRACK_ICON_NAME_MONO_COMPAT = "mono";
45constexpr const char * TRACK_ICON_NAME_SWAP_PHASE = "phase";
46constexpr const char * TRACK_ICON_NAME_RECORD = "media-record";
47constexpr const char * TRACK_ICON_NAME_SOLO = "solo";
48constexpr const char * TRACK_ICON_NAME_MUTE = "mute";
49constexpr const char * TRACK_ICON_NAME_LISTEN =
50 "gnome-icon-library-headphones-symbolic";
51constexpr const char * TRACK_ICON_NAME_SHOW_UI = "jam-icons-screen";
52constexpr const char * TRACK_ICON_NAME_SHOW_AUTOMATION_LANES = "automation-4p";
53constexpr const char * TRACK_ICON_NAME_SHOW_TRACK_LANES = "untitled-ui-rows-03";
54constexpr const char * TRACK_ICON_NAME_LOCK =
55 "gnome-icon-library-padlock2-symbolic";
56constexpr const char * TRACK_ICON_NAME_UNLOCK =
57 "gnome-icon-library-padlock2-open-symbolic";
58constexpr const char * TRACK_ICON_NAME_FREEZE = "fork-awesome-snowflake-o";
59constexpr const char * TRACK_ICON_NAME_PLUS = "add";
60constexpr const char * TRACK_ICON_NAME_MINUS = "remove";
61constexpr const char * TRACK_ICON_NAME_BUS = "effect";
62constexpr const char * TRACK_ICON_NAME_CHORDS = "minuet-chords";
63constexpr const char * TRACK_ICON_NAME_SHOW_MARKERS =
64 "gnome-icon-library-flag-outline-thick-symbolic";
65constexpr const char * TRACK_ICON_NAME_MIDI = "instrument";
66constexpr const char * TRACK_ICON_NAME_TEMPO = "filename-bpm-amarok";
67constexpr const char * TRACK_ICON_NAME_MODULATOR =
68 "gnome-icon-library-encoder-knob-symbolic";
69constexpr const char * TRACK_ICON_NAME_FOLD = "fluentui-folder-regular";
70constexpr const char * TRACK_ICON_NAME_FOLD_OPEN =
71 "fluentui-folder-open-regular";
72constexpr const char * TRACK_ICON_NAME_MONITOR_AUDIO = "audition";
73
74#define TRACK_ICON_IS(x, name) (x == std::string (TRACK_ICON_NAME_##name))
75
76#define TRACK_CB_ICON_IS(name) TRACK_ICON_IS (cb->icon_name, name)
77
82{
83 TRACK_WIDGET_HIGHLIGHT_NONE,
84 TRACK_WIDGET_HIGHLIGHT_TOP,
85 TRACK_WIDGET_HIGHLIGHT_BOTTOM,
86 TRACK_WIDGET_HIGHLIGHT_INSIDE,
87};
88
93{
94 TRACK_WIDGET_RESIZE_TARGET_TRACK,
95 TRACK_WIDGET_RESIZE_TARGET_AT,
96 TRACK_WIDGET_RESIZE_TARGET_LANE,
97};
98
107using TrackWidget = struct _TrackWidget
108{
109 GtkWidget parent_instance;
110
113 GtkBox * main_box;
114
116 GtkBox * group_colors_box;
117
118 GtkGestureDrag * drag;
119 GtkGestureClick * click;
120
122 GtkGestureClick * right_click;
123
125 int dragged;
126
129 int n_press;
130
139 bool bg_hovered;
140
148 bool color_area_hovered;
149
158 bool icon_hovered;
159
166 int resize;
167
169 int resizing;
170
172 TrackWidgetResizeTarget resize_target_type;
173
175 void * resize_target;
176
178 Track * track;
179
181 int ctrl_held_at_start;
182
184 GtkBox * highlight_top_box;
185 GtkBox * highlight_bot_box;
186
193 TrackWidgetHighlight highlight_loc;
194
198 int selected_in_dnd;
199
201 double start_x;
202 double start_y;
203 double last_offset_y;
204
206 double last_x;
207 double last_y;
208
210 CustomButtonWidget * last_hovered_btn;
211
214 int button_pressed;
215
217 CustomButtonWidget * clicked_button;
218
220 AutomationModeWidget * clicked_am;
221
222 TrackCanvasWidget * canvas;
223
230 // gulong record_toggle_handler_id;
231 // gulong solo_toggled_handler_id;
232 // gulong mute_toggled_handler_id;
233
235 std::vector<std::unique_ptr<CustomButtonWidget>> top_buttons;
236 std::vector<std::unique_ptr<CustomButtonWidget>> bot_buttons;
237
238 MeterWidget * meter_l;
239 MeterWidget * meter_r;
240
244 char * tooltip_text;
245
247 SteadyTimePoint last_midi_out_trigger_time;
248
250 int redraw;
251
254 bool was_armed;
255
257 cairo_t * cached_cr;
258 cairo_surface_t * cached_surface;
259
261 GtkPopoverMenu * popover_menu;
262
264 GtkPopover * track_name_popover;
265 FaderButtonsWidget * fader_buttons_for_popover;
266};
267
268const char *
269track_widget_highlight_to_str (TrackWidgetHighlight highlight);
270
277track_widget_new (Track * track);
278
282void
283track_widget_set_name (TrackWidget * self, const char * name);
284
288void
290
294void
296
300void
302
309bool
311
315void
317
322void
324
331
339void
341 TrackWidget * self,
342 gint x,
343 gint y,
344 const int highlight);
345
350int
352 TrackWidget * self,
353 ArrangerWidget * arranger,
354 int arranger_y);
355
359void
361
365void
367
369track_widget_get_hovered_button (TrackWidget * self, int x, int y);
370
372track_widget_get_hovered_am_widget (TrackWidget * self, int x, int y);
373
374AutomationTrack *
375track_widget_get_at_at_y (TrackWidget * self, double y);
376
380
381#endif
Custom button group to be drawn inside drawing areas.
Custom button to be drawn inside drawing areas.
bool track_widget_is_cursor_in_range_select_half(TrackWidget *self, double y)
Returns if cursor is in the range select "half".
void track_widget_on_record_toggled(TrackWidget *self)
Callback when record button is toggled.
void track_widget_set_name(TrackWidget *self, const char *name)
Sets the Track name on the TrackWidget.
void track_widget_update_icons(TrackWidget *self)
Updates the track icons.
TrackWidgetHighlight track_widget_get_highlight_location(TrackWidget *self, int y)
Returns the highlight location based on y relative to self.
constexpr int TRACK_BUTTON_PADDING_FROM_EDGE
Padding between the track edges and the buttons.
Definition track.h:35
struct _ArrangerWidget { GtkWidget parent_instance; ArrangerWidgetType type; GtkGestureDrag * drag; GtkGestureClick * click; GtkGestureClick * right_click; GtkEventControllerMotion *motion_controller; double last_offset_x; double last_offset_y; double offset_x_from_scroll; double offset_y_from_scroll; UiOverlayAction action; double start_x; double start_y; double start_pos_px; bool drag_update_started; std::unique_ptr< Position > earliest_obj_start_pos; Position fade_pos_at_start; std::unique_ptr< ArrangerObject > start_object; std::weak_ptr< ArrangerObject > prj_start_object; std::weak_ptr< ArrangerObject > hovered_object; bool start_object_was_selected; std::unique_ptr< ArrangerSelections > sel_at_start; std::unique_ptr< Region > region_at_start; std::unique_ptr< ArrangerSelections > sel_to_delete; Position start_pos; bool was_paused; Position playhead_pos_at_start; double curr_ticks_diff_from_start; double adj_ticks_diff; double last_adj_ticks_diff; Position curr_pos; Position end_pos; gboolean key_is_pressed; double hover_x; double hover_y; bool hovered; int n_press; std::shared_ptr< SnapGrid > snap_grid; int shift_held; int ctrl_held; int alt_held; gint64 last_frame_time; int visible_track_diff; int lane_diff; int visible_at_diff; int is_pinned; int resizing_range; int resizing_range_start; AutomationTrack *hovered_at; TrackLane * hovered_lane; Track * hovered_track; GdkTexture *symbolic_link_texture; GdkTexture *music_note_16th_texture; GdkTexture *fork_awesome_snowflake_texture; GdkTexture *media_playlist_repeat_texture; int region_icon_texture_size; GskRenderNode *loop_line_node; GskRenderNode *clip_start_line_node; GskRenderNode *cut_line_node; int hovered_note; int start_vel_val; int vel_diff; int hovered_chord_index; float fval_at_start; double dval_at_start; int last_playhead_px; bool redraw; graphene_rect_t last_rect; bool can_link; bool is_highlighted; GdkRectangle highlight_rect; GdkRectangle last_selection_rect; guint drag_start_btn; bool first_draw; double new_hadj_val; Transport::Display ruler_display; PangoLayoutUniquePtr vel_layout; PangoLayoutUniquePtr ap_layout; PangoLayoutUniquePtr audio_layout; PangoLayoutUniquePtr debug_layout; int queued_playhead_px; GtkPopoverMenu *popover_menu; guint unlisten_notes_timeout_id;} ArrangerWidget
A canvas widget for drawing and interacting with arranger objects.
Definition arranger.h:95
TrackWidgetHighlight
Highlight location.
Definition track.h:82
void track_widget_update_size(TrackWidget *self)
Updates the full track size and redraws the track.
void track_widget_on_show_lanes_toggled(TrackWidget *self)
Callback when automation button is toggled.
TrackWidgetResizeTarget
Resize target.
Definition track.h:93
constexpr int TRACK_BUTTON_SIZE
Button size.
Definition track.h:29
void track_widget_recreate_group_colors(TrackWidget *self)
Re-fills TrackWidget.group_colors_box.
void track_widget_on_show_automation_toggled(TrackWidget *self)
Callback when automation button is toggled.
void track_widget_do_highlight(TrackWidget *self, gint x, gint y, const int highlight)
Highlights/unhighlights the Tracks appropriately.
constexpr int TRACK_BUTTON_PADDING
Padding between each button.
Definition track.h:32
void track_widget_redraw_meters(TrackWidget *self)
Causes a redraw of the meters only.
int track_widget_get_local_y(TrackWidget *self, ArrangerWidget *arranger, int arranger_y)
Converts Y from the arranger coordinates to the track coordinates.
struct _TrackWidget { GtkWidget parent_instance; GtkBox *main_box; GtkBox *group_colors_box; GtkGestureDrag * drag; GtkGestureClick *click; GtkGestureClick *right_click; int dragged; int n_press; bool bg_hovered; bool color_area_hovered; bool icon_hovered; int resize; int resizing; TrackWidgetResizeTarget resize_target_type; void *resize_target; Track *track; int ctrl_held_at_start; GtkBox *highlight_top_box; GtkBox *highlight_bot_box; TrackWidgetHighlight highlight_loc; int selected_in_dnd; double start_x; double start_y; double last_offset_y; double last_x; double last_y; CustomButtonWidget *last_hovered_btn; int button_pressed; CustomButtonWidget *clicked_button; AutomationModeWidget *clicked_am; TrackCanvasWidget *canvas; std::vector< std::unique_ptr< CustomButtonWidget > > top_buttons; std::vector< std::unique_ptr< CustomButtonWidget > > bot_buttons; MeterWidget *meter_l; MeterWidget *meter_r; char *tooltip_text; SteadyTimePoint last_midi_out_trigger_time; int redraw; bool was_armed; cairo_t * cached_cr; cairo_surface_t *cached_surface; GtkPopoverMenu *popover_menu; GtkPopover * track_name_popover; FaderButtonsWidget *fader_buttons_for_popover;} TrackWidget
The TrackWidget is split into 3 parts.
Definition track.h:107
TrackWidget * track_widget_new(Track *track)
Sets up the track widget.