3 #include "edlsession.h"
5 #include "mwindowgui.h"
7 #include "trackcanvas.h"
10 #include "zoompanel.h"
13 ZoomHash::ZoomHash(double value, char *text)
16 this->text = new char[strlen(text) + 1];
17 strcpy(this->text, text);
26 ZoomPanel::ZoomPanel(MWindow *mwindow,
27 BC_WindowBase *subwindow,
36 this->mwindow = mwindow;
37 this->subwindow = subwindow;
44 this->zoom_type = zoom_type;
47 ZoomPanel::~ZoomPanel()
51 zoom_table.remove_all_objects();
54 void ZoomPanel::calculate_menu()
56 for(double zoom = min; zoom <= max; zoom *= 2)
58 zoom_text->add_item(new BC_MenuItem(value_to_text(zoom, 0)));
59 //printf("ZoomPanel::calculate_menu 1 %s\n", value_to_text(zoom, 0));
60 zoom_table.append(new ZoomHash(zoom, value_to_text(zoom, 0)));
64 void ZoomPanel::update_menu()
66 while(zoom_text->total_items())
68 zoom_text->remove_item(0);
71 zoom_table.remove_all_objects();
76 int ZoomPanel::create_objects()
78 subwindow->add_subwindow(zoom_text = new ZoomPopup(mwindow, this, x, y));
79 x += zoom_text->get_w();
80 subwindow->add_subwindow(zoom_tumbler = new ZoomTumbler(mwindow, this, x, y));
85 void ZoomPanel::reposition_window(int x, int y)
87 zoom_text->reposition_window(x, y);
88 x += zoom_text->get_w();
89 zoom_tumbler->reposition_window(x, y);
93 int ZoomPanel::get_w()
95 return zoom_text->get_w() + zoom_tumbler->get_w();
98 double ZoomPanel::get_value()
103 char* ZoomPanel::get_text()
105 return zoom_text->get_text();
108 void ZoomPanel::set_text(char *text)
110 zoom_text->set_text(text);
113 void ZoomPanel::update(double value)
116 zoom_text->set_text(value_to_text(value));
119 void ZoomPanel::update(char *value)
121 zoom_text->set_text(value);
125 char* ZoomPanel::value_to_text(double value, int use_table)
129 for(int i = 0; i < zoom_table.total; i++)
131 //printf("ZoomPanel::value_to_text %p\n", zoom_table.values[i]);
132 if(EQUIV(zoom_table.values[i]->value, value))
133 return zoom_table.values[i]->text;
135 //printf("ZoomPanel::value_to_text: should never get here\n");
136 return zoom_table.values[0]->text;
141 case ZOOM_PERCENTAGE:
142 sprintf(string, "%d%%", (int)(value * 100));
146 sprintf(string, "%.1f", value);
150 sprintf(string, "%ld", (long)value);
155 double total_seconds = (double)mwindow->gui->canvas->get_w() *
157 mwindow->edl->session->sample_rate;
158 Units::totext(string,
160 mwindow->edl->session->time_format,
161 mwindow->edl->session->sample_rate,
162 mwindow->edl->session->frame_rate,
163 mwindow->edl->session->frames_per_foot);
170 double ZoomPanel::text_to_zoom(char *text, int use_table)
174 for(int i = 0; i < zoom_table.total; i++)
176 if(!strcasecmp(text, zoom_table.values[i]->text))
177 return zoom_table.values[i]->value;
179 return zoom_table.values[0]->value;
184 case ZOOM_PERCENTAGE:
185 return atof(text) / 100;
194 double total_samples = Units::fromtext(text,
195 mwindow->edl->session->sample_rate,
196 mwindow->edl->session->time_format,
197 mwindow->edl->session->frame_rate,
198 mwindow->edl->session->frames_per_foot);
199 total_samples /= mwindow->gui->canvas->get_w();
200 double difference = fabs(total_samples - result);
201 while(fabs(result - total_samples) <= difference)
203 difference = fabs(result - total_samples);
218 ZoomPopup::ZoomPopup(MWindow *mwindow, ZoomPanel *panel, int x, int y)
222 panel->value_to_text(panel->value, 0),
225 this->mwindow = mwindow;
229 ZoomPopup::~ZoomPopup()
233 int ZoomPopup::handle_event()
235 panel->value = panel->text_to_zoom(get_text());
236 panel->handle_event();
242 ZoomTumbler::ZoomTumbler(MWindow *mwindow, ZoomPanel *panel, int x, int y)
245 this->mwindow = mwindow;
249 ZoomTumbler::~ZoomTumbler()
253 int ZoomTumbler::handle_up_event()
256 RECLIP(panel->value, panel->min, panel->max);
257 panel->zoom_text->set_text(panel->value_to_text(panel->value));
258 panel->handle_event();
262 int ZoomTumbler::handle_down_event()
265 RECLIP(panel->value, panel->min, panel->max);
266 panel->zoom_text->set_text(panel->value_to_text(panel->value));
267 panel->handle_event();