00001 #include "edl.h"
00002 #include "edlsession.h"
00003 #include "language.h"
00004 #include "meterpanel.h"
00005 #include "mwindow.h"
00006 #include "preferences.h"
00007 #include "theme.h"
00008 #include "vframe.h"
00009
00010
00011
00012 MeterPanel::MeterPanel(MWindow *mwindow,
00013 BC_WindowBase *subwindow,
00014 int x,
00015 int y,
00016 int h,
00017 int meter_count,
00018 int use_meters,
00019 int use_recording)
00020 {
00021 this->subwindow = subwindow;
00022 this->mwindow = mwindow;
00023 this->x = x;
00024 this->y = y;
00025 this->h = h;
00026 this->meter_count = meter_count;
00027 this->use_meters = use_meters;
00028 this->use_recording = use_recording;
00029 }
00030
00031
00032 MeterPanel::~MeterPanel()
00033 {
00034 meters.remove_all_objects();
00035 }
00036
00037 int MeterPanel::get_meters_width(int meter_count, int use_meters)
00038 {
00039
00040 return use_meters ?
00041 (BC_Meter::get_title_w() + BC_Meter::get_meter_w() * meter_count) :
00042 0;
00043 }
00044
00045 void MeterPanel::reposition_window(int x, int y, int h)
00046 {
00047 this->x = x;
00048 this->y = y;
00049 this->h = h;
00050
00051
00052
00053
00054
00055 for(int i = 0; i < meter_count; i++)
00056 {
00057
00058 meters.values[i]->reposition_window(x, y, get_meter_h());
00059 x += get_meter_w(i);
00060 }
00061 }
00062
00063 int MeterPanel::change_status_event()
00064 {
00065
00066 return 1;
00067 }
00068
00069 int MeterPanel::get_reset_x()
00070 {
00071 return x +
00072 get_meters_width(meter_count, use_meters) -
00073 mwindow->theme->over_button[0]->get_w();
00074 }
00075
00076 int MeterPanel::get_reset_y()
00077 {
00078 return y + h - mwindow->theme->over_button[0]->get_h();
00079 }
00080
00081 int MeterPanel::get_meter_w(int number)
00082 {
00083 return (number == 0) ? BC_Meter::get_title_w() + BC_Meter::get_meter_w() : BC_Meter::get_meter_w();
00084 }
00085
00086 int MeterPanel::get_meter_h()
00087 {
00088 return this->h - 5;
00089 }
00090
00091 void MeterPanel::update(double *levels)
00092 {
00093 if(subwindow->get_hidden()) return;
00094
00095
00096 for(int i = 0;
00097 i < meter_count;
00098 i++)
00099 {
00100 meters.values[i]->update(levels[i], levels[i] > 1);
00101 }
00102 }
00103
00104 void MeterPanel::stop_meters()
00105 {
00106 for(int i = 0;
00107 i < meter_count;
00108 i++)
00109 {
00110 meters.values[i]->reset();
00111 }
00112 }
00113
00114
00115 int MeterPanel::create_objects()
00116 {
00117 set_meters(meter_count, use_meters);
00118 return 0;
00119 }
00120
00121 int MeterPanel::set_meters(int meter_count, int use_meters)
00122 {
00123 if(meter_count != meters.total || use_meters != this->use_meters)
00124 {
00125
00126 meters.remove_all_objects();
00127
00128 this->meter_count = meter_count;
00129 this->use_meters = use_meters;
00130
00131
00132 if(meter_count)
00133 {
00134 int x = this->x;
00135 int y = this->y;
00136 int h = get_meter_h();
00137 for(int i = 0; i < meter_count; i++)
00138 {
00139 MeterMeter *new_meter;
00140 subwindow->add_subwindow(new_meter = new MeterMeter(mwindow,
00141 this,
00142 x,
00143 y,
00144 h,
00145 (i == 0)));
00146 meters.append(new_meter);
00147 x += get_meter_w(i);
00148 }
00149 }
00150 }
00151
00152 return 0;
00153 }
00154
00155 void MeterPanel::reset_meters()
00156 {
00157 for(int i = 0; i < meters.total; i++)
00158 meters.values[i]->reset_over();
00159 }
00160
00161
00162 void MeterPanel::change_format(int mode, int min, int max)
00163 {
00164 for(int i = 0; i < meters.total; i++)
00165 {
00166 if(use_recording)
00167 meters.values[i]->change_format(mode, min, 0);
00168 else
00169 meters.values[i]->change_format(mode, min, max);
00170 }
00171 }
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181 MeterReset::MeterReset(MWindow *mwindow, MeterPanel *panel, int x, int y)
00182 : BC_Button(x, y, mwindow->theme->over_button)
00183 {
00184 this->mwindow = mwindow;
00185 this->panel = panel;
00186 }
00187
00188 MeterReset::~MeterReset()
00189 {
00190 }
00191
00192 int MeterReset::handle_event()
00193 {
00194 for(int i = 0; i < panel->meters.total; i++)
00195 panel->meters.values[i]->reset_over();
00196 return 1;
00197 }
00198
00199
00200
00201
00202
00203 MeterMeter::MeterMeter(MWindow *mwindow,
00204 MeterPanel *panel,
00205 int x,
00206 int y,
00207 int h,
00208 int titles)
00209 : BC_Meter(x,
00210 y,
00211 METER_VERT,
00212 h,
00213 mwindow->edl->session->min_meter_db,
00214 panel->use_recording ? 0 : mwindow->edl->session->max_meter_db,
00215 mwindow->edl->session->meter_format,
00216 titles,
00217 TRACKING_RATE * 10,
00218 TRACKING_RATE)
00219 {
00220 this->mwindow = mwindow;
00221 this->panel = panel;
00222 }
00223
00224 MeterMeter::~MeterMeter()
00225 {
00226 }
00227
00228
00229 int MeterMeter::button_press_event()
00230 {
00231 if(is_event_win() && BC_WindowBase::cursor_inside())
00232 {
00233 panel->reset_meters();
00234 mwindow->reset_meters();
00235 return 1;
00236 }
00237
00238 return 0;
00239 }
00240
00241
00242
00243
00244
00245 MeterShow::MeterShow(MWindow *mwindow, MeterPanel *panel, int x, int y)
00246 : BC_Toggle(x,
00247 y,
00248 mwindow->theme->get_image_set("meters"),
00249 panel->use_meters)
00250 {
00251 this->mwindow = mwindow;
00252 this->panel = panel;
00253 set_tooltip(_("Show meters"));
00254 }
00255
00256
00257 MeterShow::~MeterShow()
00258 {
00259 }
00260
00261
00262 int MeterShow::handle_event()
00263 {
00264
00265 panel->use_meters = get_value();
00266 panel->change_status_event();
00267 return 1;
00268 }