#include "automation.h"
#include "cwindow.h"
#include "cwindowgui.h"
+#include "dragcheckbox.h"
#include "edl.h"
#include "edlsession.h"
#include "keys.h"
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;
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();
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");
}
if( alias->get_w() > w1 ) w1 = drag->get_w();
x += w1 + margin;
- add_tool(justify_title = new BC_Title(x, y, _("Justify:")));
+ add_tool(justify_title = new BC_Title(x+50, y, _("Justify:")));
add_tool(left = new TitleLeft(client, this, x, y + 20));
w1 = left->get_w();
add_tool(center = new TitleCenter(client, this, x, y + 50));
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;
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()
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()
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
}
-
TitleSizeTumble::TitleSizeTumble(TitleMain *client, TitleWindow *window, int x, int y)
: BC_Tumbler(x, y)
{
}
TitleAlias::TitleAlias(TitleMain *client, TitleWindow *window, int x, int y)
- : BC_CheckBox(x, y, client->config.style & FONT_ALIAS, _("Alias"))
+ : BC_CheckBox(x, y, client->config.style & FONT_ALIAS, _("Smooth"))
{
this->client = client;
this->window = 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;
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;
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,
int TitleX::handle_event()
{
client->config.title_x = atof(get_text());
- window->send_configure_change();
+ window->update_drag();
return 1;
}
int TitleY::handle_event()
{
client->config.title_y = atof(get_text());
- window->send_configure_change();
+ window->update_drag();
return 1;
}
int TitleW::handle_event()
{
client->config.title_w = atol(get_text());
- window->send_configure_change();
+ window->update_drag();
return 1;
}
int TitleH::handle_event()
{
client->config.title_h = atol(get_text());
- window->send_configure_change();
+ window->update_drag();
return 1;
}
}
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)
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"));
}
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);
}
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);
}
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);
}