36 def __init__(self, parent, id, name, pos=wx.DefaultPosition, |
36 def __init__(self, parent, id, name, pos=wx.DefaultPosition, |
37 size=wx.DefaultSize, style=0): |
37 size=wx.DefaultSize, style=0): |
38 wx.ListCtrl.__init__(self, parent, id, pos, size, style, name=name) |
38 wx.ListCtrl.__init__(self, parent, id, pos, size, style, name=name) |
39 listmix.ListCtrlAutoWidthMixin.__init__(self) |
39 listmix.ListCtrlAutoWidthMixin.__init__(self) |
40 |
40 |
41 [ID_DISCOVERYDIALOG, ID_DISCOVERYDIALOGSTATICTEXT1, |
41 [ID_DISCOVERYDIALOG, ID_DISCOVERYDIALOGSTATICTEXT1, |
42 ID_DISCOVERYDIALOGSERVICESLIST, ID_DISCOVERYDIALOGREFRESHBUTTON, |
42 ID_DISCOVERYDIALOGSERVICESLIST, ID_DISCOVERYDIALOGREFRESHBUTTON, |
43 ID_DISCOVERYDIALOGLOCALBUTTON, ID_DISCOVERYDIALOGIPBUTTON, |
43 ID_DISCOVERYDIALOGLOCALBUTTON, ID_DISCOVERYDIALOGIPBUTTON, |
44 ] = [wx.NewId() for _init_ctrls in range(6)] |
44 ] = [wx.NewId() for _init_ctrls in range(6)] |
45 |
45 |
46 class DiscoveryDialog(wx.Dialog, listmix.ColumnSorterMixin): |
46 class DiscoveryDialog(wx.Dialog, listmix.ColumnSorterMixin): |
47 |
47 |
48 def _init_coll_MainSizer_Items(self, parent): |
48 def _init_coll_MainSizer_Items(self, parent): |
49 parent.AddWindow(self.staticText1, 0, border=20, flag=wx.TOP|wx.LEFT|wx.RIGHT|wx.GROW) |
49 parent.AddWindow(self.staticText1, 0, border=20, flag=wx.TOP|wx.LEFT|wx.RIGHT|wx.GROW) |
50 parent.AddWindow(self.ServicesList, 0, border=20, flag=wx.LEFT|wx.RIGHT|wx.GROW) |
50 parent.AddWindow(self.ServicesList, 0, border=20, flag=wx.LEFT|wx.RIGHT|wx.GROW) |
51 parent.AddSizer(self.ButtonGridSizer, 0, border=20, flag=wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.GROW) |
51 parent.AddSizer(self.ButtonGridSizer, 0, border=20, flag=wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.GROW) |
52 |
52 |
53 def _init_coll_MainSizer_Growables(self, parent): |
53 def _init_coll_MainSizer_Growables(self, parent): |
54 parent.AddGrowableCol(0) |
54 parent.AddGrowableCol(0) |
55 parent.AddGrowableRow(1) |
55 parent.AddGrowableRow(1) |
56 |
56 |
57 def _init_coll_ButtonGridSizer_Items(self, parent): |
57 def _init_coll_ButtonGridSizer_Items(self, parent): |
58 parent.AddWindow(self.RefreshButton, 0, border=0, flag=0) |
58 parent.AddWindow(self.RefreshButton, 0, border=0, flag=0) |
59 parent.AddWindow(self.LocalButton, 0, border=0, flag=0) |
59 parent.AddWindow(self.LocalButton, 0, border=0, flag=0) |
60 parent.AddWindow(self.IpButton, 0, border=0, flag=0) |
60 parent.AddWindow(self.IpButton, 0, border=0, flag=0) |
61 parent.AddSizer(self.ButtonSizer, 0, border=0, flag=0) |
61 parent.AddSizer(self.ButtonSizer, 0, border=0, flag=0) |
62 |
62 |
63 def _init_coll_ButtonGridSizer_Growables(self, parent): |
63 def _init_coll_ButtonGridSizer_Growables(self, parent): |
64 parent.AddGrowableCol(0) |
64 parent.AddGrowableCol(0) |
65 parent.AddGrowableCol(1) |
65 parent.AddGrowableCol(1) |
66 parent.AddGrowableRow(0) |
66 parent.AddGrowableRow(0) |
67 |
67 |
68 def _init_sizers(self): |
68 def _init_sizers(self): |
69 self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=10) |
69 self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=10) |
70 self.ButtonGridSizer = wx.FlexGridSizer(cols=4, hgap=5, rows=1, vgap=0) |
70 self.ButtonGridSizer = wx.FlexGridSizer(cols=4, hgap=5, rows=1, vgap=0) |
71 |
71 |
72 self._init_coll_MainSizer_Items(self.MainSizer) |
72 self._init_coll_MainSizer_Items(self.MainSizer) |
73 self._init_coll_MainSizer_Growables(self.MainSizer) |
73 self._init_coll_MainSizer_Growables(self.MainSizer) |
74 self._init_coll_ButtonGridSizer_Items(self.ButtonGridSizer) |
74 self._init_coll_ButtonGridSizer_Items(self.ButtonGridSizer) |
75 self._init_coll_ButtonGridSizer_Growables(self.ButtonGridSizer) |
75 self._init_coll_ButtonGridSizer_Growables(self.ButtonGridSizer) |
76 |
76 |
77 self.SetSizer(self.MainSizer) |
77 self.SetSizer(self.MainSizer) |
78 |
78 |
79 def _init_ctrls(self, prnt): |
79 def _init_ctrls(self, prnt): |
80 wx.Dialog.__init__(self, id=ID_DISCOVERYDIALOG, |
80 wx.Dialog.__init__(self, id=ID_DISCOVERYDIALOG, |
81 name='DiscoveryDialog', parent=prnt, style=wx.DEFAULT_DIALOG_STYLE, |
81 name='DiscoveryDialog', parent=prnt, style=wx.DEFAULT_DIALOG_STYLE, |
82 title=_('Service Discovery')) |
82 title=_('Service Discovery')) |
83 |
83 |
84 self.staticText1 = wx.StaticText(id=ID_DISCOVERYDIALOGSTATICTEXT1, |
84 self.staticText1 = wx.StaticText(id=ID_DISCOVERYDIALOGSTATICTEXT1, |
85 label=_('Services available:'), name='staticText1', parent=self, |
85 label=_('Services available:'), name='staticText1', parent=self, |
86 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
86 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
87 |
87 |
88 # Set up list control |
88 # Set up list control |
89 self.ServicesList = AutoWidthListCtrl(id=ID_DISCOVERYDIALOGSERVICESLIST, |
89 self.ServicesList = AutoWidthListCtrl(id=ID_DISCOVERYDIALOGSERVICESLIST, |
90 name='ServicesList', parent=self, pos=wx.Point(0, 0), size=wx.Size(0, 0), |
90 name='ServicesList', parent=self, pos=wx.Point(0, 0), size=wx.Size(0, 0), |
91 style=wx.LC_REPORT|wx.LC_EDIT_LABELS|wx.LC_SORT_ASCENDING|wx.LC_SINGLE_SEL) |
91 style=wx.LC_REPORT|wx.LC_EDIT_LABELS|wx.LC_SORT_ASCENDING|wx.LC_SINGLE_SEL) |
92 self.ServicesList.InsertColumn(0, _('NAME')) |
92 self.ServicesList.InsertColumn(0, _('NAME')) |
93 self.ServicesList.InsertColumn(1, _('TYPE')) |
93 self.ServicesList.InsertColumn(1, _('TYPE')) |
94 self.ServicesList.InsertColumn(2, _('IP')) |
94 self.ServicesList.InsertColumn(2, _('IP')) |
95 self.ServicesList.InsertColumn(3, _('PORT')) |
95 self.ServicesList.InsertColumn(3, _('PORT')) |
98 self.ServicesList.SetColumnWidth(2, 150) |
98 self.ServicesList.SetColumnWidth(2, 150) |
99 self.ServicesList.SetColumnWidth(3, 150) |
99 self.ServicesList.SetColumnWidth(3, 150) |
100 self.ServicesList.SetInitialSize(wx.Size(-1, 300)) |
100 self.ServicesList.SetInitialSize(wx.Size(-1, 300)) |
101 self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, id=ID_DISCOVERYDIALOGSERVICESLIST) |
101 self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, id=ID_DISCOVERYDIALOGSERVICESLIST) |
102 self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated, id=ID_DISCOVERYDIALOGSERVICESLIST) |
102 self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated, id=ID_DISCOVERYDIALOGSERVICESLIST) |
103 |
103 |
104 listmix.ColumnSorterMixin.__init__(self, 4) |
104 listmix.ColumnSorterMixin.__init__(self, 4) |
105 |
105 |
106 self.RefreshButton = wx.Button(id=ID_DISCOVERYDIALOGREFRESHBUTTON, |
106 self.RefreshButton = wx.Button(id=ID_DISCOVERYDIALOGREFRESHBUTTON, |
107 label=_('Refresh'), name='RefreshButton', parent=self, |
107 label=_('Refresh'), name='RefreshButton', parent=self, |
108 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
108 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
109 self.Bind(wx.EVT_BUTTON, self.OnRefreshButton, id=ID_DISCOVERYDIALOGREFRESHBUTTON) |
109 self.Bind(wx.EVT_BUTTON, self.OnRefreshButton, id=ID_DISCOVERYDIALOGREFRESHBUTTON) |
110 |
110 |
111 self.LocalButton = wx.Button(id=ID_DISCOVERYDIALOGLOCALBUTTON, |
111 self.LocalButton = wx.Button(id=ID_DISCOVERYDIALOGLOCALBUTTON, |
112 label=_('Local'), name='LocalButton', parent=self, |
112 label=_('Local'), name='LocalButton', parent=self, |
113 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
113 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
114 self.Bind(wx.EVT_BUTTON, self.OnLocalButton, id=ID_DISCOVERYDIALOGLOCALBUTTON) |
114 self.Bind(wx.EVT_BUTTON, self.OnLocalButton, id=ID_DISCOVERYDIALOGLOCALBUTTON) |
115 |
115 |
116 self.IpButton = wx.Button(id=ID_DISCOVERYDIALOGIPBUTTON, |
116 self.IpButton = wx.Button(id=ID_DISCOVERYDIALOGIPBUTTON, |
117 label=_('Add IP'), name='IpButton', parent=self, |
117 label=_('Add IP'), name='IpButton', parent=self, |
118 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
118 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
119 self.Bind(wx.EVT_BUTTON, self.OnIpButton, id=ID_DISCOVERYDIALOGIPBUTTON) |
119 self.Bind(wx.EVT_BUTTON, self.OnIpButton, id=ID_DISCOVERYDIALOGIPBUTTON) |
120 |
120 |
121 self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTER) |
121 self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTER) |
122 |
122 |
123 self._init_sizers() |
123 self._init_sizers() |
124 self.Fit() |
124 self.Fit() |
125 |
125 |
126 def __init__(self, parent): |
126 def __init__(self, parent): |
127 self._init_ctrls(parent) |
127 self._init_ctrls(parent) |
128 |
128 |
129 self.itemDataMap = {} |
129 self.itemDataMap = {} |
130 self.nextItemId = 0 |
130 self.nextItemId = 0 |
131 |
131 |
132 self.URI = None |
132 self.URI = None |
133 self.Browser = None |
133 self.Browser = None |
134 |
134 |
135 self.ZeroConfInstance = Zeroconf() |
135 self.ZeroConfInstance = Zeroconf() |
136 self.RefreshList() |
136 self.RefreshList() |
137 self.LatestSelection=None |
137 self.LatestSelection=None |
138 |
138 |
139 def __del__(self): |
139 def __del__(self): |
140 if self.Browser is not None : self.Browser.cancel() |
140 if self.Browser is not None : self.Browser.cancel() |
141 self.ZeroConfInstance.close() |
141 self.ZeroConfInstance.close() |
142 |
142 |
143 def RefreshList(self): |
143 def RefreshList(self): |
144 if self.Browser is not None : self.Browser.cancel() |
144 if self.Browser is not None : self.Browser.cancel() |
145 self.Browser = ServiceBrowser(self.ZeroConfInstance, service_type, self) |
145 self.Browser = ServiceBrowser(self.ZeroConfInstance, service_type, self) |
146 |
146 |
147 def OnRefreshButton(self, event): |
147 def OnRefreshButton(self, event): |
179 |
179 |
180 # def SetURI(self, idx): |
180 # def SetURI(self, idx): |
181 # connect_type = self.getColumnText(idx, 1) |
181 # connect_type = self.getColumnText(idx, 1) |
182 # connect_address = self.getColumnText(idx, 2) |
182 # connect_address = self.getColumnText(idx, 2) |
183 # connect_port = self.getColumnText(idx, 3) |
183 # connect_port = self.getColumnText(idx, 3) |
184 # |
184 # |
185 # self.URI = "%s://%s:%s"%(connect_type, connect_address, connect_port) |
185 # self.URI = "%s://%s:%s"%(connect_type, connect_address, connect_port) |
186 |
186 |
187 def SetURI(self, idx): |
187 def SetURI(self, idx): |
188 self.LatestSelection = idx |
188 self.LatestSelection = idx |
189 svcname = self.getColumnText(idx, 0) |
189 svcname = self.getColumnText(idx, 0) |
190 connect_type = self.getColumnText(idx, 1) |
190 connect_type = self.getColumnText(idx, 1) |
191 self.URI = "%s://%s"%(connect_type, svcname + '.' + service_type) |
191 self.URI = "%s://%s"%(connect_type, svcname + '.' + service_type) |
192 |
192 |
193 def GetURI(self): |
193 def GetURI(self): |
194 return self.URI |
194 return self.URI |
195 |
195 |
196 def removeService(self, zeroconf, _type, name): |
196 def removeService(self, zeroconf, _type, name): |
197 wx.CallAfter(self._removeService, name) |
197 wx.CallAfter(self._removeService, name) |
198 |
198 |
199 |
199 |
200 def _removeService(self, name): |
200 def _removeService(self, name): |
201 ''' |
201 ''' |
202 called when a service with the desired type goes offline. |
202 called when a service with the desired type goes offline. |
203 ''' |
203 ''' |
204 |
204 |
205 # loop through the list items looking for the service that went offline |
205 # loop through the list items looking for the service that went offline |
206 for idx in xrange(self.ServicesList.GetItemCount()): |
206 for idx in xrange(self.ServicesList.GetItemCount()): |
207 # this is the unique identifier assigned to the item |
207 # this is the unique identifier assigned to the item |
208 item_id = self.ServicesList.GetItemData(idx) |
208 item_id = self.ServicesList.GetItemData(idx) |
209 |
209 |