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

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - WxWidgets Interface
  3. #  Title bar control
  4. #
  5. #  Copyright (c) 2004,2005 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. #  $Revision$
  18. #  $Id$
  19. #
  20. #########################################################################
  21. package Interface::Wx::TitleBar;
  22. use strict;
  23. use Wx ':everything';
  24. use Wx::Event qw(EVT_PAINT EVT_TOOL);
  25. use base qw(Wx::Panel);
  26. use Interface::Wx::Utils qw(dataFile);
  27. our (@brushes, $font, $dark, $light);
  28. our ($detachBitmap, $closeBitmap);
  29. sub new {
  30. my ($class, $parent, $title, $no_buttons) = @_;
  31. my $self = $class->SUPER::new($parent, -1, wxDefaultPosition,
  32. wxDefaultSize, wxFULL_REPAINT_ON_RESIZE);
  33. $self->SetBackgroundColour(new Wx::Colour(98, 165, 241));
  34. EVT_PAINT($self, &onPaint);
  35. if (!$font) {
  36. if ($^O eq 'MSWin32') {
  37. $font = new Wx::Font(8, wxDEFAULT, wxNORMAL, wxBOLD, 0, 'Tahoma');
  38. } else {
  39. $font = new Wx::Font(9, wxDEFAULT, wxNORMAL, wxBOLD, 0, 'Nimbus Sans L');
  40. }
  41. }
  42. my $size = $self->{size} = 20;
  43. if (!$no_buttons) {
  44. my $sizer = $self->{sizer} = new Wx::BoxSizer(wxVERTICAL);
  45. my $hsizer = new Wx::BoxSizer(wxHORIZONTAL);
  46. $sizer->Add($hsizer, 1, wxALIGN_RIGHT);
  47. if (!$detachBitmap) {
  48. my $image;
  49. Wx::Image::AddHandler(new Wx::PNGHandler);
  50. $image = Wx::Image->newNameType(dataFile('window.png'), wxBITMAP_TYPE_PNG);
  51. $detachBitmap = new Wx::Bitmap($image);
  52. $image = Wx::Image->newNameType(dataFile('close.png'), wxBITMAP_TYPE_PNG);
  53. $closeBitmap = new Wx::Bitmap($image);
  54. }
  55. my $toolbar = new Wx::ToolBar($self, -1, wxDefaultPosition, [-1, $size],
  56. wxTB_HORIZONTAL | wxNO_BORDER | wxTB_3DBUTTONS | wxTB_FLAT);
  57. $toolbar->SetBackgroundColour(Wx::SystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
  58. $toolbar->SetToolBitmapSize(new Wx::Size(12, 12));
  59. $toolbar->AddTool(1, 'Detach', $detachBitmap, 'Detach tab');
  60. $toolbar->AddTool(2, 'Close', $closeBitmap, 'Close tab');
  61. $toolbar->Realize;
  62. $hsizer->Add($toolbar, 0, wxGROW);
  63. $hsizer->SetItemMinSize($toolbar, $toolbar->GetBestSize->GetWidth, $size);
  64. EVT_TOOL($toolbar, 1, sub {
  65. $self->{onDetach}->($self->{onDetachData}) if ($self->{onDetach});
  66. });
  67. EVT_TOOL($toolbar, 2, sub {
  68. $self->{onClose}->($self->{onCloseData}) if ($self->{onClose});
  69. });
  70. $self->{toolbar} = $toolbar;
  71. $self->SetSizeHints($toolbar->GetBestSize->GetWidth, $size);
  72. $self->SetSizer($sizer);
  73. } else {
  74. $self->SetSizeHints(8, $size);
  75. }
  76. $self->{title} = $title;
  77. createBrushes() if (!@brushes);
  78. if (!$dark) {
  79. $dark = new Wx::Pen(new Wx::Colour(164, 164, 164), 1, wxSOLID);
  80. $light = new Wx::Pen(new Wx::Colour(241, 241, 241), 1, wxSOLID);
  81. }
  82. return $self;
  83. }
  84. sub title {
  85. my $self = shift;
  86. if ($_[0]) {
  87. if ($self->{title} ne $_[0]) {
  88. $self->{title} = $_[0];
  89. $self->Update;
  90. }
  91. } else {
  92. return $self->{title};
  93. }
  94. }
  95. sub onDetach {
  96. my $self = shift;
  97. my $cb = shift;
  98. my $data = shift;
  99. $self->{onDetach} = $cb;
  100. $self->{onDetachData} = $data;
  101. }
  102. sub onClose {
  103. my $self = shift;
  104. my $cb = shift;
  105. my $data = shift;
  106. $self->{onClose} = $cb;
  107. $self->{onCloseData} = $data;
  108. }
  109. #### Private ####
  110. sub max {
  111. return ($_[0] > $_[1]) ? $_[0] : $_[1];
  112. }
  113. sub createBrushes {
  114. my @from = (0, 40, 130);
  115. my @to = (129, 188, 255);
  116. # Create brushes for drawing the gradient
  117. @brushes = ();
  118. for (my $i = 0; $i < 255; $i++) {
  119. my $color = new Wx::Colour(
  120. $from[0] + ($to[0] - $from[0]) / 255 * $i,
  121. $from[1] + ($to[1] - $from[1]) / 255 * $i,
  122. $from[2] + ($to[2] - $from[2]) / 255 * $i
  123. );
  124. my $brush = new Wx::Brush($color, wxSOLID);
  125. push @brushes, $brush;
  126. }
  127. }
  128. sub onPaint {
  129. my $self = shift;
  130. my $dc = new Wx::PaintDC($self);
  131. my $width = $self->GetSize->GetWidth;
  132. if ($self->{toolbar}) {
  133. $width -= $self->{toolbar}->GetSize->GetWidth;
  134. }
  135. eval {
  136. # The app can crash if I don't use eval here.
  137. # Something about "the invocant is not a reference".
  138. # This'll do for now, I just hope it doesn't corrupt memory...
  139. my $x = 0;
  140. my $block = $width / 255;
  141. my $height = $self->GetSize->GetHeight;
  142. $dc->SetPen(wxTRANSPARENT_PEN);
  143. for (my $i = 0; $i < 255; $i++) {
  144. my $x = $block * $i;
  145. $dc->SetBrush($brushes[$i]);
  146. $dc->DrawRectangle($x, 0, $block + 1, $height);
  147. }
  148. $dc->SetBrush(wxTRANSPARENT_BRUSH);
  149. if ($^O eq 'MSWin32') {
  150. $dc->SetPen($dark);
  151. $dc->DrawLine(0, 0, $width, 0);
  152. $dc->DrawLine(0, 0, 0, $height);
  153. #$dc->DrawLine(1, $height - 2, $width - 2, $height - 2);
  154. #$dc->DrawLine($width - 2, 2, $width - 2, $height - 1);
  155. $dc->SetPen($light);
  156. $dc->DrawLine(0, $height - 1, $width - 1, $height - 1);
  157. $dc->DrawLine($width - 1, 1, $width - 1, $height);
  158. #$dc->DrawLine(1, 1, $width - 1, 1);
  159. #$dc->DrawLine(1, 2, 1, $height - 2);
  160. } else {
  161. $dc->SetPen($light);
  162. $dc->DrawLine(0, 0, $width, 0);
  163. $dc->DrawLine(0, 0, 0, $height);
  164. $dc->SetPen($dark);
  165. $dc->DrawLine(0, $height - 1, $width - 1, $height - 1);
  166. $dc->DrawLine($width - 1, 0, $width - 1, $height - 1);
  167. }
  168. $dc->SetFont($font);
  169. $dc->SetTextForeground(wxWHITE);
  170. my (undef, $textHeight) = $dc->GetTextExtent($self->{title}, $font);
  171. $dc->DrawText($self->{title}, 6, $height / 2 - $textHeight / 2);
  172. };
  173. undef $@;
  174. }
  175. 1;