#native_company# #native_desc#
#native_cta#

VirtuaDice

By Patrik Olterman
on March 22, 2002

Version: 0.5

Type: Sample Code (HOWTO)

Category: Other

License: GNU General Public License

Description: This is a very simple random number generator (rolling dice) written in gtk-php. Unfortunately I have not been able do put the output back into the GUI, any help would be welcome!
From this you can figure out how to make a simple GTK+ script in PHP

#!/usr/bin/php4 -q
<?
/*
 *  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.
 *
 *  Produced by Patrik Olterman 
 *  [email protected]
 *
 */


// This little snippet checks if the libs are loaded or not, and loads them!
// it checks if the OS is stupid windows or if its something cool and 
//chooses libs accordingly
if (!class_exists('gtk')) {
	if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
		dl('php_gtk.dll');
	else
		dl('php_gtk.so');
}



//Called when delete-event happens. Returns false to indicate that the event should proceed
 
function delete_event()
{
	return false;
}

// function destry called when program is closed
function destroy()
{
	Gtk::main_quit();
}


 
// function main is the real program with the form in it 
function main()
{
	// deal with old window
	global $window;
	$window->hide();
	
	//creating all widgets
	$window2 = &new GtkWindow();	  //the main window
	$label = &new GtkLabel("Type in number of dicenand how many faces.");	//the text
	$vb = &new GtkVbox();			// The vertical box
	$inputNum = &new GtkEntry(); 	//the input field for number of dice
	$inputFace = &new GtkEntry();	//The input field for faces on the dice
	$broll = &new GtkButton('Roll'); //The button for rolling dice
	$hb = &new GtkHbox;			  //The horizontal box for result window and scrollbar
	$result = &new GtkText;		  //The result window itself
	$adj = $result->vadj;			//setting the adjustment so I can make scrollbar
	$scrollbar = &new GtkVScrollbar($adj); //The scrollbar
	$qb = &new GtkButton('Quit');    //The quit button
	$statusb = &new GtkStatusbar();

	//Setting up the main window 
	$window2->set_title("VirtuaDice");
	$window2->connect('destroy', 'destroy');
	
	//Setting up The input boxes
	$inputNum->connect("changed", "set_num");
	$inputNum->show();
	
	$inputFace->connect("changed", "set_face");
	$inputFace->show();
	
	//Setting up the buttons
	$broll->connect('clicked', 'roll', $result, $statusb);
	$qb->connect('clicked', 'destroy');

	//Setting upp the result box and the scrollbar
	$result->set_word_wrap(true);
	$fortune="Welcome to VirtuaDice by Patrik OltermannnThis project was made as an exersize in coding with the new php-gtk engine and make a nonweb application with PHP4. nnAs such this is a success. nThis application is somewhat useless unless you want to play a roleplaying game on a train and cant be bothered with Dice rolling all over the place";
	$result->insert_text($fortune, 0);
	$result->show();	
	
	
	//Setting up the GUI
	$window2->add($vb); 		//putting the vertical box in the window
	$vb->pack_start($label);	//adding label to vbox
	$vb->pack_start($inputNum); // the number of Dice input box
	$vb->pack_start($inputFace);// the faces of the dice inputbox
	$vb->pack_start($broll);	//Roll button
	$vb->pack_start($hb);	   //adding the horisontal box 
	
	$hb->pack_start($result);   // putting in result window
	$hb->pack_end($scrollbar, false); //and scrollbar

	$vb->pack_start($qb); 		//putting the quit button 
	$vb->pack_end($statusb); 		//putting te statusbar on the bottom
	//Time to display it all
	$window2->show_all();
}

/*
 * function for rolling dice and displaying result
 *
 */
 function roll($broll, $result, $statusb)
 {
 	// printing out what is being rolled
 	$output .= "roooolin ".$GLOBALS["number"]."d".$GLOBALS["faces"]."!!!n";
 	// here comes the random generator
 	//first seed generator
 	mt_srand(doubleval(microtime()) * 100000000);
 	//now for the random numbers
 	for($i=0; $i < $GLOBALS["number"]; $i++)
 	{
 		$n = mt_rand(1, $GLOBALS["faces"]);
 		$die[$i] = $n;
 		$count = $i + 1;
 		$output .= "Die $count:t$die[$i]n";
 		$total += $n;
 	}
 	$output .= "nTotal: $totalnnnnnnn";
	 //putting out the result to the result window
 	$result->freeze();
 	$result->delete_text(0,-1);
 	$result->insert_text($output, 0);
 	$result->thaw();
 	//Putting in total in statusbar, havent figured out context id but hey it works :) 
 	$status_context=$statusb->get_context_id('foo');
 	$statusb->push($status_context, "Total: $total");
 	//print $output; //for debugging
 }
 /*
  *Functions to set the numbers
  *
  */
function set_num($inputNum)
	{
	//global $inputNum;
	$num = $inputNum->get_text();
	//print "number:$numn";
	$GLOBALS["number"]=$num;
	}
function set_face($inputFace)
	{
	//global $inputFace;
	$face = $inputFace->get_text(); 
	//print "face:$facen";
	$GLOBALS["faces"]=$face;
	}
	
//Here is the root window and the calling of the main loop
//
//create all widgets
$window = &new GtkWindow();										//Gtk window
$wvb = &new GtkVbox();											 //Vertical box
$button = &new GtkButton('enter');								 //Button
$wlabel = &new GtkLabel("Welcome to VirtuaDicenBy Patrik Olterman");	// Label

//setting up the window
$window->set_title("VirtuaDice");
$window->connect('destroy', 'hide');
$window->connect('delete-event', 'delete_event');
$window->set_border_width(10);

//setting up the button
$button->connect('clicked', 'main');

//Placing all the parts of the GUI
$window->add($wvb);		//add vertical box to window
$wvb->pack_start($wlabel); //add label to vbox	
$wvb->pack_end($button);   //add button to vbox

// Here we go and show it all 
$window->show_all();

//main loop
Gtk::main();

?>