CraftLaunch APIリファレンス

clnch_msgbox.py

00001 import traceback
00002 
00003 import cterm
00004 from cterm.cterm_const import *
00005 
00006 import clnch_misc
00007 import clnch_colortable
00008 
00009 #--------------------------------------------------------------------
00010 
00011 MSGBOX_TYPE_OK    = 0
00012 MSGBOX_TYPE_YESNO = 1
00013 
00014 MSGBOX_RESULT_CANCEL = 0
00015 MSGBOX_RESULT_OK     = 1
00016 MSGBOX_RESULT_YES    = 2
00017 MSGBOX_RESULT_NO     = 3
00018 
00019 #--------------------------------------------------------------------
00020 
00021 class MessageBox( cterm.Window ):
00022 
00023     BUTTON_OK  = 0
00024     BUTTON_YES = 1
00025     BUTTON_NO  = 2
00026 
00027     def __init__( self, x, y, parent_window, show=True, msgbox_type=MSGBOX_TYPE_OK, title=u"", message=u"", return_modkey=False ):
00028 
00029         cterm.Window.__init__(
00030             self,
00031             x=x,
00032             y=y,
00033             width=5,
00034             height=5,
00035             origin= ORIGIN_X_CENTER | ORIGIN_Y_CENTER,
00036             parent_window=parent_window,
00037             bg_color = clnch_colortable.bg,
00038             show = False,
00039             resizable = False,
00040             title = title,
00041             minimizebox = False,
00042             maximizebox = False,
00043             close_handler = self.onClose,
00044             keydown_handler = self.onKeyDown,
00045             )
00046 
00047         message_width = self.getStringWidth(message)
00048 
00049         window_width = message_width + 2
00050         if window_width<20 : window_width=20
00051 
00052         self.setPosSize(
00053             x=x,
00054             y=y,
00055             width=window_width,
00056             height=5,
00057             origin= ORIGIN_X_CENTER | ORIGIN_Y_CENTER
00058             )
00059         self.show(show)
00060 
00061         self.msgbox_type = msgbox_type
00062         self.message = message
00063         self.return_modkey = return_modkey
00064 
00065         if self.msgbox_type==MSGBOX_TYPE_OK:
00066             self.focus = MessageBox.BUTTON_OK
00067         elif self.msgbox_type==MSGBOX_TYPE_YESNO:
00068             self.focus = MessageBox.BUTTON_YES
00069         else:
00070             assert(False)
00071 
00072         self.result = MSGBOX_RESULT_CANCEL
00073         self.result_mod = 0
00074 
00075         self.paint()
00076 
00077     def onClose(self):
00078         self.quit()
00079 
00080     def onKeyDown( self, vk, mod ):
00081         if vk==VK_LEFT:
00082             if self.focus==MessageBox.BUTTON_NO:
00083                 self.focus=MessageBox.BUTTON_YES
00084                 self.paint()
00085         elif vk==VK_RIGHT:
00086             if self.focus==MessageBox.BUTTON_YES:
00087                 self.focus=MessageBox.BUTTON_NO
00088                 self.paint()
00089         elif vk==VK_RETURN:
00090             if self.focus==MessageBox.BUTTON_OK:
00091                 self.result = MSGBOX_RESULT_OK
00092                 self.result_mod = mod
00093             elif self.focus==MessageBox.BUTTON_YES:
00094                 self.result = MSGBOX_RESULT_YES
00095                 self.result_mod = mod
00096             elif self.focus==MessageBox.BUTTON_NO:
00097                 self.result = MSGBOX_RESULT_NO
00098                 self.result_mod = mod
00099             self.quit()
00100 
00101         elif vk==VK_ESCAPE:
00102             if self.msgbox_type==MSGBOX_TYPE_OK:
00103                 self.result = MSGBOX_RESULT_CANCEL
00104                 self.result_mod = mod
00105                 self.quit()
00106             elif self.msgbox_type==MSGBOX_TYPE_YESNO:
00107                 self.result = MSGBOX_RESULT_CANCEL
00108                 self.result_mod = mod
00109                 self.quit()
00110 
00111     def paint(self):
00112 
00113         attribute_normal = cterm.Attribute( fg=clnch_colortable.fg )
00114         attribute_normal_selected = cterm.Attribute( fg=clnch_colortable.fg, bg=clnch_colortable.select_bg )
00115 
00116         message_width = self.getStringWidth(self.message)
00117         self.putString( (self.width()-message_width)/2, 1, message_width, 1, attribute_normal, self.message )
00118 
00119         if self.msgbox_type==MSGBOX_TYPE_OK:
00120             btn_string = u" OK "
00121             btn_width = self.getStringWidth(btn_string)
00122             self.putString( (self.width()-btn_width)/2, 3, btn_width, 1, attribute_normal_selected, btn_string )
00123 
00124         elif self.msgbox_type==MSGBOX_TYPE_YESNO:
00125 
00126             btn1_string = u"はい"
00127             btn1_width = self.getStringWidth(btn1_string)
00128             btn2_string = u"いいえ"
00129             btn2_width = self.getStringWidth(btn2_string)
00130 
00131             if self.focus==MessageBox.BUTTON_YES:
00132                 attr = attribute_normal_selected
00133             else:
00134                 attr = attribute_normal
00135 
00136             self.putString( (self.width()-btn1_width-btn2_width-4)/2, 3, btn1_width, 1, attr, btn1_string )
00137 
00138             if self.focus==MessageBox.BUTTON_NO:
00139                 attr = attribute_normal_selected
00140             else:
00141                 attr = attribute_normal
00142 
00143             self.putString( (self.width()+btn1_width-btn2_width+4)/2, 3, btn2_width, 1, attr, btn2_string )
00144 
00145     def getResult(self):
00146         if self.return_modkey:
00147             return self.result, self.result_mod
00148         else:
00149             return self.result
00150 
00151 ## @addtogroup global グローバル関数
00152 ## @{
00153 
00154 ## メッセージボックスを表示する
00155 #
00156 #  @param main_window    MainWindowオブジェクト
00157 #  @param msgbox_type    メッセージボックスのタイプ
00158 #  @param title          メッセージボックスのタイトルバーに表示する文字列
00159 #  @param message        メッセージ文字列
00160 #  @param return_modkey  閉じたときのモディファイアキーの状態を取得するかどうか
00161 #  @return               引数 return_modkey が False の場合は結果値、引数 return_modkey が True の場合は ( 結果値, モディファイアキーの状態 ) を返す
00162 #
00163 #  引数 msgbox_type には、以下のいずれかを渡します。
00164 #    - cfiler_msgbox.MSGBOX_TYPE_OK \n
00165 #       [ OK ] ボタンを1つ備えたメッセージボックス\n\n
00166 #
00167 #    - cfiler_msgbox.MSGBOX_TYPE_YESNO \n
00168 #       [はい] ボタンと [いいえ] ボタンを備えたメッセージボックス\n\n
00169 #
00170 #  返値の結果値としては、以下のいずれかが返ります。
00171 #    - cfiler_msgbox.MSGBOX_RESULT_CANCEL \n
00172 #       キャンセルされた\n\n
00173 #
00174 #    - cfiler_msgbox.MSGBOX_RESULT_OK \n
00175 #       [ OK ]ボタンが選択された\n\n
00176 #
00177 #    - cfiler_msgbox.MSGBOX_RESULT_YES \n
00178 #       [ はい ]ボタンが選択された\n\n
00179 #
00180 #    - cfiler_msgbox.MSGBOX_RESULT_NO \n
00181 #       [ いいえ ]ボタンが選択された\n\n
00182 #
00183 def popMessageBox( main_window, msgbox_type, title, message, return_modkey=False ):
00184     pos = main_window.centerOfWindowInPixel()
00185     msgbox = MessageBox( pos[0], pos[1], main_window, False, msgbox_type, title, message, return_modkey )
00186     clnch_misc.adjustWindowPosition( main_window, msgbox, default_up=False )
00187     msgbox.show(True)
00188     main_window.enable(False)
00189     msgbox.messageLoop()
00190     result = msgbox.getResult()
00191     main_window.enable(True)
00192     main_window.activate()
00193     msgbox.destroy()
00194     return result
00195 
00196 ## @} global

Copyright © 2009 craftware. All rights reserved.