def __init__(self, event_handler) : super(MainDialog, self).__init__(parent = None, id = wx.NewId(), size = (840, 570), title = APP_NAME) self.event_handler = event_handler self.event_handler.gui = self self.SetMinSize((840, 570)) self.SetSize((840, 570)) self.Centre() self._statusbar = self.CreateStatusBar(3) self._statusbar.SetStatusWidths([200, 500, 100]) menuBar = wx.MenuBar() menu1 = wx.Menu() menu1.Append(self.ID_SETTING, u"设置a&ccess_key", u"Setting the access_id and secret_access_key") menu1.Append(self.ID_SYNC_UP, u"上行同步(&U)", u"Sync the file to OSS.") menu1.Append(self.ID_SYNC_DOWN, u"下行同步(&D)", u"Sync the file to local folder.") menu1.Append(wx.ID_ABOUT, u"打开同步目录(&P)", u"Open the sync folder on Explorer") menu1.AppendSeparator() menu1.Append(wx.ID_ABOUT, u"&About", u"About the Application") menu1.Append(wx.ID_CLOSE, u"&Exit", u"Exit this Application") menuBar.Append(menu1, u"操作(&O)") menu2 = wx.Menu() menu2.Append(self.ID_VIEW_SYNC, u'同步(&T)', u'同步OSS文件到指定的文件夹', wx.ITEM_RADIO) #menu2.Append(self.ID_VIEW_MGR, u'管理(&M)', u'对OSS文件进行管理', wx.ITEM_RADIO) menu2.Append(self.ID_VIEW_BROWSE, u'浏览(&L)', u'浏览文件', wx.ITEM_RADIO) menuBar.Append(menu2, u"视图(&V)") self.SetMenuBar(menuBar) self.Bind(wx.EVT_MENU, lambda evt: wx.Exit(), id = wx.ID_CLOSE) logo = wx.StaticBitmap(self, -1, wx.Bitmap(os.path.join(CURRENT_PATH, 'logo_aliyun.png'), wx.BITMAP_TYPE_PNG)) self._splitter = wx.SplitterWindow(self, style = wx.SP_3D | wx.SP_BORDER | wx.SP_LIVE_UPDATE | wx.SP_3DSASH | wx.TAB_TRAVERSAL) self._splitter.SetMinimumPaneSize(210) # 左边bucket列表 left = wx.Panel(self._splitter, -1 , style = wx.TAB_TRAVERSAL) tbNewBucket = wx.Button(left, self.ID_NEW_BUCKET, u"创建存储空间", (10, 10), (100, 24)) self._tree = TreeView(left, (0, 40)) vbox = wx.BoxSizer(wx.VERTICAL) vbox.Add(tbNewBucket, 0, wx.EXPAND | wx.ALL, 5) vbox.Add(self._tree, 1, wx.EXPAND | wx.ALL, 0) left.SetSizer(vbox) # 右边文件列表 right = wx.Panel(self._splitter, -1 , style = wx.TAB_TRAVERSAL) self._bucket_info = BucketInfoPanel(right) self._list = FileList(right, wx.DefaultPosition, wx.DefaultSize) vbox = wx.BoxSizer(wx.VERTICAL) vbox.Add(self._bucket_info, 0, wx.EXPAND | wx.ALL, 0) vbox.Add(self._list, 1, wx.EXPAND | wx.ALL, 0) right.SetSizer(vbox) self._splitter.SplitVertically(left, right, 210) self.SetBackgroundColour('#FFFFFF') vbox = wx.BoxSizer(wx.VERTICAL) vbox.Add(logo, 0, wx.ALIGN_LEFT , 0) vbox.Add(self._splitter, 1, wx.EXPAND | wx.ALL, 0) self.SetSizer(vbox) self.SetAutoLayout(True) self.Fit() self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.on_bucket_selected, self._tree) self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.on_object_activated, self._list) self.Bind(wx.EVT_MENU, self.on_view_clicked, id = self.ID_VIEW_MGR) self.Bind(wx.EVT_MENU, self.on_view_clicked, id = self.ID_VIEW_BROWSE) self.Bind(wx.EVT_MENU, self.on_view_clicked, id = self.ID_VIEW_SYNC) self.Bind(wx.EVT_MENU, self.init, id = self.ID_SETTING) self.Bind(wx.EVT_MENU, self.on_delete_bucket, id = TreeView.ID_DELETE_BUCKET) self.Bind(wx.EVT_BUTTON, self.on_create_bucket, id = self.ID_NEW_BUCKET) self.Bind(wx.EVT_MENU, self.on_head_object, id = FileList.ID_HEAD_OBJECT) self.Bind(wx.EVT_BUTTON, self.event_handler.on_button_sync_down, id = BucketInfoPanel.ID_SYNC_DOWN) self.Bind(wx.EVT_BUTTON, self.event_handler.on_button_sync_up, id = BucketInfoPanel.ID_SYNC_UP) self.set_view(self.ID_VIEW_SYNC)
class MainDialog(wx.Frame): ID_SETTING = wx.NewId() ID_SYNC_UP = wx.NewId() ID_SYNC_DOWN = wx.NewId() ID_VIEW_MGR = wx.NewId() ID_VIEW_BROWSE = wx.NewId() ID_VIEW_SYNC = wx.NewId() ID_NEW_BUCKET = wx.NewId() def __init__(self, event_handler) : super(MainDialog, self).__init__(parent = None, id = wx.NewId(), size = (840, 570), title = APP_NAME) self.event_handler = event_handler self.event_handler.gui = self self.SetMinSize((840, 570)) self.SetSize((840, 570)) self.Centre() self._statusbar = self.CreateStatusBar(3) self._statusbar.SetStatusWidths([200, 500, 100]) menuBar = wx.MenuBar() menu1 = wx.Menu() menu1.Append(self.ID_SETTING, u"设置a&ccess_key", u"Setting the access_id and secret_access_key") menu1.Append(self.ID_SYNC_UP, u"上行同步(&U)", u"Sync the file to OSS.") menu1.Append(self.ID_SYNC_DOWN, u"下行同步(&D)", u"Sync the file to local folder.") menu1.Append(wx.ID_ABOUT, u"打开同步目录(&P)", u"Open the sync folder on Explorer") menu1.AppendSeparator() menu1.Append(wx.ID_ABOUT, u"&About", u"About the Application") menu1.Append(wx.ID_CLOSE, u"&Exit", u"Exit this Application") menuBar.Append(menu1, u"操作(&O)") menu2 = wx.Menu() menu2.Append(self.ID_VIEW_SYNC, u'同步(&T)', u'同步OSS文件到指定的文件夹', wx.ITEM_RADIO) #menu2.Append(self.ID_VIEW_MGR, u'管理(&M)', u'对OSS文件进行管理', wx.ITEM_RADIO) menu2.Append(self.ID_VIEW_BROWSE, u'浏览(&L)', u'浏览文件', wx.ITEM_RADIO) menuBar.Append(menu2, u"视图(&V)") self.SetMenuBar(menuBar) self.Bind(wx.EVT_MENU, lambda evt: wx.Exit(), id = wx.ID_CLOSE) logo = wx.StaticBitmap(self, -1, wx.Bitmap(os.path.join(CURRENT_PATH, 'logo_aliyun.png'), wx.BITMAP_TYPE_PNG)) self._splitter = wx.SplitterWindow(self, style = wx.SP_3D | wx.SP_BORDER | wx.SP_LIVE_UPDATE | wx.SP_3DSASH | wx.TAB_TRAVERSAL) self._splitter.SetMinimumPaneSize(210) # 左边bucket列表 left = wx.Panel(self._splitter, -1 , style = wx.TAB_TRAVERSAL) tbNewBucket = wx.Button(left, self.ID_NEW_BUCKET, u"创建存储空间", (10, 10), (100, 24)) self._tree = TreeView(left, (0, 40)) vbox = wx.BoxSizer(wx.VERTICAL) vbox.Add(tbNewBucket, 0, wx.EXPAND | wx.ALL, 5) vbox.Add(self._tree, 1, wx.EXPAND | wx.ALL, 0) left.SetSizer(vbox) # 右边文件列表 right = wx.Panel(self._splitter, -1 , style = wx.TAB_TRAVERSAL) self._bucket_info = BucketInfoPanel(right) self._list = FileList(right, wx.DefaultPosition, wx.DefaultSize) vbox = wx.BoxSizer(wx.VERTICAL) vbox.Add(self._bucket_info, 0, wx.EXPAND | wx.ALL, 0) vbox.Add(self._list, 1, wx.EXPAND | wx.ALL, 0) right.SetSizer(vbox) self._splitter.SplitVertically(left, right, 210) self.SetBackgroundColour('#FFFFFF') vbox = wx.BoxSizer(wx.VERTICAL) vbox.Add(logo, 0, wx.ALIGN_LEFT , 0) vbox.Add(self._splitter, 1, wx.EXPAND | wx.ALL, 0) self.SetSizer(vbox) self.SetAutoLayout(True) self.Fit() self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.on_bucket_selected, self._tree) self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.on_object_activated, self._list) self.Bind(wx.EVT_MENU, self.on_view_clicked, id = self.ID_VIEW_MGR) self.Bind(wx.EVT_MENU, self.on_view_clicked, id = self.ID_VIEW_BROWSE) self.Bind(wx.EVT_MENU, self.on_view_clicked, id = self.ID_VIEW_SYNC) self.Bind(wx.EVT_MENU, self.init, id = self.ID_SETTING) self.Bind(wx.EVT_MENU, self.on_delete_bucket, id = TreeView.ID_DELETE_BUCKET) self.Bind(wx.EVT_BUTTON, self.on_create_bucket, id = self.ID_NEW_BUCKET) self.Bind(wx.EVT_MENU, self.on_head_object, id = FileList.ID_HEAD_OBJECT) self.Bind(wx.EVT_BUTTON, self.event_handler.on_button_sync_down, id = BucketInfoPanel.ID_SYNC_DOWN) self.Bind(wx.EVT_BUTTON, self.event_handler.on_button_sync_up, id = BucketInfoPanel.ID_SYNC_UP) self.set_view(self.ID_VIEW_SYNC) def on_bucket_selected(self, event): current_bucket = self.get_bucket_txt(event.m_itemIndex) self.event_handler.select_bucket(current_bucket) def on_object_activated(self, event): path = self.get_list_obj_txt(event.m_itemIndex) self.event_handler.select_object(path) def on_head_object(self, event): path = self.get_list_obj_txt(self._list.GetFirstSelected()) if '..' == path: logging.warning(".. object no head") return self.event_handler.head_object(path) def init(self, evt = None): self._statusbar.SetStatusText('右键可delete Bucket,head object', 0) class Obj(object):pass writer = Obj() writer.write = self.log_handler stream_handler = logging.StreamHandler(writer) #formatter = logging.Formatter("%(levelname)s - %(levelno)s - %(threadName)s - %(message)s") #stream_handler.setFormatter(formatter) logging.getLogger().addHandler(stream_handler) def call(): key_entry = KeyEntryDialog(self, -1, "Input Access key", size = (750, 400), style = wx.DEFAULT_DIALOG_STYLE) host, access_id, access_key = key_entry.get_Key(evt) if host and access_id and access_key: self.event_handler.on_init_gui(host, access_id, access_key) wx.CallAfter(call) def log_handler(self, msg): if not isinstance(msg, unicode): msg = msg.decode('utf8') self._statusbar.SetStatusText(msg, 1) def on_create_bucket(self, evt): dlg = NewBucketEntryDialog(self,) name, attr = dlg.get_Key() if name: self.event_handler.create_bucket(name, attr) dlg.Destroy() def on_delete_bucket(self, evt): index = self._tree.GetFirstSelected() if index < 0: return bucket_name = self.get_bucket_txt(index) self.event_handler.delete_bucket(bucket_name) def on_view_clicked(self, evt): id = evt.GetId() self.set_view(id) def set_view(self, id): if id == self.ID_VIEW_MGR: self._bucket_info.show_mgr_button(True) self._bucket_info.show_sync_button(False) self._list.set_view(True) elif id == self.ID_VIEW_SYNC: self._bucket_info.show_sync_button(True) self._bucket_info.show_mgr_button(False) self._list.set_view(False) elif id == self.ID_VIEW_BROWSE: self._bucket_info.show_mgr_button(False) self._bucket_info.show_sync_button(False) self._list.set_view(False) self._bucket_info.Layout() self._bucket_info.Refresh() def get_sync_path(self): return self._bucket_info.get_sync_path() def get_bucket_txt(self, index): return self._tree.GetItemText(index).encode('utf8') def get_list_obj_txt(self, index): return self._list.GetItemText(index).encode('utf8') def set_service(self, service): self._tree.DeleteAllItems() if service is None:return for bucket in service.get_buckets(): self._tree.add_bucket(bucket) def set_bucket(self, bucket, perfix): # 选择bucket或双击文件夹,返回数据接口 self._bucket_info.set_bucket(bucket.name) self._bucket_info.set_path(bucket.prefix) self._list.set_bucket(bucket, perfix) def set_bucket_acl(self, bucket): #TODO: 可能不一致 self._bucket_info.set_grant(bucket.grant) def ask_continue(self, msg): # TODO:非main线程,xp下会崩溃 return wx.ID_YES == wx.MessageDialog(self, msg.decode('utf8'), u"是否继续?", wx.YES_NO | wx.ICON_QUESTION).ShowModal() def show_msg(self, msg): # TODO:非main线程,xp下会崩溃 return wx.MessageDialog(self, msg.decode('utf8'), self.GetTitle(), wx.OK | wx.ICON_INFORMATION).ShowModal() def show_save_dialog(self, filename): '''return abs unicode path''' dlg = wx.FileDialog( self, message = "Save file as ...", defaultDir = os.getcwd(), defaultFile = filename, style = wx.SAVE ) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() if os.path.exists(path) and self.ask_continue("文件已存在,将覆盖已有文件,是否断续?"): return path return None def head_object(self, key, object_head): cl = lambda : HeadDialog(self, -1, key.decode('utf8'), object_head.headers).ShowModal() wx.CallAfter(cl)