2021-02-09 Fred Gleason <fredg@paravelsystems.com>

* Refactored the 'Log Clocks' dialog in rdlogmanager(1) to use
	the model based API.

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2021-02-09 20:41:17 -05:00
parent 4b516d398c
commit 5a67731cbd
14 changed files with 542 additions and 227 deletions

View File

@ -21080,3 +21080,9 @@
2021-02-09 Fred Gleason <fredg@paravelsystems.com> 2021-02-09 Fred Gleason <fredg@paravelsystems.com>
* Refactored the 'Log Events' dialog in rdlogmanager(1) to use * Refactored the 'Log Events' dialog in rdlogmanager(1) to use
the model based API. the model based API.
2021-02-09 Fred Gleason <fredg@paravelsystems.com>
* Refactored the 'Log Events' dialog in rdlogmanager(1) to use
the model based API.
2021-02-09 Fred Gleason <fredg@paravelsystems.com>
* Refactored the 'Log Clocks' dialog in rdlogmanager(1) to use
the model based API.

View File

@ -43,6 +43,7 @@ bin_PROGRAMS = rdlogmanager
dist_rdlogmanager_SOURCES = add_clock.cpp add_clock.h\ dist_rdlogmanager_SOURCES = add_clock.cpp add_clock.h\
add_event.cpp add_event.h\ add_event.cpp add_event.h\
clock_listview.cpp clock_listview.h\ clock_listview.cpp clock_listview.h\
clocklistmodel.cpp clocklistmodel.h\
commandline_ops.cpp globals.h\ commandline_ops.cpp globals.h\
edit_clock.cpp edit_clock.h\ edit_clock.cpp edit_clock.h\
edit_event.cpp edit_event.h\ edit_event.cpp edit_event.h\
@ -73,6 +74,7 @@ dist_rdlogmanager_SOURCES = add_clock.cpp add_clock.h\
nodist_rdlogmanager_SOURCES = moc_add_clock.cpp\ nodist_rdlogmanager_SOURCES = moc_add_clock.cpp\
moc_add_event.cpp\ moc_add_event.cpp\
moc_clock_listview.cpp\ moc_clock_listview.cpp\
moc_clocklistmodel.cpp\
moc_edit_clock.cpp\ moc_edit_clock.cpp\
moc_edit_event.cpp\ moc_edit_event.cpp\
moc_edit_eventline.cpp\ moc_edit_eventline.cpp\

View File

@ -0,0 +1,317 @@
// clocklistmodel.cpp
//
// Data model for Rivendell rdlogmanager(1) clocks
//
// (C) Copyright 2021 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 <QPainter>
#include "rdapplication.h"
#include "rdconf.h"
#include "rdescape_string.h"
#include "rdevent_line.h"
#include "clocklistmodel.h"
ClockListModel::ClockListModel(QObject *parent)
: QAbstractTableModel(parent)
{
//
// Column Attributes
//
unsigned left=Qt::AlignLeft|Qt::AlignVCenter;
unsigned center=Qt::AlignCenter;
//unsigned right=Qt::AlignRight|Qt::AlignVCenter;
d_headers.push_back(tr("Name"));
d_alignments.push_back(left);
d_headers.push_back(tr("Code"));
d_alignments.push_back(center);
updateModel();
}
ClockListModel::~ClockListModel()
{
}
QPalette ClockListModel::palette()
{
return d_palette;
}
void ClockListModel::setPalette(const QPalette &pal)
{
d_palette=pal;
}
void ClockListModel::setFont(const QFont &font)
{
d_font=font;
d_bold_font=font;
d_bold_font.setWeight(QFont::Bold);
}
int ClockListModel::columnCount(const QModelIndex &parent) const
{
return d_headers.size();
}
int ClockListModel::rowCount(const QModelIndex &parent) const
{
return d_texts.size();
}
QVariant ClockListModel::headerData(int section,Qt::Orientation orient,
int role) const
{
if((orient==Qt::Horizontal)&&(role==Qt::DisplayRole)) {
return d_headers.at(section);
}
return QVariant();
}
QVariant ClockListModel::data(const QModelIndex &index,int role) const
{
QString str;
int col=index.column();
int row=index.row();
if(row<d_texts.size()) {
switch((Qt::ItemDataRole)role) {
case Qt::DisplayRole:
return d_texts.at(row).at(col);
case Qt::DecorationRole:
if(col==0) {
return d_icons.at(row);
}
break;
case Qt::TextAlignmentRole:
return d_alignments.at(col);
case Qt::FontRole:
if(col==0) {
return d_bold_font;
}
return d_font;
case Qt::TextColorRole:
// Nothing to do!
break;
case Qt::BackgroundRole:
// Nothing to do!
break;
default:
break;
}
}
return QVariant();
}
QString ClockListModel::clockName(const QModelIndex &row) const
{
return d_texts.at(row.row()).at(0).toString();
}
QModelIndex ClockListModel::addClock(const QString &name)
{
//
// Find the insertion offset
//
int offset=d_texts.size();
for(int i=0;i<d_texts.size();i++) {
if(name.toLower()<d_texts.at(i).at(0).toString().toLower()) {
offset=i;
break;
}
}
beginInsertRows(QModelIndex(),offset,offset);
QList<QVariant> list;
for(int i=0;i<columnCount();i++) {
list.push_back(QVariant());
}
list[0]=name;
d_texts.insert(offset,list);
d_icons.insert(offset,QVariant());
updateRowLine(offset);
endInsertRows();
return createIndex(offset,0);
}
QModelIndex ClockListModel::clockIndex(const QString &name)
{
for(int i=0;i<d_texts.size();i++) {
if(d_texts.at(i).at(0).toString()==name) {
return createIndex(i,0);
}
}
return QModelIndex();
}
void ClockListModel::removeClock(const QModelIndex &row)
{
beginRemoveRows(QModelIndex(),row.row(),row.row());
d_texts.removeAt(row.row());
d_icons.removeAt(row.row());
endRemoveRows();
}
void ClockListModel::removeClock(const QString &name)
{
for(int i=0;i<d_texts.size();i++) {
if(d_texts.at(i).at(0).toString()==name) {
removeClock(createIndex(i,0));
return;
}
}
}
void ClockListModel::refresh(const QModelIndex &row)
{
if(row.row()<d_texts.size()) {
QString sql=sqlFields()+
"where "+
"CLOCKS.NAME=\""+RDEscapeString(d_texts.at(row.row()).at(0).toString())+
"\"";
RDSqlQuery *q=new RDSqlQuery(sql);
if(q->first()) {
updateRow(row.row(),q);
emit dataChanged(createIndex(row.row(),0),
createIndex(row.row(),columnCount()));
}
delete q;
}
}
void ClockListModel::refresh(const QString &name)
{
for(int i=0;i<d_texts.size();i++) {
if(d_texts.at(i).at(0).toString()==name) {
updateRowLine(i);
return;
}
}
}
void ClockListModel::setFilterSql(const QString &sql)
{
if(sql!=d_filter_sql) {
d_filter_sql=sql;
updateModel();
}
}
void ClockListModel::updateModel()
{
QList<QVariant> texts;
RDSqlQuery *q=NULL;
QString sql=sqlFields()+
d_filter_sql+
"order by CLOCKS.NAME ";
beginResetModel();
d_texts.clear();
d_icons.clear();
q=new RDSqlQuery(sql);
while(q->next()) {
d_texts.push_back(texts);
d_icons.push_back(QVariant());
updateRow(d_texts.size()-1,q);
}
delete q;
endResetModel();
}
void ClockListModel::updateRowLine(int line)
{
if(line<d_texts.size()) {
QString sql=sqlFields()+
"where "+
"CLOCKS.NAME=\""+RDEscapeString(d_texts.at(line).at(0).toString())+"\"";
RDSqlQuery *q=new RDSqlQuery(sql);
if(q->first()) {
updateRow(line,q);
}
delete q;
}
}
void ClockListModel::updateRow(int row,RDSqlQuery *q)
{
QList<QVariant> texts;
// Name
texts.push_back(q->value(0));
// Code
texts.push_back(q->value(1));
d_texts[row]=texts;
d_icons[row]=MakeIcon(q->value(2).toString());
}
QString ClockListModel::sqlFields() const
{
QString sql=QString("select ")+
"NAME,"+ // 00
"SHORT_NAME,"+ // 01
"COLOR "+ // 02
"from CLOCKS ";
return sql;
}
QPixmap ClockListModel::MakeIcon(const QString &color) const
{
QPixmap pix(QSize(15,15));
QPainter *p=new QPainter();
p->begin(&pix);
p->fillRect(0,0,15,15,QColor(color));
p->end();
delete p;
return pix;
}

View File

@ -0,0 +1,76 @@
// clocklistmodel.h
//
// Data model for Rivendell rdlogmanager(1) events
//
// (C) Copyright 2021 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.
//
#ifndef CLOCKLISTMODEL_H
#define CLOCKLISTMODEL_H
#include <QAbstractTableModel>
#include <QFont>
#include <QList>
#include <QPalette>
#include <QTimer>
#include <rddb.h>
#include <rdnotification.h>
#include <rduser.h>
class ClockListModel : public QAbstractTableModel
{
Q_OBJECT
public:
ClockListModel(QObject *parent=0);
~ClockListModel();
QPalette palette();
void setPalette(const QPalette &pal);
void setFont(const QFont &font);
int columnCount(const QModelIndex &parent=QModelIndex()) const;
int rowCount(const QModelIndex &parent=QModelIndex()) const;
QVariant headerData(int section,Qt::Orientation orient,
int role=Qt::DisplayRole) const;
QVariant data(const QModelIndex &index,int role=Qt::DisplayRole) const;
QString clockName(const QModelIndex &row) const;
QModelIndex addClock(const QString &name);
QModelIndex clockIndex(const QString &name);
void removeClock(const QModelIndex &row);
void removeClock(const QString &name);
void refresh(const QModelIndex &row);
void refresh(const QString &name);
void setFilterSql(const QString &sql);
protected:
void updateModel();
void updateRowLine(int line);
void updateRow(int row,RDSqlQuery *q);
QString sqlFields() const;
private:
QPixmap MakeIcon(const QString &color) const;
QPalette d_palette;
QFont d_font;
QFont d_bold_font;
QList<QVariant> d_headers;
QList<QVariant> d_alignments;
QList<QList<QVariant> > d_texts;
QList<QVariant> d_icons;
QString d_filter_sql;
};
#endif // CLOCKLISTMODEL_H

View File

@ -2,7 +2,7 @@
// //
// Edit Rivendell Log Clock // Edit Rivendell Log Clock
// //
// (C) Copyright 2002-2020 Fred Gleason <fredg@paravelsystems.com> // (C) Copyright 2002-2021 Fred Gleason <fredg@paravelsystems.com>
// //
// This program is free software; you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License version 2 as
@ -173,6 +173,7 @@ EditClock::EditClock(QString clockname,bool new_clock,
button->setFont(buttonFont()); button->setFont(buttonFont());
button->setText(tr("Save &As")); button->setText(tr("Save &As"));
connect(button,SIGNAL(clicked()),this,SLOT(saveAsData())); connect(button,SIGNAL(clicked()),this,SLOT(saveAsData()));
button->setDisabled(new_clock);
// //
// Service Associations Button // Service Associations Button

View File

@ -2,7 +2,7 @@
// //
// List Rivendell Log Clocks // List Rivendell Log Clocks
// //
// (C) Copyright 2002-2020 Fred Gleason <fredg@paravelsystems.com> // (C) Copyright 2002-2021 Fred Gleason <fredg@paravelsystems.com>
// //
// This program is free software; you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License version 2 as
@ -18,8 +18,7 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
// //
#include <qmessagebox.h> #include <QMessageBox>
#include <qpainter.h>
#include <rdescape_string.h> #include <rdescape_string.h>
@ -55,16 +54,16 @@ ListClocks::ListClocks(QString *clockname,QWidget *parent)
// //
// Clocks List // Clocks List
// //
edit_clocks_list=new Q3ListView(this); edit_clocks_view=new RDTableView(this);
edit_clocks_list->setAllColumnsShowFocus(true); edit_clocks_model=new ClockListModel(this);
edit_clocks_list->setItemMargin(5); edit_clocks_model->setFont(font());
edit_clocks_list->addColumn(tr("Name")); edit_clocks_model->setPalette(palette());
edit_clocks_list->addColumn(tr("Code")); edit_clocks_view->setModel(edit_clocks_model);
edit_clocks_list->addColumn(tr("Color")); connect(edit_clocks_view,SIGNAL(doubleClicked(const QModelIndex &)),
edit_clocks_list->setColumnAlignment(2,Qt::AlignCenter); this,SLOT(doubleClickedData(const QModelIndex &)));
connect(edit_clocks_list, connect(edit_clocks_model,SIGNAL(modelReset()),
SIGNAL(doubleClicked(Q3ListViewItem *,const QPoint &,int)), edit_clocks_view,SLOT(resizeColumnsToContents()));
this,SLOT(doubleClickedData(Q3ListViewItem *,const QPoint &,int))); edit_clocks_view->resizeColumnsToContents();
// //
// Add Button // Add Button
@ -166,15 +165,10 @@ ListClocks::ListClocks(QString *clockname,QWidget *parent)
edit_filter_box->setCurrentItem(edit_filter_box->count()-1); edit_filter_box->setCurrentItem(edit_filter_box->count()-1);
} }
} }
RefreshList();
if(edit_clockname!=NULL) { if(edit_clockname!=NULL) {
Q3ListViewItem *item=edit_clocks_list->firstChild(); QModelIndex row=edit_clocks_model->clockIndex(*edit_clockname);
while(item!=NULL) { if(row.isValid()) {
if(item->text(0)==*edit_clockname) { edit_clocks_view->selectRow(row.row());
edit_clocks_list->setSelected(item,true);
}
item=item->nextSibling();
} }
} }
} }
@ -258,10 +252,10 @@ void ListClocks::addData()
"SERVICE_NAME=\""+RDEscapeString(edit_filter_box->currentText())+"\""; "SERVICE_NAME=\""+RDEscapeString(edit_filter_box->currentText())+"\"";
RDSqlQuery::apply(sql); RDSqlQuery::apply(sql);
} }
Q3ListViewItem *item=new Q3ListViewItem(edit_clocks_list); QModelIndex row=edit_clocks_model->addClock(clockname);
item->setText(0,clockname); if(row.isValid()) {
RefreshItem(item,&new_clocks); edit_clocks_view->selectRow(row.row());
edit_clocks_list->setSelected(item,true); }
} }
delete clock_dialog; delete clock_dialog;
} }
@ -270,17 +264,23 @@ void ListClocks::addData()
void ListClocks::editData() void ListClocks::editData()
{ {
std::vector<QString> new_clocks; std::vector<QString> new_clocks;
Q3ListViewItem *item=edit_clocks_list->selectedItem(); QModelIndexList rows=edit_clocks_view->selectionModel()->selectedRows();
if(item==NULL) {
if(rows.size()!=1) {
return; return;
} }
EditClock *clock_dialog=new EditClock(item->text(0),false,&new_clocks,this); EditClock *clock_dialog=
new EditClock(edit_clocks_model->clockName(rows.first()),false,
&new_clocks,this);
if(clock_dialog->exec()<0) { if(clock_dialog->exec()<0) {
delete clock_dialog; delete clock_dialog;
return; return;
} }
delete clock_dialog; delete clock_dialog;
RefreshItem(item,&new_clocks); edit_clocks_model->refresh(rows.first());
for(unsigned i=0;i<new_clocks.size();i++) {
edit_clocks_model->addClock(new_clocks.at(i));
}
} }
@ -288,20 +288,21 @@ void ListClocks::deleteData()
{ {
int n; int n;
QString svc_list; QString svc_list;
Q3ListViewItem *item=edit_clocks_list->selectedItem(); QModelIndexList rows=edit_clocks_view->selectionModel()->selectedRows();
if(item==NULL) {
if(rows.size()!=1) {
return; return;
} }
if(QMessageBox::question(this,"RDLogManager - "+tr("Delete Clock"), if(QMessageBox::question(this,"RDLogManager - "+tr("Delete Clock"),
tr("Are you sure you want to delete")+" \""+ tr("Are you sure you want to delete")+" \""+
item->text(0)+"\"?", edit_clocks_model->clockName(rows.first())+"\"?",
QMessageBox::Yes,QMessageBox::No) QMessageBox::Yes,QMessageBox::No)
!=QMessageBox::Yes) { !=QMessageBox::Yes) {
return; return;
} }
if((n=ActiveClocks(item->text(0),&svc_list))>0) { if((n=ActiveClocks(edit_clocks_model->clockName(rows.first()),&svc_list))>0) {
if(QMessageBox::warning(this,"RDLogManager - "+tr("Clock In Use"), if(QMessageBox::warning(this,"RDLogManager - "+tr("Clock In Use"),
"\""+item->text(0)+"\" "+ "\""+edit_clocks_model->clockName(rows.first())+"\" "+
tr("is in use in the following grid(s)")+":\n\n"+ tr("is in use in the following grid(s)")+":\n\n"+
svc_list+"\n"+ svc_list+"\n"+
tr("Do you still want to delete it?"), tr("Do you still want to delete it?"),
@ -310,8 +311,8 @@ void ListClocks::deleteData()
return; return;
} }
} }
DeleteClock(item->text(0)); DeleteClock(edit_clocks_model->clockName(rows.first()));
RefreshList(); edit_clocks_model->removeClock(rows.first());
} }
@ -319,12 +320,13 @@ void ListClocks::renameData()
{ {
QString sql; QString sql;
RDSqlQuery *q; RDSqlQuery *q;
RDSqlQuery *q1; QModelIndexList rows=edit_clocks_view->selectionModel()->selectedRows();
Q3ListViewItem *item=edit_clocks_list->selectedItem();
if(item==NULL) { if(rows.size()!=1) {
return; return;
} }
QString new_name=item->text(0); QString old_name=edit_clocks_model->clockName(rows.first());
QString new_name=old_name;
RenameItem *rename_dialog=new RenameItem(&new_name,"CLOCKS",this); RenameItem *rename_dialog=new RenameItem(&new_name,"CLOCKS",this);
if(rename_dialog->exec()<-1) { if(rename_dialog->exec()<-1) {
delete rename_dialog; delete rename_dialog;
@ -343,9 +345,8 @@ void ListClocks::renameData()
for(int i=0;i<168;i++) { for(int i=0;i<168;i++) {
sql=QString("update SERVICE_CLOCKS set ")+ sql=QString("update SERVICE_CLOCKS set ")+
"CLOCK_NAME=\""+RDEscapeString(new_name)+"\" where "+ "CLOCK_NAME=\""+RDEscapeString(new_name)+"\" where "+
"CLOCK_NAME=\""+RDEscapeString(item->text(0))+"\""; "CLOCK_NAME=\""+RDEscapeString(edit_clocks_model->clockName(rows.first()))+"\"";
q1=new RDSqlQuery(sql); RDSqlQuery::apply(sql);
delete q1;
} }
} }
delete q; delete q;
@ -355,13 +356,12 @@ void ListClocks::renameData()
// //
sql=QString("update CLOCK_LINES set ")+ sql=QString("update CLOCK_LINES set ")+
"CLOCK_NAME=\""+RDEscapeString(new_name)+"\" where "+ "CLOCK_NAME=\""+RDEscapeString(new_name)+"\" where "+
"CLOCK_NAME=\""+RDEscapeString(item->text(0))+"\""; "CLOCK_NAME=\""+RDEscapeString(edit_clocks_model->clockName(rows.first()))+"\"";
q=new RDSqlQuery(sql); RDSqlQuery::apply(sql);
delete q;
sql=QString("update RULE_LINES set ")+ sql=QString("update RULE_LINES set ")+
"CLOCK_NAME=\""+RDEscapeString(new_name)+"\" where "+ "CLOCK_NAME=\""+RDEscapeString(new_name)+"\" where "+
"CLOCK_NAME=\""+RDEscapeString(item->text(0))+"\""; "CLOCK_NAME=\""+RDEscapeString(edit_clocks_model->clockName(rows.first()))+"\"";
RDSqlQuery::apply(sql); RDSqlQuery::apply(sql);
// //
@ -369,31 +369,42 @@ void ListClocks::renameData()
// //
sql=QString("update CLOCK_PERMS set ")+ sql=QString("update CLOCK_PERMS set ")+
"CLOCK_NAME=\""+RDEscapeString(new_name)+"\" where "+ "CLOCK_NAME=\""+RDEscapeString(new_name)+"\" where "+
"CLOCK_NAME=\""+RDEscapeString(item->text(0))+"\""; "CLOCK_NAME=\""+RDEscapeString(edit_clocks_model->clockName(rows.first()))+"\"";
q=new RDSqlQuery(sql); RDSqlQuery::apply(sql);
delete q;
// //
// Rename Primary Key // Rename Primary Key
// //
sql=QString("update CLOCKS set ")+ sql=QString("update CLOCKS set ")+
"NAME=\""+RDEscapeString(new_name)+"\" where "+ "NAME=\""+RDEscapeString(new_name)+"\" where "+
"NAME=\""+RDEscapeString(item->text(0))+"\""; "NAME=\""+RDEscapeString(edit_clocks_model->clockName(rows.first()))+"\"";
q=new RDSqlQuery(sql); RDSqlQuery::apply(sql);
delete q;
item->setText(0,new_name); edit_clocks_model->removeClock(old_name);
RefreshItem(item); QModelIndex row=edit_clocks_model->addClock(new_name);
if(row.isValid()) {
edit_clocks_view->selectRow(row.row());
}
} }
void ListClocks::filterActivatedData(int id) void ListClocks::filterActivatedData(int id)
{ {
RefreshList(); QString filter;
if(id==1) {
filter=GetNoneFilter();
}
else {
if(id>1) {
filter=GetClockFilter(edit_filter_box->currentText());
}
}
edit_clocks_model->setFilterSql(filter);
} }
void ListClocks::doubleClickedData(Q3ListViewItem *item,const QPoint &,int) void ListClocks::doubleClickedData(const QModelIndex &index)
{ {
if(edit_clockname==NULL) { if(edit_clockname==NULL) {
editData(); editData();
@ -413,22 +424,19 @@ void ListClocks::closeData()
void ListClocks::clearData() void ListClocks::clearData()
{ {
Q3ListViewItem *item=edit_clocks_list->selectedItem(); edit_clocks_view->clearSelection();
if(item!=NULL) {
edit_clocks_list->setSelected(item,false);
}
} }
void ListClocks::okData() void ListClocks::okData()
{ {
Q3ListViewItem *item=edit_clocks_list->selectedItem();
*clock_filter=edit_filter_box->currentText(); *clock_filter=edit_filter_box->currentText();
if(item==NULL) { QModelIndexList rows=edit_clocks_view->selectionModel()->selectedRows();
*edit_clockname=""; if(rows.size()==1) {
*edit_clockname=edit_clocks_model->clockName(rows.first());
} }
else { else {
*edit_clockname=item->text(0); *edit_clockname="";
} }
done(0); done(0);
} }
@ -444,7 +452,7 @@ void ListClocks::resizeEvent(QResizeEvent *e)
{ {
edit_filter_box->setGeometry(65,10,size().width()-75,20); edit_filter_box->setGeometry(65,10,size().width()-75,20);
edit_filter_label->setGeometry(10,10,50,20); edit_filter_label->setGeometry(10,10,50,20);
edit_clocks_list->setGeometry(10,45, edit_clocks_view->setGeometry(10,45,
size().width()-20,size().height()-115); size().width()-20,size().height()-115);
edit_add_button->setGeometry(10,size().height()-60,80,50); edit_add_button->setGeometry(10,size().height()-60,80,50);
edit_edit_button->setGeometry(100,size().height()-60,80,50); edit_edit_button->setGeometry(100,size().height()-60,80,50);
@ -466,86 +474,6 @@ void ListClocks::closeEvent(QCloseEvent *e)
} }
void ListClocks::RefreshList()
{
QString filter;
if(edit_filter_box->currentItem()==1) {
filter=GetNoneFilter();
}
else {
if(edit_filter_box->currentItem()>1) {
filter=GetClockFilter(edit_filter_box->currentText());
}
}
edit_clocks_list->clear();
QString sql=QString("select ")+
"NAME,"+ // 00
"SHORT_NAME,"+ // 01
"COLOR "+ // 02
"from CLOCKS "+filter;
RDSqlQuery *q=new RDSqlQuery(sql);
Q3ListViewItem *item=NULL;
while(q->next()) {
item=new Q3ListViewItem(edit_clocks_list);
WriteItem(item,q);
}
delete q;
}
void ListClocks::RefreshItem(Q3ListViewItem *item,
std::vector<QString> *new_clocks)
{
Q3ListViewItem *new_item;
UpdateItem(item,item->text(0));
if(new_clocks!=NULL) {
for(unsigned i=0;i<new_clocks->size();i++) {
if((new_item=edit_clocks_list->findItem(new_clocks->at(i),0))==NULL) {
new_item=new Q3ListViewItem(edit_clocks_list);
}
UpdateItem(new_item,new_clocks->at(i));
}
}
}
void ListClocks::UpdateItem(Q3ListViewItem *item,QString name)
{
QString sql=QString("select ")+
"NAME,"+ // 00
"SHORT_NAME,"+ // 01
"COLOR "+ // 02
"from CLOCKS where "+
"NAME=\""+RDEscapeString(name)+"\"";
RDSqlQuery *q=new RDSqlQuery(sql);
if(q->next()) {
item->setText(0,name);
WriteItem(item,q);
}
delete q;
}
void ListClocks::WriteItem(Q3ListViewItem *item,RDSqlQuery *q)
{
QPixmap *pix;
QPainter *p=new QPainter();
item->setText(0,q->value(0).toString());
item->setText(1,q->value(1).toString());
pix=new QPixmap(QSize(15,15));
p->begin(pix);
p->fillRect(0,0,15,15,QColor(q->value(2).toString()));
p->end();
item->setPixmap(2,*pix);
delete p;
}
int ListClocks::ActiveClocks(QString clockname,QString *svc_list) int ListClocks::ActiveClocks(QString clockname,QString *svc_list)
{ {
int n=0; int n=0;

View File

@ -2,7 +2,7 @@
// //
// List Rivendell Log Clocks // List Rivendell Log Clocks
// //
// (C) Copyright 2002-2019 Fred Gleason <fredg@paravelsystems.com> // (C) Copyright 2002-2021 Fred Gleason <fredg@paravelsystems.com>
// //
// This program is free software; you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License version 2 as
@ -21,13 +21,13 @@
#ifndef LIST_CLOCKS_H #ifndef LIST_CLOCKS_H
#define LIST_CLOCKS_H #define LIST_CLOCKS_H
#include <q3listview.h> #include <QComboBox>
#include <qcombobox.h>
#include <qlabel.h>
#include <rddialog.h> #include <rddialog.h>
#include <rddb.h> #include <rddb.h>
#include <rdtableview.h>
#include "clocklistmodel.h"
class ListClocks : public RDDialog class ListClocks : public RDDialog
{ {
@ -42,7 +42,7 @@ class ListClocks : public RDDialog
void editData(); void editData();
void deleteData(); void deleteData();
void renameData(); void renameData();
void doubleClickedData(Q3ListViewItem *,const QPoint &,int); void doubleClickedData(const QModelIndex &index);
void filterActivatedData(int id); void filterActivatedData(int id);
void closeData(); void closeData();
void clearData(); void clearData();
@ -54,15 +54,12 @@ class ListClocks : public RDDialog
void closeEvent(QCloseEvent *e); void closeEvent(QCloseEvent *e);
private: private:
void RefreshList();
void RefreshItem(Q3ListViewItem *item,std::vector<QString> *new_clocks=NULL);
void UpdateItem(Q3ListViewItem *item,QString name);
void WriteItem(Q3ListViewItem *item,RDSqlQuery *q);
int ActiveClocks(QString clockname,QString *svc_list); int ActiveClocks(QString clockname,QString *svc_list);
void DeleteClock(QString clockname); void DeleteClock(QString clockname);
QString GetClockFilter(QString svc_name); QString GetClockFilter(QString svc_name);
QString GetNoneFilter(); QString GetNoneFilter();
Q3ListView *edit_clocks_list; RDTableView *edit_clocks_view;
ClockListModel *edit_clocks_model;
QString *edit_clockname; QString *edit_clockname;
QLabel *edit_filter_label; QLabel *edit_filter_label;
QComboBox *edit_filter_box; QComboBox *edit_filter_box;

View File

@ -1206,15 +1206,15 @@ Opětovné sloučení tato data smaže. Sloučit znovu?</translation>
</message> </message>
<message> <message>
<source>Name</source> <source>Name</source>
<translation>Název</translation> <translation type="obsolete">Název</translation>
</message> </message>
<message> <message>
<source>Code</source> <source>Code</source>
<translation>Kód</translation> <translation type="obsolete">Kód</translation>
</message> </message>
<message> <message>
<source>Color</source> <source>Color</source>
<translation>Barva</translation> <translation type="obsolete">Barva</translation>
</message> </message>
<message> <message>
<source>&amp;Add</source> <source>&amp;Add</source>
@ -1258,11 +1258,11 @@ Opětovné sloučení tato data smaže. Sloučit znovu?</translation>
</message> </message>
<message> <message>
<source>Clock Exists</source> <source>Clock Exists</source>
<translation>Hodiny existují</translation> <translation type="unfinished">Hodiny existují</translation>
</message> </message>
<message> <message>
<source>An clock with that name already exists!</source> <source>An clock with that name already exists!</source>
<translation>Hodiny s tímto názvem již existují!</translation> <translation type="unfinished">Hodiny s tímto názvem již existují!</translation>
</message> </message>
<message> <message>
<source>Are you sure you want to <source>Are you sure you want to
@ -1271,7 +1271,7 @@ delete</source>
</message> </message>
<message> <message>
<source>Delete Clock</source> <source>Delete Clock</source>
<translation>Smazat hodiny</translation> <translation type="unfinished">Smazat hodiny</translation>
</message> </message>
<message> <message>
<source>is in use in the following grid(s):</source> <source>is in use in the following grid(s):</source>
@ -1279,11 +1279,11 @@ delete</source>
</message> </message>
<message> <message>
<source>Do you still want to delete it?</source> <source>Do you still want to delete it?</source>
<translation>Stále ještě chcete smazat?</translation> <translation type="unfinished">Stále ještě chcete smazat?</translation>
</message> </message>
<message> <message>
<source>Clock In Use</source> <source>Clock In Use</source>
<translation>Používané hodiny</translation> <translation type="unfinished">Používané hodiny</translation>
</message> </message>
<message> <message>
<source>Log Clocks - User: </source> <source>Log Clocks - User: </source>

View File

@ -1206,15 +1206,15 @@ Einbinden wird diese entfernen. Fortfahren?</translation>
</message> </message>
<message> <message>
<source>Name</source> <source>Name</source>
<translation>Name</translation> <translation type="obsolete">Name</translation>
</message> </message>
<message> <message>
<source>Code</source> <source>Code</source>
<translation>Code</translation> <translation type="obsolete">Code</translation>
</message> </message>
<message> <message>
<source>Color</source> <source>Color</source>
<translation>Farbe</translation> <translation type="obsolete">Farbe</translation>
</message> </message>
<message> <message>
<source>&amp;Add</source> <source>&amp;Add</source>
@ -1258,11 +1258,11 @@ Einbinden wird diese entfernen. Fortfahren?</translation>
</message> </message>
<message> <message>
<source>Clock Exists</source> <source>Clock Exists</source>
<translation>Uhr existiert</translation> <translation type="unfinished">Uhr existiert</translation>
</message> </message>
<message> <message>
<source>An clock with that name already exists!</source> <source>An clock with that name already exists!</source>
<translation>Eine Uhr mit diesem Namen existiert bereits!</translation> <translation type="unfinished">Eine Uhr mit diesem Namen existiert bereits!</translation>
</message> </message>
<message> <message>
<source>Are you sure you want to <source>Are you sure you want to
@ -1271,7 +1271,7 @@ delete</source>
</message> </message>
<message> <message>
<source>Delete Clock</source> <source>Delete Clock</source>
<translation>Uhr löschen</translation> <translation type="unfinished">Uhr löschen</translation>
</message> </message>
<message> <message>
<source>is in use in the following grid(s):</source> <source>is in use in the following grid(s):</source>
@ -1279,11 +1279,11 @@ delete</source>
</message> </message>
<message> <message>
<source>Do you still want to delete it?</source> <source>Do you still want to delete it?</source>
<translation>Wollen Sie immernoch löschen?</translation> <translation type="unfinished">Wollen Sie immernoch löschen?</translation>
</message> </message>
<message> <message>
<source>Clock In Use</source> <source>Clock In Use</source>
<translation>Uhr in Verwendung</translation> <translation type="unfinished">Uhr in Verwendung</translation>
</message> </message>
<message> <message>
<source>Log Clocks - User: </source> <source>Log Clocks - User: </source>

View File

@ -1208,15 +1208,15 @@ removerá estos datos. ¿Remezclar?</translation>
</message> </message>
<message> <message>
<source>Name</source> <source>Name</source>
<translation>Nombre</translation> <translation type="obsolete">Nombre</translation>
</message> </message>
<message> <message>
<source>Code</source> <source>Code</source>
<translation>Código</translation> <translation type="obsolete">Código</translation>
</message> </message>
<message> <message>
<source>Color</source> <source>Color</source>
<translation>Color</translation> <translation type="obsolete">Color</translation>
</message> </message>
<message> <message>
<source>&amp;Add</source> <source>&amp;Add</source>
@ -1252,11 +1252,11 @@ removerá estos datos. ¿Remezclar?</translation>
</message> </message>
<message> <message>
<source>Clock Exists</source> <source>Clock Exists</source>
<translation>Ya existe una torta</translation> <translation type="unfinished">Ya existe una torta</translation>
</message> </message>
<message> <message>
<source>An clock with that name already exists!</source> <source>An clock with that name already exists!</source>
<translation>¡Una torta con ese nombre ya existe!</translation> <translation type="unfinished">¡Una torta con ese nombre ya existe!</translation>
</message> </message>
<message> <message>
<source>Are you sure you want to <source>Are you sure you want to
@ -1266,7 +1266,7 @@ eliminar</translation>
</message> </message>
<message> <message>
<source>Delete Clock</source> <source>Delete Clock</source>
<translation>Eliminar torta</translation> <translation type="unfinished">Eliminar torta</translation>
</message> </message>
<message> <message>
<source>is in use in the following grid(s):</source> <source>is in use in the following grid(s):</source>
@ -1274,11 +1274,11 @@ eliminar</translation>
</message> </message>
<message> <message>
<source>Do you still want to delete it?</source> <source>Do you still want to delete it?</source>
<translation>¿Desea eliminarla de cualquier forma?</translation> <translation type="unfinished">¿Desea eliminarla de cualquier forma?</translation>
</message> </message>
<message> <message>
<source>Clock In Use</source> <source>Clock In Use</source>
<translation>Torta en uso</translation> <translation type="unfinished">Torta en uso</translation>
</message> </message>
<message> <message>
<source>&amp;Rename</source> <source>&amp;Rename</source>

View File

@ -913,18 +913,6 @@ Do you want to save?</source>
<source>Filter:</source> <source>Filter:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Code</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Color</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>&amp;Add</source> <source>&amp;Add</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -965,6 +953,10 @@ Do you want to save?</source>
<source>NONE</source> <source>NONE</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Log Clocks</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Clock Exists</source> <source>Clock Exists</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -978,25 +970,21 @@ Do you want to save?</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>Do you still want to delete it?</source> <source>Are you sure you want to delete</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>Clock In Use</source> <source>Clock In Use</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Log Clocks</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to delete</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>is in use in the following grid(s)</source> <source>is in use in the following grid(s)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Do you still want to delete it?</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ListEvents</name> <name>ListEvents</name>

View File

@ -1215,15 +1215,15 @@ Flettar du på nytt, vil du fjerna desse dataa. Flett på nytt?</translation>
</message> </message>
<message> <message>
<source>Name</source> <source>Name</source>
<translation>Namn</translation> <translation type="obsolete">Namn</translation>
</message> </message>
<message> <message>
<source>Code</source> <source>Code</source>
<translation>Kode</translation> <translation type="obsolete">Kode</translation>
</message> </message>
<message> <message>
<source>Color</source> <source>Color</source>
<translation>Farge</translation> <translation type="obsolete">Farge</translation>
</message> </message>
<message> <message>
<source>&amp;Add</source> <source>&amp;Add</source>
@ -1267,11 +1267,11 @@ Flettar du på nytt, vil du fjerna desse dataa. Flett på nytt?</translation>
</message> </message>
<message> <message>
<source>Clock Exists</source> <source>Clock Exists</source>
<translation>Klokka eksisterer</translation> <translation type="unfinished">Klokka eksisterer</translation>
</message> </message>
<message> <message>
<source>An clock with that name already exists!</source> <source>An clock with that name already exists!</source>
<translation>Det finst alt ei klokke med dette namnet!</translation> <translation type="unfinished">Det finst alt ei klokke med dette namnet!</translation>
</message> </message>
<message> <message>
<source>Are you sure you want to <source>Are you sure you want to
@ -1281,7 +1281,7 @@ sletta</translation>
</message> </message>
<message> <message>
<source>Delete Clock</source> <source>Delete Clock</source>
<translation>Slett klokka</translation> <translation type="unfinished">Slett klokka</translation>
</message> </message>
<message> <message>
<source>is in use in the following grid(s):</source> <source>is in use in the following grid(s):</source>
@ -1289,11 +1289,11 @@ sletta</translation>
</message> </message>
<message> <message>
<source>Do you still want to delete it?</source> <source>Do you still want to delete it?</source>
<translation>Vil du framleis sletta?</translation> <translation type="unfinished">Vil du framleis sletta?</translation>
</message> </message>
<message> <message>
<source>Clock In Use</source> <source>Clock In Use</source>
<translation>Klokka er i bruk</translation> <translation type="unfinished">Klokka er i bruk</translation>
</message> </message>
<message> <message>
<source>Are you sure you want to delete</source> <source>Are you sure you want to delete</source>

View File

@ -1215,15 +1215,15 @@ Flettar du på nytt, vil du fjerna desse dataa. Flett på nytt?</translation>
</message> </message>
<message> <message>
<source>Name</source> <source>Name</source>
<translation>Namn</translation> <translation type="obsolete">Namn</translation>
</message> </message>
<message> <message>
<source>Code</source> <source>Code</source>
<translation>Kode</translation> <translation type="obsolete">Kode</translation>
</message> </message>
<message> <message>
<source>Color</source> <source>Color</source>
<translation>Farge</translation> <translation type="obsolete">Farge</translation>
</message> </message>
<message> <message>
<source>&amp;Add</source> <source>&amp;Add</source>
@ -1267,11 +1267,11 @@ Flettar du på nytt, vil du fjerna desse dataa. Flett på nytt?</translation>
</message> </message>
<message> <message>
<source>Clock Exists</source> <source>Clock Exists</source>
<translation>Klokka eksisterer</translation> <translation type="unfinished">Klokka eksisterer</translation>
</message> </message>
<message> <message>
<source>An clock with that name already exists!</source> <source>An clock with that name already exists!</source>
<translation>Det finst alt ei klokke med dette namnet!</translation> <translation type="unfinished">Det finst alt ei klokke med dette namnet!</translation>
</message> </message>
<message> <message>
<source>Are you sure you want to <source>Are you sure you want to
@ -1281,7 +1281,7 @@ sletta</translation>
</message> </message>
<message> <message>
<source>Delete Clock</source> <source>Delete Clock</source>
<translation>Slett klokka</translation> <translation type="unfinished">Slett klokka</translation>
</message> </message>
<message> <message>
<source>is in use in the following grid(s):</source> <source>is in use in the following grid(s):</source>
@ -1289,11 +1289,11 @@ sletta</translation>
</message> </message>
<message> <message>
<source>Do you still want to delete it?</source> <source>Do you still want to delete it?</source>
<translation>Vil du framleis sletta?</translation> <translation type="unfinished">Vil du framleis sletta?</translation>
</message> </message>
<message> <message>
<source>Clock In Use</source> <source>Clock In Use</source>
<translation>Klokka er i bruk</translation> <translation type="unfinished">Klokka er i bruk</translation>
</message> </message>
<message> <message>
<source>Are you sure you want to delete</source> <source>Are you sure you want to delete</source>

View File

@ -1212,15 +1212,15 @@ Re-agregar removerá estes dados. Re-agregar? </translation>
</message> </message>
<message> <message>
<source>Name</source> <source>Name</source>
<translation>Nome:</translation> <translation type="obsolete">Nome:</translation>
</message> </message>
<message> <message>
<source>Code</source> <source>Code</source>
<translation>Código</translation> <translation type="obsolete">Código</translation>
</message> </message>
<message> <message>
<source>Color</source> <source>Color</source>
<translation>Cor</translation> <translation type="obsolete">Cor</translation>
</message> </message>
<message> <message>
<source>&amp;Add</source> <source>&amp;Add</source>
@ -1264,11 +1264,11 @@ Re-agregar removerá estes dados. Re-agregar? </translation>
</message> </message>
<message> <message>
<source>Clock Exists</source> <source>Clock Exists</source>
<translation>Relógio Existente</translation> <translation type="unfinished">Relógio Existente</translation>
</message> </message>
<message> <message>
<source>An clock with that name already exists!</source> <source>An clock with that name already exists!</source>
<translation>Um Relógio com este nome existe!</translation> <translation type="unfinished">Um Relógio com este nome existe!</translation>
</message> </message>
<message> <message>
<source>Are you sure you want to <source>Are you sure you want to
@ -1278,7 +1278,7 @@ deletar</translation>
</message> </message>
<message> <message>
<source>Delete Clock</source> <source>Delete Clock</source>
<translation>Deletar Relógio</translation> <translation type="unfinished">Deletar Relógio</translation>
</message> </message>
<message> <message>
<source>is in use in the following grid(s):</source> <source>is in use in the following grid(s):</source>
@ -1286,11 +1286,11 @@ deletar</translation>
</message> </message>
<message> <message>
<source>Do you still want to delete it?</source> <source>Do you still want to delete it?</source>
<translation>Tem certeza que quer deletá-lo?</translation> <translation type="unfinished">Tem certeza que quer deletá-lo?</translation>
</message> </message>
<message> <message>
<source>Clock In Use</source> <source>Clock In Use</source>
<translation>Relógio em Uso</translation> <translation type="unfinished">Relógio em Uso</translation>
</message> </message>
<message> <message>
<source>Log Clocks</source> <source>Log Clocks</source>