ItemList.pm.svn-base
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:5k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - WxWidgets Interface
  3. #  Player/monster/item list control
  4. #
  5. #  Copyright (c) 2004 OpenKore development team 
  6. #
  7. #  This program is free software; you can redistribute it and/or modify
  8. #  it under the terms of the GNU General Public License as published by
  9. #  the Free Software Foundation; either version 2 of the License, or
  10. #  (at your option) any later version.
  11. #
  12. #  This program is distributed in the hope that it will be useful,
  13. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. #  GNU General Public License for more details.
  16. #
  17. #
  18. #  $Revision$
  19. #  $Id$
  20. #
  21. #########################################################################
  22. package Interface::Wx::ItemList;
  23. use strict;
  24. use Wx ':everything';
  25. use base qw(Wx::ListCtrl);
  26. use Wx::Event qw(EVT_LIST_ITEM_ACTIVATED EVT_LIST_ITEM_RIGHT_CLICK);
  27. use File::Spec;
  28. use Scalar::Util;
  29. sub new {
  30. my $class = shift;
  31. my $parent = shift;
  32. my $self = $class->SUPER::new($parent, 622, wxDefaultPosition, wxDefaultSize,
  33. wxLC_REPORT | wxLC_VIRTUAL | wxLC_SINGLE_SEL);
  34. $self->InsertColumn(0, "Players, Monsters & Items");
  35. $self->SetColumnWidth(0, -2);
  36. EVT_LIST_ITEM_ACTIVATED($self, 622, &_onActivate);
  37. EVT_LIST_ITEM_RIGHT_CLICK($self, 622, &_onRightClick);
  38. return $self;
  39. }
  40. sub DESTROY {
  41. my $lists = $_[0]->{lists};
  42. foreach my $l (@{$lists}) {
  43. my $actorList = $l->{actorList};
  44. $actorList->onAdd()->remove($l->{addID});
  45. $actorList->onRemove()->remove($l->{removeID});
  46. $actorList->onClearBegin()->remove($l->{clearBeginID});
  47. $actorList->onClearEnd()->remove($l->{clearEndID});
  48. }
  49. }
  50. sub init {
  51. my $self = shift;
  52. my @lists;
  53. for (my $i = 0; $i < @_; $i += 2) {
  54. my $actorList = $_[$i];
  55. my $color = $_[$i + 1];
  56. my $addID = $actorList->onAdd()->add($self, &_onAdd);
  57. my $removeID = $actorList->onRemove()->add($self, &_onRemove);
  58. my $clearBeginID = $actorList->onClearBegin()->add($self, &_onClearBegin);
  59. my $clearEndID = $actorList->onClearEnd()->add($self, &_onClearEnd);
  60. push @lists, { actorList => $actorList, color => $color,
  61.        addID => $addID, removeID => $removeID,
  62.        clearBeginID => $clearBeginID, clearEndID => $clearEndID };
  63. }
  64. $self->{lists} = @lists;
  65. $self->{onNameChangeCallbacks} = {};
  66. }
  67. # Set the item count of this list to the total number of actors in the observed ActorLists.
  68. sub _setItemCount {
  69. my ($self) = @_;
  70. my $actorCount = 0;
  71. my $lists = $_[0]->{lists};
  72. foreach my $l (@{$lists}) {
  73. $actorCount += $l->{actorList}->size();
  74. }
  75. $self->SetItemCount($actorCount) if ($actorCount != $self->GetItemCount);
  76. }
  77. # Return the Actor that is associated with index $index in this list.
  78. sub _getActorForIndex {
  79. my ($self, $index) = @_;
  80. my $minIndex = 0;
  81. my $lists = $_[0]->{lists};
  82. foreach my $l (@{$lists}) {
  83. my $actorList = $l->{actorList};
  84. if ($index >= $minIndex && $index < $minIndex + $actorList->size()) {
  85. return $actorList->getItems()->[$index - $minIndex];
  86. } else {
  87. $minIndex += $actorList->size();
  88. }
  89. }
  90. return undef;
  91. }
  92. sub _onAdd {
  93. my ($self, undef, $arg) = @_;
  94. my ($actor, $index) = @{$arg};
  95. my $addr = Scalar::Util::refaddr($actor);
  96. $self->DeleteAllItems;
  97. my $ID = $actor->onNameChange->add($self, &_onNameChange);
  98. $self->{onNameChangeCallbacks}{$addr} = $ID;
  99. $self->_setItemCount();
  100. $self->RefreshItems(0, -1);
  101. }
  102. sub _onRemove {
  103. my ($self, undef, $arg) = @_;
  104. my ($actor, $index) = @{$arg};
  105. my $addr = Scalar::Util::refaddr($actor);
  106. $self->DeleteAllItems;
  107. my $ID = $self->{onNameChangeCallbacks}{$addr};
  108. $actor->onNameChange->remove($ID);
  109. delete $self->{onNameChangeCallbacks}{$addr};
  110. $self->_setItemCount();
  111. $self->RefreshItems(0, -1);
  112. }
  113. sub _onClearBegin {
  114. my ($self, $actorList) = @_;
  115. my $actors = $actorList->getItems();
  116. foreach my $actor (@{$actors}) {
  117. my $addr = Scalar::Util::refaddr($actor);
  118. my $ID = $self->{onNameChangeCallbacks}{$addr};
  119. $actor->onNameChange->remove($ID);
  120. delete $self->{onNameChangeCallbacks}{$addr};
  121. }
  122. }
  123. sub _onClearEnd {
  124. my ($self) = @_;
  125. $self->_setItemCount();
  126. $self->RefreshItems(0, -1);
  127. }
  128. sub _onNameChange {
  129. my ($self) = @_;
  130. $self->_setItemCount();
  131. $self->RefreshItems(0, -1);
  132. }
  133. sub _onActivate {
  134. my ($self, $event) = @_;
  135. if ($self->{activate}) {
  136. my $i = $event->GetIndex;
  137. my $actor = $self->_getActorForIndex($i);
  138. $self->{activate}->($self->{class}, $actor);
  139. }
  140. }
  141. sub _onRightClick {
  142. my ($self, $event) = @_;
  143. my $actor = $self->_getActorForIndex($event->GetIndex);
  144. if ($actor && $self->{rightClick}) {
  145. $self->{rightClick}->($self->{rightClickClass}, $actor, $self, $event);
  146. }
  147. }
  148. sub onActivate {
  149. my $self = shift;
  150. ($self->{activate}, $self->{class}) = @_;
  151. }
  152. sub onRightClick {
  153. my $self = shift;
  154. ($self->{rightClick}, $self->{rightClickClass}) = @_;
  155. }
  156. sub OnGetItemText {
  157. my ($self, $item, $column) = @_;
  158. my $actor = $self->_getActorForIndex($item);
  159. my $acnam = "$actor->{name}";
  160. if ($acnam eq "") {
  161. $acnam = $actor->name;
  162. }
  163. my $info = "$acnam($actor->{pos_to}{x},$actor->{pos_to}{y})";
  164. if ($actor) {
  165. return $info;
  166. } else {
  167. return "";
  168. }
  169. }
  170. sub OnGetItemAttr {
  171. my ($self, $item) = @_;
  172. my $attr = new Wx::ListItemAttr;
  173. my $actor = $self->_getActorForIndex($item);
  174. if ($actor) {
  175. foreach my $l (@{$self->{lists}}) {
  176. my $actorList = $l->{actorList};
  177. if ($actorList->getByID($actor->{ID})) {
  178. $attr->SetTextColour($l->{color}) if ($l->{color});
  179. last;
  180. }
  181. }
  182. }
  183. return $attr;
  184. }
  185. sub OnGetItemImage {
  186. return 0;
  187. }
  188. 1;