reload plugin btn in prefs, speed gang fader tweaks
[goodguy/history.git] / cinelerra-5.1 / cinelerra / preferencesthread.C
index 8d8e22c79bc2aafe8e16d177ad1b113c21ccf660..af64fed165775894bd6c9908a9dfcc946b0e3601 100644 (file)
  */
 
 #include "aboutprefs.h"
+#include "appearanceprefs.h"
 #include "asset.h"
 #include "audiodevice.inc"
 #include "bcsignals.h"
+#include "bctrace.h"
 #include "cache.h"
 #include "cplayback.h"
 #include "cwindow.h"
@@ -30,6 +32,7 @@
 #include "bchash.h"
 #include "edl.h"
 #include "edlsession.h"
+#include "file.h"
 #include "filesystem.h"
 #include "fonts.h"
 #include "interfaceprefs.h"
@@ -61,8 +64,8 @@
 
 
 
-#define WIDTH 770
-#define HEIGHT 690
+#define WIDTH 840
+#define HEIGHT 700
 
 
 PreferencesMenuitem::PreferencesMenuitem(MWindow *mwindow)
@@ -127,10 +130,17 @@ BC_Window* PreferencesThread::new_gui()
        int scr_w = mwindow->gui->get_screen_w(0, -1);
        int scr_h = mwindow->gui->get_screen_h(0, -1);
 
-       int x = scr_x + scr_w / 2 - WIDTH / 2;
-       int y = scr_h / 2 - HEIGHT / 2;
+       int w = WIDTH, h = HEIGHT;
+       int min_w = mwindow->theme->preferencescategory_x;
+       for(int i = 0; i < CATEGORIES; i++) {
+               min_w += PreferencesButton::calculate_w(mwindow->gui, category_to_text(i)) -
+                       mwindow->theme->preferences_category_overlap;
+       }
+       if( w < min_w ) w = min_w;
+       int x = scr_x + scr_w / 2 - w / 2;
+       int y = scr_h / 2 - h / 2;
 
-       window = new PreferencesWindow(mwindow, this, x, y);
+       window = new PreferencesWindow(mwindow, this, x, y, w, h);
        window->create_objects();
        mwindow->gui->unlock_window();
 
@@ -200,26 +210,60 @@ int PreferencesThread::apply_settings()
                (preferences->force_uniprocessor != mwindow->preferences->force_uniprocessor) ||
                this_playback_config->active_config != playback_config->active_config ||
                (*this_aconfig != *aconfig) || (*this_vconfig != *vconfig) ||
-               !preferences->brender_asset->equivalent(*mwindow->preferences->brender_asset, 0, 1);
+               !preferences->brender_asset->equivalent(*mwindow->preferences->brender_asset, 0, 1, edl);
+
+       if( preferences->yuv_color_space != mwindow->preferences->yuv_color_space ||
+           preferences->yuv_color_range != mwindow->preferences->yuv_color_range ) {
+               YUV::yuv.yuv_set_colors(
+                       preferences->yuv_color_space,
+                       preferences->yuv_color_range);
+               rerender = 1;
+       }
+
+       if( preferences->highlight_inverse != mwindow->preferences->highlight_inverse ) {
+               mwindow->gui->lock_window("PreferencesThread::apply_settings 0");
+               mwindow->gui->hide_cursor(0);
+               mwindow->gui->unlock_window();
+               redraw_overlays = 1;
+       }
+       PreferencesWindow *window = (PreferencesWindow*)get_gui();
+       if( window ) window->unlock_window();
+       mwindow->init_brender();
+       if( window ) window->lock_window("PreferencesThread::apply_settings 5");
 
        if( strcmp(preferences->theme, mwindow->preferences->theme) != 0 )
                mwindow->restart_status = -1; // reload, need new bcresources
+       if( strcmp(preferences->plugin_icons, mwindow->preferences->plugin_icons) != 0 )
+               mwindow->restart_status = -1;
+       if( strcmp(preferences->lv2_path, mwindow->preferences->lv2_path) != 0 )
+               reload_plugins = 1;
+       if( reload_plugins ) {
+               MWindow::remove_plugin_index();
+               File::setenv_path("LV2_PATH", preferences->lv2_path, 1);
+               mwindow->restart_status = -1;
+       }
 
        mwindow->edl->copy_session(edl, 1);
        mwindow->preferences->copy_from(preferences);
-       mwindow->init_brender();
 
        BC_Signals::set_catch_segv(mwindow->preferences->trap_sigsegv);
        BC_Signals::set_catch_intr(mwindow->preferences->trap_sigintr);
+       BC_WindowBase::get_resources()->popupmenu_btnup = mwindow->preferences->popupmenu_btnup;
+       BC_WindowBase::get_resources()->grab_input_focus = mwindow->preferences->grab_input_focus;
+       BC_WindowBase::get_resources()->textbox_focus_policy = mwindow->preferences->textbox_focus_policy;
+       if( mwindow->preferences->trap_sigsegv || mwindow->preferences->trap_sigintr ) {
+               BC_Trace::enable_locks();
+       }
+       else {
+               BC_Trace::disable_locks();
+       }
 
        mwindow->reset_android_remote();
-       mwindow->gui->ffmpeg_toggle->update(mwindow->preferences->ffmpeg_early_probe);
-       mwindow->gui->ffmpeg_toggle->set_tooltip( mwindow->preferences->ffmpeg_early_probe ?
-               _("Try FFMpeg first") : _("Try FFMpeg last") );
+       int ffmpeg_early_probe = mwindow->preferences->get_file_probe_armed("FFMPEG_Early");
+       mwindow->gui->ffmpeg_toggle->update(ffmpeg_early_probe);
+       mwindow->gui->ffmpeg_toggle->set_tooltip(ffmpeg_early_probe ?
+               FFMPEG_EARLY_TIP : FFMPEG_LATE_TIP);
        mwindow->gui->mainshbtns->load(mwindow->preferences);
-       double tc_position = 
-               mwindow->edl->session->get_frame_offset() / mwindow->edl->session->frame_rate;
-       mwindow->gui->mainclock->set_position_offset(tc_position);
 
 //edl->session->recording_format->dump();
 //mwindow->edl->session->recording_format->dump();
@@ -274,6 +318,7 @@ int PreferencesThread::apply_settings()
        if(redraw_overlays)
        {
                mwindow->gui->lock_window("PreferencesThread::apply_settings 2");
+               mwindow->gui->show_cursor(0);
                mwindow->gui->draw_overlays(1);
                mwindow->gui->unlock_window();
        }
@@ -291,10 +336,7 @@ int PreferencesThread::apply_settings()
 //printf("PreferencesThread::apply_settings 1\n");
 // This doesn't stop and restart, only reloads the assets before
 // the next play command.
-               mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
-                       CHANGE_ALL,
-                       mwindow->edl,
-                       1);
+               mwindow->cwindow->refresh_frame(CHANGE_ALL, mwindow->edl);
 //printf("PreferencesThread::apply_settings 10\n");
        }
 
@@ -325,6 +367,8 @@ const char* PreferencesThread::category_to_text(int category)
                        return _("Performance");
                case INTERFACE:
                        return _("Interface");
+               case APPEARANCE:
+                       return _("Appearance");
                case ABOUT:
                        return _("About");
        }
@@ -356,11 +400,8 @@ SET_TRACE
 
 
 PreferencesWindow::PreferencesWindow(MWindow *mwindow,
-       PreferencesThread *thread,
-       int x,
-       int y)
- : BC_Window(_(PROGRAM_NAME ": Preferences"),
-       x,y, WIDTH,HEIGHT, WIDTH,HEIGHT, 1,0,1)
+       PreferencesThread *thread, int x, int y, int w, int h)
+ : BC_Window(_(PROGRAM_NAME ": Preferences"), x,y, w,h,w,h, 1)
 {
        this->mwindow = mwindow;
        this->thread = thread;
@@ -396,11 +437,7 @@ void PreferencesWindow::create_objects()
        for(int i = 0; i < CATEGORIES; i++)
        {
                add_subwindow(category_button[i] = new PreferencesButton(mwindow,
-                       thread,
-                       x,
-                       y,
-                       i,
-                       thread->category_to_text(i),
+                       thread, x, y, i, thread->category_to_text(i),
                        (i == thread->current_dialog) ?
                                mwindow->theme->get_image_set("category_button_checked") :
                                mwindow->theme->get_image_set("category_button")));
@@ -506,6 +543,10 @@ int PreferencesWindow::set_current_dialog(int number)
                        add_subwindow(dialog = new InterfacePrefs(mwindow, this));
                        break;
 
+               case PreferencesThread::APPEARANCE:
+                       add_subwindow(dialog = new AppearancePrefs(mwindow, this));
+                       break;
+
                case PreferencesThread::ABOUT:
                        add_subwindow(dialog = new AboutPrefs(mwindow, this));
                        break;
@@ -518,6 +559,7 @@ int PreferencesWindow::set_current_dialog(int number)
 //printf("PreferencesWindow::set_current_dialog %d\n", __LINE__);
                dialog->create_objects();
 //printf("PreferencesWindow::set_current_dialog %d\n", __LINE__);
+               dialog->lower_window();
                dialog->show_window(0);
        }
 
@@ -597,10 +639,15 @@ PreferencesApply::PreferencesApply(MWindow *mwindow, PreferencesThread *thread)
        this->mwindow = mwindow;
        this->thread = thread;
 }
-
 int PreferencesApply::handle_event()
 {
        thread->apply_settings();
+       mwindow->save_defaults();
+       return 1;
+}
+int PreferencesApply::resize_event(int w, int h)
+{
+       reposition_window(w/2 - get_w()/2, h-get_h()-10);
        return 1;
 }
 
@@ -615,7 +662,6 @@ PreferencesOK::PreferencesOK(MWindow *mwindow, PreferencesThread *thread)
        this->mwindow = mwindow;
        this->thread = thread;
 }
-
 int PreferencesOK::keypress_event()
 {
        if(get_keypress() == RETURN)
@@ -630,6 +676,11 @@ int PreferencesOK::handle_event()
        thread->window->set_done(0);
        return 1;
 }
+int PreferencesOK::resize_event(int w, int h)
+{
+       reposition_window(10, h-get_h()-10);
+       return 1;
+}
 
 
 
@@ -650,12 +701,16 @@ int PreferencesCancel::keypress_event()
        }
        return 0;
 }
-
 int PreferencesCancel::handle_event()
 {
        thread->window->set_done(1);
        return 1;
 }
+int PreferencesCancel::resize_event(int w, int h)
+{
+       reposition_window(w-get_w()-10, h-get_h()-10);
+       return 1;
+}