~alexandre-philippe/twatch/trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package ScrollLine;
use strict;
use Data::Dumper;

use constant VERSION => 0.1;
use constant LEFT => 0;
use constant RIGHT => 1;

sub new
{
	my ($text, $scrollSize, $direction) = @_;
	die("Text empty") if(!defined($text) || $text eq '' || length($text) == 0);
	die ("Unknown scroll size") if(!defined($scrollSize) || $scrollSize eq '' || length($scrollSize) == 0);

	my $self = {};
	$self->{_TEXT}=$text;
	$self->{_STEP}=1;
	$self->{_STARTPOS}=0;
	if($scrollSize < length($text))
	{
		$self->{_SCROLLSIZE}=length($text);
	}
	else
	{
		$self->{_SCROLLSIZE}=$scrollSize;
		my $l=$scrollSize - length($text);
		for(my $i=0; $i<$l;$i++)
		{
			$self->{_TEXT}.=' ';
		}
	}

	if(!defined($direction) || $direction eq '')
	{
		$self->{_DIRECTION}=0;
	}
	else
	{
		$self->{_DIRECTION}=$direction;
	}
	bless($self);
	return $self;
}

sub changeDirection
{
	my ($self) = @_;
	if($self->{_DIRECTION} == LEFT)
	{
		$self->{_DIRECTION}=RIGHT;
	}
	else
	{
		$self->{_DIRECTION}=LEFT;
	}
}

sub setStep
{
	my ($self, $step) = @_;
	
	return if(!defined($step) || $step eq '' || $step !~ m/\d+$/);
	$self->{_STEP}=$step;
}

sub scroll
{
	my ($self) = @_;
	
	if($self->{_DIRECTION} == RIGHT)
	{
		return $self->_moveRight();
	}
	else
	{
		return $self->_moveLeft();
	}
}

sub _moveLeft
{
	my ($self) = @_;
	my $startPos=$self->{_STARTPOS};
	my $text=$self->{_TEXT};
	my $len=$self->{_SCROLLSIZE};

	my $t = substr($text, $startPos, $len-$startPos); 
	$t .= substr($text, 0, $startPos);
	$self->{_STARTPOS}+=$self->{_STEP};
	$self->{_STARTPOS}=0 if($self->{_STARTPOS} > $len);

	return $t;
}

sub _moveRight
{
	my ($self) = @_;
	my $startPos=$self->{_STARTPOS};
	my $text=$self->{_TEXT};
	my $len=$self->{_SCROLLSIZE};;

	my $t = substr($text, $startPos, $len-$startPos); 
	$t .= substr($text, 0, $startPos);
	$self->{_STARTPOS}-=$self->{_STEP};
	$self->{_STARTPOS}=length($text) if($self->{_STARTPOS} < 0);
	return $t;
	
}

1;