view settings.cpp @ 8:c63d67895cbe

layout designer: first draft
author Goffi <goffi@goffi.org>
date Wed, 24 Aug 2011 20:38:55 +0200
parents 220e5619bf87
children
line wrap: on
line source

/*
Bellaciao: a Salut à Toi frontend
Copyright (C) 2011  Jérôme Poisson (goffi@goffi.org)

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 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 Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "settings.h"
#include "bellaciao.h"
#include "layout_designer.h"

using namespace Qt;

Settings* Settings::_instance = 0;

ProfileListWidgetItem::ProfileListWidgetItem(const QString & profile, QListWidget * parent, bool isDefault)
    :QListWidgetItem(profile, parent)
{
    m_profile = profile;
    if (isDefault) {
        setText(text() + QObject::tr(" (default)"));
        QFont _font = font();
        _font.setWeight(QFont::Bold);
        setFont(_font);
    }

}

const QString& ProfileListWidgetItem::getProfile()
{
    return m_profile;
}

Settings::Settings(QWidget *parent)
    : QWidget(parent)
{
    setupUi(this);

    this->setAttribute(WA_DeleteOnClose);

    //We add the settings in tabs

    // Contact list Layout
    QVBoxLayout *layout =  new QVBoxLayout;
    LayoutDesigner* contact_list_layout = new LayoutDesigner;
    layout->addWidget(contact_list_layout);
    contactListLayoutTab->setLayout(layout);
    

    //We fill the profiles list
    m_bridge = Bridge::getBridge();
    m_session = Session::getSession();

    const QList<QString>& profiles = m_bridge->getProfilesList();
    const QString& default_profile = m_bridge->getProfileName("@DEFAULT@");
    const QList<QString>& checked_profiles = m_session->getProfiles(); 
    
    foreach(const QString& profile, profiles) {
        ProfileListWidgetItem *item = new ProfileListWidgetItem(profile, profileList, profile==default_profile);
        item->setFlags(item->flags() | ItemIsUserCheckable);
        item->setCheckState(checked_profiles.contains(profile)?Checked:Unchecked);
    }
    
    connect(profileList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(profileChanged(QListWidgetItem*)));
    connect(profileList, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(profileCurrentChanged(QListWidgetItem*, QListWidgetItem*)));

    //Confirmation buttons
    connect(buttonsGroupConfirm, SIGNAL(accepted()), this, SLOT(saveSettings()));
    connect(buttonsGroupConfirm, SIGNAL(rejected()), this, SLOT(cancelSettings()));
}

Settings::~Settings()
{
    _instance = 0;
}

Settings* Settings::getDialog() {
    if (_instance == 0) {
        _instance = new Settings;
    }
    
    return _instance;
}

//Profile settings slots
void Settings::profileChanged(QListWidgetItem* item)
{
}

void Settings::profileCurrentChanged(QListWidgetItem* current, QListWidgetItem* previous)
{
    if (!current) {
        profileData->setEnabled(false);
        customServerGroup->setEnabled(false);
        customServerGroup->setChecked(false);
        buttonDelete->setEnabled(false);
        buttonSetDefault->setEnabled(false);
        jidField->clear();
        passwordField->clear();
        serverField->clear();
        portField->clear();
        return;
    }

    ProfileListWidgetItem *item = dynamic_cast<ProfileListWidgetItem*>(current);

    profileData->setEnabled(true);
    customServerGroup->setEnabled(true);
    jidField->setEnabled(true);
    passwordField->setEnabled(true);
    buttonDelete->setEnabled(true);
    buttonSetDefault->setEnabled(true);
    const QString& jid = m_bridge->getParamA("JabberID", "Connection", "value", item->getProfile());
    const QString& password = m_bridge->getParamA("Password", "Connection", "value", item->getProfile());
    jidField->setText(jid);
    passwordField->setText(password);
}


void Settings::on_buttonNew_clicked() {
    bool ok;
    QString name = QInputDialog::getText(this, tr("New profile"), tr("Please enter profile name: "), QLineEdit::Normal, QString(), &ok);
    if (ok && !name.isEmpty()) {
        int success = m_bridge->createProfile(name);
        ProfileListWidgetItem *item;
        
        switch (success) {
            case 0: //success
                item = new ProfileListWidgetItem(name, profileList);
                item->setFlags(item->flags() | ItemIsUserCheckable);
                item->setCheckState(Checked);
                break;
            case 1: //profile name conflict
                QMessageBox::warning(this, tr("Profile name conflict"), tr("A profile with this name already exists. Please choose an other name"));
                break;
            default:
                QMessageBox::warning(this, tr("Profile creation error"), tr("Can't create profile"));
                
        }
    }
}


void Settings::on_buttonDelete_clicked() {
    ProfileListWidgetItem *item = dynamic_cast<ProfileListWidgetItem*>(profileList->currentItem());

    if ( QMessageBox::question (
            this,
            tr("Delete profile?"),
            tr("Do you really want to delete profile \"%1\" ?").arg(item->getProfile()),
            QMessageBox::Yes | QMessageBox::No,
            QMessageBox::No
            ) == QMessageBox::Yes
       )
    {
        int success = m_bridge->deleteProfile(item->getProfile());
        if (success==0)
            delete(item);
        else
            QMessageBox::warning(this, tr("Profile deletion error"), tr("Can't delete profile"));
    }

    
}


//Global settings slots
void Settings::saveSettings() //Save settings to session
{
    // We save profiles
    QList<QString> previous_profiles;
    QList<QString>& profiles = m_session->getProfiles();
    previous_profiles = profiles;
    profiles.clear();
    for (int i=0; i<profileList->count(); i++)
    {
        ProfileListWidgetItem* item = dynamic_cast<ProfileListWidgetItem*>(profileList->item(i));
        if (item->checkState() == Checked){
            profiles.append(item->getProfile());
        }
    }

    if (previous_profiles!=profiles) //The profiles checked are differents, we refill the contactList
        Bellaciao::getInstance()->connectProfiles();

    close();
        
}

void Settings::cancelSettings()
{
    close();
}