Logo Search packages:      
Sourcecode: alsa-tools version File versions  Download package

connectionwizard.cpp

/*
 *  qlo10k1 - GUI frontend for ld10k1
 *
 *  Copyright (c) 2004 by Peter Zubaj
 *
 *   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
 *
 */
 
#include <qradiobutton.h>
#include <qpushbutton.h>
#include <qcheckbox.h>
#include <qlistbox.h>

#include "structure_patch.h"
#include "structure_io.h"
#include "connectionwizard.h"

ConnectionWizard::ConnectionWizard(bool o, StrGlobal *g, RouteInfo *r)
      : ConnectionWizardBase()
{
      out = o;
      global = g;
      route = *r;
      rptr = r;
      
      rtype = None;
      pto = NULL;
      
      RSItemIO *io = r->getToIO();
      
      if (io)
      {
            RSItemBaseWithType *owner = (RSItemBaseWithType *)io->getOwner();
            switch (owner->type())
            {
                  case RSItemBaseWithType::In:
                        rtype = In;
                        break;
                  case RSItemBaseWithType::Out:
                        rtype = Out;
                        break;
                  case RSItemBaseWithType::FX:
                        rtype = FX;
                        break;
                  case RSItemBaseWithType::Patch:
                        if (io->isOutput())
                              rtype = POut;
                        else
                              rtype = PIn;
                        pto = (StrPatch *)owner;
                        break;
                  default:
                        break;
            }
      }

      if (!out)
      {
            rbOutput->hide();
      }
      else
      {
            rbFX->hide();
            rbInput->hide();
      }
      
      StrPatch *patch;
      
      lbPatch->clear();
      for(patch = global->Patches.first(); patch; patch = global->Patches.next() )
      {
            lbPatch->insertItem(patch->name());
            patchList.append(patch);
      }
      
      connect(rbNone, SIGNAL(clicked()), this, SLOT(noneClicked()));
      connect(rbFX, SIGNAL(clicked()), this, SLOT(fxClicked()));
      connect(rbInput, SIGNAL(clicked()), this, SLOT(inClicked()));
      connect(rbOutput, SIGNAL(clicked()), this, SLOT(outClicked()));
      connect(rbPatch, SIGNAL(clicked()), this, SLOT(patchClicked()));
      
      connect(lbPatch, SIGNAL(clicked(QListBoxItem *)), this, SLOT(patchListClicked(QListBoxItem *)));
      connect(lbEnd, SIGNAL(clicked(QListBoxItem *)), this, SLOT(endListClicked(QListBoxItem *)));
      
      connect(finishButton(), SIGNAL(clicked()), this, SLOT(finishClicked()));
      
      connect(this, SIGNAL(selected(const QString &)), this, SLOT(selected(const QString &)));
      helpButton()->hide();
      
      setFinishEnabled(pageType, true);
      setNextEnabled(pageType, true);
      setFinishEnabled(pagePatch, true);
      setNextEnabled(pagePatch, true);
      setFinishEnabled(pageEnd, true);
      setNextEnabled(pageEnd, true);
}

void ConnectionWizard::setState(bool patch, bool end, bool back, bool next, bool finish)
{
      setAppropriate(pagePatch, patch ? true : false);
      setAppropriate(pageEnd, end ? true : false);
      
      backButton()->setEnabled(back ? true : false);
      nextButton()->setEnabled(next ? true : false);
      finishButton()->setEnabled(finish ? true : false);
}

void ConnectionWizard::loadEnd(IOType iotype)
{
      lbEnd->clear();
      ios.clear();
      
      if (iotype == In)
      {
            for (int i = 0; i < (int)global->Inputs.count(); i++)
            {
                  StrInput *io = global->Inputs.at(i);
                  ios.append(io->getIO(false, 0));
                  lbEnd->insertItem(io->name());
            }
      }
      else if (iotype == Out)
      {
            for (int i = 0; i < (int)global->Outputs.count(); i++)
            {
                  StrOutput *io = global->Outputs.at(i);
                  ios.append(io->getIO(true, 0));
                  lbEnd->insertItem(io->name());
            }
      }
      else if (iotype == FX)
      {
            for (int i = 0; i < (int)global->FXs.count(); i++)
            {
                  StrFX *io = global->FXs.at(i);
                  ios.append(io->getIO(false, 0));
                  lbEnd->insertItem(io->name());
            }
      }
}

void ConnectionWizard::noneClicked()
{
      setState(false, false, false, false, true);
      if (rtype != ConnectionWizard::None)
      {
            rtype = ConnectionWizard::None;
            pto = NULL;
      }
}


void ConnectionWizard::fxClicked()
{
      setState(false, true, false, true, false);
      if (rtype != ConnectionWizard::FX)
      {
            rtype = ConnectionWizard::FX;
            pto = NULL;
      }
}

void ConnectionWizard::inClicked()
{
      setState(false, true, false, true, false);
      if (rtype != ConnectionWizard::In)
      {
            rtype = ConnectionWizard::In;
            pto = NULL;
      }
}

void ConnectionWizard::outClicked()
{
      setState(false, true, false, true, false);
      if (rtype != ConnectionWizard::Out) 
      {
            rtype = ConnectionWizard::Out;
            pto = NULL;
      }
}

void ConnectionWizard::patchClicked()
{
      setState(true, true, false, true, false);
      if (rtype != ConnectionWizard::PIn && rtype != ConnectionWizard::POut)
      {
            if (out)
                  rtype = ConnectionWizard::PIn;
            else
                  rtype = ConnectionWizard::POut;
            pto = NULL;
      }
}

void ConnectionWizard::selected(const QString &page)
{
      if (page == "Connection target")
      {
            switch (rtype)
            {
                  case None:
                        rbNone->setChecked(true);
                        setState(false, false, false, false, true);
                        break;
                  case FX:
                        rbFX->setChecked(true);
                        setState(false, true, false, true, false);
                        break;
                  case In:
                        rbInput->setChecked(true);
                        setState(false, true, false, true, false);
                        break;
                  case Out:
                        rbOutput->setChecked(true);
                        setState(false, true, false, true, false);
                        break;
                  case PIn:
                  case POut:
                        rbPatch->setChecked(true);
                        setState(true, true, false, true, false);
                        break;
            }
      }
      else if (page == "Patch")
      {
            finishButton()->setEnabled(false);
            if (pto)
            {
                  // find patch
                  lbPatch->setCurrentItem(patchList.find(pto));
                  nextButton()->setEnabled(true);
            }
            else
            {
                  QListBoxItem *si = lbPatch->selectedItem();
                  if (si)
                        lbPatch->setSelected(si, false);
                  lbPatch->setCurrentItem(-1);
                  nextButton()->setEnabled(false);
            }

            cbMulti->setChecked(route.getMulti());
            cbSimple->setChecked(route.getSimple());
      }
      else if (page == "End")
      {
            nextButton()->setEnabled(false);
            switch (rtype)
            {
                  case None:
                        break;
                  case FX:
                  case In:
                  case Out:
                        loadEnd(rtype);
                        break;
                  case PIn:
                  case POut:
                        // load patch in or out
                        ios.clear();
                        lbEnd->clear();

                        for (int i = 0; i < (int)pto->getMaxIOIdx(out); i++)
                        {
                              RSItemIO *io = pto->getIO(out, i);
                              if (io)
                              {
                                    ios.append(io);
                                    lbEnd->insertItem(io->getDesc());
                              }
                        }
                        
                        route.setMulti(cbMulti->isChecked());
                        route.setSimple(cbSimple->isChecked());
                        break;
            }

            if (route.getToIO())
            {
                  lbEnd->setCurrentItem(ios.find(route.getToIO()));
                  finishButton()->setEnabled(true);
            }
            else
            {
                  QListBoxItem *si = lbEnd->selectedItem();
                  if (si)
                        lbEnd->setSelected(si, false);
                  lbEnd->setCurrentItem(-1);
                  finishButton()->setEnabled(false);
            }
      }
}

void ConnectionWizard::patchListClicked(QListBoxItem *item)
{
      pto = patchList.at(lbPatch->index(item));
      route.setToIO(NULL);
      nextButton()->setEnabled(true);
}

void ConnectionWizard::endListClicked(QListBoxItem *item)
{
      route.setToIO(ios.at(lbEnd->index(item)));
      finishButton()->setEnabled(true);
}

void ConnectionWizard::finishClicked()
{
      *rptr = route;
}

Generated by  Doxygen 1.6.0   Back to index