4 * Copyright (C) 1997-2014 Adam Williams <broadcast at earthling dot net>
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.
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.
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
22 #include "bcsignals.h"
25 #include "edlsession.h"
27 #include "mwindowgui.h"
29 #include "trackcanvas.h"
32 #include "zoompanel.h"
35 ZoomHash::ZoomHash(double value, const char *text)
38 this->text = new char[strlen(text) + 1];
39 strcpy(this->text, text);
48 ZoomPanel::ZoomPanel(MWindow *mwindow, BC_WindowBase *subwindow, double value,
49 int x, int y, int w, double min, double max, int zoom_type)
51 this->mwindow = mwindow;
52 this->subwindow = subwindow;
59 this->zoom_type = zoom_type;
64 ZoomPanel::ZoomPanel(MWindow *mwindow, BC_WindowBase *subwindow, double value,
65 int x, int y, int w, double *user_table, int user_size, int zoom_type)
67 this->mwindow = mwindow;
68 this->subwindow = subwindow;
75 this->zoom_type = zoom_type;
76 this->user_table = user_table;
77 this->user_size = user_size;
80 ZoomPanel::~ZoomPanel()
84 zoom_table.remove_all_objects();
87 void ZoomPanel::calculate_menu()
91 for(int i = 0; i < user_size; i++)
93 zoom_text->add_item(new BC_MenuItem(value_to_text(user_table[i], 0)));
94 zoom_table.append(new ZoomHash(user_table[i], value_to_text(user_table[i], 0)));
99 for(double zoom = min; zoom <= max; zoom *= 2)
101 zoom_text->add_item(new BC_MenuItem(value_to_text(zoom, 0)));
102 zoom_table.append(new ZoomHash(zoom, value_to_text(zoom, 0)));
107 int ZoomPanel::calculate_w(int menu_w)
109 return BC_PopupMenu::calculate_w(-1, menu_w, 1) + BC_Tumbler::calculate_w();
112 void ZoomPanel::update_menu()
114 while(zoom_text->total_items()) zoom_text->del_item(0);
116 zoom_table.remove_all_objects();
120 void ZoomPanel::create_objects()
122 subwindow->add_subwindow(zoom_text = new ZoomPopup(mwindow, this, x, y));
123 x += zoom_text->get_w();
124 subwindow->add_subwindow(zoom_tumbler = new ZoomTumbler(mwindow, this, x, y));
128 void ZoomPanel::reposition_window(int x, int y)
130 zoom_text->reposition_window(x, y);
131 x += zoom_text->get_w();
132 zoom_tumbler->reposition_window(x, y);
136 int ZoomPanel::get_w()
138 return zoom_text->get_w() + zoom_tumbler->get_w();
141 double ZoomPanel::get_value()
146 char* ZoomPanel::get_text()
148 return zoom_text->get_text();
151 void ZoomPanel::set_text(const char *text)
153 zoom_text->set_text(text);
156 void ZoomPanel::set_tooltip(const char *text)
158 zoom_text->set_tooltip(text);
159 zoom_tumbler->set_tooltip(text);
162 void ZoomPanel::update(double value)
165 zoom_text->set_text(value_to_text(value));
168 void ZoomPanel::update(const char *value)
170 zoom_text->set_text(value);
174 char* ZoomPanel::value_to_text(double value, int use_table)
178 for(int i = 0; i < zoom_table.total; i++)
180 //printf("ZoomPanel::value_to_text %p\n", zoom_table.values[i]);
181 if(EQUIV(zoom_table.values[i]->value, value))
182 return zoom_table.values[i]->text;
184 //printf("ZoomPanel::value_to_text: should never get here\n");
185 return zoom_table.values[0]->text;
190 case ZOOM_PERCENTAGE:
191 sprintf(string, "%d%%", (int)(value * 100));
195 sprintf(string, "%.1f", value);
199 sprintf(string, "%ld", (long)value);
204 // sprintf(string, "%ld", (long)value);
205 double total_seconds = (double)(mwindow->theme->mcanvas_w -
206 mwindow->theme->patchbay_w -
207 BC_ScrollBar::get_span(SCROLL_VERT)) *
209 mwindow->edl->session->sample_rate;
210 Units::totext(string,
212 mwindow->edl->session->time_format,
213 mwindow->edl->session->sample_rate,
214 mwindow->edl->session->frame_rate,
215 mwindow->edl->session->frames_per_foot);
222 double ZoomPanel::text_to_zoom(char *text, int use_table)
225 for(int i = 0; i < zoom_table.total; i++) {
226 if(!strcasecmp(text, zoom_table.values[i]->text))
227 return zoom_table.values[i]->value;
229 return zoom_table.values[0]->value;
234 case ZOOM_PERCENTAGE:
235 result = atof(text) / 100;
243 double total_samples = Units::fromtext(text,
244 mwindow->edl->session->sample_rate,
245 mwindow->edl->session->time_format,
246 mwindow->edl->session->frame_rate,
247 mwindow->edl->session->frames_per_foot);
248 total_samples /= mwindow->theme->mcanvas_w -
249 mwindow->theme->patchbay_w -
250 BC_ScrollBar::get_span(SCROLL_VERT);
251 double difference = fabs(total_samples - result);
252 while(fabs(result - total_samples) <= difference) {
253 difference = fabs(result - total_samples);
268 ZoomPopup::ZoomPopup(MWindow *mwindow, ZoomPanel *panel, int x, int y)
269 : BC_PopupMenu(x, y, panel->w, panel->value_to_text(panel->value, 0),
270 1, mwindow->theme->get_image_set("zoombar_menu", 0))
272 this->mwindow = mwindow;
276 ZoomPopup::~ZoomPopup()
280 int ZoomPopup::handle_event()
282 panel->value = panel->text_to_zoom(get_text());
283 panel->handle_event();
289 ZoomTumbler::ZoomTumbler(MWindow *mwindow, ZoomPanel *panel, int x, int y)
290 : BC_Tumbler(x, y, mwindow->theme->get_image_set("zoombar_tumbler", 0))
292 this->mwindow = mwindow;
296 ZoomTumbler::~ZoomTumbler()
300 int ZoomTumbler::handle_up_event()
302 if(panel->user_table)
304 int current_index = 0;
305 for(current_index = 0; current_index < panel->user_size; current_index++)
306 if(EQUIV(panel->user_table[current_index], panel->value)) break;
308 CLAMP(current_index, 0, panel->user_size - 1);
309 panel->value = panel->user_table[current_index];
314 RECLIP(panel->value, panel->min, panel->max);
317 panel->zoom_text->set_text(panel->value_to_text(panel->value));
318 panel->handle_event();
322 int ZoomTumbler::handle_down_event()
324 if(panel->user_table)
326 int current_index = 0;
327 for(current_index = 0; current_index < panel->user_size; current_index++)
328 if(EQUIV(panel->user_table[current_index], panel->value)) break;
330 CLAMP(current_index, 0, panel->user_size - 1);
331 panel->value = panel->user_table[current_index];
336 RECLIP(panel->value, panel->min, panel->max);
338 panel->zoom_text->set_text(panel->value_to_text(panel->value));
339 panel->handle_event();