/usr/local/CPAN/Qt/MySortFilterProxyModel.pm
package MySortFilterProxyModel;
use strict;
use warnings;
use QtCore4;
use QtGui4;
# [0]
use QtCore4::isa qw( Qt::SortFilterProxyModel );
sub const() {
return this->{const};
}
sub minDate() {
return this->{minDate};
}
sub maxDate() {
return this->{maxDate};
}
sub setFilterRegExp {
this->{regExp} = shift;
this->invalidateFilter();
}
sub filterRegExp {
return this->{regExp};
}
# [0]
# [0]
sub NEW {
my ( $class, $parent ) = @_;
$class->SUPER::NEW( $parent );
}
# [0]
# [1]
sub setFilterMinimumDate
{
my ($date) = @_;
this->{minDate} = $date;
this->invalidateFilter();
}
# [1]
# [2]
sub setFilterMaximumDate
{
my ($date) = @_;
this->{maxDate} = $date;
this->invalidateFilter();
}
# [2]
# [3]
sub filterAcceptsRow
{
my ($sourceRow, $sourceParent) = @_;
my $index0 = this->sourceModel()->index($sourceRow, 0, $sourceParent);
my $index1 = this->sourceModel()->index($sourceRow, 1, $sourceParent);
my $index2 = this->sourceModel()->index($sourceRow, 2, $sourceParent);
return 1 unless defined this->filterRegExp();
return (this->sourceModel()->data($index0)->toString() =~ this->filterRegExp()
|| sourceModel()->data($index1)->toString() =~ this->filterRegExp()
&& this->dateInRange(this->sourceModel()->data($index2)->toDate()));
}
# [3]
# [4] //! [5]
sub lessThan
{
my ($left, $right) = @_;
my $leftData = this->sourceModel()->data($left);
my $rightData = this->sourceModel()->data($right);
# [4]
# [6]
if ($leftData->type() == Qt::Variant::DateTime()) {
return $leftData->toDateTime() < $rightData->toDateTime();
} else {
my $emailPattern = Qt::RegExp('([\w\.]*@[\w\.]*)');
my $leftString = $leftData->toString();
if($left->column() == 1 && $emailPattern->indexIn($leftString) != -1) {
$leftString = $emailPattern->cap(1);
}
my $rightString = $rightData->toString();
if($right->column() == 1 && $emailPattern->indexIn($rightString) != -1) {
$rightString = $emailPattern->cap(1);
}
return $leftString eq $rightString;
}
}
# [5] //! [6]
# [7]
sub dateInRange
{
my ($date) = @_;
return (!this->minDate->isValid() || $date > this->minDate)
&& (!this->maxDate->isValid() || $date < this->maxDate);
}
# [7]
1;