def add_mod_xml(self, parents: list, mod: str) -> None: log_method_name() if mod == DEFAULT_MOD_TEXT: return # Add entry to currently used dictionary parent_dict = ModsContainer.mods for p in parents: if p not in parent_dict: parent_dict[p] = {} parent_dict = parent_dict[p] parent_dict[ModsContainer.get_mod_key(mod)] = ModsContainer.get_mod_value(mod) # Save entry in mod filter file parent_xml = self.xml_root for parent in parents: node = parent_xml.find(parent) if node is not None: parent_xml = node if parent_xml != self.xml_root: element = ElementTree.Element("mod") element.text = mod parent_xml.append(element) xml_indent(self.xml_root) tree = ElementTree.ElementTree(self.xml_root) tree.write(self.xml_path)
def save_cfg(self) -> None: log_method_name() tree = ElementTree.parse(CONFIG_PATH) root = tree.getroot() root.find("account_name").text = self.edit_account_name.text() root.find("stash_name").text = self.edit_stash.text() root.find("league_base_name").text = self.edit_base_league_name.text() root.find("league").text = self.combo_league.currentText() root.find("session_id").text = self.edit_session.text() stash_type = "Normal" if self.radio_stash_normal.isChecked() else "Quad" root.find("stash_type").text = stash_type root.find("main_widget_y").text = str(self.main_widget_y) if hasattr(self, "slider"): root.find("slider_value").text = str(self.slider.value) if self.painter_geometry: root.find("painter_x").text = str(self.painter_geometry.x()) root.find("painter_y").text = str(self.painter_geometry.y()) root.find("painter_w").text = str(self.painter_geometry.width()) root.find("painter_h").text = str(self.painter_geometry.height()) tree.write(CONFIG_PATH) # Painter already notifies us about size/position changes through signal, # I don't know how to do bidirectional signaling so I'm setting values by reference self.painter_widget.stash_type = stash_type if hasattr(self, "slider"): self.painter_widget.number_of_mods_to_draw = self.slider.value self.configuration_changed.emit(self.get_settings_for_requester()) # Notify Requester
def load_mods(self, xml_path: str) -> None: log_method_name() self.xml_root = ElementTree.parse(xml_path).getroot() root = self.model.invisibleRootItem() category1 = list(self.xml_root) # weapon, accessory, armour... for cat1 in category1: cat1_item = QStandardItem(cat1.tag) cat1_item.setEditable(False) root.appendRow(cat1_item) category2 = list(cat1) # bow, claw, helmet, ring... for cat2 in category2: if cat2.tag == "mod": continue cat2_item = QStandardItem(cat2.tag) cat2_item.setEditable(False) cat1_item.appendRow(cat2_item) mods2 = list(cat2) if mods2: for mod in mods2: cat2_item.appendRow(QStandardItem(mod.text)) cat2_item.appendRow(QStandardItem(DEFAULT_MOD_TEXT)) # Mods of category1 are added after subcategories because adding new mod or modifying existing one # makes it to go to the end of elements list mods1 = cat1.findall("mod") if mods1: for mod in mods1: cat1_item.appendRow(QStandardItem(mod.text)) cat1_item.appendRow(QStandardItem(DEFAULT_MOD_TEXT))
def process_item_changed(self, item1: QStandardItem) -> None: log_method_name() parent = item1.parent() parents = [] while parent: parents.append(parent.text()) parent = parent.parent() if item1.text() == "": # Deleting mod if FiltersWidget.mod_text_before_change == DEFAULT_MOD_TEXT: # Minor bug (not affecting XML file): If someone adds some characters after default mod text and then # removes them, there will be additional entry in mod list with default mod text, resets after program # reboot. item1.setText(DEFAULT_MOD_TEXT) else: self.delete_mod_xml(parents[::-1], FiltersWidget.mod_text_before_change) self.model.removeRow(item1.index().row(), item1.index().parent()) elif any(c.isdigit() for c in item1.text()): if (FiltersWidget.mod_text_before_change == DEFAULT_MOD_TEXT # Adding mod or not any(c.isdigit() for c in FiltersWidget.mod_text_before_change)): self.add_mod_xml(parents[::-1], item1.text()) item1.parent().appendRow(QStandardItem(DEFAULT_MOD_TEXT)) else: # Modifying mod self.delete_mod_xml(parents[::-1], FiltersWidget.mod_text_before_change) self.add_mod_xml(parents[::-1], item1.text())
def __init__(self): super(FiltersWidget, self).__init__(None, Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint) log_method_name() load_styles(self) # Setup layout self.treeView = QTreeView() layout = QVBoxLayout() layout.addWidget(self.treeView) btn_hide = QPushButton("Close") btn_hide.clicked.connect(self.hide) layout.addWidget(btn_hide) self.setLayout(layout) self.setMinimumSize(WINDOW_WIDTH, WINDOW_HEIGHT) self.model = QStandardItemModel() self.treeView.setModel(self.model) self.treeView.setSelectionMode(QAbstractItemView.SingleSelection) self.treeView.setHeaderHidden(True) # Set delegate to grab mod value before it is changed, need it to modify xml and dictionary values self.treeView.setItemDelegate(ItemDelegate()) self.model.itemChanged.connect(self.process_item_changed) self.xml_path = DEFAULT_FILTER_PATH self.xml_root = None self.load_mods(self.xml_path)
def __init__(self, painter_widget: PainterWidget): self.painter_geometry = None super(SettingsWidget, self).__init__() log_method_name() self.painter_widget = painter_widget self.painter_widget.colors = slider_colors self.mode = "chaos_recipe" # default mode self.allow_identified = False self.fill_greedy = True self.show_amulets = True self.show_rings = True self.show_belts = True self.auto_reload_filter = False self.poe_log_path = "" self.poe_filter_path = "" self.poe_filter_name = "" self.maximum_chaos_sets = 16 self._create_slider( ) # Need to create if before loading configuration file to set tiles colors self._load_cfg() self._setup_ui() self.painter_widget.geometry_changed.connect( self.painter_geometry_changed)
def __init__(self, painter_widget: PainterWidget): self.painter_geometry = None super(SettingsWidget, self).__init__() log_method_name() self.painter_widget = painter_widget self.painter_widget.colors = slider_colors self._create_slider() # Need to create if before loading configuration file to set tiles colors self._load_cfg() self._setup_ui() self.main_widget_y = 0 self.painter_widget.geometry_changed.connect(self.painter_geometry_changed)
def show_hide_buttons(self) -> None: log_method_name() self.stash_name.hide() for button in self.buttons: if button != self.drag_button: if button.isVisible(): button.hide() else: button.show() if self.stash_switch_button_left.isVisible(): self.stash_switch_button_left.hide() self.stash_switch_button_right.hide() else: self.stash_switch_button_left.show() self.stash_switch_button_right.show()
def _load_cfg(self) -> None: log_method_name() if not os.path.isfile(CONFIG_PATH): prepare_cfg(CONFIG_PATH) tree = ElementTree.parse(CONFIG_PATH) root = tree.getroot() self.account_name = self._cfg_load_or_default(root, "account_name") stashes_nodes = self._cfg_load_stashes(root) self.stashes = [] for stash in stashes_nodes: self.stashes.append(stash) if self.stashes: self.active_stash = [ self.stashes[0]["name"], 0, self.stashes[0]["type"] ] # mod_file should probably be validated upon loading (for existence) self.mod_file = self._cfg_load_or_default(root, "mod_file", DEFAULT_FILTER_PATH) self.league = self._cfg_load_or_default(root, "league") self.league_base_name = self._cfg_load_or_default( root, "league_base_name", default_league_name) self.session_id = self._cfg_load_or_default(root, "session_id") self.stash_type = self._cfg_load_or_default(root, "stash_type", "quad") self.painter_widget.stash_type = self.stash_type self.mode = self._cfg_load_or_default(root, "mode", "chaos_recipe") self.allow_identified = self._cfg_load_or_default( root, "allow_identified", "False") == "True" self.fill_greedy = self._cfg_load_or_default(root, "fill_greedy", "True") == "True" self.show_amulets = self._cfg_load_or_default(root, "show_amulets", "True") == "True" self.show_rings = self._cfg_load_or_default(root, "show_rings", "True") == "True" self.show_belts = self._cfg_load_or_default(root, "show_belts", "True") == "True" self.auto_reload_filter = self._cfg_load_or_default( root, "auto_reload", "True") == "True" self.poe_log_path = self._cfg_load_or_default( root, "log_path", "Set PoE log file location") self.poe_filter_path = self._cfg_load_or_default( root, "filter_path", "Set PoE filter file location") self.poe_filter_name = self._cfg_load_or_default( root, "filter_name", "") self.maximum_chaos_sets = int( self._cfg_load_or_default(root, "max_chaos_sets", "16")) self._set_values_from_cfg()
def _load_cfg(self) -> None: log_method_name() if not os.path.isfile(CONFIG_PATH): prepare_cfg(CONFIG_PATH) tree = ElementTree.parse(CONFIG_PATH) root = tree.getroot() self.account_name = root.find("account_name").text self.stash_name = root.find("stash_name").text self.league = root.find("league").text self.league_base_name = root.find("league_base_name").text self.session_id = root.find("session_id").text if root.find("stash_type").text == "Normal": self.stash_type = "Normal" else: self.stash_type = "Quad" self._set_values_from_cfg()
def __init__(self, settings_widget: SettingsWidget): super(FiltersWidget, self).__init__(None, Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint) log_method_name() load_styles(self) self.xml_root = None # Setup layout self.treeView = QTreeView() layout = QVBoxLayout() layout.addWidget(self.treeView) btn_hide = QPushButton("Close") btn_hide.clicked.connect(self.hide) layout.addWidget(btn_hide) self.setLayout(layout) self.setMinimumSize(WINDOW_WIDTH, WINDOW_HEIGHT) self._init_tree() # this isn't requester, but same data works self._reload_settings(settings_widget.get_settings_for_requester()) settings_widget.configuration_changed.connect(self._reload_settings)
def show_hide_widget(self, widget: QWidget, force_show=False) -> None: log_method_name() icon = QIcon() if widget.isVisible() and not force_show: if isinstance(widget, PainterWidget): if widget.config_change_mode: widget.hide_modification_mode() return else: icon.addPixmap(QPixmap(self.image_path + 'draw1.png')) self.painter_button.setIcon(icon) widget.hide() else: if isinstance(widget, PainterWidget): if (self.requester.mode == "rare_scanner" and not widget.items) or \ (self.requester.mode == "chaos_recipe" and not widget.chaos_sets): return else: icon.addPixmap(QPixmap(self.image_path + 'draw2.png')) self.painter_button.setIcon(icon) widget.show()
def delete_mod_xml(self, parents: list, mod: str) -> None: log_method_name() parent_xml = self.xml_root # Remove entry from currently used dictionary parent_dict = ModsContainer.mods for p in parents: parent_dict = parent_dict[p] del parent_dict[ModsContainer.get_mod_key(mod)] for parent in parents: node = parent_xml.find(parent) if node: parent_xml = node if parent_xml != self.xml_root: elements = parent_xml.findall("mod") for element in elements: if element.text == mod: parent_xml.remove(element) xml_indent(self.xml_root) tree = ElementTree.ElementTree(self.xml_root) tree.write(self.xml_path)
def show_hide_config(self) -> None: log_method_name() if self.config_change_mode: self.hide_modification_mode() else: self.show_modification_mode()
def save_cfg(self) -> None: log_method_name() tree = ElementTree.parse(CONFIG_PATH) root = tree.getroot() self._cfg_set_or_create(root, "account_name", self.edit_account_name.text()) self._cfg_save_stashes(root) self._cfg_set_or_create(root, "mod_file", FILTER_DIR + self.combo_mod_file.currentText()) self._cfg_set_or_create(root, "league_base_name", self.edit_base_league_name.text()) self._cfg_set_or_create(root, "league", self.combo_league.currentText()) self._cfg_set_or_create(root, "session_id", self.edit_session.text()) self._cfg_set_or_create(root, "main_widget_y", str(self.main_widget_y)) if hasattr(self, "slider"): self._cfg_set_or_create(root, "slider_value", str(self.slider.value)) if self.painter_geometry: self._cfg_set_or_create(root, "painter_x", str(self.painter_geometry.x())) self._cfg_set_or_create(root, "painter_y", str(self.painter_geometry.y())) self._cfg_set_or_create(root, "painter_w", str(self.painter_geometry.width())) self._cfg_set_or_create(root, "painter_h", str(self.painter_geometry.height())) self._cfg_set_or_create(root, "mode", self.mode) self._cfg_set_or_create(root, "allow_identified", str(self.allow_identified)) self._cfg_set_or_create(root, "fill_greedy", str(self.fill_greedy)) self._cfg_set_or_create(root, "show_amulets", str(self.show_amulets)) self._cfg_set_or_create(root, "show_rings", str(self.show_rings)) self._cfg_set_or_create(root, "show_belts", str(self.show_belts)) self._cfg_set_or_create(root, "auto_reload", str(self.auto_reload_filter)) self._cfg_set_or_create(root, "log_path", self.poe_log_path) self._cfg_set_or_create(root, "filter_path", self.poe_filter_path) if self.poe_filter_name: self.poe_filter_name = self.poe_filter_name.rstrip() self._cfg_set_or_create(root, "filter_name", self.poe_filter_name) self._cfg_set_or_create(root, "max_chaos_sets", self.maximum_chaos_sets_text.text()) self.maximum_chaos_sets = int(self.maximum_chaos_sets_text.text()) xml_indent(root) tree.write(CONFIG_PATH) # Painter already notifies us about size/position changes through signal, # I don't know how to do bidirectional signaling so I'm setting values by reference self.painter_widget.stash_type = self.stashes[0][ "type"] if self.stashes else "normal" if hasattr(self, "slider"): self.painter_widget.number_of_mods_to_draw = self.slider.value self.painter_widget.update() if self.stashes and not self.active_stash[0]: self.active_stash = [ self.stashes[0]["name"], 0, self.stashes[0]["type"] ] self.configuration_changed.emit( self.get_settings_for_requester()) # Notify Requester
def _setup_ui(self) -> None: log_method_name() self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint) load_styles(self) layout_main = QVBoxLayout() button_stashes = QPushButton("Add/remove stashes") layout_main.addWidget(button_stashes) self._prepare_stashes_window() button_stashes.clicked.connect(self.window_stashes.show) label_mod_config = QLabel("Mod Filter") layout_main.addWidget(label_mod_config) self.combo_mod_file = QComboBox() self._update_mod_file_combo() self.combo_mod_file.activated.connect(self.save_cfg) self.combo_mod_file.installEventFilter(self) layout_main.addWidget(self.combo_mod_file) label_base_league_name = QLabel("League base name") layout_main.addWidget(label_base_league_name) self.edit_base_league_name = QLineEdit(self.league_base_name) self.edit_base_league_name.textChanged.connect( self._update_leagues_combo) self.edit_base_league_name.textChanged.connect(self.save_cfg) layout_main.addWidget(self.edit_base_league_name) label_league = QLabel("League") layout_main.addWidget(label_league) self.combo_league = QComboBox() self._update_leagues_combo() self.combo_league.currentTextChanged.connect(self.save_cfg) layout_main.addWidget(self.combo_league) self.button_show_account_session = QPushButton( "Show/hide account name and session") layout_main.addWidget(self.button_show_account_session) self.label_account_name = QLabel("Account name") layout_main.addWidget(self.label_account_name) self.edit_account_name = QLineEdit(self.account_name) self.edit_account_name.textChanged.connect(self.save_cfg) layout_main.addWidget(self.edit_account_name) self.label_session = QLabel("Session ID") layout_main.addWidget(self.label_session) self.edit_session = QLineEdit(self.session_id) self.edit_session.textChanged.connect(self.save_cfg) layout_main.addWidget(self.edit_session) # Hide account name and session ID if any of them was provided before if self.account_name or self.session_id: self.hide_account_session(True) self.button_show_account_session.clicked.connect( self.hide_account_session) btn_adjust_net = QPushButton("Adjust net position and size") btn_adjust_net.clicked.connect(self.painter_widget.show_hide_config) layout_main.addWidget(btn_adjust_net) label_session = QLabel("Minimum number of item mods to draw a frame") layout_main.addWidget(label_session) layout_slider = QHBoxLayout() self.slider.set_range(1, 5) self.slider.set_value(self.slider_value) load_styles(self.slider) layout_slider.addWidget(self.slider) layout_main.addLayout(layout_slider) self.slider.on_value_changed_call(self.save_cfg) self.radio_allow_identified = QRadioButton() self.radio_allow_identified.setAutoExclusive(False) self.radio_allow_identified.setChecked(self.allow_identified) self.radio_allow_identified.clicked.connect( self.switch_allow_identified) layout_radio = QHBoxLayout() layout_radio.setAlignment(Qt.AlignLeft) layout_radio.addWidget(self.radio_allow_identified) layout_radio.addWidget( QLabel("Allow identified items in chaos recipe")) layout_main.addLayout(layout_radio) self.radio_fill_greedy = QRadioButton() self.radio_fill_greedy.setAutoExclusive(False) self.radio_fill_greedy.setChecked(self.fill_greedy) self.radio_fill_greedy.clicked.connect(self.switch_fill_greedy) layout_radio = QHBoxLayout() layout_radio.setAlignment(Qt.AlignLeft) layout_radio.addWidget(self.radio_fill_greedy) layout_radio.addWidget( QLabel("Fill chaos recipe with more than one ilvl < 75 item")) layout_main.addLayout(layout_radio) self.radio_show_amulets = QRadioButton() self.radio_show_amulets.setAutoExclusive(False) self.radio_show_amulets.setChecked(self.show_amulets) self.radio_show_amulets.clicked.connect(self.switch_show_amulets) layout_radio = QHBoxLayout() layout_radio.setAlignment(Qt.AlignLeft) layout_radio.addWidget(self.radio_show_amulets) layout_radio.addWidget(QLabel("Always show amulets")) layout_main.addLayout(layout_radio) self.radio_show_rings = QRadioButton() self.radio_show_rings.setAutoExclusive(False) self.radio_show_rings.setChecked(self.show_rings) self.radio_show_rings.clicked.connect(self.switch_show_rings) layout_radio = QHBoxLayout() layout_radio.setAlignment(Qt.AlignLeft) layout_radio.addWidget(self.radio_show_rings) layout_radio.addWidget(QLabel("Always show rings")) layout_main.addLayout(layout_radio) self.radio_show_belts = QRadioButton() self.radio_show_belts.setAutoExclusive(False) self.radio_show_belts.setChecked(self.show_belts) self.radio_show_belts.clicked.connect(self.switch_show_belts) layout_radio = QHBoxLayout() layout_radio.setAlignment(Qt.AlignLeft) layout_radio.addWidget(self.radio_show_belts) layout_radio.addWidget(QLabel("Always show belts")) layout_main.addLayout(layout_radio) self.radio_auto_reload = QRadioButton() self.radio_auto_reload.setAutoExclusive(False) self.radio_auto_reload.setChecked(self.auto_reload_filter) self.radio_auto_reload.clicked.connect(self.switch_auto_reload) layout_radio = QHBoxLayout() layout_radio.setAlignment(Qt.AlignLeft) layout_radio.addWidget(self.radio_auto_reload) layout_radio.addWidget( QLabel("Reload filter automatically after entering a map")) layout_main.addLayout(layout_radio) layout_main.addWidget(QLabel("PoE log file location")) self.poe_log_path_button = QPushButton() self.poe_log_path_button.clicked.connect(self.select_poe_log_file) if self.poe_log_path: self.poe_log_path_button.setText( self.path_for_button(self.poe_log_path)) else: self.poe_log_path_button.setText("Set PoE log file location") self.poe_log_path_button.setToolTip("PoE log file location") layout_main.addWidget(self.poe_log_path_button) layout_main.addWidget(QLabel("PoE filter file location")) self.poe_filter_path_button = QPushButton() self.poe_filter_path_button.clicked.connect( self.select_poe_filter_file) if self.poe_filter_path: self.poe_filter_path_button.setText( self.path_for_button(self.poe_filter_path)) else: self.poe_filter_path_button.setText("Set PoE filter file location") self.poe_filter_path_button.setToolTip("PoE filter file location") layout_main.addWidget(self.poe_filter_path_button) layout_main.addWidget( QLabel("Max number of chaos recipe sets in stash")) self.maximum_chaos_sets_text = QLineEdit(str(self.maximum_chaos_sets)) self.maximum_chaos_sets_text.textChanged.connect(self.save_cfg) layout_main.addWidget(self.maximum_chaos_sets_text) self.btn_hide = QPushButton("Close") self.btn_hide.clicked.connect(self.close) layout_main.addWidget(self.btn_hide) self.setLayout(layout_main)
def _setup_ui(self) -> None: log_method_name() self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint) load_styles(self) layout_main = QVBoxLayout() label_id = QLabel("Account name") layout_main.addWidget(label_id) self.edit_account_name = QLineEdit(self.account_name) self.edit_account_name.textChanged.connect(self.save_cfg) layout_main.addWidget(self.edit_account_name) label_stash = QLabel("Stash name") layout_main.addWidget(label_stash) self.edit_stash = QLineEdit(self.stash_name) self.edit_stash.textChanged.connect(self.save_cfg) layout_main.addWidget(self.edit_stash) label_base_league_name = QLabel("League base name") layout_main.addWidget(label_base_league_name) self.edit_base_league_name = QLineEdit(self.league_base_name) self.edit_base_league_name.textChanged.connect(self._update_leagues_combo) self.edit_base_league_name.textChanged.connect(self.save_cfg) layout_main.addWidget(self.edit_base_league_name) label_league = QLabel("League") layout_main.addWidget(label_league) self.combo_league = QComboBox() self._update_leagues_combo() self.combo_league.currentTextChanged.connect(self.save_cfg) layout_main.addWidget(self.combo_league) label_session = QLabel("Session ID") layout_main.addWidget(label_session) self.edit_session = QLineEdit(self.session_id) self.edit_session.textChanged.connect(self.save_cfg) layout_main.addWidget(self.edit_session) label_session = QLabel("Stash type") layout_main.addWidget(label_session) layout_radio = QHBoxLayout() self.radio_stash_normal = QRadioButton("Normal") self.radio_stash_normal.toggled.connect(self.save_cfg) radio_stash_quad = QRadioButton("Quad") radio_stash_quad.toggled.connect(self.save_cfg) if self.stash_type == "Normal": self.radio_stash_normal.setChecked(True) else: radio_stash_quad.setChecked(True) layout_radio.addWidget(self.radio_stash_normal) layout_radio.addWidget(radio_stash_quad) layout_main.addLayout(layout_radio) btn_adjust_net = QPushButton("Adjust net position and size") btn_adjust_net.clicked.connect(self.painter_widget.show_hide_config) layout_main.addWidget(btn_adjust_net) label_session = QLabel("Item tiers to detect") layout_main.addWidget(label_session) layout_slider = QHBoxLayout() self.slider.set_range(1, 5) self.slider.set_value(self.slider_value) load_styles(self.slider) layout_slider.addWidget(self.slider) layout_main.addLayout(layout_slider) self.slider.on_value_changed_call(self.save_cfg) self.btn_hide = QPushButton("Close") self.btn_hide.clicked.connect(self.close) layout_main.addWidget(self.btn_hide) self.setLayout(layout_main)
def show_modification_mode(self) -> None: log_method_name() self.drag_button.show() self.resize_button.show() self.show() self.config_change_mode = True
def hide_modification_mode(self) -> None: log_method_name() self.drag_button.hide() self.resize_button.hide() self.hide() self.config_change_mode = False
def __init__(self, screen_geometry: QRect): super(MainWidget, self).__init__(None) self.image_path = PROJECT_ROOT + "/img/" # initialize_logging() log_method_name() # Setup main widget UI self.screen_geometry = screen_geometry self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint | Qt.Tool) self.setAttribute(Qt.WA_NoSystemBackground, True) self.setAttribute(Qt.WA_TranslucentBackground, True) self.buttons_size = QSize(26, 26) self.error_widget = DragWidget() load_styles(self.error_widget) self.error_widget.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint) # Initialize other classes, order is important self.painter_widget = PainterWidget(screen_geometry) self.settings_widget = SettingsWidget(self.painter_widget) self.filters_widget = FiltersWidget(self.settings_widget) self.requester = Requester(self.settings_widget, self.painter_widget) self.last_requested_time = 0 self.logListener = LogListener(self.settings_widget) self.filter_manager = FilterManager(self.settings_widget) # Load mod configuration ModsContainer.load_mods_config(self.settings_widget.mod_file) # Setup Requester thread self.objThread_requester = QThread() self.requester.moveToThread(self.objThread_requester) self.requester.finished.connect(self.objThread_requester.quit) self.requester.failed.connect(self._requester_failed) self.objThread_requester.started.connect(self.requester.run) self.objThread_requester.finished.connect(self._requester_finished) # self.requester.start() # Setup log listener and filter manager self.objThread_logListener = QThread() self.logListener.moveToThread(self.objThread_logListener) self.logListener.entered_map.connect(self._request_count_chaos_items) self.requester.finished_counting_chaos.connect(self._request_process_chaos_counters) self.logListener.start() # Setup main widget UI self.screen_geometry = screen_geometry self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint) self.setAttribute(Qt.WA_NoSystemBackground, True) self.setAttribute(Qt.WA_TranslucentBackground, True) self.move(0, self.settings_widget.main_widget_y) layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.setAlignment(Qt.AlignTop) layout.setSpacing(0) # Setup buttons self.drag_button = DragButton(self, True) icon = QIcon() icon.addPixmap(QPixmap(self.image_path + 'move.png')) self.drag_button.setIcon(icon) self.mode_switch_button = QPushButton() self.mode_switch_button.clicked.connect(lambda: self.show_hide_widget(self.painter_widget)) font = QFont() font.setBold(True) self.mode_switch_button.setFont(font) if self.settings_widget.mode == "chaos_recipe": self.mode_switch_button.setText("C") else: self.mode_switch_button.setText("R") self.mode_switch_button.clicked.connect(self._switch_mode) self.mode_switch_button.setToolTip("Chaos recipe / Rare scanner") self.run_button = QPushButton() icon.addPixmap(QPixmap(self.image_path + 'run.png')) self.run_button.setIcon(icon) self.run_button.clicked.connect(self._run_requester) self.painter_button = QPushButton() self.painter_button.clicked.connect(lambda: self.show_hide_widget(self.painter_widget)) icon.addPixmap(QPixmap(self.image_path + 'draw1.png')) self.painter_button.setIcon(icon) self.filter_reload_button = QPushButton() icon.addPixmap(QPixmap(self.image_path + 'refresh.png')) self.filter_reload_button.setIcon(icon) self.filter_reload_button.clicked.connect(self._request_count_chaos_items) self.filter_reload_button.setToolTip("Refresh chaos recipe filter") self.filters_button = QPushButton() self.filters_button.clicked.connect(lambda: self.show_hide_widget(self.filters_widget)) icon.addPixmap(QPixmap(self.image_path + 'filter.png')) self.filters_button.setIcon(icon) self.filters_button.setToolTip("Manage rare scanner filters") self.settings_button = QPushButton() self.settings_button.clicked.connect(lambda: self.show_hide_widget(self.settings_widget)) icon.addPixmap(QPixmap(self.image_path + 'settings.png')) self.settings_button.setIcon(icon) self.exit_button = QPushButton() self.exit_button.clicked.connect(QCoreApplication.quit) icon.addPixmap(QPixmap(self.image_path + 'exit.png')) self.exit_button.setIcon(icon) self.buttons = [ self.drag_button, self.mode_switch_button, self.run_button, self.painter_button, self.filter_reload_button, self.filters_button, self.settings_button, self.exit_button ] for button in self.buttons: button.setFixedWidth(self.buttons_size.width()) button.setFixedHeight(self.buttons_size.height()) button.setWindowFlags(Qt.Dialog) load_styles(button) if button is self.mode_switch_button: layout.addWidget(button, 0, Qt.AlignTop) else: layout.addWidget(button, 0, Qt.AlignTop) if button is self.drag_button: self._prepare_stash_switch(layout) widget = QWidget(flags=Qt.Widget) widget.setLayout(layout) self.setCentralWidget(widget)