Fred Gleason 6f0fb28c27 2019-10-04 Fred Gleason <fredg@paravelsystems.com>
* Refactored rdlogmanager(1) to use the 'RDDialog' and 'RDWidget'
	base classes.
2019-10-04 19:49:15 -04:00

323 lines
8.7 KiB
C++

// edit_grid.cpp
//
// Edit Rivendell Log Grid
//
// (C) Copyright 2002-2019 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 <qmessagebox.h>
#include <qpainter.h>
#include <qsignalmapper.h>
#include <rdescape_string.h>
#include "edit_clock.h"
#include "edit_grid.h"
#include "list_clocks.h"
EditGrid::EditGrid(QString servicename,QWidget *parent)
: RDDialog(parent)
{
QString sql;
edit_servicename=servicename;
setWindowTitle("RDLogManager - "+tr("Edit Grid")+": "+servicename);
//
// Fix the Window Size
//
setMinimumSize(sizeHint());
setMaximumSize(sizeHint());
//
// Hour Buttons
//
// QLabel *label;
QSignalMapper *mapper=new QSignalMapper(this);
connect(mapper,SIGNAL(mapped(int)),this,SLOT(hourButtonData(int)));
for(int i=0;i<5;i++) {
edit_day_boxes[i]=new QGroupBox(QDate::longDayName(i+1),this);
edit_day_boxes[i]->setFont(labelFont());
edit_day_boxes[i]->setGeometry(5,11+75*i,sizeHint().width()-5,65);
for(int j=0;j<24;j++) {
edit_hour_button[i][j]=new RDPushButton(this);
edit_hour_button[i][j]->setGeometry(10+42*j,30+75*i,42,40);
edit_hour_button[i][j]->setFont(subButtonFont());
edit_hour_button[i][j]->setId(24*i+j);
LabelButton(i+1,j,"---");
mapper->setMapping(edit_hour_button[i][j],24*i+j);
connect(edit_hour_button[i][j],SIGNAL(clicked()),mapper,SLOT(map()));
connect(edit_hour_button[i][j],SIGNAL(rightClicked(int,const QPoint &)),
this,SLOT(rightHourButtonData(int,const QPoint &)));
}
}
for(int i=5;i<7;i++) {
edit_day_boxes[i]=new QGroupBox(QDate::longDayName(i+1),this);
edit_day_boxes[i]->setFont(labelFont());
edit_day_boxes[i]->setGeometry(5,41+75*i,sizeHint().width()-5,65);
for(int j=0;j<24;j++) {
edit_hour_button[i][j]=new RDPushButton(this);
edit_hour_button[i][j]->setGeometry(10+42*j,60+75*i,42,40);
edit_hour_button[i][j]->setFont(subButtonFont());
edit_hour_button[i][j]->setId(24*i+j);
LabelButton(i+1,j,"---");
mapper->setMapping(edit_hour_button[i][j],24*i+j);
connect(edit_hour_button[i][j],SIGNAL(clicked()),mapper,SLOT(map()));
connect(edit_hour_button[i][j],SIGNAL(rightClicked(int,const QPoint &)),
this,SLOT(rightHourButtonData(int,const QPoint &)));
}
}
//
// Right Button Menu
//
edit_right_menu=new Q3PopupMenu(this);
connect(edit_right_menu,SIGNAL(aboutToShow()),this,SLOT(aboutToShowData()));
edit_right_menu->
insertItem(tr("Edit Clock"),this,SLOT(editClockData()),0,0);
edit_right_menu->
insertItem(tr("Clear Hour"),this,SLOT(clearHourData()),0,1);
//
// Change All Button
//
QPushButton *all_button=new QPushButton(this);
all_button->setGeometry(10,sizeHint().height()-60,80,50);
all_button->setDefault(false);
all_button->setFont(buttonFont());
all_button->setText(tr("Change\n&All"));
connect(all_button,SIGNAL(clicked()),this,SLOT(allHourButtonData()));
//
// Close Button
//
QPushButton *button=new QPushButton(this);
button->setGeometry(sizeHint().width()-90,sizeHint().height()-60,80,50);
button->setDefault(true);
button->setFont(buttonFont());
button->setText(tr("&Close"));
connect(button,SIGNAL(clicked()),this,SLOT(closeData()));
//
// Load Buttons
//
LoadButtons();
}
QSize EditGrid::sizeHint() const
{
return QSize(1024,638);
}
QSizePolicy EditGrid::sizePolicy() const
{
return QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
}
void EditGrid::hourButtonData(int id)
{
int dayofweek=id/24+1;
int hour=id-24*(dayofweek-1);
QString clockname=GetClock(dayofweek,hour);
if(clockname.isEmpty()) {
clockname=current_clockname;
}
ListClocks *listclocks=new ListClocks(&clockname,this);
if(listclocks->exec()<0) {
delete listclocks;
return;
}
delete listclocks;
current_clockname=clockname;
QString sql=QString("update SERVICE_CLOCKS set ");
if(clockname.isEmpty()) {
sql+="CLOCK_NAME=null ";
}
else {
sql+="CLOCK_NAME=\""+RDEscapeString(clockname)+"\" ";
}
sql+=QString("where ")+
"(SERVICE_NAME=\""+RDEscapeString(edit_servicename)+"\")&&"+
QString().sprintf("(HOUR=%d)",id);
RDSqlQuery *q=new RDSqlQuery(sql);
delete q;
LabelButton(dayofweek,hour,clockname);
}
void EditGrid::allHourButtonData()
{
QString clockname="";
ListClocks *listclocks=new ListClocks(&clockname,this);
if(listclocks->exec()<0) {
delete listclocks;
return;
}
delete listclocks;
if(QMessageBox::question(this,"RDLogManager - "+tr("Clear Clocks"),
tr("Are you sure you want to update ALL clocks in the grid?")+"\n"+tr("This operation cannot be undone!"),QMessageBox::Yes,QMessageBox::No)==QMessageBox::Yes) {
for(int id=0;id<168;id++) {
QString sql=QString("update SERVICE_CLOCKS set ")+
"CLOCK_NAME=\""+RDEscapeString(clockname)+"\" where "+
"SERVICE_NAME=\""+RDEscapeString(edit_servicename)+"\"";
RDSqlQuery *q=new RDSqlQuery(sql);
delete q;
int dayofweek=id/24+1;
int hour=id-24*(dayofweek-1);
LabelButton(dayofweek,hour,clockname);
}
}
}
void EditGrid::rightHourButtonData(int id,const QPoint &pt)
{
edit_rightclick_id=id;
int dayofweek=edit_rightclick_id/24+1;
int hour=edit_rightclick_id-24*(dayofweek-1);
edit_right_menu->
setGeometry(edit_hour_button[dayofweek-1][hour]->geometry().x()+
geometry().x()+pt.x()+2,
edit_hour_button[dayofweek-1][hour]->geometry().y()+
geometry().y()+pt.y(),
edit_right_menu->sizeHint().width(),
edit_right_menu->sizeHint().height());
edit_right_menu->exec();
}
void EditGrid::aboutToShowData()
{
int dayofweek=edit_rightclick_id/24+1;
int hour=edit_rightclick_id-24*(dayofweek-1);
edit_right_menu->setItemEnabled(0,!GetClock(dayofweek,hour).isEmpty());
edit_right_menu->setItemEnabled(1,!GetClock(dayofweek,hour).isEmpty());
}
void EditGrid::editClockData()
{
std::vector<QString> new_clocks;
int dayofweek=edit_rightclick_id/24+1;
int hour=edit_rightclick_id-24*(dayofweek-1);
QString clockname=GetClock(dayofweek,hour);
if(clockname.isEmpty()) {
return;
}
EditClock *dialog=new EditClock(clockname,false,&new_clocks,this);
if(dialog->exec()<0) {
delete dialog;
return;
}
delete dialog;
LoadButtons();
}
void EditGrid::clearHourData()
{
int dayofweek=edit_rightclick_id/24+1;
int hour=edit_rightclick_id-24*(dayofweek-1);
QString sql=QString("update SERVICE_CLOCKS set CLOCK_NAME=null where ")+
"(SERVICE_NAME=\""+RDEscapeString(edit_servicename)+"\")&&"+
QString().sprintf("(HOUR=%d)",(dayofweek-1)*24+hour);
RDSqlQuery *q=new RDSqlQuery(sql);
delete q;
LabelButton(dayofweek,hour,"");
}
void EditGrid::closeData()
{
done(-1);
}
void EditGrid::paintEvent(QPaintEvent *e)
{
/*
QPainter *p=new QPainter(this);
p->setPen(Qt::black);
for(int i=0;i<5;i++) {
p->drawRect(5,21+75*i,sizeHint().width()-10,55);
}
for(int i=5;i<7;i++) {
p->drawRect(5,51+75*i,sizeHint().width()-10,55);
}
p->end();
*/
}
void EditGrid::closeEvent(QCloseEvent *e)
{
closeData();
}
void EditGrid::LoadButtons()
{
for(int i=0;i<7;i++) {
for(int j=0;j<24;j++) {
LabelButton(i+1,j,GetClock(i+1,j));
}
}
}
void EditGrid::LabelButton(int dayofweek,int hour,QString clockname)
{
QString code=QString("---");
QColor color=backgroundColor();
QString sql=QString("select ")+
"SHORT_NAME,"+ // 00
"COLOR "+ // 01
"from CLOCKS where "+
"NAME=\""+RDEscapeString(clockname)+"\"";
RDSqlQuery *q=new RDSqlQuery(sql);
if(q->first()) {
code=q->value(0).toString();
if(!q->value(1).isNull()) {
color=QColor(q->value(1).toString());
}
}
edit_hour_button[dayofweek-1][hour]->
setText(QString().sprintf("%02d-%02d\n",hour,hour+1)+code);
edit_hour_button[dayofweek-1][hour]->
setPalette(QPalette(color,backgroundColor()));
}
QString EditGrid::GetClock(int dayofweek,int hour)
{
QString sql=QString("select CLOCK_NAME from SERVICE_CLOCKS where ")+
"(SERVICE_NAME=\""+RDEscapeString(edit_servicename)+"\")&&"+
QString().sprintf("(HOUR=%d)",24*(dayofweek-1)+hour);
RDSqlQuery *q=new RDSqlQuery(sql);
if(q->first()) {
return q->value(0).toString();
}
return QString();
}