2023-10-04 Fred Gleason <fredg@paravelsystems.com>

* Got SoundPanel panel selection working for both Host and Station
	panels.

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2023-10-04 13:54:59 -04:00
parent 0c00c6abdf
commit 26059935f2
8 changed files with 213 additions and 352 deletions

View File

@ -24408,3 +24408,6 @@
* Added a '--dump-panel-updates' switch to rdairplay(1).
2023-09-29 Fred Gleason <fredg@paravelsystems.com>
* Fixed a typo in the rdpanel(1) man page.
2023-10-04 Fred Gleason <fredg@paravelsystems.com>
* Got SoundPanel panel selection working for both Host and Station
panels.

View File

@ -310,6 +310,7 @@ nodist_librd_la_SOURCES = moc_rdadd_cart.cpp\
moc_rdbusybar.cpp\
moc_rdbusydialog.cpp\
moc_rdbutton_dialog.cpp\
moc_rdbutton_panel.cpp\
moc_rdcae.cpp\
moc_rdcardselector.cpp\
moc_rdcart_dialog.cpp\

View File

@ -1,8 +1,8 @@
// rdbutton_panel.cpp
//
// The sound panel widget for RDAirPlay
// Component class for sound panel widgets
//
// (C) Copyright 2002-2021 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2023 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
@ -18,10 +18,10 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#include <qcolor.h>
#include <QColor>
#include <rdbutton_panel.h>
#include <rdbutton_dialog.h>
#include "rdbutton_dialog.h"
#include "rdbutton_panel.h"
RDButtonPanel::RDButtonPanel(RDAirPlayConf::PanelType type,int number,
QWidget *parent)
@ -29,21 +29,25 @@ RDButtonPanel::RDButtonPanel(RDAirPlayConf::PanelType type,int number,
{
panel_number=number;
panel_button_mapper=new QSignalMapper(this);
connect(panel_button_mapper,SIGNAL(mapped(int)),
this,SLOT(buttonClickedData(int)));
for(int i=0;i<PANEL_MAX_BUTTON_ROWS;i++) {
for(int j=0;j<PANEL_MAX_BUTTON_COLUMNS;j++) {
panel_button[i][j]=
new RDPanelButton(i,j,rda->station(),rda->panelConf()->flashPanel(),
parent);
panel_button[i][j]=new RDPanelButton(i,j,rda->station(),
rda->panelConf()->flashPanel(),this);
int id=(number*PANEL_MAX_BUTTON_COLUMNS*PANEL_MAX_BUTTON_ROWS)+
(i*PANEL_MAX_BUTTON_COLUMNS)+j;
connect(panel_button[i][j],SIGNAL(clicked()),
panel_button_mapper,SLOT(map()));
panel_button_mapper->setMapping(panel_button[i][j],id);
if(rda->station()->enableDragdrop()) {
panel_button[i][j]->setAllowDrags(true);
if(!rda->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)));
@ -64,6 +68,7 @@ RDButtonPanel::~RDButtonPanel()
delete panel_button[i][j];
}
}
delete panel_button_mapper;
}
@ -202,26 +207,6 @@ void RDButtonPanel::setAcceptDrops(bool state)
}
void RDButtonPanel::hide()
{
for(int i=0;i<PANEL_MAX_BUTTON_ROWS;i++) {
for(int j=0;j<PANEL_MAX_BUTTON_COLUMNS;j++) {
panel_button[i][j]->hide();
}
}
}
void RDButtonPanel::show()
{
for(int i=0;i<PANEL_MAX_BUTTON_ROWS;i++) {
for(int j=0;j<PANEL_MAX_BUTTON_COLUMNS;j++) {
panel_button[i][j]->show();
}
}
}
void RDButtonPanel::clear()
{
for(int i=0;i<PANEL_MAX_BUTTON_ROWS;i++) {
@ -268,3 +253,44 @@ QString RDButtonPanel::json(int padding,bool final) const
return ret;
}
void RDButtonPanel::setVisible(bool state)
{
printf("Calling RDButtonPanel::setVisible(%d) @ %p\n",state,this);
RDWidget::setVisible(state);
for(int i=0;i<PANEL_MAX_BUTTON_ROWS;i++) {
for(int j=0;j<PANEL_MAX_BUTTON_COLUMNS;j++) {
panel_button[i][j]->setVisible(state);
}
}
}
void RDButtonPanel::buttonClickedData(int id)
{
int pnum=id/(PANEL_MAX_BUTTON_COLUMNS*PANEL_MAX_BUTTON_ROWS);
int pos=id%(PANEL_MAX_BUTTON_COLUMNS*PANEL_MAX_BUTTON_ROWS);
printf("emitting buttonClicked(%d,%d,%d)\n",
pnum,pos%PANEL_MAX_BUTTON_COLUMNS,pos/PANEL_MAX_BUTTON_COLUMNS);
emit buttonClicked(pnum,pos%PANEL_MAX_BUTTON_COLUMNS,pos/PANEL_MAX_BUTTON_COLUMNS);
}
void RDButtonPanel::resizeEvent(QResizeEvent *e)
{
for(int i=0;i<PANEL_MAX_BUTTON_ROWS;i++) {
for(int j=0;j<PANEL_MAX_BUTTON_COLUMNS;j++) {
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);
}
}
for(int i=0;i<PANEL_MAX_BUTTON_ROWS;i++) {
for(int j=0;j<PANEL_MAX_BUTTON_COLUMNS;j++) {
RDPanelButton *button=panel_button[i][j];
button->setVisible(geometry().contains(button->geometry()));
}
}
}

View File

@ -1,6 +1,6 @@
// rdbutton_panel.h
//
// The sound panel widget for RDAirPlay
// Component class for sound panel widgets
//
// (C) Copyright 2002-2023 Fred Gleason <fredg@paravelsystems.com>
//
@ -23,6 +23,7 @@
#include <QDateTime>
#include <QLabel>
#include <QSignalMapper>
#include <rdairplay_conf.h>
#include <rdstation.h>
@ -37,12 +38,10 @@
//
#define PANEL_MAX_BUTTON_COLUMNS 40
#define PANEL_MAX_BUTTON_ROWS 23
#define PANEL_BUTTON_SIZE_X 88
#define PANEL_BUTTON_SIZE_Y 80
class RDButtonPanel : public RDWidget
{
Q_OBJECT;
public:
RDButtonPanel(RDAirPlayConf::PanelType type,int number,QWidget *parent);
~RDButtonPanel();
@ -55,15 +54,26 @@ class RDButtonPanel : public RDWidget
void setActionMode(RDAirPlayConf::ActionMode mode);
void setAllowDrags(bool state);
void setAcceptDrops(bool state);
void hide();
void show();
void clear();
QString json(int padding=0,bool final=false) const;
public slots:
void setVisible(bool state);
signals:
void buttonClicked(int pnum,int col,int row);
private slots:
void buttonClickedData(int id);
protected:
void resizeEvent(QResizeEvent *e);
private:
int panel_number;
QString panel_title;
QSignalMapper *panel_button_mapper;
RDPanelButton *panel_button[PANEL_MAX_BUTTON_ROWS][PANEL_MAX_BUTTON_COLUMNS];
};
#endif // RDPANEL_BUTTON_H
#endif // RDBUTTON_PANEL_H

View File

@ -1,6 +1,6 @@
// rdpanel_button.cpp
//
// The SoundPanel Button for RDAirPlay.
// Component class for sound panel widgets.
//
// (C) Copyright 2002-2023 Fred Gleason <fredg@paravelsystems.com>
//
@ -313,13 +313,13 @@ void RDPanelButton::setAllowDrags(bool state)
void RDPanelButton::setDuckVolume(int level)
{
button_duck_volume=level;
button_duck_volume=level;
}
int RDPanelButton::duckVolume() const
{
return button_duck_volume;
return button_duck_volume;
}
@ -329,6 +329,12 @@ bool RDPanelButton::isEmpty() const
}
bool RDPanelButton::isActive() const
{
return button_play_deck!=NULL;
}
QString RDPanelButton::json(int padding,bool final)
{
QString ret;
@ -362,6 +368,16 @@ QString RDPanelButton::json(int padding,bool final)
}
void RDPanelButton::setVisible(bool state)
{
RDPushButton::setVisible(state);
}
void RDPanelButton::tickClock()
{
int msecs;
@ -470,26 +486,26 @@ void RDPanelButton::dropEvent(QDropEvent *e)
void RDPanelButton::WriteKeycap(int msecs)
{
QString text=button_text;
QPixmap *pix=new QPixmap(size().width()-2,size().height()-2);
QPixmap *pix=new QPixmap(PANEL_BUTTON_SIZE_X-2,PANEL_BUTTON_SIZE_Y-2);
QPainter *p=new QPainter(pix);
if(button_state) {
if(button_flash) {
if(button_flash_state) {
p->fillRect(0,0,size().width()-2,size().height()-2,button_color);
p->fillRect(0,0,pix->width(),pix->height(),button_color);
p->setPen(RDGetTextColor(button_color));
}
else {
p->fillRect(0,0,size().width()-2,size().height()-2,button_default_color);
p->fillRect(0,0,pix->width(),pix->height(),button_default_color);
p->setPen(RDGetTextColor(button_default_color));
}
}
else {
p->fillRect(0,0,size().width()-2,size().height()-2,button_color);
p->fillRect(0,0,pix->width(),pix->height(),button_color);
p->setPen(RDGetTextColor(button_color));
}
}
else {
p->fillRect(0,0,size().width()-2,size().height()-2,button_color);
p->fillRect(0,0,pix->width(),pix->height(),button_color);
p->setPen(RDGetTextColor(button_color));
}
@ -498,12 +514,13 @@ void RDPanelButton::WriteKeycap(int msecs)
//
QFontMetrics m(buttonFont());
p->setFont(buttonFont());
p->drawText(RDPANEL_BUTTON_MARGIN,m.lineSpacing(),
GetNextLine(&text,m,size().width()-2-3*RDPANEL_BUTTON_MARGIN));
GetNextLine(&text,m,pix->width()-2-3*RDPANEL_BUTTON_MARGIN));
p->drawText(RDPANEL_BUTTON_MARGIN,2*m.lineSpacing(),
GetNextLine(&text,m,size().width()-2-3*RDPANEL_BUTTON_MARGIN));
GetNextLine(&text,m,pix->width()-2-3*RDPANEL_BUTTON_MARGIN));
p->drawText(RDPANEL_BUTTON_MARGIN,3*m.lineSpacing(),
GetNextLine(&text,m,size().width()-2-3*RDPANEL_BUTTON_MARGIN));
GetNextLine(&text,m,pix->width()-2-3*RDPANEL_BUTTON_MARGIN));
//
// Time Field & Output Text
@ -512,31 +529,31 @@ void RDPanelButton::WriteKeycap(int msecs)
if(msecs<0) {
p->setFont(smallTimerFont());
if(button_pause_when_finished) {
p->drawText(RDPANEL_BUTTON_MARGIN,size().height()-2-RDPANEL_BUTTON_MARGIN,"Finished");
p->drawText(RDPANEL_BUTTON_MARGIN,pix->height()-2-RDPANEL_BUTTON_MARGIN,"Finished");
}
else {
if(button_active_length>=0) {
QString lenstr=RDGetTimeLength(button_active_length+1000,true,false);
p->drawText(size().width()-p->fontMetrics().width(lenstr)-
p->drawText(pix->width()-p->fontMetrics().width(lenstr)-
RDPANEL_BUTTON_MARGIN-2,
size().height()-2-RDPANEL_BUTTON_MARGIN,
pix->height()-2-RDPANEL_BUTTON_MARGIN,
lenstr);
}
else {
p->drawText(RDPANEL_BUTTON_MARGIN,size().height()-2-
p->drawText(RDPANEL_BUTTON_MARGIN,pix->height()-2-
RDPANEL_BUTTON_MARGIN,tr("No Audio"));
}
}
}
else {
QString lenstr=RDGetTimeLength(1000+msecs,true,false);
p->drawText(size().width()-p->fontMetrics().width(lenstr)-
p->drawText(pix->width()-p->fontMetrics().width(lenstr)-
RDPANEL_BUTTON_MARGIN-2,
size().height()-2-RDPANEL_BUTTON_MARGIN,
pix->height()-2-RDPANEL_BUTTON_MARGIN,
lenstr);
p->setFont(bigLabelFont());
p->drawText((size().width()-p->fontMetrics().width(button_output_text))/2,
74*size().height()/100,
p->drawText((pix->width()-p->fontMetrics().width(button_output_text))/2,
74*pix->height()/100,
button_output_text);
}
}

View File

@ -1,8 +1,8 @@
// rdpanel_button.h
//
// The SoundPanel Button for RDAirPlay.
// Component class for sound panel widgets.
//
// (C) Copyright 2002-2021 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2023 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
@ -25,14 +25,18 @@
#include <rdpushbutton.h>
#include <rdweb.h>
//
// Widget Settings
//
#define PANEL_BUTTON_SIZE_X 88
#define PANEL_BUTTON_SIZE_Y 80
#define RDPANEL_BUTTON_MARGIN 5
class RDPanelButton : public RDPushButton
{
Q_OBJECT
public:
RDPanelButton(int row,int col,RDStation *station,bool flash,
QWidget *parent=0);
RDPanelButton(int row,int col,RDStation *station,bool flash,QWidget *parent);
void clear();
int row() const;
int column() const;
@ -72,7 +76,9 @@ class RDPanelButton : public RDPushButton
void setAllowDrags(bool state);
void resetCounter();
bool isEmpty() const;
bool isActive() const;
QString json(int padding=0,bool final=false);
void setVisible(bool state);
signals:
void cartDropped(int row,int col,unsigned cartnum,const QColor &color,
@ -128,4 +134,6 @@ class RDPanelButton : public RDPushButton
int button_move_count;
bool button_allow_drags;
};
#endif // RDPANEL_BUTTON_H

View File

@ -36,6 +36,8 @@ RDSoundPanel::RDSoundPanel(int station_panels,int user_panels,bool flash,
RDCartDialog *cart_dialog,QWidget *parent)
: RDWidget(parent)
{
panel_started=false;
panel_current_panel=NULL;
panel_dump_panel_updates=false;
panel_playmode_box=NULL;
panel_button_columns=PANEL_MAX_BUTTON_COLUMNS;
@ -82,9 +84,6 @@ RDSoundPanel::RDSoundPanel(int station_panels,int user_panels,bool flash,
//
// Load Buttons
//
panel_mapper=new QSignalMapper(this);
connect(panel_mapper,SIGNAL(mapped(int)),this,SLOT(buttonMapperData(int)));
UpdatePanels(""); // Load Host (Station) Panels
//
@ -98,22 +97,6 @@ RDSoundPanel::RDSoundPanel(int station_panels,int user_panels,bool flash,
connect(panel_selector_box,SIGNAL(setupClicked()),
this,SLOT(panelSetupData()));
if(panel_station_panels>0) {
panel_number=0;
panel_type=RDAirPlayConf::StationPanel;
panel_panels.value("").at(0)->show();
}
else {
if(panel_user_panels>0) {
panel_number=0;
panel_type=RDAirPlayConf::UserPanel;
panel_panels.value(rda->user()->name()).at(0)->show();
}
else {
setDisabled(true);
}
}
//
// Play Mode Box
//
@ -178,7 +161,6 @@ RDSoundPanel::RDSoundPanel(int station_panels,int user_panels,bool flash,
//
// Load Panel Names
//
QString sql;
sql=QString("select ")+
"`PANEL_NO`,"+
@ -206,21 +188,18 @@ RDSoundPanel::RDSoundPanel(int station_panels,int user_panels,bool flash,
i+1,i+1));
}
panel_selector_box->setFocus();
panel_scan_timer=new QTimer(this);
connect(panel_scan_timer,SIGNAL(timeout()),this,SLOT(scanPanelData()));
panel_scan_timer->start(PANEL_SCAN_INTERVAL);
setDisabled((panel_station_panels==0)&&(panel_user_panels==0));
}
RDSoundPanel::~RDSoundPanel()
{
for(QMap<QString,QList<RDButtonPanel *> >::const_iterator it=panel_panels.begin();it!=panel_panels.end();it++) {
for(QMap<QString,QList<RDButtonPanel *> >::const_iterator it=panel_arrays.begin();it!=panel_arrays.end();it++) {
for(int i=0;i<it.value().size();i++) {
delete it.value().at(i);
}
}
panel_panels.clear();
panel_arrays.clear();
}
@ -355,7 +334,7 @@ void RDSoundPanel::setText(RDAirPlayConf::PanelType type,int panel,int row,
username=rda->user()->name();
}
RDPanelButton *button=
panel_panels.value(username).at(panel)->panelButton(row,col);
panel_arrays.value(username).at(panel)->panelButton(row,col);
button->setText(str);
SaveButton(type,panel,row,col);
}
@ -369,7 +348,7 @@ void RDSoundPanel::setColor(RDAirPlayConf::PanelType type,int panel,int row,
username=rda->user()->name();
}
RDPanelButton *button=
panel_panels.value(username).at(panel)->panelButton(row,col);
panel_arrays.value(username).at(panel)->panelButton(row,col);
button->setDefaultColor(color);
SaveButton(type,panel,row,col);
}
@ -389,16 +368,16 @@ void RDSoundPanel::duckVolume(RDAirPlayConf::PanelType type,int panel,int row,
for(int i=0;i<panel_button_columns;i++) {
for(int j=0;j<panel_button_rows;j++) {
RDPlayDeck *deck=
panel_panels.value(username).at(panel)->panelButton(j,i)->playDeck();
panel_arrays.value(username).at(panel)->panelButton(j,i)->playDeck();
if((row==j || row==-1) && (col==i || col==-1)) {
if(mport==-1) {
panel_panels.value(username).at(panel)->
panel_arrays.value(username).at(panel)->
panelButton(j,i)->setDuckVolume(level);
}
if(deck!=NULL) {
if(edit_mport==-1 ||
edit_mport==
panel_panels.value(username).at(panel)->
panel_arrays.value(username).at(panel)->
panelButton(j,i)->outputText().toInt()) {
deck->duckVolume(level,fade);
}
@ -444,7 +423,7 @@ void RDSoundPanel::setActionMode(RDAirPlayConf::ActionMode mode)
if(mode!=panel_action_mode) {
panel_action_mode=mode;
panel_setup_button->setEnabled(panel_action_mode==RDAirPlayConf::Normal);
for(QMap<QString,QList<RDButtonPanel *> >::const_iterator it=panel_panels.begin();it!=panel_panels.end();it++) {
for(QMap<QString,QList<RDButtonPanel *> >::const_iterator it=panel_arrays.begin();it!=panel_arrays.end();it++) {
for(int i=0;i<it.value().size();i++) {
if(i<panel_station_panels &&
(!panel_config_panels) &&
@ -493,7 +472,7 @@ RDAirPlayConf::PanelType RDSoundPanel::currentType() const
QString RDSoundPanel::json(const QString &owner,int padding,bool final) const
{
QString ret;
QList<RDButtonPanel *> panels=panel_panels.value(owner);
QList<RDButtonPanel *> panels=panel_arrays.value(owner);
ret+=RDJsonPadding(padding)+"\"array\": {\r\n";
ret+=RDJsonField("owner",owner,4+padding);
@ -520,9 +499,9 @@ QString RDSoundPanel::json(int padding) const
QString ret;
int count=0;
for(QMap<QString,QList<RDButtonPanel *> >::const_iterator it=panel_panels.
begin();it!=panel_panels.end();it++) {
ret+=json(it.key(),4,++count==panel_panels.size());
for(QMap<QString,QList<RDButtonPanel *> >::const_iterator it=panel_arrays.
begin();it!=panel_arrays.end();it++) {
ret+=json(it.key(),4,++count==panel_arrays.size());
}
return ret;
@ -540,8 +519,8 @@ void RDSoundPanel::setButton(RDAirPlayConf::PanelType type,int panel,
username=rda->user()->name();
}
RDPanelButton *button=
panel_panels.value(username).at(panel)->panelButton(row,col);
if(button->playDeck()!=NULL) {
panel_arrays.value(username).at(panel)->panelButton(row,col);
if(button->isActive()) {
return;
}
button->clear();
@ -643,14 +622,17 @@ void RDSoundPanel::changeUser()
q->next();
}
else {
panel_selector_box->insertItem(QString::asprintf("[U:%d] Panel U:%d",
i+1,i+1));
panel_selector_box->
insertItem(QString::asprintf("[U:%d] Panel U:%d",i+1,i+1));
}
}
delete q;
panel_selector_box->setCurrentIndex(current_item);
UpdateButtonViewport();
if(!panel_started) {
panelActivatedData(panel_selector_box->currentIndex());
panel_started=true;
}
}
@ -691,11 +673,11 @@ void RDSoundPanel::panelDown()
void RDSoundPanel::panelActivatedData(int n)
{
printf("panelActivatedData(%d)\n",n);
QString username;
if(panel_type==RDAirPlayConf::UserPanel) {
username=rda->user()->name();
}
panel_panels.value(username).at(panel_number)->hide();
if(n<panel_station_panels) {
panel_type=RDAirPlayConf::StationPanel;
panel_number=n;
@ -706,9 +688,8 @@ void RDSoundPanel::panelActivatedData(int n)
panel_number=n-panel_station_panels;
username=rda->user()->name();
}
panel_panels.value(username).at(panel_number)->show();
UpdateButtonViewport();
ShowPanel(panel_type,panel_number);
}
@ -761,7 +742,7 @@ void RDSoundPanel::setupClickedData()
}
if(rda->station()->enableDragdrop()&&(rda->station()->enforcePanelSetup())) {
for(QMap<QString,QList<RDButtonPanel *> >::const_iterator it=
panel_panels.begin();it!=panel_panels.end();it++) {
panel_arrays.begin();it!=panel_arrays.end();it++) {
for(int i=0;i<it.value().size();i++) {
it.value().at(i)->setAcceptDrops(panel_setup_mode);
}
@ -771,11 +752,15 @@ void RDSoundPanel::setupClickedData()
}
void RDSoundPanel::buttonMapperData(int grid_pos)
void RDSoundPanel::buttonClickedData(int pnum,int col,int row)
{
RDPanelButton *button=GetCurrentPanel()->
panelButton(grid_pos/PANEL_MAX_BUTTON_COLUMNS,
grid_pos%PANEL_MAX_BUTTON_COLUMNS);
// printf("buttonMapperData(pnum: %d,col: %d row: %d)\n",pnum,col,row);
if(panel_current_panel==NULL) {
printf("NO CURRENT PANEL!\n");
return;
}
RDPanelButton *button=panel_current_panel->panelButton(row,col);
unsigned cartnum;
switch(panel_action_mode) {
@ -788,7 +773,7 @@ void RDSoundPanel::buttonMapperData(int grid_pos)
case RDAirPlayConf::CopyTo:
if(button->playDeck()==NULL
&& ((panel_type==RDAirPlayConf::UserPanel) ||
panel_config_panels)) {
panel_config_panels)) {
emit selectClicked(0,button->row(),button->column());
}
break;
@ -951,21 +936,16 @@ void RDSoundPanel::onairFlagChangedData(bool state)
}
void RDSoundPanel::scanPanelData()
{
if(panel_action_mode==RDAirPlayConf::Normal) {
ShowPanel(panel_type,panel_number);
}
}
void RDSoundPanel::resizeEvent(QResizeEvent *e)
{
// int w=size().width();
int h=size().height();
UpdateButtonViewport();
for(QMap<QString,QList<RDButtonPanel *> >::const_iterator it=panel_arrays.begin();it!=panel_arrays.end();it++) {
for(int i=0;i<it.value().size();i++) {
it.value().at(i)->setGeometry(0,0,size().width()-5,size().height()-60);
}
}
panel_selector_box->setGeometry(0,h-50,2*PANEL_BUTTON_SIZE_X+10,50);
panel_playmode_box->setGeometry(2*PANEL_BUTTON_SIZE_X+15,h-50,
PANEL_BUTTON_SIZE_X+10,50);
@ -992,23 +972,6 @@ void RDSoundPanel::wheelEvent(QWheelEvent *e)
}
void RDSoundPanel::UpdateButtonViewport()
{
QString username;
if(panel_type==RDAirPlayConf::UserPanel) {
username=rda->user()->name();
}
QRect viewport(0,0,size().width()-5,size().height()-60);
RDButtonPanel *panel=panel_panels.value(username).at(panel_number);
for(int i=0;i<panel_button_rows;i++) {
for(int j=0;j<panel_button_columns;j++) {
RDPanelButton *button=panel->panelButton(i,j);
button->setVisible(viewport.contains(button->geometry()));
}
}
}
void RDSoundPanel::PlayButton(RDAirPlayConf::PanelType type,int panel,
int row,int col,RDLogLine::StartSource src,bool hookmode,
int mport,bool pause_when_finished)
@ -1022,8 +985,8 @@ void RDSoundPanel::PlayButton(RDAirPlayConf::PanelType type,int panel,
for(int i=0;i<panel_button_columns;i++) {
for(int j=0;j<panel_button_rows;j++) {
if(panel_panels.value(username).at(panel)->panelButton(j,i)->cart()>0 &&
panel_panels.value(username).at(panel)->
if(panel_arrays.value(username).at(panel)->panelButton(j,i)->cart()>0 &&
panel_arrays.value(username).at(panel)->
panelButton(j,i)->state()==false) {
if(edit_col==-1 || col==i) {
edit_col=i;
@ -1039,7 +1002,7 @@ void RDSoundPanel::PlayButton(RDAirPlayConf::PanelType type,int panel,
}
RDPanelButton *button=
panel_panels.value(username).at(panel)->panelButton(edit_row,edit_col);
panel_arrays.value(username).at(panel)->panelButton(edit_row,edit_col);
RDPlayDeck *deck=button->playDeck();
if(deck!=NULL) {
deck->play(deck->currentPosition());
@ -1210,14 +1173,14 @@ void RDSoundPanel::PauseButton(RDAirPlayConf::PanelType type,int panel,
for(int i=0;i<panel_button_columns;i++) {
for(int j=0;j<panel_button_rows;j++) {
RDPlayDeck *deck=
panel_panels.value(username).at(panel)->panelButton(j,i)->playDeck();
panel_arrays.value(username).at(panel)->panelButton(j,i)->playDeck();
if(deck!=NULL && (row==j || row==-1) && (col==i || col==-1)) {
if(mport==-1 ||
mport==panel_panels.value(username).at(panel)->
mport==panel_arrays.value(username).at(panel)->
panelButton(j,i)->outputText().toInt()) {
deck->pause();
panel_panels.value(username).at(panel)->
panel_arrays.value(username).at(panel)->
panelButton(j,i)->setStartTime(QTime());
}
}
@ -1240,19 +1203,19 @@ void RDSoundPanel::StopButton(RDAirPlayConf::PanelType type,int panel,
}
for(int i=0;i<panel_button_columns;i++) {
for(int j=0;j<panel_button_rows;j++) {
RDPlayDeck *deck=panel_panels.value(username).at(panel)->
RDPlayDeck *deck=panel_arrays.value(username).at(panel)->
panelButton(j,i)->playDeck();
if((row==j || row==-1) && (col==i || col==-1)) {
if(deck!=NULL) {
if(edit_mport==-1 ||
edit_mport==panel_panels.value(username).
edit_mport==panel_arrays.value(username).
at(panel)->panelButton(j,i)->outputText().toInt()) {
if(panel_pause_enabled) {
panel_panels.value(username).at(panel)->
panel_arrays.value(username).at(panel)->
panelButton(j,i)->setPauseWhenFinished(pause_when_finished);
}
else {
panel_panels.value(username).at(panel)->
panel_arrays.value(username).at(panel)->
panelButton(j,i)->setPauseWhenFinished(false);
}
switch(deck->state()) {
@ -1272,11 +1235,11 @@ void RDSoundPanel::StopButton(RDAirPlayConf::PanelType type,int panel,
}
else {
if(!pause_when_finished && panel_pause_enabled) {
panel_panels.value(username).at(panel)->
panel_arrays.value(username).at(panel)->
panelButton(j,i)->setState(false);
panel_panels.value(username).at(panel)->
panel_arrays.value(username).at(panel)->
panelButton(j,i)->setPauseWhenFinished(false);
panel_panels.value(username).at(panel)->panelButton(j,i)->reset();
panel_arrays.value(username).at(panel)->panelButton(j,i)->reset();
}
}
}
@ -1314,182 +1277,43 @@ void RDSoundPanel::StopButton(RDPlayDeck *deck)
}
}
/*
void RDSoundPanel::LoadPanels()
{
for(unsigned i=0;i<panel_panels.size();i++) {
delete panel_panels[i];
}
panel_panels.clear();
//
// Load Buttons
//
for(int i=0;i<panel_station_panels;i++) {
panel_panels.push_back(new RDButtonPanel(panel_type,i,panel_button_columns,
panel_button_rows,
rda->station(),panel_flash,this));
for(int j=0;j<panel_button_rows;j++) {
for(int k=0;k<panel_button_columns;k++) {
connect(panel_panels.back()->panelButton(j,k),SIGNAL(clicked()),
panel_mapper,SLOT(map()));
panel_mapper->setMapping(panel_panels.back()->panelButton(j,k),
j*panel_button_columns+k);
}
}
LoadPanel(RDAirPlayConf::StationPanel,i);
panel_panels.back()->setAllowDrags(rda->station()->enableDragdrop());
}
for(int i=0;i<panel_user_panels;i++) {
panel_panels.push_back(new RDButtonPanel(panel_type,i,panel_button_columns,
panel_button_rows,
rda->station(),panel_flash,this));
for(int j=0;j<panel_button_rows;j++) {
for(int k=0;k<panel_button_columns;k++) {
connect(panel_panels.back()->panelButton(j,k),SIGNAL(clicked()),
panel_mapper,SLOT(map()));
panel_mapper->setMapping(panel_panels.back()->panelButton(j,k),
j*panel_button_columns+k);
}
}
panel_panels.back()->setAllowDrags(rda->station()->enableDragdrop());
LoadPanel(RDAirPlayConf::UserPanel,i);
}
}
void RDSoundPanel::LoadPanel(RDAirPlayConf::PanelType type,int panel)
{
QString owner;
int offset=0;
switch(type) {
case RDAirPlayConf::UserPanel:
owner=rda->user()->name();
offset=panel_station_panels+panel;
break;
case RDAirPlayConf::StationPanel:
owner=rda->station()->name();
offset=panel;
break;
}
QString sql=QString("select ")+
panel_tablename+".`ROW_NO`,"+ // 00
panel_tablename+".`COLUMN_NO`,"+ // 01
panel_tablename+".`LABEL`,"+ // 02
panel_tablename+".`CART`,"+ // 03
panel_tablename+".`DEFAULT_COLOR`,"+ // 04
"`CART`.`FORCED_LENGTH`,"+ // 05
"`CART`.`AVERAGE_HOOK_LENGTH`,"+ // 06
"`CART`.`TYPE` "+ // 07
"from "+panel_tablename+" "+ // 08
"left join `CART` on "+panel_tablename+".`CART`=`CART`.`NUMBER` "+
"where "+panel_tablename+QString::asprintf(".`TYPE`=%d && ",type)+
panel_tablename+".`OWNER`='"+RDEscapeString(owner)+"' && "+
panel_tablename+QString::asprintf(".`PANEL_NO`=%d ",panel)+
"order by "+panel_tablename+".`COLUMN_NO`,"+panel_tablename+".`ROW_NO`";
RDSqlQuery *q=new RDSqlQuery(sql);
while(q->next()) {
if(panel_panels[offset]->panelButton(q->value(0).toInt(),
q->value(1).toInt())->playDeck()==NULL) {
panel_panels[offset]->
panelButton(q->value(0).toInt(),q->value(1).toInt())->
setText(q->value(2).toString());
panel_panels[offset]->
panelButton(q->value(0).toInt(),q->value(1).toInt())->
setCart(q->value(3).toInt());
panel_panels[offset]->
panelButton(q->value(0).toInt(),q->value(1).toInt())->
setLength(false,q->value(5).toInt());
panel_panels[offset]->
panelButton(q->value(0).toInt(),q->value(1).toInt())->
setLength(true,q->value(6).toInt());
if((panel_playmode_box!=NULL)&&(panel_playmode_box->currentIndex()==1)&&
(q->value(6).toUInt()>0)) {
panel_panels[offset]->
panelButton(q->value(0).toInt(),q->value(1).toInt())->
setActiveLength(q->value(6).toInt());
}
else {
if(q->value(7).toInt()==RDCart::Macro) {
panel_panels[offset]->
panelButton(q->value(0).toInt(),q->value(1).toInt())->
setActiveLength(q->value(5).toInt());
}
else {
if(q->value(5).toInt()>0) {
panel_panels[offset]->
panelButton(q->value(0).toInt(),q->value(1).toInt())->
setActiveLength(q->value(5).toInt());
}
else {
panel_panels[offset]->
panelButton(q->value(0).toInt(),q->value(1).toInt())->
setActiveLength(-1);
}
}
}
if(q->value(4).toString().isEmpty()) {
panel_panels[offset]->
panelButton(q->value(0).toInt(),q->value(1).toInt())->
setColor(palette().color(QPalette::Background));
panel_panels[offset]->
panelButton(q->value(0).toInt(),q->value(1).toInt())->
setDefaultColor(palette().color(QPalette::Background));
}
else {
panel_panels[offset]->
panelButton(q->value(0).toInt(),q->value(1).toInt())->
setColor(QColor(q->value(4).toString()));
panel_panels[offset]->
panelButton(q->value(0).toInt(),q->value(1).toInt())->
setDefaultColor(QColor(q->value(4).toString()));
}
}
}
delete q;
UpdateButtonViewport();
}
*/
void RDSoundPanel::UpdatePanels(const QString &username)
{
QString owner=username;
RDAirPlayConf::PanelType type=RDAirPlayConf::UserPanel;
int size=panel_user_panels;
int max_panels=panel_user_panels;
if(username.isEmpty()) {
owner=rda->station()->name();
type=RDAirPlayConf::StationPanel;
size=panel_station_panels;
max_panels=panel_station_panels;
}
//
// Create the panel
// Load the array if it isn't already loaded
//
if(size>0) {
if(max_panels>0) {
QList<RDButtonPanel *> list;
if(panel_panels.value(username).size()>0) {
list=panel_panels.value(username);
if(panel_arrays.value(username).size()>0) {
list=panel_arrays.value(username);
}
for(int i=panel_panels.value(username).size();i<size;i++) {
for(int i=panel_arrays.value(username).size();i<max_panels;i++) {
RDButtonPanel *panel=new RDButtonPanel(type,i,this);
for(int j=0;j<PANEL_MAX_BUTTON_COLUMNS;j++) {
for(int k=0;k<PANEL_MAX_BUTTON_ROWS;k++) {
RDPanelButton *button=panel->panelButton(k,j);
connect(button,SIGNAL(clicked()),panel_mapper,SLOT(map()));
panel_mapper->setMapping(button,k*PANEL_MAX_BUTTON_COLUMNS+j);
}
}
printf("new panel type: %d number: %d ptr: %p\n",
type,i,panel);
connect(panel,SIGNAL(buttonClicked(int,int,int)),
this,SLOT(buttonClickedData(int,int,int)));
panel->hide();
list.push_back(panel);
}
panel_panels[username]=list;
panel_arrays[username]=list;
}
//
// Update button attributes
//
QString sql=QString("select ")+
panel_tablename+".`PANEL_NO`,"+ // 00
panel_tablename+".`ROW_NO`,"+ // 01
@ -1503,16 +1327,17 @@ void RDSoundPanel::UpdatePanels(const QString &username)
"from "+panel_tablename+" "+ // 09
"left join `CART` on "+panel_tablename+".`CART`=`CART`.`NUMBER` "+
"where "+panel_tablename+QString::asprintf(".`TYPE`=%d && ",type)+
panel_tablename+".`OWNER`='"+RDEscapeString(owner)+"' "+
panel_tablename+".`OWNER`='"+RDEscapeString(owner)+"' && "+
panel_tablename+QString::asprintf(".`PANEL_NO`<%d ",max_panels)+
"order by "+
panel_tablename+".`PANEL_NO`,"+
panel_tablename+".`COLUMN_NO`,"+
panel_tablename+".`ROW_NO`";
RDSqlQuery *q=new RDSqlQuery(sql);
while(q->next()) {
RDPanelButton *button=panel_panels.value(username).at(q->value(0).toInt())->
RDPanelButton *button=panel_arrays.value(username).at(q->value(0).toInt())->
panelButton(q->value(1).toInt(),q->value(2).toInt());
if(button->playDeck()==NULL) {
if(!button->isActive()) {
button->setText(q->value(3).toString());
button->setCart(q->value(4).toInt());
button->setLength(false,q->value(6).toInt());
@ -1554,25 +1379,14 @@ void RDSoundPanel::ShowPanel(RDAirPlayConf::PanelType type,int offset)
if(type==RDAirPlayConf::UserPanel) {
username=rda->user()->name();
}
for(QMap<QString,QList<RDButtonPanel *> >::const_iterator it=
panel_panels.begin();it!=panel_panels.end();it++) {
if(it.key()==username) {
for(int i=0;i<it.value().size();i++) {
if(offset==i) {
it.value().at(i)->show();
}
else {
it.value().at(i)->hide();
}
}
}
else {
for(int i=0;i<it.value().size();i++) {
it.value().at(i)->hide();
}
printf("username: %s\n",username.toUtf8().constData());
if(panel_arrays.value(username).size()>offset) {
if(panel_current_panel!=NULL) {
panel_current_panel->hide();
}
panel_arrays.value(username).at(offset)->show();
panel_current_panel=panel_arrays.value(username).at(offset);
}
UpdateButtonViewport();
}
@ -1599,7 +1413,7 @@ void RDSoundPanel::SaveButton(RDAirPlayConf::PanelType type,
}
RDPanelButton *button=
panel_panels.value(username).at(panel)->panelButton(row,col);
panel_arrays.value(username).at(panel)->panelButton(row,col);
//
// Determine if the button exists
@ -1937,17 +1751,6 @@ QString RDSoundPanel::PanelOwner(RDAirPlayConf::PanelType type)
}
RDButtonPanel *RDSoundPanel::GetCurrentPanel() const
{
QString username;
if(panel_type==RDAirPlayConf::UserPanel) {
username=rda->user()->name();
}
return panel_panels.value(username).at(panel_number);
}
RDPanelButton *RDSoundPanel::GetVisibleButton(int row,int col) const
{
return NULL;

View File

@ -112,23 +112,20 @@ class RDSoundPanel : public RDWidget
void resetClickedData();
void allClickedData();
void setupClickedData();
void buttonMapperData(int grid_pos);
// void buttonMapperData(QWidget *w);
void buttonClickedData(int pnum,int col,int row);
void stateChangedData(int id,RDPlayDeck::State state);
void hookEndData(int id);
void timescalingSupportedData(int card,bool state);
void panelSetupData();
void onairFlagChangedData(bool state);
void scanPanelData();
protected:
void resizeEvent(QResizeEvent *e);
void wheelEvent(QWheelEvent *e);
private:
void UpdateButtonViewport();
void PlayButton(RDAirPlayConf::PanelType type,int panel,int row,int col,
RDLogLine::StartSource src,bool hookmode,int mport=-1,
RDLogLine::StartSource src,bool hookmode,int mport=-1,
bool pause_when_finished=false);
bool PlayAudio(RDPanelButton *button,RDCart *cart,bool hookmode,int mport=-1);
void PlayMacro(RDPanelButton *button,RDCart *cart);
@ -138,12 +135,9 @@ class RDSoundPanel : public RDWidget
int mport=-1,bool pause_when_finished=false,int fade_out=0);
void StopButton(int id);
void StopButton(RDPlayDeck *deck);
// void LoadPanels();
// void LoadPanel(RDAirPlayConf::PanelType type,int panel);
void UpdatePanels(const QString &username);
void ShowPanel(RDAirPlayConf::PanelType type,int offset);
void SaveButton(RDAirPlayConf::PanelType type,int panel,int row,int col);
// int PanelOffset(RDAirPlayConf::PanelType type,int panel);
int GetFreeButtonDeck();
int GetFreeOutput();
void LogPlayEvent(unsigned cartnum,int cutnum);
@ -157,9 +151,9 @@ class RDSoundPanel : public RDWidget
void ClearReset();
QString PanelTag(int index);
QString PanelOwner(RDAirPlayConf::PanelType type);
RDButtonPanel *GetCurrentPanel() const;
RDPanelButton *GetVisibleButton(int row,int col) const;
QMap<QString,QList<RDButtonPanel *> > panel_panels;
QMap<QString,QList<RDButtonPanel *> > panel_arrays;
RDButtonPanel *panel_current_panel;
RDComboBox *panel_selector_box;
QComboBox *panel_playmode_box;
RDPushButton *panel_setup_button;
@ -167,7 +161,6 @@ class RDSoundPanel : public RDWidget
RDPushButton *panel_all_button;
RDAirPlayConf::PanelType panel_type;
RDButtonDialog *panel_button_dialog;
QSignalMapper *panel_mapper;
QString panel_tablename;
QString panel_name_tablename;
int panel_number;
@ -199,9 +192,9 @@ class RDSoundPanel : public RDWidget
int panel_button_rows;
RDCartDialog *panel_cart_dialog;
bool panel_onair_flag;
QTimer *panel_scan_timer;
QString panel_caption;
bool panel_dump_panel_updates;
bool panel_started;
};
#endif // RDSOUND_PANEL_H