query.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. """!
  2. @package gui_core.query
  3. @brief wxGUI query dialog
  4. Classes:
  5. - query::QueryDialog
  6. (C) 2013 by the GRASS Development Team
  7. This program is free software under the GNU General Public License
  8. (>=v2). Read the file COPYING that comes with GRASS for details.
  9. @author Anna Kratochvilova <kratochanna gmail.com>
  10. """
  11. import wx
  12. import wx.gizmos as gizmos
  13. class QueryDialog(wx.Dialog):
  14. def __init__(self, parent, data = None):
  15. wx.Dialog.__init__(self, parent, id = wx.ID_ANY,
  16. title = _("Query results"),
  17. size = (420, 400),
  18. style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
  19. self.data = data
  20. self.panel = wx.Panel(self, id = wx.ID_ANY)
  21. self.mainSizer = wx.BoxSizer(wx.VERTICAL)
  22. self.tree = gizmos.TreeListCtrl(self.panel, id = wx.ID_ANY,
  23. style = wx.TR_DEFAULT_STYLE |
  24. wx.TR_HIDE_ROOT)
  25. self.tree.AddColumn("Feature")
  26. self.tree.AddColumn("Value")
  27. self.tree.SetMainColumn(0)
  28. self.tree.SetColumnWidth(0, 220)
  29. self.tree.SetColumnWidth(1, 400)
  30. self.mainSizer.Add(item = self.tree, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 5)
  31. if self.data:
  32. self._load()
  33. close = wx.Button(self.panel, id = wx.ID_CLOSE)
  34. close.Bind(wx.EVT_BUTTON, lambda event: self.Close())
  35. copy = wx.Button(self.panel, id = wx.ID_ANY, label = _("Copy to clipboard"))
  36. copy.Bind(wx.EVT_BUTTON, self.Copy)
  37. self.Bind(wx.EVT_CLOSE, self.OnClose)
  38. hbox = wx.BoxSizer(wx.HORIZONTAL)
  39. hbox.AddStretchSpacer(1)
  40. hbox.Add(item = copy, proportion = 0, flag = wx.EXPAND | wx.RIGHT, border = 5)
  41. hbox.Add(item = close, proportion = 0, flag = wx.EXPAND | wx.ALL, border = 0)
  42. self.mainSizer.Add(item = hbox, proportion = 0, flag = wx.EXPAND | wx.ALL, border = 5)
  43. self.panel.SetSizer(self.mainSizer)
  44. self.mainSizer.Fit(self.panel)
  45. # for Windows
  46. self.SendSizeEvent()
  47. def _load(self):
  48. self.tree.DeleteAllItems()
  49. self.root = self.tree.AddRoot("The Root Item")
  50. for part in self.data:
  51. self._addItem(self.root, part)
  52. self.tree.UnselectAll()
  53. self.tree.ExpandAll(self.root)
  54. def _print(self):
  55. string = []
  56. for part in self.data:
  57. self._printItem(string, '', part)
  58. string.append('')
  59. return '\n'.join(string)
  60. def _addItem(self, parent, data):
  61. for k, v in data.iteritems():
  62. if isinstance(v, dict):
  63. item = self.tree.AppendItem(parent, text = k)
  64. self.tree.SetItemText(item, '', 1)
  65. self._addItem(item, v)
  66. else:
  67. item = self.tree.AppendItem(parent, text = k)
  68. self.tree.SetItemText(item, str(v), 1)
  69. def _printItem(self, string, indent, data):
  70. for k, v in data.iteritems():
  71. if isinstance(v, dict):
  72. string.append(indent + k)
  73. self._printItem(string, indent + ' ', v)
  74. else:
  75. string.append(indent + k + ': ' + str(v))
  76. def SetData(self, data):
  77. self.data = data
  78. self._load()
  79. def Copy(self, event):
  80. text = self._print()
  81. if wx.TheClipboard.Open():
  82. do = wx.TextDataObject()
  83. do.SetText(text)
  84. wx.TheClipboard.SetData(do)
  85. wx.TheClipboard.Close()
  86. def OnClose(self, event):
  87. self.Destroy()
  88. event.Skip()
  89. def PrepareQueryResults(coordinates, result):
  90. """!Prepare query results as a Query dialog input.
  91. Adds coordinates, improves vector results tree structure.
  92. """
  93. data = []
  94. data.append({_("east"): coordinates[0]})
  95. data.append({_("north"): coordinates[1]})
  96. for part in result:
  97. if 'Map' in part:
  98. itemText = part['Map']
  99. if 'Mapset' in part:
  100. itemText += '@' + part['Mapset']
  101. del part['Mapset']
  102. del part['Map']
  103. if part:
  104. data.append({itemText: part})
  105. else:
  106. data.append({itemText: _("Nothing found")})
  107. else:
  108. data.append(part)
  109. return data
  110. def test():
  111. app = wx.PySimpleApp()
  112. import pprint
  113. from grass.script import vector as gvect
  114. from grass.script import raster as grast
  115. testdata1 = grast.raster_what(map = ('elevation_shade@PERMANENT','landclass96'),
  116. coord = [(638509.051416,224742.348346)])
  117. testdata2 = gvect.vector_what(map=('firestations','bridges'),
  118. coord=(633177.897487,221352.921257), distance=10)
  119. testdata = testdata1 + testdata2
  120. data = PrepareQueryResults(coordinates = (638509.051416,224742.348346), result = testdata)
  121. frame = QueryDialog(parent = None, data = data)
  122. frame.ShowModal()
  123. frame.Destroy()
  124. app.MainLoop()
  125. if __name__ == "__main__":
  126. test()