2021-01-25 Fred Gleason <fredg@paravelsystems.com>

* Added 'RDPodcastListModel'.
	* Refactored the 'Podcast Item List' dialog in rdcastmanager(1) to
	use the	model-based API.

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2021-01-25 19:57:35 -05:00
parent 80e04f2fbf
commit 9b5edb0672
25 changed files with 1409 additions and 744 deletions

View File

@ -20901,3 +20901,7 @@
2021-01-25 Fred Gleason <fredg@paravelsystems.com>
* Fixed a bug in 'RDFeedListModel' that caused feed icons to fail
to be scaled correctly.
2021-01-25 Fred Gleason <fredg@paravelsystems.com>
* Added 'RDPodcastListModel'.
* Refactored the 'Podcast Item List' dialog in rdcastmanager(1) to
use the model-based API.

View File

@ -200,6 +200,8 @@ dist_librd_la_SOURCES = dbversion.h\
rdplaymeter.cpp rdplaymeter.h\
rdpeaksexport.cpp rdpeaksexport.h\
rdpodcast.cpp rdpodcast.h\
rdpodcastfilter.cpp rdpodcastfilter.h\
rdpodcastlistmodel.cpp rdpodcastlistmodel.h\
rdprocess.cpp rdprocess.h\
rdprofile.cpp rdprofile.h\
rdpushbutton.cpp rdpushbutton.h\
@ -344,6 +346,8 @@ nodist_librd_la_SOURCES = moc_rdadd_cart.cpp\
moc_rdpasswd.cpp\
moc_rdplay_deck.cpp\
moc_rdplaymeter.cpp\
moc_rdpodcastfilter.cpp\
moc_rdpodcastlistmodel.cpp\
moc_rdprocess.cpp\
moc_rdpushbutton.cpp\
moc_rdrehash.cpp\

View File

@ -145,6 +145,8 @@ SOURCES += rdpanel_button.cpp
SOURCES += rdpasswd.cpp
SOURCES += rdplay_deck.cpp
SOURCES += rdplaymeter.cpp
SOURCES += rdpodcastfilter.cpp
SOURCES += rdpodcastlistmodel.cpp
SOURCES += rdprocess.cpp
SOURCES += rdprofile.cpp
SOURCES += rdpushbutton.cpp
@ -302,6 +304,8 @@ HEADERS += rdpaths.h
HEADERS += rdpasswd.h
HEADERS += rdplay_deck.h
HEADERS += rdplaymeter.h
HEADERS += rdpodcastfilter.h
HEADERS += rdpodcastlistmodel.h
HEADERS += rdprocess.h
HEADERS += rdprofile.h
HEADERS += rdpushbutton.h

View File

@ -3268,6 +3268,76 @@ Zkuste to, prosím, znovu!</translation>
<translation>OK</translation>
</message>
</context>
<context>
<name>RDPodcastFilter</name>
<message>
<source>Filter:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Active Items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDPodcastListModel</name>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Délka</translation>
</message>
<message>
<source>Feed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Category</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posted By</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SHA1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>at</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>on</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[none]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Never</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDProcess</name>
<message>

View File

@ -3249,6 +3249,76 @@ bitte erneut versuchen!</translation>
<translation>OK</translation>
</message>
</context>
<context>
<name>RDPodcastFilter</name>
<message>
<source>Filter:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Active Items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDPodcastListModel</name>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Länge</translation>
</message>
<message>
<source>Feed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Category</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posted By</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SHA1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>at</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>on</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[none]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Never</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDProcess</name>
<message>

View File

@ -3236,6 +3236,76 @@ please try again!</source>
<translation>Aceptar</translation>
</message>
</context>
<context>
<name>RDPodcastFilter</name>
<message>
<source>Filter:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Active Items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDPodcastListModel</name>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Longitud</translation>
</message>
<message>
<source>Feed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Category</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posted By</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SHA1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>at</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>on</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[none]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Never</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDProcess</name>
<message>

View File

@ -2671,6 +2671,76 @@ please try again!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDPodcastFilter</name>
<message>
<source>Filter:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Active Items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDPodcastListModel</name>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start</source>
<translation type="unfinished">Début</translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Feed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Category</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posted By</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SHA1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>at</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>on</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[none]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Never</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDProcess</name>
<message>

View File

@ -3203,6 +3203,76 @@ prøv ein gong til!</translation>
<translation>OK</translation>
</message>
</context>
<context>
<name>RDPodcastFilter</name>
<message>
<source>Filter:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Active Items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDPodcastListModel</name>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Lengd</translation>
</message>
<message>
<source>Feed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Category</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posted By</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SHA1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>at</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>on</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[none]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Never</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDProcess</name>
<message>

View File

@ -3203,6 +3203,76 @@ prøv ein gong til!</translation>
<translation>OK</translation>
</message>
</context>
<context>
<name>RDPodcastFilter</name>
<message>
<source>Filter:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Active Items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDPodcastListModel</name>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Lengd</translation>
</message>
<message>
<source>Feed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Category</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posted By</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SHA1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>at</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>on</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[none]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Never</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDProcess</name>
<message>

View File

@ -3238,6 +3238,76 @@ por favor, tente novamente!</translation>
<translation>OK</translation>
</message>
</context>
<context>
<name>RDPodcastFilter</name>
<message>
<source>Filter:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Active Items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDPodcastListModel</name>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished">Duração</translation>
</message>
<message>
<source>Feed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Category</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posted By</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SHA1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>at</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>on</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[none]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Never</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDProcess</name>
<message>

132
lib/rdpodcastfilter.cpp Normal file
View File

@ -0,0 +1,132 @@
// rdpodcastfilter.cpp
//
// Filter widget for podcasts.
//
// (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 <QList>
#include <QResizeEvent>
#include "rdapplication.h"
#include "rdcart_search_text.h"
#include "rdescape_string.h"
#include "rdpodcast.h"
#include "rdpodcastfilter.h"
RDPodcastFilter::RDPodcastFilter(QWidget *parent)
: RDWidget(parent)
{
//
// Filter Phrase
//
d_filter_edit=new QLineEdit(this);
d_filter_label=new QLabel(d_filter_edit,tr("Filter:"),this);
d_filter_label->setFont(labelFont());
d_filter_label->setAlignment(Qt::AlignVCenter|Qt::AlignRight);
connect(d_filter_edit,SIGNAL(textChanged(const QString &)),
this,SLOT(filterChangedData(const QString &)));
//
// Show Audio Carts Checkbox
//
d_showactive_check=new QCheckBox(this);
d_showactive_label=
new QLabel(d_showactive_check,tr("Only Show Active Items"),this);
d_showactive_label->setFont(labelFont());
d_showactive_label->setAlignment(Qt::AlignVCenter|Qt::AlignLeft);
connect(d_showactive_check,SIGNAL(stateChanged(int)),
this,SLOT(checkChangedData(int)));
}
RDPodcastFilter::~RDPodcastFilter()
{
}
QSize RDPodcastFilter::sizeHint() const
{
return QSize(640,57);
}
QSizePolicy RDPodcastFilter::sizePolicy() const
{
return QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
}
QString RDPodcastFilter::filterSql() const
{
return RDPodcastFilter::searchString(d_filter_edit->text(),
d_showactive_check->isChecked());
}
QString RDPodcastFilter::filterText() const
{
return d_filter_edit->text();
}
void RDPodcastFilter::setFilterText(const QString &str)
{
d_filter_edit->setText(str);
filterChangedData(str);
}
QString RDPodcastFilter::searchString(const QString &filter,bool active_only)
{
QString ret;
if(!filter.trimmed().isEmpty()) {
QString fil=RDEscapeString(filter);
ret+=QString("&&((PODCASTS.ITEM_TITLE like \"%")+fil+"%\")||"+
"(PODCASTS.ITEM_DESCRIPTION like \"%"+fil+"%\")||"+
"(PODCASTS.ITEM_CATEGORY like \"%"+fil+"%\")||"+
"(PODCASTS.ITEM_LINK like \"%"+fil+"%\")||"+
"(PODCASTS.ITEM_COMMENTS like \"%"+fil+"%\")||"+
"(PODCASTS.ITEM_AUTHOR like \"%"+fil+"%\")||"+
"(PODCASTS.ITEM_SOURCE_TEXT like \"%"+fil+"%\")||"+
"(PODCASTS.ITEM_SOURCE_URL like \"%"+fil+"%\"))";
}
if(active_only) {
ret+=QString().sprintf("&&(PODCASTS.STATUS=%d)",RDPodcast::StatusActive);
}
return ret;
}
void RDPodcastFilter::filterChangedData(const QString &str)
{
emit filterChanged(filterSql());
}
void RDPodcastFilter::checkChangedData(int n)
{
filterChangedData("");
}
void RDPodcastFilter::resizeEvent(QResizeEvent *e)
{
d_filter_label->setGeometry(10,3,55,20);
d_filter_edit->setGeometry(70,3,e->size().width()-80,20);
d_showactive_check->setGeometry(75,28,15,15);
d_showactive_label->setGeometry(95,26,size().width()-105,20);
}

64
lib/rdpodcastfilter.h Normal file
View File

@ -0,0 +1,64 @@
// rdpodcastfilter.h
//
// Filter widget for podcasts
//
// (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 RDPODCASTFILTER_H
#define RDPODCASTFILTER_H
#include <QCheckBox>
#include <QLineEdit>
#include <QLabel>
#include <QPushButton>
#include <rdwidget.h>
class RDPodcastFilter : public RDWidget
{
Q_OBJECT;
public:
RDPodcastFilter(QWidget *parent=0);
~RDPodcastFilter();
QSize sizeHint() const;
QSizePolicy sizePolicy() const;
QString filterSql() const;
QString filterText() const;
static QString searchString(const QString &filter,bool active_only);
public slots:
void setFilterText(const QString &str);
signals:
void filterChanged(const QString &where_sql);
private slots:
void filterChangedData(const QString &str);
void checkChangedData(int n);
protected:
void resizeEvent(QResizeEvent *e);
private:
QLineEdit *d_filter_edit;
QLabel *d_filter_label;
QCheckBox *d_showactive_check;
QLabel *d_showactive_label;
};
#endif // RDPODCASTFILTER_H

448
lib/rdpodcastlistmodel.cpp Normal file
View File

@ -0,0 +1,448 @@
// rdpodcastlistmodel.cpp
//
// Data model for Rivendell podcast episodes
//
// (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 "rdapplication.h"
#include "rdconf.h"
#include "rdescape_string.h"
#include "rdpodcast.h"
#include "rdpodcastlistmodel.h"
RDPodcastListModel::RDPodcastListModel(unsigned feed_id,QObject *parent)
: QAbstractTableModel(parent)
{
d_feed_id=feed_id;
d_font_metrics=NULL;
d_bold_font_metrics=NULL;
//
// Column Attributes
//
unsigned left=Qt::AlignLeft|Qt::AlignVCenter;
unsigned center=Qt::AlignCenter;
unsigned right=Qt::AlignRight|Qt::AlignVCenter;
d_headers.push_back(tr("Title")); // 00
d_alignments.push_back(left);
d_headers.push_back(tr("Status")); // 01
d_alignments.push_back(center);
d_headers.push_back(tr("Start")); // 02
d_alignments.push_back(left);
d_headers.push_back(tr("Expiration")); // 03
d_alignments.push_back(left);
d_headers.push_back(tr("Length")); // 04
d_alignments.push_back(right);
d_headers.push_back(tr("Feed")); // 05
d_alignments.push_back(center);
d_headers.push_back(tr("Category")); // 06
d_alignments.push_back(left);
d_headers.push_back(tr("Posted By")); // 07
d_alignments.push_back(left);
d_headers.push_back(tr("SHA1")); // 08
d_alignments.push_back(left);
updateModel();
}
RDPodcastListModel::~RDPodcastListModel()
{
}
QPalette RDPodcastListModel::palette()
{
return d_palette;
}
void RDPodcastListModel::setPalette(const QPalette &pal)
{
d_palette=pal;
}
void RDPodcastListModel::setFont(const QFont &font)
{
d_font=font;
if(d_font_metrics!=NULL) {
delete d_font_metrics;
}
d_font_metrics=new QFontMetrics(d_font);
d_bold_font=font;
d_bold_font.setWeight(QFont::Bold);
if(d_bold_font_metrics!=NULL) {
delete d_bold_font_metrics;
}
d_bold_font_metrics=new QFontMetrics(d_bold_font);
}
int RDPodcastListModel::columnCount(const QModelIndex &parent) const
{
return d_headers.size();
}
int RDPodcastListModel::rowCount(const QModelIndex &parent) const
{
return d_texts.size();
}
QVariant RDPodcastListModel::headerData(int section,Qt::Orientation orient,
int role) const
{
if((orient==Qt::Horizontal)&&(role==Qt::DisplayRole)) {
return d_headers.at(section);
}
return QVariant();
}
QVariant RDPodcastListModel::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:
return d_icons.at(row).at(col);
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;
case Qt::SizeHintRole:
if(col==0) {
return QSize(RD_LISTWIDGET_ITEM_WIDTH_PADDING+
(d_icons.at(row).at(col).value<QPixmap>().width())+
d_bold_font_metrics->
width(d_texts.at(row).at(col).toString()),40);
}
return QSize(RD_LISTWIDGET_ITEM_WIDTH_PADDING+
(d_icons.at(row).at(col).value<QPixmap>().width())+
d_font_metrics->
width(d_texts.at(row).at(col).toString()),40);
default:
break;
}
}
return QVariant();
}
unsigned RDPodcastListModel::castId(const QModelIndex &row) const
{
return d_cast_ids.at(row.row());
}
QModelIndex RDPodcastListModel::addCast(unsigned cast_id)
{
beginInsertRows(QModelIndex(),0,0);
QList<QVariant> list;
for(int i=0;i<columnCount();i++) {
list.push_back(QVariant());
}
d_cast_ids.insert(0,cast_id);
d_texts.insert(0,list);
d_icons.insert(0,list);
updateRowLine(0);
endInsertRows();
return createIndex(0,0);
}
void RDPodcastListModel::removeCast(const QModelIndex &row)
{
beginRemoveRows(QModelIndex(),row.row(),row.row());
d_cast_ids.removeAt(row.row());
d_texts.removeAt(row.row());
d_icons.removeAt(row.row());
endRemoveRows();
}
void RDPodcastListModel::removeCast(unsigned cast_id)
{
for(int i=0;i<d_cast_ids.size();i++) {
if(d_cast_ids.at(i)==cast_id) {
removeCast(createIndex(i,0));
return;
}
}
}
void RDPodcastListModel::refresh(const QModelIndex &row)
{
if(row.row()<d_texts.size()) {
QString sql=sqlFields()+
"where "+
QString().sprintf("PODCASTS.ID=%u",d_cast_ids.at(row.row()));
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 RDPodcastListModel::refresh(unsigned cast_id)
{
for(int i=0;i<d_cast_ids.size();i++) {
if(d_cast_ids.at(i)==cast_id) {
updateRowLine(i);
return;
}
}
}
void RDPodcastListModel::setFilterSql(const QString &sql)
{
if(sql!=d_filter_sql) {
d_filter_sql=sql;
updateModel();
}
}
void RDPodcastListModel::processNotification(RDNotification *notify)
{
unsigned cast_id=0;
RDPodcast *cast=NULL;
if(notify->type()==RDNotification::FeedItemType) {
cast_id=notify->id().toUInt();
cast=new RDPodcast(rda->config(),cast_id);
if(cast->feedId()==d_feed_id) {
switch(notify->action()) {
case RDNotification::AddAction:
addCast(cast_id);
break;
case RDNotification::DeleteAction:
removeCast(cast_id);
break;
case RDNotification::ModifyAction:
refresh(cast_id);
break;
case RDNotification::LastAction:
case RDNotification::NoAction:
break;
}
}
delete cast;
}
}
void RDPodcastListModel::updateModel()
{
QList<QVariant> texts;
RDSqlQuery *q=NULL;
QString sql=sqlFields()+
"where "+
QString().sprintf("PODCASTS.FEED_ID=%u ",d_feed_id)+
d_filter_sql+
" order by PODCASTS.ORIGIN_DATETIME desc";
beginResetModel();
d_cast_ids.clear();
d_texts.clear();
d_icons.clear();
q=new RDSqlQuery(sql);
while(q->next()) {
d_cast_ids.push_back(0);
d_texts.push_back(texts);
d_icons.push_back(texts);
updateRow(d_texts.size()-1,q);
}
delete q;
endResetModel();
}
void RDPodcastListModel::updateRowLine(int line)
{
if(line<d_texts.size()) {
QString sql=sqlFields()+
"where "+
QString().sprintf("PODCASTS.ID=%u",d_cast_ids.at(line));
RDSqlQuery *q=new RDSqlQuery(sql);
if(q->first()) {
updateRow(line,q);
}
delete q;
}
}
void RDPodcastListModel::updateRow(int row,RDSqlQuery *q)
{
QList<QVariant> texts;
QList<QVariant> icons;
// Title
texts.push_back(q->value(2));
if(q->value(13).isNull()) {
icons.push_back(rda->iconEngine()->
applicationIcon(RDIconEngine::RdCastManager,32));
}
else {
icons.push_back(QImage::fromData(q->value(13).toByteArray()).
scaled(32,32,Qt::IgnoreAspectRatio,Qt::SmoothTransformation));
}
// Status
texts.push_back(QVariant());
switch((RDPodcast::Status)q->value(1).toUInt()) {
case RDPodcast::StatusActive:
if(q->value(3).toDateTime()<=QDateTime::currentDateTime()) {
icons.push_back(rda->iconEngine()->listIcon(RDIconEngine::GreenBall));
}
else {
icons.push_back(rda->iconEngine()->listIcon(RDIconEngine::BlueBall));
}
break;
case RDPodcast::StatusPending:
icons.push_back(rda->iconEngine()->listIcon(RDIconEngine::RedBall));
break;
case RDPodcast::StatusExpired:
icons.push_back(rda->iconEngine()->listIcon(RDIconEngine::WhiteBall));
}
// Start
texts.push_back(q->value(3).toDateTime().toString("MM/dd/yyyy hh:mm:ss"));
icons.push_back(QVariant());
// Expiration
if(q->value(4).toDateTime().isValid()) {
texts.push_back(q->value(4).toDateTime().toString("MM/dd/yyyy hh:mm:ss"));
}
else {
texts.push_back(tr("Never"));
}
icons.push_back(QVariant());
// Length
texts.push_back(RDGetTimeLength(q->value(5).toInt(),false,false));
icons.push_back(QVariant());
// Feed Keyname
texts.push_back(q->value(7));
icons.push_back(QVariant());
// Category
texts.push_back(q->value(8));
icons.push_back(QVariant());
// Posted By
if(q->value(9).isNull()) {
texts.push_back(tr("unknown")+" "+tr("at")+" "+
q->value(11).toDateTime().toString("MM/dd/yyyy hh:mm:ss"));
}
else {
texts.push_back(q->value(9).toString()+" "+tr("on")+" "+
q->value(10).toString()+" "+tr("at")+" "+
q->value(11).toDateTime().toString("MM/dd/yyyy hh:mm:ss"));
}
icons.push_back(QVariant());
// SHA1
if(q->value(12).toString().isEmpty()) {
texts.push_back(tr("[none]"));
}
else {
texts.push_back(q->value(12));
}
icons.push_back(QVariant());
d_cast_ids[row]=q->value(0).toUInt();
d_texts[row]=texts;
d_icons[row]=icons;
}
QString RDPodcastListModel::sqlFields() const
{
QString sql=QString("select ")+
"PODCASTS.ID,"+ // 00
"PODCASTS.STATUS,"+ // 01
"PODCASTS.ITEM_TITLE,"+ // 02
"PODCASTS.EFFECTIVE_DATETIME,"+ // 03
"PODCASTS.EXPIRATION_DATETIME,"+ // 04
"PODCASTS.AUDIO_TIME,"+ // 05
"PODCASTS.ITEM_DESCRIPTION,"+ // 06
"FEEDS.KEY_NAME,"+ // 07
"PODCASTS.ITEM_CATEGORY,"+ // 08
"PODCASTS.ORIGIN_LOGIN_NAME,"+ // 09
"PODCASTS.ORIGIN_STATION,"+ // 10
"PODCASTS.ORIGIN_DATETIME,"+ // 11
"PODCASTS.SHA1_HASH,"+ // 12
"FEED_IMAGES.DATA "+ // 13
"from PODCASTS left join FEEDS "+
"on PODCASTS.FEED_ID=FEEDS.ID left join FEED_IMAGES "+
"on PODCASTS.ITEM_IMAGE_ID=FEED_IMAGES.ID ";
return sql;
}

81
lib/rdpodcastlistmodel.h Normal file
View File

@ -0,0 +1,81 @@
// rdpodcastlistmodel.h
//
// Data model for Rivendell podcast episodes
//
// (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 RDPODCASTLISTMODEL_H
#define RDPODCASTLISTMODEL_H
#include <QAbstractTableModel>
#include <QFont>
#include <QList>
#include <QPalette>
#include <rddb.h>
#include <rdnotification.h>
#include <rduser.h>
class RDPodcastListModel : public QAbstractTableModel
{
Q_OBJECT
public:
RDPodcastListModel(unsigned feed_id,QObject *parent=0);
~RDPodcastListModel();
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;
unsigned castId(const QModelIndex &row) const;
QModelIndex addCast(unsigned cast_id);
void removeCast(const QModelIndex &row);
void removeCast(unsigned cast_id);
void refresh(const QModelIndex &row);
void refresh(unsigned cast_id);
public slots:
void setFilterSql(const QString &sql);
void processNotification(RDNotification *notify);
protected:
void updateModel();
void updateRowLine(int line);
void updateRow(int row,RDSqlQuery *q);
QString sqlFields() const;
private:
QPalette d_palette;
QFont d_font;
QFontMetrics *d_font_metrics;
QFont d_bold_font;
QFontMetrics *d_bold_font_metrics;
bool d_include_none;
QList<QVariant> d_headers;
QList<QVariant> d_alignments;
QList<unsigned> d_cast_ids;
QList<QList<QVariant> > d_texts;
QList<QList<QVariant> > d_icons;
unsigned d_feed_id;
QString d_filter_sql;
};
#endif // RDPODCASTLISTMODEL_H

View File

@ -98,7 +98,7 @@ ListFeeds::ListFeeds(QWidget *parent)
connect(list_close_button,SIGNAL(clicked()),this,SLOT(closeData()));
//
// Group List
// Feed List
//
list_feeds_view=new QTableView(this);
list_feeds_view->setSelectionBehavior(QAbstractItemView::SelectRows);

View File

@ -22,7 +22,6 @@
#include <QFileDialog>
#include <QMessageBox>
#include <rdcastsearch.h>
#include <rdconf.h>
#include <rdescape_string.h>
#include <rdlist_logs.h>
@ -32,15 +31,6 @@
#include "globals.h"
#include "list_casts.h"
//
// Icons
//
#include "../icons/blueball.xpm"
#include "../icons/greenball.xpm"
#include "../icons/redball.xpm"
#include "../icons/whiteball.xpm"
#include "../icons/rdcastmanager-32x32.xpm"
ListCasts::ListCasts(unsigned feed_id,QWidget *parent)
: RDDialog(parent)
{
@ -54,21 +44,6 @@ ListCasts::ListCasts(unsigned feed_id,QWidget *parent)
//
setMinimumSize(sizeHint());
//
// Create Icons
//
list_blueball_map=new QPixmap(blueball_xpm);
list_greenball_map=new QPixmap(greenball_xpm);
list_redball_map=new QPixmap(redball_xpm);
list_whiteball_map=new QPixmap(whiteball_xpm);
list_rdcastmanager_32x32_map=new QPixmap(rdcastmanager_32x32_xpm);
//
// Notifications
//
connect(rda->ripc(),SIGNAL(notificationReceived(RDNotification *)),
this,SLOT(notificationReceivedData(RDNotification *)));
//
// The Feed
//
@ -95,63 +70,35 @@ ListCasts::ListCasts(unsigned feed_id,QWidget *parent)
//
// Filter
//
list_filter_edit=new QLineEdit(this);
list_filter_label=
new QLabel(list_filter_edit,tr("Filter:"),this);
list_filter_label->setFont(labelFont());
list_filter_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
connect(list_filter_edit,SIGNAL(textChanged(const QString &)),
this,SLOT(filterChangedData(const QString &)));
list_casts_filter=new RDPodcastFilter(this);
//
// Active Check Box
//
list_active_check=new QCheckBox(this);
list_active_label=
new QLabel(list_active_check,tr("Only Show Active Items"),this);
list_active_label->setFont(labelFont());
list_active_label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
connect(list_active_check,SIGNAL(toggled(bool)),
this,SLOT(activeToggledData(bool)));
//
// Group List
// Podcast List
//
list_casts_label=
new QLabel(list_feed->channelTitle(),this);
list_casts_label->setFont(bigLabelFont());
list_casts_label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
list_casts_view=new RDListView(this);
list_casts_view->setAllColumnsShowFocus(true);
list_casts_view->setItemMargin(5);
list_casts_view->addColumn(tr(" "));
list_casts_view->setColumnAlignment(0,Qt::AlignCenter);
list_casts_view->addColumn(tr("Title"));
list_casts_view->setColumnAlignment(1,Qt::AlignLeft);
list_casts_view->addColumn(tr("Status"));
list_casts_view->setColumnAlignment(2,Qt::AlignCenter);
list_casts_view->addColumn(tr("Start"));
list_casts_view->setColumnAlignment(3,Qt::AlignLeft);
list_casts_view->addColumn(tr("Expiration"));
list_casts_view->setColumnAlignment(4,Qt::AlignCenter);
list_casts_view->addColumn(tr("Length"));
list_casts_view->setColumnAlignment(5,Qt::AlignRight);
list_casts_view->addColumn(tr("Feed"));
list_casts_view->setColumnAlignment(6,Qt::AlignLeft);
list_casts_view->addColumn(tr("Category"));
list_casts_view->setColumnAlignment(7,Qt::AlignCenter);
list_casts_view->addColumn(tr("Posted By"));
list_casts_view->setColumnAlignment(8,Qt::AlignLeft);
list_casts_view->addColumn(tr("SHA1"));
list_casts_view->setColumnAlignment(9,Qt::AlignLeft);
if(!list_feed->isSuperfeed()) {
connect(list_casts_view,
SIGNAL(doubleClicked(Q3ListViewItem *,const QPoint &,int)),
this,
SLOT(doubleClickedData(Q3ListViewItem *,const QPoint &,int)));
}
list_casts_view=new QTableView(this);
list_casts_view->setSelectionBehavior(QAbstractItemView::SelectRows);
list_casts_view->setSelectionMode(QAbstractItemView::SingleSelection);
list_casts_view->setShowGrid(false);
list_casts_view->setSortingEnabled(false);
list_casts_view->setSortingEnabled(false);
list_casts_view->setWordWrap(false);
list_casts_model=new RDPodcastListModel(feed_id,this);
list_casts_model->setFont(font());
list_casts_model->setPalette(palette());
list_casts_view->setModel(list_casts_model);
connect(list_casts_model,SIGNAL(modelReset()),this,SLOT(modelResetData()));
connect(list_casts_model,SIGNAL(rowsInserted(const QModelIndex &,int,int)),
this,SLOT(rowsInsertedData(const QModelIndex &,int,int)));
connect(list_casts_view,SIGNAL(doubleClicked(const QModelIndex &)),
this,SLOT(doubleClickedData(const QModelIndex &)));
connect(list_casts_filter,SIGNAL(filterChanged(const QString &)),
list_casts_model,SLOT(setFilterSql(const QString &)));
connect(rda->ripc(),SIGNAL(notificationReceived(RDNotification *)),
list_casts_model,SLOT(processNotification(RDNotification *)));
//
// Post Cart Button
@ -205,10 +152,11 @@ ListCasts::ListCasts(unsigned feed_id,QWidget *parent)
list_close_button->setText(tr("&Close"));
connect(list_close_button,SIGNAL(clicked()),this,SLOT(closeData()));
RefreshList();
// RefreshList();
connect(rda->ripc(),SIGNAL(userChanged()),this,SLOT(userChangedData()));
modelResetData();
userChangedData();
}
@ -247,14 +195,13 @@ void ListCasts::addCartData()
RDFeed::errorString(err));
return;
}
EditCast *edit_cast=new EditCast(cast_id,this);
edit_cast->exec();
RDListViewItem *item=new RDListViewItem(list_casts_view);
item->setId(cast_id);
RefreshItem(item);
list_casts_view->setSelected(item,true);
list_casts_view->ensureItemVisible(item);
delete edit_cast;
EditCast *d=new EditCast(cast_id,this);
d->exec();
QModelIndex row=list_casts_model->addCast(cast_id);
if(row.isValid()) {
list_casts_view->selectRow(row.row());
}
delete d;
rda->ripc()->sendNotification(RDNotification::FeedType,
RDNotification::ModifyAction,
@ -280,14 +227,13 @@ void ListCasts::addFileData()
RDFeed::errorString(err));
return;
}
EditCast *edit_cast=new EditCast(cast_id,this);
edit_cast->exec();
RDListViewItem *item=new RDListViewItem(list_casts_view);
item->setId(cast_id);
RefreshItem(item);
list_casts_view->setSelected(item,true);
list_casts_view->ensureItemVisible(item);
delete edit_cast;
EditCast *d=new EditCast(cast_id,this);
d->exec();
QModelIndex row=list_casts_model->addCast(cast_id);
if(row.isValid()) {
list_casts_view->selectRow(row.row());
}
delete d;
rda->ripc()->sendNotification(RDNotification::FeedType,
RDNotification::ModifyAction,
@ -303,9 +249,9 @@ void ListCasts::addLogData()
RDFeed::Error err=RDFeed::ErrorOk;
unsigned cast_id=0;
RDListLogs *d=
RDListLogs *lld=
new RDListLogs(&logname,RDLogFilter::UserFilter,"RDCastManager",this);
if(d->exec()) {
if(lld->exec()) {
RDLogModel *model=new RDLogModel(logname,true,this);
model->load();
QTime start_time;
@ -319,11 +265,10 @@ void ListCasts::addLogData()
start_line,end_line,&err))!=0) {
EditCast *cast=new EditCast(cast_id,this);
cast->exec();
RDListViewItem *item=new RDListViewItem(list_casts_view);
item->setId(cast_id);
RefreshItem(item);
list_casts_view->setSelected(item,true);
list_casts_view->ensureItemVisible(item);
QModelIndex row=list_casts_model->addCast(cast_id);
if(row.isValid()) {
list_casts_view->selectRow(row.row());
}
delete cast;
rda->ripc()->sendNotification(RDNotification::FeedType,
RDNotification::ModifyAction,
@ -334,7 +279,7 @@ void ListCasts::addLogData()
else {
QMessageBox::warning(this,"RDCastManager - "+tr("Posting Error"),
RDFeed::errorString(err));
delete d;
delete lld;
delete model;
return;
}
@ -344,41 +289,42 @@ void ListCasts::addLogData()
else { // Render dialog was canceled!
}
}
delete d;
delete lld;
}
void ListCasts::editData()
{
RDListViewItem *item=(RDListViewItem *)list_casts_view->selectedItem();
if(item==NULL) {
QModelIndexList rows=list_casts_view->selectionModel()->selectedRows();
if(rows.size()!=1) {
return;
}
EditCast *edit_cast=new EditCast(item->id(),this);
if(edit_cast->exec()==0) {
RefreshItem(item);
EditCast *d=new EditCast(list_casts_model->castId(rows.first()),this);
if(d->exec()) {
list_casts_model->refresh(rows.first());
rda->ripc()->sendNotification(RDNotification::FeedType,
RDNotification::ModifyAction,
list_feed->keyName());
rda->ripc()->sendNotification(RDNotification::FeedItemType,
RDNotification::ModifyAction,item->id());
RDNotification::ModifyAction,
list_casts_model->castId(rows.first()));
}
delete edit_cast;
delete d;
}
void ListCasts::deleteData()
{
QString sql;
RDSqlQuery *q;
QString err_text;
QModelIndexList rows=list_casts_view->selectionModel()->selectedRows();
RDListViewItem *item=(RDListViewItem *)list_casts_view->selectedItem();
if(item==NULL) {
if(rows.size()!=1) {
return;
}
unsigned cast_id=item->id();
unsigned cast_id=list_casts_model->castId(rows.first());
if(QMessageBox::question(this,"RDCastManager - "+tr("Delete Item"),
tr("Are you sure you want to delete this item?"),
QMessageBox::Yes,QMessageBox::No)==
@ -395,7 +341,7 @@ void ListCasts::deleteData()
qApp->processEvents();
sleep(1);
qApp->processEvents();
RDPodcast *cast=new RDPodcast(rda->config(),item->id());
RDPodcast *cast=new RDPodcast(rda->config(),cast_id);
if(!cast->dropAudio(list_feed,&err_text,rda->config()->logXloadDebugData())) {
if(QMessageBox::warning(this,"RDCastManager - "+tr("Remote Error"),
tr("Unable to drop remote audio!\n")+
@ -409,13 +355,15 @@ void ListCasts::deleteData()
}
pd->setValue(1);
qApp->processEvents();
sql=QString().sprintf("delete from PODCASTS where ID=%u",item->id());
q=new RDSqlQuery(sql);
delete q;
sql=QString().sprintf("update FEEDS set LAST_BUILD_DATETIME=now() \
where ID=%u",list_feed_id);
q=new RDSqlQuery(sql);
delete q;
sql=QString("delete from PODCASTS where ")+
QString().sprintf("ID=%u",cast_id);
RDSqlQuery::apply(sql);
sql=QString("update FEEDS set ")+
"LAST_BUILD_DATETIME=now() "+
"where "+
QString().sprintf("ID=%u",list_feed_id);
RDSqlQuery::apply(sql);
if(!list_feed->postXml()) {
QMessageBox::warning(this,"RDCastManager - "+tr("Remote Error"),
@ -426,7 +374,8 @@ void ListCasts::deleteData()
delete pd;
delete cast;
delete item;
list_casts_model->removeCast(cast_id);
rda->ripc()->sendNotification(RDNotification::FeedType,
RDNotification::ModifyAction,
list_feed->keyName());
@ -435,8 +384,7 @@ void ListCasts::deleteData()
}
void ListCasts::doubleClickedData(Q3ListViewItem *item,const QPoint &pt,
int col)
void ListCasts::doubleClickedData(const QModelIndex &index)
{
editData();
}
@ -457,19 +405,22 @@ void ListCasts::userChangedData()
void ListCasts::filterChangedData(const QString &str)
{
RefreshList();
// RefreshList();
}
void ListCasts::notexpiredToggledData(bool state)
void ListCasts::modelResetData()
{
RefreshList();
list_casts_view->resizeColumnsToContents();
list_casts_view->resizeRowsToContents();
}
void ListCasts::activeToggledData(bool state)
void ListCasts::rowsInsertedData(const QModelIndex &parent,int start,int end)
{
RefreshList();
for(int i=start;i<=end;i++) {
list_casts_view->resizeRowToContents(i);
}
}
@ -491,10 +442,8 @@ void ListCasts::closeData()
void ListCasts::resizeEvent(QResizeEvent *e)
{
list_filter_label->setGeometry(10,10,40,20);
list_filter_edit->setGeometry(55,10,size().width()-65,20);
list_active_check->setGeometry(60,35,15,15);
list_active_label->setGeometry(80,33,200,20);
list_casts_filter->
setGeometry(0,0,size().width(),list_casts_filter->sizeHint().height());
list_casts_label->setGeometry(15,57,size().width()-25,20);
list_casts_view->setGeometry(10,76,size().width()-20,size().height()-146);
list_cart_button->setGeometry(10,size().height()-60,80,50);
@ -504,158 +453,3 @@ void ListCasts::resizeEvent(QResizeEvent *e)
list_delete_button->setGeometry(390,size().height()-60,80,50);
list_close_button->setGeometry(size().width()-90,size().height()-60,80,50);
}
void ListCasts::notificationReceivedData(RDNotification *notify)
{
unsigned cast_id=0;
RDListViewItem *item=NULL;
RDPodcast *cast=NULL;
if(notify->type()==RDNotification::FeedItemType) {
cast_id=notify->id().toUInt();
switch(notify->action()) {
case RDNotification::AddAction:
cast=new RDPodcast(rda->config(),cast_id);
if(cast->keyName()==list_feed->keyName()) {
item=new RDListViewItem(list_casts_view);
item->setId(cast_id);
RefreshItem(item);
delete cast;
return;
}
delete cast;
break;
case RDNotification::DeleteAction:
item=(RDListViewItem *)list_casts_view->firstChild();
while(item!=NULL) {
if(item->id()==(int)cast_id) {
delete item;
return;
}
item=(RDListViewItem *)item->nextSibling();
}
break;
case RDNotification::ModifyAction:
item=(RDListViewItem *)list_casts_view->firstChild();
while(item!=NULL) {
if(item->id()==(int)cast_id) {
RefreshItem(item);
}
item=(RDListViewItem *)item->nextSibling();
}
break;
case RDNotification::LastAction:
case RDNotification::NoAction:
break;
}
}
}
void ListCasts::RefreshList()
{
QString sql;
RDSqlQuery *q;
RDListViewItem *item;
list_casts_view->clear();
sql=QString("select ID from PODCASTS ")+
RDCastSearch(list_feed->keyName(),false,
list_filter_edit->text(),
list_active_check->isChecked())+
" order by ORIGIN_DATETIME";
q=new RDSqlQuery(sql);
while (q->next()) {
item=new RDListViewItem(list_casts_view);
item->setId(q->value(0).toInt());
RefreshItem(item);
}
delete q;
}
void ListCasts::RefreshItem(RDListViewItem *item)
{
QString sql;
RDSqlQuery *q;
sql=QString("select ")+
"PODCASTS.STATUS,"+ // 00
"PODCASTS.ITEM_TITLE,"+ // 01
"PODCASTS.EFFECTIVE_DATETIME,"+ // 02
"PODCASTS.EXPIRATION_DATETIME,"+ // 03
"PODCASTS.AUDIO_TIME,"+ // 04
"PODCASTS.ITEM_DESCRIPTION,"+ // 05
"FEEDS.KEY_NAME,"+ // 06
"PODCASTS.ITEM_CATEGORY,"+ // 07
"PODCASTS.ORIGIN_LOGIN_NAME,"+ // 08
"PODCASTS.ORIGIN_STATION,"+ // 09
"PODCASTS.ORIGIN_DATETIME,"+ // 10
"PODCASTS.SHA1_HASH,"+ // 11
"FEED_IMAGES.DATA "+ // 12
"from PODCASTS left join FEEDS "+
"on PODCASTS.FEED_ID=FEEDS.ID left join FEED_IMAGES "+
"on PODCASTS.ITEM_IMAGE_ID=FEED_IMAGES.ID where "+
QString().sprintf("PODCASTS.ID=%d",item->id());
q=new RDSqlQuery(sql);
if(q->first()) {
if(q->value(12).isNull()) {
item->setPixmap(0,*list_rdcastmanager_32x32_map);
}
else {
QImage img=QImage::fromData(q->value(12).toByteArray());
item->setPixmap(0,QPixmap::fromImage(img.scaled(32,32)));
}
item->setText(1,q->value(1).toString());
switch((RDPodcast::Status)q->value(0).toUInt()) {
case RDPodcast::StatusActive:
if(q->value(2).toDateTime()<=QDateTime::currentDateTime()) {
item->setPixmap(2,*list_greenball_map);
}
else {
item->setPixmap(2,*list_blueball_map);
}
break;
case RDPodcast::StatusPending:
item->setPixmap(2,*list_redball_map);
break;
case RDPodcast::StatusExpired:
item->setPixmap(2,*list_whiteball_map);
break;
}
item->setText(3,q->value(2).toDateTime().toString("MM/dd/yyyy hh:mm:ss"));
if(q->value(3).isNull()) {
item->setText(4,tr("Never"));
}
else {
item->setText(4,q->value(3).toDateTime().toString("MM/dd/yyyy hh:mm:ss"));
}
item->setText(5,RDGetTimeLength(q->value(4).toInt(),false,false));
item->setText(6,q->value(6).toString());
item->setText(7,q->value(7).toString());
if(q->value(8).isNull()) {
item->setText(8,tr("unknown")+" "+tr("at")+" "+
q->value(10).toDateTime().toString("MM/dd/yyyy hh:mm:ss"));
}
else {
item->setText(8,q->value(8).toString()+" "+tr("on")+" "+
q->value(9).toString()+" "+tr("at")+" "+
q->value(10).toDateTime().toString("MM/dd/yyyy hh:mm:ss"));
}
if(q->value(11).toString().isEmpty()) {
item->setText(9,tr("[none]"));
}
else {
item->setText(9,q->value(11).toString());
}
}
delete q;
}

View File

@ -23,11 +23,13 @@
#include <QCheckBox>
#include <QProgressDialog>
#include <QTableView>
#include <rdcut_dialog.h>
#include <rddialog.h>
#include <rdfeed.h>
#include <rdlistviewitem.h>
#include <rdpodcastlistmodel.h>
#include <rdpodcastfilter.h>
#include "render_dialog.h"
@ -46,41 +48,30 @@ class ListCasts : public RDDialog
void addLogData();
void editData();
void deleteData();
void doubleClickedData(Q3ListViewItem *item,const QPoint &pt,int col);
void doubleClickedData(const QModelIndex &index);
void userChangedData();
void filterChangedData(const QString &str);
void notexpiredToggledData(bool state);
void activeToggledData(bool state);
void modelResetData();
void rowsInsertedData(const QModelIndex &parent,int start,int end);
void postProgressChangedData(int step);
void closeData();
void notificationReceivedData(RDNotification *notify);
protected:
void resizeEvent(QResizeEvent *e);
private:
void RefreshList();
void RefreshItem(RDListViewItem *item);
void GetEncoderId();
RDCutDialog *list_cut_dialog;
QLabel *list_casts_label;
RDListView *list_casts_view;
QTableView *list_casts_view;
RDPodcastListModel *list_casts_model;
QPushButton *list_cart_button;
QPushButton *list_file_button;
QPushButton *list_log_button;
QPushButton *list_edit_button;
QPushButton *list_delete_button;
QPushButton *list_close_button;
QPixmap *list_blueball_map;
QPixmap *list_greenball_map;
QPixmap *list_redball_map;
QPixmap *list_whiteball_map;
QPixmap *list_rdcastmanager_32x32_map;
unsigned list_feed_id;
QLabel *list_filter_label;
QLineEdit *list_filter_edit;
QLabel *list_active_label;
QCheckBox *list_active_check;
RDPodcastFilter *list_casts_filter;
QProgressDialog *list_progress_dialog;
RenderDialog *list_render_dialog;
RDFeed *list_feed;

View File

@ -50,9 +50,6 @@ LogDialog::LogDialog(QWidget *parent)
LogDialog::~LogDialog()
{
if(d_model!=NULL) {
delete d_model;
}
}

View File

@ -207,7 +207,7 @@ Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n&gt;=2 &amp;&amp; n&lt;=4) ? 1 :
</message>
<message>
<source>Title</source>
<translation>Název</translation>
<translation type="obsolete">Název</translation>
</message>
<message>
<source>Origin</source>
@ -219,7 +219,7 @@ Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n&gt;=2 &amp;&amp; n&lt;=4) ? 1 :
</message>
<message>
<source>Length</source>
<translation>Délka</translation>
<translation type="obsolete">Délka</translation>
</message>
<message>
<source>Description</source>
@ -227,7 +227,7 @@ Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n&gt;=2 &amp;&amp; n&lt;=4) ? 1 :
</message>
<message>
<source>Category</source>
<translation>Skupina</translation>
<translation type="obsolete">Skupina</translation>
</message>
<message>
<source>Link</source>
@ -279,7 +279,7 @@ Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n&gt;=2 &amp;&amp; n&lt;=4) ? 1 :
</message>
<message>
<source>Remote Error</source>
<translation>Chyba u protistrany</translation>
<translation type="unfinished">Chyba u protistrany</translation>
</message>
<message>
<source>Unable to delete remote audio!
@ -289,7 +289,7 @@ Podcast trotzdem löschen?</translation>
</message>
<message>
<source>Never</source>
<translation>Nikdy</translation>
<translation type="obsolete">Nikdy</translation>
</message>
<message>
<source>File Error</source>
@ -309,11 +309,11 @@ Podcast trotzdem löschen?</translation>
</message>
<message>
<source> </source>
<translation> </translation>
<translation type="obsolete"> </translation>
</message>
<message>
<source>Filter:</source>
<translation>Filtr:</translation>
<translation type="obsolete">Filtr:</translation>
</message>
<message>
<source>Only Show Unexpired Casts</source>
@ -325,7 +325,7 @@ Podcast trotzdem löschen?</translation>
</message>
<message>
<source>Posting Error</source>
<translation>Chyba při vyvěšení</translation>
<translation type="unfinished">Chyba při vyvěšení</translation>
</message>
<message>
<source>Unable to delete remote audio!
@ -334,20 +334,16 @@ Podcast trotzdem löschen?</translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation>Server hlásí: &quot;</translation>
<translation type="unfinished">Server hlásí: &quot;</translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation>Pokračovat v mazání podcastu?</translation>
<translation type="unfinished">Pokračovat v mazání podcastu?</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Feed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Post From
Log</source>
@ -357,34 +353,6 @@ Log</source>
<source>Podcast Item List</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Active Items</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posted By</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>at</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>on</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete Item</source>
<translation type="unfinished"></translation>
@ -397,18 +365,6 @@ Log</source>
<source>Deleting Item...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select Audio File</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SHA1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[none]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to drop remote audio!
</source>
@ -419,7 +375,7 @@ Log</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Status</source>
<source>Select Audio File</source>
<translation type="unfinished"></translation>
</message>
</context>

View File

@ -192,7 +192,7 @@ Car&amp;t/Cut</translation>
</message>
<message>
<source>Title</source>
<translation>Titel</translation>
<translation type="obsolete">Titel</translation>
</message>
<message>
<source>Origin</source>
@ -204,7 +204,7 @@ Car&amp;t/Cut</translation>
</message>
<message>
<source>Length</source>
<translation>Länge</translation>
<translation type="obsolete">Länge</translation>
</message>
<message>
<source>Description</source>
@ -212,7 +212,7 @@ Car&amp;t/Cut</translation>
</message>
<message>
<source>Category</source>
<translation>Kategorie</translation>
<translation type="obsolete">Kategorie</translation>
</message>
<message>
<source>Link</source>
@ -264,7 +264,7 @@ Car&amp;t/Cut</translation>
</message>
<message>
<source>Remote Error</source>
<translation>Fehler an Gegenstelle</translation>
<translation type="unfinished">Fehler an Gegenstelle</translation>
</message>
<message>
<source>Unable to delete remote audio!
@ -274,7 +274,7 @@ Podcast trotzdem löschen?</translation>
</message>
<message>
<source>Never</source>
<translation>Nie</translation>
<translation type="obsolete">Nie</translation>
</message>
<message>
<source>File Error</source>
@ -294,11 +294,11 @@ Podcast trotzdem löschen?</translation>
</message>
<message>
<source> </source>
<translation> </translation>
<translation type="obsolete"> </translation>
</message>
<message>
<source>Filter:</source>
<translation>Filter:</translation>
<translation type="obsolete">Filter:</translation>
</message>
<message>
<source>Only Show Unexpired Casts</source>
@ -310,7 +310,7 @@ Podcast trotzdem löschen?</translation>
</message>
<message>
<source>Posting Error</source>
<translation>Fehler beim posten</translation>
<translation type="unfinished">Fehler beim posten</translation>
</message>
<message>
<source>Unable to delete remote audio!
@ -319,20 +319,16 @@ Podcast trotzdem löschen?</translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation>Der Server meldet: &quot;</translation>
<translation type="unfinished">Der Server meldet: &quot;</translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation>Löschen des Podcasts fortsetzen?</translation>
<translation type="unfinished">Löschen des Podcasts fortsetzen?</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Feed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Post From
Log</source>
@ -342,34 +338,6 @@ Log</source>
<source>Podcast Item List</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Active Items</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posted By</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>at</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>on</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete Item</source>
<translation type="unfinished"></translation>
@ -382,18 +350,6 @@ Log</source>
<source>Deleting Item...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select Audio File</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SHA1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[none]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to drop remote audio!
</source>
@ -404,7 +360,7 @@ Log</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Status</source>
<source>Select Audio File</source>
<translation type="unfinished"></translation>
</message>
</context>

View File

@ -166,7 +166,7 @@ Episodios</translation>
</message>
<message>
<source>Title</source>
<translation>Título</translation>
<translation type="obsolete">Título</translation>
</message>
<message>
<source>Origin</source>
@ -182,7 +182,7 @@ Episodios</translation>
</message>
<message>
<source>Category</source>
<translation>Categoría</translation>
<translation type="obsolete">Categoría</translation>
</message>
<message>
<source>Link</source>
@ -190,7 +190,7 @@ Episodios</translation>
</message>
<message>
<source>Never</source>
<translation>Nunca</translation>
<translation type="obsolete">Nunca</translation>
</message>
<message>
<source>Podcast List</source>
@ -222,7 +222,7 @@ Car&amp;t./Audio</translation>
</message>
<message>
<source>Length</source>
<translation>Longitud</translation>
<translation type="obsolete">Longitud</translation>
</message>
<message>
<source>Subscription
@ -230,13 +230,9 @@ Car&amp;t./Audio</translation>
<translation type="obsolete">&amp;Reporte de
Suscripción</translation>
</message>
<message>
<source> </source>
<translation></translation>
</message>
<message>
<source>Filter:</source>
<translation>Filtro:</translation>
<translation type="obsolete">Filtro:</translation>
</message>
<message>
<source>Only Show Unexpired Casts</source>
@ -248,7 +244,7 @@ Suscripción</translation>
</message>
<message>
<source>Posting Error</source>
<translation>Error de Post</translation>
<translation type="unfinished">Error de Post</translation>
</message>
<message>
<source>Delete Podcast</source>
@ -264,7 +260,7 @@ Suscripción</translation>
</message>
<message>
<source>Remote Error</source>
<translation>Error remoto</translation>
<translation type="unfinished">Error remoto</translation>
</message>
<message>
<source>Unable to delete remote audio!
@ -274,20 +270,16 @@ Suscripción</translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation>El servidor dio el error: &quot;</translation>
<translation type="unfinished">El servidor dio el error: &quot;</translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation> ¿Continuar eliminando podcasts?</translation>
<translation type="unfinished"> ¿Continuar eliminando podcasts?</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Feed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Post From
Log</source>
@ -297,34 +289,6 @@ Log</source>
<source>Podcast Item List</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Active Items</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posted By</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>at</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>on</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete Item</source>
<translation type="unfinished"></translation>
@ -337,18 +301,6 @@ Log</source>
<source>Deleting Item...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select Audio File</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SHA1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[none]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to drop remote audio!
</source>
@ -359,7 +311,7 @@ Log</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Status</source>
<source>Select Audio File</source>
<translation type="unfinished"></translation>
</message>
</context>

View File

@ -128,18 +128,6 @@ Car&amp;t/Cut</source>
<source></source>
<translation></translation>
</message>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Category</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Uploading Audio...</source>
<translation type="unfinished"></translation>
@ -148,42 +136,10 @@ Car&amp;t/Cut</source>
<source>Progress</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Never</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> </source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Filter:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posting Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remote Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Feed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Post From
Log</source>
@ -194,31 +150,7 @@ Log</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Active Items</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posted By</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>at</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>on</source>
<source>Posting Error</source>
<translation type="unfinished"></translation>
</message>
<message>
@ -234,15 +166,7 @@ Log</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select Audio File</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SHA1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[none]</source>
<source>Remote Error</source>
<translation type="unfinished"></translation>
</message>
<message>
@ -250,12 +174,20 @@ Log</source>
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to update remote XML data!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Status</source>
<source>Select Audio File</source>
<translation type="unfinished"></translation>
</message>
</context>

View File

@ -183,11 +183,11 @@ Korg/Ku&amp;tt</translation>
</message>
<message>
<source> </source>
<translation> </translation>
<translation type="obsolete"> </translation>
</message>
<message>
<source>Title</source>
<translation>Tittel</translation>
<translation type="obsolete">Tittel</translation>
</message>
<message>
<source>Origin</source>
@ -199,7 +199,7 @@ Korg/Ku&amp;tt</translation>
</message>
<message>
<source>Length</source>
<translation>Lengd</translation>
<translation type="obsolete">Lengd</translation>
</message>
<message>
<source>Description</source>
@ -207,7 +207,7 @@ Korg/Ku&amp;tt</translation>
</message>
<message>
<source>Category</source>
<translation>Kategori</translation>
<translation type="obsolete">Kategori</translation>
</message>
<message>
<source>Link</source>
@ -273,7 +273,7 @@ Vil du halda fram med å sletta podkasten?</translation>
</message>
<message>
<source>Never</source>
<translation>Aldri</translation>
<translation type="obsolete">Aldri</translation>
</message>
<message>
<source>File Error</source>
@ -291,30 +291,10 @@ Vil du halda fram med å sletta podkasten?</translation>
<source>Unsupported file type!</source>
<translation type="obsolete">Filtypen er ikkje støtta!</translation>
</message>
<message>
<source>Filter:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posting Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Feed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Post From
Log</source>
@ -325,31 +305,7 @@ Log</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Active Items</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posted By</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>at</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>on</source>
<source>Posting Error</source>
<translation type="unfinished"></translation>
</message>
<message>
@ -364,29 +320,25 @@ Log</source>
<source>Deleting Item...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select Audio File</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SHA1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[none]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to drop remote audio!
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to update remote XML data!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Status</source>
<source>Select Audio File</source>
<translation type="unfinished"></translation>
</message>
</context>

View File

@ -183,11 +183,11 @@ Korg/Ku&amp;tt</translation>
</message>
<message>
<source> </source>
<translation> </translation>
<translation type="obsolete"> </translation>
</message>
<message>
<source>Title</source>
<translation>Tittel</translation>
<translation type="obsolete">Tittel</translation>
</message>
<message>
<source>Origin</source>
@ -199,7 +199,7 @@ Korg/Ku&amp;tt</translation>
</message>
<message>
<source>Length</source>
<translation>Lengd</translation>
<translation type="obsolete">Lengd</translation>
</message>
<message>
<source>Description</source>
@ -207,7 +207,7 @@ Korg/Ku&amp;tt</translation>
</message>
<message>
<source>Category</source>
<translation>Kategori</translation>
<translation type="obsolete">Kategori</translation>
</message>
<message>
<source>Link</source>
@ -273,7 +273,7 @@ Vil du halda fram med å sletta podkasten?</translation>
</message>
<message>
<source>Never</source>
<translation>Aldri</translation>
<translation type="obsolete">Aldri</translation>
</message>
<message>
<source>File Error</source>
@ -291,30 +291,10 @@ Vil du halda fram med å sletta podkasten?</translation>
<source>Unsupported file type!</source>
<translation type="obsolete">Filtypen er ikkje støtta!</translation>
</message>
<message>
<source>Filter:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posting Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Feed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Post From
Log</source>
@ -325,31 +305,7 @@ Log</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Active Items</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posted By</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>at</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>on</source>
<source>Posting Error</source>
<translation type="unfinished"></translation>
</message>
<message>
@ -364,29 +320,25 @@ Log</source>
<source>Deleting Item...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select Audio File</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SHA1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[none]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to drop remote audio!
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to update remote XML data!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Status</source>
<source>Select Audio File</source>
<translation type="unfinished"></translation>
</message>
</context>

View File

@ -166,7 +166,7 @@ Episódio</translation>
</message>
<message>
<source>Filter:</source>
<translation>Filtro:</translation>
<translation type="obsolete">Filtro:</translation>
</message>
<message>
<source>Only Show Unexpired Casts</source>
@ -178,12 +178,12 @@ Episódio</translation>
</message>
<message>
<source> </source>
<translation>
<translation type="obsolete">
</translation>
</message>
<message>
<source>Title</source>
<translation>Título</translation>
<translation type="obsolete">Título</translation>
</message>
<message>
<source>Origin</source>
@ -195,7 +195,7 @@ Episódio</translation>
</message>
<message>
<source>Length</source>
<translation>Duração</translation>
<translation type="obsolete">Duração</translation>
</message>
<message>
<source>Description</source>
@ -203,7 +203,7 @@ Episódio</translation>
</message>
<message>
<source>Category</source>
<translation>Categoria</translation>
<translation type="obsolete">Categoria</translation>
</message>
<message>
<source>Link</source>
@ -241,7 +241,7 @@ Assinaturas</translation>
</message>
<message>
<source>Posting Error</source>
<translation>Erro na Postagem</translation>
<translation type="unfinished">Erro na Postagem</translation>
</message>
<message>
<source>Delete Podcast</source>
@ -265,7 +265,7 @@ Assinaturas</translation>
</message>
<message>
<source>Remote Error</source>
<translation>Erro Remoto</translation>
<translation type="unfinished">Erro Remoto</translation>
</message>
<message>
<source>Unable to delete remote audio!
@ -275,24 +275,12 @@ Continuar deletando cast?</translation>
</message>
<message>
<source>Never</source>
<translation>Nunca</translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation type="unfinished"></translation>
<translation type="obsolete">Nunca</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Feed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Post From
Log</source>
@ -302,34 +290,6 @@ Log</source>
<source>Podcast Item List</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Active Items</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posted By</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>at</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>on</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete Item</source>
<translation type="unfinished"></translation>
@ -342,29 +302,25 @@ Log</source>
<source>Deleting Item...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Select Audio File</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>SHA1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[none]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to drop remote audio!
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to update remote XML data!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Status</source>
<source>Select Audio File</source>
<translation type="unfinished"></translation>
</message>
</context>