ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/cf.schmorp.de/gde/GCE/StackView.pm
Revision: 1.3
Committed: Sun Feb 12 18:20:55 2006 UTC (20 years, 8 months ago) by root
Branch: MAIN
Changes since 1.2: +3 -4 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 elmex 1.1 package GCE::StackView;
2    
3     =head1 NAME
4    
5     GCE::StackView - the stack window class for gce
6    
7     =cut
8    
9     use Gtk2;
10     use Gtk2::Gdk::Keysyms;
11     use Gtk2::SimpleMenu;
12    
13     use Crossfire;
14     use Crossfire::MapWidget;
15    
16     use GCE::AttrEdit;
17    
18     use Glib::Object::Subclass Gtk2::VBox;
19    
20     use strict;
21    
22     sub INIT_INSTANCE {
23     my ($self) = @_;
24    
25     $self->pack_start (my $sw = Gtk2::ScrolledWindow->new, 1, 1, 0);
26     $sw->add_with_viewport ($self->{stackbox} = Gtk2::VBox->new);
27     }
28    
29     sub set_stack {
30     my ($self, $mapedit, $stack, $x, $y) = @_;
31    
32     for ($self->{stackbox}->get_children) {
33    
34     $self->{stackbox}->remove ($_);
35     }
36    
37     my $idx = (@$stack - 1);
38    
39 root 1.3 for (reverse @$stack) {
40     my $a = $_->{_virtual} || $_;
41 elmex 1.1
42     # this is awful, is this really the best way?
43     my $pb = new Gtk2::Gdk::Pixbuf 'rgb', 1, 8, TILESIZE, TILESIZE;
44     $pb->fill (0x00000000);
45    
46 root 1.2 $TILE->composite ($pb,
47 elmex 1.1 0, 0,
48     TILESIZE, TILESIZE,
49 root 1.3 - ($a->{_face} % 64) * TILESIZE, - TILESIZE * int $a->{_face} / 64,
50 elmex 1.1 1, 1, 'nearest', 255
51     );
52    
53     $self->{stackbox}->pack_start (my $hb = Gtk2::HBox->new, 0, 0, 0);
54     $hb->pack_start (my $delbtn = Gtk2::Button->new_with_label ('del'), 0, 0, 0);
55     do {
56     my $ownidx = $idx;
57    
58     $delbtn->signal_connect (clicked => sub {
59    
60     my $oldstack = [ @$stack ];
61     splice @$stack, $ownidx, 1;
62     $self->set_stack ($mapedit, $stack, $x, $y);
63    
64     $GCE::MainWindow::MAINWIN->change_map_tile ($mapedit, $x, $y, $stack, $oldstack);
65     });
66     };
67    
68    
69     $hb->pack_start (my $elemhdl = new Gtk2::Button, 0, 0, 0);
70     $elemhdl->add (my $hb2 = Gtk2::HBox->new);
71    
72     $hb2->pack_start (my $img = (new_from_pixbuf Gtk2::Image $pb), 0, 0, 0);
73     $img->set_alignment (0, 0.5);
74    
75     $hb2->pack_start (my $lbl = Gtk2::Label->new ($a->{_name}), 0, 0, 0);
76     $lbl->set_alignment (0, 0.5);
77    
78     $elemhdl->drag_source_set (['button1_mask'], ['move'],
79     { target => 'STRING', flags => [], info => 'TARGET_STRING' }
80     );
81     $elemhdl->drag_dest_set (all => ['move'],
82     { target => 'STRING', flags => [], info => 'TARGET_STRING' }
83     );
84    
85     do {
86     my $ownidx = $idx;
87    
88     $elemhdl->signal_connect (drag_data_get => sub {
89     my ($widget, $context, $data, $info, $time) = @_;
90    
91     $data->set ($data->target, 8, $ownidx);
92     });
93    
94     # XXX: I'm unsure here, do i have to issue a get request?
95     # And what if i get the data twice? Wait for transaction end?
96     $elemhdl->signal_connect (drag_data_received => sub {
97     my ($widget, $context, $wx, $wy, $data, $info, $time) = @_;
98    
99     if (($data->length >= 0) && ($data->format == 8)) {
100    
101     $context->finish (1, 0, $time);
102    
103     my $oldstack = [ @$stack ];
104     my $swapidx = int $data->data;
105    
106     ($stack->[$swapidx], $stack->[$ownidx])
107     = ($stack->[$ownidx], $stack->[$swapidx]);
108    
109     $self->set_stack ($mapedit, $stack, $x, $y);
110     $GCE::MainWindow::MAINWIN->change_map_tile ($mapedit, $x, $y, $stack, $oldstack);
111    
112     return;
113     }
114     $context->finish (0, 0, $time);
115     });
116     };
117     $idx--;
118     }
119     $self->show_all;
120    
121     }
122    
123     =head1 AUTHOR
124    
125     Marc Lehmann <schmorp@schmorp.de>
126     http://home.schmorp.de/
127    
128     Robin Redeker <elmex@ta-sa.org>
129     http://www.ta-sa.org/
130    
131     =cut
132     1;
133