230 lines
8.3 KiB
Python
230 lines
8.3 KiB
Python
# dialogs.py
|
|
|
|
from gi.repository import Adw, Gtk, Gdk, GLib, GtkSource, Gio, GdkPixbuf
|
|
from .available_models import available_models
|
|
|
|
# CLEAR CHAT | WORKS
|
|
|
|
def clear_chat_response(self, dialog, task):
|
|
if dialog.choose_finish(task) == "clear":
|
|
self.clear_chat()
|
|
|
|
def clear_chat(self):
|
|
if self.bot_message is not None:
|
|
self.show_toast("info", 1, self.main_overlay)
|
|
return
|
|
dialog = Adw.AlertDialog(
|
|
heading=_("Clear Chat"),
|
|
body=_("Are you sure you want to clear the chat?"),
|
|
close_response="cancel"
|
|
)
|
|
dialog.add_response("cancel", _("Cancel"))
|
|
dialog.add_response("clear", _("Clear"))
|
|
dialog.set_response_appearance("clear", Adw.ResponseAppearance.DESTRUCTIVE)
|
|
dialog.choose(
|
|
parent = self,
|
|
cancellable = None,
|
|
callback = lambda dialog, task: clear_chat_response(self, dialog, task)
|
|
)
|
|
|
|
# DELETE CHAT | WORKS
|
|
|
|
def delete_chat_response(self, dialog, task, chat_name):
|
|
if dialog.choose_finish(task) == "delete":
|
|
self.delete_chat(chat_name)
|
|
|
|
def delete_chat(self, chat_name):
|
|
dialog = Adw.AlertDialog(
|
|
heading=_("Delete Chat"),
|
|
body=_("Are you sure you want to delete '{}'?").format(chat_name),
|
|
close_response="cancel"
|
|
)
|
|
dialog.add_response("cancel", _("Cancel"))
|
|
dialog.add_response("delete", _("Delete"))
|
|
dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE)
|
|
dialog.choose(
|
|
parent = self,
|
|
cancellable = None,
|
|
callback = lambda dialog, task, chat_name=chat_name: delete_chat_response(self, dialog, task, chat_name)
|
|
)
|
|
|
|
# RENAME CHAT | WORKS
|
|
|
|
def rename_chat_response(self, dialog, task, old_chat_name, entry, label_element):
|
|
if not entry: return
|
|
new_chat_name = entry.get_text()
|
|
if old_chat_name == new_chat_name: return
|
|
if new_chat_name and (task is None or dialog.choose_finish(task) == "rename"):
|
|
self.rename_chat(old_chat_name, new_chat_name, label_element)
|
|
|
|
def rename_chat(self, label_element):
|
|
chat_name = label_element.get_parent().get_name()
|
|
entry = Gtk.Entry()
|
|
dialog = Adw.AlertDialog(
|
|
heading=_("Rename Chat"),
|
|
body=_("Renaming '{}'").format(chat_name),
|
|
extra_child=entry,
|
|
close_response="cancel"
|
|
)
|
|
entry.connect("activate", lambda dialog, old_chat_name=chat_name, entry=entry, label_element=label_element: rename_chat_response(self, dialog, None, old_chat_name, entry, label_element))
|
|
dialog.add_response("cancel", _("Cancel"))
|
|
dialog.add_response("rename", _("Rename"))
|
|
dialog.set_response_appearance("rename", Adw.ResponseAppearance.SUGGESTED)
|
|
dialog.choose(
|
|
parent = self,
|
|
cancellable = None,
|
|
callback = lambda dialog, task, old_chat_name=chat_name, entry=entry, label_element=label_element: rename_chat_response(self, dialog, task, old_chat_name, entry, label_element)
|
|
)
|
|
|
|
# NEW CHAT | WORKS | UNUSED REASON: The 'Add Chat' button now creates a chat without a name AKA "New Chat"
|
|
|
|
def new_chat_response(self, dialog, task, entry):
|
|
chat_name = _("New Chat")
|
|
if entry is not None and entry.get_text() != "": chat_name = entry.get_text()
|
|
if chat_name and (task is None or dialog.choose_finish(task) == "create"):
|
|
self.new_chat(chat_name)
|
|
|
|
|
|
def new_chat(self):
|
|
entry = Gtk.Entry()
|
|
dialog = Adw.AlertDialog(
|
|
heading=_("Create Chat"),
|
|
body=_("Enter name for new chat"),
|
|
extra_child=entry,
|
|
close_response="cancel"
|
|
)
|
|
entry.connect("activate", lambda dialog, entry: new_chat_response(self, dialog, None, entry))
|
|
dialog.add_response("cancel", _("Cancel"))
|
|
dialog.add_response("create", _("Create"))
|
|
dialog.set_response_appearance("create", Adw.ResponseAppearance.SUGGESTED)
|
|
dialog.choose(
|
|
parent = self,
|
|
cancellable = None,
|
|
callback = lambda dialog, task, entry=entry: new_chat_response(self, dialog, task, entry)
|
|
)
|
|
|
|
# STOP PULL MODEL | WORKS
|
|
|
|
def stop_pull_model_response(self, dialog, task, model_name):
|
|
if dialog.choose_finish(task) == "stop":
|
|
self.stop_pull_model(model_name)
|
|
|
|
def stop_pull_model(self, model_name):
|
|
dialog = Adw.AlertDialog(
|
|
heading=_("Stop Model"),
|
|
body=_("Are you sure you want to stop pulling '{}'?").format(model_name),
|
|
close_response="cancel"
|
|
)
|
|
dialog.add_response("cancel", _("Cancel"))
|
|
dialog.add_response("stop", _("Stop"))
|
|
dialog.set_response_appearance("stop", Adw.ResponseAppearance.DESTRUCTIVE)
|
|
dialog.choose(
|
|
parent = self.manage_models_dialog,
|
|
cancellable = None,
|
|
callback = lambda dialog, task, model_name = model_name: stop_pull_model_response(self, dialog, task, model_name)
|
|
)
|
|
|
|
# DELETE MODEL | WORKS
|
|
|
|
def delete_model_response(self, dialog, task, model_name):
|
|
if dialog.choose_finish(task) == "delete":
|
|
self.delete_model(model_name)
|
|
|
|
def delete_model(self, model_name):
|
|
dialog = Adw.AlertDialog(
|
|
heading=_("Delete Model"),
|
|
body=_("Are you sure you want to delete '{}'?").format(model_name),
|
|
close_response="cancel"
|
|
)
|
|
dialog.add_response("cancel", _("Cancel"))
|
|
dialog.add_response("delete", _("Delete"))
|
|
dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE)
|
|
dialog.choose(
|
|
parent = self.manage_models_dialog,
|
|
cancellable = None,
|
|
callback = lambda dialog, task, model_name = model_name: delete_model_response(self, dialog, task, model_name)
|
|
)
|
|
|
|
# PULL MODEL | WORKS
|
|
|
|
def pull_model_response(self, dialog, task, model_name, tag_drop_down):
|
|
if dialog.choose_finish(task) == "pull":
|
|
model = f"{model_name}:{tag_drop_down.get_selected_item().get_string().split(' | ')[0]}"
|
|
self.pull_model(model)
|
|
|
|
def pull_model(self, model_name):
|
|
tag_list = Gtk.StringList()
|
|
for tag in available_models[model_name]['tags']:
|
|
tag_list.append(f"{tag[0]} | {tag[1]}")
|
|
tag_drop_down = Gtk.DropDown(
|
|
enable_search=True,
|
|
model=tag_list
|
|
)
|
|
dialog = Adw.AlertDialog(
|
|
heading=_("Pull Model"),
|
|
body=_("Please select a tag to pull '{}'").format(model_name),
|
|
extra_child=tag_drop_down,
|
|
close_response="cancel"
|
|
)
|
|
dialog.add_response("cancel", _("Cancel"))
|
|
dialog.add_response("pull", _("Pull"))
|
|
dialog.set_response_appearance("pull", Adw.ResponseAppearance.SUGGESTED)
|
|
dialog.choose(
|
|
parent = self.manage_models_dialog,
|
|
cancellable = None,
|
|
callback = lambda dialog, task, model_name = model_name, tag_drop_down = tag_drop_down: pull_model_response(self, dialog, task, model_name, tag_drop_down)
|
|
)
|
|
|
|
# REMOVE IMAGE | WORKS
|
|
|
|
def remove_image_response(self, dialog, task):
|
|
if dialog.choose_finish(task) == 'remove':
|
|
self.remove_image()
|
|
|
|
def remove_image(self):
|
|
dialog = Adw.AlertDialog(
|
|
heading=_("Remove Image"),
|
|
body=_("Are you sure you want to remove image?"),
|
|
close_response="cancel"
|
|
)
|
|
dialog.add_response("cancel", _("Cancel"))
|
|
dialog.add_response("remove", _("Remove"))
|
|
dialog.set_response_appearance("remove", Adw.ResponseAppearance.DESTRUCTIVE)
|
|
dialog.choose(
|
|
parent = self,
|
|
cancellable = None,
|
|
callback = lambda dialog, task: remove_image_response(self, dialog, task)
|
|
)
|
|
|
|
# RECONNECT REMOTE |
|
|
|
|
def reconnect_remote_response(self, dialog, task, entry):
|
|
response = dialog.choose_finish(task)
|
|
if not task or response == "remote":
|
|
self.connect_remote(entry.get_text())
|
|
elif response == "local":
|
|
self.connect_local()
|
|
elif response == "close":
|
|
self.destroy()
|
|
|
|
def reconnect_remote(self, current_url):
|
|
entry = Gtk.Entry(
|
|
css_classes = ["error"],
|
|
text = current_url
|
|
)
|
|
dialog = Adw.AlertDialog(
|
|
heading=_("Connection Error"),
|
|
body=_("The remote instance has disconnected"),
|
|
extra_child=entry
|
|
)
|
|
entry.connect("activate", lambda entry, dialog: reconnect_remote_response(self, dialog, None, entry))
|
|
dialog.add_response("close", _("Close Alpaca"))
|
|
dialog.add_response("local", _("Use local instance"))
|
|
dialog.add_response("remote", _("Connect"))
|
|
dialog.set_response_appearance("remote", Adw.ResponseAppearance.SUGGESTED)
|
|
dialog.choose(
|
|
parent = self,
|
|
cancellable = None,
|
|
callback = lambda dialog, task, entry=entry: reconnect_remote_response(self, dialog, task, entry)
|
|
)
|