Source code for timelinelib.wxgui.components.searchbar.controller
# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 Rickard Lindberg, Roger Lindberg
#
# This file is part of Timeline.
#
# Timeline is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Timeline is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Timeline. If not, see <http://www.gnu.org/licenses/>.
import wx
from timelinelib.wxgui.dialogs.eventlist.view import EventListDialog
[docs]class SearchBarController:
[docs] def __init__(self, view):
self._view = view
self._result = []
self._result_index = 0
self._last_search = None
self._last_period = None
[docs] def set_timeline_canvas(self, timeline_canvas):
self._timeline_canvas = timeline_canvas
self._view.Enable(timeline_canvas is not None)
if timeline_canvas is not None:
self._view.SetPeriodChoices(self._timeline_canvas.GetPeriodChoices())
[docs] def search(self):
new_search = self._view.GetValue()
new_period = self._view.GetPeriod()
if (
(self._last_search is not None and self._last_search == new_search) and
(self._last_period is not None and self._last_period == new_period)):
self.next()
else:
self._last_search = new_search
self._last_period = new_period
self._search_for_events(new_search, new_period)
self._result_index = 0
self.navigate_to_match()
self._set_result_label()
self._view.UpdateButtons()
def _search_for_events(self, new_search, new_period):
if self._timeline_canvas is not None:
self._result = self._timeline_canvas.GetFilteredEvents(new_search, new_period)
else:
self._result = []
def _set_result_label(self):
nbr_of_matches = len(self._result)
if nbr_of_matches == 0:
self._view.UpdateNbrOfMatchesLabel(' ' * 4 + _('No matches found'))
elif nbr_of_matches == 1:
self._view.UpdateNbrOfMatchesLabel(' ' * 4 + _('Only one match found'))
else:
self._view.UpdateNbrOfMatchesLabel(' ' * 4 + '%d ' % nbr_of_matches + _('matches found'))
[docs] def next(self):
if self._on_last_match():
self._result_index = 0
else:
self._result_index += 1
self.navigate_to_match()
self._view.UpdateButtons()
[docs] def prev(self):
if not self._on_first_match():
self._result_index -= 1
self.navigate_to_match()
self._view.UpdateButtons()
[docs] def list(self):
event_list = [event.get_label(self._timeline_canvas.GetTimeType()) for event in self._result]
dlg = EventListDialog(self._view, event_list)
if dlg.ShowModal() == wx.ID_OK:
self._result_index = dlg.GetSelectedIndex()
self.navigate_to_match()
dlg.Destroy()
[docs] def navigate_to_match(self):
if self._timeline_canvas is not None and self._result_index in range(len(self._result)):
event = self._result[self._result_index]
self._timeline_canvas.Navigate(lambda tp: tp.center(event.mean_time()))
self._timeline_canvas.HighligtEvent(event, clear=True)
[docs] def enable_backward(self):
return bool(self._result and self._result_index > 0)
[docs] def enable_forward(self):
return bool(self._result and self._result_index < (len(self._result) - 1))
[docs] def enable_list(self):
return bool(len(self._result) > 0)
def _on_first_match(self):
return self._result and self._result_index == 0
def _on_last_match(self):
return self._result and self._result_index == (len(self._result) - 1)