1 /*
2  * Schism Tracker - a cross-platform Impulse Tracker clone
3  * copyright (c) 2003-2005 Storlek <storlek@rigelseven.com>
4  * copyright (c) 2005-2008 Mrs. Brisby <mrs.brisby@nimh.org>
5  * copyright (c) 2009 Storlek & Mrs. Brisby
6  * copyright (c) 2010-2012 Storlek
7  * URL: http://schismtracker.org/
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22  */
23 
24 #include "headers.h"
25 
26 #include "it.h"
27 #include "song.h"
28 #include "page.h"
29 
30 #include "sdlmain.h"
31 
32 /* --------------------------------------------------------------------- */
33 /* static variables */
34 
35 static struct widget widgets_vars[18];
36 static const int group_control[] = { 8, 9, -1 };
37 static const int group_playback[] = { 10, 11, -1 };
38 static const int group_slides[] = { 12, 13, -1 };
39 static char Amiga[6] = "Amiga";
40 
41 /* --------------------------------------------------------------------- */
42 
update_song_title(void)43 static void update_song_title(void)
44 {
45 	status.flags |= NEED_UPDATE | SONG_NEEDS_SAVE;
46 }
47 
48 /* --------------------------------------------------------------------- */
49 
song_vars_draw_const(void)50 static void song_vars_draw_const(void)
51 {
52 	int n;
53 
54 	draw_box(16, 15, 43, 17, BOX_THIN | BOX_INNER | BOX_INSET);
55 	draw_box(16, 18, 50, 21, BOX_THIN | BOX_INNER | BOX_INSET);
56 	draw_box(16, 22, 34, 28, BOX_THIN | BOX_INNER | BOX_INSET);
57 	draw_box(12, 41, 78, 45, BOX_THICK | BOX_INNER | BOX_INSET);
58 
59 	draw_fill_chars(20, 26, 33, 27, 0);
60 
61 	draw_text("Song Variables", 33, 13, 3, 2);
62 	draw_text("Song Name", 7, 16, 0, 2);
63 	draw_text("Initial Tempo", 3, 19, 0, 2);
64 	draw_text("Initial Speed", 3, 20, 0, 2);
65 	draw_text("Global Volume", 3, 23, 0, 2);
66 	draw_text("Mixing Volume", 3, 24, 0, 2);
67 	draw_text("Separation", 6, 25, 0, 2);
68 	draw_text("Old Effects", 5, 26, 0, 2);
69 	draw_text("Compatible Gxx", 2, 27, 0, 2);
70 	draw_text("Control", 9, 30, 0, 2);
71 	draw_text("Playback", 8, 33, 0, 2);
72 	draw_text("Pitch Slides", 4, 36, 0, 2);
73 	draw_text("Directories", 34, 40, 3, 2);
74 	draw_text("Module", 6, 42, 0, 2);
75 	draw_text("Sample", 6, 43, 0, 2);
76 	draw_text("Instrument", 2, 44, 0, 2);
77 
78 	for (n = 1; n < 79; n++)
79 		draw_char(129, n, 39, 1, 2);
80 }
81 
82 /* --------------------------------------------------------------------- */
83 
song_vars_sync_stereo(void)84 void song_vars_sync_stereo(void)
85 {
86 	// copy from the song to the page
87 	if (song_is_stereo())
88 		togglebutton_set(widgets_vars, 10, 0);
89 	else
90 		togglebutton_set(widgets_vars, 11, 0);
91 }
92 
update_values_in_song(void)93 static void update_values_in_song(void)
94 {
95 	song_set_initial_tempo(widgets_vars[1].d.thumbbar.value);
96 	song_set_initial_speed(widgets_vars[2].d.thumbbar.value);
97 	song_set_initial_global_volume(widgets_vars[3].d.thumbbar.value);
98 	song_set_mixing_volume(widgets_vars[4].d.thumbbar.value);
99 	song_set_separation(widgets_vars[5].d.thumbbar.value);
100 	song_set_old_effects(widgets_vars[6].d.toggle.state);
101 	song_set_compatible_gxx(widgets_vars[7].d.toggle.state);
102 	song_set_instrument_mode(widgets_vars[8].d.togglebutton.state);
103 	if (widgets_vars[10].d.togglebutton.state) {
104 		if (!song_is_stereo()) {
105 			song_set_stereo();
106 		}
107 	} else {
108 		if (song_is_stereo()) {
109 			song_set_mono();
110 		}
111 	}
112 	song_set_linear_pitch_slides(widgets_vars[12].d.togglebutton.state);
113 	status.flags |= SONG_NEEDS_SAVE;
114 }
115 
116 
init_instruments(UNUSED void * data)117 static void init_instruments(UNUSED void *data)
118 {
119 	song_init_instruments(-1);
120 }
121 
maybe_init_instruments(void)122 static void maybe_init_instruments(void)
123 {
124 	/* XXX actually, in IT the buttons on this dialog say OK/No for whatever reason */
125 	song_set_instrument_mode(1);
126 	dialog_create(DIALOG_YES_NO, "Initialise instruments?", init_instruments, NULL, 0, NULL);
127 
128 	status.flags |= SONG_NEEDS_SAVE;
129 }
130 
131 
song_changed_cb(void)132 static void song_changed_cb(void)
133 {
134 	char *b;
135 	int c;
136 
137 	widgets_vars[0].d.textentry.text = current_song->title;
138 	widgets_vars[0].d.textentry.cursor_pos = strlen(widgets_vars[0].d.textentry.text);
139 
140 	widgets_vars[1].d.thumbbar.value = current_song->initial_tempo;
141 	widgets_vars[2].d.thumbbar.value = current_song->initial_speed;
142 	widgets_vars[3].d.thumbbar.value = current_song->initial_global_volume;
143 	widgets_vars[4].d.thumbbar.value = current_song->mixing_volume;
144 	widgets_vars[5].d.thumbbar.value = current_song->pan_separation;
145 	widgets_vars[6].d.toggle.state = song_has_old_effects();
146 	widgets_vars[7].d.toggle.state = song_has_compatible_gxx();
147 
148 	if (song_is_instrument_mode())
149 		togglebutton_set(widgets_vars, 8, 0);
150 	else
151 		togglebutton_set(widgets_vars, 9, 0);
152 
153 	if (song_is_stereo())
154 		togglebutton_set(widgets_vars, 10, 0);
155 	else
156 		togglebutton_set(widgets_vars, 11, 0);
157 
158 	if (song_has_linear_pitch_slides())
159 		togglebutton_set(widgets_vars, 12, 0);
160 	else
161 		togglebutton_set(widgets_vars, 13, 0);
162 
163 	for (b = strpbrk(song_get_basename(), "Aa"),
164 	c = 12632; c && b && b[1]; c >>= 4, b++)
165 	if ((c & 15) != b[1] - *b) return;
166 	if (!c) for (b = Amiga, c = 12632; c; c>>= 4, b++)
167 	b[1] = *b + (c & 15);
168 }
169 
170 /* --------------------------------------------------------------------- */
171 /* bleh */
172 
dir_modules_changed(void)173 static void dir_modules_changed(void)
174 {
175 	status.flags |= DIR_MODULES_CHANGED;
176 }
177 
dir_samples_changed(void)178 static void dir_samples_changed(void)
179 {
180 	status.flags |= DIR_SAMPLES_CHANGED;
181 }
182 
dir_instruments_changed(void)183 static void dir_instruments_changed(void)
184 {
185 	status.flags |= DIR_INSTRUMENTS_CHANGED;
186 }
187 
188 /* --------------------------------------------------------------------- */
189 
song_vars_load_page(struct page * page)190 void song_vars_load_page(struct page *page)
191 {
192 	page->title = "Song Variables & Directory Configuration (F12)";
193 	page->draw_const = song_vars_draw_const;
194 	page->song_changed_cb = song_changed_cb;
195 	page->total_widgets = 18;
196 	page->widgets = widgets_vars;
197 	page->help_index = HELP_GLOBAL;
198 
199 	/* 0 = song name */
200 	create_textentry(widgets_vars, 17, 16, 26, 0, 1, 1, update_song_title, current_song->title, 25);
201 	/* 1 = tempo */
202 	create_thumbbar(widgets_vars + 1, 17, 19, 33, 0, 2, 2, update_values_in_song, 31, 255);
203 	/* 2 = speed */
204 	create_thumbbar(widgets_vars + 2, 17, 20, 33, 1, 3, 3, update_values_in_song, 1, 255);
205 	/* 3 = global volume */
206 	create_thumbbar(widgets_vars + 3, 17, 23, 17, 2, 4, 4, update_values_in_song, 0, 128);
207 	/* 4 = mixing volume */
208 	create_thumbbar(widgets_vars + 4, 17, 24, 17, 3, 5, 5, update_values_in_song, 0, 128);
209 	/* 5 = separation */
210 	create_thumbbar(widgets_vars + 5, 17, 25, 17, 4, 6, 6, update_values_in_song, 0, 128);
211 	/* 6 = old effects */
212 	create_toggle(widgets_vars + 6, 17, 26, 5, 7, 5, 7, 7, update_values_in_song);
213 	/* 7 = compatible gxx */
214 	create_toggle(widgets_vars + 7, 17, 27, 6, 8, 6, 8, 8, update_values_in_song);
215 	/* 8-13 = switches */
216 	create_togglebutton(widgets_vars + 8, 17, 30, 11, 7, 10, 9, 9, 9, maybe_init_instruments,
217 			    "Instruments", 1, group_control);
218 	create_togglebutton(widgets_vars + 9, 32, 30, 11, 7, 11, 8, 8, 8, update_values_in_song,
219 			    "Samples", 1, group_control);
220 	create_togglebutton(widgets_vars + 10, 17, 33, 11, 8, 12, 11, 11, 11, update_values_in_song,
221 			    "Stereo", 1, group_playback);
222 	create_togglebutton(widgets_vars + 11, 32, 33, 11, 9, 13, 10, 10, 10, update_values_in_song,
223 			    "Mono", 1, group_playback);
224 	create_togglebutton(widgets_vars + 12, 17, 36, 11, 10, 14, 13, 13, 13, update_values_in_song,
225 			    "Linear", 1, group_slides);
226 	create_togglebutton(widgets_vars + 13, 32, 36, 11, 11, 14, 12, 12, 12, update_values_in_song,
227 			    Amiga, 1, group_slides);
228 	/* 14-16 = directories */
229 	create_textentry(widgets_vars + 14, 13, 42, 65, 12, 15, 15, dir_modules_changed,
230 			 cfg_dir_modules, PATH_MAX);
231 	create_textentry(widgets_vars + 15, 13, 43, 65, 14, 16, 16, dir_samples_changed,
232 			 cfg_dir_samples, PATH_MAX);
233 	create_textentry(widgets_vars + 16, 13, 44, 65, 15, 17, 17, dir_instruments_changed,
234 			 cfg_dir_instruments, PATH_MAX);
235 	/* 17 = save all preferences */
236 	create_button(widgets_vars + 17, 28, 47, 22, 16, 17, 17, 17, 17, cfg_save, "Save all Preferences", 2);
237 }
238 
239