// rdbutton_panel.cpp
//
// The sound panel widget for RDAirPlay
//
//   (C) Copyright 2002-2003,2016 Fred Gleason <fredg@paravelsystems.com>
//
//   This program is free software; you can redistribute it and/or modify
//   it under the terms of the GNU General Public License version 2 as
//   published by the Free Software Foundation.
//
//   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 <qcolor.h>

#include <rdbutton_panel.h>
#include <rdbutton_dialog.h>


RDButtonPanel::RDButtonPanel(RDAirPlayConf::PanelType type,int panel,int cols,
			     int rows,RDStation *station,bool flash,
			     QWidget *parent)
{
  panel_button_columns=cols;
  panel_button_rows=rows;
  panel_station=station;
  for(int i=0;i<panel_button_rows;i++) {
    for(int j=0;j<panel_button_columns;j++) {
      panel_button[i][j]=
	new RDPanelButton(i,j,panel_station,flash,parent);
      if(station->enableDragdrop()&&(!station->enforcePanelSetup())) {
	panel_button[i][j]->setAcceptDrops(true);
      }
      panel_button[i][j]->setGeometry((15+PANEL_BUTTON_SIZE_X)*j,
				      (15+PANEL_BUTTON_SIZE_Y)*i,
				      PANEL_BUTTON_SIZE_X,
				      PANEL_BUTTON_SIZE_Y);
      panel_button[i][j]->hide();
      parent->connect(parent,SIGNAL(buttonFlash(bool)),
		      panel_button[i][j],SLOT(flashButton(bool)));
      QObject::connect(panel_button[i][j],
	 SIGNAL(cartDropped(int,int,unsigned,const QColor &,const QString &)),
	 parent,
	 SLOT(acceptCartDrop(int,int,unsigned,const QColor &,const QString &)));
    }
  }
  clear();
}


RDButtonPanel::~RDButtonPanel()
{
  for(int i=0;i<panel_button_rows;i++) {
    for(int j=0;j<panel_button_columns;j++) {
      delete panel_button[i][j];
    }
  }
}


QSize RDButtonPanel::sizeHint() const
{
  return QSize(500,535);
}


QSizePolicy RDButtonPanel::sizePolicy() const
{
  return QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
}


RDPanelButton *RDButtonPanel::panelButton(int row,int col) const
{
  return panel_button[row][col];
}


void RDButtonPanel::setActionMode(RDAirPlayConf::ActionMode mode)
{
  switch(mode) {
      case RDAirPlayConf::CopyFrom:
	for(int i=0;i<panel_button_rows;i++) {
	  for(int j=0;j<panel_button_columns;j++) {
	    if(panel_button[i][j]->cart()!=0) {
	      panel_button[i][j]->setColor(BUTTON_FROM_BACKGROUND_COLOR);
	    }
	  }
	}
	break;

      case RDAirPlayConf::CopyTo:
	      for(int i=0;i<panel_button_rows;i++) {
	        for(int j=0;j<panel_button_columns;j++) {
	      if(panel_button[i][j]->playDeck()!=NULL) {
                if(panel_button[i][j]->playDeck()->state()==RDPlayDeck::Paused) {
		  panel_button[i][j]->setColor(RDPANEL_PAUSED_BACKGROUND_COLOR);
                  }
                else {
                  panel_button[i][j]->setColor(RDPANEL_PLAY_BACKGROUND_COLOR);
                  }
	        }
	      else {
                panel_button[i][j]->setColor(BUTTON_TO_BACKGROUND_COLOR);
                }
	   }
	}
	break;

      case RDAirPlayConf::AddTo:
	      for(int i=0;i<panel_button_rows;i++) {
		for(int j=0;j<panel_button_columns;j++) {
             if(panel_button[i][j]->playDeck()==NULL) {
               panel_button[i][j]->setColor(BUTTON_TO_BACKGROUND_COLOR);
             }
	  }
	}
	break;

      case RDAirPlayConf::DeleteFrom:
	      for(int i=0;i<panel_button_rows;i++) {
	     for(int j=0;j<panel_button_columns;j++) {
             if(panel_button[i][j]->playDeck()==NULL) {
               panel_button[i][j]->setColor(BUTTON_FROM_BACKGROUND_COLOR);
             }
	  }
	}
	break;

      default:
	for(int i=0;i<panel_button_rows;i++) {
	for(int j=0;j<panel_button_columns;j++) {
//	    if(panel_button[i][j]->cart()!=0) {
	      if(panel_button[i][j]->playDeck()!=NULL) {
                if(panel_button[i][j]->playDeck()->state()==RDPlayDeck::Paused) {
		  panel_button[i][j]->setColor(RDPANEL_PAUSED_BACKGROUND_COLOR);
                  }
                else {
                  panel_button[i][j]->setColor(RDPANEL_PLAY_BACKGROUND_COLOR);
                  }
	        }
	      else {
                if(panel_button[i][j]->state()) {
		    panel_button[i][j]->setColor(RDPANEL_PAUSED_BACKGROUND_COLOR);
                    }
                  else {
		    panel_button[i][j]->reset();
                  }
                }
//	    }
	  }
	}
	break;
  }
}


void RDButtonPanel::setAllowDrags(bool state)
{
  for(int i=0;i<panel_button_rows;i++) {
    for(int j=0;j<panel_button_columns;j++) {
      panel_button[i][j]->setAllowDrags(state);
    }
  }
}


void RDButtonPanel::setAcceptDrops(bool state)
{
  for(int i=0;i<panel_button_rows;i++) {
    for(int j=0;j<panel_button_columns;j++) {
      panel_button[i][j]->setAcceptDrops(state);
    }
  }
}


void RDButtonPanel::hide()
{
  for(int i=0;i<panel_button_rows;i++) {
    for(int j=0;j<panel_button_columns;j++) {
      panel_button[i][j]->hide();
    }
  }
}


void RDButtonPanel::show()
{
  for(int i=0;i<panel_button_rows;i++) {
    for(int j=0;j<panel_button_columns;j++) {
      panel_button[i][j]->show();
    }
  }
}


void RDButtonPanel::clear()
{
  for(int i=0;i<panel_button_rows;i++) {
    for(int j=0;j<panel_button_columns;j++) {
      panel_button[i][j]->clear();
    }
  }
}