2012/08/17

プレゼン補助ツールを考えてみた その3

プレゼン補助ツールを考えてみた その1
プレゼン補助ツールを考えてみた その2
の続き。

設計部分の話。
VBScript で作ることを決めたので、それを前提に。



.


PowerShellで書いたときにすでにソースの量はある程度になるとわかっていたので、wsfを使って外部ファイルを使う構成にします。
(wsfを使うと、PHPでいうところの require_once() のようなことができるのです。)


さて、開始するにあたって、どのパワーポイントのスライドの起動をどうフックするのかがネックとなります。
ここは難しいこと考えず、パワーポイントのファイルをVBSのファイルにドラッグ&ドロップして起動させるのが楽ですね。


そして二つのプログレスバーを作るのに必要なのは、
時間のプログレスバー → 総時間と現在の経過時間
ページのプログレスバー → 総ページ数と現在ページ数

このうち、総時間はシステム上では判断できないので、ユーザーの入力が必要となります。
これはInputBoxで入力させることにします。


シェイプをつかうことの課題

プログレスバーはシェイプを使って表示させることにしたのですが、シェイプってやつはページの上に乗っかっていて、ページ間の移動はできません。
つまりページが変わったときに置き去りにされてしまうのです。うーん、これは。。。。

ではせめてページが変わったことをイベントで取得して、すぐに新しいページにシェイプを作り直しましょう。
って調べたんですが、VBScriptではどうやってもパワーポイントのイベントを拾えません。

では最後、毎秒現在のページを監視して、最後のポイントと違っていたらシェイプを作り直すということにしましょう。
これなら大丈夫そうです。



ただ、はっきりいってこれは悩みました。
最長1秒とはいえ、バーが消えてしまうのです。
「毎秒」の単位をもっと短くしたとしてもそれによりPCの負荷が高まります。
そしてシェイプを作り直す動作はPCのスペックや状態によってはもたつくこともあり、シームレスなページ遷移ではありません。
ぐぬぬ

そしてもうひとつの課題、シェイプを置いてからパワーポイントが閉じられようとすると、「保存しますか?」のダイアログがでてしまいます。
基本的には最後にシェイプを削除してから閉じるつもりですが、出てしまうのを防ぐことはできません。
また、途中で異常停止してしまった場合は、シェイプ自体も残ってしまい、「保存しますか?」で「はい」を選択すると、元のファイルに加工をしてしまいます。
ぐぬぬ

やっぱりシェイプを使う案は間違ってたのでしょうか。
ということで、ここでもう一度考え直して別のアプローチを探したんですが、貧弱な私にはどうにも見つけられず戻ってきてしまいました。
これらの課題は「無視できる」(正確には「無視する」)と判断したのです。


ということで続き。


毎秒のアクションを作る

アクションごとに「1秒待つ」を仕込むことでのループとします。
終了は「総時間を秒換算した数値分まわしたら」としようかと思ったのですが、ループ中の処理で遅延することもありえるので、「開始時刻と現在時刻の差が総時間になるまで」と言う条件にしました。

まず、時間のバー。
前のアクション時とページが違っていたら、前のシェイプを削除し、現在のページにシェイプを作り直します。
その際の長さは開始時刻と現在時刻の差分による経過時間と総時間の比率で算出します。
前のアクション時と同じページだったら、その長さだけを変更します。

次にページのバー
前のアクション時とページが違っていたら、前のシェイプを削除し、現在のページにシェイプを作り直します。
その際の長さは現在ページと総ページ数の比率で算出します。
前のアクション時と同じページだったら、変化させません。


シェイプのデザイン

時間のバーとページのバーが同じではわかりづらいです。
インスパイアをうけたRabbitでは時間のバーに亀、ページのバーに兎の画像がついていて区別できていました。
まったく同じにするつもりはないので、まずは色を分けます。
色だけではどっちがどっちかわからないので、アイコンもおけるようにします。

で、これをVBScriptのファイルに埋め込んでしまうと、あとでデザインを変えたいときに不便です。
たとえば、パワーポイント自体のデザインによってはバーの色を変えたくなる場合もあるでしょう。
そんなときに、ささっとデザインを変更できるよう、WebでいうところのCSSのように分離しておくことにします。
ただ、CSSの書式にする意味はないので、iniファイルにし、これを「テーマファイル」と呼ぶことにします。
いくつかのテーマを用意できるよう、フォルダ単位で管理します。
さらに、本体がWSFファイルなので、その中にもiniの書式で書ける場所を用意し、外部のiniファイルの設定を上書きできるようにします。
これもスタイルシートの真似です。(htmlファイル内にスタイルを宣言するイメージ)

デザインはデフォルト→テーマファイル→WSFファイル内という順で読むことにします。

(こういうの考えているときは楽しいですよね。考えてるときは。)

ちなみにiniを解析する関数があるわけではないので、独自実装します。
xmlという案もあったのですが、ささっと書き換えるには不向きですね。
最終的に連想配列に格納して保持するのですが、VBSの配列の実装は他のLLと違ってうんこです。
連想配列に相当する配列はないため、辞書オブジェクトと呼ばれるオブジェクトを生成してそこにエントリずつ追加してゆく必要があるのです。


メジャーなオブジェクトの共通化

VBSではWshShellオブジェクトやFileSystemObjectオブジェクトなど、よく使われるオブジェクトがいくつかあります。
使うときにはCreateObject関数で変数に入れておくのですが、クラスと外部ファイルを使うパターンの場合、共通化したくなります。
また、エラー発生時の中断方法なども共通化したくなります。

そこで「標準スクリプトクラス」のようなものを用意して、そのプロパティにメジャーなオブジェクト郡を、そのメソッドにエラー発生時の中断処理などを用意します。
そしてこのクラスのインスタンスをグローバル変数にして、各クラスの中で使えるようにします。
結構ダサい実装ですが、無駄は省けます。

ちなみにVBScriptのクラスには継承の実装がありません。(ココ重要


ということで、試行錯誤しながらいろいろ考えた結果、
  • WSFファイル(フロントコントローラーのような感じ)
  • 標準スクリプトクラス
  • コントローラー兼シェイプ操作クラス(主にコントローラー+ビューのような感じ)
  • テーマファイル(CSSのような感じ)
という構成になりました。

シェイプ操作のクラスを分離して、シェイプごとにインスタンスを持とうかと思ったのですが、すげー重たくなってしまうのでやめました。
しかもVBScriptのクラスには継承の実装がありません。(大事なことなので



機能拡張1 テキスト表示

ふわふわしている開発をしてると、思いついたアイデアをどんどん足してしまうのはよくあること。
プログレスバーだけでなく、残りページ数や残り時間を文字列で表示できたらいいんじゃないかと思い、追加してみました。
なんですが、この機能非常に重いです。テキストボックスのシェイプを小さく表示するのになんかいろいろ動かす必要があって、ページ変更時のタイムラグがかなり。

この機能拡張を作ってわかったのですが、実際の動作は1秒ごとになってないことが非常に多く、テキスト表示で1秒分スキップしてしまいます。たとえば 「残り0:10」の次の表示が「残り0:08」になるような感じです。
なので、残り時間表示はイマイチでした。


機能拡張2 時間切れの幕

作っているときに想像していたのがどうしてもライトニングトーク(以下LT)になってしまい、「強制終了」をイメージしていて、最初は「時間切れでPowerPointを終了させる」という荒技になってました。
が、それって味気ないよね。ってことで、またもやシェイプで幕を作ることを思いついて作ってみました。

終了のパターンは3つ。
メッセージダイアログを表示させる
時間切れと同時にすべてのシェイプを消し、「予定の時間が経過しました」的なメッセージダイアログを出す。 ダイアログを閉じれば継続は可能。パワーポイントを終了させるとき、「保存しますか」のダイアログが出るが、変な操作をしていなければ保存しても大丈夫。 これをデフォルトとします。
幕を表示させる
時間切れと同時に現在のページを覆い隠すようなシェイプ(幕)を表示させ、半ば強制終了させる。 一度スライドショーを終了させないと幕を消せない。ただし別ページには幕はない。パワーポイントを終了させるとき、「保存しますか」のダイアログが出て、そのまま保存してしまうと幕のシェイプが残ってしまう。 (ちなみに全ページに幕を作るパターンや、ページを変えると幕を作り直すパターンも考えていたのですが、そこまでする意味はあまりないな、と思ったのでやめました。)
PowerPointを終了させる
文字通り(強制)終了。taskkillではないので安全な終了だし、保存をせずに終了させるのでシェイプが残らず元データも安全。
で、これをいつどうやって選んでもらうかを悩んだのですが、WSFファイルのオプションで選んでもらうことにしました。


サンプル動画

開発がひと段落した段階でiPhoneで撮影してみました。
パワーポイントのファイルはMicrosoftのデザインテンプレート的なところからもらってきたものです。ちょっと加工してます。
制限時間は尺の都合で1分にしました。
バーの色などは今のところのデフォルトテーマです。
終了のパターンはメッセージダイアログを表示するパターンです。

撮影したとき外でセミがチョーうるさかったので、音楽乗せました。

0 件のコメント:

コメントを投稿