add crop plugin, add timeline bars, render setup err chks, minor tweaks
[goodguy/cinelerra.git] / cinelerra-5.1 / plugins / crop / cropwin.C
diff --git a/cinelerra-5.1/plugins/crop/cropwin.C b/cinelerra-5.1/plugins/crop/cropwin.C
new file mode 100644 (file)
index 0000000..654263b
--- /dev/null
@@ -0,0 +1,550 @@
+
+/*
+ * CINELERRA
+ * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*
+ * 2019. Derivative by Translate plugin. This plugin works also with Proxy.
+ * It uses Percent values instead of Pixel value coordinates.
+*/
+
+#include "bcdisplayinfo.h"
+#include "clip.h"
+#include "language.h"
+#include "theme.h"
+#include "crop.h"
+#include "cropwin.h"
+
+
+
+
+
+
+
+
+
+
+
+
+CropWin::CropWin(CropMain *client)
+ : PluginClientWindow(client,
+       420,
+       290,
+       420,
+       290,
+       0)
+{
+       this->client = client;
+}
+
+CropWin::~CropWin()
+{
+}
+
+void CropWin::create_objects()
+{
+       int x = 10, x1 = 40, x2 = 80, x_middle= (get_w() / 2), x3 = 180;
+       int y = 10;
+       int clr_x = get_w()-x - 22; // note: clrBtn_w = 22
+
+       BC_TitleBar *title_bar;
+       BC_Bar *bar;
+
+// Crop section
+       add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Crop")));
+       y += 20;
+       add_tool(new BC_Title(x, y, _("Left")));
+       add_tool(new BC_Title((x2-x), y, _("%")));
+       crop_left_text = new CropLeftText(this, client, (x + x2), y);
+       crop_left_text->create_objects();
+       crop_left_slider = new CropLeftSlider(this, client, x3, y, 200);
+       add_subwindow(crop_left_slider);
+       clr_x = x3 + crop_left_slider->get_w() + x;
+       add_subwindow(crop_left_clr = new CropEdgesClr(this, client,
+               clr_x, y, RESET_LEFT));
+       y += 30;
+       add_tool(new BC_Title(x, y, _("Top")));
+       add_tool(new BC_Title((x2-x), y, _("%")));
+       crop_top_text = new CropTopText(this, client, (x + x2), y);
+       crop_top_text->create_objects();
+       crop_top_slider = new CropTopSlider(this, client, x3, y, 200);
+       add_subwindow(crop_top_slider);
+       add_subwindow(crop_top_clr = new CropEdgesClr(this, client,
+               clr_x, y, RESET_TOP));
+       y += 30;
+       add_tool(new BC_Title(x, y, _("Right")));
+       add_tool(new BC_Title((x2-x), y, _("%")));
+       crop_right_text = new CropRightText(this, client, (x + x2), y);
+       crop_right_text->create_objects();
+       crop_right_slider = new CropRightSlider(this, client, x3, y, 200);
+       add_subwindow(crop_right_slider);
+       add_subwindow(crop_right_clr = new CropEdgesClr(this, client,
+               clr_x, y, RESET_RIGHT));
+       y += 30;
+       add_tool(new BC_Title(x, y, _("Bottom")));
+       add_tool(new BC_Title((x2-x), y, _("%")));
+       crop_bottom_text = new CropBottomText(this, client, (x + x2), y);
+       crop_bottom_text->create_objects();
+       crop_bottom_slider = new CropBottomSlider(this, client, x3, y, 200);
+       add_subwindow(crop_bottom_slider);
+       add_subwindow(crop_bottom_clr = new CropEdgesClr(this, client,
+               clr_x, y, RESET_BOTTOM));
+       y += 40;
+
+// Position section
+       add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Position")));
+       y += 20;
+       add_tool(new BC_Title(x, y, _("X")));
+       add_tool(new BC_Title((x2-x), y, _("%")));
+       crop_position_x_text = new CropPositionXText(this, client, (x + x2), y);
+       crop_position_x_text->create_objects();
+       crop_position_x_slider = new CropPositionXSlider(this, client, x3, y, 200);
+       add_subwindow(crop_position_x_slider);
+       add_subwindow(crop_position_x_clr = new CropEdgesClr(this, client,
+               clr_x, y, RESET_POSITION_X));
+       y += 30;
+       add_tool(new BC_Title(x, y, _("Y")));
+       add_tool(new BC_Title((x2-x), y, _("%")));
+       crop_position_y_text = new CropPositionYText(this, client, (x + x2), y);
+       crop_position_y_text->create_objects();
+       crop_position_y_slider = new CropPositionYSlider(this, client, x3, y, 200);
+       add_subwindow(crop_position_y_slider);
+       add_subwindow(crop_position_y_clr = new CropEdgesClr(this, client,
+               clr_x, y, RESET_POSITION_Y));
+       y += 40;
+
+// Reset section
+       add_subwindow(bar = new BC_Bar(x, y, get_w()-2*x));
+       y += 10;
+       add_tool(reset = new CropReset(client, this, x, y));
+
+       show_window();
+       flush();
+}
+
+void CropWin::update(int clear)
+{
+       switch(clear) {
+               case RESET_LEFT :
+                       crop_left_text->update((float)client->config.crop_l);
+                       crop_left_slider->update((float)client->config.crop_l);
+                       break;
+               case RESET_TOP :
+                       crop_top_text->update((float)client->config.crop_t);
+                       crop_top_slider->update((float)client->config.crop_t);
+                       break;
+               case RESET_RIGHT :
+                       crop_right_text->update((float)client->config.crop_r);
+                       crop_right_slider->update((float)client->config.crop_r);
+                       break;
+               case RESET_BOTTOM :
+                       crop_bottom_text->update((float)client->config.crop_b);
+                       crop_bottom_slider->update((float)client->config.crop_b);
+                       break;
+               case RESET_POSITION_X :
+                       crop_position_x_text->update((float)client->config.position_x);
+                       crop_position_x_slider->update((float)client->config.position_x);
+                       break;
+               case RESET_POSITION_Y :
+                       crop_position_y_text->update((float)client->config.position_y);
+                       crop_position_y_slider->update((float)client->config.position_y);
+                       break;
+               case RESET_ALL :
+               case RESET_DEFAULT_SETTINGS :
+               default:
+                       crop_left_text->update((float)client->config.crop_l);
+                       crop_left_slider->update((float)client->config.crop_l);
+                       crop_top_text->update((float)client->config.crop_t);
+                       crop_top_slider->update((float)client->config.crop_t);
+                       crop_right_text->update((float)client->config.crop_r);
+                       crop_right_slider->update((float)client->config.crop_r);
+                       crop_bottom_text->update((float)client->config.crop_b);
+                       crop_bottom_slider->update((float)client->config.crop_b);
+
+                       crop_position_x_text->update((float)client->config.position_x);
+                       crop_position_x_slider->update((float)client->config.position_x);
+                       crop_position_y_text->update((float)client->config.position_y);
+                       crop_position_y_slider->update((float)client->config.position_y);
+                       break;
+       }
+}
+
+
+
+
+
+
+
+/* *********************************** */
+/* **** CROP LEFT ******************** */
+CropLeftText::CropLeftText(CropWin *win,
+       CropMain *client,
+       int x,
+       int y)
+ : BC_TumbleTextBox(win,
+       client->config.crop_l,
+       (float)0.00,
+       (float)100.00,
+       x,
+       y,
+       60, 2)
+{
+       this->win = win;
+       this->client = client;
+}
+
+CropLeftText::~CropLeftText()
+{
+}
+
+int CropLeftText::handle_event()
+{
+       client->config.crop_l = atof(get_text());
+       win->crop_left_slider->update(client->config.crop_l);
+       client->send_configure_change();
+       return 1;
+}
+
+CropLeftSlider::CropLeftSlider(CropWin *win, CropMain *client,
+       int x, int y, int w)
+ : BC_FSlider(x, y, 0, w, w, 0.00, 100.00, client->config.crop_l)
+{
+       this->win = win;
+       this->client = client;
+       enable_show_value(0); // Hide caption
+       set_precision(0.01);
+}
+
+CropLeftSlider::~CropLeftSlider()
+{
+}
+
+int CropLeftSlider::handle_event()
+{
+       client->config.crop_l = get_value();
+       win->crop_left_text->update(client->config.crop_l);
+       win->update(RESET_ALL);
+       client->send_configure_change();
+       return 1;
+}
+/* *********************************** */
+
+/* *********************************** */
+/* **** CROP TOP  ******************** */
+CropTopText::CropTopText(CropWin *win,
+       CropMain *client,
+       int x,
+       int y)
+ : BC_TumbleTextBox(win,
+       client->config.crop_t,
+       (float)0.00,
+       (float)100.00,
+       x,
+       y,
+       60, 2)
+{
+       this->win = win;
+       this->client = client;
+}
+
+CropTopText::~CropTopText()
+{
+}
+
+int CropTopText::handle_event()
+{
+       client->config.crop_t = atof(get_text());
+       win->crop_top_slider->update(client->config.crop_t);
+       client->send_configure_change();
+       return 1;
+}
+
+CropTopSlider::CropTopSlider(CropWin *win, CropMain *client,
+       int x, int y, int w)
+ : BC_FSlider(x, y, 0, w, w, 0.00, 100.00, client->config.crop_t)
+{
+       this->win = win;
+       this->client = client;
+       enable_show_value(0); // Hide caption
+       set_precision(0.01);
+}
+
+CropTopSlider::~CropTopSlider()
+{
+}
+
+int CropTopSlider::handle_event()
+{
+       client->config.crop_t = get_value();
+       win->crop_top_text->update(client->config.crop_t);
+       win->update(RESET_ALL);
+       client->send_configure_change();
+       return 1;
+}
+/* *********************************** */
+
+/* *********************************** */
+/* **** CROP RIGHT ******************* */
+CropRightText::CropRightText(CropWin *win, CropMain *client,
+       int x,
+       int y)
+ : BC_TumbleTextBox(win,
+       client->config.crop_r,
+       (float)0.00,
+       (float)100.00,
+       x,
+       y,
+       60, 2)
+{
+       this->win = win;
+       this->client = client;
+}
+
+CropRightText::~CropRightText()
+{
+}
+
+int CropRightText::handle_event()
+{
+       client->config.crop_r = atof(get_text());
+       win->crop_right_slider->update(client->config.crop_r);
+       client->send_configure_change();
+       return 1;
+}
+
+CropRightSlider::CropRightSlider(CropWin *win, CropMain *client,
+       int x, int y, int w)
+ : BC_FSlider(x, y, 0, w, w, 0.00, 100.00, client->config.crop_r)
+{
+       this->win = win;
+       this->client = client;
+       enable_show_value(0); // Hide caption
+       set_precision(0.01);
+}
+
+CropRightSlider::~CropRightSlider()
+{
+}
+
+int CropRightSlider::handle_event()
+{
+       client->config.crop_r = get_value();
+       win->crop_right_text->update(client->config.crop_r);
+       win->update(RESET_ALL);
+       client->send_configure_change();
+       return 1;
+}
+/* *********************************** */
+
+/* *********************************** */
+/* **** CROP BOTTOM ****************** */
+CropBottomText::CropBottomText(CropWin *win, CropMain *client,
+       int x,
+       int y)
+ : BC_TumbleTextBox(win,
+       client->config.crop_b,
+       (float)0.00,
+       (float)100.00,
+       x,
+       y,
+       60, 2)
+{
+       this->win = win;
+       this->client = client;
+}
+
+CropBottomText::~CropBottomText()
+{
+}
+
+int CropBottomText::handle_event()
+{
+       client->config.crop_b = atof(get_text());
+       win->crop_bottom_slider->update(client->config.crop_b);
+       client->send_configure_change();
+       return 1;
+}
+
+CropBottomSlider::CropBottomSlider(CropWin *win, CropMain *client,
+       int x, int y, int w)
+ : BC_FSlider(x, y, 0, w, w, 0.00, 100.00, client->config.crop_b)
+{
+       this->win = win;
+       this->client = client;
+       enable_show_value(0); // Hide caption
+       set_precision(0.01);
+}
+
+CropBottomSlider::~CropBottomSlider()
+{
+}
+
+int CropBottomSlider::handle_event()
+{
+       client->config.crop_b = get_value();
+       win->crop_bottom_text->update(client->config.crop_b);
+       win->update(RESET_ALL);
+       client->send_configure_change();
+       return 1;
+}
+/* *********************************** */
+
+/* *********************************** */
+/* **** CROP POSITION X ************** */
+CropPositionXText::CropPositionXText(CropWin *win, CropMain *client,
+       int x,
+       int y)
+ : BC_TumbleTextBox(win,
+       client->config.position_x,
+       (float)-100.00,
+       (float)100.00,
+       x,
+       y,
+       60, 2)
+{
+       this->win = win;
+       this->client = client;
+}
+
+CropPositionXText::~CropPositionXText()
+{
+}
+
+int CropPositionXText::handle_event()
+{
+       client->config.position_x = atof(get_text());
+       win->crop_position_x_slider->update(client->config.position_x);
+       client->send_configure_change();
+       return 1;
+}
+
+CropPositionXSlider::CropPositionXSlider(CropWin *win, CropMain *client,
+       int x, int y, int w)
+ : BC_FSlider(x, y, 0, w, w, -100.00, 100.00, client->config.position_x)
+{
+       this->win = win;
+       this->client = client;
+       enable_show_value(0); // Hide caption
+       set_precision(0.01);
+}
+
+CropPositionXSlider::~CropPositionXSlider()
+{
+}
+
+int CropPositionXSlider::handle_event()
+{
+       client->config.position_x = get_value();
+       win->crop_position_x_text->update(client->config.position_x);
+       win->update(RESET_ALL);
+       client->send_configure_change();
+       return 1;
+}
+/* *********************************** */
+
+/* *********************************** */
+/* **** CROP POSITION Y ************** */
+CropPositionYText::CropPositionYText(CropWin *win, CropMain *client,
+       int x,
+       int y)
+ : BC_TumbleTextBox(win,
+       client->config.position_y,
+       (float)-100.00,
+       (float)100.00,
+       x,
+       y,
+       60, 2)
+{
+       this->win = win;
+       this->client = client;
+}
+
+CropPositionYText::~CropPositionYText()
+{
+}
+
+int CropPositionYText::handle_event()
+{
+       client->config.position_y = atof(get_text());
+       win->crop_position_y_slider->update(client->config.position_y);
+       client->send_configure_change();
+       return 1;
+}
+
+CropPositionYSlider::CropPositionYSlider(CropWin *win, CropMain *client,
+       int x, int y, int w)
+ : BC_FSlider(x, y, 0, w, w, -100.00, 100.00, client->config.position_y)
+{
+       this->win = win;
+       this->client = client;
+       enable_show_value(0); // Hide caption
+       set_precision(0.01);
+}
+
+CropPositionYSlider::~CropPositionYSlider()
+{
+}
+
+int CropPositionYSlider::handle_event()
+{
+       client->config.position_y = get_value();
+       win->crop_position_y_text->update(client->config.position_y);
+       win->update(RESET_ALL);
+       client->send_configure_change();
+       return 1;
+}
+/* *********************************** */
+
+
+CropEdgesClr::CropEdgesClr(CropWin *win, CropMain *client, int x, int y, int clear)
+ : BC_Button(x, y, client->get_theme()->get_image_set("reset_button"))
+{
+       this->win = win;
+       this->client = client;
+       this->clear = clear;
+}
+CropEdgesClr::~CropEdgesClr()
+{
+}
+int CropEdgesClr::handle_event()
+{
+       client->config.reset(clear);
+       win->update(clear);
+       client->send_configure_change();
+       return 1;
+}
+
+CropReset::CropReset(CropMain *client, CropWin *win, int x, int y)
+ : BC_GenericButton(x, y, _("Reset"))
+{
+       this->client = client;
+       this->win = win;
+}
+
+CropReset::~CropReset()
+{
+}
+
+int CropReset::handle_event()
+{
+       client->config.reset(RESET_ALL);
+       win->update(RESET_ALL);
+       client->send_configure_change();
+       return 1;
+}