Rivendellaudio/lib/rdlogfilter.cpp
Fred Gleason 75bec4d3c4 2018-10-19 Fred Gleason <fredg@paravelsystems.com>
* Removed 'build_win32.bat'.
	* Removed all conditional compilation based on 'WIN32'.
2018-10-19 17:03:58 -04:00

215 lines
5.8 KiB
C++

// rdlogfilter.cpp
//
// Filter widget for picking Rivendell logs.
//
// (C) Copyright 2017-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 "rdapplication.h"
#include "rddb.h"
#include "rd.h"
#include "rdescape_string.h"
#include "rdlogfilter.h"
#include <QResizeEvent>
#include "qlabel.h"
RDLogFilter::RDLogFilter(RDLogFilter::FilterMode mode,QWidget *parent)
: QWidget(parent)
{
QString sql;
RDSqlQuery *q;
filter_filter_mode=mode;
QFont label_font(font().family(),font().pointSize(),QFont::Bold);
QFont check_font(font().family(),font().pointSize()-2,QFont::DemiBold);
//
// Service
//
filter_service_label=new QLabel(tr("Service")+":",this);
filter_service_label->setFont(label_font);
filter_service_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
filter_service_box=new QComboBox(this);
filter_service_label->setBuddy(filter_service_box);
switch(mode) {
case RDLogFilter::NoFilter:
filter_service_box->insertItem(tr("ALL"));
sql=QString("select NAME from SERVICES order by NAME");
q=new RDSqlQuery(sql);
while(q->next()) {
filter_service_box->insertItem(q->value(0).toString());
}
delete q;
break;
case RDLogFilter::UserFilter:
changeUser();
break;
case RDLogFilter::StationFilter:
filter_service_box->insertItem(tr("ALL"));
sql=QString("select SERVICE_NAME from SERVICE_PERMS where ")+
"STATION_NAME=\""+RDEscapeString(rda->config()->stationName())+"\"";
q=new RDSqlQuery(sql);
while(q->next()) {
filter_service_box->insertItem(q->value(0).toString());
}
delete q;
break;
}
connect(filter_service_box,SIGNAL(activated(int)),
this,SLOT(serviceChangedData(int)));
//
// Filter
//
filter_filter_label=new QLabel(tr("Filter")+":",this);
filter_filter_label->setFont(label_font);
filter_filter_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
filter_filter_edit=new QLineEdit(this);
filter_clear_button=new QPushButton(tr("Clear"),this);
filter_filter_label->setBuddy(filter_filter_edit);
connect(filter_filter_edit,SIGNAL(textChanged(const QString &)),
this,SLOT(filterChangedData(const QString &)));
connect(filter_clear_button,SIGNAL(clicked()),this,SLOT(filterClearedData()));
//
// Show Recent
//
filter_recent_check=new QCheckBox(this);
filter_recent_label=new QLabel(tr("Show Only Recent Logs"),this);
filter_recent_label->setFont(check_font);
filter_recent_label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
connect(filter_recent_check,SIGNAL(clicked()),
this,SLOT(filterChangedData()));
}
RDLogFilter::~RDLogFilter()
{
delete filter_clear_button;
delete filter_filter_edit;
delete filter_filter_label;
delete filter_recent_label;
}
QSize RDLogFilter::sizeHint() const
{
return QSize(400,60);
}
QSizePolicy RDLogFilter::sizePolicy() const
{
return QSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::Fixed);
}
QString RDLogFilter::whereSql() const
{
QString sql="";
if(filter_service_box->currentItem()!=0) {
sql+="&&(LOGS.SERVICE=\""+
RDEscapeString(filter_service_box->currentText())+"\")";
}
else {
sql+="&&(";
for(int i=1;i<filter_service_box->count();i++) {
sql+="(SERVICE=\""+RDEscapeString(filter_service_box->text(i))+"\")||";
}
sql=sql.left(sql.length()-2);
sql+=")";
}
QString filter=filter_filter_edit->text();
if(!filter.isEmpty()) {
if(filter_service_box->currentItem()==0) {
sql+="&&((LOGS.NAME like \"%%"+RDEscapeString(filter)+"%%\")||";
sql+="(LOGS.DESCRIPTION like \"%%"+RDEscapeString(filter)+"%%\")||";
sql+="(LOGS.SERVICE like \"%%"+RDEscapeString(filter)+"%%\"))";
}
else {
sql+="&&((LOGS.NAME like \"%%"+RDEscapeString(filter)+"%%\")||";
sql+="(LOGS.DESCRIPTION like \"%%"+RDEscapeString(filter)+"%%\"))";
}
}
if(filter_recent_check->isChecked()) {
sql+=QString().sprintf("order by LOGS.ORIGIN_DATETIME desc limit %d",
RD_LOGFILTER_LIMIT_QUAN);
}
return sql;
}
void RDLogFilter::changeUser()
{
if(filter_filter_mode==RDLogFilter::UserFilter) {
filter_service_box->clear();
filter_service_box->insertItem(tr("ALL"));
QString sql=QString("select SERVICE_NAME from USER_SERVICE_PERMS where ")+
"USER_NAME=\""+RDEscapeString(rda->user()->name())+"\"";
RDSqlQuery *q=new RDSqlQuery(sql);
while(q->next()) {
filter_service_box->insertItem(q->value(0).toString());
}
delete q;
}
}
void RDLogFilter::filterChangedData(const QString &str)
{
emit filterChanged(whereSql());
}
void RDLogFilter::filterChangedData()
{
emit filterChanged(whereSql());
}
void RDLogFilter::filterClearedData()
{
filter_filter_edit->clear();
filterChangedData();
}
void RDLogFilter::serviceChangedData(int n)
{
emit filterChanged(whereSql());
}
void RDLogFilter::resizeEvent(QResizeEvent *e)
{
filter_service_label->setGeometry(0,2,70,20);
filter_service_box->setGeometry(75,2,140,20);
filter_filter_label->setGeometry(220,2,50,20);
filter_filter_edit->setGeometry(275,2,size().width()-360,20);
filter_clear_button->setGeometry(size().width()-70,0,50,25);
filter_recent_check->setGeometry(275,27,15,15);
filter_recent_label->setGeometry(295,25,200,20);
}