From kde-core-devel Mon Apr 25 18:12:55 2011 From: Alexander Potashev Date: Mon, 25 Apr 2011 18:12:55 +0000 To: kde-core-devel Subject: Replacement for Qt's Undo Framework Message-Id: X-MARC-Message: https://marc.info/?l=kde-core-devel&m=130375520919536 MIME-Version: 1 Content-Type: multipart/mixed; boundary="--20cf30549e7b17bef304a1c228b3" --20cf30549e7b17bef304a1c228b3 Content-Type: text/plain; charset=UTF-8 Hi, The Qt's Undo Framework (QUndoCommand, QUndoStack, QUndoGroup, QUndoView) has a few oddities: 1. The names of undo actions can only have a predefined prefix (https://bugs.kde.org/show_bug.cgi?id=253459), 2. You can't use different strings for the name of undo action (Edit -> Undo/Redo [some action]) and for the items in the undo history (there is such panel, for example, in Step and Krita). The reason for having different strings is to make grammatical cases of the names of actions consistent with the context (in Russian and a few other languages you should put %1 in accusative case in "Undo %1"). If I'm not mistaken, those problems can't be solved by just deriving your own classes from QUndo*, because you need to override methods like createUndoAction which are not "virtual" (sure, you can name those methods differently, but then other problems may arise). The solution is to fork QUndo* classes and fix the problems in the new classes, so did I: https://github.com/aspotashev/libkundo2 (the code looks like garbage, I only made it working, but didn't try to clean it up) At the first glance, the only way to use two strings for every UndoCommand is to add yet another argument to the constructor of UndoCommand. But then a huge amount of code would need changes, that's not very good. Also, most languages don't really need different names for undo actions and items in undo history. I kept the arguments of UndoCommand() the same, but now if you put something like "Create a document|-|creation of a document" as the "text" into the constructor (or translate it with a similar string with "|-|"), you'll get "Create a document" as the name of an item in Undo History panel, and the "Undo ..." menu item will be called "Undo creation of a document". Screenshots: http://ompldr.org/vOGYxaQ -- translation in Lokalize (into Russian) http://ompldr.org/vOGYxag -- Step using different translations for "Undo ..." command and undo history. The patch I used for Step is attached. What do you think about inclusion of KUndo*2 into kdelibs? -- Alexander Potashev --20cf30549e7b17bef304a1c228b3 Content-Type: text/x-patch; charset=US-ASCII; name="0001-use-libkundo2.patch" Content-Disposition: attachment; filename="0001-use-libkundo2.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gmxq29nr0 RnJvbSBhZWMzYTlmMmZhNmMxNmQ0NmE1ZGUxMGJiMjk0NDEwMDcyNDVjNjc2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgUG90YXNoZXYgPGFzcG90YXNoZXZAZ21haWwu Y29tPgpEYXRlOiBNb24sIDI1IEFwciAyMDExIDE5OjQ2OjUxICswNDAwClN1YmplY3Q6IFtQQVRD SF0gdXNlIGxpYmt1bmRvMgoKLS0tCiBzdGVwL0NNYWtlTGlzdHMudHh0IHwgICAgMSArCiBzdGVw L21haW53aW5kb3cuY2MgIHwgICAgNCArKy0tCiBzdGVwL3VuZG9icm93c2VyLmNjIHwgICAgNCAr Ky0tCiBzdGVwL3VuZG9icm93c2VyLmggIHwgICAgNCArKy0tCiBzdGVwL3dvcmxkbW9kZWwuY2Mg IHwgICAxNiArKysrKysrKy0tLS0tLS0tCiBzdGVwL3dvcmxkbW9kZWwuaCAgIHwgICAxMCArKysr Ky0tLS0tCiA2IGZpbGVzIGNoYW5nZWQsIDIwIGluc2VydGlvbnMoKyksIDE5IGRlbGV0aW9ucygt KQoKZGlmZiAtLWdpdCBhL3N0ZXAvQ01ha2VMaXN0cy50eHQgYi9zdGVwL0NNYWtlTGlzdHMudHh0 CmluZGV4IDRkNTcxZWEuLmUyNmRjZDMgMTAwNjQ0Ci0tLSBhL3N0ZXAvQ01ha2VMaXN0cy50eHQK KysrIGIvc3RlcC9DTWFrZUxpc3RzLnR4dApAQCAtNjUsNiArNjUsNyBAQCBpbmNsdWRlX2RpcmVj dG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKIGtkZTRfYWRkX2V4ZWN1dGFibGUo c3RlcCAke3N0ZXBfU1JDU30pCiB0YXJnZXRfbGlua19saWJyYXJpZXMoc3RlcAogICAgIHN0ZXBj b3JlCisgICAga3VuZG8yCiAgICAgJHtLREU0X0tIVE1MX0xJQlN9CiAgICAgJHtLREU0X0tORVdT VFVGRjNfTElCU30KICAgICAke1FUX1FUT1BFTkdMX0xJQlJBUll9CmRpZmYgLS1naXQgYS9zdGVw L21haW53aW5kb3cuY2MgYi9zdGVwL21haW53aW5kb3cuY2MKaW5kZXggZmRjMGU1MC4uY2RjNTE2 OSAxMDA2NDQKLS0tIGEvc3RlcC9tYWlud2luZG93LmNjCisrKyBiL3N0ZXAvbWFpbndpbmRvdy5j YwpAQCAtMTc3LDkgKzE3Nyw5IEBAIHZvaWQgTWFpbldpbmRvdzo6c2V0dXBBY3Rpb25zKCkKICAg ICBjb25uZWN0KHdvcmxkTW9kZWwtPnVuZG9TdGFjaygpLCBTSUdOQUwoY2FuUmVkb0NoYW5nZWQo Ym9vbCkpLCBhY3Rpb25SZWRvLCBTTE9UKHNldEVuYWJsZWQoYm9vbCkpKTsKICAgICBjb25uZWN0 KHdvcmxkTW9kZWwtPnVuZG9TdGFjaygpLCBTSUdOQUwoY2FuVW5kb0NoYW5nZWQoYm9vbCkpLCBh Y3Rpb25VbmRvLCBTTE9UKHNldEVuYWJsZWQoYm9vbCkpKTsKICAgICBjb25uZWN0KHdvcmxkTW9k ZWwtPnVuZG9TdGFjaygpLCBTSUdOQUwoY2xlYW5DaGFuZ2VkKGJvb2wpKSwgdGhpcywgU0xPVCh1 cGRhdGVDYXB0aW9uKCkpKTsKLSAgICBjb25uZWN0KHdvcmxkTW9kZWwtPnVuZG9TdGFjaygpLCBT SUdOQUwodW5kb1RleHRDaGFuZ2VkKGNvbnN0IFFTdHJpbmcmKSksCisgICAgY29ubmVjdCh3b3Js ZE1vZGVsLT51bmRvU3RhY2soKSwgU0lHTkFMKHVuZG9BY3Rpb25UZXh0Q2hhbmdlZChjb25zdCBR U3RyaW5nJikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgU0xPVCh1 bmRvVGV4dENoYW5nZWQoY29uc3QgUVN0cmluZyYpKSk7Ci0gICAgY29ubmVjdCh3b3JsZE1vZGVs LT51bmRvU3RhY2soKSwgU0lHTkFMKHJlZG9UZXh0Q2hhbmdlZChjb25zdCBRU3RyaW5nJikpLAor ICAgIGNvbm5lY3Qod29ybGRNb2RlbC0+dW5kb1N0YWNrKCksIFNJR05BTChyZWRvQWN0aW9uVGV4 dENoYW5nZWQoY29uc3QgUVN0cmluZyYpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHRoaXMsIFNMT1QocmVkb1RleHRDaGFuZ2VkKGNvbnN0IFFTdHJpbmcmKSkpOwogCiAgICAg YWN0aW9uRGVsZXRlID0gYWN0aW9uQ29sbGVjdGlvbigpLT5hZGQ8S0FjdGlvbj4oImVkaXRfZGVs ZXRlIiwgd29ybGRNb2RlbCwgU0xPVChkZWxldGVTZWxlY3RlZEl0ZW1zKCkpKTsKZGlmZiAtLWdp dCBhL3N0ZXAvdW5kb2Jyb3dzZXIuY2MgYi9zdGVwL3VuZG9icm93c2VyLmNjCmluZGV4IDA1ZTZm ZGMuLjc5NzlmNDQgMTAwNjQ0Ci0tLSBhL3N0ZXAvdW5kb2Jyb3dzZXIuY2MKKysrIGIvc3RlcC91 bmRvYnJvd3Nlci5jYwpAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgInVuZG9icm93c2VyLm1v YyIKIAogI2luY2x1ZGUgIndvcmxkbW9kZWwuaCIKLSNpbmNsdWRlIDxRVW5kb1ZpZXc+CisjaW5j bHVkZSA8a3VuZG92aWV3Mi5oPgogI2luY2x1ZGUgPEtVcmw+CiAjaW5jbHVkZSA8S0ljb24+CiAj aW5jbHVkZSA8S0xvY2FsZT4KQEAgLTI4LDcgKzI4LDcgQEAKIFVuZG9Ccm93c2VyOjpVbmRvQnJv d3NlcihXb3JsZE1vZGVsKiB3b3JsZE1vZGVsLCBRV2lkZ2V0KiBwYXJlbnQsIFF0OjpXaW5kb3dG bGFncyBmbGFncykKICAgICA6IFFEb2NrV2lkZ2V0KGkxOG4oIlVuZG8gaGlzdG9yeSIpLCBwYXJl bnQsIGZsYWdzKSwgX3dvcmxkTW9kZWwod29ybGRNb2RlbCkKIHsKLSAgICBfdW5kb1ZpZXcgPSBu ZXcgUVVuZG9WaWV3KF93b3JsZE1vZGVsLT51bmRvU3RhY2soKSwgdGhpcyk7CisgICAgX3VuZG9W aWV3ID0gbmV3IEtVbmRvVmlldzIoX3dvcmxkTW9kZWwtPnVuZG9TdGFjaygpLCB0aGlzKTsKICAg ICBzZXRXaWRnZXQoX3VuZG9WaWV3KTsKIH0KIApkaWZmIC0tZ2l0IGEvc3RlcC91bmRvYnJvd3Nl ci5oIGIvc3RlcC91bmRvYnJvd3Nlci5oCmluZGV4IGE2MGQ2NzkuLmMwNTYyOWQgMTAwNjQ0Ci0t LSBhL3N0ZXAvdW5kb2Jyb3dzZXIuaAorKysgYi9zdGVwL3VuZG9icm93c2VyLmgKQEAgLTIyLDcg KzIyLDcgQEAKICNpbmNsdWRlIDxRRG9ja1dpZGdldD4KIAogY2xhc3MgV29ybGRNb2RlbDsKLWNs YXNzIFFVbmRvVmlldzsKK2NsYXNzIEtVbmRvVmlldzI7CiBjbGFzcyBLVXJsOwogCiBjbGFzcyBV bmRvQnJvd3NlcjogcHVibGljIFFEb2NrV2lkZ2V0CkBAIC0zOSw3ICszOSw3IEBAIHB1YmxpYyBz bG90czoKIAogcHJvdGVjdGVkOgogICAgIFdvcmxkTW9kZWwqIF93b3JsZE1vZGVsOwotICAgIFFV bmRvVmlldyogIF91bmRvVmlldzsKKyAgICBLVW5kb1ZpZXcyKiAgX3VuZG9WaWV3OwogfTsKIAog I2VuZGlmCmRpZmYgLS1naXQgYS9zdGVwL3dvcmxkbW9kZWwuY2MgYi9zdGVwL3dvcmxkbW9kZWwu Y2MKaW5kZXggNTEzMTM1Yi4uODUyMDRlYSAxMDA2NDQKLS0tIGEvc3RlcC93b3JsZG1vZGVsLmNj CisrKyBiL3N0ZXAvd29ybGRtb2RlbC5jYwpAQCAtMzcsMTQgKzM3LDE0IEBACiAjaW5jbHVkZSA8 S0ljb24+CiAjaW5jbHVkZSA8S0xvY2FsZT4KIAotY2xhc3MgQ29tbWFuZEVkaXRQcm9wZXJ0eTog cHVibGljIFFVbmRvQ29tbWFuZAorY2xhc3MgQ29tbWFuZEVkaXRQcm9wZXJ0eTogcHVibGljIEtV bmRvQ29tbWFuZDIKIHsKIHB1YmxpYzoKICAgICBDb21tYW5kRWRpdFByb3BlcnR5KFdvcmxkTW9k ZWwqIHdvcmxkTW9kZWwsIFN0ZXBDb3JlOjpPYmplY3QqIG9iamVjdCwKICAgICAgICAgICAgICAg ICBjb25zdCBTdGVwQ29yZTo6TWV0YVByb3BlcnR5KiBwcm9wZXJ0eSwgY29uc3QgUVZhcmlhbnQm IG5ld1ZhbHVlLCBib29sIG1lcmdlKTsKIAogICAgIGludCBpZCgpIGNvbnN0IHsgcmV0dXJuIF9t ZXJnZSA/IDEgOiAtMTsgfQotICAgIGJvb2wgbWVyZ2VXaXRoKGNvbnN0IFFVbmRvQ29tbWFuZCog Y29tbWFuZCk7CisgICAgYm9vbCBtZXJnZVdpdGgoY29uc3QgS1VuZG9Db21tYW5kMiogY29tbWFu ZCk7CiAKICAgICB2b2lkIHJlZG8oKTsKICAgICB2b2lkIHVuZG8oKTsKQEAgLTk5LDcgKzk5LDcg QEAgdm9pZCBDb21tYW5kRWRpdFByb3BlcnR5Ojp1bmRvKCkKICAgICAvL2ZvcmVhY2goU3RlcENv cmU6Ok9iamVjdCogb2JqZWN0LCBfb2JqZWN0cykgX3dvcmxkTW9kZWwtPm9iamVjdENoYW5nZWQo b2JqZWN0KTsKIH0KIAotYm9vbCBDb21tYW5kRWRpdFByb3BlcnR5OjptZXJnZVdpdGgoY29uc3Qg UVVuZG9Db21tYW5kKiBjb21tYW5kKQorYm9vbCBDb21tYW5kRWRpdFByb3BlcnR5OjptZXJnZVdp dGgoY29uc3QgS1VuZG9Db21tYW5kMiogY29tbWFuZCkKIHsKICAgICBjb25zdCBDb21tYW5kRWRp dFByb3BlcnR5KiBjbWQgPSBkeW5hbWljX2Nhc3Q8Y29uc3QgQ29tbWFuZEVkaXRQcm9wZXJ0eSo+ KGNvbW1hbmQpOwogICAgIFFfQVNTRVJUKGNtZCAhPSBOVUxMKTsKQEAgLTExOCw3ICsxMTgsNyBA QCBib29sIENvbW1hbmRFZGl0UHJvcGVydHk6Om1lcmdlV2l0aChjb25zdCBRVW5kb0NvbW1hbmQq IGNvbW1hbmQpCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWNsYXNzIENvbW1hbmROZXdJdGVtOiBw dWJsaWMgUVVuZG9Db21tYW5kCitjbGFzcyBDb21tYW5kTmV3SXRlbTogcHVibGljIEtVbmRvQ29t bWFuZDIKIHsKIHB1YmxpYzoKICAgICBDb21tYW5kTmV3SXRlbShXb3JsZE1vZGVsKiB3b3JsZE1v ZGVsLCBTdGVwQ29yZTo6SXRlbSogaXRlbSwgU3RlcENvcmU6Okl0ZW1Hcm91cCogcGFyZW50LCBi b29sIGNyZWF0ZSkKQEAgLTE5MCw3ICsxOTAsNyBAQCB2b2lkIENvbW1hbmROZXdJdGVtOjp1bmRv KCkKICAgICBfc2hvdWxkRGVsZXRlID0gX2NyZWF0ZTsKIH0KIAotY2xhc3MgQ29tbWFuZFNldFNv bHZlcjogcHVibGljIFFVbmRvQ29tbWFuZAorY2xhc3MgQ29tbWFuZFNldFNvbHZlcjogcHVibGlj IEtVbmRvQ29tbWFuZDIKIHsKIHB1YmxpYzoKICAgICBDb21tYW5kU2V0U29sdmVyKFdvcmxkTW9k ZWwqIHdvcmxkTW9kZWwsIFN0ZXBDb3JlOjpTb2x2ZXIqIHNvbHZlcikKQEAgLTIwNCw3ICsyMDQs NyBAQCBwcm90ZWN0ZWQ6CiAgICAgU3RlcENvcmU6OlNvbHZlciogX3NvbHZlcjsKIH07CiAKLWNs YXNzIENvbW1hbmRTaW11bGF0ZTogcHVibGljIFFVbmRvQ29tbWFuZAorY2xhc3MgQ29tbWFuZFNp bXVsYXRlOiBwdWJsaWMgS1VuZG9Db21tYW5kMgogewogcHVibGljOgogICAgIENvbW1hbmRTaW11 bGF0ZShXb3JsZE1vZGVsKiB3b3JsZE1vZGVsKTsKQEAgLTMwOCw3ICszMDgsNyBAQCBXb3JsZE1v ZGVsOjpXb3JsZE1vZGVsKFFPYmplY3QqIHBhcmVudCkKICAgICA6IFFBYnN0cmFjdEl0ZW1Nb2Rl bChwYXJlbnQpLCBfYWN0aW9ucygwKQogewogICAgIF9zZWxlY3Rpb25Nb2RlbCA9IG5ldyBRSXRl bVNlbGVjdGlvbk1vZGVsKHRoaXMsIHRoaXMpOwotICAgIF91bmRvU3RhY2sgPSBuZXcgS1VuZG9T dGFjayh0aGlzKTsKKyAgICBfdW5kb1N0YWNrID0gbmV3IEtVbmRvU3RhY2syKHRoaXMpOwogICAg IF93b3JsZEZhY3RvcnkgPSBuZXcgV29ybGRGYWN0b3J5KCk7CiAgICAgX3dvcmxkID0gbmV3IFN0 ZXBDb3JlOjpXb3JsZCgpOwogCkBAIC02NTQsNyArNjU0LDcgQEAgU3RlcENvcmU6OlNvbHZlciog V29ybGRNb2RlbDo6c3dhcFNvbHZlcihTdGVwQ29yZTo6U29sdmVyKiBzb2x2ZXIpCiAgICAgcmV0 dXJuIG9sZFNvbHZlcjsKIH0KIAotdm9pZCBXb3JsZE1vZGVsOjpwdXNoQ29tbWFuZChRVW5kb0Nv bW1hbmQqIGNvbW1hbmQpCit2b2lkIFdvcmxkTW9kZWw6OnB1c2hDb21tYW5kKEtVbmRvQ29tbWFu ZDIqIGNvbW1hbmQpCiB7CiAgICAgUV9BU1NFUlQoIV9zaW11bGF0aW9uRnJhbWVXYWl0aW5nIHx8 IF9zaW11bGF0aW9uUGF1c2VkKTsKICAgICBpZighaXNTaW11bGF0aW9uQWN0aXZlKCkpIHsKZGlm ZiAtLWdpdCBhL3N0ZXAvd29ybGRtb2RlbC5oIGIvc3RlcC93b3JsZG1vZGVsLmgKaW5kZXggYTQ0 MWVkZC4uNTE2N2E4NCAxMDA2NDQKLS0tIGEvc3RlcC93b3JsZG1vZGVsLmgKKysrIGIvc3RlcC93 b3JsZG1vZGVsLmgKQEAgLTIwLDEyICsyMCwxMSBAQAogI2RlZmluZSBTVEVQX1dPUkxETU9ERUxf SAogCiAjaW5jbHVkZSA8UUFic3RyYWN0SXRlbU1vZGVsPgotI2luY2x1ZGUgPFFVbmRvQ29tbWFu ZD4KICNpbmNsdWRlIDxRVmFyaWFudD4KICNpbmNsdWRlIDxRVGltZT4KIAogI2luY2x1ZGUgPHN0 ZXBjb3JlL3dvcmxkLmg+Ci0jaW5jbHVkZSA8a3VuZG9zdGFjay5oPgorI2luY2x1ZGUgPGt1bmRv c3RhY2syLmg+CiAKIG5hbWVzcGFjZSBTdGVwQ29yZSB7CiAgICAgY2xhc3MgT2JqZWN0OwpAQCAt NDAsNiArMzksNyBAQCBuYW1lc3BhY2UgU3RlcENvcmUgewogY2xhc3MgUUl0ZW1TZWxlY3Rpb25N b2RlbDsKIGNsYXNzIFFUaW1lcjsKIGNsYXNzIFFNZW51OworY2xhc3MgS0FjdGlvbkNvbGxlY3Rp b247CiBjbGFzcyBXb3JsZEZhY3Rvcnk7CiBjbGFzcyBDb21tYW5kU2ltdWxhdGU7CiBjbGFzcyBT aW11bGF0aW9uVGhyZWFkOwpAQCAtMTIyLDggKzEyMiw4IEBAIHB1YmxpYzoKICAgICBTdGVwQ29y ZTo6U29sdmVyKiBuZXdTb2x2ZXIoY29uc3QgUVN0cmluZyYgbmFtZSk7CiAKICAgICAvLyBVbmRv L3JlZG8gaGVscGVycwotICAgIEtVbmRvU3RhY2sqIHVuZG9TdGFjaygpIHsgcmV0dXJuIF91bmRv U3RhY2s7IH0gLy8vPCBHZXQgYXNzb2NpYXRlZCBLVW5kb1N0YWNrCi0gICAgdm9pZCBwdXNoQ29t bWFuZChRVW5kb0NvbW1hbmQqIGNvbW1hbmQpOyAvLy88IFB1c2ggbmV3IHVuZG8gY29tbWFuZAor ICAgIEtVbmRvU3RhY2syKiB1bmRvU3RhY2soKSB7IHJldHVybiBfdW5kb1N0YWNrOyB9IC8vLzwg R2V0IGFzc29jaWF0ZWQgS1VuZG9TdGFjazIKKyAgICB2b2lkIHB1c2hDb21tYW5kKEtVbmRvQ29t bWFuZDIqIGNvbW1hbmQpOyAvLy88IFB1c2ggbmV3IHVuZG8gY29tbWFuZAogICAgIHZvaWQgYmVn aW5NYWNybyhjb25zdCBRU3RyaW5nJiB0ZXh0KTsgLy8vPCBCZWdpbiB1bmRvIG1hY3JvCiAgICAg dm9pZCBlbmRNYWNybygpOyAvLy88IEVuZCB1bmRvIG1hY3JvCiAKQEAgLTI0MCw3ICsyNDAsNyBA QCBwcm90ZWN0ZWQ6CiBwcm90ZWN0ZWQ6CiAgICAgU3RlcENvcmU6OldvcmxkKiBfd29ybGQ7CiAg ICAgUUl0ZW1TZWxlY3Rpb25Nb2RlbCogX3NlbGVjdGlvbk1vZGVsOwotICAgIEtVbmRvU3RhY2sq IF91bmRvU3RhY2s7CisgICAgS1VuZG9TdGFjazIqIF91bmRvU3RhY2s7CiAgICAgY29uc3QgV29y bGRGYWN0b3J5KiBfd29ybGRGYWN0b3J5OwogICAgIFFTdHJpbmcgX2Vycm9yU3RyaW5nOwogCi0t IAoxLjcuNS5yYzEKCg== --20cf30549e7b17bef304a1c228b3--