X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Ftitler%2Ftitlerwindow.C;h=bddb7993bdb845162de47d773e6454d01b847865;hb=a19a685a46ddc630010788707d9e5b9d2342af46;hp=f03f8a0817026953d6c3fdd818aee291a8566e1c;hpb=e21b91bb19b37efa7644445f6137ee926d685795;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/plugins/titler/titlerwindow.C b/cinelerra-5.1/plugins/titler/titlerwindow.C index f03f8a08..bddb7993 100644 --- a/cinelerra-5.1/plugins/titler/titlerwindow.C +++ b/cinelerra-5.1/plugins/titler/titlerwindow.C @@ -28,6 +28,7 @@ #include "automation.h" #include "cwindow.h" #include "cwindowgui.h" +#include "dragcheckbox.h" #include "edl.h" #include "edlsession.h" #include "keys.h" @@ -104,7 +105,6 @@ TitleWindow::TitleWindow(TitleMain *client) text_title = 0; text = 0; text_chars = 0; - text_bfrsz = 0; justify_title = 0; left = 0; center = 0; right = 0; top = 0; mid = 0; bottom = 0; @@ -120,7 +120,7 @@ TitleWindow::TitleWindow(TitleMain *client) void TitleWindow::done_event(int result) { - ungrab(client->server->mwindow->cwindow->gui); + drag->drag_deactivate(); color_thread->close_window(); outline_color_thread->close_window(); color_popup->close_window(); @@ -260,9 +260,10 @@ void TitleWindow::create_objects() if( bold->get_w() > w1 ) w1 = bold->get_w(); add_tool(drag = new TitleDrag(client, this, x, y + 80)); + drag->create_objects(); if( drag->get_w() > w1 ) w1 = drag->get_w(); if( client->config.drag ) { - if( !grab(client->server->mwindow->cwindow->gui) ) + if( drag->drag_activate() ) eprintf("drag enabled, but compositor already grabbed\n"); } @@ -397,8 +398,6 @@ void TitleWindow::create_objects() x += text_title->get_w() + 20; int wid = BC_Title::calculate_w(this,"0")*10; add_tool(text_chars = new TitleTextChars(x,y,wid)); - x += text_chars->get_w() + 20; - add_tool(text_bfrsz = new TitleTextBfrSz(x,y,wid)); y += text_title->get_h() + margin; x = margin; @@ -473,175 +472,17 @@ int TitleWindow::resize_event(int w, int h) return 1; } -void TitleWindow::send_configure_change() -{ - pending_config = 0; - client->send_configure_change(); -} -int TitleWindow::check_configure_change(int ret) +void TitleWindow::update_drag() { - if( pending_config && !grab_event_count() ) - send_configure_change(); - return ret; + drag->drag_x = client->config.title_x; + drag->drag_y = client->config.title_y; + drag->drag_w = client->config.title_w; + drag->drag_h = client->config.title_h; + send_configure_change(); } - -int TitleWindow::grab_event(XEvent *event) +void TitleWindow::send_configure_change() { - switch( event->type ) { - case ButtonPress: break; - case ButtonRelease: break; - case MotionNotify: break; - default: - return check_configure_change(0); - } - - MWindow *mwindow = client->server->mwindow; - CWindowGUI *cwindow_gui = mwindow->cwindow->gui; - CWindowCanvas *canvas = cwindow_gui->canvas; - int cx, cy; cwindow_gui->get_relative_cursor(cx, cy); - cx -= mwindow->theme->ccanvas_x; - cy -= mwindow->theme->ccanvas_y; - - if( !dragging ) { - if( cx < 0 || cx >= mwindow->theme->ccanvas_w || - cy < 0 || cy >= mwindow->theme->ccanvas_h ) - return check_configure_change(0); - } - - switch( event->type ) { - case ButtonPress: - if( !dragging ) break; - return 1; - case ButtonRelease: - if( !dragging ) return check_configure_change(0); - dragging = 0; - return 1; - case MotionNotify: - if( !dragging ) return check_configure_change(0); - break; - default: - return check_configure_change(0); - } - - float cursor_x = cx, cursor_y = cy; - canvas->canvas_to_output(mwindow->edl, 0, cursor_x, cursor_y); - int64_t position = client->get_source_position(); - float projector_x, projector_y, projector_z; - Track *track = client->server->plugin->track; - int track_w = track->track_w, track_h = track->track_h; - track->automation->get_projector( - &projector_x, &projector_y, &projector_z, - position, PLAY_FORWARD); - projector_x += mwindow->edl->session->output_w / 2; - projector_y += mwindow->edl->session->output_h / 2; - cursor_x = (cursor_x - projector_x) / projector_z + track_w / 2; - cursor_y = (cursor_y - projector_y) / projector_z + track_h / 2; - int title_x = client->config.title_x, title_y = client->config.title_y; - int title_w = client->config.title_w, title_h = client->config.title_h; - if( !title_w ) title_w = track_w; - if( !title_h ) title_h = track_h; - int r = MIN(track_w, track_h)/100 + 2; - int x0 = title_x, x1 = title_x+(title_w+1)/2, x2 = title_x+title_w; - int y0 = title_y, y1 = title_y+(title_h+1)/2, y2 = title_y+title_h; - int drag_dx = 0, drag_dy = 0; - if( !dragging ) { // clockwise - if( abs(drag_dx = cursor_x-x0) < r && // x0,y0 - abs(drag_dy = cursor_y-y0) < r ) dragging = 1; - else if( abs(drag_dx = cursor_x-x1) < r && // x1,y0 - abs(drag_dy = cursor_y-y0) < r ) dragging = 2; - else if( abs(drag_dx = cursor_x-x2) < r && // x2,y0 - abs(drag_dy = cursor_y-y0) < r ) dragging = 3; - else if( abs(drag_dx = cursor_x-x2) < r && // x2,y1 - abs(drag_dy = cursor_y-y1) < r ) dragging = 4; - else if( abs(drag_dx = cursor_x-x2) < r && // x2,y2 - abs(drag_dy = cursor_y-y2) < r ) dragging = 5; - else if( abs(drag_dx = cursor_x-x1) < r && // x1,y2 - abs(drag_dy = cursor_y-y2) < r ) dragging = 6; - else if( abs(drag_dx = cursor_x-x0) < r && // x0,y2 - abs(drag_dy = cursor_y-y2) < r ) dragging = 7; - else if( abs(drag_dx = cursor_x-x0) < r && // x0,y1 - abs(drag_dy = cursor_y-y1) < r ) dragging = 8; - else if( abs(drag_dx = cursor_x-x1) < r && // x1,y1 - abs(drag_dy = cursor_y-y1) < r ) dragging = 9; - return 0; - } - switch( dragging ) { - case 1: { // x0,y0 - int cur_x = cursor_x - drag_dx, dx = cur_x - x0; - int cur_y = cursor_y - drag_dy, dy = cur_y - y0; - if( !dx && !dy ) return 1; - int cur_w = title_w - dx; if( cur_w < 1 ) cur_w = 1; - int cur_h = title_h - dy; if( cur_h < 1 ) cur_h = 1; - this->title_x->update((int64_t)(client->config.title_x = cur_x)); - this->title_y->update((int64_t)(client->config.title_y = cur_y)); - this->title_w->update((int64_t)(client->config.title_w = cur_w)); - this->title_h->update((int64_t)(client->config.title_h = cur_h)); - break; } - case 2: { // x1,y0 - int cur_y = cursor_y - drag_dy, dy = cur_y - y0; - if( !dy ) return 1; - int cur_h = title_h - dy; if( cur_h < 1 ) cur_h = 1; - this->title_y->update((int64_t)(client->config.title_y = cur_y)); - this->title_h->update((int64_t)(client->config.title_h = cur_h)); - break; } - case 3: { // x2,y0 - int cur_x = cursor_x - drag_dx, dx = cur_x - x2; - int cur_y = cursor_y - drag_dy, dy = cur_y - y0; - int cur_w = title_w + dx; if( cur_w < 1 ) cur_w = 1; - int cur_h = title_h - dy; if( cur_h < 1 ) cur_h = 1; - this->title_w->update((int64_t)(client->config.title_w = cur_w)); - this->title_y->update((int64_t)(client->config.title_y = cur_y)); - this->title_h->update((int64_t)(client->config.title_h = cur_h)); - break; } - case 4: { // x2,y1 - int cur_x = cursor_x - drag_dx, dx = cur_x - x2; - if( !dx ) return 1; - int cur_w = title_w + dx; if( cur_w < 1 ) cur_w = 1; - this->title_w->update((int64_t)(client->config.title_w = cur_w)); - break; } - case 5: { // x2,y2 - int cur_x = cursor_x - drag_dx, dx = cur_x - x2; - int cur_y = cursor_y - drag_dy, dy = cur_y - y2; - int cur_w = title_w + dx; if( cur_w < 1 ) cur_w = 1; - int cur_h = title_h + dy; if( cur_h < 1 ) cur_h = 1; - this->title_w->update((int64_t)(client->config.title_w = cur_w)); - this->title_h->update((int64_t)(client->config.title_h = cur_h)); - break; } - case 6: { // x1,y2 - int cur_y = cursor_y - drag_dy, dy = cur_y - y2; - if( client->config.title_h == cur_y ) return 1; - int cur_h = title_h + dy; if( cur_h < 1 ) cur_h = 1; - this->title_h->update((int64_t)(client->config.title_h = cur_h)); - break; } - case 7: { // x0,y2 - int cur_x = cursor_x - drag_dx, dx = cur_x - x0; - int cur_y = cursor_y - drag_dy, dy = cur_y - y2; - int cur_w = title_w - dx; if( cur_w < 1 ) cur_w = 1; - int cur_h = title_h + dy; if( cur_h < 1 ) cur_h = 1; - this->title_x->update((int64_t)(client->config.title_x = cur_x)); - this->title_w->update((int64_t)(client->config.title_w = cur_w)); - this->title_h->update((int64_t)(client->config.title_h = cur_h)); - break; } - case 8: { // x0,y1 - int cur_x = cursor_x - drag_dx, dx = cur_x - x0; - if( !dx ) return 1; - int cur_w = title_w - dx; if( cur_w < 1 ) cur_w = 1; - this->title_x->update((int64_t)(client->config.title_x = cur_x)); - this->title_w->update((int64_t)(client->config.title_w = cur_w)); - break; } - case 9: { // x1,y1 - int cur_x = cursor_x - drag_dx, dx = cur_x - x1; - int cur_y = cursor_y - drag_dy, dy = cur_y - y1; - if( title_x == cur_x && title_y == cur_y ) return 1; - this->title_x->update((int64_t)(client->config.title_x += dx)); - this->title_y->update((int64_t)(client->config.title_y += dy)); - } - } - if( !grab_event_count() ) - send_configure_change(); - else - pending_config = 1; - return 1; + client->send_configure_change(); } void TitleWindow::previous_font() @@ -725,9 +566,6 @@ void TitleWindow::update_justification() void TitleWindow::update_stats() { text_chars->update(client->config.wlen); - int len = MESSAGESIZE - BCTEXTLEN - strlen(text->get_text()) - 1; - if( len < 0 ) len = 0; - text_bfrsz->update(len); } void TitleWindow::update() @@ -747,7 +585,7 @@ void TitleWindow::update() fade_out->update((float)client->config.fade_out); font->update(client->config.font); check_style(client->config.font,0); - text->update(&client->config.wtext[0]); + text->update(client->config.wtext ? &client->config.wtext[0] : L""); speed->update(client->config.pixels_per_second); outline->update((int64_t)client->config.outline_size); #ifdef USE_STROKER @@ -792,7 +630,6 @@ int TitleFontTumble::handle_down_event() } - TitleSizeTumble::TitleSizeTumble(TitleMain *client, TitleWindow *window, int x, int y) : BC_Tumbler(x, y) { @@ -1109,7 +946,7 @@ TitleText::TitleText(TitleMain *client, TitleWindow *window, int x, int y, int w, int h) : BC_ScrollTextBox(window, x, y, w, BC_TextBox::pixels_to_rows(window, MEDIUMFONT, h), - client->config.wtext, 8192) + client->config.wtext, 0) { this->client = client; this->window = window; @@ -1129,22 +966,11 @@ int TitleText::button_press_event() int TitleText::handle_event() { window->fonts_popup->deactivate(); - int text_len = strlen(get_text()); - int avail = MESSAGESIZE - BCTEXTLEN; - if( text_len >= avail ) { // back off last utf8 char - char text[2*sizeof(client->config.wtext)]; - strcpy(text, get_text()); - text_len = avail; - while( text_len > 0 && (text[text_len-1] & 0xc0) == 0x80 ) - text[--text_len] = 0; - if( text_len > 0 ) - text[--text_len] = 0; - update(text); - } - int len = sizeof(client->config.wtext) / sizeof(wchar_t); - wcsncpy(client->config.wtext, get_wtext(), len); - client->config.wtext[len-1] = 0; - client->config.wlen = wcslen(client->config.wtext); + const wchar_t *wtext = get_wtext(); + long wlen = wcslen(wtext); + client->config.demand(wlen); + wcsncpy(client->config.wtext, wtext, client->config.wsize); + client->config.wlen = wlen; window->update_stats(); window->send_configure_change(); return 1; @@ -1163,20 +989,6 @@ int TitleTextChars::update(int n) return BC_Title::update(text, 0); } -TitleTextBfrSz::TitleTextBfrSz(int x, int y, int w) - : BC_Title(x, y, "", MEDIUMFONT, -1, 0, w) -{ -} -TitleTextBfrSz::~TitleTextBfrSz() -{ -} -int TitleTextBfrSz::update(int n) -{ - char text[BCSTRLEN]; - sprintf(text, _("bfrsz: %d "),n); - return BC_Title::update(text, 0); -} - TitleDropShadow::TitleDropShadow(TitleMain *client, TitleWindow *window, int x, int y) : BC_TumbleTextBox(window, client->config.dropshadow, @@ -1240,7 +1052,7 @@ TitleX::TitleX(TitleMain *client, TitleWindow *window, int x, int y) int TitleX::handle_event() { client->config.title_x = atof(get_text()); - window->send_configure_change(); + window->update_drag(); return 1; } @@ -1255,7 +1067,7 @@ TitleY::TitleY(TitleMain *client, TitleWindow *window, int x, int y) int TitleY::handle_event() { client->config.title_y = atof(get_text()); - window->send_configure_change(); + window->update_drag(); return 1; } @@ -1269,7 +1081,7 @@ TitleW::TitleW(TitleMain *client, TitleWindow *window, int x, int y) int TitleW::handle_event() { client->config.title_w = atol(get_text()); - window->send_configure_change(); + window->update_drag(); return 1; } @@ -1283,7 +1095,7 @@ TitleH::TitleH(TitleMain *client, TitleWindow *window, int x, int y) int TitleH::handle_event() { client->config.title_h = atol(get_text()); - window->send_configure_change(); + window->update_drag(); return 1; } @@ -1423,27 +1235,42 @@ int TitleColorThread::handle_new_color(int output, int alpha) } TitleDrag::TitleDrag(TitleMain *client, TitleWindow *window, int x, int y) - : BC_CheckBox(x, y, client->config.drag, _("Drag")) + : DragCheckBox(client->server->mwindow, x, y, _("Drag"), &client->config.drag, + client->config.title_x, client->config.title_y, + client->config.title_w, client->config.title_h) { this->client = client; this->window = window; } +Track *TitleDrag::get_drag_track() +{ + return client->server->plugin->track; +} +int64_t TitleDrag::get_drag_position() +{ + return client->get_source_position(); +} + +void TitleDrag::update_gui() +{ + client->config.drag = get_value(); + client->config.title_x = drag_x; + client->config.title_y = drag_y; + client->config.title_w = drag_w+0.5; + client->config.title_h = drag_h+0.5; + window->title_x->update((float)client->config.title_x); + window->title_y->update((float)client->config.title_y); + window->title_w->update((int64_t)client->config.title_w); + window->title_h->update((int64_t)client->config.title_h); + window->send_configure_change(); +} + int TitleDrag::handle_event() { - int value = get_value(); - CWindowGUI *cwindow_gui = client->server->mwindow->cwindow->gui; - if( value ) { - if( !window->grab(cwindow_gui) ) { - update(value = 0); - flicker(10,50); - } - } - else - window->ungrab(cwindow_gui); - client->config.drag = value; + int ret = DragCheckBox::handle_event(); window->send_configure_change(); - return 1; + return ret; } TitleBackground::TitleBackground(TitleMain *client, TitleWindow *window, int x, int y) @@ -1512,80 +1339,80 @@ void TitleCurPopup::create_objects() TitleCurItem *cur_item; TitleCurSubMenu *sub_menu; char *item; - add_item(cur_item = new TitleCurItem(this, item = KW_NUDGE)); + add_item(cur_item = new TitleCurItem(this, item = _(KW_NUDGE))); cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item)); sub_menu->add_subitem("%s dx,dy",item); sub_menu->add_subitem("/%s",item); - add_item(cur_item = new TitleCurItem(this, item = KW_COLOR)); + add_item(cur_item = new TitleCurItem(this, item = _(KW_COLOR))); cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item)); sub_menu->add_subitem(POPUP_COLOR,"%s %s",item,_("#")); sub_menu->add_subitem("%s ",item); sub_menu->add_subitem("/%s",item); - add_item(cur_item = new TitleCurItem(this, item = KW_ALPHA)); + add_item(cur_item = new TitleCurItem(this, item = _(KW_ALPHA))); cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item)); sub_menu->add_subitem("%s ",item); sub_menu->add_subitem("%s 0.",item); sub_menu->add_subitem("%s .5",item); sub_menu->add_subitem("%s 1.",item); sub_menu->add_subitem("/%s",item); - add_item(cur_item = new TitleCurItem(this, item = KW_FONT)); + add_item(cur_item = new TitleCurItem(this, item = _(KW_FONT))); cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item)); sub_menu->add_subitem(POPUP_FONT,"%s %s",item, _("name")); sub_menu->add_subitem(POPUP_OFFSET, "%s ",item); sub_menu->add_subitem("/%s",item); - add_item(cur_item = new TitleCurItem(this, item = KW_SIZE)); + add_item(cur_item = new TitleCurItem(this, item = _(KW_SIZE))); cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item)); sub_menu->add_subitem("%s +",item); sub_menu->add_subitem("%s -",item); sub_menu->add_subitem("%s ",item); sub_menu->add_subitem("/%s",item); - add_item(cur_item = new TitleCurItem(this, item = KW_BOLD)); + add_item(cur_item = new TitleCurItem(this, item = _(KW_BOLD))); cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item)); sub_menu->add_subitem("%s 1",item); sub_menu->add_subitem("%s 0",item); sub_menu->add_subitem("/%s",item); - add_item(cur_item = new TitleCurItem(this, item = KW_ITALIC)); + add_item(cur_item = new TitleCurItem(this, item = _(KW_ITALIC))); cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item)); sub_menu->add_subitem("%s 1",item); sub_menu->add_subitem("%s 0",item); sub_menu->add_subitem("/%s",item); - add_item(cur_item = new TitleCurItem(this, item = KW_CAPS)); + add_item(cur_item = new TitleCurItem(this, item = _(KW_CAPS))); cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item)); sub_menu->add_subitem("%s 1",item); sub_menu->add_subitem("%s 0",item); sub_menu->add_subitem("%s -1",item); sub_menu->add_subitem("/%s",item); - add_item(cur_item = new TitleCurItem(this, item = KW_UL)); + add_item(cur_item = new TitleCurItem(this, item = _(KW_UL))); cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item)); sub_menu->add_subitem("%s 1",item); sub_menu->add_subitem("%s 0",item); sub_menu->add_subitem("/%s",item); - add_item(cur_item = new TitleCurItem(this, item = KW_BLINK)); + add_item(cur_item = new TitleCurItem(this, item = _(KW_BLINK))); cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item)); sub_menu->add_subitem("%s 1",item); sub_menu->add_subitem("%s -1",item); sub_menu->add_subitem("%s ",item); sub_menu->add_subitem("%s 0",item); sub_menu->add_subitem("/%s",item); - add_item(cur_item = new TitleCurItem(this, item = KW_FIXED)); + add_item(cur_item = new TitleCurItem(this, item = _(KW_FIXED))); cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item)); sub_menu->add_subitem("%s ",item); sub_menu->add_subitem("%s 20",item); sub_menu->add_subitem("%s 10",item); sub_menu->add_subitem("%s 0",item); sub_menu->add_subitem("/%s",item); - add_item(cur_item = new TitleCurItem(this, item = KW_ALIAS)); + add_item(cur_item = new TitleCurItem(this, item = _(KW_ALIAS))); cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item)); sub_menu->add_subitem("%s 1",item); sub_menu->add_subitem("%s 0",item); sub_menu->add_subitem("/%s",item); - add_item(cur_item = new TitleCurItem(this, item = KW_SUP)); + add_item(cur_item = new TitleCurItem(this, item = _(KW_SUP))); cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item)); sub_menu->add_subitem("%s 1",item); sub_menu->add_subitem("%s 0",item); sub_menu->add_subitem("%s -1",item); sub_menu->add_subitem("/%s",item); - add_item(cur_item = new TitleCurItem(this, item = KW_PNG)); + add_item(cur_item = new TitleCurItem(this, item = _(KW_PNG))); cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item)); sub_menu->add_subitem(POPUP_PNG,"%s %s", item, _("file")); } @@ -1675,7 +1502,7 @@ int TitleFontsPopup::handle_event() BC_ListBoxItem *item = get_selection(0, 0); if( !item ) return 1; const char *item_text = item->get_text(); - char txt[BCTEXTLEN]; sprintf(txt, "<%s %s>", KW_FONT, item_text); + char txt[BCTEXTLEN]; sprintf(txt, "<%s %s>", _(KW_FONT), item_text); return window->insert_ibeam(txt); } @@ -1702,7 +1529,7 @@ int TitleColorPopup::activate() void TitleColorPopup::handle_done_event(int result) { if( result ) return; - char txt[BCSTRLEN]; sprintf(txt, "<%s #%06x>", KW_COLOR, color_value); + char txt[BCSTRLEN]; sprintf(txt, "<%s #%06x>", _(KW_COLOR), color_value); window->insert_ibeam(txt); } @@ -1723,7 +1550,7 @@ void TitlePngPopup::handle_done_event(int result) if( result ) return; BrowseButtonWindow *gui = (BrowseButtonWindow *)get_gui(); const char *path = gui->get_submitted_path(); - char txt[BCSTRLEN]; sprintf(txt, "<%s %s>", KW_PNG, path); + char txt[BCSTRLEN]; sprintf(txt, "<%s %s>", _(KW_PNG), path); window->insert_ibeam(txt); }