Takuro Ashie
ashie****@homa*****
2003年 2月 22日 (土) 05:10:11 JST
注意: 妄想です.本気にしないで下さい. あまりまとまっていないのですが,前から言っているブックマークの抽象化に ついて説明します. まず,「隠れ家」というのは,zoeさんが既にお気づきのように,ただのブッ クマークです. また,「履歴」というのも,特殊なソーティング条件やグルーピング条件があ りますが,基本的にはブラウザが自動的に蓄積するブックマークに過ぎないと いう考え方もあると思います. rss/rdfは,WEB上からfetchしてくるという条件はありますが,基本的には更 新時刻でソーティングされている(なんて事を意識しなくても良い気はします が)ブックマークフォルダに過ぎないという気がします. 検索アイテムは,ユーザーからの入力を要求するブックマークという考え方も あります. また,「隠れ家」は,左クリックは普通のホームですが,右クリックはフォル ダのようになっています.これは「隠れ家は自身がブックマークでもあるブッ クマークフォルダ」と表現する事もできます. 検索アイテムは,検索結果をフォルダのように表示するようにしたいという要 求があります. これは「検索アイテムは,自身がユーザーからの入力を要求するブックマーク でありながら,検索結果を子に持つブックマークフォルダでもある」と表現す る事もできます. ここで,ブックマークアイテムに要求されるプロパティをまとめてみます. * URI * favicon * サムネイル * 更新時刻 および 更新時刻を取得するメソッド および 取得のトリガ * 子のリスト および 子リストを取得するためのメソッド および 取得のト リガ * ユーザー入力が必要か? 必要な場合は入力に対するメソッド 構造体で表現するとこんな感じ?(突っ込みどころ満載) typedef struct _KzBookmarkItem { GObject parent; gpointer priv; } KzBookmarkItem; typedef struct _KzBookmarkItemClass { GObjectClass parent_class; const gchar *(uri) (KzBookmarkItem *item); GdkPixbuf *(*favicon) (KzBookmarkItem *item) GdkPixbuf *(*thumbnail) (KzBookmarkItem *item) time_t (*mtime) (KzBookmarkItem *item); GList *(*childlen) (KzBookmarkItem *item); gchar *(*activate_entry) (KzBookmarkItem *item, const gchar *text); void *(add_child) (KzBookmarkItem *item); void *(del_child) (KzBookmarkItem *item); GCompareDataFunc compare; /* 子のデフォルトのソート条件 */ /* トリガはどう表現するのかまだよくわからない */ } KzBookmarkItemClass; (uriがNULLの場合は純粋なフォルダ) そしてUI側(Widget)は,自分に突っ込まれたブックマークアイテムがどのプロ パティを持っているか(そして自分はそのプロパティをユーザーに提供できる のか否か)だけを見て挙動を変えればいいはずです. rss/rdfなのか,検索アイテムなのか等と言う実装詳細は気にしなくても良い はずです. 例えばブックマークアイテムが子のリストを持っていて,それがメニューに突っ 込まれた場合,そのメニューは自動的にサブメニューを作成します(リストの 取得はブックマークアイテム自身が持っているメソッドを経由して行います. 取得に時間がかかる場合はNotifyする仕組みが必要です). それがTreeViewに突っ込まれた場合,TreeViewは自動的に子リストをツリーに 接ぎ木します.(というように勝手に解釈するようなカスタムwidgetを作ります) ボタンに突っ込まれた場合は,今の「隠れ家」のような挙動をするのでしょう. 「自身がブックマークでもあるブックマークフォルダ」もそれなりに表現でき るようにします.例えばメニューならこんな感じ? 親メニュー ┃ 子メニュー ┃ ┏━━━━━━┓ BookmarkItem┃ -> ┃URI ┃ ━━━━━━┛ ┣━━━━━━┫separator ┃子1 ┃ ┃子2 ┃ ┃... ┃ ユーザー入力を必要とするアイテムがツールバーに突っ込まれた場合,自動的 にEntryを付け加えます. TreeViewに突っ込まれた場合,GtkCellRendererTextを自動的に付け加えます. (サイドバーにブックマークを表示すると,検索アイテムを縦にずらっと並べ る事ができて壮観かも) メニューバーに突っ込まれた場合,特になにもしないでURIに対応するただの メニューアイテムになるかもしれないし,Entryが付いても良いかもしれませ ん(あまり現実的じゃないような気もするけど). Mozillaのブックマーク,Galeonのブックマーク,IEのブックマーク等もこの モデルの中に組み込めると理想的です. で,これらブックマークアイテムを,UNIXのファイルシステムと同じように, 一本の木構造で表現できるようにします.ルートアイテムを実体化すると,あ とは設定に基づいて自動的に枝がにょきにょきと生えてくるようになっている と良いでしょう(rss/rdf等は,トリガに基づいて適当なタイミングで枝が生え ます.MaxConnectionNumとかなんとか言うクラス変数を持って,接続数を制限 する必要があるかと思います). 各ブックマーク用Widgetが実体化されると,この木から自分の望む枝にchroot して自分に表示させます. 無論,ユーザーにはなるべくこんな事は意識させないような工夫が必要です. ...以上は妄想です.忘れて下さい.皆さんさようなら(^^;;/~~~~~