]> git.phdru.name Git - m_librarian.git/blob - m_librarian/wx/SearchPanels.py
Fix(wx/search): Do not allow empty search value
[m_librarian.git] / m_librarian / wx / SearchPanels.py
1 # coding: utf-8
2
3 import wx
4 from ..config import get_config
5 from ..search import search_authors_raw, search_books_raw
6 from .ListAuthors import ListAuthorsWindow, ListBooksWindow
7
8
9 _search_types = ['start', 'substring', 'full']
10
11
12 class SearchPanel(wx.Panel):
13
14     # Subclasses must override these
15     search_title = None
16     search_button_title = None
17
18     def __init__(self, parent):
19         wx.Panel.__init__(self, parent)
20         search_vsizer = \
21             wx.StaticBoxSizer(wx.VERTICAL, self, self.search_title)
22         self.SetSizer(search_vsizer)
23
24         self.search = search = \
25             wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER)
26         search_vsizer.Add(search, 0, wx.EXPAND, 0)
27         search.Bind(wx.EVT_TEXT_ENTER, self.DoSearch)
28
29         self.search_substr = search_substr = wx.RadioBox(
30             self,
31             choices=[
32                 u'Подстрока в начале',
33                 u'Подстрока',
34                 u'Точное совпадение',
35             ],
36             majorDimension=1, style=wx.RA_SPECIFY_ROWS
37         )
38         search_vsizer.Add(search_substr)
39
40         self.search_case = search_case = wx.CheckBox(
41             self, label=u'Различать прописные/строчные')
42         search_vsizer.Add(search_case)
43
44         search_button = wx.Button(self, label=self.search_button_title)
45         search_vsizer.Add(search_button, 0, wx.ALIGN_CENTER, 0)
46         search_button.Bind(wx.EVT_BUTTON, self.DoSearch)
47
48     def DoSearch(self, event):
49         search = self.search.GetValue()
50         if not search:
51             self.search.SetFocus()
52             return
53         search_substr = _search_types[self.search_substr.GetSelection()]
54         search_case = self.search_case.GetValue()
55         if search_case is False:
56             search_case = None
57         self.realSearch(search, search_substr, search_case)
58
59
60 class SearchAuthorsPanel(SearchPanel):
61
62     search_title = u'Поиск авторов'
63     search_button_title = u'Искать авторов'
64
65     def realSearch(self, value, search_substr, search_case):
66         search_results = \
67             search_authors_raw(value, search_substr, search_case)
68         ListAuthorsWindow(self.Parent, search_results)
69
70
71 class SearchBooksPanel(SearchPanel):
72
73     search_title = u'Поиск книг'
74     search_button_title = u'Искать книги'
75
76     def __init__(self, parent):
77         SearchPanel.__init__(self, parent)
78         self.use_filters = use_filters = wx.CheckBox(
79             self, label=u'Использовать фильтры')
80         use_filters_cfg = \
81             get_config().getint('filters', 'use_in_search_forms', 1)
82         use_filters.SetValue(use_filters_cfg)
83         sizer = self.GetSizer()
84         s_count = len(sizer.GetChildren())
85         sizer.Insert(s_count-1, use_filters)  # Insert before the cutton
86
87     def realSearch(self, value, search_substr, search_case):
88         use_filters = self.use_filters.GetValue()
89         search_results = \
90             search_books_raw(value, search_substr, search_case, use_filters)
91         ListBooksWindow(self.Parent, search_results)