2012-05-28 32 views
0

我剛剛被介紹給LUA語言,並且正在開始我的第一個項目。然而,我現在面臨的最大挑戰是如何實現或進行撤消和重做。如何在lua中實現重做

但是,爲了使問題清楚,該項目是一個自定義文本編輯器,因此,此處的撤消/重做是編輯任何輸入文本所必需的。我已經設法處理Cut,Copy,Clear,Find Word,以及更改字體,文本顏色,插入表格和圖像等問題,所有這些都在lua語言中處理。顯然,有幾個自定義文本編輯器,我相信爲迎合很多人的努力將爲未來的進步或改進鋪平道路。但撤消/重做行動正在撕裂我,從我的研究來看,甚至大部分現有的自定義文本編輯器都缺乏這種行爲。

我搜索了幾個論壇,他們似乎都提供了使用關聯類型的表來加載信息,並從那裏檢索他們的提示。令人難以置信的是,我認爲其中一些網站只是分享他們從其他網站獲得的知識,而沒有任何技術觀點或任何其他網站。這是因爲,我所遇到的大多數建議看起來在所有方面看起來都很相似。對於大約幾十個訪問過的站點,用戶試圖發佈示例的地方並不存在,但我所看到的全部都是抱怨大多數lua用戶。毫無疑問,這對於這個論壇中一些受人尊敬的大師來說似乎有點容易。

我似乎沒有得到這些建議的真實情況。 有人可以提供一個例子嗎?

+0

你想撤消/重做什麼?請提供更多背景 –

+0

Derick,你能解釋你正在製作什麼類型的項目嗎?對於繪製應用程序的撤銷/重做功能與文本編輯器不同。 – Konerak

回答

2

撤銷/重做是一個完美的適合command pattern

首先你需要編寫一些文本操作功能本身。只是的一部分,而不用擔心不重新或重新。這本身就是很多工作。

然後你將有一堆功能來操縱你的文檔。諸如insertText(),setFont(),insertJpgImage()等等。訣竅是,現在你需要將這些函數中的每一個包裝在一個所謂的command對象中。每個命令類必須有一個方法do()本身,以及undo()本身。

現在,您的所有文字處理操作是通過命令對象表示,在執行每個操作(例如加粗一些文本)的類似:當你想撤銷一些文字的粗體就​​可以

boldCommand = setTextPropertyCommand:new(document, selectedArea, textProperties.bold) 
boldCommand:do() --actually modify text 
table.insert(commandUndoStack, boldCommand) --keep the command for possible undoing later. 

然後調用:

command = table.remove(commandUndoStack) 
command:undo() 

NB,如果您使用的是一些GUI框架,在Lua綁定,那麼它可能是這個框架有其自己的現成的撤銷/重做功能的情況。例如Qt(帶有qtlua綁定)提供QUndoStack類。

+0

好的Tadeusz,這是最好的迴應和一個非常快。但是我使用的應用程序讓我可以創建RichText對象,所以我實際上要求的是如何在此RichText對象中實現重做,因爲雖然您的響應速度很快,但我實際上想知道它是越來越大,我如何使用媒體工作室的個人版創建撤消重做。謝謝,但仍然指望你的回覆,將服務於一個新手這麼簡單 –

+0

好Tadeusz,這是最好的迴應和一個非常快。但是我使用的應用程序讓我可以創建RichText對象,所以我實際上要求的是如何在此RichText對象中實現重做,因爲雖然您的響應速度很快,但我實際上想知道它是初學者,我如何使用例如媒體工作室的個人版本創建撤消重做。謝謝,但仍然依靠你的回覆,將爲新手這麼簡單 –

+0

@Derick:你完成了我的計劃的第一部分?您首先編寫一些文本操作功能,而不用擔心撤消或重做。 –