back by popular demand: load mode icons, tweak shapewipe layout
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / cwindowtool.C
index 44daadd1a6a809e62ba2d082aa7d3d8e8a719382..88a524d7806aa07c98033798c42a827859a93607 100644 (file)
@@ -133,6 +133,7 @@ void CWindowTool::start_tool(int operation)
                                mwindow->edl->session->tool_window = 1;
                                gui->composite_panel->operation[CWINDOW_TOOL_WINDOW]->update(1);
                        }
+                       mwindow->edl->session->tool_window = new_gui ? 1 : 0;
                        update_show_window();
 
 // Signal thread to run next tool GUI
@@ -360,7 +361,7 @@ CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, float value, int l
 }
 
 CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, int value)
- : BC_TumbleTextBox(gui, (int64_t)value, (int64_t)-65536, (int64_t)65536, x, y, 70, 3)
+ : BC_TumbleTextBox(gui, (int64_t)value, (int64_t)-65536, (int64_t)65536, x, y, 70)
 {
        this->gui = gui;
 }
@@ -372,20 +373,20 @@ int CWindowCoord::handle_event()
 }
 
 
-CWindowCropOK::CWindowCropOK(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
- : BC_GenericButton(x, y, _("Do it"))
+CWindowCropApply::CWindowCropApply(MWindow *mwindow, CWindowCropGUI *crop_gui, int x, int y)
+ : BC_GenericButton(x, y, _("Apply"))
 {
        this->mwindow = mwindow;
-       this->gui = gui;
+       this->crop_gui = crop_gui;
 }
-int CWindowCropOK::handle_event()
+int CWindowCropApply::handle_event()
 {
-       mwindow->crop_video();
+       mwindow->crop_video(crop_gui->crop_mode->mode);
        return 1;
 }
 
 
-int CWindowCropOK::keypress_event()
+int CWindowCropApply::keypress_event()
 {
        if(get_keypress() == 0xd)
        {
@@ -395,7 +396,50 @@ int CWindowCropOK::keypress_event()
        return 0;
 }
 
+const char *CWindowCropOpMode::crop_ops[] = {
+       N_("Reformat"),
+       N_("Resize"),
+       N_("Shrink"),
+};
 
+CWindowCropOpMode::CWindowCropOpMode(MWindow *mwindow, CWindowCropGUI *crop_gui,
+                       int mode, int x, int y)
+ : BC_PopupMenu(x, y, 140, _(crop_ops[mode]), 1)
+{
+        this->mwindow = mwindow;
+        this->crop_gui = crop_gui;
+        this->mode = mode;
+}
+CWindowCropOpMode::~CWindowCropOpMode()
+{
+}
+
+void CWindowCropOpMode::create_objects()
+{
+       for( int id=0,nid=sizeof(crop_ops)/sizeof(crop_ops[0]); id<nid; ++id )
+               add_item(new CWindowCropOpItem(this, _(crop_ops[id]), id));
+       handle_event();
+}
+
+int CWindowCropOpMode::handle_event()
+{
+       set_text(_(crop_ops[mode]));
+       return 1;
+}
+
+CWindowCropOpItem::CWindowCropOpItem(CWindowCropOpMode *popup, const char *text, int id)
+ : BC_MenuItem(text)
+{
+       this->popup = popup;
+       this->id = id;
+}
+
+int CWindowCropOpItem::handle_event()
+{
+       popup->set_text(get_text());
+       popup->mode = id;
+       return popup->handle_event();
+}
 
 
 
@@ -430,17 +474,19 @@ void CWindowCropGUI::create_objects()
        add_subwindow(title = new BC_Title(x, y, _("W:")));
        column1 = MAX(column1, title->get_w());
        y += pad;
-       add_subwindow(new CWindowCropOK(mwindow, thread->tool_gui, x, y));
+       add_subwindow(new CWindowCropApply(mwindow, this, x, y));
 
        x += column1 + 5;
        y = 10;
        x1 = new CWindowCoord(thread->tool_gui, x, y,
                mwindow->edl->session->crop_x1);
        x1->create_objects();
+       x1->set_boundaries((int64_t)0, (int64_t)65536);
        y += pad;
        width = new CWindowCoord(thread->tool_gui, x, y,
                mwindow->edl->session->crop_x2 - mwindow->edl->session->crop_x1);
        width->create_objects();
+       width->set_boundaries((int64_t)1, (int64_t)65536);
 
 
        x += x1->get_w() + 10;
@@ -458,10 +504,19 @@ void CWindowCropGUI::create_objects()
        y1 = new CWindowCoord(thread->tool_gui, x, y,
                mwindow->edl->session->crop_y1);
        y1->create_objects();
+       y1->set_boundaries((int64_t)0, (int64_t)65536);
        y += pad;
+
        height = new CWindowCoord(thread->tool_gui, x, y,
                mwindow->edl->session->crop_y2 - mwindow->edl->session->crop_y1);
        height->create_objects();
+       height->set_boundaries((int64_t)1, (int64_t)65536);
+       y += pad;
+
+       add_subwindow(crop_mode = new CWindowCropOpMode(mwindow, this,
+                               CROP_REFORMAT, x, y));
+       crop_mode->create_objects();
+
        unlock_window();
 }
 
@@ -807,6 +862,11 @@ void CWindowCameraGUI::create_objects()
        add_subwindow(button = new CWindowCameraCenter(mwindow, this, x1, y));
        x1 += button->get_w();
        add_subwindow(button = new CWindowCameraRight(mwindow, this, x1, y));
+// additional Buttons to control the curve mode of the "current" keyframe
+       x1 += button->get_w() + 15;
+       add_subwindow(this->t_smooth = new CWindowCurveToggle(Camera_Crv_Smooth, mwindow, this, x1, y));
+       x1 += button->get_w() + 10;
+       add_subwindow(this->t_linear = new CWindowCurveToggle(Camera_Crv_Linear, mwindow, this, x1, y));
 
        y += button->get_h();
        x1 = 10;
@@ -815,11 +875,10 @@ void CWindowCameraGUI::create_objects()
        add_subwindow(button = new CWindowCameraMiddle(mwindow, this, x1, y));
        x1 += button->get_w();
        add_subwindow(button = new CWindowCameraBottom(mwindow, this, x1, y));
-// additional Buttons to control the curve mode of the "current" keyframe
        x1 += button->get_w() + 15;
-       add_subwindow(this->t_smooth = new CWindowCurveToggle(Camera_Crv_Smooth, mwindow, this, x1, y));
-       x1 += button->get_w();
-       add_subwindow(this->t_linear = new CWindowCurveToggle(Camera_Crv_Linear, mwindow, this, x1, y));
+       add_subwindow(this->add_keyframe = new CWindowCameraAddKeyframe(mwindow, this, x1, y));
+       x1 += button->get_w() + 10;
+       add_subwindow(this->reset = new CWindowCameraReset(mwindow, this, x1, y));
 
 // fill in current auto keyframe values, set toggle states.
        this->update();
@@ -1139,6 +1198,34 @@ int CWindowCameraBottom::handle_event()
        return 1;
 }
 
+CWindowCameraAddKeyframe::CWindowCameraAddKeyframe(MWindow *mwindow,
+               CWindowToolGUI *gui, int x, int y)
+ : BC_Button(x, y, mwindow->theme->get_image_set("keyframe_button"))
+{
+       this->mwindow = mwindow;
+       this->gui = gui;
+       set_tooltip(_("Add Keyframe: Shift-F11"));
+}
+
+int CWindowCameraAddKeyframe::handle_event()
+{
+       return gui->press(&CWindowCanvas::camera_keyframe);
+}
+
+CWindowCameraReset::CWindowCameraReset(MWindow *mwindow,
+               CWindowToolGUI *gui, int x, int y)
+ : BC_Button(x, y, mwindow->theme->get_image_set("reset_button"))
+{
+       this->mwindow = mwindow;
+       this->gui = gui;
+       set_tooltip(_("Reset Camera: F11"));
+}
+
+int CWindowCameraReset::handle_event()
+{
+       return gui->press(&CWindowCanvas::reset_camera);
+}
+
 
 CWindowProjectorGUI::CWindowProjectorGUI(MWindow *mwindow, CWindowTool *thread)
  : CWindowToolGUI(mwindow,
@@ -1195,6 +1282,11 @@ void CWindowProjectorGUI::create_objects()
        add_subwindow(button = new CWindowProjectorCenter(mwindow, this, x1, y));
        x1 += button->get_w();
        add_subwindow(button = new CWindowProjectorRight(mwindow, this, x1, y));
+// additional Buttons to control the curve mode of the "current" keyframe
+       x1 += button->get_w() + 15;
+       add_subwindow(this->t_smooth = new CWindowCurveToggle(Projector_Crv_Smooth, mwindow, this, x1, y));
+       x1 += button->get_w() + 10;
+       add_subwindow(this->t_linear = new CWindowCurveToggle(Projector_Crv_Linear, mwindow, this, x1, y));
 
        y += button->get_h();
        x1 = 10;
@@ -1203,12 +1295,10 @@ void CWindowProjectorGUI::create_objects()
        add_subwindow(button = new CWindowProjectorMiddle(mwindow, this, x1, y));
        x1 += button->get_w();
        add_subwindow(button = new CWindowProjectorBottom(mwindow, this, x1, y));
-
-// additional Buttons to control the curve mode of the "current" keyframe
        x1 += button->get_w() + 15;
-       add_subwindow(this->t_smooth = new CWindowCurveToggle(Projector_Crv_Smooth, mwindow, this, x1, y));
-       x1 += button->get_w();
-       add_subwindow(this->t_linear = new CWindowCurveToggle(Projector_Crv_Linear, mwindow, this, x1, y));
+       add_subwindow(this->add_keyframe = new CWindowProjectorAddKeyframe(mwindow, this, x1, y));
+       x1 += button->get_w() + 10;
+       add_subwindow(this->reset = new CWindowProjectorReset(mwindow, this, x1, y));
 
 // fill in current auto keyframe values, set toggle states.
        this->update();
@@ -1486,6 +1576,44 @@ int CWindowProjectorBottom::handle_event()
        return 1;
 }
 
+CWindowProjectorAddKeyframe::CWindowProjectorAddKeyframe(MWindow *mwindow,
+               CWindowToolGUI *gui, int x, int y)
+ : BC_Button(x, y, mwindow->theme->get_image_set("keyframe_button"))
+{
+       this->mwindow = mwindow;
+       this->gui = gui;
+       set_tooltip(_("Add Keyframe: Shift-F12"));
+}
+
+int CWindowProjectorAddKeyframe::handle_event()
+{
+       return gui->press(&CWindowCanvas::projector_keyframe);
+}
+
+CWindowProjectorReset::CWindowProjectorReset(MWindow *mwindow,
+               CWindowToolGUI *gui, int x, int y)
+ : BC_Button(x, y, mwindow->theme->get_image_set("reset_button"))
+{
+       this->mwindow = mwindow;
+       this->gui = gui;
+       set_tooltip(_("Reset Projector: F12"));
+}
+
+int CWindowProjectorReset::handle_event()
+{
+       return gui->press(&CWindowCanvas::reset_projector);
+}
+
+int CWindowToolGUI::press(void (CWindowCanvas::*fn)())
+{
+       unlock_window();
+       CWindowGUI *cw_gui = thread->gui;
+       cw_gui->lock_window("CWindowGUI::press");
+       (cw_gui->canvas->*fn)();
+       cw_gui->unlock_window();
+       lock_window("CWindowToolGUI::press");
+       return 1;
+}
 
 CWindowMaskOnTrack::CWindowMaskOnTrack(MWindow *mwindow, CWindowMaskGUI *gui,
                int x, int y, int w, const char *text)
@@ -2139,6 +2267,8 @@ int CWindowMaskFeather::update_value(float v)
 int CWindowMaskFeather::handle_event()
 {
        float v = atof(get_text());
+       if( fabsf(v) > MAX_FEATHER )
+               BC_TumbleTextBox::update((float)(v>=0 ? MAX_FEATHER : -MAX_FEATHER));
        gui->feather_slider->update(v);
        return gui->feather->update_value(v);
 }
@@ -2165,6 +2295,8 @@ int CWindowMaskFeatherSlider::handle_event()
 {
        int sticky = 0;
        float v = get_value();
+       if( fabsf(v) > MAX_FEATHER )
+               v = v>=0 ? MAX_FEATHER : -MAX_FEATHER;
        if( stick && timer->get_difference() >= 250 )
                stick = 0; // no events for .25 sec
        if( stick && (last_v * (v-last_v)) < 0 )
@@ -2177,6 +2309,7 @@ int CWindowMaskFeatherSlider::handle_event()
                }
                if( last_v ) {
                        max *= 1.25;
+                       if( max > MAX_FEATHER ) max = MAX_FEATHER;
                        update(get_w(), v=last_v, -max-5, max+5);
                        button_release_event();
                }
@@ -2192,7 +2325,9 @@ int CWindowMaskFeatherSlider::handle_event()
 
 int CWindowMaskFeatherSlider::update(float v)
 {
-       while( max < v ) max *= 1.25;
+       float vv = fabsf(v);
+       if( vv > MAX_FEATHER ) vv = MAX_FEATHER;
+       while( max < vv ) max *= 1.25;
        return update(get_w(), v, -max-5, max+5);
 }
 int CWindowMaskFeatherSlider::update(int r, float v, float mn, float mx)
@@ -3612,6 +3747,3 @@ void CWindowRulerGUI::handle_event()
 {
 }
 
-
-
-