interface.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #!/usr/bin/env python
  2. #
  3. # INTERFACE
  4. #
  5. # A graphical user interface based on GTK+
  6. #
  7. # This will be the primary means of making the search engine work. A few fields
  8. # and buttons, and all that functionality will be within reach.
  9. #
  10. # I'm choosing PyGTK because I intend the search engine to be applied only to
  11. # UNIX systems, for which GTK+ seems to be almost an ubiquitous choice anyway.
  12. #
  13. # VERSIONING
  14. # - v1.0: able to search either by filename or by file content, doesn't freeze
  15. # screen during searches, able to update the database, but does freeze up in
  16. # the process. Displays results as file locations.
  17. #
  18. import os
  19. import sys
  20. import gtk
  21. import query
  22. class MainWindow:
  23. '''
  24. This may sound like a kindergarten all over again, but hey, everyone
  25. forgets something every now and them, right?
  26. '''
  27. def search(self, widget, event, token=None):
  28. '''
  29. Searches the database via the module query.py using the specified
  30. input from the text field.
  31. '''
  32. self.query = self.queryfield.get_text()
  33. if self.query == "":
  34. self.statusbar.set_text("Empty query received.")
  35. return
  36. self.statusbar.set_text("Searching...")
  37. while not self.done:
  38. if self.indexsearch:
  39. self.results = query.index_search(self.query)
  40. else:
  41. self.results = query.simple_search(self.query)
  42. if self.results:
  43. self.done = True
  44. while gtk.events_pending():
  45. gtk.main_iteration()
  46. self.done = False
  47. self.total = 0
  48. for result in self.results:
  49. self.clipboard += result[0] + '\n'
  50. self.total += 1
  51. while gtk.events_pending():
  52. gtk.main_iteration()
  53. print "We found %d files containing '%s'" % (self.total, self.query)
  54. self.results_list.set_text("We found %d files containing '%s'" % (self.total, self.query))
  55. self.results_list.set_text(self.clipboard)
  56. self.clipboard = ""
  57. # spam protection:
  58. self.queryfield.set_text("")
  59. self.statusbar.set_text("%d files found." % self.total)
  60. def refresh(self, widget, event, data = None):
  61. self.statusbar.set_text("Refreshing the database...")
  62. while not self.done:
  63. while gtk.events_pending():
  64. gtk.main_iteration()
  65. self.refreshed = query.refresh()
  66. if self.refreshed:
  67. self.done = True
  68. self.done = False
  69. self.statusbar.set_text("Database refreshed.")
  70. def set_index(self, widget, data = None):
  71. if widget.get_active():
  72. print "Index searching is ON"
  73. self.indexsearch = True
  74. else:
  75. print "Index searching is OFF"
  76. self.indexsearch = False
  77. def __init__(self):
  78. # These variables are not part of the interface:
  79. self.results = None
  80. self.refreshed = False
  81. self.done = False
  82. self.clipboard = ""
  83. self.indexsearch = False
  84. # These and below are part of the user interface:
  85. self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  86. self.window.set_title("Search Engine")
  87. self.window.set_border_width(10)
  88. self.window.set_default_size(600, 500)
  89. self.window.connect("destroy", gtk.main_quit)
  90. # create widgets:
  91. self.maingrid = gtk.VBox(False, 0)
  92. self.horgrid = gtk.HBox(True, 0)
  93. self.searchgrid = gtk.HBox(False, 2)
  94. self.optionsgrid = gtk.HBox(False, 2)
  95. self.title = gtk.Label("Enter the terms you would like to search and click 'Search'")
  96. self.submitbutton = gtk.Button("Search")
  97. self.submitbutton.connect("clicked", self.search, None)
  98. self.queryfield = gtk.Entry(max=0)
  99. self.refreshbutton = gtk.Button("Refresh database")
  100. self.refreshbutton.connect("clicked", self.refresh, None)
  101. self.toggleindex = gtk.CheckButton("Search within files")
  102. self.toggleindex.connect("toggled", self.set_index)
  103. self.statusbar = gtk.Label("Ready")
  104. self.results_placeholder = gtk.VBox(False, 0)
  105. self.results_scroll = gtk.ScrolledWindow()
  106. self.results_scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS)
  107. self.results_list = gtk.Label("Your search results will appear here.")
  108. # pack widgets:
  109. self.searchgrid.pack_start(self.queryfield, True, True, 0)
  110. self.searchgrid.pack_start(self.submitbutton, False, False, 0)
  111. self.optionsgrid.pack_start(self.toggleindex, True, True, 0)
  112. self.optionsgrid.pack_start(self.refreshbutton, False, False, 0)
  113. self.maingrid.pack_start(self.title, False, False, 0)
  114. self.maingrid.pack_start(self.searchgrid, False, False, 0)
  115. self.maingrid.pack_start(self.optionsgrid, False, False, 0)
  116. self.maingrid.pack_start(self.statusbar, False, False, 0)
  117. self.results_scroll.add_with_viewport(self.results_list)
  118. self.results_placeholder.pack_start(self.results_scroll, True, True, 0)
  119. self.horgrid.pack_start(self.maingrid, True, False, 5)
  120. self.horgrid.pack_start(self.results_placeholder, True, True, 0)
  121. # show everything:
  122. self.submitbutton.show()
  123. self.title.show()
  124. self.queryfield.show()
  125. self.submitbutton.show()
  126. self.statusbar.show()
  127. self.refreshbutton.show()
  128. self.toggleindex.show()
  129. self.maingrid.show()
  130. self.horgrid.show()
  131. self.results_placeholder.show()
  132. self.results_list.show()
  133. self.results_scroll.show()
  134. self.searchgrid.show()
  135. self.optionsgrid.show()
  136. self.window.add(self.horgrid) # without this, they never exist!
  137. self.window.show()
  138. def main(self):
  139. gtk.main()
  140. if __name__ == "__main__":
  141. base = MainWindow()
  142. base.main()