1 /*
2 * Copyright (C) 2018-2019 Alexandros Theodotou <alex at zrythm dot org>
3 *
4 * This file is part of Zrythm
5 *
6 * Zrythm is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Affero General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * Zrythm is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Affero General Public License for more details.
15 *
16 * You should have received a copy of the GNU Affero General Public License
17 * along with Zrythm. If not, see <https://www.gnu.org/licenses/>.
18 */
19
20 /** \file
21 */
22
23 #include "audio/automatable.h"
24 #include "audio/automation_track.h"
25 #include "audio/automation_tracklist.h"
26 #include "audio/audio_bus_track.h"
27 #include "audio/audio_track.h"
28 #include "audio/track.h"
29 #include "audio/region.h"
30 #include "gui/widgets/arranger.h"
31 #include "gui/widgets/automation_track.h"
32 #include "gui/widgets/automation_tracklist.h"
33 #include "gui/widgets/center_dock.h"
34 #include "gui/widgets/color_area.h"
35 #include "gui/widgets/audio_track.h"
36 #include "gui/widgets/main_window.h"
37 #include "gui/widgets/track.h"
38 #include "gui/widgets/track_lanelist.h"
39 #include "gui/widgets/track_top_grid.h"
40 #include "gui/widgets/tracklist.h"
G_DEFINE_TYPE(AudioEditorSpaceWidget,audio_editor_space_widget,GTK_TYPE_BOX)41 #include "project.h"
42 #include "utils/gtk.h"
43 #include "utils/resources.h"
44
45 #include <gtk/gtk.h>
46 #include <glib/gi18n.h>
47
48 G_DEFINE_TYPE (AudioTrackWidget,
49 audio_track_widget,
50 TRACK_WIDGET_TYPE)
51
52 /**
53 * Creates a new track widget using the given track.
54 *
55 * 1 track has 1 track widget.
56 * The track widget must always have at least 1 automation track in the automation
57 * paned.
58 */
59 AudioTrackWidget *
60 audio_track_widget_new (Track * track)
61 {
62 AudioTrackWidget * self =
63 g_object_new (
64 AUDIO_TRACK_WIDGET_TYPE,
65 NULL);
66
67 TRACK_WIDGET_GET_PRIVATE (self);
68
69 /* setup color */
70 color_area_widget_set_color (tw_prv->color,
71 &track->color);
72
73 /* create lanelist */
74 tw_prv->lanelist =
75 track_lanelist_widget_new (track);
76 gtk_container_add (
77 GTK_CONTAINER (tw_prv->paned),
78 GTK_WIDGET (tw_prv->lanelist));
79
80 /* setup automation tracklist */
81 AutomationTracklist * automation_tracklist =
82 track_get_automation_tracklist (track);
83 automation_tracklist->widget =
84 automation_tracklist_widget_new (
85 automation_tracklist);
86 gtk_container_add (
87 GTK_CONTAINER (tw_prv->paned),
88 GTK_WIDGET (automation_tracklist->widget));
89
90 tw_prv->record_toggle_handler_id =
91 g_signal_connect (
92 self->record, "toggled",
93 G_CALLBACK (track_widget_on_record_toggled),
94 self);
95 tw_prv->mute_toggled_handler_id =
96 g_signal_connect (
97 self->mute, "toggled",
98 G_CALLBACK (track_widget_on_mute_toggled),
99 self);
100 tw_prv->solo_toggled_handler_id =
101 g_signal_connect (
102 self->solo, "toggled",
103 G_CALLBACK (track_widget_on_solo_toggled),
104 self);
105 g_signal_connect (
106 self->show_lanes,
107 "toggled",
108 G_CALLBACK (track_widget_on_show_lanes_toggled),
109 self);
110 g_signal_connect (
111 self->show_automation,
112 "toggled",
113 G_CALLBACK (track_widget_on_show_automation_toggled),
114 self);
115
116 return self;
117 }
118
119 void
120 audio_track_widget_refresh_buttons (
121 AudioTrackWidget * self)
122 {
123 TRACK_WIDGET_GET_PRIVATE (self);
124 g_signal_handler_block (
125 self->record, tw_prv->record_toggle_handler_id);
126 gtk_toggle_button_set_active (
127 self->record,
128 tw_prv->track->recording);
129 g_signal_handler_unblock (
130 self->record, tw_prv->record_toggle_handler_id);
131
132 g_signal_handler_block (
133 self->solo, tw_prv->solo_toggled_handler_id);
134 gtk_toggle_button_set_active (
135 self->solo,
136 tw_prv->track->solo);
137 g_signal_handler_unblock (
138 self->solo, tw_prv->solo_toggled_handler_id);
139
140 g_signal_handler_block (
141 self->mute, tw_prv->mute_toggled_handler_id);
142 gtk_toggle_button_set_active (
143 self->mute,
144 tw_prv->track->mute);
145 g_signal_handler_unblock (
146 self->mute, tw_prv->mute_toggled_handler_id);
147 }
148
149 void
150 audio_track_widget_refresh (AudioTrackWidget * self)
151 {
152 TRACK_WIDGET_GET_PRIVATE (self);
153 Track * track = tw_prv->track;
154 /*ChannelTrack * ct = (ChannelTrack *) track;*/
155 /*Channel * chan = ct->channel;*/
156
157 track_widget_set_name (
158 Z_TRACK_WIDGET (self), track->name);
159
160 audio_track_widget_refresh_buttons (self);
161
162 AutomationTracklist * automation_tracklist =
163 track_get_automation_tracklist (tw_prv->track);
164 automation_tracklist_widget_refresh (
165 automation_tracklist->widget);
166
167 track_lanelist_widget_refresh (tw_prv->lanelist);
168 }
169
170 static void
171 audio_track_widget_init (AudioTrackWidget * self)
172 {
173 GtkStyleContext * context;
174 TRACK_WIDGET_GET_PRIVATE (self);
175
176 /* create buttons */
177 self->record =
178 z_gtk_toggle_button_new_with_icon ("media-record");
179 context =
180 gtk_widget_get_style_context (
181 GTK_WIDGET (self->record));
182 gtk_style_context_add_class (
183 context, "record-button");
184 self->solo =
185 z_gtk_toggle_button_new_with_resource (
186 ICON_TYPE_ZRYTHM,
187 "solo.svg");
188 context =
189 gtk_widget_get_style_context (
190 GTK_WIDGET (self->solo));
191 gtk_style_context_add_class (
192 context, "solo-button");
193 self->mute =
194 z_gtk_toggle_button_new_with_resource (
195 ICON_TYPE_ZRYTHM,
196 "mute.svg");
197 self->show_automation =
198 z_gtk_toggle_button_new_with_icon (
199 "node-type-cusp");
200 self->show_lanes =
201 z_gtk_toggle_button_new_with_icon (
202 "format-justify-fill");
203 ui_add_widget_tooltip (
204 self->show_lanes,
205 _("Show track lanes"));
206
207 /* set buttons to upper controls */
208 gtk_box_pack_start (
209 GTK_BOX (tw_prv->top_grid->upper_controls),
210 GTK_WIDGET (self->record),
211 Z_GTK_NO_EXPAND,
212 Z_GTK_NO_FILL,
213 0);
214 gtk_box_pack_start (
215 GTK_BOX (tw_prv->top_grid->upper_controls),
216 GTK_WIDGET (self->solo),
217 Z_GTK_NO_EXPAND,
218 Z_GTK_NO_FILL,
219 0);
220 gtk_box_pack_start (
221 GTK_BOX (tw_prv->top_grid->upper_controls),
222 GTK_WIDGET (self->mute),
223 Z_GTK_NO_EXPAND,
224 Z_GTK_NO_FILL,
225 0);
226
227 /* pack buttons to bot controls */
228 gtk_box_pack_start (
229 GTK_BOX (tw_prv->top_grid->bot_controls),
230 GTK_WIDGET (self->show_lanes),
231 Z_GTK_NO_EXPAND,
232 Z_GTK_NO_FILL,
233 0);
234 gtk_box_pack_start (
235 GTK_BOX (tw_prv->top_grid->bot_controls),
236 GTK_WIDGET (self->show_automation),
237 Z_GTK_NO_EXPAND,
238 Z_GTK_NO_FILL,
239 0);
240
241 /* set icon */
242 SET_TRACK_ICON ("signal-audio");
243 }
244
245 static void
246 audio_track_widget_class_init (
247 AudioTrackWidgetClass * klass)
248 {
249 }
250