using Adw; using Gtk; namespace Publicate { public class FileExplorer : Box { private ListBox file_list; private ScrolledWindow scroll_window; private Invercargill.Sequence assets; private Invercargill.Sequence file_items; public signal void asset_selected(Ppub.Asset asset); public Ppub.Asset? selected_asset {get; private set;} public FileExplorer() { scroll_window = new ScrolledWindow(); scroll_window.hscrollbar_policy = PolicyType.NEVER; scroll_window.propagate_natural_width = true; append(scroll_window); create_list(); } private void create_list() { file_list = new ListBox(); scroll_window.child = file_list; file_list.row_activated.connect((row) => { var item = (FileItem)row; selected_asset = item.asset; asset_selected(item.asset); }); } public void set_assets(Invercargill.Enumerable files) { create_list(); assets = files.to_sequence(); file_items = new Invercargill.Sequence(); foreach(var asset in assets) { var item = new FileItem(asset); file_list.append(item); file_items.add(item); } } public void set_selected_item(string name) { var item = file_items.where(i => i.asset.name == name).first_or_default(); file_list.select_row(item); } } public class FileItem : ActionRow { public Ppub.Asset asset {get; private set;} public FileItem(Ppub.Asset asset) { this.asset = asset; activatable = true; title = asset.name; subtitle = ContentType.get_description (asset.mimetype); var icon = new Image.from_gicon (ContentType.get_icon (asset.mimetype)); add_prefix (icon); } } }