undo nested clip bug, wheel zoom redraw fix, uninited vars, shortcuts doc
[goodguy/history.git] / cinelerra-5.1 / cinelerra / mwindowgui.C
index 4f602a5dd48dd92d8b19b688be3e04bc78df05e5..1ac33aafa235c7f2c02a646b9e7d184b5f78c64c 100644 (file)
@@ -120,6 +120,7 @@ MWindowGUI::MWindowGUI(MWindow *mwindow)
        plugin_menu = 0;
        keyframe_menu = 0;
        keyframe_hide = 0;
+       keyvalue_popup = 0;
        transition_menu = 0;
        remote_control = 0;
        cwindow_remote_handler = 0;
@@ -134,6 +135,7 @@ MWindowGUI::~MWindowGUI()
        delete cwindow_remote_handler;
        delete record_remote_handler;
        delete remote_control;
+       delete keyvalue_popup;
 //     delete samplescroll;
 //     delete trackscroll;
        for(int i = 0; i < TOTAL_PANES; i++)
@@ -318,12 +320,8 @@ void MWindowGUI::create_objects()
 
        if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
        add_subwindow(mainclock = new MainClock(mwindow,
-               mwindow->theme->mclock_x,
-               mwindow->theme->mclock_y,
+               mwindow->theme->mclock_x, mwindow->theme->mclock_y,
                mwindow->theme->mclock_w));
-       mainclock->set_position_offset( (double)
-               (mwindow->edl->session->get_frame_offset() /
-                       mwindow->edl->session->frame_rate));
        if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
        mainclock->update(0);
 
@@ -403,10 +401,10 @@ int MWindowGUI::resize_event(int w, int h)
        int x = w - MainShBtns::calculate_w(0);
        mainmenu->resize_event(x, mainmenu->get_h());
        mainshbtns->reposition_window(x, -1);
+       ffmpeg_toggle->reposition_window(menu_w(), menu_h()+2);
        mwindow->theme->get_mwindow_sizes(this, w, h);
        mwindow->theme->draw_mwindow_bg(this);
        mbuttons->resize_event();
-       ffmpeg_toggle->reposition_window(menu_w(), menu_h()+2);
        statusbar->resize_event();
        zoombar->resize_event();
 
@@ -533,6 +531,7 @@ int MWindowGUI::resize_event(int w, int h)
                mwindow->theme->mzoom_y + 1 - mwindow->theme->get_image_set("pane")[0]->get_h());
        resource_thread->start_draw();
 
+       flash(1);
        return 0;
 }
 
@@ -915,16 +914,25 @@ int MWindowGUI::visible(int64_t x1, int64_t x2, int64_t view_x1, int64_t view_x2
 }
 
 
-int MWindowGUI::show_message(char *message, int color)
+void MWindowGUI::show_message(const char *message, int color)
 {
-// printf("MWindowGUI::show_message %d: %s 0x%08x 0x%08x\n",
-// __LINE__, message, color, mwindow->theme->message_normal);
-       if(color < 0) color = mwindow->theme->message_normal;
-       statusbar->status_text->set_color(color);
-       statusbar->status_text->update(message);
-       return 0;
+       statusbar->show_message(message, color);
+}
+
+void MWindowGUI::update_default_message()
+{
+       statusbar->update_default_message();
+}
+
+void MWindowGUI::reset_default_message()
+{
+       statusbar->reset_default_message();
 }
 
+void MWindowGUI::default_message()
+{
+       statusbar->default_message();
+}
 
 // Drag motion called from other window
 int MWindowGUI::drag_motion()
@@ -1031,7 +1039,7 @@ int MWindowGUI::drag_stop()
        }
 
 
-//printf("TrackCanvas::drag_stop %d %d\n", redraw, mwindow->session->current_operation);
+//printf("MWindowGUI::drag_stop %d %d\n", redraw, mwindow->session->current_operation);
        if(redraw)
        {
                mwindow->edl->tracks->update_y_pixels(mwindow->theme);
@@ -1054,7 +1062,8 @@ void MWindowGUI::default_positions()
 {
 //printf("MWindowGUI::default_positions 1\n");
        VWindow *vwindow = mwindow->vwindows.size() > DEFAULT_VWINDOW ?
-               mwindow->vwindows.get(0) : 0;
+               mwindow->vwindows.get(DEFAULT_VWINDOW) : 0;
+       if( vwindow && !vwindow->is_running() ) vwindow = 0;
        if( vwindow ) vwindow->gui->lock_window("MWindowGUI::default_positions");
        mwindow->cwindow->gui->lock_window("MWindowGUI::default_positions");
        mwindow->awindow->gui->lock_window("MWindowGUI::default_positions");
@@ -1107,19 +1116,13 @@ void MWindowGUI::default_positions()
 }
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
+int MWindowGUI::button_release_event()
+{
+       if( keyvalue_popup ) {
+               delete keyvalue_popup;  keyvalue_popup = 0;
+       }
+       return 0;
+}
 
 
 int MWindowGUI::repeat_event(int64_t duration)
@@ -1159,12 +1162,22 @@ int MWindowGUI::keypress_event()
        int result = mbuttons->keypress_event();
        if( result ) return result;
 
+       Track *this_track = 0;
+
        switch(get_keypress()) {
        case 'e':
                mwindow->toggle_editing_mode();
                result = 1;
                break;
 
+       case 'k': case 'K':
+               if( alt_down() ) break;
+               stop_transport("MWindowGUI::keypress_event 1");
+               mwindow->nearest_plugin_keyframe(shift_down(),
+                       !ctrl_down() ? PLAY_FORWARD : PLAY_REVERSE);
+               result = 1;
+               break;
+
        case '1': case '2': case '3': case '4':
        case '5': case '6': case '7': case '8':
                if( !alt_down() || shift_down() ) break;
@@ -1175,9 +1188,7 @@ int MWindowGUI::keypress_event()
        case LEFT:
                if( !ctrl_down() ) {
                        if( alt_down() ) {
-                               unlock_window();
-                               mbuttons->transport->handle_transport(STOP, 1, 0, 0);
-                               lock_window("MWindowGUI::keypress_event 1");
+                               stop_transport("MWindowGUI::keypress_event 1");
                                mwindow->prev_edit_handle(shift_down());
                        }
                        else
@@ -1186,12 +1197,17 @@ int MWindowGUI::keypress_event()
                }
                break;
 
+       case ',':
+               if( !ctrl_down() && !alt_down() ) {
+                       mwindow->move_left();
+                       result = 1;
+               }
+               break;
+
        case RIGHT:
                if( !ctrl_down() ) {
                        if( alt_down() ) {
-                               unlock_window();
-                               mbuttons->transport->handle_transport(STOP, 1, 0, 0);
-                               lock_window("MWindowGUI::keypress_event 2");
+                               stop_transport("MWindowGUI::keypress_event 2");
                                mwindow->next_edit_handle(shift_down());
                        }
                        else
@@ -1200,6 +1216,13 @@ int MWindowGUI::keypress_event()
                }
                break;
 
+       case '.':
+               if( !ctrl_down() && !alt_down() ) {
+                       mwindow->move_right();
+                       result = 1;
+               }
+               break;
+
        case UP:
                if( ctrl_down() && !alt_down() )
                        mwindow->expand_y();
@@ -1242,7 +1265,6 @@ int MWindowGUI::keypress_event()
 
        case TAB:
        case LEFTTAB:
-               Track *this_track = 0;
                for( int i=0; i<TOTAL_PANES; ++i ) {
                        if( !pane[i] ) continue;
                        if( (this_track = pane[i]->over_track()) != 0 ) break;
@@ -1266,10 +1288,23 @@ int MWindowGUI::keypress_event()
                update(0, 1, 0, 0, 1, 0, 1);
                unlock_window();
                mwindow->cwindow->update(0, 1, 1);
-               lock_window("TrackCanvas::keypress_event 3");
+               lock_window("MWindowGUI::keypress_event 3");
 
                result = 1;
                break;
+
+       case KEY_F1:
+       case KEY_F2:
+       case KEY_F3:
+       case KEY_F4:
+       case KEY_F5:
+       case KEY_F6:
+       case KEY_F7:
+       case KEY_F8:
+       case KEY_F9:
+       case KEY_F10:
+               resend_event(mwindow->cwindow->gui);
+               return 1;
        }
 
 // since things under cursor have changed...
@@ -1279,7 +1314,6 @@ int MWindowGUI::keypress_event()
        return result;
 }
 
-
 int MWindowGUI::keyboard_listener(BC_WindowBase *wp)
 {
        return key_listener(wp->get_keypress());
@@ -1296,7 +1330,7 @@ int MWindowGUI::key_listener(int key)
                        record->record_gui->interrupt_thread->start(0);
                break;
        case KPHAND:
-               mwindow->quit(0);
+               mwindow->quit();
                break;
 #ifdef HAVE_DVB
        case KPBOOK:
@@ -2234,6 +2268,32 @@ void MWindowGUI::draw_trackmovement()
 }
 
 
+void MWindowGUI::update_mixers(Track *track, int v)
+{
+       for( int i=0; i<TOTAL_PANES;  ++i ) {
+               if( !pane[i] ) continue;
+               PatchBay *patchbay = pane[i]->patchbay;
+               if( !patchbay ) continue;
+               for( int j=0; j<patchbay->patches.total; ++j ) {
+                       PatchGUI *patchgui = patchbay->patches.values[j];
+                       if( !patchgui->mix ) continue;
+                       if( !track || patchgui->track == track ) {
+                               patchgui->mix->update(v>=0 ? v :
+                                       mwindow->mixer_track_active(patchgui->track));
+                       }
+               }
+       }
+}
+
+void MWindowGUI::stop_transport(const char *lock_msg)
+{
+       if( !mbuttons->transport->is_stopped() ) {
+               if( lock_msg ) unlock_window();
+               mbuttons->transport->handle_transport(STOP, 1, 0, 0);
+               if( lock_msg ) lock_window(lock_msg);
+       }
+}
+
 PaneButton::PaneButton(MWindow *mwindow, int x, int y)
  : BC_Button(x, y, mwindow->theme->get_image_set("pane"))
 {
@@ -2268,20 +2328,20 @@ int PaneButton::cursor_motion_event()
 
 int PaneButton::button_release_event()
 {
-       mwindow->gui->stop_pane_drag();
-
+       if( get_buttonpress() != WHEEL_DOWN && get_buttonpress() != WHEEL_UP )
+               mwindow->gui->stop_pane_drag();
        int result = BC_Button::button_release_event();
        return result;
 }
 
 
 FFMpegToggle::FFMpegToggle(MWindow *mwindow, MButtons *mbuttons, int x, int y)
- : BC_Toggle(x, y, mwindow->theme->ffmpeg_toggle, mwindow->preferences->ffmpeg_early_probe)
+ : BC_Toggle(x, y, mwindow->theme->ffmpeg_toggle,
+        mwindow->preferences->get_file_probe_armed("FFMPEG_Early") > 0 ? 1 : 0)
 {
        this->mwindow = mwindow;
        this->mbuttons = mbuttons;
-       set_tooltip( mwindow->preferences->ffmpeg_early_probe ?
-               _("Try FFMpeg first") : _("Try FFMpeg last"));
+       set_tooltip(get_value() ? FFMPEG_EARLY_TIP : FFMPEG_LATE_TIP);
 }
 
 FFMpegToggle::~FFMpegToggle()
@@ -2290,9 +2350,11 @@ FFMpegToggle::~FFMpegToggle()
 
 int FFMpegToggle::handle_event()
 {
-       mwindow->preferences->ffmpeg_early_probe = get_value();
-       set_tooltip( mwindow->preferences->ffmpeg_early_probe ?
-               _("Try FFMpeg first") : _("Try FFMpeg last"));
+       int ffmpeg_early_probe = get_value();
+       set_tooltip(ffmpeg_early_probe ? FFMPEG_EARLY_TIP : FFMPEG_LATE_TIP);
+       mwindow->preferences->set_file_probe_armed("FFMPEG_Early", ffmpeg_early_probe);
+       mwindow->preferences->set_file_probe_armed("FFMPEG_Late", !ffmpeg_early_probe);
+
        mwindow->show_warning(&mwindow->preferences->warn_indexes,
                _("Changing the base codecs may require rebuilding indexes."));
        return 1;