FileExplorer.vala 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using Adw;
  2. using Gtk;
  3. namespace Publicate {
  4. public class FileExplorer : Box {
  5. private ListBox file_list;
  6. private ScrolledWindow scroll_window;
  7. private Invercargill.Sequence<Ppub.Asset> assets;
  8. private Invercargill.Sequence<FileItem> file_items;
  9. public signal void asset_selected(Ppub.Asset asset);
  10. public Ppub.Asset? selected_asset {get; private set;}
  11. public FileExplorer() {
  12. scroll_window = new ScrolledWindow();
  13. scroll_window.hscrollbar_policy = PolicyType.NEVER;
  14. scroll_window.propagate_natural_width = true;
  15. append(scroll_window);
  16. create_list();
  17. }
  18. private void create_list() {
  19. file_list = new ListBox();
  20. scroll_window.child = file_list;
  21. file_list.row_activated.connect((row) => {
  22. var item = (FileItem)row;
  23. selected_asset = item.asset;
  24. asset_selected(item.asset);
  25. });
  26. }
  27. public void set_assets(Invercargill.Enumerable<Ppub.Asset> files) {
  28. create_list();
  29. assets = files.to_sequence();
  30. file_items = new Invercargill.Sequence<FileItem>();
  31. foreach(var asset in assets) {
  32. var item = new FileItem(asset);
  33. file_list.append(item);
  34. file_items.add(item);
  35. }
  36. }
  37. public void set_selected_item(string name) {
  38. var item = file_items.where(i => i.asset.name == name).first_or_default();
  39. file_list.select_row(item);
  40. }
  41. }
  42. public class FileItem : ActionRow {
  43. public Ppub.Asset asset {get; private set;}
  44. public FileItem(Ppub.Asset asset) {
  45. this.asset = asset;
  46. activatable = true;
  47. title = asset.name;
  48. subtitle = ContentType.get_description (asset.mimetype);
  49. var icon = new Image.from_gicon (ContentType.get_icon (asset.mimetype));
  50. add_prefix (icon);
  51. }
  52. }
  53. }