ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/gde/GCE/PickWindow.pm
Revision: 1.28
Committed: Tue Nov 3 13:52:06 2009 UTC (14 years, 6 months ago) by root
Branch: MAIN
CVS Tags: HEAD
Changes since 1.27: +5 -5 lines
Log Message:
minor stuff

File Contents

# Content
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 use Gtk2::SimpleMenu;
12
13 use Deliantra;
14 use Deliantra::MapWidget;
15
16 use GCE::AttrEdit;
17 use GCE::MapEditor;
18 use GCE::StackView;
19 use GCE::EditAction;
20 use GCE::PickWindow;
21 use GCE::Util;
22
23 use GCE::DragHelper;
24
25 use Glib::Object::Subclass
26 Gtk2::Window;
27
28 use common::sense;
29
30 sub INIT_INSTANCE {
31 my ($self) = @_;
32
33 $self->{earchs} = editor_archs;
34
35 while (my ($k, $v) = each %{ $self->{earchs} }) {
36 $k =~ /^([^\/]+)/ or next;
37 push @{$self->{toplevel_archs}->{$1}}, @$v;
38 }
39
40 $self->set_title ("gce - picker");
41
42 $self->add (my $hb = Gtk2::VBox->new);
43
44 $hb->pack_start (my $cb = $self->{combo} = Gtk2::ComboBox->new_text, 0, 1, 0);
45
46 my $idx = 0;
47 for (sort keys %{$self->{toplevel_archs}}) {
48
49 $cb->append_text ($_);
50 $self->{arch_txt_to_idx}->{$_} = $idx++;
51 }
52
53 $cb->signal_connect (changed => sub {
54
55 my $arch = $cb->get_active_text;
56 $self->set_selection ($arch);
57 });
58
59 $hb->pack_start (my $map = $self->{map} = new Deliantra::MapWidget, 1, 1, 0);
60 # XXX: Doesn't work yet beacuse of tooltips
61 # GCE::DragHelper::set_drag_source (
62 # $map, arch => sub { { arch => $self->{last_pick} } }
63 # );
64
65 $map->set_size_request (TILESIZE * 10, TILESIZE * 10);
66
67 $map->signal_connect (button_press_event => sub {
68 my ($map, $event) = @_;
69
70 if ($event->button == 1) {
71
72 my ($mx, $my) = $map->coord ($event->x, $event->y);
73 my $as = $map->get ($mx, $my);
74
75 my $arch = $as->[-1]
76 or return;
77
78 my ($x, $y, $arch, $as) = devirtualize ($map, $mx, $my, $arch, $as);
79
80 $self->{last_pick} = $arch;
81
82 my $ar = GCE::ArchRef->new (arch => $arch, source => 'picker');
83 $::MAINWIN->update_attr_editor ($ar);
84
85 } elsif ($event->button == 3) {
86
87 my ($mx, $my) = $map->coord ($event->x, $event->y);
88 my $as = $map->get ($mx, $my);
89
90 my $arch = $as->[-1]
91 or return;
92
93 if ($arch->{_virtual}) {
94 $arch = $arch->{_virtual};
95 }
96
97 $self->do_context_menu ($map, $event, $arch);
98 }
99
100 #my $d = $map->disable_tooltip;
101
102 1
103 });
104
105 $map->signal_connect (button_release_event => sub {
106 my ($map, $event) = @_;
107
108 # $map->enable_tooltip;
109
110 1
111 });
112
113 }
114
115 sub do_context_menu {
116 my ($self, $map, $event, $arch) = @_;
117
118 my ($x, $y) = $map->coord ($event->x, $event->y);
119
120 my $menu = Gtk2::Menu->new;
121 foreach my $cm (
122 [
123 "Add to inventory" => sub {
124 my $pa = $::MAINWIN->{attr_edit}->get_arch;
125 $pa->add_inv ({ _name => $arch->{_name} }) if $pa;
126 }
127 ]
128 ) {
129 my $item = Gtk2::MenuItem->new ($cm->[0]);
130 $menu->append ($item);
131 $item->show;
132 $item->signal_connect (activate => $cm->[1]);
133 }
134 $menu->popup (undef, undef, undef, undef, $event->button, $event->time);
135 }
136
137 sub set_selection {
138 my ($self, $arch) = @_;
139
140 return unless defined $arch;
141
142 return unless defined $self->{toplevel_archs}->{$arch};
143
144 $self->{map}->set_map (
145 new_pickmap Deliantra::Map ($self->{toplevel_archs}->{$arch})
146 );
147 $self->{map}->enable_tooltip;
148
149 $self->{combo}->set_active ($self->{arch_txt_to_idx}->{$arch});
150
151 $self->{last_selection} = $arch;
152 }
153
154
155 =head1 AUTHOR
156
157 Marc Lehmann <schmorp@schmorp.de>
158 http://home.schmorp.de/
159
160 Robin Redeker <elmex@ta-sa.org>
161 http://www.ta-sa.org/
162
163 =cut
164 1;