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

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - WxWidgets Interface
  3. #  Dock 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::Dock;
  23. use strict;
  24. use Wx ':everything';
  25. use Wx::Event qw(EVT_BUTTON EVT_CLOSE EVT_TIMER);
  26. use Interface::Wx::TitleBar;
  27. use base qw(Wx::Panel);
  28. use File::Spec;
  29. sub new {
  30. my $class = shift;
  31. my $parent = shift;
  32. my $id = shift;
  33. my $title = shift;
  34. my $self = $class->SUPER::new($parent, $id);
  35. my $sizer = $self->{sizer} = new Wx::BoxSizer(wxVERTICAL);
  36. my $titleBar = $self->{titleBar} = new Interface::Wx::TitleBar($self, $title);
  37. $titleBar->onDetach(&detach, $self);
  38. $titleBar->onClose(&close, $self);
  39. $titleBar->Fit;
  40. $sizer->Add($titleBar, 0, wxGROW);
  41. $self->SetSizerAndFit($sizer);
  42. return $self;
  43. }
  44. sub attach {
  45. my $self = shift;
  46. if ($self->{dialog}) {
  47. if ($self->{control}) {
  48. $self->{control}->Reparent($self);
  49. $self->{sizer}->Add($self->{control}, 1, wxGROW);
  50. }
  51. $self->{dialog}->Show(0);
  52. $self->{dialog}->Destroy;
  53. delete $self->{dialog};
  54. $self->Layout;
  55. }
  56. $self->{showFunc}->($self->{showFuncSelf}, $self, $self->{showFuncData}) if ($self->{showFunc});
  57. $self->Show(1);
  58. }
  59. sub detach {
  60. my $self = shift;
  61. $self->close;
  62. if (!$self->{dialog}) {
  63. my $dialog;
  64. if ($^O eq 'MSWin32') {
  65. $dialog = new Wx::MiniFrame($self->{frame}, -1, $self->{titleBar}->title);
  66. } else {
  67. $dialog = new Wx::Dialog($self->{frame}, -1, $self->{titleBar}->title);
  68. }
  69. if ($self->{control}) {
  70. $self->{control}->Reparent($dialog);
  71. $self->{sizer}->Detach($self->{control});
  72. $self->Layout;
  73. }
  74. $self->{dialog} = $dialog;
  75. $dialog->Show(1);
  76. $self->Fit;
  77. EVT_CLOSE($dialog, sub { $self->attach; });
  78. } else {
  79. $self->{dialog}->Show(0);
  80. $self->{dialog}->Destroy;
  81. delete $self->{dialog};
  82. $self->Layout;
  83. }
  84. }
  85. sub close {
  86. my $self = shift;
  87. if ($self->{hideFunc}) {
  88. $self->{hideFunc}->($self->{hideFuncSelf}, $self, $self->{hideFuncData});
  89. } else {
  90. $self->Show(0);
  91. }
  92. }
  93. sub Fit {
  94. my $self = shift;
  95. if ($self->{dialog}) {
  96. if ($self->{control}) {
  97. my ($w, $h);
  98. if ($self->{control}->can('mapSize')) {
  99. ($w, $h) = $self->{control}->mapSize;
  100. } else {
  101. my $size = $self->{control}->GetBestSize;
  102. $w = $size->GetWidth;
  103. $h = $size->GetHeight;
  104. }
  105. my @timers;
  106. my $set = sub {
  107. if ($self->{dialog}) {
  108. $self->{dialog}->SetClientSize($w, $h);
  109. }
  110. foreach (@timers) {
  111. $_->Stop();
  112. }
  113. };
  114. $set->();
  115. # We set the size again after some time, to work around a bug
  116. foreach (10, 100, 500, 1000) {
  117. my $timer = new Wx::Timer($self->{dialog}, $_);
  118. EVT_TIMER($self->{dialog}, $_, $set);
  119. push @timers, $timer;
  120. $timer->Start($_, 1);
  121. }
  122. }
  123. } else {
  124. $self->Layout;
  125. }
  126. }
  127. sub title {
  128. my $self = shift;
  129. if ($self->{dialog}) {
  130. if ($_[0]) {
  131. my $oldTitle = $self->{titleBar}->title;
  132. if ($oldTitle ne $_[0]) {
  133. $self->{titleBar}->title($_[0]);
  134. $self->{dialog}->SetTitle($_[0]);
  135. }
  136. } else {
  137. return $self->{titleBar}->title;
  138. }
  139. } else {
  140. return $self->{titleBar}->title(@_);
  141. }
  142. }
  143. sub set {
  144. my $self = shift;
  145. my $control = shift;
  146. if ($self->{control}) {
  147. $self->{sizer}->Detach($self->{control});
  148. $self->{control}->Destroy;
  149. }
  150. $self->{control} = $control;
  151. $self->{sizer}->Add($control, 1, wxGROW);
  152. }
  153. sub setParentFrame {
  154. my $self = shift;
  155. $self->{frame} = shift;
  156. }
  157. sub setShowFunc {
  158. my $self = shift;
  159. $self->{showFuncSelf} = shift;
  160. $self->{showFunc} = shift;
  161. $self->{showFuncData} = shift;
  162. }
  163. sub setHideFunc {
  164. my $self = shift;
  165. $self->{hideFuncSelf} = shift;
  166. $self->{hideFunc} = shift;
  167. $self->{hideFuncData} = shift;
  168. }
  169. 1;