Skip to content

Commit

Permalink
Add function for creating MessageDialogs
Browse files Browse the repository at this point in the history
  • Loading branch information
kra-mo committed Dec 21, 2023
1 parent 406ce3b commit 3b5b0b2
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 61 deletions.
60 changes: 31 additions & 29 deletions hyperplane/items_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
from hyperplane.item import HypItem
from hyperplane.item_filter import HypItemFilter
from hyperplane.item_sorter import HypItemSorter
from hyperplane.utils.create_message_dialog import create_message_dialog
from hyperplane.utils.files import (
copy,
get_copy_gfile,
Expand Down Expand Up @@ -622,14 +623,6 @@ def __new_folder(self, *_args: Any) -> None:
else:
gfile = self.gfile

dialog = Adw.MessageDialog.new(self.get_root(), _("New Folder"))

dialog.add_response("cancel", _("Cancel"))
dialog.add_response("create", _("Create"))

dialog.set_default_response("create")
dialog.set_response_appearance("create", Adw.ResponseAppearance.SUGGESTED)

preferences_group = Adw.PreferencesGroup(width_request=360)
revealer_label = Gtk.Label(
margin_start=6,
Expand All @@ -638,7 +631,29 @@ def __new_folder(self, *_args: Any) -> None:
)
preferences_group.add(revealer := Gtk.Revealer(child=revealer_label))
preferences_group.add(entry := Adw.EntryRow(title=_("Folder name")))
dialog.set_extra_child(preferences_group)

def dialog_cb() -> None:
create_folder()

dialog = create_message_dialog(
self.get_root(),
_("New Folder"),
(
_("Cancel"),
None,
None,
None,
False,
),
(
_("Create"),
"create",
Adw.ResponseAppearance.SUGGESTED,
dialog_cb,
True,
),
extra_child=preferences_group,
)

dialog.set_response_enabled("create", False)
can_create = False
Expand Down Expand Up @@ -679,11 +694,6 @@ def create_folder(*_args: Any):
gfile,
)

def handle_response(_dialog: Adw.MessageDialog, response: str) -> None:
if response == "create":
create_folder()

dialog.connect("response", handle_response)
entry.connect("entry-activated", create_folder)
entry.connect("changed", set_incative)

Expand Down Expand Up @@ -878,21 +888,13 @@ def delete():
"Are you sure you want to permanently delete the {} selected items?"
).format(len(gfiles))

dialog = Adw.MessageDialog.new(self.get_root(), msg)
dialog.set_body(_("If you delete an item, it will be permanently lost."))

dialog.add_response("cancel", _("Cancel"))
dialog.add_response("delete", _("Delete"))

dialog.set_default_response("delete")
dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE)

def handle_response(_dialog: Adw.MessageDialog, response: str) -> None:
if response == "delete":
delete()

dialog.connect("response", handle_response)
dialog.present()
create_message_dialog(
self.get_root(),
msg,
(_("Cancel"), None, None, None, False),
(_("Delete"), None, Adw.ResponseAppearance.DESTRUCTIVE, delete, True),
body=_("If you delete an item, it will be permanently lost."),
).present()

def __trash_restore(self, *_args: Any) -> None:
gfiles = self.get_selected_gfiles()
Expand Down
66 changes: 66 additions & 0 deletions hyperplane/utils/create_message_dialog.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# create_message_dialog.py
#
# Copyright 2023 kramo
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# SPDX-License-Identifier: GPL-3.0-or-later

"""Returns an `AdwMessageDialog` with the given properties."""
from typing import Callable, Optional

from gi.repository import Adw, Gtk


def create_message_dialog(
parent: Gtk.Window,
heading: str,
*responses: tuple[
str, # Name
Optional[str], # ID
Optional[Adw.ResponseAppearance], # Appearance
Optional[Callable], # Callback
bool, # Default
],
body: Optional[str] = None,
extra_child: Optional[Gtk.Widget] = None,
) -> Adw.MessageDialog:
"""Returns an `AdwMessageDialog` with the given properties."""
dialog = Adw.MessageDialog.new(parent, heading, body)

if extra_child:
dialog.set_extra_child(extra_child)

callables = {}

for index, response in enumerate(responses):
response_id = response[1] or str(index)

dialog.add_response(response_id, response[0])

if response[2]:
dialog.set_response_appearance(response_id, response[2])

if response[3]:
callables[response_id] = response[3]

if response[4]:
dialog.set_default_response(response_id)

def handle_response(_dialog: Adw.MessageDialog, response: str) -> None:
if response in callables:
callables[response]()

dialog.connect("response", handle_response)
return dialog
54 changes: 22 additions & 32 deletions hyperplane/window.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
from hyperplane.navigation_bin import HypNavigationBin
from hyperplane.properties import HypPropertiesWindow
from hyperplane.tag_row import HypTagRow
from hyperplane.utils.create_message_dialog import create_message_dialog
from hyperplane.utils.files import (
clear_recent_files,
empty_trash,
Expand Down Expand Up @@ -166,7 +167,7 @@ def __init__(self, **kwargs: Any) -> None:
self.create_action("new-window", self.__new_window, ("<primary>n",))
self.create_action("new-tab", self.__new_tab, ("<primary>t",))
self.create_action("tab-overview", self.__tab_overview, ("<primary><shift>o",))
self.create_action("empty-trash", self.__emptry_trash)
self.create_action("empty-trash", self.__empty_trash)
self.create_action("clear-recents", self.__clear_recents)

# Connect signals
Expand Down Expand Up @@ -383,18 +384,9 @@ def __update_tags(self, *_args: Any) -> None:
self.sidebar.insert(row, 2)

def __new_tag(self, *_args: Any) -> None:
dialog = Adw.MessageDialog.new(self, _("New Category"))

dialog.add_response("cancel", _("Cancel"))
dialog.add_response("add", _("Add"))

dialog.set_default_response("add")
dialog.set_response_appearance("add", Adw.ResponseAppearance.SUGGESTED)

(preferences_group := Adw.PreferencesGroup(width_request=360)).add(
entry := Adw.EntryRow(title=_("Name"))
)
dialog.set_extra_child(preferences_group)

def add_tag(*_args: Any) -> None:
dialog.close()
Expand All @@ -410,17 +402,20 @@ def add_tag(*_args: Any) -> None:
return

if text in (".", ".."):
self.send_toast(_("A category cannot be named {}").format(f'"{text}"'))
self.send_toast(_("A category cannot be called {}").format(f'"{text}"'))
return

add_tags(text)

def handle_response(_dialog: Adw.MessageDialog, response: str) -> None:
if response == "add":
add_tag()
dialog = create_message_dialog(
self,
_("New Category"),
(_("Cancel"), None, None, None, False),
(_("Add"), None, Adw.ResponseAppearance.SUGGESTED, add_tag, True),
extra_child=preferences_group,
)

entry.connect("entry-activated", add_tag)
dialog.connect("response", handle_response)
dialog.choose()

def __open_trash(self, *_args: Any) -> None:
Expand Down Expand Up @@ -835,25 +830,20 @@ def __sidebar_middle_click(
) -> None:
self.new_tab(gfile)

def __emptry_trash(self, *_args: Any) -> None:
dialog = Adw.MessageDialog.new(
def __empty_trash(self, *_args: Any) -> None:
create_message_dialog(
self,
_("Empty all Items From Trash?"),
_("All items in the Trash will be permamently deleted."),
)

dialog.add_response("cancel", _("Cancel"))
dialog.add_response("empty", _("Empty Trash"))

dialog.set_default_response("empty")
dialog.set_response_appearance("empty", Adw.ResponseAppearance.DESTRUCTIVE)

def handle_response(_dialog: Adw.MessageDialog, response: str) -> None:
if response == "empty":
empty_trash()

dialog.connect("response", handle_response)
dialog.present()
(_("Cancel"), None, None, None, False),
(
_("Empty Trash"),
None,
Adw.ResponseAppearance.DESTRUCTIVE,
empty_trash,
True,
),
body=_("All items in the Trash will be permamently deleted."),
).choose()

def __clear_recents(self, *_args: Any) -> None:
clear_recent_files()

0 comments on commit 3b5b0b2

Please sign in to comment.