00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "RenderFltkMenu.h"
00010 #include "CmdRender.h"
00011 #include <FL/Fl.H>
00012 #include <FL/forms.H>
00013 #include <FL/Fl_Window.H>
00014 #include <FL/Fl_Choice.H>
00015 #include <FL/Fl_Input.H>
00016 #include <FL/Fl_Button.H>
00017 #include <FL/Fl_Box.H>
00018 #include "VMDApp.h"
00019
00020 void RenderFltkMenu::make_window() {
00021 size(330, 220);
00022 {
00023 { Fl_Choice* o = formatchoice = new Fl_Choice(110, 45, 130, 25, "Render using:");
00024 o->down_box(FL_BORDER_BOX);
00025 o->color(FL_PALEGREEN, FL_BLACK);
00026 o->callback(formatchoice_cb, this);
00027 }
00028 { Fl_Input* o = filenameinput = new Fl_Input(15, 95, 235, 25, "Filename:");
00029 o->align(FL_ALIGN_TOP_LEFT);
00030 o->selection_color(FL_YELLOW);
00031 }
00032 Fl_Button *browsebutton = new Fl_Button(255, 95, 65, 25, "Browse...");
00033 browsebutton->callback(browse_cb, this);
00034 { Fl_Input* o = commandinput = new Fl_Input(15, 145, 190, 25, "Render Command:");
00035 o->align(FL_ALIGN_TOP_LEFT);
00036 o->selection_color(FL_YELLOW);
00037 o->when(FL_WHEN_CHANGED);
00038 o->callback(command_cb, this);
00039 }
00040 Fl_Button *defaultbutton = new Fl_Button(210, 145, 110, 25, "Restore default");
00041 defaultbutton->callback(default_cb, this);
00042 Fl_Button *renderbutton = new Fl_Button(15, 185, 305, 25, "Start Rendering");
00043 renderbutton->callback(render_cb, this);
00044 { Fl_Box* o = new Fl_Box(15, 15, 230, 25, "Render the current scene to a file.");
00045 o->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
00046 }
00047 end();
00048 }
00049 }
00050
00051 void RenderFltkMenu::fill_render_choices() {
00052 formatchoice->clear();
00053 for (int n=0; n<app->filerender_num(); n++)
00054 formatchoice->add(app->filerender_name(n));
00055 formatchoice->value(0);
00056 formatchoice_cb(NULL, this);
00057 }
00058
00059 RenderFltkMenu::RenderFltkMenu(VMDApp *vmdapp)
00060 : VMDFltkMenu("render", "File Render Controls", vmdapp) {
00061
00062 make_window();
00063 fill_render_choices();
00064 command_wanted(Command::RENDER_OPTION);
00065 }
00066
00067 void RenderFltkMenu::formatchoice_cb(Fl_Widget *, void *v) {
00068 RenderFltkMenu *self = (RenderFltkMenu *)v;
00069 const char *method = self->formatchoice->text();
00070 const char *fname = self->app->filerender_default_filename(method);
00071 const char *opt = self->app->filerender_option(method, NULL);
00072 if (fname) self->filenameinput->value(fname);
00073 if (opt) self->commandinput->value(opt);
00074 }
00075
00076 void RenderFltkMenu::command_cb(Fl_Widget *, void *v) {
00077 RenderFltkMenu *self = (RenderFltkMenu *)v;
00078 const char *method = self->formatchoice->text();
00079 const char *cmd = self->commandinput->value();
00080 if (method && cmd) self->app->filerender_option(method, cmd);
00081 }
00082
00083 void RenderFltkMenu::default_cb(Fl_Widget *, void *v) {
00084 RenderFltkMenu *self = (RenderFltkMenu *)v;
00085 const char *method = self->formatchoice->text();
00086 if (method) {
00087 const char *opt = self->app->filerender_default_option(method);
00088 self->app->filerender_option(method, opt);
00089 self->commandinput->value(opt);
00090 }
00091 }
00092
00093 void RenderFltkMenu::browse_cb(Fl_Widget *, void *v) {
00094 RenderFltkMenu *self = (RenderFltkMenu *)v;
00095 char *fname = self->app->vmd_choose_file(
00096 "Select rendering output file:", "*", "All files",1);
00097 if (fname) {
00098 self->filenameinput->value(fname);
00099 delete [] fname;
00100 }
00101 }
00102
00103 void RenderFltkMenu::render_cb(Fl_Widget *w, void *v) {
00104 RenderFltkMenu *self = (RenderFltkMenu *)v;
00105 Fl_Button *renderbutton = (Fl_Button *)w;
00106 const char *method = self->formatchoice->text();
00107 const char *outfile = self->filenameinput->value();
00108 const char *outcmd = self->commandinput->value();
00109 if (!method || !outfile || !strlen(outfile)) {
00110 fl_alert("Please select a file format and filename before rendering.");
00111 return;
00112 }
00113 renderbutton->label("Rendering in progress...");
00114 renderbutton->value(1);
00115 Fl::wait(0);
00116
00117 int rc = self->app->filerender_render(method, outfile, outcmd);
00118 renderbutton->label("Start Rendering");
00119 renderbutton->value(0);
00120 if (!rc) {
00121 fl_alert("File rendering failed; check the VMD text console for errors.");
00122 }
00123 }
00124
00125 int RenderFltkMenu::act_on_command(int type, Command *cmd) {
00126 if (type == Command::RENDER_OPTION) {
00127 CmdRenderOption *cmdrender = (CmdRenderOption *)cmd;
00128 if (!strcmp(cmdrender->method, formatchoice->text()) &&
00129 strcmp(cmdrender->option, commandinput->value())) {
00130 commandinput->value(cmdrender->option);
00131 }
00132 return TRUE;
00133 }
00134 return FALSE;
00135 }
00136
00137