Only resort when the sort field actually changed

kivy_mainline_and_py3.8
Tyler Goodlet 2018-12-18 20:28:26 -05:00
parent d4e36b1e55
commit 11222e1176
1 changed files with 23 additions and 8 deletions

View File

@ -7,7 +7,7 @@ Launch with ``piker monitor <watchlist name>``.
"""
from itertools import chain
from types import ModuleType, AsyncGeneratorType
from typing import List, Callable, Dict
from typing import List, Callable
from bisect import bisect
import trio
@ -21,6 +21,7 @@ from kivy import utils
from kivy.app import async_runTouchApp
from kivy.core.window import Window
from kivy.properties import BooleanProperty
from kivy.uix.behaviors import ButtonBehavior
from ..log import get_logger
from .pager import PagerView
@ -161,8 +162,12 @@ class Cell(Button):
def __init__(self, key=None, is_header=False, **kwargs):
super(Cell, self).__init__(**kwargs)
self.key = key
self.row = None
self.is_header = is_header
# def on_press(self, value=None):
# self.row.on_press()
class HeaderCell(Cell):
"""Column header cell label.
@ -257,7 +262,7 @@ class BidAskLayout(StackLayout):
return [self.last, self.bid, self.ask]
class Row(GridLayout, HoverBehavior):
class Row(ButtonBehavior, HoverBehavior, GridLayout):
"""A grid for displaying a row of ticker quote data.
"""
def __init__(
@ -271,7 +276,7 @@ class Row(GridLayout, HoverBehavior):
cell_type=None,
**kwargs
):
super(Row, self).__init__(cols=len(record), **kwargs)
super().__init__(cols=len(record), **kwargs)
self._cell_widgets = {}
self._last_record = record
self.table = table
@ -383,16 +388,20 @@ class Row(GridLayout, HoverBehavior):
log.debug(
f"Left row {self} through {self.border_point}")
def on_press(self, value=None):
log.info(f"Pressed row for {self._last_record['symbol']}")
class TickerTable(GridLayout):
"""A grid for displaying ticker quote records as a table.
"""
def __init__(self, sort_key='%', **kwargs):
def __init__(self, sort_key='%', auto_sort=True, **kwargs):
super(TickerTable, self).__init__(**kwargs)
self.symbols2rows = {}
self.sort_key = sort_key
# for tracking last clicked column header cell
self.last_clicked_col_cell = None
self._auto_sort = auto_sort
self._symbols2index = {}
self._sorted = []
@ -558,15 +567,21 @@ async def update_quotes(
async for quotes in agen: # new quotes data only
to_sort = set()
for symbol, quote in quotes.items():
row = table.get_row(symbol)
record, displayable = formatter(
quote, symbol_data=symbol_data)
row = table.get_row(symbol)
# determine if sorting should happen
sort_key = table.sort_key
new = record[sort_key]
last = row.get_field(sort_key)
if new != last:
to_sort.add(row.widget)
# update and color
cells = row.update(record, displayable)
color_row(row, record, cells)
if table.sort_key in record:
to_sort.add(row.widget)
if to_sort:
table.render_rows(to_sort)