Commit 8b67a237 authored by Roman Alifanov's avatar Roman Alifanov

redesign

parent 5505c70a
......@@ -14,15 +14,16 @@ class CommandRunner:
def __init__(self, on_done=None):
self.dialog = None
self.textbuffer = None
self.on_done = on_done # Callback function to be called after completion
def run_command(self, command, dialog):
self.dialog = dialog
self.textbuffer = dialog.get_child().get_child().get_buffer()
self.textbuffer = dialog.get_child().get_child().get_child().get_buffer()
def append_log(text):
GLib.idle_add(self.textbuffer.insert_at_cursor, text)
GLib.idle_add(dialog.get_child().get_child().scroll_to_mark,
GLib.idle_add(dialog.get_child().get_child().get_child().scroll_to_mark,
self.textbuffer.get_insert(), 0, False, 0.0, 1.0)
def read_output(source):
......@@ -39,10 +40,14 @@ class CommandRunner:
stderr=subprocess.PIPE, text=True)
threading.Thread(target=read_output, args=(process.stdout,)).start()
threading.Thread(target=read_output, args=(process.stderr,)).start()
process.wait()
GLib.idle_add(dialog.close)
if self.on_done:
GLib.idle_add(self.on_done) # Call the callback function after completion
except subprocess.CalledProcessError as e:
GLib.idle_add(append_log, f"Ошибка: {str(e)}\n")
GLib.idle_add(dialog.close)
......@@ -91,6 +96,7 @@ class ApplicationManager:
@staticmethod
def parse_applications_output(output):
applications = []
for line in output.splitlines()[1:]: # Пропустить заголовок
parts = line.split(' - ', 1) # Ограничить сплит до 2 частей
if len(parts) == 2:
......@@ -102,6 +108,7 @@ class ApplicationManager:
else:
# Логгирование некорректной строки для диагностики
print(f"Неправильный формат строки: {line}")
return applications
@staticmethod
......@@ -109,15 +116,30 @@ class ApplicationManager:
lines = output.splitlines()[1:]
return [line.split(' - ')[0].strip().split()[0] for line in lines]
class MainWindow(Gtk.ApplicationWindow):
class MainWindow(Adw.ApplicationWindow):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.set_title("eepm play gui")
self.set_default_size(400, 600)
self.toolbar = Adw.ToolbarView()
self.toolbar.add_top_bar(Adw.HeaderBar())
self.set_content(self.toolbar)
# Clamp
content_clamp = Adw.Clamp(
margin_bottom=12,
margin_end=12,
margin_top=12,
margin_start=12,
maximum_size=500
)
self.toolbar.set_content(content_clamp)
# Инициализация основного контейнера
self.box1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.set_child(self.box1)
self.box1 = Gtk.Box(
orientation=Gtk.Orientation.VERTICAL
)
content_clamp.set_child(self.box1)
self.create_ui_elements()
self.loading_count = 0 # Track loading operations
......@@ -136,11 +158,29 @@ class MainWindow(Gtk.ApplicationWindow):
# Добавление скролл-окна в основной контейнер
self.scrolled_window.set_child(self.content_box)
self.box1.append(self.scrolled_window)
bottom_clamp = Adw.Clamp(
margin_bottom=12,
margin_end=12,
margin_top=12,
margin_start=12,
maximum_size=360
)
bottom_listbox = Gtk.ListBox()
bottom_listbox.add_css_class("boxed-list")
bottom_clamp.set_child(bottom_listbox)
# Кнопка применения
apply_button = Gtk.Button(label="Применить")
apply_button.connect("clicked", self.on_apply_clicked)
self.box1.append(apply_button)
apply_button = Adw.ButtonRow(
title="Применить"
)
apply_button.add_css_class("suggested-action")
apply_button.connect("activated", self.on_apply_clicked)
bottom_listbox.append(apply_button)
self.toolbar.add_bottom_bar(bottom_clamp)
# Создание и добавление сообщения о загрузке
self.loading_label = Gtk.Label(label="Загрузка, пожалуйста подождите...")
......@@ -193,10 +233,18 @@ class MainWindow(Gtk.ApplicationWindow):
self.content_box.append(self.preferences_group)
def add_application_row(self, app):
row = Adw.ActionRow(title=app['name'], subtitle=app['dscr'])
row = Adw.ActionRow(
title=app['name'],
subtitle=app['dscr']
)
checkbox = Gtk.CheckButton()
checkbox.add_css_class("selection-mode")
checkbox.set_active(app['name'] in self.installed_apps)
checkbox.connect("toggled", self.on_checkbox_toggled, app['name'])
row.add_suffix(checkbox)
self.preferences_group.add(row)
self.checkboxes[app['name']] = checkbox
......@@ -229,19 +277,32 @@ class MainWindow(Gtk.ApplicationWindow):
return commands
def show_log_dialog(self, command):
dialog = Gtk.Dialog(title="Лог выполнения", transient_for=self, modal=True)
dialog.set_default_size(400, 300)
dialog = Adw.Dialog(title="Лог выполнения")
dialog.set_follows_content_size(True)
dialog_clamp = Adw.Clamp(
margin_bottom=12,
margin_end=12,
margin_top=12,
margin_start=12,
maximum_size=500
)
textview = Gtk.TextView()
textview.set_editable(False)
textbuffer = textview.get_buffer()
scrolled_window = Gtk.ScrolledWindow()
scrolled_window = Gtk.ScrolledWindow(
width_request=304,
height_request=259
)
scrolled_window.set_child(textview)
scrolled_window.set_vexpand(True)
dialog_clamp.set_child(scrolled_window)
dialog.set_child(scrolled_window)
dialog.present()
dialog.set_child(dialog_clamp)
dialog.present(self)
# Создание и передача функции обратного вызова для обновления UI
runner = CommandRunner(on_done=self.update_ui_after_log)
......@@ -258,10 +319,18 @@ class MyApp(Adw.Application):
self.connect('activate', self.on_activate)
def on_activate(self, app):
self.win = MainWindow(application=app)
self.win = MainWindow(
application=app,
default_width=600,
default_height=500,
width_request=360,
height_request=294
)
self.win.present()
if __name__ == "__main__":
app = MyApp(application_id="com.example.GtkApplication")
app = MyApp(application_id="ru.etersoft.EtersoftEpmPlayGUI")
app.run(sys.argv)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment