--- Title: scieditor2 5 Author: yamasyuh68 Web: https://mimemo.io/m/kEWpAokLeXl7Jaj --- 190904 # 保存ルーチン修正した - 実用化に近づいた(・∀・)ノ ①シンチラから文書を取得(u8) ②文書のエンコがu8ならそのままバイナリで保存 ③取得した文書をデコード ④tryでエンコードしてバイナリで保存 ⑤例外が発生したらメッセージを出して保存しないで終了 - 保存する前にエンコードしてしまいエラーを出させるところがポイント エラーの場合はそもそも保存させないことにした これで**データ破壊の可能性が無くなり安心**です - エラー箇所はreplaceするメニューを追加してもいい - エラーが発生した文字をハイライト表示したい ポジションはわかるのでそこにカーソルが飛ぶようにしてみたが、ポジションはバイト単位と思われ、文字単位のカーソルがズレる症状、どうしたら良い?? # 開いたファイルのデータベースを作る - 前に開いていた場所に飛ぶ機能 いつも使うファイルだけど開いたら常に先頭表示になるのは地味に使いづらい あまり意識したこと無かったけどgPadはキャレット位置まで前回終了時を再現してくれて、これに慣れてしまったので無いと凄く不便に思ってしまう ``` import os , sqlite3 , datetime class openfiledb(): def __init__(self): self.db=os.path.join(os.path.dirname(__file__) , 'openfile.db') conn = sqlite3.connect(self.db) c = conn.cursor() c.execute('create table IF NOT EXISTS database(path PRIMARY KEY,line,times,date)') c.close() conn.commit() conn.close() def save(self,fname,line): conn = sqlite3.connect(self.db) c = conn.cursor() date="{0:%Y%m%d}".format( datetime.datetime.now() ) try: c.execute( "INSERT INTO database (path,line,times,date) VALUES (?,?,?,?)" , (fname,line,1,date )) except: c.execute('select times from database where path = ?',(fname, )) times=c.fetchone()[0]+1 print(times) c.execute('update database set line= ? ,times=? ,date=? where path = ? ', ( line, times, date ,fname )) c.close() conn.commit() conn.close() ``` - お気に入りファイルだけにしようと思ってたんだけど、お気に入りの仕組み自体をどう変えるか考えている内にお気に入り以外だって記憶していた方が良いかなとか、ふつう「最近使ったファイル」って機能はあるからDB作って保存しておくのもありだと思うようになった - そうなるとiniよりはDB、SQLで実装することにした - 開いた回数と保存日付もデータ化しておくことにして、古いデータは削除したり、存在しないファイル名は削除したりと言った機能もいずれは実装しようかなという計画 - 以前DBのビューアを作ってあったのでそれでDBを確認しようと思ったら、汎用性がほとんど無くダメだった。作り直すか?? - でもここまでは結構簡単でした。前に作ったときに随分苦労して勉強したからまだ覚えてた部分も多かったんだな いまのところは保存まで、読込はこれから # もろもろ - 本体の文書ロードまわりを整理、すっきりしてきた - アウトライン解析を派生クラスに移す計画は、treeがウイジェットだったのですぐできない状態。widgetはデータと一体だから 派生クラスにwidgetを渡してセットしてもらうやり方もあるけど、どうせならモデルを分けて再利用した方がスマートだろう。特にファイルが大きくなったときは そうなるとdesigerに戻ってwidgetをviewに差し替えなければならない ver管理しておいたほうが良いレベルだな ---- 190904 # ini 見直し general -> sql へ - sqlを使い出したので基本的な設定もsqlに移すことにした Qtはwidgetが設定保存のメソッドを持ってるので簡単で良いんだけどデータはバイナリ sqlでテーブルを新しくして保存と読込を実装、問題なく動いた 少しづつだけどコードがコンパクトになってきたような気がする - 実装時にエラーで少し時間がかかった sqlのselect文の結果はfetchで取得するが、タプルのリストで帰ってくる fetchoneはリストのイテレータでタプルが順番に帰ってくるんだな そのあたりがよくわかんなくて(忘れてただけなんだろうか?)、要するにデータの取り出し方って事だけど、少し悩んだ - というのも初めからtryで書いてたのでエラーが出ても落ちずに進んでしまいエラーの理由がわからなくて トライを外してエラーをみてselect文の仕組みがわかった - 今考えたら**except でメッセージを取得してprint**すれば良かったんだな 昨日やってるときは気づかなかった 久しぶりにVSCodeでBP設定してデバッグしたりした まだまだだな・・・( ̄― ̄?) - こうなるとお気に入りこそsqlに移したいが、手で簡単に書けなくなるので編集ツールも必要になると思うと面倒ですぐには取りかかれない ### 文書保存を使うようになった、実用化してます ---- 190905 - ファイルを開いたとき、前回の終了位置にキャレットをセットするようにしたが、その行はページの最終行になってしまうので、状態そのものを復元するようにした - ページの一番上の行を保存、設定する機能がシンチラにはありこれを使った SCI_SETFIRSTVISIBLELINE(line displayLine) 2613 SCI_GETFIRSTVISIBLELINE → line     2152 - sql化していたので、sqlite3.exeでカラムを一つ手動で追加した。今後は見えている最上位の行もキャレットとともに保存・読込することにした - try で逃げるコードは exception のメッセージを取得してステータスバーに表示する仕様にしてみた --- 190906 # 折り返し設定 Line wrapping ``` self.wrap=0 if self.wrap==2 else 2 self.setWrapMode(self.wrap) ``` - 折り返しをデフォルトにしようと思ったが表示に時間がかかりすぎる # 検索の実装 virtual bool QsciScintilla::findFirst ( const QString & expr, bool re, bool cs, bool wo, bool wrap, bool forward = true, int line = -1, int index = -1, bool show = true, bool posix = false, bool cxx11 = false ) findNext ( ) replace ( text ) - 簡単に実装できた - ただし後方検索が 文字列exprの最初の出現を検索し、exprが見つかった場合はtrueを返し、そうでない場合はfalseを返します。 exprが見つかると、それが現在の選択になります。 reがtrueの場合、exprは単純な文字列ではなく正規表現として解釈されます。 csがtrueの場合、検索では大文字と小文字が区別されます。 woがtrueの場合、検索では単語全体の一致のみが検索され、そうでない場合は一致するテキストが検索されます。 wrapがtrueの場合、検索はテキストの終わりを折り返します。 forwardがtrue(デフォルト)の場合、検索は開始位置からテキストの終わりまで順方向に行われ、そうでない場合はテキストの先頭まで逆方向に行われます。 lineまたはindexのいずれかが負の場合(デフォルト)、現在のカーソル位置から検索が開始されます。それ以外の場合、行lineの位置インデックスから検索が開始されます。 showがtrue(デフォルト)の場合、見つかったテキストはすべて表示されます(つまり、展開されます)。 posixがtrueの場合、正規表現は、(および)ではなくタグ付きセクションとして裸の(および)を解釈することにより、よりPOSIX互換の方法で処理されます。 cxx11がtrueの場合、正規表現はCxx11正規表現として扱われます。 **GREPはまだ** # 重複確認 - 簡単だった ``` for i in range( self.ui.tabWidget.count() ): # 重複チェック if string==self.ui.tabWidget.widget(i).PropDict['fname'] : self.ui.tabWidget.setCurrentIndex(i) return ``` ---- --->[scieditor2](https://mimemo.io/m/zeXgworpjz4K0Ek)