Zrythm
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
track.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: © 2018-2024 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
10#ifndef __GUI_WIDGETS_TRACK_H__
11#define __GUI_WIDGETS_TRACK_H__
12
13#include <stdbool.h>
14
15#include <gtk/gtk.h>
16
17#define TRACK_WIDGET_TYPE (track_widget_get_type ())
18G_DECLARE_FINAL_TYPE (TrackWidget, track_widget, Z, TRACK_WIDGET, GtkWidget)
19
20typedef struct _ArrangerWidget ArrangerWidget;
23typedef struct _MeterWidget MeterWidget;
24typedef struct Track Track;
25typedef struct _TrackCanvasWidget TrackCanvasWidget;
26TYPEDEF_STRUCT_UNDERSCORED (FaderButtonsWidget);
27
34#define TRACK_BUTTON_SIZE 18
35
37#define TRACK_BUTTON_PADDING 6
38
41#define TRACK_BUTTON_PADDING_FROM_EDGE 3
42
43#define TRACK_BOT_BUTTONS_SHOULD_BE_VISIBLE(height) \
44 (height \
45 >= (TRACK_BUTTON_SIZE + TRACK_BUTTON_PADDING_FROM_EDGE) * 2 \
46 + TRACK_BUTTON_PADDING)
47
48#define TRACK_COLOR_AREA_WIDTH 18
49
50#define TRACK_ICON_NAME_MONO_COMPAT "mono"
51#define TRACK_ICON_NAME_SWAP_PHASE "phase"
52#define TRACK_ICON_NAME_RECORD "media-record"
53#define TRACK_ICON_NAME_SOLO "solo"
54#define TRACK_ICON_NAME_MUTE "mute"
55#define TRACK_ICON_NAME_LISTEN "gnome-icon-library-headphones-symbolic"
56#define TRACK_ICON_NAME_SHOW_UI "jam-icons-screen"
57#define TRACK_ICON_NAME_SHOW_AUTOMATION_LANES "automation-4p"
58#define TRACK_ICON_NAME_SHOW_TRACK_LANES "untitled-ui-rows-03"
59#define TRACK_ICON_NAME_LOCK "gnome-icon-library-padlock2-symbolic"
60#define TRACK_ICON_NAME_UNLOCK "gnome-icon-library-padlock2-open-symbolic"
61#define TRACK_ICON_NAME_FREEZE "fork-awesome-snowflake-o"
62#define TRACK_ICON_NAME_PLUS "add"
63#define TRACK_ICON_NAME_MINUS "remove"
64#define TRACK_ICON_NAME_BUS "effect"
65#define TRACK_ICON_NAME_CHORDS "minuet-chords"
66#define TRACK_ICON_NAME_SHOW_MARKERS \
67 "gnome-icon-library-flag-outline-thick-symbolic"
68#define TRACK_ICON_NAME_MIDI "instrument"
69#define TRACK_ICON_NAME_TEMPO "filename-bpm-amarok"
70#define TRACK_ICON_NAME_MODULATOR "gnome-icon-library-encoder-knob-symbolic"
71#define TRACK_ICON_NAME_FOLD "fluentui-folder-regular"
72#define TRACK_ICON_NAME_FOLD_OPEN "fluentui-folder-open-regular"
73#define TRACK_ICON_NAME_MONITOR_AUDIO "audition"
74
75#define TRACK_ICON_IS(x, name) (string_is_equal (x, TRACK_ICON_NAME_##name))
76
77#define TRACK_CB_ICON_IS(name) TRACK_ICON_IS (cb->icon_name, name)
78
83{
84 TRACK_WIDGET_HIGHLIGHT_NONE,
85 TRACK_WIDGET_HIGHLIGHT_TOP,
86 TRACK_WIDGET_HIGHLIGHT_BOTTOM,
87 TRACK_WIDGET_HIGHLIGHT_INSIDE,
89
94{
95 TRACK_WIDGET_RESIZE_TARGET_TRACK,
96 TRACK_WIDGET_RESIZE_TARGET_AT,
97 TRACK_WIDGET_RESIZE_TARGET_LANE,
99
108typedef struct _TrackWidget
109{
110 GtkWidget parent_instance;
111
114 GtkBox * main_box;
115
118
119 GtkGestureDrag * drag;
120 GtkGestureClick * click;
121
123 GtkGestureClick * right_click;
124
127
131
141
150
160
168
171
174
177
180
183
186 GtkBox * highlight_bot_box;
187
195
200
202 double start_x;
203 double start_y;
204 double last_offset_y;
205
207 double last_x;
208 double last_y;
209
212
216
219
222
223 TrackCanvasWidget * canvas;
224
231 // gulong record_toggle_handler_id;
232 // gulong solo_toggled_handler_id;
233 // gulong mute_toggled_handler_id;
234
236 CustomButtonWidget * top_buttons[8];
237 int num_top_buttons;
238 CustomButtonWidget * bot_buttons[8];
239 int num_bot_buttons;
240
241 MeterWidget * meter_l;
242 MeterWidget * meter_r;
243
248
252
255
259
261 cairo_t * cached_cr;
262 cairo_surface_t * cached_surface;
263
265 GtkPopoverMenu * popover_menu;
266
268 GtkPopover * track_name_popover;
269 FaderButtonsWidget * fader_buttons_for_popover;
271
272const char *
273track_widget_highlight_to_str (TrackWidgetHighlight highlight);
274
282
286void
287track_widget_set_name (TrackWidget * self, const char * name);
288
292void
294
298void
300
304void
306
313bool
315
319void
321
326void
328
335
343void
345 TrackWidget * self,
346 gint x,
347 gint y,
348 const int highlight);
349
354int
356 TrackWidget * self,
357 ArrangerWidget * arranger,
358 int arranger_y);
359
363void
365
369void
371
373track_widget_get_hovered_button (TrackWidget * self, int x, int y);
374
376track_widget_get_hovered_am_widget (TrackWidget * self, int x, int y);
377
379track_widget_get_at_at_y (TrackWidget * self, double y);
380
385#endif
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.
TrackWidgetHighlight
Highlight location.
Definition track.h:83
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:94
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.
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.
TrackWidget * track_widget_new(Track *track)
Sets up the track widget.
The arranger widget is a canvas that draws all the arranger objects it contains.
Definition arranger.h:108
Custom button group to be drawn inside drawing areas.
Custom button to be drawn inside drawing areas.
The TrackWidget is split into 3 parts.
Definition track.h:109
TrackWidgetResizeTarget resize_target_type
Resize target type (track/at/lane).
Definition track.h:173
int dragged
If drag update was called at least once.
Definition track.h:126
int resize
Set when the drag should resize instead of dnd.
Definition track.h:167
GtkBox * main_box
Main box containing the drawing area and the meters on the right.
Definition track.h:114
GtkPopover * track_name_popover
Popover for changing the track name.
Definition track.h:268
GtkBox * group_colors_box
Group colors.
Definition track.h:117
CustomButtonWidget * last_hovered_btn
Last hovered button.
Definition track.h:211
gint64 last_midi_out_trigger_time
Last MIDI event trigger time, for MIDI ports.
Definition track.h:251
int selected_in_dnd
The track selection processing was done in the dnd callbacks, so no need to do it in drag_end.
Definition track.h:199
double last_x
Used during hovering to remember the last known cursor position.
Definition track.h:207
int ctrl_held_at_start
Control held down on drag begin.
Definition track.h:182
TrackWidgetHighlight highlight_loc
Highlight location.
Definition track.h:194
double start_x
For drag actions.
Definition track.h:202
bool icon_hovered
Whether the icon in the color area is currently hoverred.
Definition track.h:159
Track * track
Associated Track.
Definition track.h:179
GtkPopoverMenu * popover_menu
Popover to be reused for context menus.
Definition track.h:265
bool color_area_hovered
Whether color area is currently hoverred.
Definition track.h:149
GtkGestureClick * right_click
Right-click gesture.
Definition track.h:123
bool bg_hovered
Set between enter-leave signals.
Definition track.h:140
GtkBox * highlight_top_box
Used for highlighting.
Definition track.h:185
int redraw
Set to 1 to redraw.
Definition track.h:254
int resizing
Set during the whole resizing action.
Definition track.h:170
int button_pressed
Used when mouse button is held down to mark buttons as clicked.
Definition track.h:215
bool was_armed
Whether the track was armed for recording at the start of the current action.
Definition track.h:258
CustomButtonWidget * clicked_button
Currently clicked button.
Definition track.h:218
void * resize_target
The object to resize.
Definition track.h:176
cairo_t * cached_cr
Cairo caches.
Definition track.h:261
int n_press
Number of clicks, used when selecting/moving/ dragging channels.
Definition track.h:130
AutomationModeWidget * clicked_am
Currently clicked automation mode button.
Definition track.h:221
char * tooltip_text
Current tooltip text.
Definition track.h:247
Track to be inserted into the Project's Tracklist.
Definition track.h:177