-
-
Notifications
You must be signed in to change notification settings - Fork 816
Expand file tree
/
Copy pathdialogs.py
More file actions
159 lines (127 loc) · 3.9 KB
/
Copy pathdialogs.py
File metadata and controls
159 lines (127 loc) · 3.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
from android import R
from android.app import AlertDialog
from android.content import DialogInterface
from java import dynamic_proxy
import toga
class OnClickListener(dynamic_proxy(DialogInterface.OnClickListener)):
def __init__(self, fn=None, value=None):
super().__init__()
self._fn = fn
self._value = value
def onClick(self, _dialog, _which):
self._fn(self._value)
class BaseDialog:
def show(self, host_window, future):
self.future = future
if self.native:
# Show the dialog. Don't differentiate between app and window modal dialogs.
self.native.show()
else:
# Dialog doesn't have an implementation. This can't be covered, as
# the testbed shortcuts the test before showing the dialog.
self.future.set_result(None) # pragma: no cover
class TextDialog(BaseDialog):
def __init__(
self,
title,
message,
positive_text,
negative_text=None,
icon=None,
):
super().__init__()
self.native_builder = AlertDialog.Builder(
toga.App.app.current_window._impl.app.native
)
self.native_builder.setCancelable(False)
self.native_builder.setTitle(title)
self.native_builder.setMessage(message)
if icon is not None:
self.native_builder.setIcon(icon)
self.native_builder.setPositiveButton(
positive_text,
OnClickListener(
self.completion_handler,
True if (negative_text is not None) else None,
),
)
if negative_text is not None:
self.native_builder.setNegativeButton(
negative_text, OnClickListener(self.completion_handler, False)
)
self.native = self.native_builder.create()
def completion_handler(self, return_value: bool) -> None:
self.future.set_result(return_value)
class InfoDialog(TextDialog):
def __init__(self, title, message):
super().__init__(
title=title,
message=message,
positive_text="OK",
)
class QuestionDialog(TextDialog):
def __init__(self, title, message):
super().__init__(
title=title,
message=message,
positive_text="Yes",
negative_text="No",
)
class ConfirmDialog(TextDialog):
def __init__(self, title, message):
super().__init__(
title=title,
message=message,
positive_text="OK",
negative_text="Cancel",
)
class ErrorDialog(TextDialog):
def __init__(self, title, message):
super().__init__(
title=title,
message=message,
positive_text="OK",
icon=R.drawable.ic_dialog_alert,
)
class StackTraceDialog(BaseDialog):
def __init__(
self,
title,
message,
**kwargs,
):
super().__init__()
toga.App.app.factory.not_implemented("dialogs.StackTraceDialog()")
self.native = None
class SaveFileDialog(BaseDialog):
def __init__(
self,
title,
filename,
initial_directory,
file_types=None,
):
super().__init__()
toga.App.app.factory.not_implemented("dialogs.SaveFileDialog()")
self.native = None
class OpenFileDialog(BaseDialog):
def __init__(
self,
title,
initial_directory,
file_types,
multiple_select,
):
super().__init__()
toga.App.app.factory.not_implemented("dialogs.OpenFileDialog()")
self.native = None
class SelectFolderDialog(BaseDialog):
def __init__(
self,
title,
initial_directory,
multiple_select,
):
super().__init__()
toga.App.app.factory.not_implemented("dialogs.SelectFolderDialog()")
self.native = None