/* * CINELERRA * Copyright (C) 2014 Adam Williams * * 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 * */ #include "bcdisplayinfo.h" #include "clip.h" #include "cwindow.h" #include "cwindowgui.h" #include "edl.h" #include "edlsession.h" #include "language.h" #include "mandelbrot.h" #include "mandelbrotwindow.h" #include "mwindow.h" #include "mwindowgui.h" #include "pluginserver.h" #include "theme.h" MandelbrotWindow::MandelbrotWindow(Mandelbrot *plugin) : PluginClientWindow(plugin, 180, 130, 180, 130, 0) { this->plugin = plugin; press_x = press_y = 0; button_no = 0; pending_config = 0; } MandelbrotWindow::~MandelbrotWindow() { } void MandelbrotWindow::create_objects() { int x = 10, y = 10, pad = 5; BC_Title *title; add_subwindow(title = new BC_Title(x,y, _("Mandelbrot:"), MEDIUMFONT, YELLOW)); y += title->get_h() + pad; add_subwindow(is_julia = new MandelbrotIsJulia(this, x, y)); y += is_julia->get_h() + pad; add_subwindow(drag = new MandelbrotDrag(this, x, y)); y += drag->get_h() + pad; add_subwindow(reset = new MandelbrotReset(this, x, y)); show_window(); } void MandelbrotWindow::update_gui() { } void MandelbrotWindow::send_configure_change() { pending_config = 0; plugin->send_configure_change(); } int MandelbrotWindow::grab_event(XEvent *event) { int ret = do_grab_event(event); if( pending_config && !grab_event_count() ) send_configure_change(); return ret; } int MandelbrotWindow::do_grab_event(XEvent *event) { switch( event->type ) { case ButtonPress: break; case ButtonRelease: break; case MotionNotify: break; default: return 0; } MWindow *mwindow = plugin->server->mwindow; CWindowGUI *cwindow_gui = mwindow->cwindow->gui; CWindowCanvas *canvas = cwindow_gui->canvas; int cursor_x, cursor_y; cwindow_gui->get_relative_cursor(cursor_x, cursor_y); cursor_x -= canvas->view_x; cursor_y -= canvas->view_y; float output_x = cursor_x, output_y = cursor_y; canvas->canvas_to_output(mwindow->edl, 0, output_x, output_y); if( !button_no ) { if( cursor_x < 0 || cursor_x >= canvas->view_w || cursor_y < 0 || cursor_y >= canvas->view_h ) return 0; } switch( event->type ) { case ButtonPress: if( button_no ) return 0; press_x = output_x; press_y = output_y; button_no = event->xbutton.button; break; case ButtonRelease: if( !button_no ) return 0; button_no = 0; return 1; case MotionNotify: { if( !button_no ) return 0; EDL *edl = plugin->get_edl(); double dx = 0, dy = 0, jx = 0, jy = 0, ds = 1; double out_w = edl->session->output_w, out_h = edl->session->output_h; double fx = (double)(press_x - output_x) / (2. * out_w); double fy = (double)(press_y - output_y) / (2. * out_h); press_x = output_x; press_y = output_y; switch( button_no ) { case LEFT_BUTTON: { dx = fx * plugin->config.scale; dy = fy * plugin->config.scale; break; } case MIDDLE_BUTTON: { ds = fy >= 0.f ? 1-fy : 1/(1+fy); bclamp(ds, 1-0.05f, 1+0.05f); break; } case RIGHT_BUTTON: { jx = fx; jy = fy; break; } } plugin->config.x_off += dx; plugin->config.y_off += dy; plugin->config.x_julia += jx; plugin->config.y_julia += jy; plugin->config.scale *= ds; pending_config = 1; break; } default: return 0; } return 1; } void MandelbrotWindow::done_event(int result) { ungrab(client->server->mwindow->cwindow->gui); } MandelbrotDrag::MandelbrotDrag(MandelbrotWindow *gui, int x, int y) : BC_CheckBox(x, y, 0, _("Drag")) { this->gui = gui; } int MandelbrotDrag::handle_event() { CWindowGUI *cwindow_gui = gui->plugin->server->mwindow->cwindow->gui; int value = get_value(); if( value ) { if( !gui->grab(cwindow_gui) ) { update(value = 0); flicker(10,50); } } else gui->ungrab(cwindow_gui); return 1; } MandelbrotIsJulia::MandelbrotIsJulia(MandelbrotWindow *gui, int x, int y) : BC_CheckBox(x, y, gui->plugin->config.is_julia, _("Julia")) { this->gui = gui; } MandelbrotIsJulia::~MandelbrotIsJulia() { } int MandelbrotIsJulia::handle_event() { Mandelbrot *plugin = gui->plugin; plugin->config.is_julia = get_value(); gui->send_configure_change(); return 1; } MandelbrotReset::MandelbrotReset(MandelbrotWindow *gui, int x, int y) : BC_GenericButton(x, y, _("Reset")) { this->gui = gui; } MandelbrotReset::~MandelbrotReset() { } int MandelbrotReset::handle_event() { Mandelbrot *plugin = gui->plugin; int is_julia = plugin->config.is_julia; plugin->config.reset(); if( is_julia ) plugin->config.startJulia(); gui->send_configure_change(); return 1; }