提案:解説表示画面にURLリンク機能

Issue #417 resolved
tachi gigas created an issue

お疲れ様です。

解説表示画面にURLリンク機能を検討します(六号室の幽霊船よりお借りしました)。

rtc.png

現在の仕様?上の大きな問題点

  • 解説表示画面で表示テキストが遷移する時、キャレットがURL上にあると、 Clearメソッドを作動させても、リンク情報が次のテキスト全文に引き継がれてしまいます。 これを避けるためキャレットを冒頭に移動する処理 (もし冒頭がURLの場合は無理矢理頭に空白を挿入しています。末尾がURLのReadmeはあっても冒頭がURLのReadmeはまずない、と思うのですが。どうでしょう)を入れていますが、 もっと賢いやり方はないものかと思っています。
  • 右クリックメニューが日本語ではなく英語になってしまいます。

以上より、今マージするにはちょっと厳しいのではないかと思います。

小さな問題点

  • 右端で折り返した場合の行間と、改行した時の行間が異なります。
  • リンクの色は暫定的に橙色にしていますが、何色が見やすいでしょうか。

他、不具合報告

テストしてて気付きましたが、 proxi様「城塞都市リムリック」の著作権情報のテキストが途中で切れます(これは現行PyCardWirthPy 1.1 Build: 2016-09-29 20:59:21もです)。 調べてみると、他のテキストはShift-JISなのに対し、このファイルだけUTF-16(BOMあり)になってます。 UTF-8にすると現行Pyも、この検討内容も正常に動作します。

調べてみたところ、どうも、例えばscenarioselect.pyの2468行目などの

    with open(fpath, "r") as f:
        data = f.read()
        f.close()

が、UTF-16のファイルには正常に動作しないようです。どうしたものでしょうか。

やったこと

例によって、私家改造版に搭載をしております。

年齢認証が入る件と、設定ファイルを共有しない件についてはご注意下さい。

採用・不採用どちらでも構いませんで、もちろんk4nagatsuki様によるフォント変更に見られるような原形を留めないミラクルな実装も想定済みです。

皆様の忌憚なきご意見・バグ報告をお待ちしております。

Comments (30)

  1. tachi gigas reporter

    経緯と付録

    解説画面からホームページに飛べるようになれば、シナリオ製作において素材探しが格段に楽になるのでは?という思いが、実はかなり昔からありましたが、 その実現手段が全く思いつかず、wxPythonのリファレンスを眺めては閉じ、眺めては閉じ、を繰り返す日々が続いておりました。 しかし、最近になってようやくTextCtrlのサブクラスであるRichTextCtrlがあると知り、 リッチテキストには文中にリンクを設定できますので、試験的に実装をしたものです。

    メールアドレスやTwitterアカウントへの対応も考えられますが、僕の考えとしてはメールアドレス対応はちょっと乗り気ではありません。 そうなるとTwitterアカウントの判定も多くのケースで誤爆が考えられるため、やめたいところです。

    今日はここまでにします。急ぐ話ではないので、まったり考えます。

  2. k4nagatsuki repo owner

    これは、前からほしかったけど手を付けられなかったやつ。すばらしいです。

    前者の問題はwxPythonのバグっぽいですねぇ。

    • 右クリックメニューが日本語ではなく英語になってしまいます。

    これは実はシナリオ終了時に出てくるデバッグ情報にも同じ問題があります。仕方ないと割り切ってしまってもいいんじゃないかなぁと個人的には思います。もしどうしても気になるのなら、たぶん独自の右クリックメニューを設定してしまえばデフォルトのものを上書きできるかと思います(試していない)。

    UTF-16で切れるのはなんなんでしょう。Python処理系の問題の気もしますが……。

  3. tachi gigas reporter

    前者について。正直wxPythonのバグかと思います。文字色は初期化されるのに下線とリンクは初期化されません。一体何が初期化されるのか、これもうわかんねぇな、です。

    後者について。まぁ英語と言ってもCopyとSelect Allしか有効にならないし、見れば分かる(はず、ですよね?)英語ですので、いいっちゃあいいのですが。確かにデバッグログも右クリックが英語ですね。つーかこれRichTextCtrlですね。今まで何で気付かなかったんだ。ばかか。気付いてたら1.0に間に合ったんだぞ。

    …。右クリック情報をオーバーライドできたら、というかコピーと全て選択だけ表示できたら、UI的に幸せになれます。できるかどうかは別にして。

    UTF-16の件は、どうもPythonのバグのような気がします。

    お体、ご自愛なさってください。

  4. tachi gigas reporter

    右クリックの日本語化と項目を絞りました。

    実現できたはいいものの、今度はキー入力によるコピーやすべて選択が反応しなくなり、結果ちょっとしつこいコードになってしまいました。引き続き様子を見ます。

  5. 暗黒 騎士

    お疲れ様です。CardWirthTG 1.1Build: 2016-10-02 00:09:28を少し触らせて頂きました。 地味ながら良い機能ですね。

    コードについてはまだ人様にどうこう言えるレベルに達しておらず、気付いた点のみで恐縮ですが

    • URLをコピーしたい時、ドラッグしてURLの上でボタンを離すとクリック扱いでブラウザが起動してしまう
    • 「だいしょうのいし」(ベクターで入手)で著作権表記の空白が一部文字化けしている?(Py最新版では起こらないのを確認)

    前者については自分が_神経質すぎるだけでどうでもいいかもしれません。そのときはスルーで。

  6. tachi gigas reporter

    https://bitbucket.org/tachi_gigas/cardwirthpy-reboot-lessor/commits/6b83d649f985789fdffe46441595cf156c259437

    テストありがとうござます。やはり第三者の目は大事ですね。実行ファイルは上記通りです。

    • URLの上でドラッグするとブラウザが起動してしまう

    仕様かと思ってましたが、文字列選択中はブラウザ起動しない事で解決できる事に気付きました。

    • UTF-8の文字化け

    特定のケースで発生しているので正規表現が甘いかと思いましたが、URLとそれ以外に分割した文字列ごとにエンコード判定した事が誤りのようです。従来通り全体で判定するようにしましたが、無学なため、またしつこいコードになってしまいました。

  7. 暗黒 騎士

    修正を確認しました。こちらこそ対処ありがとうございます。

    自分の環境ですとTGの場合、Py1.1と比較してドラッグやホイールでのスクロール速度がかなりもっさりしてしまうようです。(TG Build: 2016-09-29 22:26:46とTG最新版で確認) しかしこれはある程度は機能とトレードオフなのかもしれませんね。

  8. tachi gigas reporter

    動作を比べましたが、実際にホイール等のスクロール量が異なります。現行Pyは行単位(ホイールならコントロールパネルのマウスの項目で設定できる行数。多分デフォルトでは一回3行)でスクロールしますが、今回はピクセル単位でスクロールするため、そうはいきません。しかし僕が無学なためか、スクロール量を指定したり、実際にスクロールさせるメソッドが見当たらないため、例えスクロールイベントをオーバーライドしても、現行Py並の速度にするのは難しそうです。(少なくとも今の僕には)

    何か設定はありそうな気がするのですが…。

  9. tachi gigas reporter

    https://bitbucket.org/tachi_gigas/cardwirthpy-reboot-lessor/commits/a92e6f561b0b06c064d4d7254ef0fffa67ff7e92

    恐れ入りますが、少々気の迷いが発生しまして、右クリックにGoogle検索を追加しました。 もしかしたら、素材サイトが消えた時に便利かも知れません。実行ファイルや注意点は同じです。

    検索エンジンを選択できた方がいいかも?それは追い追いで、と思ってます。

  10. tachi gigas reporter

    UTF-16の問題について、思う所があったので試したのですが、

    scenarioselect.pyにてReadmeテキストを読み込む際、open(fpath, "r")ではなくopen(fpath, "rb")で読み込むと正常に動作しました。果たしてこれでPull Requestしていいのか少し悩む、後味の悪い内容です。

  11. k4nagatsuki repo owner

    bの有無はテキストモードとバイナリモードの切り替えで、具体的には改行コードの変換の有無ですね。この場合、読み込んだあとに文字コードチェック・変換をかけているので、バイナリで読み込むのが正解だと思います。

    スクロールバーは、SetScroll*辺りのメソッドが設定に使えると思います。

  12. tachi gigas reporter

    では、pull request #1593 をしました。お帰りの所ご多忙かと存じますが、よろしくお願いします。

  13. tachi gigas reporter

    https://bitbucket.org/tachi_gigas/cardwirthpy-reboot-lessor/commits/8744950ee49e501c70e0da4419f497720c3ad29d

    コミット内容を間違えたため、コミットログが現行Py全体との差分になってしまいました。実行ファイルの場所や注意点は同じです。

    スクロール量をdialog\settings.pyに合わせてみました。これで様子を見て問題や要望がなければdefaultブランチに持ってってPull Requestしようかと思います。

  14. tachi gigas reporter

    ちょ、ちょっと取り下げを…。

    これSetScrollRateで値を設定しても変わってないですね…。

  15. 暗黒 騎士

    あ、いえ自分は報告しただけですし、むしろ力になれず申し訳ないです。ハードコードされるということはWX側を書き換えなければならないんですね(?)。

  16. tachi gigas reporter

    https://bitbucket.org/tachi_gigas/cardwirthpy-reboot-lessor/commits/86359c965e220e0a1dc1189532f7e0a003df3b9f

    恐れ入ります。実行ファイルの場所や注意点は同じです。

    調べました所、マウスホイール時はイベントを自作すればよかったのです(とりあえず移動量を4に設定しています)が、ドラッグ時はどんなイベントでキャッチすれば良いのかで詰まっています。

  17. k4nagatsuki repo owner

    手許で試しましたが、ドラッグでもスクロール関係の設定は効かないようですね。

    となるとやはり自前で処理するしかないようです。マウス移動のイベントはwx.EVT_MOTIONですが、これは左ボタンを押した状態であればマウスがウィンドウ外へ出ても発生し続けます。このイベントをキャッチして、左ボタンが押されているかチェックし、その後ポインタが上か下へ外れていれば距離に応じてスクロールすればいいのではないかと思います。

  18. tachi gigas reporter

    お二方のご助言、誠に痛み入ります。

    いずれの方法でもwx.EVT_MOTIONを捕まえる話になりますが、 URLリンクにマウスを持ってきてもカーソルが変わらないというUI的な問題が発生しまして、 僕の判断では申し訳ないですがちょっと現実的ではないと思います。

  19. k4nagatsuki repo owner

    イベントオブジェクトはSkip()を実行しないと後続のイベントハンドラの処理が実行されません。カーソルの問題はそのせいではないでしょうか。

  20. k4nagatsuki repo owner

    反応が遅くなってすみません。

    ホイールもドラッグも快適に動いていると思います。位置による速度差のせいか、マウスポインタを動かすとドラッグで一瞬引っかかりが生じたような感じを受けるのですが、快適さを損なうほどではありません。

    しかしスクロール後に表示が結構乱れますね。強制スクロールをかけた後はRefreshなりするべきなのでしょうか。

    あとついでですが、コピー・貼り付けとGoogle検索の間にはセパレータを入れた方がいいかと思います。

  21. k4nagatsuki repo owner

    ありがとうございます。これでほとんど問題なくなった感じでしょうか。

    Pull Requestをいただければすぐにでもマージさせていただきますが、いかがでしょう。

  22. k4nagatsuki repo owner

    マージしました。

    いつも素敵な新機能を実装していただいてありがとうございます。今後もぜひよろしくお願いします。

  23. Log in to comment