added simple filter for satellites update dialog

This commit is contained in:
DYefremov
2018-05-07 15:19:05 +03:00
parent 639c8511bf
commit c4e8a6646d
3 changed files with 68 additions and 17 deletions

View File

@@ -2,10 +2,8 @@
for replace or update current satellites.xml file.
"""
import requests
from html.parser import HTMLParser
from app.commons import run_task
from app.eparser import Satellite, Transponder
@@ -66,18 +64,21 @@ class SatellitesParser(HTMLParser):
if reason == "OK":
self.feed(request.text)
if self._rows:
return list(filter(lambda x: all(x) and len(x) == 5, self._rows))
def get_sat(r):
return r[1], "".join(c for c in r[2] if c.isdigit() or c.isalpha() or c == "."), r[3], r[0], False
return list(map(get_sat, filter(lambda x: all(x) and len(x) == 5, self._rows)))
else:
print(reason)
def get_satellite(self, sat):
pos = "".join(c for c in sat[1] if c.isdigit() or c.isalpha() or c == ".")
pos = sat[1]
return Satellite(name=sat[0] + " ({})".format(pos),
flags="0",
position=self.get_position(pos.replace(".", "")),
transponders=self.get_transponders(sat[3]))
def get_position(self, pos):
@staticmethod
def get_position(pos):
return "{}{}".format("-" if pos[-1] == "W" else "", pos[:-1])
def get_transponders(self, sat_url):

View File

@@ -1432,6 +1432,12 @@
<column type="gboolean"/>
</columns>
</object>
<object class="GtkTreeModelFilter" id="update_sat_list_model_filter">
<property name="child_model">update_sat_list_store</property>
</object>
<object class="GtkTreeModelSort" id="update_sat_list_model_sort">
<property name="model">update_sat_list_model_filter</property>
</object>
<object class="GtkListStore" id="update_source_store">
<columns>
<!-- column-name source -->
@@ -1681,7 +1687,7 @@
</packing>
</child>
<child>
<object class="GtkSpinButton" id="from_pos_spin_button">
<object class="GtkSpinButton" id="from_pos_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="input_purpose">number</property>
@@ -1699,6 +1705,7 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="model">side_store</property>
<property name="active">0</property>
<child>
<object class="GtkCellRendererText" id="from_filter_cellrenderertext"/>
<attributes>
@@ -1723,7 +1730,7 @@
</packing>
</child>
<child>
<object class="GtkSpinButton" id="to_pos_spin_button">
<object class="GtkSpinButton" id="to_pos_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="input_purpose">number</property>
@@ -1741,6 +1748,7 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="model">side_store</property>
<property name="active">0</property>
<child>
<object class="GtkCellRendererText" id="filter_to_cellrenderertext"/>
<attributes>
@@ -1760,6 +1768,7 @@
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_filter" swapped="no"/>
</object>
<packing>
<property name="left_attach">6</property>
@@ -1801,7 +1810,7 @@
</child>
<child>
<object class="GtkScrolledWindow" id="sat_update_scrolled_window">
<property name="height_request">200</property>
<property name="height_request">-1</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="shadow_type">in</property>
@@ -1809,7 +1818,7 @@
<object class="GtkTreeView" id="sat_update_tree_view">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="model">update_sat_list_store</property>
<property name="model">update_sat_list_model_sort</property>
<child internal-child="selection">
<object class="GtkTreeSelection" id="treeview-selection2"/>
</child>
@@ -1817,6 +1826,8 @@
<object class="GtkTreeViewColumn" id="upd_satellite_column">
<property name="title" translatable="yes">Satellite</property>
<property name="expand">True</property>
<property name="reorderable">True</property>
<property name="sort_column_id">0</property>
<child>
<object class="GtkCellRendererText" id="upd_satellite_cellrenderertext"/>
<attributes>
@@ -1829,6 +1840,8 @@
<object class="GtkTreeViewColumn" id="upd_position_column">
<property name="title" translatable="yes">Position</property>
<property name="expand">True</property>
<property name="reorderable">True</property>
<property name="sort_column_id">1</property>
<child>
<object class="GtkCellRendererText" id="upd_position_cellrenderertext"/>
<attributes>
@@ -1841,6 +1854,8 @@
<object class="GtkTreeViewColumn" id="upd_type_column">
<property name="title" translatable="yes">Type</property>
<property name="expand">True</property>
<property name="reorderable">True</property>
<property name="sort_column_id">2</property>
<child>
<object class="GtkCellRendererText" id="upd_type_cellrenderertext"/>
<attributes>
@@ -1864,6 +1879,8 @@
<child>
<object class="GtkTreeViewColumn" id="upd_selected_treeviewcolumn">
<property name="title" translatable="yes">Selected</property>
<property name="reorderable">True</property>
<property name="sort_column_id">4</property>
<child>
<object class="GtkCellRendererToggle" id="upd_selected_cellrenderertoggle">
<signal name="toggled" handler="on_selected_toggled" swapped="no"/>

View File

@@ -8,7 +8,7 @@ from app.eparser import get_satellites, write_satellites, Satellite, Transponder
from app.tools.satellites import SatellitesParser
from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, TEXT_DOMAIN, MOVE_KEYS
from .dialogs import show_dialog, DialogType, WaitDialog
from .main_helper import move_items, scroll_to, append_text_to_tview
from .main_helper import move_items, scroll_to, append_text_to_tview, get_base_model
def show_satellites_dialog(transient, options):
@@ -446,13 +446,15 @@ class SatellitesUpdateDialog:
"on_info_bar_close": self.on_info_bar_close,
"on_filter_toggled": self.on_filter_toggled,
"on_find_toggled": self.on_find_toggled,
"on_filter": self.on_filter,
"on_quit": self.on_quit}
builder = Gtk.Builder()
builder.set_translation_domain(TEXT_DOMAIN)
builder.add_objects_from_file(UI_RESOURCES_PATH + "satellites_dialog.glade",
("satellites_update_dialog", "update_source_store", "update_sat_list_store",
"side_store", "pos_adjustment", "pos_adjustment2"))
"update_sat_list_model_filter", "update_sat_list_model_sort", "side_store",
"pos_adjustment", "pos_adjustment2"))
builder.connect_signals(handlers)
self._dialog = builder.get_object("satellites_update_dialog")
@@ -462,11 +464,18 @@ class SatellitesUpdateDialog:
self._sat_view = builder.get_object("sat_update_tree_view")
self._sat_update_expander = builder.get_object("sat_update_expander")
self._text_view = builder.get_object("text_view")
self._receive_sat_list_tool_button = builder.get_object("receive_sat_list_tool_button")
self._receive_button = builder.get_object("receive_sat_list_tool_button")
self._sat_update_info_bar = builder.get_object("sat_update_info_bar")
self._info_bar_message_label = builder.get_object("info_bar_message_label")
self._search_info_bar = builder.get_object("sat_update_search_info_bar")
self._filter_info_bar = builder.get_object("sat_update_filter_info_bar")
self._from_pos_button = builder.get_object("from_pos_button")
self._to_pos_button = builder.get_object("to_pos_button")
self._filter_from_combo_box = builder.get_object("filter_from_combo_box")
self._filter_to_combo_box = builder.get_object("filter_to_combo_box")
self._filter_model = builder.get_object("update_sat_list_model_filter")
self._filter_model.set_visible_func(self.filter_function)
self._filter_positions = (0, 0)
self._download_task = False
self._parser = None
@@ -484,16 +493,16 @@ class SatellitesUpdateDialog:
show_dialog(DialogType.ERROR, self._dialog, "The task is already running!")
return
model = self._sat_view.get_model()
model = get_base_model(self._sat_view.get_model())
model.clear()
self._download_task = True
if not self._parser:
self._parser = SatellitesParser(url="https://www.flysat.com/satlist.php")
sats = self._parser.get_satellites_list()
if sats:
model = get_base_model(self._sat_view.get_model())
for sat in sats:
model = self._sat_view.get_model()
model.append((sat[1], sat[2], sat[3], sat[0], False))
model.append(sat)
self._download_task = False
@run_task
@@ -558,13 +567,13 @@ class SatellitesUpdateDialog:
self._download_task = False
def on_selected_toggled(self, toggle, path):
model = self._sat_view.get_model()
model = get_base_model(self._sat_view.get_model())
model.set_value(model.get_iter(path), 4, not toggle.get_active())
self.update_receive_button_state(model)
@run_idle
def update_receive_button_state(self, model):
self._receive_sat_list_tool_button.set_sensitive((any(r[4] for r in model)))
self._receive_button.set_sensitive((any(r[4] for r in model)))
@run_idle
def show_info_message(self, text, message_type):
@@ -581,6 +590,30 @@ class SatellitesUpdateDialog:
def on_filter_toggled(self, button: Gtk.ToggleToolButton):
self._filter_info_bar.set_visible(button.get_active())
@run_idle
def on_filter(self, item):
self._filter_positions = self.get_positions()
self._filter_model.refilter()
print("Satellites count: ", len(self._sat_view.get_model()))
def filter_function(self, model, iter, data):
if self._filter_model is None or self._filter_model == "None":
return True
from_pos, to_pos = self._filter_positions
if from_pos == 0 and to_pos == 0:
return True
if from_pos > to_pos:
from_pos, to_pos = to_pos, from_pos
return from_pos <= float(self._parser.get_position(model.get(iter, 1)[0])) <= to_pos
def get_positions(self):
from_pos = round(self._from_pos_button.get_value(), 1) * (-1 if self._filter_from_combo_box.get_active() else 1)
to_pos = round(self._to_pos_button.get_value(), 1) * (-1 if self._filter_to_combo_box.get_active() else 1)
return from_pos, to_pos
def on_quit(self):
self._download_task = False