ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/gde/GCE/PickWindow.pm
Revision: 1.20
Committed: Tue Apr 4 13:05:51 2006 UTC (18 years, 2 months ago) by elmex
Branch: MAIN
Changes since 1.19: +41 -0 lines
Log Message:
Implemented a different inventory editor, added context menu to picker to
add stuff to the inventory (drag&drop doesn't work yet, will be done later).

File Contents

# User Rev Content
1 elmex 1.1 package GCE::PickWindow;
2    
3     =head1 NAME
4    
5     GCE::PickWindow - the arch picker window class for gce
6    
7     =cut
8    
9     use Gtk2;
10     use Gtk2::Gdk::Keysyms;
11 elmex 1.8 use Gtk2::SimpleMenu;
12 elmex 1.1
13 elmex 1.2 use Crossfire;
14     use Crossfire::MapWidget;
15 elmex 1.1
16 elmex 1.8 use GCE::AttrEdit;
17     use GCE::MapEditor;
18     use GCE::StackView;
19     use GCE::EditAction;
20     use GCE::PickWindow;
21    
22     use GCE::AttrTypemap;
23    
24 elmex 1.16 use GCE::DragHelper;
25    
26 elmex 1.8 use Glib::Object::Subclass
27     Gtk2::Window;
28    
29     use strict;
30 elmex 1.2
31 elmex 1.8 sub INIT_INSTANCE {
32 elmex 1.4 my ($self) = @_;
33 elmex 1.3
34 elmex 1.4 $self->{earchs} = editor_archs ();
35 elmex 1.1
36 elmex 1.2 for (keys %{$self->{earchs}}) {
37 elmex 1.4
38 elmex 1.2 my @a = split /\//;
39     push @{$self->{toplevel_archs}->{$a[0]}}, @{$self->{earchs}->{$_}};
40     }
41    
42 elmex 1.8 $self->set_title ("gce - picker");
43 elmex 1.2
44 elmex 1.8 $self->add (my $hb = Gtk2::VBox->new);
45 elmex 1.4
46 elmex 1.13 $hb->pack_start (my $cb = $self->{combo} = Gtk2::ComboBox->new_text, 0, 1, 0);
47 elmex 1.4
48 elmex 1.13 my $idx = 0;
49 root 1.6 for (sort keys %{$self->{toplevel_archs}}) {
50 elmex 1.5
51 root 1.6 $cb->append_text ($_);
52 elmex 1.13 $self->{arch_txt_to_idx}->{$_} = $idx++;
53 root 1.6 }
54 elmex 1.4
55 root 1.6 $cb->signal_connect (changed => sub {
56 elmex 1.4
57 root 1.6 my $arch = $cb->get_active_text;
58 elmex 1.8 $self->set_selection ($arch);
59 root 1.6 });
60 elmex 1.3
61 root 1.6 $hb->pack_start (my $map = $self->{map} = new Crossfire::MapWidget, 1, 1, 0);
62 elmex 1.16 # XXX: Doesn't work yet beacuse of tooltips
63     # GCE::DragHelper::set_drag_source (
64     # $map, arch => sub { { arch => $self->{last_pick} } }
65     # );
66 elmex 1.4
67 root 1.6 $map->set_size_request (TILESIZE * 10, TILESIZE * 10);
68 elmex 1.4
69 root 1.6 $map->signal_connect (button_press_event => sub {
70 elmex 1.16 my ($map, $event) = @_;
71 elmex 1.4
72 elmex 1.19 if ($event->button == 1) {
73 elmex 1.4
74 root 1.6 my ($mx, $my) = $map->coord ($event->x, $event->y);
75 root 1.7 my $as = $map->get ($mx, $my);
76 elmex 1.2
77 root 1.7 my $arch = $as->[-1]
78 root 1.6 or return;
79    
80 elmex 1.11 if ($arch->{_virtual}) {
81     $arch = $arch->{_virtual};
82     }
83    
84 elmex 1.16 $self->{last_pick} = $arch;
85 elmex 1.15 $::MAINWIN->update_attr_editor ($arch);
86 elmex 1.12 $::MAINWIN->set_edit_tool ('place');
87 elmex 1.20
88     } elsif ($event->button == 3) {
89    
90     my ($mx, $my) = $map->coord ($event->x, $event->y);
91     my $as = $map->get ($mx, $my);
92    
93     my $arch = $as->[-1]
94     or return;
95    
96     if ($arch->{_virtual}) {
97     $arch = $arch->{_virtual};
98     }
99    
100     $self->do_context_menu ($map, $event, $arch);
101 root 1.6 }
102 elmex 1.16
103     #my $d = $map->disable_tooltip;
104    
105     1
106     });
107    
108     $map->signal_connect (button_release_event => sub {
109     my ($map, $event) = @_;
110    
111     # $map->enable_tooltip;
112    
113     1
114 root 1.6 });
115 elmex 1.16
116 elmex 1.8 }
117    
118 elmex 1.20 sub do_context_menu {
119     my ($self, $map, $event, $arch) = @_;
120    
121     my ($x, $y) = $map->coord ($event->x, $event->y);
122    
123     my $menu = Gtk2::Menu->new;
124     foreach my $cm (
125     [
126     "Add to inventory" => sub {
127     # XXX: Move this stuff to AttrEdit someday... propably even do some
128     # archref abstraction
129     my $pa = $::MAINWIN->{attr_edit}->get_arch;
130     push @{$pa->{inventory}}, { _name => $arch->{_name} };
131     $::MAINWIN->{attr_edit}->{change_cb}->()
132     if $::MAINWIN->{attr_edit}->{change_cb};
133     $::MAINWIN->{attr_edit}->update;
134     }
135     ]
136     ) {
137     my $item = Gtk2::MenuItem->new ($cm->[0]);
138     $menu->append ($item);
139     $item->show;
140     $item->signal_connect (activate => $cm->[1]);
141     }
142     $menu->popup (undef, undef, undef, undef, $event->button, $event->time);
143     }
144    
145 elmex 1.8 sub set_selection {
146     my ($self, $arch) = @_;
147    
148     return unless defined $arch;
149    
150 elmex 1.18 return unless defined $self->{toplevel_archs}->{$arch};
151    
152 elmex 1.8 $self->{map}->set_map (
153 elmex 1.18 new_pickmap Crossfire::Map ($self->{toplevel_archs}->{$arch})
154 elmex 1.8 );
155 elmex 1.16 $self->{map}->enable_tooltip;
156 elmex 1.8
157 elmex 1.13 $self->{combo}->set_active ($self->{arch_txt_to_idx}->{$arch});
158    
159 elmex 1.8 $self->{last_selection} = $arch;
160 elmex 1.1 }
161    
162 elmex 1.2
163 elmex 1.1 =head1 AUTHOR
164    
165     Marc Lehmann <schmorp@schmorp.de>
166     http://home.schmorp.de/
167    
168     Robin Redeker <elmex@ta-sa.org>
169     http://www.ta-sa.org/
170    
171     =cut
172     1;