Qtopia Shell Bridge Dialog その18 リッチテキスト
さて、と言うことで 0.6.2で追加(復活)した新(?)機能 リッチテキストについて試してみました。
そもそも、リッチテキストってなんじゃ?って話もありますが、 QTに於けるリッチテキストとは、XMLのタグ表現で修飾されたテキスト文書のことを指します。某MS-WORDな文書とは関係(最近は無いこともないか)ありません。
つーか、要は HTMLビューワと言った方が早いかもしれない(笑)。
ま、百聞は一見に然かず、とりあえずサンプルを作ってみましょう。
# richtxt.sh #!/bin/bash # Define argument export QSHDLG_APP=richtxt INPUT=/var/spool/qshdlg/input_${QSHDLG_APP} OUTPUT=/var/spool/qshdlg/output_${QSHDLG_APP} CONTROL=/var/spool/qshdlg/control_${QSHDLG_APP} #################################### # Init qshdlg qshdlg -t "RichText" -c eucJP -N -n -M -s custom -C & while [ ! -p ${CONTROL} ] do : done # echo 'direction(QString,QString)' ViewButton LeftToRight > ${CONTROL} # echo 'direction(QString,QString)' ViewButton RightToLeft > ${CONTROL} # echo 'direction(QString,QString)' ViewButton TopToBottom > ${CONTROL} echo 'direction(QString,QString)' ViewButton BottomToTop > ${CONTROL} echo 'update()' > ${CONTROL} echo 'showRich()' > $CONTROL # echo richtext echo 'richtext(QString)' "'<h1 align="center">RichText</h1>'" > $CONTROL echo 'richtext(QString)' "'<center>'" > $CONTROL echo 'richtext(QString)' "'<hr>'" > $CONTROL echo 'richtext(QString)' "'<font color="#ff0000" size="1"> R </font>'" > $CONTROL echo 'richtext(QString)' "'<font color="#00ff00" size="3"> G </font>'" > $CONTROL echo 'richtext(QString)' "'<font color="#0000ff" size="5"> B </font>'" > $CONTROL echo 'richtext(QString)' "'<font color="#ff0000" size="7"> r </font>'" > $CONTROL echo 'richtext(QString)' "'<hr>'" > $CONTROL echo 'richtext(QString)' "'<img src="/home/zaurus/work/rich.jpg">'" > $CONTROL echo 'richtext(QString)' "'<hr>'" > $CONTROL echo 'richtext(QString)' "'</center>'" > $CONTROL # echo OUTPUT PIPE echo 'texttype(QString)' "rich" > $CONTROL sleep 1 echo "<h1 align="center">RichText [OUTPUT]</h1>" > $OUTPUT echo "<center>" > $OUTPUT echo "<hr>" > $OUTPUT echo "<font color="#ff0000" size="1"> R </font>" > $OUTPUT echo "<font color="#00ff00" size="3"> G </font>" > $OUTPUT echo "<font color="#0000ff" size="5"> B </font>" > $OUTPUT echo "<font color="#ff0000" size="7"> r </font>" > $OUTPUT echo "<hr>" > $OUTPUT echo "<img src="/home/zaurus/work/rich.jpg">" > $OUTPUT echo "<hr>" > $OUTPUT echo "</center>" > $OUTPUT echo 'show()' > $CONTROL exit 0
見ての通り、罫線を引いたり、 IMGタグを用いることで画像の表示も可能です(^^)。
ざっと試してみた限り、以下のタグが使用出来ることを確認しています。
- h=見出し文字[ 1〜3 まで]
- br=改行
- hr=罫線
- UL=箇条書き
- OL=順序付き箇条書き(type指定は算用数字、アルファベットのみ)
- UL=定義リスト
- IMG=画像貼付[ JPG,PNG,BMP,GIF(動画GIFは不可) ]
- BIG=大文字
- SMALL=小文字
- FONT=フォント指定 [ color,size(1〜7,+-) ]
- CENTER=中央揃え
- BLOCKQUOTE=引用文(字下げ)
逆に試してみて使えなかったタグは以下の通りです。
- B=太字[ボールド]
- S=打ち消し線
- U=アンダーライン
- I=イタリック
- EM=強調
- STRONG=強調
- TABLE=テーブル
使えないタグを記述した場合、単に無効なタグとして処理されるだけで、表示が化けたり、ゴミが出たりはしません。
また、リッチビューは、通常のメッセージビューでの表示と異なり、ウィンドウの端までテキストが伸びた場合でも、自動的に折り返しは行われません。
ウィンドウの枠外に文章が伸びた場合は、ウィンドウ下にスクロールバーが現れ、それをスライドさせることで文章を表示させることになります。
さらに当然と言えば当然なのですが、リッチビューはタグを解釈する処理が加わる分、必然的に通常のメッセージビューよりも処理速度は劣ります。
実際、どれくらい速度が変わるのか、以下のようなスクリプトで調べてみます。
# mrcmp.sh #!/bin/bash # Define argument export QSHDLG_APP=mrcmp INPUT=/var/spool/qshdlg/input_${QSHDLG_APP} OUTPUT=/var/spool/qshdlg/output_${QSHDLG_APP} CONTROL=/var/spool/qshdlg/control_${QSHDLG_APP} #################################### window_rich(){ echo 'hideInput()' > ${CONTROL} echo 'hideSelect()' > ${CONTROL} echo 'hideReply()' > ${CONTROL} echo 'hideRich()' > ${CONTROL} echo 'hideMessage()' > ${CONTROL} echo 'hideDefault()' > ${CONTROL} # echo 'direction(QString,QString)' ViewButton LeftToRight > ${CONTROL} # echo 'direction(QString,QString)' ViewButton RightToLeft > ${CONTROL} # echo 'direction(QString,QString)' ViewButton TopToBottom > ${CONTROL} echo 'direction(QString,QString)' ViewButton BottomToTop > ${CONTROL} echo 'update()' > ${CONTROL} echo 'showRich()' > $CONTROL count=0 while [ ! $count -eq 1000 ] do echo 'richtext(QString)' "a<br>" > $CONTROL count=`expr $count + 1` done echo 'show()' > $CONTROL } window_message(){ echo 'hideInput()' > ${CONTROL} echo 'hideSelect()' > ${CONTROL} echo 'hideReply()' > ${CONTROL} echo 'hideRich()' > ${CONTROL} echo 'hideMessage()' > ${CONTROL} echo 'hideDefault()' > ${CONTROL} # echo 'direction(QString,QString)' ViewButton LeftToRight > ${CONTROL} # echo 'direction(QString,QString)' ViewButton RightToLeft > ${CONTROL} # echo 'direction(QString,QString)' ViewButton TopToBottom > ${CONTROL} echo 'direction(QString,QString)' ViewButton BottomToTop > ${CONTROL} echo 'update()' > ${CONTROL} echo 'showMessage()' > $CONTROL count=0 while [ ! $count -eq 1000 ] do echo 'description(QString)' "a" > $CONTROL count=`expr $count + 1` done echo 'show()' > $CONTROL } #################################### # Init qshdlg qshdlg -t "mrcmp" -c eucJP -N -n -M -s custom -C & while [ ! -p ${CONTROL} ] do : done echo "MRCMP_RESULT" > /home/zaurus/work/result.txt # test 1 echo 'clearRich()' > $CONTROL echo 'clear()' > $CONTROL PTIME_RA1=`date +%s` window_rich PTIME_RB1=`date +%s` PASTTIME_R1=`expr $PTIME_RB1 - $PTIME_RA1` echo "RTIME1=$PASTTIME_R1" >> /home/zaurus/work/result.txt echo 'clearRich()' > $CONTROL echo 'clear()' > $CONTROL PTIME_MA1=`date +%s` window_message PTIME_MB1=`date +%s` PASTTIME_M1=`expr $PTIME_MB1 - $PTIME_MA1` echo "MTIME1=$PASTTIME_M1" >> /home/zaurus/work/result.txt # test 2 echo 'clearRich()' > $CONTROL echo 'clear()' > $CONTROL PTIME_MA2=`date +%s` window_message PTIME_MB2=`date +%s` PASTTIME_M2=`expr $PTIME_MB2 - $PTIME_MA2` echo "MTIME2=$PASTTIME_M2" >> /home/zaurus/work/result.txt echo 'clearRich()' > $CONTROL echo 'clear()' > $CONTROL PTIME_RA2=`date +%s` window_rich PTIME_RB2=`date +%s` PASTTIME_R2=`expr $PTIME_RB2 - $PTIME_RA2` echo "RTIME2=$PASTTIME_R2" >> /home/zaurus/work/result.txt # test 3 echo 'clearRich()' > $CONTROL echo 'clear()' > $CONTROL PTIME_RA3=`date +%s` window_rich PTIME_RB3=`date +%s` PASTTIME_R3=`expr $PTIME_RB3 - $PTIME_RA3` echo "RTIME3=$PASTTIME_R3" >> /home/zaurus/work/result.txt echo 'clearRich()' > $CONTROL echo 'clear()' > $CONTROL PTIME_MA3=`date +%s` window_message PTIME_MB3=`date +%s` PASTTIME_M3=`expr $PTIME_MB3 - $PTIME_MA3` echo "MTIME3=$PASTTIME_M3" >> /home/zaurus/work/result.txt # test 4 echo 'clearRich()' > $CONTROL echo 'clear()' > $CONTROL PTIME_MA4=`date +%s` window_message PTIME_MB4=`date +%s` PASTTIME_M4=`expr $PTIME_MB4 - $PTIME_MA4` echo "MTIME4=$PASTTIME_M4" >> /home/zaurus/work/result.txt echo 'clearRich()' > $CONTROL echo 'clear()' > $CONTROL PTIME_RA4=`date +%s` window_rich PTIME_RB4=`date +%s` PASTTIME_R4=`expr $PTIME_RB4 - $PTIME_RA4` echo "RTIME4=$PASTTIME_R4" >> /home/zaurus/work/result.txt echo 'clearRich()' > $CONTROL echo 'clear()' > $CONTROL echo 'reject()' > $CONTROL exit 0
単純に同じ文字をそれぞれのビューで1000回描画し、秒単位で時間を計測しています。
ただ、リッチテキストの場合は、改行コードが付加されないので、br(改行)タグも付加してます。
バイト換算すれば、この時点でリッチテキストの方が5倍のデータ量となる訳ですが、その前に付加されるqcopメッセージ descripitonと richtextの3文字の差もあります。ですんで、最終的に echoされる文字列全体で見れば 21文字と22文字の差でしかありません。実質、一割も差は無いワケで、統計的には大体同程度のデータ量とみなして良いでしょう。
さらに、外的要因の影響も考慮し、それぞれについて順番を入れ替え、合計四回の計測を行っています。
で、結果はこの通り。
MRCMP_RESULT
RTIME1=107
MTIME1=74
MTIME2=40
RTIME2=151
RTIME3=204
MTIME3=92
MTIME4=39
RTIME4=151
・・・えーと、何かあんま統計取れてないよーな(^^;)。
ま、逆に言えば、描画処理に関しては、システムの状態等、外的要因によって大きく左右されるものだと言うことでしょう。
恐らくは、使用するタグの種類によっても、このへんは大きく結果に差異が出てくるのではないか?と思われます。
とは言え、回毎の対比でも、最大値と最小値をとった結果でも、総じてメッセージビューの方が一応高速な結果は出てますし、実際、体感的にも描画速度の差異は感じられます。
折り返しの問題と合わせて、どちらのビューを使うかは、文字通り適材適所ってことになるんじゃないかと思います。