ファイル保存のバグ

昨日のバージョンでは既知の問題として、保存すると一階層深くなる問題がありました。
この原因はだいたい予測できていたのですぐに対応できました。原因はこれです。

    #rootのiterを返す
    def get_iter_root(self):
        return self.treeCtrl.GetRootItem()

これは別に問題のあるコードではありません。しかし、GtkTreeViewとwxTreeCtrlを使ってコーディングしている際にちょっと気づいた違いがあって、GtkTreeViewでは最初にrootノードを作って、その後そのrootノードと同階層にもノードを作れました。これは仕様上はちょっと変ですが実用的です。しかしwxTreeCtrlではrootと同階層のノードを追加しようとするとエラーになります。詳しく検証していないのですが、初めて使ったときそういう現象に遭遇したのでそうだと思います。

そこで、wxTreeCtrlを使う際にrootと同階層を実現するために、ホントのrootを非表示にしてしまうことでGtkと同じ動作を実現しました。そのために下記のようにTreeCtrlのノードを初期化する際に見えないrootをこっそり作っておくようにしています。

    #ツリーを初期化
    def clear(self):
        self.treeCtrl.DeleteAllItems()
        item = self.treeCtrl.AddRoot("root", -1, -1, None)
        self.resetNode(item)

そこまでは良かったのですが、ファイルの書き出し時にその見えないrootを書き出してしまったため一階層ズレてしまったのが昨日の問題でした。ですので上記get_iter_rootが「見えないroot」を返すのは今回のケースでは間違いで、実際には「見た目上のroot」つまり「見えないrootの最初の子供」を返す必要があるのです。下記でOKでした。

    #見た目上のrootを返す
    def get_iter_root(self):
        root_item = self.getHiddenRoot()
        item, cookie = self.treeCtrl.GetFirstChild(root_item)
        return item

    #見えないrootを返す
    def getHiddenRoot(self):
        return self.treeCtrl.GetRootItem()

Rev.36でコミット。