タグの階層化
サイドバーに表示されるタグは、階層化することができます。タグの階層を変えると、そのタグをセットしているアイテムのタグも階層に応じて変化します。
1.タグの選択
移動したいタグを選択します。複数のタグを選択することはできません。
2.タグのドラッグ&ドロップ
選択したタグを移動先のタグにドラッグ&ドロップします。3.移動完了
以下のように移動先タグの下に配置されます。「壁紙」タグが親タグで「青系」タグがサブタグになります。
以下のように親タグは複数のサブタグを持つことができます。
またサブタグは親タグになれるので、更に深い階層構造にすることもできます。
タグ削除時の注意事項
タグを削除すると、そのタグのサブタグが全て削除されます。タグ階層化時に落ちるバグ(2013/3/3)
日本語環境のUbuntu 12.04/Ubuntu 12.10/Fedora 17/Fedora 18でタグを階層化すると、Shotwellが落ちる現象が発生しました。階層化するタグを持つアイテムがあると、タグの階層変更時にアイテムのタグが変わりますが、その処理時に不整合が起きているようです。
以下は現象発生時の状況です。
1.タグの階層化
以下のように「壁紙」「青系」タグを設定したアイテムがあります。サイドバーの「青系」タグを「壁紙」タグにドラッグ&ドロップします。
2.クラッシュ
タグをドロップした時点で以下のようにエラーが表示され、Shotwellが異常終了します。3.Shotwellの再起動
再度Shotwellを起動すると、以下のように「青系」タグが移動前と移動先両方に現れます。また「1.」のアイテムのタグを確認すると、以下のように変更はありません。
状況の確認
クラッシュしている箇所はTag.valaの以下赤字の箇所でした。タグ管理の不整合がおきているようで、assertが発生していました。
protected override void notify_container_contents_removed(ContainerSource container,
Gee.Collection<DataSource> removed, bool unlinking) {
Tag tag = (Tag) container;
Gee.Collection<MediaSource> sources = (Gee.Collection<MediaSource>) removed;
foreach (MediaSource source in sources) {
Gee.List<Tag>? tags = source_map.get(source);
assert(tags != null);
bool is_removed = tags.remove(tag);
assert(is_removed);
if (tags.size == 0)
source_map.unset(source);
Gee.SortedSet<Tag>? sorted_tags = sorted_source_map.get(source);
assert(sorted_tags != null);
is_removed = sorted_tags.remove(tag);
assert(is_removed);
if (sorted_tags.size == 0)
sorted_source_map.unset(source);
}
base.notify_container_contents_removed(container, removed, unlinking);
}
英語環境ではこの現象が発生しないことから、ロケールに依存した処理(文字列処理等)が影響しているのかもしれません。
参考
[norepro] Crash when adding a tag in Japanese一時的な回避策
- 英語環境でタグを階層化する
- 移動するタグをアイテムのタグに設定せず、移動してからアイテムのタグに設定する