You need to sign in or sign up before continuing.
Commit 8b67a237 authored by Roman Alifanov's avatar Roman Alifanov

redesign

parent 5505c70a
...@@ -14,15 +14,16 @@ class CommandRunner: ...@@ -14,15 +14,16 @@ class CommandRunner:
def __init__(self, on_done=None): def __init__(self, on_done=None):
self.dialog = None self.dialog = None
self.textbuffer = None self.textbuffer = None
self.on_done = on_done # Callback function to be called after completion self.on_done = on_done # Callback function to be called after completion
def run_command(self, command, dialog): def run_command(self, command, dialog):
self.dialog = 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): def append_log(text):
GLib.idle_add(self.textbuffer.insert_at_cursor, 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) self.textbuffer.get_insert(), 0, False, 0.0, 1.0)
def read_output(source): def read_output(source):
...@@ -39,10 +40,14 @@ class CommandRunner: ...@@ -39,10 +40,14 @@ class CommandRunner:
stderr=subprocess.PIPE, text=True) stderr=subprocess.PIPE, text=True)
threading.Thread(target=read_output, args=(process.stdout,)).start() threading.Thread(target=read_output, args=(process.stdout,)).start()
threading.Thread(target=read_output, args=(process.stderr,)).start() threading.Thread(target=read_output, args=(process.stderr,)).start()
process.wait() process.wait()
GLib.idle_add(dialog.close) GLib.idle_add(dialog.close)
if self.on_done: if self.on_done:
GLib.idle_add(self.on_done) # Call the callback function after completion GLib.idle_add(self.on_done) # Call the callback function after completion
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
GLib.idle_add(append_log, f"Ошибка: {str(e)}\n") GLib.idle_add(append_log, f"Ошибка: {str(e)}\n")
GLib.idle_add(dialog.close) GLib.idle_add(dialog.close)
...@@ -91,6 +96,7 @@ class ApplicationManager: ...@@ -91,6 +96,7 @@ class ApplicationManager:
@staticmethod @staticmethod
def parse_applications_output(output): def parse_applications_output(output):
applications = [] applications = []
for line in output.splitlines()[1:]: # Пропустить заголовок for line in output.splitlines()[1:]: # Пропустить заголовок
parts = line.split(' - ', 1) # Ограничить сплит до 2 частей parts = line.split(' - ', 1) # Ограничить сплит до 2 частей
if len(parts) == 2: if len(parts) == 2:
...@@ -102,6 +108,7 @@ class ApplicationManager: ...@@ -102,6 +108,7 @@ class ApplicationManager:
else: else:
# Логгирование некорректной строки для диагностики # Логгирование некорректной строки для диагностики
print(f"Неправильный формат строки: {line}") print(f"Неправильный формат строки: {line}")
return applications return applications
@staticmethod @staticmethod
...@@ -109,15 +116,30 @@ class ApplicationManager: ...@@ -109,15 +116,30 @@ class ApplicationManager:
lines = output.splitlines()[1:] lines = output.splitlines()[1:]
return [line.split(' - ')[0].strip().split()[0] for line in lines] return [line.split(' - ')[0].strip().split()[0] for line in lines]
class MainWindow(Gtk.ApplicationWindow): class MainWindow(Adw.ApplicationWindow):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.set_title("eepm play gui") 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.box1 = Gtk.Box(
self.set_child(self.box1) orientation=Gtk.Orientation.VERTICAL
)
content_clamp.set_child(self.box1)
self.create_ui_elements() self.create_ui_elements()
self.loading_count = 0 # Track loading operations self.loading_count = 0 # Track loading operations
...@@ -137,10 +159,28 @@ class MainWindow(Gtk.ApplicationWindow): ...@@ -137,10 +159,28 @@ class MainWindow(Gtk.ApplicationWindow):
self.scrolled_window.set_child(self.content_box) self.scrolled_window.set_child(self.content_box)
self.box1.append(self.scrolled_window) 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 = Adw.ButtonRow(
apply_button.connect("clicked", self.on_apply_clicked) title="Применить"
self.box1.append(apply_button) )
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="Загрузка, пожалуйста подождите...") self.loading_label = Gtk.Label(label="Загрузка, пожалуйста подождите...")
...@@ -193,10 +233,18 @@ class MainWindow(Gtk.ApplicationWindow): ...@@ -193,10 +233,18 @@ class MainWindow(Gtk.ApplicationWindow):
self.content_box.append(self.preferences_group) self.content_box.append(self.preferences_group)
def add_application_row(self, app): 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 = Gtk.CheckButton()
checkbox.add_css_class("selection-mode")
checkbox.set_active(app['name'] in self.installed_apps) checkbox.set_active(app['name'] in self.installed_apps)
checkbox.connect("toggled", self.on_checkbox_toggled, app['name']) checkbox.connect("toggled", self.on_checkbox_toggled, app['name'])
row.add_suffix(checkbox) row.add_suffix(checkbox)
self.preferences_group.add(row) self.preferences_group.add(row)
self.checkboxes[app['name']] = checkbox self.checkboxes[app['name']] = checkbox
...@@ -229,19 +277,32 @@ class MainWindow(Gtk.ApplicationWindow): ...@@ -229,19 +277,32 @@ class MainWindow(Gtk.ApplicationWindow):
return commands return commands
def show_log_dialog(self, command): def show_log_dialog(self, command):
dialog = Gtk.Dialog(title="Лог выполнения", transient_for=self, modal=True) dialog = Adw.Dialog(title="Лог выполнения")
dialog.set_default_size(400, 300) 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 = Gtk.TextView()
textview.set_editable(False) textview.set_editable(False)
textbuffer = textview.get_buffer() 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_child(textview)
scrolled_window.set_vexpand(True) scrolled_window.set_vexpand(True)
dialog.set_child(scrolled_window) dialog_clamp.set_child(scrolled_window)
dialog.present()
dialog.set_child(dialog_clamp)
dialog.present(self)
# Создание и передача функции обратного вызова для обновления UI # Создание и передача функции обратного вызова для обновления UI
runner = CommandRunner(on_done=self.update_ui_after_log) runner = CommandRunner(on_done=self.update_ui_after_log)
...@@ -258,10 +319,18 @@ class MyApp(Adw.Application): ...@@ -258,10 +319,18 @@ class MyApp(Adw.Application):
self.connect('activate', self.on_activate) self.connect('activate', self.on_activate)
def on_activate(self, app): 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() self.win.present()
if __name__ == "__main__": if __name__ == "__main__":
app = MyApp(application_id="com.example.GtkApplication") app = MyApp(application_id="ru.etersoft.EtersoftEpmPlayGUI")
app.run(sys.argv) 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