--- oup/current/Tools/MetaEditor.pas 2007/06/29 12:38:24 233 +++ oup/current/Tools/MetaEditor.pas 2007/07/14 23:12:26 240 @@ -30,6 +30,9 @@ type VTHPopup: TVTHeaderPopupMenu; btn_export: TButton; btn_import: TButton; + vst_popup: TPopupMenu; + vst_newRoot: TMenuItem; + vst_setRoot: TMenuItem; procedure FormCreate(Sender: TObject); procedure VSTInitChildren(Sender: TBaseVirtualTree; Node: PVirtualNode; var ChildCount: Cardinal); @@ -44,16 +47,22 @@ type procedure VSTPaintText(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType); + procedure VSTGetPopupMenu(Sender: TBaseVirtualTree; Node: PVirtualNode; + Column: TColumnIndex; const P: TPoint; var AskParent: Boolean; + var PopupMenu: TPopupMenu); + procedure vst_setRootClick(Sender: TObject); + procedure vst_newRootClick(Sender: TObject); private root: TTreeElement; procedure NewCon(ID: Integer); public + procedure SetRoot(TreeElem: TTreeElement); end; implementation {$R *.dfm} -uses _MetaManager, _MetaTypes, ConnectionManager, Data, _FileTypes; +uses _MetaManager, _MetaTypes, ConnectionManager, Data, _FileTypes, Main; type PNodeData = ^TNodeData; @@ -75,30 +84,33 @@ end; procedure TForm_Meta.NewCon(ID: Integer); +begin + if ID >= 0 then + SetRoot(ConManager.Connection[FConnectionID].MetaData.Root); +end; + + +procedure TForm_Meta.SetRoot(TreeElem: TTreeElement); var i: Integer; data: TNodeData; node: PVirtualNode; - Meta: TMetaManager; - root: TTreeElement; begin - if ID >= 0 then + if FConnectionID <> TreeElem.ConnectionID then + SelectConnection(TreeElem.ConnectionID); + root := TreeElem; + VST.Clear; + VST.BeginUpdate; + for i := 0 to root.ChildCount - 1 do begin - //VST - VST.Clear; - VST.BeginUpdate; - root := ConManager.Connection[FConnectionID].MetaData.Root; - for i := 0 to root.ChildCount - 1 do - begin - data.Field := root.Child[i]; - node := AddVSTEntry(VST, nil, data); + data.Field := root.Child[i]; + node := AddVSTEntry(VST, nil, data); + if data.Field.ChildCount > 0 then VST.HasChildren[node] := True; - end; - VST.EndUpdate; end; + VST.EndUpdate; end; - procedure TForm_Meta.VSTInitChildren(Sender: TBaseVirtualTree; Node: PVirtualNode; var ChildCount: Cardinal); var @@ -110,9 +122,6 @@ var begin data := Sender.GetNodeData(node); Meta := ConManager.Connection[ConnectionID].MetaData; - if data.Field is TExtension then - if TExtension(data.Field).ChildCount = 0 then - TExtension(data.Field).InitList; if data.Field.ChildCount > 0 then begin @@ -128,21 +137,36 @@ begin end; + procedure TForm_Meta.VSTFocusChanged(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex); var data: PNodeData; + ffile: TFile; +//******************************************************************* + fs: TFileStream; +//******************************************************************* begin data := Sender.GetNodeData(Node); + ffile := nil; if data.Field is TFile then + ffile := TFile(data.Field); + if data.Field is TDatLink then + if Assigned(TDatLink(data.Field).TargetFile) then + ffile := TFile(TDatLink(data.Field).TargetFile); + if Assigned(ffile) then begin - TFile(data.Field).InitEditor; - if Assigned(TFile(data.Field).Editor) then + if Assigned(ffile.Editor) then begin - TFile(data.Field).Editor.Align := alClient; - tab_meta.InsertControl(TFile(data.Field).Editor); - TFile(data.Field).Opened := True; + ffile.Editor.Align := alClient; + tab_meta.InsertControl(ffile.Editor); + ffile.Opened := True; end; +//******************************************************************* + fs := TFileStream.Create('C:\Spiele\Oni\GameDataFolder\tests\'+IntToStr(ffile.FileInfo.ID)+'_recreated.hex', fmCreate); + ffile.ReCreateFile(fs); + fs.Free; +//******************************************************************* end; end; @@ -157,7 +181,6 @@ begin data := Sender.GetNodeData(NewNode); if data.Field is TFile then begin - TFile(data.Field).InitEditor; if Assigned(TFile(data.Field).Editor) then Allowed := not TFile(data.Field).Opened else @@ -204,6 +227,11 @@ begin if Data.Field is TFile then CellText := IntToStr(TFile(Data.Field).FileInfo.ID); end; + 3: + begin + if Data.Field is TDataField then + CellText := TDataField(Data.Field).ValueAsString; + end; end; end; end; @@ -235,6 +263,51 @@ end; +procedure TForm_Meta.VSTGetPopupMenu(Sender: TBaseVirtualTree; + Node: PVirtualNode; Column: TColumnIndex; const P: TPoint; + var AskParent: Boolean; var PopupMenu: TPopupMenu); +var + data: PNodeData; +begin + inherited; + AskParent := False; + if Assigned(Node) then + begin + Sender.Selected[Node] := True; + Sender.FocusedNode := Node; + data := Sender.GetNodeData(Node); + if Column = 0 then + begin + if TTreeElement(data.Field).GetChildCount > 0 then + PopupMenu := vst_popup + else + PopupMenu := nil; + end; + end; +end; + +procedure TForm_Meta.vst_newRootClick(Sender: TObject); +var + data: PNodeData; + form: TForm_BaseTemplate; +begin + inherited; + data := VST.GetNodeData(VST.FocusedNode); + form := nil; + form := Form_Main.open_child('meta'); + if form is TForm_Meta then + TForm_Meta(form).SetRoot(data.Field); +end; + +procedure TForm_Meta.vst_setRootClick(Sender: TObject); +var + data: PNodeData; +begin + inherited; + data := VST.GetNodeData(VST.FocusedNode); + SetRoot(data.Field); +end; + procedure TForm_Meta.FormClose(Sender: TObject; var Action: TCloseAction); begin // Meta.Free;