TableView を FlatStyle に。

https://github.com/rallentando/vanilla/commit/3a1b185ab74322c5d375dc5214208e5ab2e38790


前の記事にもあるように QtWebEngine(5.6 beta snapshot) が不安定なのですが、
デバッグしようにもライブラリが足りない(修正中らしい)のでそれさえ出来ず、
悶々としている間に見た目が FlatStyle に変更できるようになってました(あんまり関係ない)。


元がこれ



で、新しく実装したのがこれ。



切り替えは config.xml の gadgets/@Style から。
GlassStyle (黒っぽいの) と FlatStyle (白っぽいの)で、切り替えられます。
実は実行時にも設定を変更する方法は一応用意していて、
[Alt+X] set gadgets/@Style FlatStyle [Enter]
みたいな入力で今回のスタイル変更は出来ます。
途中候補が出てくるのでそちらから選択しても大丈夫です。



一応設定変更したらブラウザを再起動することをお勧めします。


ところで Style オブジェクトが Render するのはどうなんでしょ?
まあ、QWidget 関係のクラスが paintEvent で QStyle の drawPrimitive とか呼んでるみたいなので
良いということにしておきます。


というかコミットメッセージが果てしなくダサくなってしまいました。
git push した後しばらくして気づいたんですが、
日本語の「・」を書き換えるの忘れてたって話。
forced push とかやりたくないのでこのままにしときますが、
git push する前にコミットの内容とメッセージは一度確認するようにしないとですね。

QtWebEngine の PepperFlash。

Qt5.6のバイナリ(今のところ64bitのみでbetaの、しかもsnapshotだけど)が来てたので早速インストール。
そしてvanillaをビルド。不安定ながらも動いている模様。
しかしFlashが動かない。そういえば前の変更でパス指定する部分あったなと思って見てみると、
src/core/content_client_qt.cppでは64bitだとフラッシュを探しに行かない様になってました。
推奨されたものではないのかな?
仕方ないのでコマンドラインから --ppapi-flash-path="path/to/flash"
すると、余計なページが表示される。。。
そもそもコマンドライン引数をvanillaはurlとかコマンドとか受け取るようにしか使っていなかったので、
QtやChromeに対して渡されたコマンドを無視するようにコードを修正。



う、動いた。待ちに待ったFlash(いや、QtWebKitでは普通に動いていたけれども)。
まあ、ブラウザ開くと半分くらいの確立でハングするんですが。
vanilla由来かQtWebEngine由来か判りませんが。
追々修正されることでしょう。


Qt5.6のリリースを楽しみに待ちましょう。

vanilla 0.1.1をリリースしました。

https://github.com/rallentando/vanilla/releases/tag/0.1.1


Qt5.6(beta)のバイナリまだかなーと、待ってたのですが、
まだもうちょっとかかるみたい(?)なので、
QtWebKitドロップする前に一回リリースはさむことにしました。
適当にコードかいてたら思ってたより積み重なってきたので。
セキュリティ関係の修正とかドラッグアンドドロップとかマウスマップの自由度とか、
使い勝手に直接影響を与える部分もあるので。

Drag and drop for QtWebEngine.


前の記事で、ドラッグ&ドロップできないとかいいましたが、そんなことはありませんでした。


https://github.com/rallentando/vanilla/commit/f08c18036b6eb6fe287890ef63f308d8d48d6098


Element.getClientRectsとかRange.getClientRectsとかからQRegionを生成して、
その情報からQWidget::render経由でQPixmap作って、自前で作ったQDragにそのデータつけてやれば完成。
実は一部experimentalな機能としてコードだけはあったというか、
QtWebKitのほうではそれらは動いていたのですが、
初回のドラッグのみですがとても遅くて、実用に耐えないと思っていました。
(DLLのロードかテンポラリディレクトリのクリアか、原因はいくつか考えられます。)
だったら起動時に一度それらをやってしまえばいいか、ということで実装してみたら
一応使えるレベルにはなったかな、と。


実装をjavascriptに任せているのでページ自体がビジーだったりするともたつくのはご愛嬌。

先日の記事の補足。

テーブルビューについて



テーブルビューはブックマーク、タブ、履歴を統合した機能として使えるのですが、
見た目的にはスピードダイヤルに似たものになっています。
最初に使うときは他のブラウザのブックマークをインポートするのがいいでしょう。


メニューからインポートを選択するとブラウザが選択できるのでインポート元を選んでください。
すると自動的にテーブルビューが表示されるので、
あとはフォルダをたどってページを見ることができる状態になります。


二つほど注意していただきたいことがあります。


一つは起動時には必ず前回見ていた状態を復元する、ということです。
なので毎回スタートページから、のようなブラウザの使い方はできません。
見ている状態がすでにブックマークに登録している状態と同じなので、
毎回ブックマークをすべて削除する、というわけにはいかないのです。


そしてもう一つは見ているページの近辺もある程度自動的にロードされる、ということです。
普通のタブブラウザの様にすべてを同時に開く、というようなことはしません。
一応設定すればそのような挙動にもできるのですが、あまりお勧めはしません。
100項目くらいあったりするとPCやアクセス先のサーバが悲鳴を上げることになるでしょう。




設定ファイルについて


設定ファイルの場所はインストールした場所によって違います。
"Program Files"の下にインストールした場合、
"C:/Users/<ユーザ名>/AppData/Local/vanilla/data/config.xml"に、
それ以外の場合インストールしたフォルダの直下に"data"フォルダが作成され、
そこに"config.xml"がおかれます。


何度も起動していると、バックアップが複数置かれます。
しかし数には制限を設け、自動的に削除するようになっているので問題はありません。
これは例えばアプリケーションがクラッシュしたり停電などでPCが落ちた場合
遡ってデータを復元するためです。この復元作業は人の手で行う必要はなく、自動的に実行されます。


例えば、application/@EnableAutoLoad は上の「見ているページの近辺の自動ロード機能」だったり、
webview/preferences/ScrollAnimatorEnable はスムーズスクロールの設定だったり、
ある程度自由に設定できるようにはしています。キーバインドとか右クリックメニューとかも。


ただ、ちょっとした量になっているので設定ダイアログは今後の課題ではあります。
まあ、あんまり乗り気ではないのですが。
Vivaldiとかよりさらにマニア向けな感のあるこのブラウザ、
使うのはそのくらいの設定ができる人でしょう。




アクセスキーについて



Vimiumのリンク選択みたいなあれ、です。
慣れるとマウスカーソルをリンクに持っていくよりも早く操作できます。
デフォルトだと26個単位でキーを割り振ります。
必要であれば数字キーや上、下キーでブロックを選択し、キーでリンクを選択します。
そこでメニューが出てくるので、同じビューで開くか、別ビューで開くかを選ぶことができます。
フォームやボタンであれば当然メニューは出ずにそこを選択します。


そういうわけでデフォルトの場合はVimiumと違う挙動なのですが、
gadgets/accesskey/@EnableMultistroke を true にすると
複数のキーでリンクを絞り込んでいくものとなります。
当然そのままだと26個のキーを使うので、ストローク数はVimiumよりも少なくなります。
それすらも同じにしたければ、
gadgets/accesskey/@AccessKeyCustomSequence に自前で入れる、というのも良いかもしれません。
またこのメニューで選択するのも煩雑、ということであれば、
gadgets/accesskey/@AccessKeyAction を OpenInNewViewNode だったり ClickElement にすると
メニューすら出ず、よりVimiumに近いものとなります。


そういうわけでやたらめったらに設定がいっぱいある、というわけです。
リンクを別ビューで開くときの挙動とか、完全なヒストグラムを保存する設定とか、
GoogleSuggestの設定とか。


当然それらはQtWebEngineをバックエンドに持っているときにも有効なので。
そのあたりはご安心を。

Web browser 'vanilla'.

https://github.com/rallentando/vanilla/releases/tag/0.1.0


QtがQtWebKitをドロップするということで、この際公開してみることにしました。
以前の記事の通り、ツリーブラウザかつテーブルブラウザです。
そこそこの完成度になったかはわかりませんが、まあ、今のところ人柱バージョン、ということで。
おそらくQtWebKitを搭載する最初で最後のリリースになると思われます。
今後はこのバージョンのQtWebKitに近づけるためにQtWebEngineの方を開発する予定です。


特徴:
・タブバーやアドレスバーなど、多くのブラウザが標準で持っているものすら排除したシンプルな見た目。
・ブックマークの機能はありません。
・通常いわれるような履歴の機能もありません。
・その代わり、と言ってはなんですが、テーブルビューがあります。
タブの様に扱え、かつブックマークの様に扱え、無制限のツリー構造を扱うことができます。
XMLが編集できるのであればショートカットキー、ジェスチャーをカスタマイズできます。
またショートカットキーはシングルキーを許容します。
・言わずもがな、アクセスキー搭載。
タブブラウザ推奨委員会には掲載されません。


使い方:
基本的にシングルショートカットキー、もしくはマウスジェスチャーを使うことを前提としています。


・タブ、に、代わる物
ジェスチャー(左、上)またはショートカット(Fキー)によってテーブルビューが呼び出せます。詳細は後述。


・アドレスバー、に、代わる物
ショートカット(Dキー)によって下部に入力欄が表示されます。エンターで移動します。


・検索バー、に、代わる物
ショートカット(Sキー)によって下部に入力欄が表示されます。エンターで移動します。


・アクセスキー
ショートカット(Aキー)によってアクセスキーを呼び出すことができます。
呼び出すとリンクなどにキーが割り振られ、対応したキーを押すことによって選択、
さらにアクションを選択することによってリンクを開くことができます。


・開いているタブの削除、に、代わる物
ジェスチャー(下、右)もしくはショートカット(Qキー)


・最期に閉じたタブの復元、に、代わる物
ジェスチャー(下、左)もしくはショートカット(Wキー)


・その他標準的なジェスチャー、ショートカットキー


・表示領域絶対主義
あとは、メニューバーを非表示にすればWebViewのみの画面。完璧。
その状態でも左下のステータスエリア、右クリックでメニューが出てきますのであしからず。


テーブルビュー:
・タブのような、お気に入りのような。
・基本的に見たまま。
クリックすれば開き、フォルダならディレクトリ移動、中ボタンで削除、
何もないところをダブルクリックすると親フォルダに移動、並べ替えもできる。
・キーボードで操作することもでき、コンテキストメニューから操作することもできる。


QtWebEngineの既知の問題:
ドラッグ&ドロップ出来ない。なんてことはなかった。
Flashが見えない。(5.6では有効になる模様。)
・サブフレーム内の要素が取得できない。(アクセスキーとか右クリックメニューとかで。)
・ た ま に 落 ち る 。
・ ア イ エ ム イ ー 。


立ち位置的にはVivaldiやOtterに近いかも しれません。しかし復元したかったのは、
Operaではなくfub.netであり、Syleraであり、そしてぶら。です。
vanillaがそれらの現代版になれるかはわかりませんが、
ツリー構造をよりうまく扱えるブラウザが出るまでは開発を続ける予定です。


マニュアル無し、設定ダイアログは未実装、とっつきにくい(だろうなぁ…)、
ということに目をつぶって使っていただけるのであれば、幸いに思います。

QWebViewでスムーズスクロール

Operaのスクロールがうらやましかったのですよ。

ふと思いついてやってみたら意外にも動いた。
QTimer::singleShot連発してるから遅くて動かないものが出来ると思ってたけど、
なんとなーくいい感じ。他のQWidget系にも応用できそう。
SMOOTH_SCROLL_STEPとSMOOTH_SCROLL_TIMERはそれぞれ16位でOperaに近い動きになります。

それにしてもQtは、QTimer::singleShotだったり
QtConcurrent::runだったりQtConcurrent::mapだったりほんとに痒いところに手が届いて使いやすい。

後はBlinkに対応してくれたら完璧なのになー(チラッ