34 listmix.ListCtrlAutoWidthMixin.__init__(self) |
34 listmix.ListCtrlAutoWidthMixin.__init__(self) |
35 |
35 |
36 class DiscoveryDialog(wx.Dialog, listmix.ColumnSorterMixin): |
36 class DiscoveryDialog(wx.Dialog, listmix.ColumnSorterMixin): |
37 def __init__(self, parent, id=-1, title='Service Discovery'): |
37 def __init__(self, parent, id=-1, title='Service Discovery'): |
38 self.my_result=None |
38 self.my_result=None |
39 self.itemDataMap = {} |
|
40 wx.Dialog.__init__(self, parent, id, title, size=(600,600), style=wx.DEFAULT_DIALOG_STYLE) |
39 wx.Dialog.__init__(self, parent, id, title, size=(600,600), style=wx.DEFAULT_DIALOG_STYLE) |
41 |
40 |
|
41 sizer = wx.FlexGridSizer(2, 1, 2, 2) # rows, cols, vgap, hgap |
|
42 sizer.AddGrowableRow(0) |
|
43 sizer.AddGrowableCol(0) |
|
44 |
42 self.list = TestListCtrl(self, -1, |
45 self.list = TestListCtrl(self, -1, |
43 pos=(50,20), |
46 #pos=(50,20), |
44 size=(500,300), |
47 #size=(500,300), |
45 style=wx.LC_REPORT |
48 style=wx.LC_REPORT |
46 | wx.LC_EDIT_LABELS |
49 | wx.LC_EDIT_LABELS |
47 | wx.LC_SORT_ASCENDING |
50 | wx.LC_SORT_ASCENDING |
48 ) |
51 ) |
|
52 sizer.Add(self.list, 1, wx.EXPAND) |
|
53 |
|
54 btsizer = wx.FlexGridSizer(1, 6, 2, 2) # rows, cols, vgap, hgap |
|
55 |
|
56 sizer.Add(btsizer, 1, wx.EXPAND) |
|
57 |
49 self.PopulateList() |
58 self.PopulateList() |
50 |
59 |
51 self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list) |
60 self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list) |
52 self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected, self.list) |
|
53 self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated, self.list) |
61 self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated, self.list) |
54 self.Bind(wx.EVT_LIST_DELETE_ITEM, self.OnItemDelete, self.list) |
|
55 self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick, self.list) |
|
56 self.list.Bind(wx.EVT_LEFT_DCLICK, self.OnDoubleClick) |
|
57 |
62 |
58 b = wx.Button(self,20, "Connect", (175, 500)) |
63 local_id = wx.NewId() |
59 self.Bind(wx.EVT_BUTTON, self.OnConnect, b) |
64 b = wx.Button(self, local_id, "Refresh") |
60 b.SetSize(b.GetBestSize()) |
65 self.Bind(wx.EVT_BUTTON, self.OnRefreshButton, b) |
|
66 btsizer.Add(b) |
61 |
67 |
62 b = wx.Button(self, 40, "Cancel", (350, 500)) |
68 btsizer.AddSpacer(0) |
63 self.Bind(wx.EVT_BUTTON, self.OnClose, b) |
69 btsizer.AddGrowableCol(1) |
64 b.SetSize(b.GetBestSize()) |
70 |
|
71 local_id = wx.NewId() |
|
72 b = wx.Button(self, local_id, "Local") |
|
73 self.Bind(wx.EVT_BUTTON, self.ChooseLocalID, b) |
|
74 btsizer.Add(b) |
|
75 |
|
76 btsizer.AddSpacer(0) |
|
77 btsizer.AddGrowableCol(3) |
|
78 |
|
79 b = wx.Button(self, wx.ID_CANCEL, "Cancel") |
|
80 #self.Bind(wx.EVT_BUTTON, self.OnClose, b) |
|
81 btsizer.Add(b) |
|
82 |
|
83 b = wx.Button(self, wx.ID_OK, "OK") |
|
84 #self.Bind(wx.EVT_BUTTON, self.OnConnect, b) |
|
85 b.SetDefault() |
|
86 btsizer.Add(b) |
|
87 |
|
88 self.SetSizer(sizer) |
|
89 |
|
90 listmix.ColumnSorterMixin.__init__(self, 4) |
65 |
91 |
66 #type = "_http._tcp.local." |
92 #type = "_http._tcp.local." |
|
93 self.zConfInstance = Zeroconf() |
|
94 self.RefreshList() |
|
95 |
|
96 def RefreshList(self): |
67 type = "_PYRO._tcp.local." |
97 type = "_PYRO._tcp.local." |
68 self.r = Zeroconf() |
98 browser = ServiceBrowser(self.zConfInstance, type, self) |
69 browser = ServiceBrowser(self.r, type, self) |
|
70 |
99 |
71 listmix.ColumnSorterMixin.__init__(self, 4) |
100 def OnRefreshButton(self, event): |
|
101 self.list.DeleteAllItems() |
|
102 self.RefreshList() |
|
103 |
72 # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py |
104 # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py |
73 def GetListCtrl(self): |
105 def GetListCtrl(self): |
74 return self.list |
106 return self.list |
75 |
107 |
76 def PopulateList(self): |
108 def PopulateList(self): |
77 self.list.InsertColumn(0, 'NAME') |
109 self.list.InsertColumn(0, 'NAME') |
78 self.list.InsertColumn(1, 'TYPE') |
110 self.list.InsertColumn(1, 'TYPE') |
79 self.list.InsertColumn(2, 'IP') |
111 self.list.InsertColumn(2, 'IP') |
80 self.list.InsertColumn(3, 'PORT') |
112 self.list.InsertColumn(3, 'PORT') |
81 self.list.SetColumnWidth(0, 150) |
113 self.list.SetColumnWidth(0, 150) |
82 self.list.SetColumnWidth(1, 150) |
114 self.list.SetColumnWidth(1, 150) |
87 item = self.list.GetItem(index, col) |
119 item = self.list.GetItem(index, col) |
88 return item.GetText() |
120 return item.GetText() |
89 |
121 |
90 def OnItemSelected(self, event): |
122 def OnItemSelected(self, event): |
91 self.currentItem = event.m_itemIndex |
123 self.currentItem = event.m_itemIndex |
92 print "OnItemSelected: %s, %s, %s, %s\n"%(self.currentItem, |
124 self.setresult() |
93 self.list.GetItemText(self.currentItem), |
|
94 self.getColumnText(self.currentItem, 1), |
|
95 self.getColumnText(self.currentItem, 2)) |
|
96 event.Skip() |
125 event.Skip() |
97 |
|
98 |
|
99 def OnItemDeselected(self, evt): |
|
100 item = evt.GetItem() |
|
101 print "OnItemDeselected: %d" % evt.m_itemIndex |
|
102 |
126 |
103 def OnItemActivated(self, event): |
127 def OnItemActivated(self, event): |
104 self.currentItem = event.m_itemIndex |
128 self.currentItem = event.m_itemIndex |
105 print "OnItemActivated: %s\nTopItem: %s" %(self.list.GetItemText(self.currentItem), self.list.GetTopItem()) |
129 self.setresult() |
106 |
130 self.Close() |
107 def OnItemDelete(self, event): |
|
108 print "OnItemDelete\n" |
|
109 |
|
110 def OnColClick(self, event): |
|
111 print "OnColClick: %d\n" % event.GetColumn() |
|
112 event.Skip() |
131 event.Skip() |
113 |
132 |
114 def OnColRightClick(self, event): |
133 def setresult(self): |
115 item = self.list.GetColumn(event.GetColumn()) |
|
116 print "OnColRightClick: %d %s\n" %(event.GetColumn(), (item.GetText(), item.GetAlign(), |
|
117 item.GetWidth(), item.GetImage())) |
|
118 def OnDoubleClick(self, event): |
|
119 connect_type = self.getColumnText(self.currentItem, 1) |
134 connect_type = self.getColumnText(self.currentItem, 1) |
120 connect_address = self.getColumnText(self.currentItem, 2) |
135 connect_address = self.getColumnText(self.currentItem, 2) |
121 connect_port = self.getColumnText(self.currentItem, 3) |
136 connect_port = self.getColumnText(self.currentItem, 3) |
122 |
137 |
123 uri = self.CreateURI(connect_type, connect_address, connect_port) |
138 uri = self.CreateURI(connect_type, connect_address, connect_port) |
125 event.Skip() |
140 event.Skip() |
126 |
141 |
127 def GetResult(self): |
142 def GetResult(self): |
128 return self.my_result |
143 return self.my_result |
129 |
144 |
130 def OnClick(self, event): |
|
131 print "Click! (%d)\n" %event.GetId() |
|
132 index = self.list.GetFocusedItem() |
|
133 self.list.DeleteItem(index) |
|
134 print "Service", name, "removed" |
|
135 |
|
136 def removeService(self, zeroconf, type, name): |
145 def removeService(self, zeroconf, type, name): |
137 index = self.list.GetFocusedItem() |
146 pass |
138 |
147 |
139 def addService(self, zeroconf, type, name): |
148 def addService(self, zeroconf, type, name): |
140 info = self.r.getServiceInfo(type, name) |
149 info = self.zConfInstance.getServiceInfo(type, name) |
141 typename = type.split(".")[0][1:] |
150 typename = type.split(".")[0][1:] |
142 num_items = self.list.GetItemCount() |
151 num_items = self.list.GetItemCount() |
143 self.itemDataMap[num_items] = (name, "%s"%type, "%s"%str(socket.inet_ntoa(info.getAddress())), "%s"%info.getPort()) |
|
144 self.list.InsertStringItem(num_items, name.split(".")[0]) |
152 self.list.InsertStringItem(num_items, name.split(".")[0]) |
145 self.list.SetStringItem(num_items, 1, "%s"%typename) |
153 self.list.SetStringItem(num_items, 1, "%s"%typename) |
146 self.list.SetStringItem(num_items, 2, "%s"%str(socket.inet_ntoa(info.getAddress()))) |
154 self.list.SetStringItem(num_items, 2, "%s"%str(socket.inet_ntoa(info.getAddress()))) |
147 self.list.SetStringItem(num_items, 3, "%s"%info.getPort()) |
155 self.list.SetStringItem(num_items, 3, "%s"%info.getPort()) |
148 |
156 |
149 def CreateURI(self, connect_type, connect_address, connect_port): |
157 def CreateURI(self, connect_type, connect_address, connect_port): |
150 uri = "%s://%s:%s"%(connect_type, connect_address, connect_port) |
158 uri = "%s://%s:%s"%(connect_type, connect_address, connect_port) |
151 print uri |
|
152 return uri |
159 return uri |
153 |
160 |
154 def OnAdd(self, event): |
161 def ChooseLocalID(self, event): |
155 num_items = self.list.GetItemCount() |
162 self.my_result = "PYRO://localhost:3000" |
156 self.list.InsertStringItem(num_items, self.tc1.GetValue()) |
|
157 self.list.SetStringItem(num_items, 1, self.tc2.GetValue()) |
|
158 |
|
159 def OnRemove(self, event): |
|
160 index = self.list.GetFocusedItem() |
|
161 self.list.DeleteItem(index) |
|
162 |
|
163 def OnConnect(self, event): |
|
164 index = self.list.GetFocusedItem() |
|
165 print self.list.GetItemData(index) |
|
166 |
|
167 def OnClose(self, event): |
|
168 self.Close() |
163 self.Close() |
169 |
|
170 def OnClear(self, event): |
|
171 self.list.DeleteAllItems() |
|