add browse bg btn in titler, prevent a few badwin signals, titler text popup upgrades
[goodguy/history.git] / cinelerra-5.1 / plugins / titler / titlerwindow.C
index ef89eb8ddd28a93a1d2ff23af2270109bfaa1c70..2c92d8f35b3ffc9d3cb27bfd55fdb8db1ce5747c 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "bcdisplayinfo.h"
 #include "bcsignals.h"
+#include "browsebutton.h"
 #include "clip.h"
 #include "cstrdup.h"
 #include "automation.h"
@@ -56,49 +57,68 @@ TitleWindow::TitleWindow(TitleMain *client)
 {
 //printf("TitleWindow::TitleWindow %d %d %d\n", __LINE__, client->config.window_w, client->config.window_h);
        this->client = client;
+
+       font_title = 0;
+       font = 0;
        font_tumbler = 0;
-       justify_title = 0;
+       x_title = 0; title_x = 0;
+       y_title = 0; title_y = 0;
+       w_title = 0; title_w = 0;
+       h_title = 0; title_h = 0;
+       dropshadow_title = 0; dropshadow = 0;
+       outline_title = 0;    outline = 0;
+       stroker_title = 0;    stroker = 0;
        style_title = 0;
+       italic = 0;
+       bold = 0;
+       drag = 0;
+       cur_popup = 0;
+       fonts_popup = 0;
+
+       color_x = color_y = 0;
+       outline_color_x = outline_color_y = 0;
+       drag_dx = drag_dy = dragging = 0;
+       cur_ibeam = -1;
+
        size_title = 0;
+       size = 0;
+       size_tumbler = 0;
+       pitch_title = 0;
+       pitch = 0;
+       encoding_title = 0;
+       encoding = 0;
+       color_button = 0;
+       color_thread = 0;
+       outline_color_button = 0;
+       outline_color_thread = 0;
        motion_title = 0;
-       speed_title = 0;
-       font_title = 0;
-       fadeout_title = 0;
+       motion = 0;
+       line_pitch = 0;
+       loop = 0;
        fadein_title = 0;
-       dropshadow_title = 0;
+       fade_in = 0;
+       fadeout_title = 0;
+       fade_out = 0;
        text_title = 0;
-
-       font = 0;  size = 0;
-       title_x = 0; title_y = 0;
-       x_title = 0; y_title = 0;
-       title_w = 0; title_h = 0;
-       w_title = 0; h_title = 0;
-       top = 0;  mid = 0;    bottom = 0;
-       left = 0; center = 0; right = 0;
-       loop = 0; motion = 0; speed = 0;
-       dropshadow = 0;
        text = 0;
+       justify_title = 0;
+       left = 0;  center = 0;  right = 0;
+       top = 0;   mid = 0;     bottom = 0;
+       speed_title = 0;
+       speed = 0;
        timecode = 0;
-       bold = 0;
-       italic = 0;
-       dragging = 0;
-       fade_in = 0;
-       fade_out = 0;
-       color_button = 0;
-       color_x = color_y = 0;
-       color_thread = 0;
+       timecode_format = 0;
        background = 0;
        background_path = 0;
-       cur_ibeam = -1;
+       loop_playback = 0;
 }
 
 TitleWindow::~TitleWindow()
 {
        ungrab(client->server->mwindow->cwindow->gui);
-       for( int j=0; j<fonts.size(); ++j ) {
-// delete the pixmaps but not the vframes since they're static
-               delete fonts.get(j)->get_icon();
-       }
+       delete fonts_popup;
+       for( int i=0; i<fonts.size(); ++i )
+               delete fonts[i]->get_icon();
 
        sizes.remove_all_objects();
        delete timecode_format;
@@ -344,7 +364,11 @@ void TitleWindow::create_objects()
        add_tool(background = new TitleBackground(client, this, x, y));
        x += background->get_w() + margin;
        add_tool(background_path = new TitleBackgroundPath(client, this, x, y));
-       x += background_path->get_w() + 2*margin;
+       x += background_path->get_w() + margin;
+       add_tool(background_browse = new BrowseButton(
+               client->server->mwindow->theme, this, background_path,
+               x, y, 0, _("background media"), _("Select background media path")));
+       x += background_browse->get_w() + 3*margin;
        add_tool(loop_playback = new TitleLoopPlayback(client, x, y));
        y += loop_playback->get_h() + 10;
 
@@ -357,9 +381,10 @@ void TitleWindow::create_objects()
 
        add_tool(cur_popup = new TitleCurPopup(client, this));
        cur_popup->create_objects();
+       add_tool(fonts_popup = new TitleFontsPopup(client, this));
 
-       update();
        show_window(1);
+       update();
 }
 
 int TitleWindow::resize_event(int w, int h)
@@ -590,7 +615,17 @@ void  TitleWindow::next_font()
        client->send_configure_change();
 }
 
-
+int TitleWindow::insert_ibeam(const char *txt, int adv)
+{
+       int ibeam = cur_ibeam;
+       client->insert_text(txt, ibeam);
+       if( (ibeam += adv) >= client->config.wlen)
+               ibeam = client->config.wlen;
+       text->wset_selection(-1, -1, ibeam);
+       text->update(client->config.wtext);
+       client->send_configure_change();
+       return 1;
+}
 
 void TitleWindow::update_color()
 {
@@ -965,6 +1000,7 @@ int TitleText::button_press_event()
 
 int TitleText::handle_event()
 {
+       window->fonts_popup->deactivate();
        int len =  sizeof(client->config.wtext) / sizeof(wchar_t);
        wcsncpy(client->config.wtext, get_wtext(), len);
        client->config.wtext[len-1] = 0;
@@ -1280,61 +1316,81 @@ TitleCurPopup::TitleCurPopup(TitleMain *client, TitleWindow *window)
 }
 int TitleCurPopup::handle_event()
 {
-printf("cur popup\n");
        return 1;
 }
 void TitleCurPopup::create_objects()
 {
        TitleCurItem *cur_item;
        TitleCurSubMenu *sub_menu;
-       add_item(cur_item = new TitleCurItem(this, "nudge"));
+       add_item(cur_item = new TitleCurItem(this, _("nudge")));
+       cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("nudge dx,dy")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("/nudge")));
+       add_item(cur_item = new TitleCurItem(this, _("color")));
        cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"nudge"));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"/nudge"));
-       add_item(cur_item = new TitleCurItem(this, "color"));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("color #")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("/color")));
+       add_item(cur_item = new TitleCurItem(this, _("alpha")));
        cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"color"));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"/color"));
-       add_item(cur_item = new TitleCurItem(this, "alpha"));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("alpha ")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("alpha 0.")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("alpha .5")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("alpha 1.")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("/alpha")));
+       add_item(cur_item = new TitleCurItem(this, _("font")));
        cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"alpha"));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"/alpha"));
-       add_item(cur_item = new TitleCurItem(this, "font"));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("font name")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("/font")));
+       add_item(cur_item = new TitleCurItem(this, _("size")));
        cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"font"));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"/font"));
-       add_item(cur_item = new TitleCurItem(this, "size"));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("size +")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("size -")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("size ")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("/size")));
+       add_item(cur_item = new TitleCurItem(this, _("bold")));
        cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"size"));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"/size"));
-       add_item(cur_item = new TitleCurItem(this, "bold"));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("bold 1")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("bold 0")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("/bold")));
+       add_item(cur_item = new TitleCurItem(this, _("italic")));
        cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"bold"));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"/bold"));
-       add_item(cur_item = new TitleCurItem(this, "italic"));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("italic 1")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("italic 0")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("/italic")));
+       add_item(cur_item = new TitleCurItem(this, _("caps")));
        cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"italic"));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"/italic"));
-       add_item(cur_item = new TitleCurItem(this, "caps"));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("caps 1")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("caps 0")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("caps -1")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("/caps")));
+       add_item(cur_item = new TitleCurItem(this, _("ul")));
        cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"caps"));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"/caps"));
-       add_item(cur_item = new TitleCurItem(this, "ul"));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("ul 1")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("ul 0")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("/ul")));
+       add_item(cur_item = new TitleCurItem(this, _("blink")));
        cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"ul"));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"/ul"));
-       add_item(cur_item = new TitleCurItem(this, "blink"));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("blink 1")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("blink -1")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("blink ")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("blink 0")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("/blink")));
+       add_item(cur_item = new TitleCurItem(this, _("fixed")));
        cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"blink"));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"/blink"));
-       add_item(cur_item = new TitleCurItem(this, "fixed"));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("fixed ")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("fixed 20")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("fixed 10")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("fixed 0")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("/fixed")));
+       add_item(cur_item = new TitleCurItem(this, _("sup")));
        cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"fixed"));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"/fixed"));
-       add_item(cur_item = new TitleCurItem(this, "sup"));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("sup 1")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("sup 0")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("sup -1")));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("/sup")));
+       add_item(cur_item = new TitleCurItem(this, _("png")));
        cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"sup"));
-       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,"/sup"));
+       sub_menu->add_submenuitem(new TitleCurSubMenuItem(sub_menu,_("png file")));
 }
 
 TitleCurItem::TitleCurItem(TitleCurPopup *popup, const char *text)
@@ -1365,34 +1421,47 @@ TitleCurSubMenuItem::~TitleCurSubMenuItem()
 }
 int TitleCurSubMenuItem::handle_event()
 {
-       char id[BCSTRLEN];
-       sprintf(id, "<%s>",get_text());
-       int ilen = strlen(id);
-       TitleMain *client = submenu->cur_item->popup->client;
-       TitleWindow *window = submenu->cur_item->popup->window;
-
-       wchar_t *wtext = client->config.wtext;
-       int wsize = sizeof(client->config.wtext)-1;
-       int wlen = client->config.wlen;
-       int ibeam_letter = window->cur_ibeam;
-       if( ibeam_letter < 0 ) ibeam_letter = 0;
-       if( ibeam_letter > wlen ) ibeam_letter = wlen;
-
-       for( int i=wlen-1, j=wlen+ilen-1; i>=ibeam_letter; --i,--j ) {
-               if( j >= wsize ) continue;
-               wtext[j] = wtext[i];
-       }
-       for( int i=ibeam_letter, j=0; j<ilen; ++i,++j ) {
-               if( i >= wsize ) break;
-               wtext[i] = id[j];
+       TitleCurPopup *popup = submenu->cur_item->popup;
+       TitleWindow *window = popup->window;
+       const char *item_text = get_text();
+       if( !strcmp(item_text, _("font")) ) {
+               int w = 300, h = 200;
+               int x = window->get_abs_cursor_x(0) - w + 10;
+               int y = window->get_abs_cursor_y(0) - 20;
+               if( x < 2 ) x = 2;
+               if( y < 2 ) y = 2;
+               window->fonts_popup->activate(x, y, w,h);
+               return 1;
        }
+       char txt[BCSTRLEN];
+       sprintf(txt, "<%s>", item_text);
+       int adv = strlen(txt);
+       if( adv > 1 && (txt[1] != '/' && strcmp(txt,_("font"))) ) --adv;
+       return window->insert_ibeam(txt,adv);
+}
 
-       if( (wlen+=ilen) > wsize ) wlen = wsize;
-       wtext[wlen] = 0;
-       window->text->update(wtext);
-       client->config.wlen = wlen;
-       client->send_configure_change();
-       return 1;
+TitleFontsPopup::TitleFontsPopup(TitleMain *client, TitleWindow *window)
+ : BC_ListBox(-1, -1, 1, 1, LISTBOX_ICON_LIST,
+       &window->fonts, 0, 0, 1, 0, 1)
+{
+       this->client = client;
+       this->window = window;
+       set_use_button(0);
+}
+TitleFontsPopup::~TitleFontsPopup()
+{
 }
 
+int TitleFontsPopup::handle_event()
+{
+       deactivate();
+       BC_ListBoxItem *item = get_selection(0, 0);
+       if( !item ) return 1;
+       const char *item_text = item->get_text();
+       char txt[BCTEXTLEN];
+       sprintf(txt, "<font %s>",item_text);
+       int adv = strlen(txt);
+       int ret = window->insert_ibeam(txt, adv);
+       return ret;
+}