mirror of
https://github.com/morgan9e/warehouse
synced 2026-04-14 00:04:08 +09:00
Continue work on install page
This commit is contained in:
@@ -125,6 +125,9 @@ template $InstallPage : Adw.BreakpointBin {
|
||||
Button clear_button {
|
||||
label: _("Remove All");
|
||||
}
|
||||
}
|
||||
Adw.PreferencesPage added_pref_page {
|
||||
|
||||
}
|
||||
[bottom]
|
||||
Box {
|
||||
|
||||
@@ -3,8 +3,42 @@ from .host_info import HostInfo
|
||||
from .error_toast import ErrorToast
|
||||
from .app_row import AppRow
|
||||
from .snapshots_list_page import SnapshotsListPage
|
||||
from .result_row import ResultRow
|
||||
import os, subprocess
|
||||
|
||||
class AddedPackage:
|
||||
def __init__(self, name, app_id, branch, version, remote, installation):
|
||||
self.name = name
|
||||
self.app_id = app_id
|
||||
self.branch = branch
|
||||
self.version = version
|
||||
self.remote = remote
|
||||
self.installation = installation
|
||||
|
||||
class AddedGroup(Adw.PreferencesGroup):
|
||||
__gtype_name__ = "AddedGroup"
|
||||
|
||||
package_rows = []
|
||||
|
||||
def add_row(self, row):
|
||||
self.package_rows.append(row)
|
||||
self.add(row)
|
||||
self.set_visible(True)
|
||||
|
||||
def rem_row(self, row):
|
||||
if row in self.package_rows:
|
||||
self.package_rows.remove(row)
|
||||
self.remove(row)
|
||||
|
||||
def __init__(self, remote, installation, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
|
||||
self.remote = remote
|
||||
self.installation = installation
|
||||
|
||||
self.set_title(f"{remote.title}")
|
||||
self.set_description(_("Installation: {}").format(installation))
|
||||
|
||||
@Gtk.Template(resource_path="/io/github/flattool/Warehouse/install_page/install_page.ui")
|
||||
class InstallPage(Adw.BreakpointBin):
|
||||
__gtype_name__ = "InstallPage"
|
||||
@@ -17,6 +51,7 @@ class InstallPage(Adw.BreakpointBin):
|
||||
search_entry = gtc()
|
||||
search_apply_button = gtc()
|
||||
results_list = gtc()
|
||||
added_pref_page = gtc()
|
||||
|
||||
# Referred to in the main window
|
||||
# It is used to determine if a new page should be made or not
|
||||
@@ -27,7 +62,11 @@ class InstallPage(Adw.BreakpointBin):
|
||||
current_remote = None
|
||||
|
||||
def start_loading(self):
|
||||
pass
|
||||
for row in self.remote_rows:
|
||||
self.remotes_group.remove(row)
|
||||
self.remote_rows.clear()
|
||||
self.added_packages.clear()
|
||||
self.added_package_groups.clear()
|
||||
|
||||
def end_loading(self):
|
||||
for installation in HostInfo.installations:
|
||||
@@ -38,6 +77,7 @@ class InstallPage(Adw.BreakpointBin):
|
||||
row.add_suffix(Gtk.Image(icon_name="right-large-symbolic"))
|
||||
row.connect("activated", self.remote_selected, installation, remote)
|
||||
self.remotes_group.add(row)
|
||||
self.remote_rows.append(row)
|
||||
|
||||
def remote_selected(self, row, installation, remote):
|
||||
self.current_installation = installation
|
||||
@@ -63,7 +103,7 @@ class InstallPage(Adw.BreakpointBin):
|
||||
|
||||
try:
|
||||
output = subprocess.run(['flatpak-spawn', '--host', 'flatpak', 'search', '--columns=all', installation, text], text=True, check=True, capture_output=True).stdout.split("\n")
|
||||
for line in output:
|
||||
for i, line in enumerate(output):
|
||||
info = line.split("\t")
|
||||
if len(info) != 6:
|
||||
continue
|
||||
@@ -73,11 +113,26 @@ class InstallPage(Adw.BreakpointBin):
|
||||
app_id = GLib.markup_escape_text(info[2])
|
||||
version = GLib.markup_escape_text(info[3])
|
||||
branch = GLib.markup_escape_text(info[4])
|
||||
remotes = GLib.markup_escape_text(info[5])
|
||||
row = Adw.ActionRow(title=name, subtitle=app_id)
|
||||
remotes = info[5]
|
||||
|
||||
self.results_list.append(row)
|
||||
|
||||
if not self.current_remote.name in remotes.split(','):
|
||||
continue
|
||||
|
||||
is_added = False
|
||||
try:
|
||||
for package in self.added_packages:
|
||||
if package.name == name and package.app_id == app_id and package.version == version and package.branch == branch:
|
||||
is_added = True
|
||||
break
|
||||
|
||||
except KeyError:
|
||||
print("passing key error")
|
||||
|
||||
if not is_added:
|
||||
row = ResultRow(name, app_id, branch, version)
|
||||
row.connect("activated", self.add_package, i, name, app_id, branch, version)
|
||||
self.results_list.append(row)
|
||||
|
||||
except Exception as e:
|
||||
print(e)
|
||||
except subprocess.CalledProcessError as cpe:
|
||||
@@ -85,9 +140,60 @@ class InstallPage(Adw.BreakpointBin):
|
||||
|
||||
thread()
|
||||
|
||||
def list_focus_grabber(self, row):
|
||||
i = 0
|
||||
prev_visible_row = None
|
||||
while rover := self.results_list.get_row_at_index(i):
|
||||
i += 1
|
||||
if rover is row:
|
||||
break
|
||||
|
||||
if rover.get_visible():
|
||||
prev_visible_row = rover
|
||||
|
||||
while rover := self.results_list.get_row_at_index(i):
|
||||
i += 1
|
||||
if rover.get_visible():
|
||||
rover.grab_focus()
|
||||
return
|
||||
|
||||
if prev_visible_row:
|
||||
prev_visible_row.grab_focus()
|
||||
|
||||
def add_package(self, row, index, name, app_id, branch, version):
|
||||
key = f"{self.current_remote}<>{self.current_installation}"
|
||||
package = AddedPackage(name, app_id, branch, version, self.current_remote, self.current_installation)
|
||||
added_row = ResultRow(name, app_id, branch, version, row)
|
||||
self.added_packages.append(package)
|
||||
group = None
|
||||
try:
|
||||
group = self.added_package_groups[key]
|
||||
group.add_row(added_row)
|
||||
except KeyError:
|
||||
group = AddedGroup(self.current_remote, self.current_installation)
|
||||
self.added_package_groups[key] = group
|
||||
self.added_pref_page.add(group)
|
||||
group.add_row(added_row)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return
|
||||
added_row.connect("activated", self.remove_package, group)
|
||||
row.set_visible(False)
|
||||
self.list_focus_grabber(row)
|
||||
|
||||
def remove_package(self, row, group):
|
||||
row.original_row.set_visible(True)
|
||||
group.rem_row(row)
|
||||
if len(group.package_rows) == 0:
|
||||
group.set_visible(False)
|
||||
|
||||
def __init__(self, main_window, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
self.instance = self
|
||||
self.main_window = main_window
|
||||
self.remote_rows = []
|
||||
self.added_packages = [] # remote<>installation
|
||||
self.added_package_groups = {} # remote<>installation
|
||||
self.back_button.connect("clicked", lambda *_: self.sb_page_view.pop())
|
||||
# self.search_entry.connect("search-changed", self.on_search)
|
||||
self.search_entry.connect("activate", self.on_search)
|
||||
|
||||
39
src/install_page/result_row.blp
Normal file
39
src/install_page/result_row.blp
Normal file
@@ -0,0 +1,39 @@
|
||||
using Gtk 4.0;
|
||||
using Adw 1;
|
||||
|
||||
template $ResultRow : Adw.ActionRow {
|
||||
activatable: true;
|
||||
title: "No title set";
|
||||
subtitle: "No subtitle set";
|
||||
|
||||
Box {
|
||||
orientation: vertical;
|
||||
valign: center;
|
||||
spacing: 4;
|
||||
margin-end: 4;
|
||||
Label version_label {
|
||||
styles ["subtitle"]
|
||||
label: "";
|
||||
justify: right;
|
||||
halign: end;
|
||||
hexpand: true;
|
||||
wrap: true;
|
||||
}
|
||||
Label branch_label {
|
||||
styles ["subtitle"]
|
||||
label: "";
|
||||
justify: right;
|
||||
halign: end;
|
||||
hexpand: true;
|
||||
wrap: true;
|
||||
}
|
||||
}
|
||||
[suffix]
|
||||
Image add_image {
|
||||
icon-name: "plus-large-symbolic";
|
||||
}
|
||||
[suffix]
|
||||
Image sub_image {
|
||||
icon-name: "minus-large-symbolic";
|
||||
}
|
||||
}
|
||||
36
src/install_page/result_row.py
Normal file
36
src/install_page/result_row.py
Normal file
@@ -0,0 +1,36 @@
|
||||
from gi.repository import Adw, Gtk, GLib, Gio
|
||||
from .host_info import HostInfo
|
||||
from .error_toast import ErrorToast
|
||||
import os, subprocess
|
||||
|
||||
@Gtk.Template(resource_path="/io/github/flattool/Warehouse/install_page/result_row.ui")
|
||||
class ResultRow(Adw.ActionRow):
|
||||
__gtype_name__ = "ResultRow"
|
||||
gtc = Gtk.Template.Child
|
||||
|
||||
version_label = gtc()
|
||||
branch_label = gtc()
|
||||
add_image = gtc()
|
||||
sub_image = gtc()
|
||||
|
||||
def idle_stuff(self):
|
||||
self.set_title(GLib.markup_escape_text(self.name))
|
||||
self.set_subtitle(self.app_id)
|
||||
self.version_label.set_label(GLib.markup_escape_text(self.version))
|
||||
self.branch_label.set_label(GLib.markup_escape_text(self.branch))
|
||||
self.version_label.set_visible(len(self.version_label.get_label()) != 0)
|
||||
self.branch_label.set_visible(len(self.branch_label.get_label()) != 0)
|
||||
self.sub_image.set_visible(bool(self.original_row))
|
||||
self.add_image.set_visible(not bool(self.original_row))
|
||||
self.set_tooltip_text(_("Remove Package from Queue") if bool(self.original_row) else _("Add Package to Queue"))
|
||||
|
||||
def __init__(self, name, app_id, branch, version, original_row=None, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
|
||||
self.name = name
|
||||
self.app_id = app_id
|
||||
self.branch = branch
|
||||
self.version = version
|
||||
self.original_row = original_row
|
||||
|
||||
GLib.idle_add(self.idle_stuff)
|
||||
@@ -21,6 +21,7 @@ blueprints = custom_target('blueprints',
|
||||
'snapshot_page/snapshots_list_page.blp',
|
||||
'snapshot_page/snapshot_box.blp',
|
||||
'install_page/install_page.blp',
|
||||
'install_page/result_row.blp',
|
||||
),
|
||||
output: '.',
|
||||
command: [find_program('blueprint-compiler'), 'batch-compile', '@OUTPUT@', '@CURRENT_SOURCE_DIR@', '@INPUT@'],
|
||||
@@ -80,6 +81,7 @@ warehouse_sources = [
|
||||
'snapshot_page/snapshots_list_page.py',
|
||||
'snapshot_page/snapshot_box.py',
|
||||
'install_page/install_page.py',
|
||||
'install_page/result_row.py',
|
||||
'../data/style.css',
|
||||
]
|
||||
|
||||
|
||||
@@ -66,6 +66,4 @@ template $SnapshotBox : Gtk.Box {
|
||||
styles ["flat"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Adw.AlertDialog name_dialog {}
|
||||
}
|
||||
@@ -19,6 +19,7 @@
|
||||
<file preprocess="xml-stripblanks">snapshot_page/snapshots_list_page.ui</file>
|
||||
<file preprocess="xml-stripblanks">snapshot_page/snapshot_box.ui</file>
|
||||
<file preprocess="xml-stripblanks">install_page/install_page.ui</file>
|
||||
<file preprocess="xml-stripblanks">install_page/result_row.ui</file>
|
||||
<!-- <file preprocess="xml-stripblanks">../data/io.github.flattool.Warehouse.metainfo.xml.in</file> -->
|
||||
</gresource>
|
||||
<gresource prefix="/io/github/flattool/Warehouse/icons/scalable/actions/">
|
||||
|
||||
Reference in New Issue
Block a user