Overhaul of add_db window, turn settings class into a singleton

This commit is contained in:
Timothy Warren 2012-02-21 20:15:49 -05:00
parent 80091147a1
commit b64c7dd87d
3 changed files with 108 additions and 55 deletions

View File

@ -20,11 +20,23 @@
class Settings { class Settings {
private $current; private $current;
private static $instance;
public static function &get_instance()
{
if( ! isset(self::$instance))
{
$name = __CLASS__;
self::$instance = new $name();
}
return self::$instance;
}
/** /**
* Load the settings file * Load the settings file
*/ */
public function __construct() protected function __construct()
{ {
$path = BASE_DIR.'/settings.json'; $path = BASE_DIR.'/settings.json';
@ -47,6 +59,14 @@ class Settings {
} }
/**
* Output the settings on destruct
*/
protected function __destruct()
{
file_put_contents(BASE_DIR . '/settings.json', json_encode($this->current));
}
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/** /**
@ -79,7 +99,6 @@ class Settings {
} }
$this->current->{$key} = $val; $this->current->{$key} = $val;
$this->write();
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
@ -96,8 +115,6 @@ class Settings {
{ {
$this->current->dbs->{$name} = array(); $this->current->dbs->{$name} = array();
$this->current->dbs->{$name} = $params; $this->current->dbs->{$name} = $params;
$this->write();
} }
else else
{ {
@ -118,7 +135,6 @@ class Settings {
if(isset($this->current->dbs->{$name})) if(isset($this->current->dbs->{$name}))
{ {
$this->current->dbs->{$name} = $params; $this->current->dbs->{$name} = $params;
$this->write();
} }
else else
{ {
@ -142,7 +158,6 @@ class Settings {
// Remove the db name from the object // Remove the db name from the object
unset($this->current->dbs->{$name}); unset($this->current->dbs->{$name});
$this->write();
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
@ -156,15 +171,5 @@ class Settings {
{ {
return $this->current->dbs; return $this->current->dbs;
} }
// --------------------------------------------------------------------------
/**
* Write the settings to the file
*/
public function write()
{
file_put_contents(BASE_DIR . '/settings.json', json_encode($this->current));
}
} }
// End of settings.php // End of settings.php

View File

@ -19,17 +19,47 @@ class Add_DB extends GtkWindow {
var $conn, $dbtype, $host, $user, $pass, $database, $settings, $db_file; var $conn, $dbtype, $host, $user, $pass, $database, $settings, $db_file;
public function __construct() public function __construct($conn='', $dbtype='', $host='localhost', $user='', $pass='', $database='', $db_file=NULL)
{ {
parent::__construct(); parent::__construct();
$this->settings = new Settings(); $this->settings =& Settings::get_instance();
$this->set_position(Gtk::WIN_POS_CENTER); $this->set_position(Gtk::WIN_POS_CENTER);
$this->set_title("Add Database Connection"); $this->set_title("Add Database Connection");
// Set up the form elements, with default values
$this->conn = new GtkEntry();
$this->host = new GtkEntry();
$this->user = new GtkEntry();
$this->pass = new GtkEntry();
$this->dbtype = GtkComboBox::new_text();
$this->db_file = new GtkFileChooserButton("Select a database file",
Gtk::FILE_CHOOSER_ACTION_OPEN);
// Populate the available database types
$db_types = $this->get_available_dbs();
foreach($db_types as $t)
{
$this->dbtype->append_text($t);
}
// Reset defaults when changing db types
$this->dbtype->connect_simple("changed", array($this, "change_db"));
// Populate the text fields with default values
$this->conn->set_text($conn);
$this->host->set_text($host);
$this->user->set_text($user);
$this->pass->set_text($pass);
$this->db_file->set_uri($db_file);
// Create the layout table
$this->table = new GtkTable();
// Add the Vbox, and show the window // Add the Vbox, and show the window
$this->add($this->_layout()); $this->_layout();
$this->add($this->table);
$this->show_all(); $this->show_all();
} }
@ -40,10 +70,6 @@ class Add_DB extends GtkWindow {
*/ */
private function _layout() private function _layout()
{ {
$table = new GtkTable();
$db_types = $this->get_available_dbs();
//Table attach //Table attach
//$tbl->attach(left_start, right_stop, top_start, bottom_stop) //$tbl->attach(left_start, right_stop, top_start, bottom_stop)
@ -54,51 +80,36 @@ class Add_DB extends GtkWindow {
// Connection name // Connection name
{ {
$this->_add_row($table, "Connection name", $this->conn, $y1, $y2); $this->_add_row("Connection name", $this->conn, $y1, $y2);
} }
// Database type // Database type
{ {
$dbtypelbl = new GtkLabel("Database Type"); $dbtypelbl = new GtkLabel("Database Type");
$this->dbtype = GtkComboBox::new_text();
$typealign = new GtkAlignment(0, 0.5, 0, 0); $typealign = new GtkAlignment(0, 0.5, 0, 0);
$typealign->add($dbtypelbl); $typealign->add($dbtypelbl);
$this->table->attach($typealign, 0, 1, ++$y1, ++$y2);
foreach($db_types as $t) $this->table->attach($this->dbtype, 1, 2, $y1, $y2);
{
$this->dbtype->append_text($t);
}
$table->attach($typealign, 0, 1, ++$y1, ++$y2);
$table->attach($this->dbtype, 1, 2, $y1, $y2);
} }
// DB File // DB File
{ {
$filelbl = new GtkLabel("Database file"); $this->_add_row("Database File", $this->db_file, $y1, $y2);
$this->db_file = new GtkFileChooserButton("Select a database file",
Gtk::FILE_CHOOSER_ACTION_OPEN);
$filealign = new GtkAlignment(0, 0.5, 0, 0);
$filealign->add($filelbl);
$table->attach($filealign, 0, 1, ++$y1, ++$y2);
$table->attach($this->db_file, 1, 2, $y1, $y2);
} }
// Host // Host
{ {
$this->_add_row($table, "DB Host", $this->host, $y1, $y2); $this->_add_row("Host", $this->host, $y1, $y2);
} }
// Username // Username
{ {
$this->_add_row($table, "DB User", $this->user, $y1, $y2); $this->_add_row("User", $this->user, $y1, $y2);
} }
// Password // Password
{ {
$this->_add_row($table, "DB Password", $this->pass, $y1, $y2); $this->_add_row("Password", $this->pass, $y1, $y2);
} }
// Add connection button // Add connection button
@ -107,12 +118,9 @@ class Add_DB extends GtkWindow {
$add_button->set_label("Add Connnection"); $add_button->set_label("Add Connnection");
$add_button->set_image(GTKImage::new_from_stock(GTK::STOCK_ADD, $add_button->set_image(GTKImage::new_from_stock(GTK::STOCK_ADD,
Gtk::ICON_SIZE_SMALL_TOOLBAR)); Gtk::ICON_SIZE_SMALL_TOOLBAR));
$table->attach($add_button, 0, 3, ++$y1, ++$y2); $this->table->attach($add_button, 0, 3, ++$y1, ++$y2);
$add_button->connect_simple("clicked", array($this, 'db_add')); $add_button->connect_simple("clicked", array($this, 'db_add'));
} }
return $table;
} }
/** /**
@ -168,15 +176,55 @@ class Add_DB extends GtkWindow {
* @param int &$y1 * @param int &$y1
* @param int &$y2 * @param int &$y2
*/ */
private function _add_row(&$table, $label, &$vname, &$y1, &$y2) private function _add_row($label, &$vname, &$y1, &$y2)
{ {
$lbl = new GtkLabel($label); $lbl = new GtkLabel($label);
$vname = new GtkEntry(); //$vname =& $this->{$vname};
$lblalign = new GtkAlignment(0, 0.5, 0, 0); $lblalign = new GtkAlignment(0, 0.5, 0, 0);
$lblalign->add($lbl); $lblalign->add($lbl);
$table->attach($lblalign, 0, 1, ++$y1, ++$y2); $this->table->attach($lblalign, 0, 1, ++$y1, ++$y2);
$table->attach($vname, 1, 2, $y1, $y2); $this->table->attach($vname, 1, 2, $y1, $y2);
}
/**
* Set defaults for new database type
*
* @param GtkComboBox $combo
* @return void
*/
public function change_db($combo)
{
$new_db = $this->dbtype->get_active_text();
switch($new_db)
{
default:
$this->host->set_text('localhost');
$this->db_file->set_uri(NULL);
case "MySQL":
$this->user->set_text('root');
$this->pass->set_text('');
break;
case "PostgreSQL":
$this->user->set_text('');
$this->pass->set_text('');
break;
case "Firebird":
$this->user->set_text('sysdba');
$this->pass->set_text('masterkey');
break;
case "ODBC":
case "SQLite":
$this->user->set_text('');
$this->pass->set_text('');
break;
}
} }
/** /**

View File

@ -19,7 +19,7 @@
*/ */
class Main extends GtkWindow { class Main extends GtkWindow {
private $settings; private $settings, $model;
/** /**
* Create and display the main window on startup * Create and display the main window on startup
@ -32,7 +32,7 @@ class Main extends GtkWindow {
$this->resize(640, 480); $this->resize(640, 480);
$this->set_position(Gtk::WIN_POS_CENTER); $this->set_position(Gtk::WIN_POS_CENTER);
$this->settings = new Settings(); $this->settings =& Settings::get_instance();
//Layout the interface //Layout the interface
$this->_main_layout(); $this->_main_layout();