# -*- coding: utf-8 -*- """ Required: MediaRepo +get_booklist() +open_book(BookMetaObj) """ import wx from lib.ObjectListView import ObjectListView, ColumnDefn from lib.ObjectListView import Filter import lib.util as util import subprocess showlist = ['title', 'language', 'size', 'md5'] cols = {'title': ColumnDefn("Title", "left", 330, "get_dispname", stringConverter='%s', valueSetter='set_dispname'), 'language': ColumnDefn("Language", "center", 80, "get_book_language", stringConverter='%s', isEditable=False), 'size': ColumnDefn("Size", "right", 80, "getSizeString", stringConverter='%s', isEditable=False), 'md5': ColumnDefn("MD5", "center", 320, "md5", stringConverter='%s', isEditable=False), } class OverViewFrame(wx.Frame): def __init__(self, repo): FrameStyle = wx.CAPTION | wx.RESIZE_BORDER | wx.SYSTEM_MENU |\ wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.CLOSE_BOX wx.Frame.__init__(self, parent=None, id=-1, title="BookHub", pos=(100, 100), size=(500, 600), style=FrameStyle) self.BuildUI() self.InitObjectListView(repo) self.InitSearchCtrls() def BuildUI(self): self.SearchFile = wx.SearchCtrl(self) self.myOlv = ObjectListView(self, -1, style=wx.LC_REPORT | wx.SUNKEN_BORDER) size_main = wx.BoxSizer(wx.VERTICAL) size_main.Add(self.SearchFile, 1, wx.ALL | wx.EXPAND, 2) size_main.Add(self.myOlv, 20, wx.ALL | wx.EXPAND, 4) self.SetSizer(size_main) self.Layout() self.CenterOnScreen() self.myOlv.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnOpenFile) self.myOlv.Bind(wx.EVT_LIST_KEY_DOWN, self.OnKeyDown) def InitObjectListView(self, repo): self.repo = repo self.myOlv.SetColumns([cols[k.lower()] for k in showlist]) self.myOlv.SetObjects(self.repo.get_booklist()) self.myOlv.cellEditMode = ObjectListView.CELLEDIT_SINGLECLICK def InitSearchCtrls(self): """Initialize the search controls""" for (searchCtrl, olv) in [(self.SearchFile, self.myOlv)]: def _handleText(evt, searchCtrl=searchCtrl, olv=olv): self.OnTextSearchCtrl(evt, searchCtrl, olv) def _handleCancel(evt, searchCtrl=searchCtrl, olv=olv): self.OnCancelSearchCtrl(evt, searchCtrl, olv) searchCtrl.Bind(wx.EVT_TEXT, _handleText) searchCtrl.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN, _handleCancel) searchCtrl.SetFocus() olv.SetFilter(Filter.TextSearch(olv, olv.columns[0:4])) def OnOpenFile(self, event): obj = self.myOlv.GetSelectedObject() path = self.repo.getFilePath(obj) if path is None: wx.MessageBox('File not exists', 'Bookhub Message') return cmd = util.cmd_open_file(path) res = subprocess.call(cmd, shell=True) if res != 0: wx.MessageBox('Open File Error. returncode %s' % res, 'Bookhub Message') def OnKeyDown(self, event): objs = self.myOlv.GetSelectedObjects() key = event.GetKeyCode() if wx.WXK_DELETE == key: self.DoDelete(objs) elif 3 == key: # wx.WXK_CONTROL_C self.DoCopyFileid(objs) def DoDelete(self, objs): for obj in objs: pass # obj.delete() self.myOlv.RemoveObjects(objs) def DoCopyFileid(self, objs): self.dataObj = wx.TextDataObject() file_ids = ','.join([obj.file_id for obj in objs]) wx.MessageBox(file_ids, "MD5 code") # self.dataObj.SetText(file_ids) # if wx.TheClipboard.Open(): # wx.TheClipboard.SetData(self.dataObj) # wx.TheClipboard.Close() #else: # wx.MessageBox("Unable to open the clipboard", "Error") def OnTextSearchCtrl(self, event, searchCtrl, olv): searchCtrl.ShowCancelButton(len(searchCtrl.GetValue())) olv.GetFilter().SetText(searchCtrl.GetValue()) olv.RepopulateList() def OnCancelSearchCtrl(self, event, searchCtrl, olv): searchCtrl.SetValue("") self.OnTextSearchCtrl(event, searchCtrl, olv) class TestApp(wx.App): def OnInit(self): from media_repo import MediaRepo repo = MediaRepo() frame = OverViewFrame(repo) self.SetTopWindow(frame) frame.Show() return True if __name__ == '__main__': app = TestApp() app.MainLoop()