mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-04-09 22:43:11 +02:00
348 lines
9.2 KiB
C++
348 lines
9.2 KiB
C++
// edit_grid.cpp
|
|
//
|
|
// Edit Rivendell Log Grid
|
|
//
|
|
// (C) Copyright 2002-2018 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 <vector>
|
|
|
|
#include <math.h>
|
|
|
|
#include <qdialog.h>
|
|
#include <qstring.h>
|
|
#include <q3textedit.h>
|
|
#include <qpainter.h>
|
|
#include <qmessagebox.h>
|
|
#include <qcolordialog.h>
|
|
#include <qsignalmapper.h>
|
|
|
|
#include <rd.h>
|
|
#include <rddb.h>
|
|
#include <rdescape_string.h>
|
|
#include <rdevent.h>
|
|
|
|
#include "edit_grid.h"
|
|
#include "list_clocks.h"
|
|
#include "edit_clock.h"
|
|
|
|
EditGrid::EditGrid(QString servicename,QWidget *parent)
|
|
: QDialog(parent)
|
|
{
|
|
setModal(true);
|
|
|
|
QString sql;
|
|
|
|
setWindowTitle("RDLogManager - "+tr("Edit Grid")+": "+servicename);
|
|
edit_servicename=servicename;
|
|
|
|
//
|
|
// Fix the Window Size
|
|
//
|
|
setMinimumWidth(sizeHint().width());
|
|
setMaximumWidth(sizeHint().width());
|
|
setMinimumHeight(sizeHint().height());
|
|
setMaximumHeight(sizeHint().height());
|
|
|
|
//
|
|
// Create Fonts
|
|
//
|
|
QFont bold_font=QFont("Helvetica",12,QFont::Bold);
|
|
bold_font.setPixelSize(12);
|
|
QFont font=QFont("Helvetica",12,QFont::Normal);
|
|
font.setPixelSize(12);
|
|
QFont button_font("Helvetica",10,QFont::Normal);
|
|
button_font.setPixelSize(10);
|
|
|
|
//
|
|
// 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++) {
|
|
label=new QLabel(QDate::longDayName(i+1),this);
|
|
label->setGeometry(20,14+75*i,90,16);
|
|
label->setFont(bold_font);
|
|
label->setAlignment(Qt::AlignCenter);
|
|
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(button_font);
|
|
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++) {
|
|
label=new QLabel(QDate::longDayName(i+1),this);
|
|
label->setGeometry(20,44+75*i,90,16);
|
|
label->setFont(bold_font);
|
|
label->setAlignment(Qt::AlignCenter);
|
|
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(button_font);
|
|
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(bold_font);
|
|
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(bold_font);
|
|
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();
|
|
}
|
|
|