Blob Blame History Raw
/*  cdrdao - write audio CD-Rs in disc-at-once mode
 *
 *  Copyright (C) 2007  Denis Leroy
 *
 *  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., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include <iostream>
#include <gnome.h>

#include "config.h"
#include "PreferencesDialog.h"
#include "MessageBox.h"
#include "trackdb/TempFileManager.h"

PreferencesDialog::PreferencesDialog(BaseObjectType* cobject,
				     const Glib::RefPtr<Gnome::Glade::Xml>&
				     refGlade)
	: Gtk::Dialog(cobject),
	  m_refGlade(refGlade)
{
    m_refGlade->get_widget("ApplyButton", _applyButton);
    m_refGlade->get_widget("OkButton", _okButton);
    m_refGlade->get_widget("CancelButton", _cancelButton);
    m_refGlade->get_widget("TempDirectory", _tempDirEntry);
    m_refGlade->get_widget("TempDirDialog", _tempDirDialog);
    m_refGlade->get_widget("TempDialogButton", _browseButton);
    m_refGlade->get_widget("TempBrowseCancel", _browseCancel);
    m_refGlade->get_widget("TempBrowseOpen", _browseOpen);

    if (!_applyButton || !_okButton || !_cancelButton || !_tempDirEntry ||
	!_tempDirDialog || !_browseButton || !_browseCancel || !_browseOpen) {
        std::cerr << "Unable to create all GUI widgets from glade file\n";
	exit(1);
    }

    m_refClient = Gnome::Conf::Client::get_default_client();
    m_refClient->add_dir("/apps/gcdmaster");

    _applyButton->signal_clicked()
	.connect(sigc::mem_fun(*this,
			       &PreferencesDialog::on_button_apply));
    _cancelButton->signal_clicked()
	.connect(sigc::mem_fun(*this,
			       &PreferencesDialog::on_button_cancel));
    _okButton->signal_clicked()
	.connect(sigc::mem_fun(*this,
			       &PreferencesDialog::on_button_ok));
    _browseButton->signal_clicked()
	.connect(sigc::mem_fun(*this,
			       &PreferencesDialog::on_button_browse));
    _browseCancel->signal_clicked()
	.connect(sigc::mem_fun(*this,
			       &PreferencesDialog::on_button_browse_cancel));
    _browseOpen->signal_clicked()
	.connect(sigc::mem_fun(*this,
			       &PreferencesDialog::on_button_browse_open));

    _tempDirDialog->hide();

    readFromGConf();
    Gtk::Dialog::hide();
}

PreferencesDialog::~PreferencesDialog()
{
}

void PreferencesDialog::show()
{
    readFromGConf();
    Gtk::Dialog::show();
}

void PreferencesDialog::readFromGConf()
{
    const Glib::ustring text =
	m_refClient->get_string("/apps/gcdmaster/temp_dir");
    _tempDirEntry->set_text(text);
}

bool PreferencesDialog::saveToGConf()
{
    const Glib::ustring text = _tempDirEntry->get_text();

    if (!tempFileManager.setTempDirectory(text.c_str())) {

	ErrorBox errBox(_("The directory you entered cannot be used as a "
			  "temporary files directory."));
	errBox.run();
	readFromGConf();
	return false;
    }

    try {
	m_refClient->set("/apps/gcdmaster/temp_dir", text);
    } catch (const Glib::Error& error) {
        std::cerr << error.what() << std::endl;
    }
    return true;
}

void PreferencesDialog::on_button_apply()
{
    saveToGConf();
}

void PreferencesDialog::on_button_cancel()
{
    readFromGConf();
    hide();
}

void PreferencesDialog::on_button_ok()
{
    if (saveToGConf())
	hide();
}

void PreferencesDialog::on_button_browse()
{
    _tempDirDialog->show();
}

void PreferencesDialog::on_button_browse_cancel()
{
    _tempDirDialog->hide();
}

void PreferencesDialog::on_button_browse_open()
{
    _tempDirEntry->set_text(_tempDirDialog->get_filename());
    _tempDirDialog->hide();
}