Scintilla2 11 version 6

2019/09/26 21:39 by yamasyuh68
  :追加された部分   :削除された部分
(差分が大きい場合、文字単位では表示しません)
Scintilla2  11
190924
# ツリーのアウトラインを書き出す機能を実装
- アウトラインデータをエディタ内に新規文書として書き出す
- 秀丸でGREPしたときに結果が新規文書で表示されるイメージ
- データ取得は無限階層のスキャンになりモデルのスキャンとほぼ同じロジックになる
これは再帰関数で実装したが、何とか再帰しないで書きたいと考えてたルーチンを使ったらすんなりいけた( ´∀`)

```
    def treeoutput(self):
        current=self.ui.tabWidget.currentIndex()
        self.makenewtab( None )
        new=self.ui.tabWidget.currentIndex() , self.currentSci
        self.ui.tabWidget.setCurrentIndex(current)
        tree=[]
        for ii in range(self.ui.treeView.model().rowCount( )) :
            root = self.ui.treeView.model().index( ii,0) # start 0,0
            new[1].append(root.data() +' , '+ root.sibling(root.row(),1).data() +'\r\n')
            tree.clear()
            tree.append( [ 0 , self.ui.treeView.model().rowCount(root) ,root ] ) # [ index , count , parent ]
            n=0
            while 1 :
                flag=1
                for i in range(  tree[n][0] , tree[n][1]   ): # 子供が見つかれば異常で抜ける
                    child= tree[n][2].child( i , 0 )       # 見つからなければ普通に抜ける
                    new[1].append( child.data()+' , '+ child.sibling(child.row(),1).data() + '\r\n')
                    if self.ui.treeView.model().rowCount( child) :
                        if  len( tree ) <= n +1:
                            tree.append(None)
                        tree[n+1] =  [ 0 ,self.ui.treeView.model().rowCount( child), child] 
                        tree[n][0] = i+1              # 戻ったときのためにインデクスを更新しておく
                        flag = 0
                        break
                if  flag:    # 通常で抜けた場合 上に戻る
                    if n==0 : # 全部終わったらwhile を抜ける
                        break
                    else :
                        n -= 1
                        continue
                else :    # 異常で抜けた場合 潜る
                    n += 1
                    continue

    def columnShow(self):
        self.ui.treeView.setColumnHidden(1, not self.ui.treeView.isColumnHidden(1) )
```
## 再帰しない大まかなロジック
1. root を取得
2. while 1 のループを回し、root に子供がいれば取得してさらにループに戻ってその子供を探し続ける
3. 子供がいなければ階層を戻して兄弟で同じ事を続ける
4. 階層を進めたり戻したりするのでそれぞれの階層のデータを保持しておく、これはlist を使う
list = [ [ 行のインデクス、行の数、親のオブジェクト] , [,,] , [,,]/,  ]
リストのインデクスが階層に相当する
5. while のループ処理が階層0で正常に終了したらループをbreakする
- 一応しっかり動いてるけど可読性は極端に低い
そもそもリストで次元が増えていくとほぼ理解できなくなる(私だけか??)
一週間位したら自分でも何を書いたかわからなくなっている可能性高い( ̄― ̄?)
- **もっとエレガントに書きたい**

# アウトラインツリーにメニューをつけた
- とりあえず書き出しと隠しカラムの表示切り替え機能をつけた
- 表示切替はいわゆるトグル、直球で行けばフラグを立ててその逆を指定する
フラグをifで分岐させるのが素直だが最近は三項演算子を使ったりしてた
しかしフラグがboolであれば、単純に not flag で良いことに気づいた
treeView.setColumnHidden( column , not treeView.isColumnHidden() )
この1行でいけた。切り替わります
短くて可読性も高い、エレガントですよね~

---
190926
```
                # for i2 , l in enumerate( linet ) :
                #     if l == '.' :
                #         continue
                #     else :
                #         break
                for i2 , l in enumerate( linet ) :
                    if l != '.' :
                        break
                # for i2 in range(linet.__len__()):
                #     if linet[i2] != '.':
                #         break
```
-
```
    def countToken(self,line,token):
        for i , l in enumerate( line ) :
            if l != token :
                return i
        # return i

    def indentincrease(self):
        line = self.getCursorPosition()
        i = self.countToken( self.text(line[0]) , ' ' )
        token=['    ','   ','  ',' ']
        self.insertAt( token[ i % 4] ,line[0] , 0 )
```

----
  └──> [scieditor2](https://mimemo.io/m/zeXgworpjz4K0Ek)

      

190924

ツリーのアウトラインを書き出す機能を実装

  • アウトラインデータをエディタ内に新規文書として書き出す
  • 秀丸でGREPしたときに結果が新規文書で表示されるイメージ
  • データ取得は無限階層のスキャンになりモデルのスキャンとほぼ同じロジックになる
    これは再帰関数で実装したが、何とか再帰しないで書きたいと考えてたルーチンを使ったらすんなりいけた( ´∀`)
    def treeoutput(self):
        current=self.ui.tabWidget.currentIndex()
        self.makenewtab( None )
        new=self.ui.tabWidget.currentIndex() , self.currentSci
        self.ui.tabWidget.setCurrentIndex(current)
        tree=[]
        for ii in range(self.ui.treeView.model().rowCount( )) :
            root = self.ui.treeView.model().index( ii,0) # start 0,0
            new[1].append(root.data() +' , '+ root.sibling(root.row(),1).data() +'\r\n')
            tree.clear()
            tree.append( [ 0 , self.ui.treeView.model().rowCount(root) ,root ] ) # [ index , count , parent ]
            n=0
            while 1 :
                flag=1
                for i in range(  tree[n][0] , tree[n][1]   ): # 子供が見つかれば異常で抜ける
                    child= tree[n][2].child( i , 0 )       # 見つからなければ普通に抜ける
                    new[1].append( child.data()+' , '+ child.sibling(child.row(),1).data() + '\r\n')
                    if self.ui.treeView.model().rowCount( child) :
                        if  len( tree ) <= n +1:
                            tree.append(None)
                        tree[n+1] =  [ 0 ,self.ui.treeView.model().rowCount( child), child] 
                        tree[n][0] = i+1              # 戻ったときのためにインデクスを更新しておく
                        flag = 0
                        break
                if  flag:    # 通常で抜けた場合 上に戻る
                    if n==0 : # 全部終わったらwhile を抜ける
                        break
                    else :
                        n -= 1
                        continue
                else :    # 異常で抜けた場合 潜る
                    n += 1
                    continue

    def columnShow(self):
        self.ui.treeView.setColumnHidden(1, not self.ui.treeView.isColumnHidden(1) )

再帰しない大まかなロジック

  1. root を取得
  2. while 1 のループを回し、root に子供がいれば取得してさらにループに戻ってその子供を探し続ける
  3. 子供がいなければ階層を戻して兄弟で同じ事を続ける
  4. 階層を進めたり戻したりするのでそれぞれの階層のデータを保持しておく、これはlist を使う
    list = [ [ 行のインデクス、行の数、親のオブジェクト] , [,,] , [,,]/, ]
    リストのインデクスが階層に相当する
  5. while のループ処理が階層0で正常に終了したらループをbreakする
  • 一応しっかり動いてるけど可読性は極端に低い
    そもそもリストで次元が増えていくとほぼ理解できなくなる(私だけか??)
    一週間位したら自分でも何を書いたかわからなくなっている可能性高い( ̄― ̄?)
  • もっとエレガントに書きたい

アウトラインツリーにメニューをつけた

  • とりあえず書き出しと隠しカラムの表示切り替え機能をつけた
  • 表示切替はいわゆるトグル、直球で行けばフラグを立ててその逆を指定する
    フラグをifで分岐させるのが素直だが最近は三項演算子を使ったりしてた
    しかしフラグがboolであれば、単純に not flag で良いことに気づいた
    treeView.setColumnHidden( column , not treeView.isColumnHidden() )
    この1行でいけた。切り替わります
    短くて可読性も高い、エレガントですよね~

190926

                # for i2 , l in enumerate( linet ) :
                #     if l == '.' :
                #         continue
                #     else :
                #         break
                for i2 , l in enumerate( linet ) :
                    if l != '.' :
                        break
                # for i2 in range(linet.__len__()):
                #     if linet[i2] != '.':
                #         break
    def countToken(self,line,token):
        for i , l in enumerate( line ) :
            if l != token :
                return i
        # return i

    def indentincrease(self):
        line = self.getCursorPosition()
        i = self.countToken( self.text(line[0]) , ' ' )
        token=['    ','   ','  ',' ']
        self.insertAt( token[ i % 4] ,line[0] , 0 )

└──> scieditor2