gui->del_keyboard_listener(
(int (BC_WindowBase::*)(BC_WindowBase *))
&MWindowGUI::keyboard_listener);
- reset_caches();
+ reset_caches(0);
#if 0
// release the hounds
if( awindow && awindow->gui ) awindow->gui->close(0);
void MWindow::check_language()
{
+ char pref_locale[BCSTRLEN];
+ strcpy(pref_locale, DEFAULT_LOCALE);
+ defaults->get("LOCALE",pref_locale);
+// set LANGUAGE if pref locale != sys
+ if( strcmp(pref_locale, DEFAULT_LOCALE) )
+ setenv("LANGUAGE", pref_locale, 1);
+
char curr_lang[BCTEXTLEN]; curr_lang[0] = 0;
const char *env_lang = getenv("LANGUAGE");
if( !env_lang ) env_lang = getenv("LC_ALL");
void MWindow::set_gang_tracks(int v)
{
- edl->session->gang_tracks = v;
+ edl->local_session->gang_tracks = v;
+ sync_parameters(CHANGE_PARAMS);
gui->update(1, 1, 0, 0, 1, 0, 0);
gui->flush();
}
load_mode == LOADMODE_REPLACE_CONCATENATE ) &&
(ftype != FILE_IS_XML || edl_mode != LOADMODE_EDL_CLIP) ) {
select_asset(0, 0);
+ edl->session->proxy_state = PROXY_INACTIVE;
edl->session->proxy_scale = 1;
edl->session->proxy_disabled_scale = 1;
edl->session->proxy_use_scaler = 0;
goto_start();
}
- if( ( edl->session->proxy_auto_scale && edl->session->proxy_scale != 1 ) &&
- ( load_mode != LOADMODE_REPLACE && load_mode != LOADMODE_REPLACE_CONCATENATE ) ) {
+ if( edl->session->proxy_state != PROXY_INACTIVE && edl->session->proxy_auto_scale &&
+ load_mode != LOADMODE_REPLACE && load_mode != LOADMODE_REPLACE_CONCATENATE ) {
ArrayList<Indexable *> orig_idxbls;
for( int i=0; i<new_assets.size(); ++i )
orig_idxbls.append(new_assets.get(i));
int MWindow::enable_proxy()
{
int ret = 0;
- if( edl->session->proxy_scale == 1 &&
- edl->session->proxy_disabled_scale != 1 ) {
+ if( edl->session->proxy_state == PROXY_DISABLED ) {
int new_scale = edl->session->proxy_disabled_scale;
int new_use_scaler = edl->session->proxy_use_scaler;
Asset *asset = new Asset;
beep(2000., 1.5, gain);
}
edl->session->proxy_disabled_scale = 1;
+ edl->session->proxy_state = PROXY_ACTIVE;
gui->lock_window("MWindow::to_proxy");
update_project(LOADMODE_REPLACE);
gui->unlock_window();
int MWindow::disable_proxy()
{
- if( edl->session->proxy_scale != 1 &&
- edl->session->proxy_disabled_scale == 1 ) {
- int old_scale = edl->session->proxy_scale, new_scale = 1;
+ if( edl->session->proxy_state == PROXY_ACTIVE ) {
+ int old_scale = edl->session->proxy_scale, new_scale = 0;
int new_use_scaler = edl->session->proxy_use_scaler;
Asset *asset = new Asset;
asset->format = FILE_FFMPEG;
asset->load_defaults(defaults, "PROXY_", 1, 1, 0, 0, 0);
to_proxy(asset, new_scale, new_use_scaler);
asset->remove_user();
+ edl->session->proxy_state = PROXY_DISABLED;
edl->session->proxy_disabled_scale = old_scale;
gui->lock_window("MWindow::to_proxy");
update_project(LOADMODE_REPLACE);
edl->Garbage::add_user();
save_backup();
undo_before(_("proxy"), this);
- int asset_scale = new_scale == 1 ? 0 :
+ int asset_scale = !new_scale ? 0 :
!new_use_scaler ? 1 : new_scale;
ProxyRender proxy_render(this, asset, asset_scale);
// remove all session proxy assets at the at the current proxy_scale
int proxy_scale = edl->session->proxy_scale;
- if( proxy_scale > 1 ) {
+ if( edl->session->proxy_state == PROXY_ACTIVE ) {
Asset *orig_asset = edl->assets->first;
for( ; orig_asset; orig_asset=orig_asset->next ) {
char new_path[BCTEXTLEN];
}
// convert from the proxy assets to the original assets
- edl->set_proxy(1, 0, &proxy_assets, &orig_idxbls);
+ edl->set_proxy(0, 0, &proxy_assets, &orig_idxbls);
// remove the references
for( int i=0; i<proxy_assets.size(); ++i ) {
confirm_paths.set_array_delete();
// convert to new size if not original size
- if( new_scale != 1 ) {
+ if( new_scale ) {
FileSystem fs;
Asset *orig = edl->assets->first;
for( ; orig; orig=orig->next ) {
proxy_render.add_needed(orig_nested, proxy);
}
}
+ edl->session->proxy_state = PROXY_ACTIVE;
}
+ else
+ edl->session->proxy_state = PROXY_INACTIVE;
int result = 0;
// test for existing files
confirm_paths.remove_all_objects();
}
- if( !result )
+ if( !result && new_scale )
result = proxy_render.create_needed_proxies(new_scale);
- if( !result ) // resize project
+ if( !result ) { // resize project
edl->set_proxy(new_scale, new_use_scaler,
&proxy_render.orig_idxbls, &proxy_render.orig_proxies);
-
+ }
undo_after(_("proxy"), LOAD_ALL);
edl->Garbage::remove_user();
restart_brender();
init_3d();
if(debug) PRINT_TRACE
- show_splash();
if(debug) PRINT_TRACE
default_standard = default_std();
init_defaults(defaults, config_path);
check_language();
+ show_splash();
init_preferences();
if(splash_window)
splash_window->update_status(_("Initializing Plugins"));
run_lock->unlock();
}
-void MWindow::show_vwindow()
+void MWindow::show_vwindow(int raise)
{
int total_running = 0;
session->show_vwindow = 1;
for(int j = 0; j < vwindows.size(); j++) {
VWindow *vwindow = vwindows[j];
if( !vwindow->is_running() ) continue;
+ total_running++;
+ if( !raise && !vwindow->gui->is_hidden() ) continue;
vwindow->gui->lock_window("MWindow::show_vwindow");
vwindow->gui->show_window(0);
vwindow->gui->raise_window();
vwindow->gui->flush();
vwindow->gui->unlock_window();
- total_running++;
}
-
// If no windows visible
- if(!total_running)
- {
+ if( !total_running )
get_viewer(1, DEFAULT_VWINDOW);
- }
gui->mainmenu->show_vwindow->set_checked(1);
}
{
session->show_cwindow = 1;
cwindow->show_window();
+ cwindow->gui->tool_panel->raise_tool();
gui->mainmenu->show_cwindow->set_checked(1);
}
vwindow->gui->unlock_window();
}
}
- else
- show_vwindow();
+ else
+ show_vwindow(0);
if( !session->show_awindow && !awindow->gui->is_hidden() ) {
awindow->gui->lock_window("MWindow::restore_windows");
(Indexable*)edit->asset : (Indexable*)edit->nested_edl;
if( !idxbl ) return 0;
char path[BCTEXTLEN];
- if( !edit->asset || edit->track->data_type != TRACK_VIDEO ||
- edl->session->proxy_scale == 1 ||
+// map proxy colors to unproxy colors
+ if( edl->session->proxy_state != PROXY_ACTIVE ||
+ !edit->asset || edit->track->data_type != TRACK_VIDEO ||
ProxyRender::from_proxy_path(path, (Asset*)idxbl, edl->session->proxy_scale) )
strcpy(path, idxbl->path);
char *cp = strrchr(path, '/');
if( load_mode == LOADMODE_REPLACE ||
load_mode == LOADMODE_REPLACE_CONCATENATE ) {
edl->session->timecode_offset = 0;
- delete gui->keyvalue_popup;
- gui->keyvalue_popup = 0;
+ gui->close_keyvalue_popup();
gui->load_panes();
}
if(debug) PRINT_TRACE
}
-void MWindow::stack_push(EDL *new_edl, Indexable *idxbl, Edit *edit)
+void MWindow::stack_push(EDL *new_edl, Indexable *idxbl)
{
int got_indexes = 0;
for( int i=0; i<new_edl->nested_edls.size(); ++i ) {
undo_before();
StackItem &item = stack.append();
item.edl = edl;
- item.edit = edit;
item.new_edl = new_edl;
item.duration = new_edl->tracks->total_length();
item.undo = undo;
// session edl replaced, overwrite and save clip data
if( item.new_edl != edl )
item.new_edl->overwrite_clip(edl);
- Edit *edit = item.edit;
-// resize the referring edit if the edl duration changed
- if( edit ) {
- double duration = item.new_edl->tracks->total_length();
- double dt = duration - item.duration;
- if( fabs(dt) > 1e-4 ) {
- int64_t du = edit->track->to_units(dt,0);
- if( (edit->length+=du) < 0 )
- edit->length = 0;
+ Indexable *idxbl = item.idxbl;
+ if( idxbl && idxbl->is_asset && item.mtime ) {
+ Asset *asset = (Asset *)idxbl;
+ if( asset->format == FILE_REF ) {
+ char *path = asset->path;
+ struct stat st;
+ if( stat(path, &st) || item.mtime == st.st_mtime ) {
+ int cw = xS(250), ch = yS(150), px, py;
+ gui->get_pop_cursor(px, py);
+ px -= cw/2; py -= ch/2;
+ ConfirmRefWindow confirm(this, path, px, py, cw, ch);
+ confirm.create_objects();
+ int result = confirm.run_window();
+ if( !result ) {
+ FileXML file;
+ item.new_edl->save_xml(&file, path);
+ file.terminate_string();
+ if(file.write_to_file(path))
+ eprintf(_("Cant write FileREF: %s"), path);
+ }
+ }
}
}
edl->remove_user();
edl = item.edl;
delete undo;
undo = item.undo;
- Indexable *idxbl = item.idxbl;
- int64_t mtime = item.mtime;
stack.remove();
if( idxbl ) {
+// resize the indexable edits if the new_edl duration changed
+ double duration = item.new_edl->tracks->total_length();
+ double dt = duration - item.duration;
+ if( fabs(dt) > 1e-4 )
+ edl->tracks->update_idxbl_length(idxbl->id, dt);
gui->unlock_window();
gui->resource_thread->close_indexable(idxbl);
remove_from_caches(idxbl);
- remove_indexfile(idxbl);
+ IndexFile::delete_index_files(preferences, idxbl);
mainindexes->add_indexable(idxbl);
mainindexes->start_build();
awindow->gui->async_update_assets();
undo_after(_("open edl"), LOAD_ALL);
show_plugins();
gui->stack_button->update();
- if( mtime && idxbl && idxbl->is_asset ) {
- struct stat st;
- Asset *asset = (Asset *)idxbl;
- if( asset->format == FILE_REF && !stat(asset->path, &st) &&
- item.mtime == st.st_mtime ) {
- char text[BCTEXTLEN];
- snprintf(text, sizeof(text),
- _("Warning: Asset not updated: %s"), asset->path);
- show_warning(&preferences->warn_stack, text);
- }
- }
}
int MWindow::save(EDL *edl, char *filename, int stat)
if( prefs != preferences )
preferences->copy_from(prefs);
if( cwindow->playback_engine )
- cwindow->playback_engine->preferences->copy_from(prefs);
+ cwindow->playback_engine->update_preferences(prefs);
for(int i = 0; i < vwindows.size(); i++) {
VWindow *vwindow = vwindows[i];
if( !vwindow->is_running() ) continue;
if( vwindow->playback_engine )
- vwindow->playback_engine->preferences->copy_from(prefs);
+ vwindow->playback_engine->update_preferences(prefs);
}
for(int i = 0; i < zwindows.size(); i++) {
ZWindow *zwindow = zwindows[i];
if( !zwindow->is_running() ) continue;
if( zwindow->zgui->playback_engine )
- zwindow->zgui->playback_engine->preferences->copy_from(prefs);
+ zwindow->zgui->playback_engine->update_preferences(prefs);
}
}
void MWindow::remove_indexfile(Indexable *indexable)
{
if( !indexable->is_asset ) return;
- Asset *asset = (Asset *)indexable;
// Erase file
- IndexFile::delete_index(preferences, asset, ".toc");
- IndexFile::delete_index(preferences, asset, ".idx");
- IndexFile::delete_index(preferences, asset, ".mkr");
+ IndexFile::delete_index_files(preferences, indexable);
}
void MWindow::rebuild_indices()
return 0;
}
-void MWindow::reset_caches()
+void MWindow::reset_caches(int locked)
{
- int locked = gui->get_window_lock();
if( locked ) gui->unlock_window();
awindow->gui->stop_vicon_drawing(1);
- frame_cache->remove_all();
- wave_cache->remove_all();
- audio_cache->remove_all();
- video_cache->remove_all();
- if( cwindow->playback_engine ) {
- if( cwindow->playback_engine->audio_cache )
- cwindow->playback_engine->audio_cache->remove_all();
- if( cwindow->playback_engine->video_cache )
- cwindow->playback_engine->video_cache->remove_all();
- }
+ if( cwindow->playback_engine )
+ cwindow->playback_engine->create_cache();
for(int i = 0; i < vwindows.size(); i++) {
VWindow *vwindow = vwindows[i];
if( !vwindow->is_running() ) continue;
if( !vwindow->playback_engine ) continue;
- if( vwindow->playback_engine->audio_cache )
- vwindow->playback_engine->audio_cache->remove_all();
- if( vwindow->playback_engine->video_cache )
- vwindow->playback_engine->video_cache->remove_all();
+ vwindow->playback_engine->create_cache();
}
- if( locked ) gui->lock_window("MWindow::reset_caches");
+ gui->lock_window("MWindow::reset_caches");
+ frame_cache->remove_all();
+ wave_cache->remove_all();
+ audio_cache->remove_all();
+ video_cache->remove_all();
+ if( !locked ) gui->unlock_window();
}
void MWindow::remove_from_caches(Indexable *idxbl)
mwindow->gui->unlock_window();
}
+
+ConfirmRefWindow::ConfirmRefWindow(MWindow *mwindow, char *path,
+ int px, int py, int cw, int ch)
+ : BC_Window(_(PROGRAM_NAME ": Confirm update"), px, py, cw, ch, cw, ch)
+{
+ this->mwindow = mwindow;
+ this->path = path;
+}
+
+ConfirmRefWindow::~ConfirmRefWindow()
+{
+}
+
+void ConfirmRefWindow::create_objects()
+{
+ lock_window("ConfirmRefWindow::create_objects()");
+ int x = xS(10), y = yS(10), pad = yS(5);
+ BC_Title *title;
+ add_subwindow(title = new BC_Title(x, y, _("FileREF not updated:")));
+ y += title->get_h() + pad;
+ BC_TextBox *text_box;
+ add_subwindow(text_box = new BC_TextBox(x,y, get_w()-2*x, 1, path));
+ y += text_box->get_h() + 2*pad;
+ add_subwindow(title = new BC_Title(x, y, _("Save file ref changes?")));
+ add_subwindow(new BC_OKButton(this));
+ add_subwindow(new BC_CancelButton(this));
+ show_window();
+ unlock_window();
+}
+