Skip to content

Commit

Permalink
Adding LiveParser
Browse files Browse the repository at this point in the history
  • Loading branch information
Shinga13 committed Mar 20, 2024
1 parent 40d83bf commit a716855
Show file tree
Hide file tree
Showing 13 changed files with 577 additions and 207 deletions.
2 changes: 1 addition & 1 deletion OSCRUI/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@

__all__ = [
'app', 'callbacks', 'datafunctions', 'datamodels', 'displayer', 'iofunctions',
'leagueconnector', 'style', 'textedit', 'widgetbuilder', 'widgets']
'leagueconnector', 'style', 'subwindows', 'textedit', 'widgetbuilder', 'widgets']
59 changes: 49 additions & 10 deletions OSCRUI/app.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

import os

from PySide6.QtWidgets import QApplication, QWidget, QLineEdit, QFrame, QListWidget
Expand All @@ -7,7 +6,7 @@
from PySide6.QtCore import QSize, QSettings
from PySide6.QtGui import QIntValidator

from OSCR import HEAL_TREE_HEADER, TABLE_HEADER, TREE_HEADER
from OSCR import HEAL_TREE_HEADER, LIVE_TABLE_HEADER, TABLE_HEADER, TREE_HEADER

from .leagueconnector import OSCRClient
from .iofunctions import get_asset_path, load_icon_series, load_icon, open_link, reset_temp_folder
Expand All @@ -23,16 +22,19 @@

class OSCRUI():

from .callbacks import browse_log, favorite_button_callback, navigate_log, save_combat
from .callbacks import browse_log, browse_sto_logpath, favorite_button_callback
from .callbacks import navigate_log, save_combat, set_sto_logpath_setting
from .callbacks import switch_analysis_tab, switch_main_tab, switch_map_tab, switch_overview_tab
from .datafunctions import analyze_log_callback, copy_analysis_callback, copy_summary_callback
from .datafunctions import init_parser, update_shown_columns_dmg, update_shown_columns_heal
from .datafunctions import activate_live_parser, analyze_log_callback, copy_analysis_callback
from .datafunctions import copy_summary_callback, init_parser, update_shown_columns_dmg
from .datafunctions import update_shown_columns_heal
from .displayer import create_legend_item
from .iofunctions import browse_path
from .style import get_style_class, create_style_sheet, theme_font, get_style
from .subwindows import live_parser_toggle, split_dialog
from .widgetbuilder import create_frame, create_label, create_button_series, create_icon_button
from .widgetbuilder import create_analysis_table, create_button, create_combo_box, style_table
from .widgetbuilder import split_dialog, create_entry
from .widgetbuilder import create_entry
from .leagueconnector import apply_league_table_filter, download_and_view_combat
from .leagueconnector import establish_league_connection, extend_ladder, slot_ladder
from .leagueconnector import upload_callback
Expand Down Expand Up @@ -68,6 +70,8 @@ def __init__(self, theme, args, path, config, versions) -> None:
self.config = config
self.widgets = WidgetStorage()
self.league_api = None
self.live_parser_window = None
self.live_parser = None
self.init_settings()
self.init_config()
reset_temp_folder(self.config['templog_folder_path'])
Expand Down Expand Up @@ -106,7 +110,8 @@ def cache_assets(self):
'ladder': 'ladder.svg',
'star': 'star.svg',
'stocd': 'section31badge.png',
'stobuilds': 'stobuildslogo.png'
'stobuilds': 'stobuildslogo.png',
'close': 'close.svg'
}
self.icons = load_icon_series(icons, self.app_dir)

Expand Down Expand Up @@ -463,6 +468,12 @@ def setup_left_sidebar_log(self):
parser2_button.setEnabled(False)
save_button.setEnabled(False)

live_parser_button = self.create_button(
'Live Parser', 'tab_button', style_override={'margin-top': '@isp'}, toggle=False)
live_parser_button.clicked[bool].connect(self.live_parser_toggle)
left_layout.addWidget(live_parser_button, alignment=AHCENTER)
self.widgets.live_parser_button = live_parser_button

frame.setLayout(left_layout)

def setup_left_sidebar_about(self):
Expand Down Expand Up @@ -938,14 +949,32 @@ def setup_settings_frame(self):
lambda state, i=i: self.settings.setValue(f'heal_columns|{i}', state))
heal_hider_layout.addWidget(bt, stretch=1)
heal_seperator = self.create_frame(
dmg_hider_frame, 'hr', style_override={'background-color': '@lbg'}, size_policy=SMINMIN)
heal_hider_frame, 'hr', style_override={'background-color': '@lbg'},
size_policy=SMINMIN)
heal_seperator.setFixedHeight(self.theme['defaults']['bw'])
heal_hider_layout.addWidget(heal_seperator)
apply_button_2 = self.create_button('Apply', 'button', heal_hider_frame)
apply_button_2.clicked.connect(self.update_shown_columns_heal)
heal_hider_layout.addWidget(apply_button_2, alignment=ARIGHT | ATOP)
heal_hider_frame.setLayout(heal_hider_layout)

col_1_2.addWidget(heal_hider_frame, alignment=ATOP)
live_hider_label = self.create_label(
'Live Parser columns:', 'label_subhead', col_1_frame, {'margin-top': '@isp'})
col_1_2.addWidget(live_hider_label)
live_hider_layout = QVBoxLayout()
live_hider_frame = self.create_frame(
col_1_frame, size_policy=SMINMAX, style_override=hider_frame_style_override)
for i, head in enumerate(LIVE_TABLE_HEADER):
bt = self.create_button(
head, 'toggle_button', live_hider_frame,
toggle=self.settings.value(f'live_columns|{i}', type=bool))
bt.setSizePolicy(SMINMAX)
bt.clicked[bool].connect(
lambda state, i=i: self.settings.setValue(f'live_columns|{i}', state))
live_hider_layout.addWidget(bt, stretch=1)
live_hider_frame.setLayout(live_hider_layout)
col_1_2.addWidget(live_hider_frame, alignment=ATOP)
col_1.addLayout(col_1_2, stretch=1)

col_1_frame.setLayout(col_1)
Expand Down Expand Up @@ -1017,14 +1046,24 @@ def setup_settings_frame(self):
auto_scan_label = self.create_label('Scan log automatically:', 'label_subhead')
col_2.addWidget(auto_scan_label, 6, 0, alignment=ARIGHT)
auto_scan_button = FlipButton('Disabled', 'Enabled', col_2_frame, checkable=True)
auto_scan_button.setStyleSheet(
self.get_style_class('QPushButton', 'toggle_button', override={'margin-top': 0}))
auto_scan_button.setStyleSheet(self.get_style_class(
'QPushButton', 'toggle_button', override={'margin-top': 0, 'margin-left': 0}))
auto_scan_button.setFont(self.theme_font('app', '@font'))
auto_scan_button.set_func_r(lambda: self.settings.setValue('auto_scan', True))
auto_scan_button.set_func_l(lambda: self.settings.setValue('auto_scan', False))
if self.settings.value('auto_scan', type=bool):
auto_scan_button.flip()
col_2.addWidget(auto_scan_button, 6, 1, alignment=ALEFT | AVCENTER)
sto_log_path_button = self.create_button(
'STO Logfile:', style_override={'margin': 0, 'font': '@subhead'})
col_2.addWidget(sto_log_path_button, 7, 0, alignment=ARIGHT | AVCENTER)
sto_log_path_entry = self.create_entry(
self.settings.value('sto_log_path'), style_override={'margin-top': 0})
sto_log_path_entry.setSizePolicy(SMIXMAX)
sto_log_path_entry.editingFinished.connect(
lambda: self.set_sto_logpath_setting(sto_log_path_entry))
col_2.addWidget(sto_log_path_entry, 7, 1, alignment=AVCENTER)
sto_log_path_button.clicked.connect(lambda: self.browse_sto_logpath(sto_log_path_entry))

col_2_frame.setLayout(col_2)

Expand Down
57 changes: 56 additions & 1 deletion OSCRUI/callbacks.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import os

from PySide6.QtWidgets import QLineEdit
from PySide6.QtWidgets import QFileDialog, QLineEdit

from OSCR import split_log_by_combat, split_log_by_lines
from .iofunctions import browse_path
from .textedit import format_path


Expand Down Expand Up @@ -158,3 +160,56 @@ def set_graph_resolution_setting(self, setting_text: str):
self.settings.setValue('graph_resolution', value)
except (ValueError, ZeroDivisionError):
return


def set_sto_logpath_setting(self, entry: QLineEdit):
"""
Formats and stores new logpath to settings.
Parameters:
- :param entry: the entry that holds the path
"""
formatted_path = format_path(entry.text())
self.settings.setValue('sto_log_path', formatted_path)
entry.setText(formatted_path)


def browse_sto_logpath(self, entry: QLineEdit):
"""
Opens prompt to select new logpath and stores it to settings.
Parameters:
- :param entry: the entry that holds the path
"""
current_path = entry.text()
if not current_path:
current_path = self.app_dir
new_path = self.browse_path(os.path.dirname(current_path), 'Logfile (*.log);;Any File (*.*)')
if new_path:
formatted_path = format_path(new_path)
self.settings.setValue('sto_log_path', formatted_path)
entry.setText(formatted_path)


def auto_split_callback(self, path: str):
"""
Callback for auto split button
"""
folder_path = QFileDialog.getExistingDirectory(
self.window, 'Select Folder', os.path.dirname(path))
if folder_path:
split_log_by_lines(
path, folder_path, self.settings.value('split_log_after', type=int),
self.settings.value('combat_distance', type=int))


def combat_split_callback(self, path: str, first_num: str, last_num: str):
"""
Callback for combat split button
"""
target_path = browse_path(self, path, 'Logfile (*.log);;Any File (*.*)', True)
if target_path:
split_log_by_combat(
path, target_path, int(first_num), int(last_num),
self.settings.value('seconds_between_combats', type=int),
self.settings.value('excluded_event_ids', type=list))
18 changes: 15 additions & 3 deletions OSCRUI/datafunctions.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import os
import sys

from OSCR import OSCR, HEAL_TREE_HEADER, TREE_HEADER
from OSCR import OSCR, HEAL_TREE_HEADER, TREE_HEADER, LiveParser
from PySide6.QtCore import Qt, QThread, Signal

from .datamodels import DamageTreeModel, HealTreeModel, TreeSelectionModel
from .displayer import create_overview
from .displayer import create_overview, update_live_display
from .subwindows import log_size_warning, show_warning, split_dialog
from .textedit import format_damage_tree_data, format_heal_tree_data
from .widgetbuilder import log_size_warning, show_warning, split_dialog


class CustomThread(QThread):
Expand Down Expand Up @@ -91,6 +92,17 @@ def analyze_log_callback(self, combat_id=None, path=None, parser_num: int = 1, h
self.widgets.overview_tabber.setCurrentIndex(0)


def activate_live_parser(self):
"""
Activates the live parser
"""
live_parser = LiveParser(
self.settings.value('sto_log_path'), start_callback=lambda: sys.stdout.write('start\n'),
update_callback=lambda data: update_live_display(self, data))
live_thread = CustomThread(self.window, live_parser.start)
live_thread.start()


def copy_summary_callback(self):
"""
Callback to set the combat summary of the active combat to the user's clippboard
Expand Down
26 changes: 26 additions & 0 deletions OSCRUI/datamodels.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,32 @@ def extend_data(self, index: list, rows: list, combatlog_ids: list):
self.endInsertRows()


class LiveParserTableModel(TableModel):
"""
Model for LiveParser Table
"""
def data(self, index, role):
if role == Qt.ItemDataRole.DisplayRole:
return self._data[index.row()][index.column()]

if role == Qt.ItemDataRole.FontRole:
return self._cell_font

if role == Qt.ItemDataRole.TextAlignmentRole:
return AVCENTER + ARIGHT

def replace_data(self, index: list, rows: list):
current_row_count = len(self._index)
self.beginRemoveRows(QModelIndex(), 0, current_row_count - 1)
self._index = []
self._data = []
self.endRemoveRows()
self.beginInsertRows(QModelIndex(), 0, len(index) - 1)
self._index = index
self._data = rows
self.endInsertRows()


class SortingProxy(QSortFilterProxyModel):
def __init__(self):
super().__init__()
Expand Down
13 changes: 13 additions & 0 deletions OSCRUI/displayer.py
Original file line number Diff line number Diff line change
Expand Up @@ -283,3 +283,16 @@ def create_overview_table(self, table_data) -> QTableView:
sort_order = Qt.SortOrder.DescendingOrder
table.sortByColumn(self.settings.value('overview_sort_column', type=int), sort_order)
return table


def update_live_display(self, data: dict):
"""
Updates display of live parser to show the new data.
"""
index = list()
cells = list()
for player, player_data in data.items():
index.append(player)
cells.append(list(player_data.values()))
if len(index) > 0 and len(cells) > 0:
self.widgets.live_parser_table.model().replace_data(index, cells)
2 changes: 1 addition & 1 deletion OSCRUI/leagueconnector.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@

from .datafunctions import analyze_log_callback, CustomThread
from .datamodels import LeagueTableModel, SortingProxy
from .subwindows import show_warning
from .style import theme_font
from .textedit import format_datetime_str
from .widgetbuilder import show_warning

LADDER_HEADER = (
"Name",
Expand Down
Loading

0 comments on commit a716855

Please sign in to comment.