forked from crftwr/cfiler
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcfiler_msgbox.py
210 lines (172 loc) · 6.9 KB
/
cfiler_msgbox.py
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
import unicodedata
import ckit
from ckit.ckit_const import *
import cfiler_error
## @addtogroup msgbox
## @{
#--------------------------------------------------------------------
class MessageBox( ckit.TextWindow ):
RESULT_CANCEL = 0
RESULT_OK = 1
RESULT_YES = 2
RESULT_NO = 3
TYPE_OK = 0
TYPE_YESNO = 1
BUTTON_OK = 0
BUTTON_YES = 1
BUTTON_NO = 2
def __init__( self, x, y, parent_window, msgbox_type, title, message, return_modkey ):
ckit.TextWindow.__init__(
self,
x=x,
y=y,
width=5,
height=5,
origin= ORIGIN_X_CENTER | ORIGIN_Y_CENTER,
parent_window=parent_window,
bg_color = ckit.getColor("bg"),
show = False,
resizable = False,
title = title,
minimizebox = False,
maximizebox = False,
close_handler = self.onClose,
keydown_handler = self.onKeyDown,
)
message = unicodedata.normalize( "NFC", message )
lines = message.splitlines()
self.message_width = 0
for line in lines:
self.message_width = max( self.message_width, self.getStringWidth(line) )
window_width = self.message_width + 2
if window_width<20 : window_width=20
window_height = len(lines) + 4
self.setPosSize(
x=x,
y=y,
width=window_width,
height=window_height,
origin= ORIGIN_X_CENTER | ORIGIN_Y_CENTER
)
self.show(True)
self.msgbox_type = msgbox_type
self.lines = lines
self.return_modkey = return_modkey
if self.msgbox_type==MessageBox.TYPE_OK:
self.focus = MessageBox.BUTTON_OK
elif self.msgbox_type==MessageBox.TYPE_YESNO:
self.focus = MessageBox.BUTTON_YES
else:
assert(False)
self.result = MessageBox.RESULT_CANCEL
self.result_mod = 0
try:
self.wallpaper = ckit.Wallpaper(self)
self.wallpaper.copy( parent_window )
self.wallpaper.adjust()
except AttributeError:
self.wallpaper = None
self.paint()
def onClose(self):
self.quit()
def onKeyDown( self, vk, mod ):
if vk==VK_LEFT:
if self.focus==MessageBox.BUTTON_NO:
self.focus=MessageBox.BUTTON_YES
self.paint()
elif vk==VK_RIGHT:
if self.focus==MessageBox.BUTTON_YES:
self.focus=MessageBox.BUTTON_NO
self.paint()
elif vk==VK_RETURN:
if self.focus==MessageBox.BUTTON_OK:
self.result = MessageBox.RESULT_OK
self.result_mod = mod
elif self.focus==MessageBox.BUTTON_YES:
self.result = MessageBox.RESULT_YES
self.result_mod = mod
elif self.focus==MessageBox.BUTTON_NO:
self.result = MessageBox.RESULT_NO
self.result_mod = mod
self.quit()
elif vk==VK_ESCAPE:
if self.msgbox_type==MessageBox.TYPE_OK:
self.result = MessageBox.RESULT_CANCEL
self.result_mod = mod
self.quit()
elif self.msgbox_type==MessageBox.TYPE_YESNO:
self.result = MessageBox.RESULT_CANCEL
self.result_mod = mod
self.quit()
def paint(self):
attribute_normal = ckit.Attribute( fg=ckit.getColor("fg"))
attribute_normal_selected = ckit.Attribute( fg=ckit.getColor("select_fg"), bg=ckit.getColor("select_bg"))
y = 1
for line in self.lines:
self.putString( (self.width()-self.message_width)//2, y, self.message_width, 1, attribute_normal, line )
y += 1
y += 1
if self.msgbox_type==MessageBox.TYPE_OK:
btn_string = " OK "
btn_width = self.getStringWidth(btn_string)
self.putString( (self.width()-btn_width)//2, y, btn_width, 1, attribute_normal_selected, btn_string )
elif self.msgbox_type==MessageBox.TYPE_YESNO:
btn1_string = "はい"
btn1_width = self.getStringWidth(btn1_string)
btn2_string = "いいえ"
btn2_width = self.getStringWidth(btn2_string)
if self.focus==MessageBox.BUTTON_YES:
attr = attribute_normal_selected
else:
attr = attribute_normal
self.putString( (self.width()-btn1_width-btn2_width-4)//2, y, btn1_width, 1, attr, btn1_string )
if self.focus==MessageBox.BUTTON_NO:
attr = attribute_normal_selected
else:
attr = attribute_normal
self.putString( (self.width()+btn1_width-btn2_width+4)//2, y, btn2_width, 1, attr, btn2_string )
def getResult(self):
if self.return_modkey:
return self.result, self.result_mod
else:
return self.result
## メッセージボックスを表示する
#
# @param main_window MainWindowオブジェクト
# @param msgbox_type メッセージボックスのタイプ
# @param title メッセージボックスのタイトルバーに表示する文字列
# @param message メッセージ文字列
# @param return_modkey 閉じたときのモディファイアキーの状態を取得するかどうか
# @return 引数 return_modkey が False の場合は結果値、引数 return_modkey が True の場合は ( 結果値, モディファイアキーの状態 ) を返す
#
# 引数 msgbox_type には、以下のいずれかを渡します。
# - MessageBox.TYPE_OK \n
# [ OK ] ボタンを1つ備えたメッセージボックス\n\n
#
# - MessageBox.TYPE_YESNO \n
# [はい] ボタンと [いいえ] ボタンを備えたメッセージボックス\n\n
#
# 返値の結果値としては、以下のいずれかが返ります。
# - MessageBox.RESULT_CANCEL \n
# キャンセルされた\n\n
#
# - MessageBox.RESULT_OK \n
# [ OK ]ボタンが選択された\n\n
#
# - MessageBox.RESULT_YES \n
# [ はい ]ボタンが選択された\n\n
#
# - MessageBox.RESULT_NO \n
# [ いいえ ]ボタンが選択された\n\n
#
def popMessageBox( main_window, msgbox_type, title, message, return_modkey=False ):
pos = main_window.centerOfWindowInPixel()
msgbox = MessageBox( pos[0], pos[1], main_window, msgbox_type, title, message, return_modkey )
main_window.enable(False)
msgbox.messageLoop()
result = msgbox.getResult()
main_window.enable(True)
main_window.activate()
msgbox.destroy()
return result
## @} msgbox