我正在爲「模型」編寫一個圖形編輯器(例如,帶有某種語義的框和線的集合,如UML,其中的細節在這裏無關緊要) 。所以我想要有一個表示模型的數據結構,以及一個對圖表進行編輯導致模型發生相應更改的圖表。因此,例如,如果模型元素在屬性中包含一些文本,並且編輯圖中的文本,我希望模型元素得到更新。圖形模型編輯器的拉鍊數據結構
該模型可能會被表示爲一棵樹,但我想讓圖編輯器儘可能少地瞭解模型表示。 (我正在使用diagrams框架,因此將任意信息與圖形元素關聯起來很容易)。如果我能弄清楚應該是什麼,那麼可能會有一個「模型」類來對接口進行編碼。
如果我是用命令式語言來做這件事,那很簡單:我只是從圖中的圖形元素引用模型元素。理論上,我仍然可以通過從大量IORefs集合中構建模型來完成此任務,但是這將會在Haskell中編寫一個Java程序。顯然,每個圖形元素都會有一些與之關聯的cookie,這將使模型更新發生。一個簡單的答案是給每個模型元素一個唯一的標識符並將模型存儲在Data.Map查找表中。但是這需要大量的簿記來確保沒有兩個模型元素獲得相同的標識符。它也使我成爲"stringly typed"解決方案;你必須處理一個對象被刪除的情況,但在其他地方有一個懸而未決的引用,並且很難說出你的類型中模型的內部結構。
另一方面Oleg's writings關於拉鍊與多個洞和光標與清晰的事務共享聽起來像一個更好的選擇,只要我能理解它。我得到了列表和樹拉鍊的基本概念以及數據結構的差異。圖中的每個元素是否可以將光標放入模型的拉鍊中?因此,如果做出更改,則可以將其委託給所有其他遊標?包括樹操作(如將子樹從一個地方移動到另一個地方)?
如果有關於定界延續的教程,以及他們如何讓Oleg的多指針拉鍊工作,這比Oleg的貼子稍微低一點,這對我來說會特別有幫助嗎?
也許Chung-chieh Shan的博客? :http://conway.rutgers.edu/~ccshan/wiki/blog/posts/WalkZip1/。請注意,Blob(wxHaskell)是一個用於編寫「網絡編輯器」的庫 - 它可能已經被破壞了,但更新它可能比重新開始使用Diagrams更不方便。 –
謝謝。我已經開始瞭解它。如果它導致答案,我會通知你。 –