#!/usr/bin/perl
#
# License: GPL
#  Author: Jeremy Avnet
#   email: brainsik@theory.org
#     www: http://theory.org/software/gbfe/index.html
#
my $version = " .042";
#
# please ignore the piles of crap,
# this is a development version. :)
#
# 23rd January 1999
#

use Gtk;
init Gtk;

use strict;

&create_notebook;
Gtk::main Gtk;


sub read_rc {
  my $bfeparms = shift;

  $$bfeparms{'threads'} = "1";
  $$bfeparms{'binary'}  = "./bfe";
  $$bfeparms{'palpath'} = ".";
  $$bfeparms{'savpath'} = "/tmp";
  $$bfeparms{'palette'} = "palette";
  $$bfeparms{'limit'} = "8";
  $$bfeparms{'channels'} = "3";
  $$bfeparms{'size'} = "250 250";
  $$bfeparms{'filename'} = "bfeimg.png";
  $$bfeparms{'maxpow'} = "2";
  $$bfeparms{'bailout'} = "20";
  $$bfeparms{'iterations'} = "256";
  $$bfeparms{'var_x'} = "re(z)";
  $$bfeparms{'var_y'} = "im(z)";
  $$bfeparms{'var_g'} = "|x|+i*|y|";
  $$bfeparms{'var_h'} = "x+i*y";
  $$bfeparms{'function'} = "g^2-g+c";
  $$bfeparms{'initval'} = "0";
  $$bfeparms{'horz'} = "1 0 0 0";
  $$bfeparms{'vert'} = "0 1 0 0";
  $$bfeparms{'center'} = "0 0 0 0";
  $$bfeparms{'span'} = "3 3";
#  $$bfeparms{'coloring'} = "Smooth";
  $$bfeparms{'extras'} = "";

  my @line;
  open (RCFILE, "$ENV{HOME}/.gbferc");
  while (<RCFILE>) {
    @line = split / = /;
#    print "$line[0] = $line[1]\n";
    chomp $line[1];
    $$bfeparms{$line[0]} = $line[1];
  }
}

sub labeled_entry {
  my $box = shift;
  my $labeltext = shift;
  my $initval = shift;

  my(
     $spacing,
     $entrybox,
     $label,
     $entry
     );

  if (@_) {
    $spacing = shift;
  }
  else {
    $spacing = 3;
  }

  $entrybox = new Gtk::HBox(0,0);
  $box->pack_start($entrybox, 0, 1, $spacing);
  
  $label = new Gtk::Label($labeltext);
  $entrybox->pack_start($label, 0, 0, 0);

  $entry = new Gtk::Entry;
  $entry->set_usize(40,22);
  $entry->set_text($initval);
  $entrybox->pack_start($entry, 1, 1, 0);
  
  return($entry);
}
  

sub notebook_create_pages {
  my($notebook,$bfeparms) = @_;
  
  my(
     $box,
     $separator,

     $omenu,
     $menu,
     $menuitem,
     $menuitemname,
     $entry,

     $popupmenubox,
     $popupmenulabel,

     $pagebox,
     $pagelabel,
     $pagelabelbox
    );

  $separator = new Gtk::HSeparator();

  $popupmenubox = new Gtk::HBox( 0, 0 );
  $popupmenulabel = new Gtk::Label("Where are the popups?") ;
  $popupmenubox->pack_start( $popupmenulabel, 0, 1, 0 );
  $popupmenubox->show_all();


  $pagelabel = new Gtk::Label "System";
  $pagelabelbox = new Gtk::HBox(0,0);
  $pagelabelbox->pack_start($pagelabel, 0, 1, 0);
  $pagelabelbox->show_all;
  $pagebox = new Gtk::VBox(0,0);
  $$bfeparms{'threads'} = labeled_entry($pagebox," threads:",$$bfeparms{'threads'});
  $$bfeparms{'binary'}  = labeled_entry($pagebox," binary:",$$bfeparms{'binary'});
  $box = new Gtk::HBox(1,1);
  $$bfeparms{'palpath'} = labeled_entry($box," pallete path:",$$bfeparms{'palpath'});
  $$bfeparms{'savpath'} = labeled_entry($box," save path:",$$bfeparms{'savpath'});
  $pagebox->pack_start($box, 0, 0, 0);  
  $$bfeparms{'extras'} = labeled_entry($pagebox," extra switches: ",$$bfeparms{'extras'});
  $pagebox->show_all();
  $notebook->append_page_menu($pagebox, $pagelabelbox, $popupmenubox);

  $pagelabel = new Gtk::Label "Image";
  $pagelabelbox = new Gtk::HBox(0,0);
  $pagelabelbox->pack_start($pagelabel, 0, 1, 0);
  $pagelabelbox->show_all;
  $pagebox = new Gtk::VBox(0,0);

  $box = new Gtk::HBox(1,1);
  $$bfeparms{'palette'} = labeled_entry($box," palette:",$$bfeparms{'palette'},0);
#  $omenu = new Gtk::OptionMenu();
#  $menu = new Gtk::Menu();
#  $menuitemname = $$bfeparms{'coloring'};
#  $menuitem = new Gtk::RadioMenuItem($menuitemname, $menuitem);
#  $entry = new Gtk::Entry;
#  $entry->set_usize(40,22);
#  $entry->set_text($menuitemname);
#  $$bfeparms{'coloring'} = $entry;
#  $menuitem->signal_connect("activate", 
#			    sub{ 
#			      shift, shift, my $bfeparms = shift;
#			      $$bfeparms{'coloring'}->set_text($menuitemname);
#			    }
#			    , $box, $bfeparms);
#  $menu->append($menuitem);
#  $menuitem->show;
#  $menuitem = new Gtk::RadioMenuItem(($menuitemname eq "Smooth") ? "Angle" : "Smooth", $menuitem);
#  $menuitem->signal_connect("activate", 
#			    sub{ 
#			      shift, shift, my $bfeparms = shift;
#			      $$bfeparms{'coloring'}->set_text(($menuitemname eq "Smooth") ? "Angle" : "Smooth");
#			    }
#			    , $box, $bfeparms);
#  $menu->append($menuitem);
#  $menuitem->show;
#  $omenu->set_menu($menu);
#  $box->pack_start($omenu, 0, 0, 0);
  $pagebox->pack_start($box,0,0,0); 

  $box = new Gtk::HBox(1,1);
  $$bfeparms{'limit'} = labeled_entry($box, " limit:",$$bfeparms{'limit'});
  $$bfeparms{'channels'} = labeled_entry($box," channels:",$$bfeparms{'channels'},0);
  $pagebox->pack_start($box,0,0,6); 
  $box = new Gtk::HBox(1,1);
  $$bfeparms{'size'} = labeled_entry($box," size:",$$bfeparms{'size'},0);
  $$bfeparms{'filename'} = labeled_entry($box," filename:",$$bfeparms{'filename'},0);
  $pagebox->pack_start($box,0,0,0); 
  $pagebox->show_all();
  $notebook->append_page_menu($pagebox, $pagelabelbox, $popupmenubox);


  $pagelabel = new Gtk::Label "Function";
  $pagelabelbox = new Gtk::HBox(0,0);
  $pagelabelbox->pack_start($pagelabel, 0, 1, 0);
  $pagelabelbox->show_all;
  $pagebox = new Gtk::VBox(0,0);
  $box = new Gtk::HBox(1,1);
  $$bfeparms{'maxpow'} = labeled_entry($box," maxpow:",$$bfeparms{'maxpow'},0);
  $$bfeparms{'bailout'} = labeled_entry($box," bailout:",$$bfeparms{'bailout'},0);
  $$bfeparms{'iterations'} = labeled_entry($box," iterations:",$$bfeparms{'iterations'},0);
  $pagebox->pack_start($box, 0, 0, 0);
  $pagebox->pack_start($separator, 0, 0, 4);
  $box = new Gtk::HBox(1,1);
  $$bfeparms{'var_x'} = labeled_entry($box," Let x(q)=",$$bfeparms{'var_x'},0);
  $$bfeparms{'var_y'} = labeled_entry($box," Let y(q)=",$$bfeparms{'var_y'},0);
  $pagebox->pack_start($box, 0, 0, 0);  
  $box = new Gtk::HBox(1,1);
  $$bfeparms{'var_g'} = labeled_entry($box," Let g(q,x,y)=",$$bfeparms{'var_g'},0);
  $$bfeparms{'var_h'} = labeled_entry($box," Let h(q,x,y)=",$$bfeparms{'var_h'},0);
  $pagebox->pack_start($box, 0, 0, 6);  
  $box = new Gtk::HBox(1,1);
  $$bfeparms{'function'} = labeled_entry($box," f(q,x,y,f,g)=",$$bfeparms{'function'},0);
  $$bfeparms{'initval'} = labeled_entry($box," q_0=",$$bfeparms{'initval'},0);
  $pagebox->pack_start($box, 0, 0, 0);  
  $pagebox->show_all();
  $notebook->append_page_menu($pagebox, $pagelabelbox, $popupmenubox);


  $pagelabel = new Gtk::Label "View";
  $pagelabelbox = new Gtk::HBox(0,0);
  $pagelabelbox->pack_start($pagelabel, 0, 1, 0);
  $pagelabelbox->show_all;
  $pagebox = new Gtk::VBox(0,0);
  $$bfeparms{'horz'} = labeled_entry($pagebox," horz:",$$bfeparms{'horz'});
  $$bfeparms{'vert'} = labeled_entry($pagebox," vert:",$$bfeparms{'vert'});
  $$bfeparms{'center'} = labeled_entry($pagebox," center:",$$bfeparms{'center'});
  $$bfeparms{'span'} = labeled_entry($pagebox," span:",$$bfeparms{'span'});
  $pagebox->show_all();
  $notebook->append_page_menu($pagebox, $pagelabelbox, $popupmenubox);
}


sub create_notebook {
  my(
     $notebookbox,
     $buttonbox,
     $button,
     $separator,
     $notebook,
     $omenu,
     $menu,
     $submenu,
     $menuitem,
     $group,
     $transparent,
     $notebook_window,
     %bfeparms
    );

  read_rc(\%bfeparms);
  
  $notebook_window = new Gtk::Window( 'toplevel' );
  $notebook_window->signal_connect( 'destroy', \&Gtk::main_quit);
  $notebook_window->signal_connect( 'delete_event', \&Gtk::false);
  $notebook_window->set_title("BFE/GtkPerl $version");
  $notebook_window->border_width(0);
  
  $notebookbox = new Gtk::VBox 0, 0;
  $notebook_window->add($notebookbox);
  
  $notebook = new Gtk::Notebook;
  $notebook->set_tab_pos("left");
  $notebookbox->pack_start($notebook, 1, 1, 0);
  $notebook->border_width(10);
  
  notebook_create_pages($notebook,\%bfeparms);
  
  $buttonbox = new Gtk::HBox( 0, 0 );
  $buttonbox->border_width(5);
  $notebookbox->pack_start($buttonbox, 0, 0, 0);
  
  #    $omenu = new Gtk::OptionMenu();
  #    $menu = new Gtk::Menu();
  #    $submenu = undef;
  #    $menuitem = undef;
  
  #    $menuitem = new Gtk::RadioMenuItem "Standard", $menuitem;
  #    $menuitem->signal_connect("activate", \&notebook_standard, $notebook);
  #    $menu->append($menuitem);
  #    $menuitem->show;
  
  $button = new Gtk::Button( 'Quit' );
  $button->signal_connect( 'clicked', 
			   sub { 
			     my $key;
			     open (RCFILE, ">$ENV{HOME}/.gbferc") || die "Could not open rcfile: $ENV{HOME}/.gbferc\n";
			     foreach $key (sort keys %bfeparms) {
			       print RCFILE "$key = ", $bfeparms{$key}->get_text, "\n";
			     }
			     close RCFILE;
			     &Gtk::main_quit;
			   }
			 );

  $buttonbox->pack_end( $button, 1, 1, 5);
  
  $button = new Gtk::Button( 'Generate' );
  $button->signal_connect( 'clicked', 
			   sub {
			     my ($function, $var, $varfcn1, $varfcn2, $runline);
			     $function = $bfeparms{'function'}->get_text;
#			     foreach $var (keys %bfeparms) {
#			       if ($var =~ m/var_(\w)/) {
#				 $varfcn = $bfeparms{$1}->get_text;
#				 $function =~ s/$2/$varfcn/g;
#			       }
#			     }
			     foreach $var ('g','h') {
			       $varfcn1 = $bfeparms{"var_$var"}->get_text;
			       $varfcn2 = $bfeparms{'var_x'}->get_text;
			       $varfcn1 =~ s/x/($varfcn2)/g;
			       $varfcn2 = $bfeparms{'var_y'}->get_text;
			       $varfcn1 =~ s/y/($varfcn2)/g;
			       $function =~ s/$var/($varfcn1)/g;
			     }
			     foreach $var ('x','y') {
			       $varfcn1 = $bfeparms{"var_$var"}->get_text;
			       $function =~ s/$var/($varfcn1)/g;
			     }
			     $runline = 
			       sprintf("(%s -nt %s -ic %s -pf %s/%s -l %s -i %s -p %s -b %s -IF %s -F '%s' -center %s -span %s -hv %s -vv %s -size %s %s -f %s/%s && xv %s/%s )&", 
				       $bfeparms{'binary'}->get_text,
				       $bfeparms{'threads'}->get_text,
				       $bfeparms{'channels'}->get_text,
				       $bfeparms{'palpath'}->get_text,
				       $bfeparms{'palette'}->get_text,
				       $bfeparms{'limit'}->get_text,
				       $bfeparms{'iterations'}->get_text,
				       $bfeparms{'maxpow'}->get_text,
				       $bfeparms{'bailout'}->get_text,   
				       $bfeparms{'initval'}->get_text,
				       $function,
				       $bfeparms{'center'}->get_text,    
				       $bfeparms{'span'}->get_text,      
				       $bfeparms{'horz'}->get_text,     
				       $bfeparms{'vert'}->get_text,     
				       $bfeparms{'size'}->get_text,    
#				       ($bfeparms{'coloring'}->get_text eq "Smooth") 
#				       ? "-s" : "-cba",
				       $bfeparms{'extras'}->get_text,
				       $bfeparms{'savpath'}->get_text,  
				       $bfeparms{'filename'}->get_text, 
				       $bfeparms{'savpath'}->get_text,  
				       $bfeparms{'filename'}->get_text); 
			     print "\n$runline\n";
			     system $runline;
			   }
			 );
  $buttonbox->pack_end( $button, 1, 1, 5);
  
  $notebook_window->show_all();
}

