Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
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)