root/sweep/trunk/src/paste_dialogs.c

Revision 691, 10.6 kB (checked in by erikd, 2 years ago)

Remove needless #defines of buffer lengths.

Code had many instances of:

#undef BUF_LEN
#define BUF_LEN 64
char buf[BUF_LEN];
snprintf (buf, BUF_LEN, ....);

which can be replaced with:

char buf[64];
snprintf (buf, sizeof (buf), ....);

which is far cleaner and more difficult to get wrong.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1 /*
2  * Sweep, a sound wave editor.
3  *
4  * Copyright (C) 2000 Conrad Parker
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program 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 General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19  */
20
21
22 #ifdef HAVE_CONFIG_H
23 #  include <config.h>
24 #endif
25
26
27 #include <stdio.h>
28 #include <string.h>
29 #include <glib.h>
30 #include <gdk/gdkkeysyms.h>
31 #include <gtk/gtk.h>
32
33 #include <sweep/sweep_i18n.h>
34 #include <sweep/sweep_undo.h>
35 #include <sweep/sweep_sample.h>
36 #include <sweep/sweep_sounddata.h>
37 #include <sweep/sweep_selection.h>
38 #include <sweep/sweep_typeconvert.h>
39
40 #include "sweep_app.h"
41 #include "db_slider.h"
42 #include "edit.h"
43 #include "interface.h"
44 #include "print.h"
45
46 #include "../pixmaps/pastemix.xpm"
47 #include "../pixmaps/pastexfade.xpm"
48
49 /*#define DEBUG*/
50
51
52 static void
53 paste_dialog_destroy (GtkWidget * widget, gpointer data)
54 {
55   sw_sample * sample = (sw_sample *)data;
56
57   sample_set_edit_state (sample, SWEEP_EDIT_STATE_IDLE);
58 }
59
60 static void
61 paste_xfade_dialog_ok_cb (GtkWidget * widget, gpointer data)
62 {
63   GtkWidget * dialog;
64   GtkWidget * slider;
65   GtkWidget * checkbutton;
66   sw_sample * sample = (sw_sample *)data;
67   gdouble src_gain_start, src_gain_end, dest_gain_start, dest_gain_end;
68
69   dialog = gtk_widget_get_toplevel (widget);
70
71   slider = g_object_get_data (G_OBJECT(dialog), "src_slider");
72   src_gain_start = (double) db_slider_get_value (DB_SLIDER(slider));
73
74   slider = g_object_get_data (G_OBJECT(dialog), "src_slider2");
75   src_gain_end = (double) db_slider_get_value (DB_SLIDER(slider));
76
77   checkbutton = g_object_get_data (G_OBJECT(dialog), "src_invert");
78   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbutton))) {
79     src_gain_start *= -1.0;
80     src_gain_end *= -1.0;
81   }
82
83   slider = g_object_get_data (G_OBJECT(dialog), "dest_slider");
84   dest_gain_start = (double) db_slider_get_value (DB_SLIDER(slider));
85
86   slider = g_object_get_data (G_OBJECT(dialog), "dest_slider2");
87   dest_gain_end = (double) db_slider_get_value (DB_SLIDER(slider));
88
89   checkbutton = g_object_get_data (G_OBJECT(dialog), "dest_invert");
90   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbutton))) {
91     dest_gain_start *= -1.0;
92     dest_gain_end *= -1.0;
93   }
94
95   gtk_widget_hide (dialog);
96
97   do_paste_xfade (sample, src_gain_start, src_gain_end, dest_gain_start,
98                   dest_gain_end);
99
100   sample_set_edit_state (sample, SWEEP_EDIT_STATE_IDLE);
101 }
102
103 static void
104 paste_mix_dialog_ok_cb (GtkWidget * widget, gpointer data)
105 {
106   GtkWidget * dialog;
107   GtkWidget * slider;
108   GtkWidget * checkbutton;
109   sw_sample * sample = (sw_sample *)data;
110   gdouble src_gain, dest_gain;
111
112   dialog = gtk_widget_get_toplevel (widget);
113
114   slider = g_object_get_data (G_OBJECT(dialog), "src_slider");
115   src_gain = (double) db_slider_get_value (DB_SLIDER(slider));
116
117   checkbutton = g_object_get_data (G_OBJECT(dialog), "src_invert");
118   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbutton))) {
119     src_gain *= -1.0;
120   }
121
122   slider = g_object_get_data (G_OBJECT(dialog), "dest_slider");
123   dest_gain = (double) db_slider_get_value (DB_SLIDER(slider));
124
125   checkbutton = g_object_get_data (G_OBJECT(dialog), "dest_invert");
126   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbutton))) {
127     dest_gain *= -1.0;
128   }
129
130   gtk_widget_hide (dialog);
131
132   do_paste_mix (sample, src_gain, dest_gain);
133
134   sample_set_edit_state (sample, SWEEP_EDIT_STATE_IDLE);
135 }
136
137 static void
138 paste_dialog_cancel_cb (GtkWidget * widget, gpointer data)
139 {
140   GtkWidget * dialog;
141   sw_sample * sample = (sw_sample *)data;
142
143   dialog = gtk_widget_get_toplevel (widget);
144   gtk_widget_hide (dialog);
145
146   sample_set_edit_state (sample, SWEEP_EDIT_STATE_IDLE);
147 }
148
149 static void
150 create_paste_dialog (sw_sample * sample, gboolean xfade)
151 {
152   GtkWidget * dialog;
153   GtkWidget * main_vbox, * vbox;
154   GtkWidget * hbox, * hbox2;
155   GtkWidget * frame;
156   GtkWidget * slider;
157   GtkWidget * checkbutton;
158   GtkWidget * ebox;
159   GtkWidget * pixmap;
160   GtkWidget * label;
161   GtkWidget * ok_button, * button;
162
163   GtkAccelGroup * accel_group;
164
165   GtkTooltips * tooltips;
166
167   gchar * title, * common_slider_title;
168
169   sw_time_t duration;
170   char buf[16];
171
172   if (xfade) {
173     common_slider_title = _("Start gain");
174   } else {
175     common_slider_title = _("Gain");
176   }
177
178   dialog = gtk_dialog_new ();
179   gtk_window_set_wmclass(GTK_WINDOW(dialog), "paste_dialog", "Sweep");
180
181   if (xfade) {
182     gtk_window_set_title(GTK_WINDOW(dialog), _("Sweep: Paste crossfade"));
183   } else {
184     gtk_window_set_title(GTK_WINDOW(dialog), _("Sweep: Paste mix"));
185   }
186
187   gtk_window_set_resizable (GTK_WINDOW(dialog), FALSE);
188   gtk_window_set_position (GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE);
189
190   accel_group = gtk_accel_group_new ();
191   gtk_window_add_accel_group (GTK_WINDOW(dialog), accel_group);
192
193   g_signal_connect (G_OBJECT(dialog), "destroy",
194                      G_CALLBACK (paste_dialog_destroy), sample);
195
196   main_vbox = GTK_DIALOG(dialog)->vbox;
197
198   hbox = gtk_hbox_new (TRUE, 0);
199   gtk_box_pack_start (GTK_BOX(main_vbox), hbox, TRUE, TRUE, 8);
200   gtk_widget_show (hbox);
201
202   /* Source */
203
204   title = g_strdup_printf ("%s: %s", _("Source"), _("Clipboard"));
205   frame = gtk_frame_new (title);
206   gtk_container_set_border_width (GTK_CONTAINER(frame), 8);
207   gtk_box_pack_start (GTK_BOX(hbox), frame, TRUE, TRUE, 0);
208   gtk_widget_show (frame);
209   g_free (title);
210
211   vbox = gtk_vbox_new (FALSE, 0);
212   gtk_container_add (GTK_CONTAINER(frame), vbox);
213   gtk_widget_show (vbox);
214
215   hbox2 = gtk_hbox_new (TRUE, 8);
216   gtk_box_pack_start (GTK_BOX(vbox), hbox2, TRUE, TRUE, 2);
217   gtk_widget_show (hbox2);
218
219   slider = db_slider_new (common_slider_title, (xfade ? 0.0 : 1.0), 0.0, 2.0);
220   gtk_box_pack_start (GTK_BOX(hbox2), slider, TRUE, TRUE, 2);
221   gtk_widget_show (slider);
222
223   g_object_set_data (G_OBJECT(dialog), "src_slider", slider);
224
225   if (xfade) {
226     slider = db_slider_new (_("End gain"), 1.0, 0.0, 2.0);
227     gtk_box_pack_start (GTK_BOX(hbox2), slider, TRUE, TRUE, 2);
228     gtk_widget_show (slider);
229    
230     g_object_set_data (G_OBJECT(dialog), "src_slider2", slider);
231   }
232
233   checkbutton =
234     gtk_check_button_new_with_label (_("Invert phase"));
235   gtk_box_pack_start (GTK_BOX (vbox), checkbutton, TRUE, FALSE, 2);
236   gtk_widget_show (checkbutton);
237
238   g_object_set_data (G_OBJECT(dialog), "src_invert", checkbutton);
239
240   /* Destination */
241
242   title = g_strdup_printf ("%s: %s", _("Destination"),
243                            g_basename (sample->pathname));
244   frame = gtk_frame_new (title);
245   gtk_container_set_border_width (GTK_CONTAINER(frame), 8);
246   gtk_box_pack_start (GTK_BOX(hbox), frame, TRUE, TRUE, 0);
247   gtk_widget_show (frame);
248   g_free (title);
249
250   vbox = gtk_vbox_new (FALSE, 0);
251   gtk_container_add (GTK_CONTAINER(frame), vbox);
252   gtk_widget_show (vbox);
253
254   hbox2 = gtk_hbox_new (TRUE, 8);
255   gtk_box_pack_start (GTK_BOX(vbox), hbox2, TRUE, TRUE, 2);
256   gtk_widget_show (hbox2);
257
258   slider = db_slider_new (common_slider_title, 1.0, 0.0, 2.0);
259   gtk_box_pack_start (GTK_BOX(hbox2), slider, TRUE, TRUE, 2);
260   gtk_widget_show (slider);
261
262   g_object_set_data (G_OBJECT(dialog), "dest_slider", slider);
263
264   if (xfade) {
265     slider = db_slider_new (_("End gain"), 0.0, 0.0, 2.0);
266     gtk_box_pack_start (GTK_BOX(hbox2), slider, TRUE, TRUE, 2);
267     gtk_widget_show (slider);
268
269     g_object_set_data (G_OBJECT(dialog), "dest_slider2", slider);
270   }
271
272   checkbutton =
273     gtk_check_button_new_with_label (_("Invert phase"));
274   gtk_box_pack_start (GTK_BOX (vbox), checkbutton, TRUE, FALSE, 2);
275   gtk_widget_show (checkbutton);
276
277   g_object_set_data (G_OBJECT(dialog), "dest_invert", checkbutton);
278
279   /* Info frame */
280
281   frame = gtk_frame_new (NULL);
282   gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 4);
283   gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
284   gtk_widget_show (frame);
285
286   ebox = gtk_event_box_new ();
287   gtk_container_add (GTK_CONTAINER(frame), ebox);
288   gtk_widget_show (ebox);
289
290   tooltips = gtk_tooltips_new ();
291   gtk_tooltips_set_tip (tooltips, ebox,
292                         _("Indicates the total duration of the clipboard, "
293                           "which is the maximum length that will be pasted."),
294                         NULL);
295
296   hbox = gtk_hbox_new (FALSE, 0);
297   gtk_container_add (GTK_CONTAINER(ebox), hbox);
298   gtk_container_set_border_width (GTK_CONTAINER(hbox), 2);
299   gtk_widget_show (hbox);
300
301   if (xfade) {
302     pixmap = create_widget_from_xpm (dialog, pastexfade_xpm);
303   } else {
304     pixmap = create_widget_from_xpm (dialog, pastemix_xpm);
305   }
306   gtk_box_pack_start (GTK_BOX(hbox), pixmap, FALSE, FALSE, 4);
307   gtk_widget_show (pixmap);
308
309   label = gtk_label_new (_("Clipboard duration:"));
310   gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 4);
311   gtk_widget_show (label);
312
313   duration = frames_to_time (sample->sounddata->format, clipboard_width ());
314   snprint_time (buf, sizeof (buf), duration);
315
316   label = gtk_label_new (buf);
317   gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 4);
318   gtk_widget_show (label);
319
320   /* OK */
321
322   ok_button = gtk_button_new_with_label (xfade ? _("Crossfade") : _("Mix"));;
323   GTK_WIDGET_SET_FLAGS (GTK_WIDGET (ok_button), GTK_CAN_DEFAULT);
324   gtk_box_pack_start (GTK_BOX (GTK_DIALOG(dialog)->action_area),
325                       ok_button, TRUE, TRUE, 0);
326   gtk_widget_show (ok_button);
327
328   if (xfade) {
329     g_signal_connect (G_OBJECT(ok_button), "clicked",
330                       G_CALLBACK (paste_xfade_dialog_ok_cb),
331                         sample);
332   } else {
333     g_signal_connect (G_OBJECT(ok_button), "clicked",
334                       G_CALLBACK (paste_mix_dialog_ok_cb),
335                         sample);
336   }
337
338   /* Cancel */
339
340   button = gtk_button_new_with_label (xfade ?
341                                       _("Don't crossfade") : _("Don't mix"));
342   GTK_WIDGET_SET_FLAGS (GTK_WIDGET (button), GTK_CAN_DEFAULT);
343   gtk_box_pack_start (GTK_BOX (GTK_DIALOG(dialog)->action_area),
344                       button, TRUE, TRUE , 0);
345   gtk_widget_show (button);
346   g_signal_connect (G_OBJECT(button), "clicked",
347                       G_CALLBACK (paste_dialog_cancel_cb),
348                       sample);
349
350   gtk_widget_grab_default (ok_button);
351
352   sample_set_edit_state (sample, SWEEP_EDIT_STATE_BUSY);
353   sample_set_edit_mode (sample, SWEEP_EDIT_MODE_FILTER);
354   sample_set_progress_percent (sample, 0);
355  
356   if (!GTK_WIDGET_VISIBLE(dialog)) {
357     gtk_widget_show (dialog);
358   } else {
359     gdk_window_raise (dialog->window);
360   }
361 }
362
363 void
364 create_paste_mix_dialog (sw_sample * sample)
365 {
366   create_paste_dialog (sample, FALSE);
367 }
368
369 void
370 create_paste_xfade_dialog (sw_sample * sample)
371 {
372   create_paste_dialog (sample, TRUE);
373 }
Note: See TracBrowser for help on using the browser.