home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 February / PCWorld_1999-02_cd.bin / temacd / HotKeys / AniBmpEd.pas < prev    next >
Pascal/Delphi Source File  |  1998-06-19  |  12KB  |  422 lines

  1. unit AniBmpEd;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils, Windows, Messages, Classes, Graphics, Controls,
  7.   Forms, ExtCtrls, StdCtrls, Buttons, DsgnIntf, AniIcons, ComCtrls, Dialogs;
  8.  
  9. type
  10.   TAnimatedBitmapsProperty = class( TPropertyEditor )
  11.     function GetAttributes : TPropertyAttributes; override;
  12.     function GetValue: string; override;
  13.     procedure Edit; override;
  14.   end;
  15.  
  16.   TAnimatedBitmapsPropertyEditDlg = class( TForm )
  17.     pnlFrames: TPanel;
  18.     btnOk: TButton;
  19.     btnCancel: TButton;
  20.     lblBitmaps: TLabel;
  21.     lstBitmaps: TListBox;
  22.     pnlInformation: TPanel;
  23.     lblTitle: TLabel;
  24.     edtTitle: TEdit;
  25.     grpSpiffies: TGroupBox;
  26.     lblSpiffies: TLabel;
  27.     edtSpiffies: TEdit;
  28.     udSpiffies: TUpDown;
  29.     lblSpiffies2: TLabel;
  30.     lblExplainSpiffies: TLabel;
  31.     grpPreview: TGroupBox;
  32.     pnlPreview: TPanel;
  33.     edtAuthor: TEdit;
  34.     lblAuthor: TLabel;
  35.     btnStop: TSpeedButton;
  36.     btnPlay: TSpeedButton;
  37.     pnlButtons: TPanel;
  38.     btnLoadFrame: TSpeedButton;
  39.     btnDeleteFrame: TSpeedButton;
  40.     btnSaveFrames: TSpeedButton;
  41.     btnLoadFrames: TSpeedButton;
  42.     dlgOpenFrame: TOpenDialog;
  43.     dlgSaveFrames: TSaveDialog;
  44.     dlgOpenFrames: TOpenDialog;
  45.     pbxIcon: TPaintBox;
  46.     btnUp: TSpeedButton;
  47.     btnDown: TSpeedButton;
  48.     procedure FormCreate( Sender : TObject );
  49.     procedure FormDestroy( Sender : TObject );
  50.     procedure edtSpiffiesKeyPress(Sender: TObject; var Key: Char);
  51.     procedure lstBitmapsMeasureItem(Control: TWinControl; Index: Integer;
  52.       var Height: Integer);
  53.     procedure lstBitmapsDrawItem(Control: TWinControl; Index: Integer;
  54.       Rect: TRect; State: TOwnerDrawState);
  55.     procedure edtTitleChange(Sender: TObject);
  56.     procedure edtAuthorChange(Sender: TObject);
  57.     procedure btnLoadFrameClick(Sender: TObject);
  58.     procedure lstBitmapsClick(Sender: TObject);
  59.     procedure btnPlayClick(Sender: TObject);
  60.     procedure btnStopClick(Sender: TObject);
  61.     procedure btnOkClick(Sender: TObject);
  62.     procedure btnCancelClick(Sender: TObject);
  63.     procedure edtSpiffiesChange(Sender: TObject);
  64.     procedure btnSaveFramesClick(Sender: TObject);
  65.     procedure btnLoadFramesClick(Sender: TObject);
  66.     procedure btnDeleteFrameClick(Sender: TObject);
  67.     procedure pbxIconPaint(Sender: TObject);
  68.     procedure btnDownClick(Sender: TObject);
  69.     procedure btnUpClick(Sender: TObject);
  70.   private
  71.     FIgnore   : Boolean;
  72.     FPropName : string;
  73.     FBitmaps  : TAnimatedBitmaps;
  74.     procedure NewFrame(Sender: TObject; Frame: Integer);
  75.     function  GetDisplayTime(const Index: Integer): String;
  76.     procedure CheckButtons;
  77.     procedure SetBitmaps(Value: TAnimatedBitmaps);
  78.     procedure PaintBitmap(Index: Integer);
  79.     procedure SetFormVars;
  80.   public
  81.     property PropName  : string read FPropName write FPropName;
  82.     property Bitmaps   : TAnimatedBitmaps read FBitmaps write SetBitmaps;
  83.   end;
  84.  
  85.  
  86. implementation
  87.  
  88. {$R *.DFM}
  89. type
  90.   TPanelCracker = class(TPanel);
  91.  
  92. { TAnimatedBitmapsProperty }
  93.  
  94. function TAnimatedBitmapsProperty.GetAttributes: TPropertyAttributes;
  95. begin
  96.   Result := [paDialog];
  97. end;
  98.  
  99. function TAnimatedBitmapsProperty.GetValue : string;
  100. begin
  101.   Result := Format('(%s)', [GetPropType^.Name]);
  102. end;
  103.  
  104. procedure TAnimatedBitmapsProperty.Edit;
  105. var
  106.   Dialog : TAnimatedBitmapsPropertyEditDlg;
  107. begin
  108.   Dialog := TAnimatedBitmapsPropertyEditDlg.Create(Application);
  109.   try
  110.     if PropCount = 1 then
  111.     begin
  112.       Dialog.PropName := TComponent(GetComponent(0)).Owner.Name + '.' +
  113.                          TComponent(GetComponent(0)).Name + '.' + GetName;
  114.       Dialog.Caption :=  Dialog.PropName + ' - ' + Dialog.Caption;
  115.     end;
  116.  
  117.     Dialog.Bitmaps := TAnimatedBitmaps(GetOrdValue);
  118.     if Dialog.ShowModal = mrOK then
  119.      begin
  120.        SetOrdValue(Longint(Dialog.Bitmaps));
  121.        Modified;
  122.      end;
  123.   finally
  124.     Dialog.Free;
  125.   end;
  126. end;
  127.  
  128. { TAnimatedBitmapsPropertyEditDlg }
  129. procedure TAnimatedBitmapsPropertyEditDlg.FormCreate(Sender: TObject);
  130. begin
  131.   FBitmaps := TAnimatedBitmaps.Create;
  132.   FBitmaps.OnNewFrame := NewFrame;
  133. end;
  134.  
  135. procedure TAnimatedBitmapsPropertyEditDlg.FormDestroy(Sender: TObject);
  136. begin
  137.   FBitmaps.Free;
  138. end;
  139.  
  140. function TAnimatedBitmapsPropertyEditDlg.GetDisplayTime(const Index: Integer): String;
  141. begin
  142.   Result := IntToStr(Bitmaps[Index].DisplayTime);
  143.   if Bitmaps[Index].DisplayTime=1 then Result := Result + ' spiffy ' else Result := Result + ' spiffies';
  144. end;
  145.  
  146. procedure TAnimatedBitmapsPropertyEditDlg.SetFormVars;
  147. var
  148.   i : integer;
  149. begin
  150.   edtTitle.Text := Bitmaps.Title;
  151.   edtAuthor.Text := Bitmaps.Author;
  152.   lstBitmaps.Clear;
  153.   for i:=0 to Bitmaps.Count-1 do
  154.    lstBitmaps.Items.Add(IntToStr(Bitmaps[i].DisplayTime));
  155.   CheckButtons;
  156.   PaintBitmap(0);
  157. end;
  158.  
  159. procedure TAnimatedBitmapsPropertyEditDlg.SetBitmaps(Value: TAnimatedBitmaps);
  160. begin
  161.   FBitmaps.Assign(Value);
  162.   SetFormVars;
  163. end;
  164.  
  165. procedure TAnimatedBitmapsPropertyEditDlg.edtSpiffiesKeyPress(Sender: TObject;
  166.   var Key: Char);
  167. begin
  168.   if not (Key in [#8, '0'..'9']) then Key := #0;
  169. end;
  170.  
  171. procedure TAnimatedBitmapsPropertyEditDlg.lstBitmapsMeasureItem(Control: TWinControl;
  172.   Index: Integer; var Height: Integer);
  173. begin
  174.   Height := FBitmaps[Index].Height+2;
  175. end;
  176.  
  177. procedure TAnimatedBitmapsPropertyEditDlg.lstBitmapsDrawItem(Control: TWinControl;
  178.   Index: Integer; Rect: TRect; State: TOwnerDrawState);
  179. begin
  180.   with (Control As TListBox).Canvas do
  181.    begin
  182.      FillRect(Rect);
  183.      if (Index>=0) and (Index<TListBox(Control).Items.Count) then
  184.       begin
  185.         Bitmaps.DrawBitmap((Control As TListBox).Canvas, Rect.left+1, Rect.top+1, Index, (Control As TListBox).Canvas.Brush.Color);
  186.         inc(Rect.left, FBitmaps[Index].Width + 4);
  187.         DrawText(Handle, PChar(GetDisplayTime(Index)), -1, Rect, DT_LEFT or DT_SINGLELINE or DT_VCENTER);
  188.       end;
  189.    end;
  190. end;
  191.  
  192. procedure TAnimatedBitmapsPropertyEditDlg.CheckButtons;
  193. var
  194.   i, iSelCount : integer;
  195.   iLastSelected: integer;
  196.   bUpEnabled,
  197.   bFirst       : Boolean;
  198. begin
  199.   btnSaveFrames.Enabled := lstBitmaps.Items.Count>0;
  200.   btnPlay.Enabled := btnSaveFrames.Enabled and not FBitmaps.Playing;
  201.   btnStop.Enabled := btnSaveFrames.Enabled;
  202.   iSelCount := 0;
  203.   iLastSelected := 0;
  204.   bFirst := True;
  205.   bUpEnabled := False;
  206.   if btnSaveFrames.Enabled then
  207.    for i:=0 to lstBitmaps.Items.Count-1 do
  208.     if lstBitmaps.Selected[i] then
  209.      begin
  210.        if bFirst and (i>0) then bUpEnabled := True;
  211.        bFirst := False;
  212.        iLastSelected := i;
  213.        inc(iSelCount);
  214.        if iSelCount=1 then
  215.         begin
  216.           FIgnore := True;
  217.           edtSpiffies.Text := lstBitmaps.Items[i];
  218.           FIgnore := False;
  219.         end;
  220.      end;
  221.   if iSelCount>0 then
  222.    begin
  223.      edtSpiffies.Enabled := True;
  224.      udSpiffies.Enabled := True;
  225.      btnDeleteFrame.Enabled := True;
  226.      if iSelCount=1 then
  227.       grpSpiffies.Caption := '1 frame selected'
  228.      else if iSelCount=lstBitmaps.Items.Count then
  229.       grpSpiffies.Caption := 'All frames selected'
  230.      else
  231.       grpSpiffies.Caption := IntToStr(iSelCount)+' frames selected';
  232.      btnUp.Enabled := bUpEnabled;
  233.      btnDown.Enabled := iLastSelected<lstBitmaps.Items.Count-1;
  234.    end
  235.   else
  236.    begin
  237.      grpSpiffies.Caption := 'No frames selected';
  238.      edtSpiffies.Enabled := False;
  239.      udSpiffies.Enabled := False;
  240.      btnDeleteFrame.Enabled := False;
  241.      btnUp.Enabled := False;
  242.      btnDown.Enabled := False;
  243.    end;
  244. end;
  245.  
  246. procedure TAnimatedBitmapsPropertyEditDlg.edtTitleChange(Sender: TObject);
  247. begin
  248.   Bitmaps.Title := edtTitle.Text;
  249. end;
  250.  
  251. procedure TAnimatedBitmapsPropertyEditDlg.edtAuthorChange(Sender: TObject);
  252. begin
  253.   Bitmaps.Author := edtAuthor.Text;
  254. end;
  255.  
  256. procedure TAnimatedBitmapsPropertyEditDlg.btnLoadFrameClick(Sender: TObject);
  257. var
  258.   Bitmap : TAnimatedBitmap;
  259.   i      : Integer;
  260. begin
  261.   if dlgOpenFrame.Execute then
  262.    begin
  263.      for i:=0 to dlgOpenFrame.Files.Count-1 do
  264.       begin
  265.         Bitmap := TAnimatedBitmap.Create;
  266.         TBitmap(Bitmap).LoadFromFile(dlgOpenFrame.Files[i]);
  267.         Bitmap.Transparent := True;
  268.         Bitmap.DisplayTime := 10;
  269.         Bitmaps.Add(Bitmap);
  270.         lstBitmaps.Items.Add('10');
  271.         lstBitmaps.ItemIndex := lstBitmaps.Items.Count-1;
  272.       end;
  273.      CheckButtons;
  274.    end;
  275. end;
  276.  
  277. procedure TAnimatedBitmapsPropertyEditDlg.NewFrame(Sender: TObject; Frame: Integer);
  278. begin
  279.   PaintBitmap(Frame);
  280. end;
  281.  
  282. procedure TAnimatedBitmapsPropertyEditDlg.lstBitmapsClick(Sender: TObject);
  283. begin
  284.   CheckButtons;
  285.   if (lstBitmaps.ItemIndex<>-1) and not Bitmaps.Playing then PaintBitmap(lstBitmaps.ItemIndex);
  286. end;
  287.  
  288. procedure TAnimatedBitmapsPropertyEditDlg.btnPlayClick(Sender: TObject);
  289. begin
  290.   btnPlay.Enabled := False;
  291.   btnDeleteFrame.Enabled := False;
  292.   Bitmaps.Play(0);
  293. end;
  294.  
  295. procedure TAnimatedBitmapsPropertyEditDlg.PaintBitmap(Index : Integer);
  296. begin
  297.   if (Index>=0) and (Index<Bitmaps.Count) then
  298.    Bitmaps.DrawBitmap(TPanelCracker(pnlPreview).Canvas, (90 - Bitmaps[Index].Width) div 2, (90 - Bitmaps[Index].Height) div 2, Index, pnlPreview.Color);
  299. end;
  300.  
  301. procedure TAnimatedBitmapsPropertyEditDlg.btnStopClick(Sender: TObject);
  302. begin
  303.   if FBitmaps.Playing then
  304.    begin
  305.      FBitmaps.Stop;
  306.      btnPlay.Enabled := True;
  307.      btnDeleteFrame.Enabled := edtSpiffies.Enabled;
  308.    end;
  309. end;
  310.  
  311. procedure TAnimatedBitmapsPropertyEditDlg.btnOkClick(Sender: TObject);
  312. begin
  313.   btnStopClick(Self);
  314.   ModalResult := mrOk;
  315. end;
  316.  
  317. procedure TAnimatedBitmapsPropertyEditDlg.btnCancelClick(Sender: TObject);
  318. begin
  319.   btnStopClick(Self);
  320.   ModalResult := mrCancel;
  321. end;
  322.  
  323. procedure TAnimatedBitmapsPropertyEditDlg.edtSpiffiesChange(Sender: TObject);
  324. var
  325.   i, NewVal : integer;
  326. begin
  327.   if FIgnore then Exit;
  328.   try
  329.     NewVal := StrToInt(edtSpiffies.Text);
  330.   except
  331.     NewVal := 1;
  332.   end;
  333.   lstBitmaps.Items.BeginUpdate;
  334.   for i:=0 to Bitmaps.Count-1 do
  335.    begin
  336.      if lstBitmaps.Selected[i] then
  337.       begin
  338.         Bitmaps[i].DisplayTime := NewVal;
  339.         lstBitmaps.Items[i] := edtSpiffies.Text;
  340.         lstBitmaps.Selected[i] := True;
  341.       end;
  342.    end;
  343.   lstBitmaps.Items.EndUpdate;
  344. end;
  345.  
  346. procedure TAnimatedBitmapsPropertyEditDlg.btnSaveFramesClick(Sender: TObject);
  347. begin
  348.   if dlgSaveFrames.Execute then
  349.    Bitmaps.SaveToFile(dlgSaveFrames.FileName);
  350. end;
  351.  
  352. procedure TAnimatedBitmapsPropertyEditDlg.btnLoadFramesClick(Sender: TObject);
  353. begin
  354.   if dlgOpenFrames.Execute then
  355.    begin
  356.      btnStopClick(Self);
  357.      Bitmaps.LoadFromFile(dlgOpenFrames.FileName);
  358.      SetFormVars;
  359.    end;
  360. end;
  361.  
  362. procedure TAnimatedBitmapsPropertyEditDlg.btnDeleteFrameClick(Sender: TObject);
  363. var
  364.   i : integer;
  365. begin
  366.   btnStopClick(Self);
  367.   i := 0;
  368.   while i<Bitmaps.Count do
  369.    if lstBitmaps.Selected[i] then
  370.     begin
  371.       lstBitmaps.Items.Delete(I);
  372.       Bitmaps.Delete(I);
  373.     end
  374.    else
  375.     inc(i);
  376.   CheckButtons;
  377. end;
  378.  
  379. procedure TAnimatedBitmapsPropertyEditDlg.pbxIconPaint(Sender: TObject);
  380. begin
  381.   if (lstBitmaps.ItemIndex<>-1) and not Bitmaps.Playing then
  382.    PaintBitmap(lstBitmaps.ItemIndex)
  383.   else
  384.    PaintBitmap(0);
  385. end;
  386.  
  387. procedure TAnimatedBitmapsPropertyEditDlg.btnDownClick(Sender: TObject);
  388. var
  389.   i : integer;
  390. begin
  391.   for i:=lstBitmaps.Items.Count-2 downto 0 do
  392.    begin
  393.      if lstBitmaps.Selected[i] then
  394.       begin
  395.         lstBitmaps.Items.Move(i, i+1);
  396.         Bitmaps.Move(i, i+1);
  397.         lstBitmaps.Selected[i+1] := True;
  398.       end;
  399.    end;
  400.   CheckButtons;
  401. end;
  402.  
  403. procedure TAnimatedBitmapsPropertyEditDlg.btnUpClick(Sender: TObject);
  404. var
  405.   i : integer;
  406. begin
  407.   for i:=1 to lstBitmaps.Items.Count-1 do
  408.    begin
  409.      if lstBitmaps.Selected[i] then
  410.       begin
  411.         lstBitmaps.Items.Move(i, i-1);
  412.         Bitmaps.Move(i, i-1);
  413.         lstBitmaps.Selected[i-1] := True;
  414.       end;
  415.    end;
  416.   CheckButtons;
  417. end;
  418.  
  419. end.
  420.  
  421.  
  422.