using Gtk 4.0; using Adw 1; template $BzInspector: Adw.Window { title: "Bazaar Inspector"; default-width: 1200; default-height: 800; width-request: 600; height-request: 600; Adw.ToolbarView { top-bar-style: raised_border; bottom-bar-style: raised_border; reveal-bottom-bars: false; [top] Adw.HeaderBar { [end] MenuButton { primary: true; icon-name: "open-menu-symbolic"; tooltip-text: _("Inspector Menu"); menu-model: inspector_menu; } } content: Paned { orientation: horizontal; start-child: ScrolledWindow { child: Box { orientation: vertical; width-request: 100; spacing: 10; Box { orientation: vertical; Box { orientation: horizontal; spacing: 10; Label { styles [ "heading" ] label: "Background Task Info:"; xalign: 0.0; } Label { label: bind template.state as <$BzStateInfo>.background-task-label as ; xalign: 0.0; } } Box { orientation: horizontal; spacing: 10; Label { styles [ "heading" ] label: "Active Entry Objects in Memory:"; xalign: 0.0; } Label { label: bind $format_uint(template.state as <$BzStateInfo>.cache-manager as <$BzEntryCacheManager>.living-entries) as ; xalign: 0.0; } } } Box { orientation: vertical; spacing: 3; CheckButton debug_mode_check { label: "Enable Global Debug Mode"; } CheckButton disable_blocklists_check { label: "Disable All Blocklists"; } } Box { orientation: vertical; spacing: 3; Label { styles [ "heading" ] label: "Active Blocklists (YAML)"; xalign: 0.0; } ScrolledWindow { propagate-natural-height: true; child: ListView { model: NoSelection { model: bind template.state as <$BzStateInfo>.blocklists; }; factory: string_list_factory; }; } } Box { orientation: vertical; spacing: 3; Label { styles [ "heading" ] label: "Active Blocklists (TXT)"; xalign: 0.0; } ScrolledWindow { propagate-natural-height: true; child: ListView { model: NoSelection { model: bind template.state as <$BzStateInfo>.txt-blocklists; }; factory: string_list_factory; }; } } Box { orientation: vertical; spacing: 3; Label { styles [ "heading" ] label: "Active Curated-Configs"; xalign: 0.0; } ScrolledWindow { propagate-natural-height: true; child: ListView { model: NoSelection { model: bind template.state as <$BzStateInfo>.curated-configs; }; factory: string_list_factory; }; } } Box { orientation: vertical; spacing: 3; Box { orientation: horizontal; spacing: 10; Label { styles [ "heading" ] label: "Max Age Rating:"; xalign: 0.0; } Label { label: bind $format_int(template.state as <$BzStateInfo>.parental-age-rating) as ; xalign: 0.0; } } Label { styles [ "heading" ] label: "Restricted App IDs"; xalign: 0.0; } ScrolledWindow { propagate-natural-height: true; child: ListView { model: NoSelection { model: bind template.state as <$BzStateInfo>.parental-blocked-ids; }; factory: plain_string_list_factory; }; } } }; }; end-child: Box { orientation: vertical; spacing: 8; Label { styles [ "heading" ] margin-top: 10; label: "All Entry Groups"; xalign: 0.0; } Separator { orientation: horizontal; } Expander { label: "Serialize All Entries Into File"; child: Box { margin-start: 3; margin-end: 3; margin-top: 3; margin-bottom: 3; orientation: vertical; spacing: 5; Box { orientation: horizontal; spacing: 5; Entry serialize_all_entries_path_entry { hexpand: true; placeholder-text: "Enter the path to an output file..."; } Button serialize_all_entries_btn { styles [ "suggested-action", ] label: "Go"; clicked => $serialize_all_entries_cb(template); } } ProgressBar serialize_all_entries_progress { visible: false; } }; } Separator { orientation: horizontal; } Box { orientation: horizontal; spacing: 5; CheckButton { label: "Preview"; notify::active => $preview_changed(template); } Entry search_entry { hexpand: true; margin-start: 5; margin-end: 5; margin-top: 5; margin-bottom: 5; placeholder-text: "Filter..."; changed => $entry_changed(template); } } ScrolledWindow { vscrollbar-policy: always; propagate-natural-height: true; child: ListView { model: SingleSelection groups_selection { model: FilterListModel filter_model { incremental: true; model: bind template.state as <$BzStateInfo>.all-entry-groups; }; notify::selected-item => $selected_group_changed(template); }; factory: BuilderListItemFactory { template ListItem { activatable: false; child: Expander { styles [ "bz-monospace", ] resize-toplevel: true; label-widget: Label { label: bind template.item as <$BzEntryGroup>.id as ; }; child: Box { styles [ "card", ] margin-start: 3; margin-end: 3; margin-top: 3; margin-bottom: 3; halign: start; orientation: horizontal; Box { margin-start: 5; margin-end: 5; margin-top: 5; margin-bottom: 5; orientation: vertical; spacing: 2; Box { margin-start: 2; orientation: horizontal; spacing: 2; Label { styles [ "accent", ] label: bind template.item as <$BzEntryGroup>.title; } Image { gicon: bind template.item as <$BzEntryGroup>.mini-icon; } Box { styles [ "linked", ] hexpand: true; halign: end; orientation: horizontal; MenuButton { styles [ "bz-small-button", ] child: Label { styles [ "bz-monospace", ] margin-start: 2; margin-end: 2; label: "Entries"; }; popover: Popover { child: ScrolledWindow { propagate-natural-width: true; propagate-natural-height: true; child: ListView { model: NoSelection { model: bind template.item as <$BzEntryGroup>.model; }; factory: BuilderListItemFactory { template ListItem { activatable: false; child: Box { margin-top: 1; margin-bottom: 1; orientation: horizontal; spacing: 5; Box { styles [ "linked", ] orientation: horizontal; Button { styles [ "bz-small-button", ] tooltip-text: "Decache and Inspect"; child: Image { icon-name: "external-link-symbolic"; pixel-size: 12; }; clicked => $decache_and_inspect_cb(template); } Button { styles [ "bz-small-button", ] tooltip-text: "Copy Unique ID"; child: Image { icon-name: "edit-copy-symbolic"; pixel-size: 12; }; clicked => $copy_unique_id_cb(template); } } Label { hexpand: true; ellipsize: end; xalign: 0.0; label: bind template.item as <$GtkStringObject>.string as ; selectable: true; } }; } }; }; }; }; } MenuButton { styles [ "bz-small-button", ] visible: bind $not($is_null(template.item as <$BzEntryGroup>.addons-model as <$GListModel>) as ) as ; child: Label { styles [ "bz-monospace", ] margin-start: 2; margin-end: 2; label: "Addons"; }; popover: Popover { child: ScrolledWindow { propagate-natural-width: true; propagate-natural-height: true; child: ListView { model: NoSelection { model: bind template.item as <$BzEntryGroup>.addons-model; }; factory: BuilderListItemFactory { template ListItem { activatable: false; child: Label { hexpand: true; ellipsize: end; xalign: 0.0; label: bind template.item as <$GtkStringObject>.string as ; selectable: true; }; } }; }; }; }; } } } Separator { orientation: horizontal; } Grid { column-spacing: 2; row-spacing: 1; Label { layout { column: 0; row: 0; } label: "Developer:"; xalign: 1.0; } Label { layout { column: 1; row: 0; } styles [ "accent", ] label: bind template.item as <$BzEntryGroup>.developer; ellipsize: end; xalign: 0.5; } Label { layout { column: 0; row: 1; } label: "Description:"; xalign: 1.0; } Label { layout { column: 1; row: 1; } styles [ "accent", ] label: bind template.item as <$BzEntryGroup>.description; ellipsize: end; xalign: 0.5; } Label { layout { column: 0; row: 2; } label: "EOL:"; xalign: 1.0; } Label { layout { column: 1; row: 2; } styles [ "accent", ] label: bind template.item as <$BzEntryGroup>.eol; ellipsize: end; xalign: 0.5; } Label { layout { column: 2; row: 0; } label: "Installable:"; xalign: 1.0; } Label { layout { column: 3; row: 0; } styles [ "accent", ] label: bind $format_int(template.item as <$BzEntryGroup>.installable) as ; xalign: 0.0; } Label { layout { column: 2; row: 1; } label: "Installable-And-Available:"; xalign: 1.0; } Label { layout { column: 3; row: 1; } styles [ "accent", ] label: bind $format_int(template.item as <$BzEntryGroup>.installable-and-available) as ; xalign: 0.0; } Label { layout { column: 2; row: 2; } label: "Updatable:"; xalign: 1.0; } Label { layout { column: 3; row: 2; } styles [ "accent", ] label: bind $format_int(template.item as <$BzEntryGroup>.updatable) as ; xalign: 0.0; } Label { layout { column: 2; row: 3; } label: "Updatable-And-Available:"; xalign: 1.0; } Label { layout { column: 3; row: 3; } styles [ "accent", ] label: bind $format_int(template.item as <$BzEntryGroup>.updatable-and-available) as ; xalign: 0.0; } Label { layout { column: 2; row: 4; } label: "Removable:"; xalign: 1.0; } Label { layout { column: 3; row: 4; } styles [ "accent", ] label: bind $format_int(template.item as <$BzEntryGroup>.removable) as ; xalign: 0.0; } Label { layout { column: 2; row: 5; } label: "Removable-And-Available:"; xalign: 1.0; } Label { layout { column: 3; row: 5; } styles [ "accent", ] label: bind $format_int(template.item as <$BzEntryGroup>.removable-and-available) as ; xalign: 0.0; } } } }; }; } }; }; } }; }; } } BuilderListItemFactory string_list_factory { template ListItem { selectable: false; activatable: false; child: Box { orientation: horizontal; spacing: 10; Label { styles [ "dimmed", "bz-monospace", ] width-request: 30; label: bind $format_uint(template.position) as ; xalign: 1.0; } Label { styles [ "bz-monospace", ] hexpand: true; margin-top: 2; margin-bottom: 2; xalign: 0.0; selectable: true; label: bind template.item as <$GtkStringObject>.string as ; } Button { label: "Open"; clicked => $open_file_externally_cb(template); } }; } } BuilderListItemFactory plain_string_list_factory { template ListItem { selectable: false; activatable: false; child: Box { orientation: horizontal; spacing: 10; Label { styles [ "dimmed", "bz-monospace", ] width-request: 30; label: bind $format_uint(template.position) as ; xalign: 1.0; } Label { styles [ "bz-monospace", ] hexpand: true; margin-top: 2; margin-bottom: 2; xalign: 0.0; selectable: true; label: bind template.item as <$GtkStringObject>.string as ; } }; } } menu inspector_menu { section { item { label: "_Quit Bazaar"; action: "app.quit"; } } }