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