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 "gtk_wrapper.h"
14
15#define TRACK_WIDGET_TYPE (track_widget_get_type ())
16G_DECLARE_FINAL_TYPE (TrackWidget, track_widget, Z, TRACK_WIDGET, GtkWidget)
17
18typedef struct _ArrangerWidget ArrangerWidget;
21typedef struct _MeterWidget MeterWidget;
22typedef struct Track Track;
23typedef struct _TrackCanvasWidget TrackCanvasWidget;
24TYPEDEF_STRUCT_UNDERSCORED (FaderButtonsWidget);
25
32#define TRACK_BUTTON_SIZE 18
33
35#define TRACK_BUTTON_PADDING 6
36
39#define TRACK_BUTTON_PADDING_FROM_EDGE 3
40
41#define TRACK_BOT_BUTTONS_SHOULD_BE_VISIBLE(height) \
42 (height \
43 >= (TRACK_BUTTON_SIZE + TRACK_BUTTON_PADDING_FROM_EDGE) * 2 \
44 + TRACK_BUTTON_PADDING)
45
46#define TRACK_COLOR_AREA_WIDTH 18
47
48#define TRACK_ICON_NAME_MONO_COMPAT "mono"
49#define TRACK_ICON_NAME_SWAP_PHASE "phase"
50#define TRACK_ICON_NAME_RECORD "media-record"
51#define TRACK_ICON_NAME_SOLO "solo"
52#define TRACK_ICON_NAME_MUTE "mute"
53#define TRACK_ICON_NAME_LISTEN "gnome-icon-library-headphones-symbolic"
54#define TRACK_ICON_NAME_SHOW_UI "jam-icons-screen"
55#define TRACK_ICON_NAME_SHOW_AUTOMATION_LANES "automation-4p"
56#define TRACK_ICON_NAME_SHOW_TRACK_LANES "untitled-ui-rows-03"
57#define TRACK_ICON_NAME_LOCK "gnome-icon-library-padlock2-symbolic"
58#define TRACK_ICON_NAME_UNLOCK "gnome-icon-library-padlock2-open-symbolic"
59#define TRACK_ICON_NAME_FREEZE "fork-awesome-snowflake-o"
60#define TRACK_ICON_NAME_PLUS "add"
61#define TRACK_ICON_NAME_MINUS "remove"
62#define TRACK_ICON_NAME_BUS "effect"
63#define TRACK_ICON_NAME_CHORDS "minuet-chords"
64#define TRACK_ICON_NAME_SHOW_MARKERS \
65 "gnome-icon-library-flag-outline-thick-symbolic"
66#define TRACK_ICON_NAME_MIDI "instrument"
67#define TRACK_ICON_NAME_TEMPO "filename-bpm-amarok"
68#define TRACK_ICON_NAME_MODULATOR "gnome-icon-library-encoder-knob-symbolic"
69#define TRACK_ICON_NAME_FOLD "fluentui-folder-regular"
70#define TRACK_ICON_NAME_FOLD_OPEN "fluentui-folder-open-regular"
71#define TRACK_ICON_NAME_MONITOR_AUDIO "audition"
72
73#define TRACK_ICON_IS(x, name) (string_is_equal (x, TRACK_ICON_NAME_##name))
74
75#define TRACK_CB_ICON_IS(name) TRACK_ICON_IS (cb->icon_name, name)
76
81{
82 TRACK_WIDGET_HIGHLIGHT_NONE,
83 TRACK_WIDGET_HIGHLIGHT_TOP,
84 TRACK_WIDGET_HIGHLIGHT_BOTTOM,
85 TRACK_WIDGET_HIGHLIGHT_INSIDE,
86};
87
92{
93 TRACK_WIDGET_RESIZE_TARGET_TRACK,
94 TRACK_WIDGET_RESIZE_TARGET_AT,
95 TRACK_WIDGET_RESIZE_TARGET_LANE,
96};
97
106typedef struct _TrackWidget
107{
108 GtkWidget parent_instance;
109
112 GtkBox * main_box;
113
116
117 GtkGestureDrag * drag;
118 GtkGestureClick * click;
119
121 GtkGestureClick * right_click;
122
125
129
139
148
158
166
169
172
175
178
181
184 GtkBox * highlight_bot_box;
185
193
198
200 double start_x;
201 double start_y;
202 double last_offset_y;
203
205 double last_x;
206 double last_y;
207
210
214
217
220
221 TrackCanvasWidget * canvas;
222
229 // gulong record_toggle_handler_id;
230 // gulong solo_toggled_handler_id;
231 // gulong mute_toggled_handler_id;
232
234 CustomButtonWidget * top_buttons[8];
235 int num_top_buttons;
236 CustomButtonWidget * bot_buttons[8];
237 int num_bot_buttons;
238
239 MeterWidget * meter_l;
240 MeterWidget * meter_r;
241
246
250
253
257
259 cairo_t * cached_cr;
260 cairo_surface_t * cached_surface;
261
263 GtkPopoverMenu * popover_menu;
264
266 GtkPopover * track_name_popover;
267 FaderButtonsWidget * fader_buttons_for_popover;
269
270const char *
271track_widget_highlight_to_str (TrackWidgetHighlight highlight);
272
280
284void
285track_widget_set_name (TrackWidget * self, const char * name);
286
290void
292
296void
298
302void
304
311bool
313
317void
319
324void
326
333
341void
343 TrackWidget * self,
344 gint x,
345 gint y,
346 const int highlight);
347
352int
354 TrackWidget * self,
355 ArrangerWidget * arranger,
356 int arranger_y);
357
361void
363
367void
369
371track_widget_get_hovered_button (TrackWidget * self, int x, int y);
372
374track_widget_get_hovered_am_widget (TrackWidget * self, int x, int y);
375
377track_widget_get_at_at_y (TrackWidget * self, double y);
378
383#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:81
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:92
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:107
TrackWidgetResizeTarget resize_target_type
Resize target type (track/at/lane).
Definition track.h:171
int dragged
If drag update was called at least once.
Definition track.h:124
int resize
Set when the drag should resize instead of dnd.
Definition track.h:165
GtkBox * main_box
Main box containing the drawing area and the meters on the right.
Definition track.h:112
GtkPopover * track_name_popover
Popover for changing the track name.
Definition track.h:266
GtkBox * group_colors_box
Group colors.
Definition track.h:115
CustomButtonWidget * last_hovered_btn
Last hovered button.
Definition track.h:209
gint64 last_midi_out_trigger_time
Last MIDI event trigger time, for MIDI ports.
Definition track.h:249
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:197
double last_x
Used during hovering to remember the last known cursor position.
Definition track.h:205
int ctrl_held_at_start
Control held down on drag begin.
Definition track.h:180
TrackWidgetHighlight highlight_loc
Highlight location.
Definition track.h:192
double start_x
For drag actions.
Definition track.h:200
bool icon_hovered
Whether the icon in the color area is currently hoverred.
Definition track.h:157
Track * track
Associated Track.
Definition track.h:177
GtkPopoverMenu * popover_menu
Popover to be reused for context menus.
Definition track.h:263
bool color_area_hovered
Whether color area is currently hoverred.
Definition track.h:147
GtkGestureClick * right_click
Right-click gesture.
Definition track.h:121
bool bg_hovered
Set between enter-leave signals.
Definition track.h:138
GtkBox * highlight_top_box
Used for highlighting.
Definition track.h:183
int redraw
Set to 1 to redraw.
Definition track.h:252
int resizing
Set during the whole resizing action.
Definition track.h:168
int button_pressed
Used when mouse button is held down to mark buttons as clicked.
Definition track.h:213
bool was_armed
Whether the track was armed for recording at the start of the current action.
Definition track.h:256
CustomButtonWidget * clicked_button
Currently clicked button.
Definition track.h:216
void * resize_target
The object to resize.
Definition track.h:174
cairo_t * cached_cr
Cairo caches.
Definition track.h:259
int n_press
Number of clicks, used when selecting/moving/ dragging channels.
Definition track.h:128
AutomationModeWidget * clicked_am
Currently clicked automation mode button.
Definition track.h:219
char * tooltip_text
Current tooltip text.
Definition track.h:245
Track to be inserted into the Project's Tracklist.
Definition track.h:177