| 53 | | # Reply |
| 54 | | replyPage = wx.NotebookPage(notebook,-1) |
| 55 | | notebook.AddPage(replyPage,u'Reply') |
| 56 | | replyList = self.replyList = wx.ListCtrl(replyPage,-1,style=wx.LC_REPORT|wx.LC_HRULES) |
| 57 | | replyList.Bind(wx.EVT_KEY_DOWN, self.myKeyHandler) |
| 58 | | |
| 59 | | # Direct |
| 60 | | directPage = wx.NotebookPage(notebook,-1) |
| 61 | | notebook.AddPage(directPage,u'Direct') |
| 62 | | directList = self.directList = wx.ListCtrl(directPage,-1,style=wx.LC_REPORT|wx.LC_HRULES) |
| 63 | | directList.Bind(wx.EVT_KEY_DOWN, self.myKeyHandler) |
| 64 | | |
| 65 | | inputSizer = wx.BoxSizer(wx.HORIZONTAL) |
| 66 | | inputSizer.Add(self.text,2,wx.EXPAND) |
| 67 | | inputSizer.Add(self.button,0) |
| 68 | | |
| 69 | | |
| 70 | | messageText=self.messageText = wx.TextCtrl(self,-1,style=wx.TE_MULTILINE|wx.TE_AUTO_URL|wx.TE_READONLY) |
| 71 | | userIcon = self.userIcon = wx.StaticBitmap(self,-1,wx.NullBitmap,(0,0),(64,64)) |
| 72 | | userName = self.userName = wx.StaticText(self,-1,"test") |
| 73 | | twitTime = self.twitTime = wx.StaticText(self,-1,"") |
| 74 | | |
| 75 | | messageSizer3 = wx.BoxSizer(wx.HORIZONTAL) |
| 76 | | messageSizer3.Add(userName,0) |
| 77 | | messageSizer3.Add(twitTime,0) |
| 78 | | |
| 79 | | messageSizer2 = wx.BoxSizer(wx.VERTICAL) |
| 80 | | messageSizer2.Add(messageSizer3,0,wx.EXPAND) |
| 81 | | messageSizer2.Add(messageText,1,wx.EXPAND) |
| 82 | | |
| 83 | | messageSizer1 = wx.BoxSizer(wx.HORIZONTAL) |
| 84 | | messageSizer1.Add(userIcon,0) |
| 85 | | messageSizer1.Add(messageSizer2,1,wx.EXPAND) |
| 86 | | |
| 87 | | messageSizer = wx.BoxSizer(wx.VERTICAL) |
| 88 | | messageSizer.Add(messageSizer1,3,wx.EXPAND) |
| 89 | | messageSizer.Add(inputSizer,1,wx.EXPAND) |
| 90 | | |
| 91 | | self.sizer = wx.BoxSizer(wx.VERTICAL) |
| 92 | | self.sizer.Add(notebook,1,wx.EXPAND) |
| 93 | | self.sizer.Add(messageSizer,0,wx.EXPAND) |
| 94 | | |
| 95 | | self.SetSizer(self.sizer) |
| 96 | | self.SetAutoLayout(True) |
| 97 | | inputSizer.Fit(self) |
| 98 | | self.sizer.Fit(self) |
| 99 | | #pre = wx.PreFrame() |
| 100 | | #XRC().LoadOnFrame(pre, parent, 'MainFrame') |
| 101 | | |
| 102 | | self.tw = twitter3.Twitter(twUserdata) |
| 103 | | self.tw.setAuthService("twitter") |
| 104 | | #self.PostCreate(pre) |
| 105 | | #self.binder.bindall(self) |
| 106 | | self.SetIcon(main_icon.getIcon()) |
| 107 | | self.SetSize((300,400)) |
| 108 | | self.timer = wx.Timer(self,self.TIMER_ID) |
| 109 | | wx.EVT_TIMER(self,self.TIMER_ID,self.OnUpdate) |
| 110 | | self.timer.Start(60000) |
| 111 | | |
| 112 | | #list = XRCCTRL(self,'ID_TWITLIST') |
| | 82 | |
| 117 | | self.RefleshTw() |
| 118 | | |
| 119 | | self.SetNowTime2StatusBar() |
| 120 | | |
| 121 | | def OnSendTW(self, event): |
| 122 | | # 送信する |
| 123 | | # コンボボックスの中身を空にする |
| 124 | | combo = self.text |
| 125 | | #name = XRCCTRL(self,'ID_NAME') |
| 126 | | self.tw.put(combo.GetValue()) |
| 127 | | combo.SetValue("") |
| 128 | | self.RefleshTw() |
| 129 | | |
| 130 | | # チャットのログデータをListCtrlに表示 |
| 131 | | def RefleshTw(self): |
| 132 | | #name = XRCCTRL(self,'ID_NAME') |
| 133 | | list = self.list |
| 134 | | a = self.tw.get("") |
| 135 | | dataList = [] |
| 136 | | for x in a: |
| 137 | | flag = 0 |
| 138 | | |
| 139 | | # 重複発言チェック |
| 140 | | for d in self.dataList: |
| 141 | | if d[2] == x[1]: |
| 142 | | flag = 1 |
| 143 | | break |
| 144 | | if flag == 0 : |
| 145 | | dataListElement = [] |
| 146 | | dataListElement.append("") |
| 147 | | dataListElement.append(x[0]) |
| 148 | | dataListElement.append(x[1]) |
| 149 | | dataListElement.append(x[2]) |
| 150 | | dataListElement.append(x[3]) |
| 151 | | |
| 152 | | dataList.append(dataListElement) |
| 153 | | i = 0 |
| 154 | | for b in dataList: |
| 155 | | j = 0 |
| 156 | | list.InsertStringItem(i,"") |
| 157 | | for j in range(3): |
| 158 | | list.SetStringItem(i,j,b[j]) |
| 159 | | |
| 160 | | i+=1 |
| 161 | | self.dataList = dataList + self.dataList |
| 162 | | #if self.selectRow != -1 :self.selectRow+=len(dataList) |
| 163 | | def OnUpdate(self, event): |
| 164 | | self.RefleshTw() |
| 165 | | self.SetNowTime2StatusBar() |
| 166 | | |
| 167 | | def OnTwitListSelect(self,event): |
| 168 | | import re |
| 169 | | self.selectedRow = event.GetIndex() |
| 170 | | label = self.userName |
| 171 | | text = self.messageText |
| 172 | | selectedRow = self.selectedRow |
| 173 | | text.SetValue(self.dataList[selectedRow][2]) |
| 174 | | label.SetLabel(self.dataList[selectedRow][1]) |
| 175 | | self.LoadImage(self.GetImageListElement(self.dataList[selectedRow][4]),self.userIcon) |
| 176 | | #選択したユーザに関する発言の色を変えてみる |
| 177 | | p = re.compile(self.dataList[selectedRow][1]) |
| 178 | | for i in range(0,self.list.GetItemCount()): |
| 179 | | if p.search(self.dataList[i][1]): |
| 180 | | self.list.SetItemBackgroundColour(i,wx.Color(225,225,225)) |
| 181 | | elif p.search(self.dataList[i][2]) : |
| 182 | | self.list.SetItemBackgroundColour(i,wx.Color(192,225,225)) |
| 183 | | else: |
| 184 | | self.list.SetItemBackgroundColour(i,wx.Color(255,255,255)) |
| 185 | | |
| 186 | | def SetNowTime2StatusBar(self): |
| 187 | | #現在時刻を表示 |
| 188 | | from time import localtime, strftime |
| 189 | | nowtime = strftime("%H:%M:%S", localtime()) |
| 190 | | sb = wx.GetApp().GetTopWindow().GetStatusBar() |
| 191 | | sb.SetStatusText(nowtime+u"に更新しました") |
| 192 | | |
| | 87 | |
| | 145 | def OnTwitListSelect(self,event): |
| | 146 | import re |
| | 147 | selectedRow = self.selectedRow = event.GetIndex() |
| | 148 | dataList = self.dataList |
| | 149 | label = self.owner.userName |
| | 150 | text = self.owner.messageText |
| | 151 | text.SetValue(dataList[selectedRow][2]) |
| | 152 | label.SetLabel(dataList[selectedRow][1]) |
| | 153 | self.owner.SetImage(dataList[selectedRow][4]) |
| | 154 | #選択したユーザに関する発言の色を変えてみる |
| | 155 | p = re.compile(dataList[selectedRow][1]) |
| | 156 | for i in range(0,self.list.GetItemCount()): |
| | 157 | if p.search(dataList[i][1]): |
| | 158 | self.list.SetItemBackgroundColour(i,wx.Color(225,225,225)) |
| | 159 | elif p.search(self.dataList[i][2]) : |
| | 160 | self.list.SetItemBackgroundColour(i,wx.Color(192,225,225)) |
| | 161 | else: |
| | 162 | self.list.SetItemBackgroundColour(i,wx.Color(255,255,255)) |
| | 163 | |
| | 164 | |
| | 165 | def OnDoubleClick(self,event): |
| | 166 | selectedRow = event.GetIndex() |
| | 167 | user = "@" + self.dataList[selectedRow][1] |
| | 168 | self.owner.addUser2Inputbox(user) |
| | 169 | |
| | 170 | def Reflesh(self): |
| | 171 | t = TwHttpThread(self.owner.tw,self.RefleshList) |
| | 172 | t.run() |
| | 173 | |
| | 174 | def RefleshList(self,a): |
| | 175 | #lockかけた方がいいのかも。。 |
| | 176 | list = self.list |
| | 177 | dataList = [] |
| | 178 | for x in a: |
| | 179 | flag = 0 |
| | 180 | |
| | 181 | # 重複発言チェック |
| | 182 | for d in self.dataList: |
| | 183 | if d[2] == x[1]: |
| | 184 | flag = 1 |
| | 185 | break |
| | 186 | if flag == 0 : |
| | 187 | dataListElement = [] |
| | 188 | dataListElement.append("") |
| | 189 | dataListElement.append(x[0]) |
| | 190 | dataListElement.append(x[1]) |
| | 191 | dataListElement.append(x[2]) |
| | 192 | dataListElement.append(x[3]) |
| | 193 | |
| | 194 | dataList.append(dataListElement) |
| | 195 | i = 0 |
| | 196 | for b in dataList: |
| | 197 | j = 0 |
| | 198 | list.InsertStringItem(i,"") |
| | 199 | for j in range(3): |
| | 200 | list.SetStringItem(i,j,b[j]) |
| | 201 | |
| | 202 | #import time |
| | 203 | #time.sleep(1) |
| | 204 | #if 先読み=on |
| | 205 | try: |
| | 206 | self.owner.GetImageListElement(b[4]) |
| | 207 | except: |
| | 208 | pass |
| | 209 | i+=1 |
| | 210 | self.dataList = dataList + self.dataList |
| | 211 | #if self.selectRow != -1 :self.selectRow+=len(dataList) |
| | 212 | |
| | 213 | class ReplyPage(RecentPage): |
| | 214 | |
| | 215 | dataList = [] |
| | 216 | def __init__(self, parent): |
| | 217 | |
| | 218 | self.owner = parent |
| | 219 | wx.NotebookPage.__init__(self,parent.getNotebook(),-1) |
| | 220 | parent.getNotebook().AddPage(self,'Reply') |
| | 221 | list = self.list = wx.ListCtrl(self,-1,style=wx.LC_REPORT|wx.LC_HRULES) |
| | 222 | list.Bind(wx.EVT_KEY_DOWN, self.myKeyHandler) |
| | 223 | list.Bind(wx.EVT_LIST_ITEM_ACTIVATED,self.OnDoubleClick) |
| | 224 | |
| | 225 | list.InsertColumn(0," ",1,20) |
| | 226 | list.InsertColumn(1,u"ユーザ") |
| | 227 | list.InsertColumn(2,u"発言",0,200) |
| | 228 | list.Bind(wx.EVT_LIST_ITEM_SELECTED,self.OnTwitListSelect) |
| | 229 | |
| | 230 | def Reflesh(self): |
| | 231 | t = TwReplyHttpThread(self.owner.tw,self.RefleshList) |
| | 232 | t.run() |
| | 233 | |
| | 234 | |
| | 235 | class DMPage(RecentPage): |
| | 236 | |
| | 237 | dataList = [] |
| | 238 | def __init__(self, parent): |
| | 239 | |
| | 240 | self.owner = parent |
| | 241 | wx.NotebookPage.__init__(self,parent.getNotebook(),-1) |
| | 242 | parent.getNotebook().AddPage(self,'DM') |
| | 243 | list = self.list = wx.ListCtrl(self,-1,style=wx.LC_REPORT|wx.LC_HRULES) |
| | 244 | list.Bind(wx.EVT_KEY_DOWN, self.myKeyHandler) |
| | 245 | list.Bind(wx.EVT_LIST_ITEM_ACTIVATED,self.OnDoubleClick) |
| | 246 | |
| | 247 | list.InsertColumn(0," ",1,20) |
| | 248 | list.InsertColumn(1,u"ユーザ") |
| | 249 | list.InsertColumn(2,u"発言",0,200) |
| | 250 | list.Bind(wx.EVT_LIST_ITEM_SELECTED,self.OnTwitListSelect) |
| | 251 | |
| | 252 | def Reflesh(self): |
| | 253 | t = TwDMHttpThread(self.owner.tw,self.RefleshList) |
| | 254 | t.run() |
| | 255 | |
| | 256 | class MainFrame(wx.Frame): |
| | 257 | """MainFrame class deffinition. |
| | 258 | """ |
| | 259 | binder = wx_utils.bind_manager() |
| | 260 | |
| | 261 | TIMER_ID = 1 |
| | 262 | TIMER_ID2= TIMER_ID+1 |
| | 263 | TIMER_ID3= TIMER_ID2+1 |
| | 264 | imageList = {} |
| | 265 | def loadUserData(self, fileName): |
| | 266 | #ファイルを開いて、データを読み込んで変換する |
| | 267 | #データ形式は(user,password) |
| | 268 | #try |
| | 269 | file = open(fileName,'r') |
| | 270 | a = simplejson.read(file.read()) |
| | 271 | file.close() |
| | 272 | return a |
| | 273 | #catch exit(1) |
| | 274 | |
| | 275 | def __init__(self, parent=None): |
| | 276 | twUserdata = self.loadUserData(".chat/twdata") |
| | 277 | wx.Frame.__init__(self,None, -1, "crochet") |
| | 278 | |
| | 279 | self.CreateStatusBar() |
| | 280 | |
| | 281 | self.selectedRow = -1 |
| | 282 | text = self.text = wx.TextCtrl(self,-1,style=wx.TE_PROCESS_ENTER) |
| | 283 | text.Bind(wx.EVT_TEXT_ENTER, self.OnSendTW) |
| | 284 | button = self.button = wx.Button(self, -1, "Send") |
| | 285 | self.button.Bind(wx.EVT_BUTTON, self.OnSendTW) |
| | 286 | |
| | 287 | notebook = self.notebook = wx.Notebook(self,-1) |
| | 288 | |
| | 289 | # Recent |
| | 290 | self.recentPage = RecentPage(self) |
| | 291 | |
| | 292 | # Reply |
| | 293 | self.replyPage = ReplyPage(self) |
| | 294 | |
| | 295 | # Direct |
| | 296 | self.directPage = DMPage(self) |
| | 297 | |
| | 298 | inputSizer = wx.BoxSizer(wx.HORIZONTAL) |
| | 299 | inputSizer.Add(self.text,2,wx.EXPAND) |
| | 300 | inputSizer.Add(self.button,0) |
| | 301 | |
| | 302 | |
| | 303 | messageText=self.messageText = wx.TextCtrl(self,-1,style=wx.TE_MULTILINE|wx.TE_AUTO_URL|wx.TE_READONLY) |
| | 304 | userIcon = self.userIcon = wx.StaticBitmap(self,-1,wx.NullBitmap,(0,0),(64,64)) |
| | 305 | userName = self.userName = wx.StaticText(self,-1,"test") |
| | 306 | twitTime = self.twitTime = wx.StaticText(self,-1,"") |
| | 307 | |
| | 308 | messageSizer3 = wx.BoxSizer(wx.HORIZONTAL) |
| | 309 | messageSizer3.Add(userName,0) |
| | 310 | messageSizer3.Add(twitTime,0) |
| | 311 | |
| | 312 | messageSizer2 = wx.BoxSizer(wx.VERTICAL) |
| | 313 | messageSizer2.Add(messageSizer3,0,wx.EXPAND) |
| | 314 | messageSizer2.Add(messageText,1,wx.EXPAND) |
| | 315 | |
| | 316 | messageSizer1 = wx.BoxSizer(wx.HORIZONTAL) |
| | 317 | messageSizer1.Add(userIcon,0) |
| | 318 | messageSizer1.Add(messageSizer2,1,wx.EXPAND) |
| | 319 | |
| | 320 | messageSizer = wx.BoxSizer(wx.VERTICAL) |
| | 321 | messageSizer.Add(messageSizer1,3,wx.EXPAND) |
| | 322 | messageSizer.Add(inputSizer,1,wx.EXPAND) |
| | 323 | |
| | 324 | self.sizer = wx.BoxSizer(wx.VERTICAL) |
| | 325 | self.sizer.Add(notebook,1,wx.EXPAND) |
| | 326 | self.sizer.Add(messageSizer,0,wx.EXPAND) |
| | 327 | |
| | 328 | self.SetSizer(self.sizer) |
| | 329 | self.SetAutoLayout(True) |
| | 330 | inputSizer.Fit(self) |
| | 331 | self.sizer.Fit(self) |
| | 332 | |
| | 333 | self.tw = twitter3.Twitter(twUserdata) |
| | 334 | self.tw.setAuthService("twitter") |
| | 335 | self.SetIcon(main_icon.getIcon()) |
| | 336 | self.SetSize((300,400)) |
| | 337 | self.timer = wx.Timer(self,self.TIMER_ID) |
| | 338 | wx.EVT_TIMER(self,self.TIMER_ID,self.OnUpdate) |
| | 339 | self.timer.Start(60000) |
| | 340 | |
| | 341 | self.timer2 = wx.Timer(self,self.TIMER_ID2) |
| | 342 | wx.EVT_TIMER(self,self.TIMER_ID2,self.OnReplyUpdate) |
| | 343 | self.timer2.Start(90000) |
| | 344 | |
| | 345 | self.timer3 = wx.Timer(self,self.TIMER_ID3) |
| | 346 | wx.EVT_TIMER(self,self.TIMER_ID3,self.OnDMUpdate) |
| | 347 | self.timer3.Start(90000) |
| | 348 | self.RefleshTw() |
| | 349 | self.SetNowTime2StatusBar() |
| | 350 | |
| | 351 | def OnSendTW(self, event): |
| | 352 | # 送信する |
| | 353 | # コンボボックスの中身を空にする |
| | 354 | combo = self.text |
| | 355 | #name = XRCCTRL(self,'ID_NAME') |
| | 356 | self.tw.put(combo.GetValue()) |
| | 357 | combo.SetValue("") |
| | 358 | self.RefleshTw() |
| | 359 | |
| | 360 | # チャットのログデータをListCtrlに表示 |
| | 361 | def RefleshTw(self): |
| | 362 | self.recentPage.Reflesh() |
| | 363 | #self.replyPage.Reflesh() |
| | 364 | #self.directPage.Reflesh() |
| | 365 | |
| | 366 | def OnUpdate(self, event): |
| | 367 | self.RefleshTw() |
| | 368 | self.SetNowTime2StatusBar() |
| | 369 | |
| | 370 | def OnReplyUpdate(self, event): |
| | 371 | self.replyPage.Reflesh() |
| | 372 | #self.SetNowTime2StatusBar() |
| | 373 | |
| | 374 | def OnDMUpdate(self, event): |
| | 375 | self.directPage.Reflesh() |
| | 376 | #self.SetNowTime2StatusBar() |
| | 377 | |
| | 378 | def SetNowTime2StatusBar(self): |
| | 379 | #現在時刻を表示 |
| | 380 | from time import localtime, strftime |
| | 381 | nowtime = strftime("%H:%M:%S", localtime()) |
| | 382 | sb = wx.GetApp().GetTopWindow().GetStatusBar() |
| | 383 | sb.SetStatusText(nowtime+u"に更新しました") |
| | 384 | |
| | 385 | def myKeyHandler(self,evt): |
| | 386 | print evt.GetKeyCode(), |
| | 387 | if self.selectedRow != -1: |
| | 388 | if evt.GetKeyCode() in [ord('k'),ord('K'),wx.WXK_UP]: |
| | 389 | print ('up') |
| | 390 | if self.selectedRow > 0: |
| | 391 | self.MoveList(self.selectedRow-1) |
| | 392 | if evt.GetKeyCode() in [ord('j'),ord('J'),wx.WXK_DOWN]: |
| | 393 | print ('down') |
| | 394 | if self.selectedRow < self.list.GetItemCount()-1: |
| | 395 | self.MoveList(self.selectedRow+1) |
| | 396 | if evt.GetKeyCode() in [ord('h'),ord('H'),wx.WXK_LEFT]: |
| | 397 | print ('left') |
| | 398 | leftcol = self.GetPrevItem(self.selectedRow) |
| | 399 | if leftcol != -1: |
| | 400 | self.MoveList(leftcol) |
| | 401 | if evt.GetKeyCode() in [ord('l'),ord('L'),wx.WXK_RIGHT]: |
| | 402 | print ('right') |
| | 403 | rightcol = self.GetNextItem(self.selectedRow) |
| | 404 | if rightcol != -1: |
| | 405 | self.MoveList(rightcol) |
| | 406 | |
| | 407 | #print list. |
| | 408 | if evt.GetKeyCode() in [ord('q'), ord('Q')]: |
| | 409 | wx.Exit() |
| | 410 | |