mirror of
https://github.com/DYefremov/DemonEditor.git
synced 2025-12-22 16:39:42 +01:00
receive_satellites skeleton
This commit is contained in:
@@ -14,7 +14,7 @@ class SatellitesParser(HTMLParser):
|
|||||||
|
|
||||||
_HEADERS = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:45.0) Gecko/20100101 Firefox/59.02"}
|
_HEADERS = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:45.0) Gecko/20100101 Firefox/59.02"}
|
||||||
|
|
||||||
def __init__(self, url, entities=False, separator=' '):
|
def __init__(self, url="https://www.flysat.com/satlist.php", entities=False, separator=' '):
|
||||||
|
|
||||||
HTMLParser.__init__(self)
|
HTMLParser.__init__(self)
|
||||||
|
|
||||||
@@ -59,29 +59,23 @@ class SatellitesParser(HTMLParser):
|
|||||||
def error(self, message):
|
def error(self, message):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@run_task
|
def get_satellites_list(self):
|
||||||
def get_satellites(self, callback):
|
|
||||||
self.reset()
|
self.reset()
|
||||||
request = requests.get(url=self._url, headers=self._HEADERS)
|
request = requests.get(url=self._url, headers=self._HEADERS)
|
||||||
reason = request.reason
|
reason = request.reason
|
||||||
satellites = []
|
|
||||||
if reason == "OK":
|
if reason == "OK":
|
||||||
self.feed(request.text)
|
self.feed(request.text)
|
||||||
if self._rows:
|
if self._rows:
|
||||||
for sat in list(filter(lambda x: all(x) and len(x) == 5, self._rows)):
|
return list(filter(lambda x: all(x) and len(x) == 5, self._rows))
|
||||||
if callback(self.get_satellite(sat)):
|
|
||||||
break
|
|
||||||
else:
|
else:
|
||||||
print(reason)
|
print(reason)
|
||||||
|
|
||||||
return satellites
|
|
||||||
|
|
||||||
def get_satellite(self, sat):
|
def get_satellite(self, sat):
|
||||||
pos = "".join(c for c in sat[2] if c.isdigit() or c.isalpha() or c == ".")
|
pos = "".join(c for c in sat[1] if c.isdigit() or c.isalpha() or c == ".")
|
||||||
return Satellite(name=sat[1] + " ({})".format(pos),
|
return Satellite(name=sat[0] + " ({})".format(pos),
|
||||||
flags="0",
|
flags="0",
|
||||||
position=self.get_position(pos.replace(".", "")),
|
position=self.get_position(pos.replace(".", "")),
|
||||||
transponders=self.get_transponders(sat[0]))
|
transponders=self.get_transponders(sat[3]))
|
||||||
|
|
||||||
def get_position(self, pos):
|
def get_position(self, pos):
|
||||||
return "{}{}".format("-" if pos[-1] == "W" else "", pos[:-1])
|
return "{}{}".format("-" if pos[-1] == "W" else "", pos[:-1])
|
||||||
|
|||||||
@@ -459,6 +459,7 @@
|
|||||||
<property name="label" translatable="yes">Receive from internet</property>
|
<property name="label" translatable="yes">Receive from internet</property>
|
||||||
<property name="use_underline">True</property>
|
<property name="use_underline">True</property>
|
||||||
<property name="stock_id">gtk-refresh</property>
|
<property name="stock_id">gtk-refresh</property>
|
||||||
|
<signal name="clicked" handler="on_update" swapped="no"/>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
@@ -1412,14 +1413,42 @@
|
|||||||
<action-widget response="-5">button2</action-widget>
|
<action-widget response="-5">button2</action-widget>
|
||||||
</action-widgets>
|
</action-widgets>
|
||||||
</object>
|
</object>
|
||||||
<object class="GtkListStore" id="update_sat_list_store"/>
|
<object class="GtkListStore" id="update_sat_list_store">
|
||||||
|
<columns>
|
||||||
|
<!-- column-name satellite -->
|
||||||
|
<column type="gchararray"/>
|
||||||
|
<!-- column-name position -->
|
||||||
|
<column type="gchararray"/>
|
||||||
|
<!-- column-name type -->
|
||||||
|
<column type="gchararray"/>
|
||||||
|
<!-- column-name url -->
|
||||||
|
<column type="gchararray"/>
|
||||||
|
<!-- column-name selected -->
|
||||||
|
<column type="gboolean"/>
|
||||||
|
</columns>
|
||||||
|
</object>
|
||||||
|
<object class="GtkListStore" id="update_source_store">
|
||||||
|
<columns>
|
||||||
|
<!-- column-name source -->
|
||||||
|
<column type="gchararray"/>
|
||||||
|
</columns>
|
||||||
|
<data>
|
||||||
|
<row>
|
||||||
|
<col id="0">FlySat</col>
|
||||||
|
</row>
|
||||||
|
</data>
|
||||||
|
</object>
|
||||||
<object class="GtkDialog" id="satellites_update_dialog">
|
<object class="GtkDialog" id="satellites_update_dialog">
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="title" translatable="yes">Satellites update</property>
|
<property name="title" translatable="yes">Satellites update</property>
|
||||||
|
<property name="modal">True</property>
|
||||||
|
<property name="destroy_with_parent">True</property>
|
||||||
<property name="type_hint">dialog</property>
|
<property name="type_hint">dialog</property>
|
||||||
|
<property name="skip_pager_hint">True</property>
|
||||||
<child internal-child="vbox">
|
<child internal-child="vbox">
|
||||||
<object class="GtkBox" id="sat_update_dialog_vbox">
|
<object class="GtkBox" id="sat_update_dialog_vbox">
|
||||||
<property name="width_request">480</property>
|
<property name="width_request">480</property>
|
||||||
|
<property name="height_request">320</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<property name="spacing">2</property>
|
<property name="spacing">2</property>
|
||||||
@@ -1560,11 +1589,62 @@
|
|||||||
<child>
|
<child>
|
||||||
<object class="GtkTreeViewColumn" id="upd_satellite_column">
|
<object class="GtkTreeViewColumn" id="upd_satellite_column">
|
||||||
<property name="title" translatable="yes">Satellite</property>
|
<property name="title" translatable="yes">Satellite</property>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCellRendererText" id="upd_satellite_cellrenderertext"/>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="text">0</attribute>
|
||||||
|
</attributes>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkTreeViewColumn" id="upd_position_column">
|
<object class="GtkTreeViewColumn" id="upd_position_column">
|
||||||
<property name="title" translatable="yes">Position</property>
|
<property name="title" translatable="yes">Position</property>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCellRendererText" id="upd_position_cellrenderertext"/>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="text">1</attribute>
|
||||||
|
</attributes>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkTreeViewColumn" id="upd_type_column">
|
||||||
|
<property name="title" translatable="yes">Type</property>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCellRendererText" id="upd_type_cellrenderertext"/>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="text">2</attribute>
|
||||||
|
</attributes>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkTreeViewColumn" id="upd_url_column">
|
||||||
|
<property name="visible">False</property>
|
||||||
|
<property name="title" translatable="yes">Url</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCellRendererText" id="upd_url_cellrenderertext"/>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="text">3</attribute>
|
||||||
|
</attributes>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkTreeViewColumn" id="upd_selected_treeviewcolumn">
|
||||||
|
<property name="title" translatable="yes">Selected</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCellRendererToggle" id="upd_selected_cellrenderertoggle">
|
||||||
|
<signal name="toggled" handler="on_selected_toggled" swapped="no"/>
|
||||||
|
</object>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="active">4</attribute>
|
||||||
|
</attributes>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -1593,14 +1673,14 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkToolButton" id="receive_tool_button">
|
<object class="GtkToolButton" id="update_sat_list_tool_button">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="is_important">True</property>
|
<property name="is_important">True</property>
|
||||||
<property name="label" translatable="yes">Recieve</property>
|
<property name="label" translatable="yes">Update</property>
|
||||||
<property name="use_underline">True</property>
|
<property name="use_underline">True</property>
|
||||||
<property name="stock_id">gtk-goto-bottom</property>
|
<property name="stock_id">gtk-refresh</property>
|
||||||
<signal name="clicked" handler="on_receive" swapped="no"/>
|
<signal name="clicked" handler="on_update_satellites_list" swapped="no"/>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">True</property>
|
<property name="expand">True</property>
|
||||||
@@ -1622,6 +1702,21 @@
|
|||||||
<property name="homogeneous">True</property>
|
<property name="homogeneous">True</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkToolButton" id="receive_sat_list_tool_button">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="sensitive">False</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="label" translatable="yes">Receive</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="stock_id">gtk-goto-bottom</property>
|
||||||
|
<signal name="clicked" handler="on_receive_satellites_list" swapped="no"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
<property name="homogeneous">True</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<style>
|
<style>
|
||||||
<class name="primary-toolbar"/>
|
<class name="primary-toolbar"/>
|
||||||
</style>
|
</style>
|
||||||
@@ -1638,6 +1733,7 @@
|
|||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkTextView" id="text_view">
|
<object class="GtkTextView" id="text_view">
|
||||||
|
<property name="height_request">100</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="editable">False</property>
|
<property name="editable">False</property>
|
||||||
@@ -1732,16 +1828,8 @@
|
|||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
<action-widgets>
|
||||||
<object class="GtkListStore" id="update_source_store">
|
<action-widget response="-6">sat_update_close_button</action-widget>
|
||||||
<columns>
|
</action-widgets>
|
||||||
<!-- column-name source -->
|
|
||||||
<column type="gchararray"/>
|
|
||||||
</columns>
|
|
||||||
<data>
|
|
||||||
<row>
|
|
||||||
<col id="0">FlySat</col>
|
|
||||||
</row>
|
|
||||||
</data>
|
|
||||||
</object>
|
</object>
|
||||||
</interface>
|
</interface>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import re
|
import re
|
||||||
from math import fabs
|
from math import fabs
|
||||||
|
|
||||||
from app.commons import run_idle
|
from app.commons import run_idle, run_task
|
||||||
from app.eparser import get_satellites, write_satellites, Satellite, Transponder
|
from app.eparser import get_satellites, write_satellites, Satellite, Transponder
|
||||||
from app.tools.satellites import SatellitesParser
|
from app.tools.satellites import SatellitesParser
|
||||||
from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, TEXT_DOMAIN, MOVE_KEYS
|
from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, TEXT_DOMAIN, MOVE_KEYS
|
||||||
@@ -19,14 +19,11 @@ class SatellitesDialog:
|
|||||||
def __init__(self, transient, options):
|
def __init__(self, transient, options):
|
||||||
self._data_path = options.get("data_dir_path") + "satellites.xml"
|
self._data_path = options.get("data_dir_path") + "satellites.xml"
|
||||||
self._options = options
|
self._options = options
|
||||||
self._download_task = False
|
|
||||||
|
|
||||||
handlers = {"on_open": self.on_open,
|
handlers = {"on_open": self.on_open,
|
||||||
"on_remove": self.on_remove,
|
"on_remove": self.on_remove,
|
||||||
"on_save": self.on_save,
|
"on_save": self.on_save,
|
||||||
"on_update": self.on_update,
|
"on_update": self.on_update,
|
||||||
"on_receive": self.on_receive,
|
|
||||||
"on_cancel_receive": self.on_cancel_receive,
|
|
||||||
"on_up": self.on_up,
|
"on_up": self.on_up,
|
||||||
"on_down": self.on_down,
|
"on_down": self.on_down,
|
||||||
"on_popup_menu": self.on_popup_menu,
|
"on_popup_menu": self.on_popup_menu,
|
||||||
@@ -67,7 +64,6 @@ class SatellitesDialog:
|
|||||||
@run_idle
|
@run_idle
|
||||||
def show(self):
|
def show(self):
|
||||||
self._dialog.run()
|
self._dialog.run()
|
||||||
self.on_cancel_receive()
|
|
||||||
self._dialog.destroy()
|
self._dialog.destroy()
|
||||||
|
|
||||||
def on_resize(self, window):
|
def on_resize(self, window):
|
||||||
@@ -76,7 +72,6 @@ class SatellitesDialog:
|
|||||||
self._options["sat_editor_window_size"] = window.get_size()
|
self._options["sat_editor_window_size"] = window.get_size()
|
||||||
|
|
||||||
def on_quit(self, item):
|
def on_quit(self, item):
|
||||||
self.on_cancel_receive()
|
|
||||||
self._dialog.destroy()
|
self._dialog.destroy()
|
||||||
|
|
||||||
def on_open(self, model):
|
def on_open(self, model):
|
||||||
@@ -285,32 +280,10 @@ class SatellitesDialog:
|
|||||||
model.foreach(self.parse_data, satellites)
|
model.foreach(self.parse_data, satellites)
|
||||||
write_satellites(satellites, self._data_path)
|
write_satellites(satellites, self._data_path)
|
||||||
|
|
||||||
def on_update(self, button: Gtk.ToggleToolButton):
|
def on_update(self, item):
|
||||||
self._download_bar.set_visible(button.get_active())
|
dialog = SatellitesUpdateDialog(self._dialog, self._sat_view.get_model())
|
||||||
|
sats = dialog.run()
|
||||||
@run_idle
|
dialog.destroy()
|
||||||
def on_receive(self, item):
|
|
||||||
if self._download_task:
|
|
||||||
show_dialog(DialogType.ERROR, self._dialog, "The task is already running!")
|
|
||||||
return
|
|
||||||
|
|
||||||
model = self._sat_view.get_model()
|
|
||||||
model.clear()
|
|
||||||
self._download_task = True
|
|
||||||
|
|
||||||
def callback(sat):
|
|
||||||
if self._download_task:
|
|
||||||
self.append_satellite(model, sat)
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
print("Canceled!")
|
|
||||||
return True
|
|
||||||
|
|
||||||
SatellitesParser(url="https://www.flysat.com/satlist.php").get_satellites(callback)
|
|
||||||
|
|
||||||
@run_idle
|
|
||||||
def on_cancel_receive(self, item=None):
|
|
||||||
self._download_task = False
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def parse_data(model, path, itr, sats):
|
def parse_data(model, path, itr, sats):
|
||||||
@@ -334,6 +307,8 @@ class SatellitesDialog:
|
|||||||
menu.popup(None, None, None, None, event.button, event.time)
|
menu.popup(None, None, None, None, event.button, event.time)
|
||||||
|
|
||||||
|
|
||||||
|
# ***************** Transponder dialog *******************#
|
||||||
|
|
||||||
class TransponderDialog:
|
class TransponderDialog:
|
||||||
""" Shows dialog for adding or edit transponder """
|
""" Shows dialog for adding or edit transponder """
|
||||||
|
|
||||||
@@ -344,9 +319,7 @@ class TransponderDialog:
|
|||||||
builder = Gtk.Builder()
|
builder = Gtk.Builder()
|
||||||
builder.set_translation_domain(TEXT_DOMAIN)
|
builder.set_translation_domain(TEXT_DOMAIN)
|
||||||
builder.add_objects_from_file(UI_RESOURCES_PATH + "satellites_dialog.glade",
|
builder.add_objects_from_file(UI_RESOURCES_PATH + "satellites_dialog.glade",
|
||||||
("transponder_dialog",
|
("transponder_dialog", "pol_store", "fec_store", "mod_store", "system_store",
|
||||||
"pol_store", "fec_store",
|
|
||||||
"mod_store", "system_store",
|
|
||||||
"pls_mode_store"))
|
"pls_mode_store"))
|
||||||
builder.connect_signals(handlers)
|
builder.connect_signals(handlers)
|
||||||
|
|
||||||
@@ -421,6 +394,8 @@ class TransponderDialog:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
# ***************** Satellite dialog *******************#
|
||||||
|
|
||||||
class SatelliteDialog:
|
class SatelliteDialog:
|
||||||
""" Shows dialog for adding or edit satellite """
|
""" Shows dialog for adding or edit satellite """
|
||||||
|
|
||||||
@@ -462,5 +437,98 @@ class SatelliteDialog:
|
|||||||
return Satellite(name=name, flags="0", position=pos, transponders=None)
|
return Satellite(name=name, flags="0", position=pos, transponders=None)
|
||||||
|
|
||||||
|
|
||||||
|
# ***************** Satellite update dialog *******************#
|
||||||
|
|
||||||
|
class SatellitesUpdateDialog:
|
||||||
|
def __init__(self, transient, main_model):
|
||||||
|
handlers = {"on_update_satellites_list": self.on_update_satellites_list,
|
||||||
|
"on_receive_satellites_list": self.on_receive_satellites_list,
|
||||||
|
"on_cancel_receive": self.on_cancel_receive,
|
||||||
|
"on_selected_toggled": self.on_selected_toggled,
|
||||||
|
"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"))
|
||||||
|
builder.connect_signals(handlers)
|
||||||
|
|
||||||
|
self._dialog = builder.get_object("satellites_update_dialog")
|
||||||
|
self._dialog.set_transient_for(transient)
|
||||||
|
self._main_model = main_model
|
||||||
|
# self._dialog.get_content_area().set_border_width(0)
|
||||||
|
self._sat_view = builder.get_object("sat_update_tree_view")
|
||||||
|
self._receive_sat_list_tool_button = builder.get_object("receive_sat_list_tool_button")
|
||||||
|
self._download_task = False
|
||||||
|
self._parser = None
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
if self._dialog.run() == Gtk.ResponseType.CANCEL:
|
||||||
|
self._download_task = False
|
||||||
|
return
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
self._dialog.destroy()
|
||||||
|
|
||||||
|
@run_idle
|
||||||
|
def on_update_satellites_list(self, item):
|
||||||
|
if self._download_task:
|
||||||
|
show_dialog(DialogType.ERROR, self._dialog, "The task is already running!")
|
||||||
|
return
|
||||||
|
|
||||||
|
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:
|
||||||
|
for sat in sats:
|
||||||
|
model = self._sat_view.get_model()
|
||||||
|
model.append((sat[1], sat[2], sat[3], sat[0], False))
|
||||||
|
self._download_task = False
|
||||||
|
|
||||||
|
@run_idle
|
||||||
|
def on_receive_satellites_list(self, item):
|
||||||
|
if self._download_task:
|
||||||
|
show_dialog(DialogType.ERROR, self._dialog, "The task is already running!")
|
||||||
|
return
|
||||||
|
self.receive_satellites()
|
||||||
|
|
||||||
|
@run_task
|
||||||
|
def receive_satellites(self):
|
||||||
|
self._download_task = True
|
||||||
|
model = self._sat_view.get_model()
|
||||||
|
sats = []
|
||||||
|
for sat in [r for r in model if r[4]]:
|
||||||
|
if not self._download_task:
|
||||||
|
return
|
||||||
|
print("Process:", sat[0])
|
||||||
|
sats.append(self._parser.get_satellite(sat[:-1]))
|
||||||
|
|
||||||
|
sats = {s[2]: s for s in sats} # key = position, v = satellite
|
||||||
|
for row in self._main_model:
|
||||||
|
pos = row[-1]
|
||||||
|
if pos in sats:
|
||||||
|
sat = sats.pop(pos)
|
||||||
|
print("The remaining satellites:", sats)
|
||||||
|
self._download_task = False
|
||||||
|
|
||||||
|
@run_idle
|
||||||
|
def on_cancel_receive(self, item=None):
|
||||||
|
self._download_task = False
|
||||||
|
|
||||||
|
def on_selected_toggled(self, toggle, path):
|
||||||
|
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)))
|
||||||
|
|
||||||
|
def on_quit(self):
|
||||||
|
self._download_task = False
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
pass
|
pass
|
||||||
|
|||||||
Reference in New Issue
Block a user