FmXCollectionEditor.pas 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. //
  2. // The graphics engine GLScene
  3. //
  4. unit FmXCollectionEditor;
  5. (* Edits a TXCollection *)
  6. interface
  7. {$I Stage.Defines.inc}
  8. uses
  9. System.Classes,
  10. System.SysUtils,
  11. System.Actions,
  12. System.ImageList,
  13. VCL.Forms,
  14. VCL.ImgList,
  15. VCL.Controls,
  16. VCL.ActnList,
  17. VCL.Menus,
  18. VCL.ComCtrls,
  19. VCL.ToolWin,
  20. VCL.Dialogs,
  21. DesignIntf,
  22. Stage.Strings,
  23. GLS.Scene,
  24. GLS.Behaviours,
  25. GLS.MaterialEx,
  26. GLS.XCollection;
  27. type
  28. TXCollectionEditorForm = class(TForm)
  29. ListView: TListView;
  30. PMListView: TPopupMenu;
  31. ActionList: TActionList;
  32. ACRemove: TAction;
  33. ACMoveUp: TAction;
  34. ACMoveDown: TAction;
  35. ImageList: TImageList;
  36. MIAdd: TMenuItem;
  37. N1: TMenuItem;
  38. N2: TMenuItem;
  39. Moveup1: TMenuItem;
  40. Movedown1: TMenuItem;
  41. ToolBar1: TToolBar;
  42. TBAdd: TToolButton;
  43. ToolButton2: TToolButton;
  44. ToolButton3: TToolButton;
  45. ToolButton4: TToolButton;
  46. ToolButton5: TToolButton;
  47. ToolButton6: TToolButton;
  48. PMToolBar: TPopupMenu;
  49. procedure TBAddClick(Sender: TObject);
  50. procedure ListViewChange(Sender: TObject; Item: TListItem;
  51. Change: TItemChange);
  52. procedure ACRemoveExecute(Sender: TObject);
  53. procedure ACMoveUpExecute(Sender: TObject);
  54. procedure ACMoveDownExecute(Sender: TObject);
  55. procedure PMToolBarPopup(Sender: TObject);
  56. procedure PMListViewPopup(Sender: TObject);
  57. procedure FormCreate(Sender: TObject);
  58. procedure FormDestroy(Sender: TObject);
  59. procedure FormHide(Sender: TObject);
  60. private
  61. FXCollection: TXCollection;
  62. // ownerComponent : TComponent;
  63. FDesigner: IDesigner;
  64. UpdatingListView: Boolean;
  65. procedure PrepareListView;
  66. procedure PrepareXCollectionItemPopup(parent: TMenuItem);
  67. procedure OnAddXCollectionItemClick(Sender: TObject);
  68. procedure OnNameChanged(Sender: TObject);
  69. procedure OnXCollectionDestroyed(Sender: TObject);
  70. protected
  71. procedure Notification(AComponent: TComponent;
  72. Operation: TOperation); override;
  73. public
  74. procedure SetXCollection(aXCollection: TXCollection; designer: IDesigner );
  75. end;
  76. function XCollectionEditorForm: TXCollectionEditorForm;
  77. procedure ReleaseXCollectionEditor;
  78. // ------------------------------------------------------------------
  79. implementation
  80. // ------------------------------------------------------------------
  81. {$R *.dfm}
  82. var
  83. vXCollectionEditorForm: TXCollectionEditorForm;
  84. function XCollectionEditorForm: TXCollectionEditorForm;
  85. begin
  86. if not Assigned(vXCollectionEditorForm) then
  87. vXCollectionEditorForm := TXCollectionEditorForm.Create(nil);
  88. Result := vXCollectionEditorForm;
  89. end;
  90. procedure ReleaseXCollectionEditor;
  91. begin
  92. if Assigned(vXCollectionEditorForm) then
  93. begin
  94. vXCollectionEditorForm.Release;
  95. vXCollectionEditorForm := nil;
  96. end;
  97. end;
  98. //--------------------------------------------
  99. // TXCollectionEditorForm
  100. //--------------------------------------------
  101. procedure TXCollectionEditorForm.FormCreate(Sender: TObject);
  102. begin
  103. RegisterGLBehaviourNameChangeEvent(OnNameChanged);
  104. RegisterGLMaterialExNameChangeEvent(OnNameChanged);
  105. RegisterXCollectionDestroyEvent(OnXCollectionDestroyed);
  106. end;
  107. procedure TXCollectionEditorForm.FormDestroy(Sender: TObject);
  108. begin
  109. DeRegisterGLBehaviourNameChangeEvent(OnNameChanged);
  110. DeRegisterGLMaterialExNameChangeEvent(OnNameChanged);
  111. DeRegisterXCollectionDestroyEvent(OnXCollectionDestroyed);
  112. end;
  113. procedure TXCollectionEditorForm.FormHide(Sender: TObject);
  114. begin
  115. SetXCollection(nil, nil);
  116. ReleaseXCollectionEditor;
  117. end;
  118. procedure TXCollectionEditorForm.SetXCollection(aXCollection: TXCollection; designer: IDesigner);
  119. begin
  120. // if Assigned(ownerComponent) then
  121. // ownerComponent.RemoveFreeNotification(Self);
  122. FXCollection := aXCollection;
  123. FDesigner := designer;
  124. if Assigned(FXCollection) then
  125. begin
  126. // if Assigned(FXCollection.Owner) and (FXCollection.Owner is TComponent) then
  127. // ownerComponent:=TComponent(FXCollection.Owner);
  128. // if Assigned(ownerComponent) then
  129. // ownerComponent.FreeNotification(Self);
  130. Caption := FXCollection.GetNamePath;
  131. end
  132. else
  133. begin
  134. // ownerComponent:=nil;
  135. Caption := strXCollectionEditor;
  136. end;
  137. PrepareListView;
  138. end;
  139. procedure TXCollectionEditorForm.TBAddClick(Sender: TObject);
  140. begin
  141. TBAdd.CheckMenuDropdown;
  142. end;
  143. procedure TXCollectionEditorForm.ListViewChange(Sender: TObject; Item: TListItem;
  144. Change: TItemChange);
  145. var
  146. sel: Boolean;
  147. begin
  148. if (Change = ctState) and Assigned(FDesigner) and (not updatingListView) then
  149. begin
  150. // setup enablings
  151. sel := (ListView.Selected <> nil);
  152. TBAdd.Enabled := Assigned(FDesigner);
  153. ACRemove.Enabled := sel;
  154. ACMoveUp.Enabled := sel and (ListView.Selected.Index > 0);
  155. ACMoveDown.Enabled := sel and
  156. (ListView.Selected.Index < ListView.Items.Count - 1);
  157. if Assigned(FDesigner) then
  158. if sel then
  159. FDesigner.SelectComponent(TXCollectionItem(ListView.Selected.Data))
  160. else
  161. FDesigner.SelectComponent(nil);
  162. end;
  163. end;
  164. procedure TXCollectionEditorForm.PrepareListView;
  165. var
  166. i: Integer;
  167. prevSelData: Pointer;
  168. XCollectionItem: TXCollectionItem;
  169. DisplayedName: String;
  170. begin
  171. Assert(Assigned(ListView));
  172. updatingListView := True;
  173. try
  174. if ListView.Selected <> nil then
  175. prevSelData := ListView.Selected.Data
  176. else
  177. prevSelData := nil;
  178. with ListView.Items do
  179. begin
  180. BeginUpdate;
  181. Clear;
  182. if Assigned(FXCollection) then
  183. begin
  184. for i := 0 to FXCollection.Count - 1 do
  185. with Add do
  186. begin
  187. XCollectionItem := FXCollection[i];
  188. DisplayedName := XCollectionItem.Name;
  189. if DisplayedName = '' then
  190. DisplayedName := '(unnamed)';
  191. Caption := Format('%d - %s', [i, DisplayedName]);
  192. SubItems.Add(XCollectionItem.FriendlyName);
  193. Data := XCollectionItem;
  194. end;
  195. if prevSelData <> nil then
  196. ListView.Selected := ListView.FindData(0, prevSelData, True, False);
  197. end;
  198. EndUpdate;
  199. end;
  200. finally
  201. updatingListView := False;
  202. end;
  203. ListViewChange(Self, nil, ctState);
  204. end;
  205. procedure TXCollectionEditorForm.PrepareXCollectionItemPopup(parent: TMenuItem);
  206. var
  207. i: Integer;
  208. list: TList;
  209. XCollectionItemClass: TXCollectionItemClass;
  210. mi, categoryItem: TMenuItem;
  211. begin
  212. list := GetXCollectionItemClassesList(FXCollection.ItemsClass);
  213. try
  214. parent.Clear;
  215. for i := 0 to list.Count - 1 do
  216. begin
  217. XCollectionItemClass := TXCollectionItemClass(list[i]);
  218. if XCollectionItemClass.ItemCategory <> '' then
  219. begin
  220. categoryItem := parent.Find(XCollectionItemClass.ItemCategory);
  221. if categoryItem = nil then
  222. begin
  223. categoryItem := TMenuItem.Create(owner);
  224. categoryItem.Caption := XCollectionItemClass.ItemCategory;
  225. parent.Add(categoryItem);
  226. end;
  227. end
  228. else
  229. categoryItem := parent;
  230. mi := TMenuItem.Create(owner);
  231. mi.Caption := XCollectionItemClass.FriendlyName;
  232. mi.OnClick := OnAddXCollectionItemClick;
  233. mi.Tag := Integer(XCollectionItemClass);
  234. mi.Enabled := Assigned(FXCollection) and
  235. FXCollection.CanAdd(XCollectionItemClass);
  236. categoryItem.Add(mi);
  237. end;
  238. finally
  239. list.Free;
  240. end;
  241. end;
  242. procedure TXCollectionEditorForm.OnNameChanged(Sender: TObject);
  243. begin
  244. if TXCollectionItem(Sender).owner = FXCollection then
  245. PrepareListView;
  246. end;
  247. procedure TXCollectionEditorForm.OnXCollectionDestroyed(Sender: TObject);
  248. begin
  249. if TXCollection(Sender) = FXCollection then
  250. Close;
  251. end;
  252. procedure TXCollectionEditorForm.Notification(AComponent: TComponent;
  253. Operation: TOperation);
  254. begin
  255. { if (Operation=opRemove) and (AComponent=ownerComponent) then begin
  256. ownerComponent:=nil;
  257. SetXCollection(nil, nil);
  258. Close;
  259. end;
  260. }
  261. inherited;
  262. end;
  263. procedure TXCollectionEditorForm.OnAddXCollectionItemClick(Sender: TObject);
  264. var
  265. XCollectionItemClass: TXCollectionItemClass;
  266. XCollectionItem: TXCollectionItem;
  267. begin
  268. XCollectionItemClass := TXCollectionItemClass((Sender as TMenuItem).Tag);
  269. XCollectionItem := XCollectionItemClass.Create(FXCollection);
  270. PrepareListView;
  271. ListView.Selected := ListView.FindData(0, XCollectionItem, True, False);
  272. FDesigner.Modified;
  273. end;
  274. procedure TXCollectionEditorForm.ACRemoveExecute(Sender: TObject);
  275. begin
  276. if ListView.Selected <> nil then
  277. begin
  278. FDesigner.Modified;
  279. FDesigner.SelectComponent(FXCollection.owner);
  280. TXCollectionItem(ListView.Selected.Data).Free;
  281. ListView.Selected.Free;
  282. ListViewChange(Self, nil, ctState);
  283. end;
  284. end;
  285. procedure TXCollectionEditorForm.ACMoveUpExecute(Sender: TObject);
  286. begin
  287. if ListView.Selected <> nil then
  288. begin
  289. TXCollectionItem(ListView.Selected.Data).MoveUp;
  290. PrepareListView;
  291. FDesigner.Modified;
  292. end;
  293. end;
  294. procedure TXCollectionEditorForm.ACMoveDownExecute(Sender: TObject);
  295. begin
  296. if ListView.Selected <> nil then
  297. begin
  298. TXCollectionItem(ListView.Selected.Data).MoveDown;
  299. PrepareListView;
  300. FDesigner.Modified;
  301. end;
  302. end;
  303. procedure TXCollectionEditorForm.PMToolBarPopup(Sender: TObject);
  304. begin
  305. PrepareXCollectionItemPopup(PMToolBar.Items);
  306. end;
  307. procedure TXCollectionEditorForm.PMListViewPopup(Sender: TObject);
  308. begin
  309. PrepareXCollectionItemPopup(MIAdd);
  310. end;
  311. //-----------------------------------
  312. initialization
  313. //-----------------------------------
  314. finalization
  315. ReleaseXCollectionEditor;
  316. end.