def mouseReleaseEvent(self, event): if self.isEnabled(): self.add_button.setDown(False) ctrl.ui.set_scope(self.key) ctrl.deselect_objects() ctrl.call_watchers(self, 'scope_changed') QtWidgets.QFrame.mouseReleaseEvent(self, event)
def compute_angle_for_pos(self, event_pos, adjustment): """ :param top_left: """ edge = self._host start_pos, end_point = self.get_label_line_positions() # closest_magnet = self.find_closest_magnet(top_left, start_pos) # line_x = top_left.x() + closest_magnet[0] - start_pos.x() # line_y = top_left.y() + closest_magnet[1] - start_pos.y() line_x = event_pos.x() - start_pos.x() line_y = event_pos.y() - start_pos.y() rad = math.atan2(line_y, line_x) edge_angle = (360 - edge.get_angle_at(self.label_start)) my_angle = math.degrees(rad) if my_angle < 0: my_angle += 360 a1 = my_angle - edge_angle a2 = my_angle - edge_angle + 360 if abs(a1) < abs(a2): new_angle = a1 else: new_angle = a2 self.label_angle = new_angle self.label_dist = math.hypot(line_x, line_y) ctrl.call_watchers(edge, 'edge_label_adjust', 'adjustment', adjustment)
def switch_project(self, i): self.forest.retire_from_drawing() self.forest_keeper = self.forest_keepers[i] ctrl.call_watchers(self.forest_keeper, 'document_changed') self.change_forest() self.ui_manager.update_projects_menu() return self.forest_keeper
def change_view_mode(self, syntactic_mode): t = time.time() ctrl.settings.set('syntactic_mode', syntactic_mode, level=g.FOREST) label_text_mode = ctrl.settings.get('label_text_mode') if syntactic_mode: self.old_label_mode = label_text_mode if label_text_mode == g.NODE_LABELS: ctrl.settings.set('label_text_mode', g.SYN_LABELS, level=g.FOREST) elif label_text_mode == g.NODE_LABELS_FOR_LEAVES: ctrl.settings.set('label_text_mode', g.SYN_LABELS_FOR_LEAVES, level=g.FOREST) else: if self.old_label_mode == g.NODE_LABELS or \ self.old_label_mode == g.NODE_LABELS_FOR_LEAVES: ctrl.settings.set('label_text_mode', self.old_label_mode, level=g.FOREST) nodes = list(self.nodes.values()) for node in nodes: node.update_label() node.update_visibility(skip_label=True) ctrl.call_watchers(self, 'view_mode_changed', value=syntactic_mode) if syntactic_mode: if ctrl.main.color_manager.paper().value() < 100: ctrl.settings.set('temp_color_theme', 'dk_gray', level=g.FOREST) else: ctrl.settings.set('temp_color_theme', 'gray', level=g.FOREST) else: ctrl.settings.set('temp_color_theme', '', level=g.FOREST) ctrl.main.update_colors()
def init_forest_keepers(self): """ Put empty forest keepers (Kataja documents) in place -- you want to do this after plugins have changed the classes that implement these. :return: """ self.forest_keepers = [classes.get('KatajaDocument')()] self.forest_keeper = self.forest_keepers[0] ctrl.call_watchers(self.forest_keeper, 'document_changed')
def resizeEvent(self, event): """ :param event: """ QtWidgets.QGraphicsView.resizeEvent(self, event) #self._last_rect = self.mapToScene(self.rect()).boundingRect() ctrl.call_watchers(self, 'viewport_changed')
def resizeEvent(self, event): """ :param event: """ QtWidgets.QGraphicsView.resizeEvent(self, event) # self._last_rect = self.mapToScene(self.rect()).boundingRect() ctrl.call_watchers(self, "viewport_changed")
def call_watchers(self, signal, field_name=None, value=None): """ Alert (UI) objects that are watching for changes for given field in this object :param signal: :param field_name: :param value: :return: """ ctrl.call_watchers(self, signal, field_name, value)
def set_color(self, key, color, compute_companions=False, contrast=65, can_save=True): """ In its simplest, put a color to palette dict. If palette is not custom palette and color is not going to custom colors slot, then make a new palette and switch to use it.""" if self.theme_key in self.default_themes and not key.startswith( 'custom'): new_key, name = self.create_custom_theme_from_modification( key, color, contrast) ctrl.settings.set('color_theme', new_key, level=PREFS) ctrl.settings.set('color_theme', new_key, level=DOCUMENT) self.update_custom_themes() ctrl.main.update_colors(randomise=False, animate=False) ctrl.call_watchers(self, 'color_themes_changed') else: self.d[key] = color if compute_companions: if key == 'content1': self.compute_palette(color.getHsvF()[:3], contrast=contrast) self.d['content2'] = adjust_lightness(color, 8) self.d['content3'] = adjust_lightness(color, -8) elif key == 'background1': r, g, b, a = self.drawing().getRgbF() h, s, l = rgb_to_husl(r, g, b) if l < 0.7: self.d['background2'] = adjust_lightness(color, -8) else: self.d['background2'] = adjust_lightness(color, 8) if key.startswith('custom') and can_save: if 'custom_colors' in ctrl.settings.s_document: ctrl.settings.s_document['custom_colors'][ key] = color.getRgbF() else: ctrl.settings.s_document['custom_colors'] = { key: color.getRgbF() } prefs.custom_colors[key] = color.getRgbF() if self.theme_key in self.custom_themes: # same theme_data object also lives in prefs, updating it once does them both theme_data = self.custom_themes[self.theme_key] c = theme_data['colors'] for key, color in self.d.items(): c[key] = color.getRgbF() if not self.theme_key in prefs.custom_themes: prefs.custom_themes[self.theme_key] = theme_data elif prefs.custom_themes[self.theme_key] is not theme_data: prefs.custom_themes[self.theme_key] = theme_data self.background_lightness = self.d['background1'].lightnessF() ctrl.main.update_colors(randomise=False, animate=False)
def reset_preferences(self): """ :return: """ prefs.restore_default_preferences(qt_prefs, running_environment, classes) ctrl.call_watchers(self, 'color_themes_changed') if self.ui_manager.preferences_dialog: self.ui_manager.preferences_dialog.close() self.ui_manager.preferences_dialog = PreferencesDialog(self) self.ui_manager.preferences_dialog.open() self.ui_manager.preferences_dialog.trigger_all_updates()
def watch_alerted(self, obj, signal, field_name, value): """ Receives alerts from signals that this object has chosen to listen. This method will try to sort out the received signals and act accordingly. :param obj: the object causing the alarm :param signal: identifier for type of the alarm :param field_name: name of the field of the object causing the alarm :param value: value given to the field :return: """ if signal == 'document_changed': self.update_custom_themes() self.update_custom_colors() ctrl.call_watchers(self, 'color_themes_changed')
def instant_fit_to_view(self, target_rect): """ Fit the current scene into view, snugly :param target_rect: scene rect that contains all of the items we want to fit into view. """ sr = self.sceneRect() # if self.zoom_anim: # self.zoom_anim.stop() if target_rect.right() > sr.right() or target_rect.bottom() > sr.bottom(): self.setSceneRect(sr + QtCore.QMarginsF(0, 0, 500, 500)) if target_rect.left() < sr.left() or target_rect.top() < sr.top(): self.setSceneRect(sr + QtCore.QMarginsF(500, 500, 0, 0)) self.fitInView(target_rect, 1) self._fit_scale = self.transform().m11() ctrl.call_watchers(self, "viewport_changed")
def instant_fit_to_view(self, target_rect): """ Fit the current scene into view, snugly :param target_rect: scene rect that contains all of the items we want to fit into view. """ sr = self.sceneRect() #if self.zoom_anim: # self.zoom_anim.stop() if target_rect.right() > sr.right() or target_rect.bottom() > sr.bottom(): self.setSceneRect(sr + QtCore.QMarginsF(0, 0, 500, 500)) if target_rect.left() < sr.left() or target_rect.top() < sr.top(): self.setSceneRect(sr + QtCore.QMarginsF(500, 500, 0, 0)) self.fitInView(target_rect, 1) self._fit_scale = self.transform().m11() ctrl.call_watchers(self, 'viewport_changed')
def update_colors(self, randomise=False, animate=True): cm = self.color_manager old_gradient_base = cm.paper() cm.update_colors(randomise=randomise) self.app.setPalette(cm.get_qt_palette()) self.update_style_sheet() ctrl.call_watchers(self, 'palette_changed') if cm.gradient: if old_gradient_base != cm.paper() and animate: self.graph_scene.fade_background_gradient(old_gradient_base, cm.paper()) else: self.graph_scene.setBackgroundBrush(cm.gradient) else: self.graph_scene.setBackgroundBrush(qt_prefs.no_brush) self.update()
def create_new_project(self): names = [fk.name for fk in self.forest_keepers] name_base = 'New project' name = 'New project' c = 1 while name in names: name = '%s %s' % (name_base, c) c += 1 self.forest.retire_from_drawing() self.forest_keepers.append(classes.KatajaDocument(name=name)) self.forest_keeper = self.forest_keepers[-1] ctrl.call_watchers(self.forest_keeper, 'document_changed') self.change_forest() self.ui_manager.update_projects_menu() return self.forest_keeper
def change_view_mode(self, syntactic_mode): ctrl.settings.set('syntactic_mode', syntactic_mode, level=g.FOREST) ctrl.settings.set('show_node_labels', not syntactic_mode, level=g.FOREST) for node in list(self.nodes.values()): node.update_label() node.update_label_visibility() node.update_visibility() ctrl.call_watchers(self, 'view_mode_changed', value=syntactic_mode) if syntactic_mode: if ctrl.main.color_manager.paper().value() < 100: ctrl.settings.set('temp_color_theme', 'dk_gray', level=g.FOREST) else: ctrl.settings.set('temp_color_theme', 'gray', level=g.FOREST) else: ctrl.settings.set('temp_color_theme', '', level=g.FOREST) ctrl.main.update_colors()
def update_colors(self, randomise=False, animate=True): t = time.time() cm = self.color_manager old_gradient_base = cm.paper() cm.update_colors(randomise=randomise) self.app.setPalette(cm.get_qt_palette()) self.update_style_sheet() ctrl.call_watchers(self, 'palette_changed') if cm.gradient: if old_gradient_base != cm.paper() and animate: self.graph_scene.fade_background_gradient( old_gradient_base, cm.paper()) else: self.graph_scene.setBackgroundBrush(cm.gradient) else: self.graph_scene.setBackgroundBrush(qt_prefs.no_brush) self.update()
def create_theme_from_current_color(self): storage = {} for key, col in self.d.items(): storage[key] = col.getRgbF() theme = { 'name': self.get_color_name(self.hsv), 'build': 'fixed', 'hsv': self.hsv, 'custom': True, 'contrast': self.theme_contrast, 'colors': storage } prefs.custom_themes[self.current_hex] = theme self.update_custom_themes() ctrl.call_watchers(self, 'color_themes_changed') return self.current_hex, theme['name']
def set_color(self, key, color, compute_companions=False, contrast=65, can_save=True): """ In its simplest, put a color to palette dict. If palette is not custom palette and color is not going to custom colors slot, then make a new palette and switch to use it.""" if self.theme_key in self.default_themes and not key.startswith('custom'): new_key, name = self.create_custom_theme_from_modification(key, color, contrast) ctrl.settings.set('color_theme', new_key, level=PREFS) ctrl.settings.set('color_theme', new_key, level=DOCUMENT) self.update_custom_themes() ctrl.main.update_colors(randomise=False, animate=False) ctrl.call_watchers(self, 'color_themes_changed') else: self.d[key] = color if compute_companions: if key == 'content1': self.compute_palette(color.getHsvF()[:3], contrast=contrast) self.d['content2'] = adjust_lightness(color, 8) self.d['content3'] = adjust_lightness(color, -8) elif key == 'background1': r, g, b, a = self.drawing().getRgbF() h, s, l = rgb_to_husl(r, g, b) if l < 0.7: self.d['background2'] = adjust_lightness(color, -8) else: self.d['background2'] = adjust_lightness(color, 8) if key.startswith('custom') and can_save: if 'custom_colors' in ctrl.settings.s_document: ctrl.settings.s_document['custom_colors'][key] = color.getRgbF() else: ctrl.settings.s_document['custom_colors'] = {key: color.getRgbF()} prefs.custom_colors[key] = color.getRgbF() if self.theme_key in self.custom_themes: # same theme_data object also lives in prefs, updating it once does them both theme_data = self.custom_themes[self.theme_key] c = theme_data['colors'] for key, color in self.d.items(): c[key] = color.getRgbF() if not self.theme_key in prefs.custom_themes: prefs.custom_themes[self.theme_key] = theme_data elif prefs.custom_themes[self.theme_key] is not theme_data: prefs.custom_themes[self.theme_key] = theme_data ctrl.main.update_colors(randomise=False, animate=False)
def scale_view_by(self, delta): """ :param delta: :return: """ if delta < 1.0 and self._scale_factor == 0.3: return self._scale_factor elif delta > 1.0 and self._scale_factor == 9.0: return self._scale_factor factor = self.transform().scale(delta, delta).m11() if factor < 0.3: factor = 0.3 elif factor > 9.0: factor = 9.0 self.resetTransform() self.scale(factor, factor) ctrl.call_watchers(self, "viewport_changed") return factor
def scale_view_by(self, delta): """ :param delta: :return: """ if delta < 1.0 and self._scale_factor == 0.3: return self._scale_factor elif delta > 1.0 and self._scale_factor == 9.0: return self._scale_factor factor = self.transform().scale(delta, delta).m11() if factor < 0.3: factor = 0.3 elif factor > 9.0: factor = 9.0 self.resetTransform() self.scale(factor, factor) ctrl.call_watchers(self, 'viewport_changed') return factor
def method(self): """ Change edge shape for selection or in currently active edge type. :return: None """ selector = self.sender() color_key = selector.receive_color_selection() if not color_key: return # Update color for selected edges if ctrl.ui.scope_is_selection: for edge in ctrl.selected: if isinstance(edge, Edge): edge.color_id = color_key edge.update() # ... or update color for all edges of this type else: ctrl.settings.set_edge_setting('color_id', color_key, edge_type=ctrl.ui.active_edge_type, level=FOREST) for edge in ctrl.forest.edges.values(): edge.update() ctrl.call_watchers(self, 'active_edge_color_changed') # shape_selector needs this if color_key: log.info('(s) Changed relation color to: %s' % ctrl.cm.get_color_name(color_key))
def scrollContentsBy(self, x, y): ctrl.call_watchers(self, "viewport_changed") QtWidgets.QGraphicsView.scrollContentsBy(self, x, y)
def remove_custom_theme(self, theme_key): if theme_key in prefs.custom_themes: del prefs.custom_themes[theme_key] if theme_key in self.custom_themes: del self.custom_themes[theme_key] ctrl.call_watchers(self, 'color_themes_changed')
def method(self, filename=''): """ Open file browser to load a kataja data file :param filename: optional filename, if given, no file dialog is displayed :return: None """ m = ctrl.main # fileName = QtGui.QFileDialog.getOpenFileName(self, # self.tr("Open File"), # QtCore.QDir.currentPath()) file_help = """All (*.kataja *.zkataja *.dict *.zdict *.json *.zjson);; Kataja files (*.kataja);; Packed Kataja files (*.zkataja);; Python dict dumps (*.dict);; Packed python dicts (*.zdict);; JSON dumps (*.json);; Packed JSON (*.zjson);; Text files containing bracket trees (*.txt, *.tex)""" # inspection doesn't recognize that getOpenFileName is static, switch it # off: # noinspection PyTypeChecker,PyCallByClass if not filename: filename, filetypes = QtWidgets.QFileDialog.getOpenFileName(ctrl.main, "Open " "KatajaMain " "trees", "", file_help) if not filename: return save_format = 'dict' zipped = False for key, value, in file_extensions.items(): if filename.endswith(value): i = key.split('.') zipped = len(i) == 2 save_format = i[0] break m.clear_all() if zipped: if save_format == 'json' or save_format == 'dict': f = gzip.open(filename, 'rt') elif save_format == 'pickle': f = gzip.open(filename, 'rb') else: log.info("Failed to load '%s'. Unknown format." % filename) return else: if save_format == 'pickle': f = open(filename, 'rb') else: f = open(filename, 'r') # import codecs # f = codecs.open(filename, 'rb', encoding = 'utf-8') if save_format == 'pickle': pickle_worker = pickle.Unpickler(f) data = pickle_worker.load() elif save_format == 'dict': data = ast.literal_eval(f.read()) # data = eval(f.read()) elif save_format == 'json': data = json.load(f) else: f.close() log.info("Failed to load '%s'. Unknown format." % filename) return f.close() # prefs.update(data['preferences'].__dict__) # qt_prefs.update(prefs) ctrl.disable_undo() m.load_objects(data, m) ctrl.resume_undo() ctrl.call_watchers(self.forest_keeper, 'document_changed') m.change_forest() log.info("Loaded '%s'." % filename)
def resize_ui_font(self): qt_prefs.toggle_large_ui_font(prefs.large_ui_text, prefs.fonts) ctrl.call_watchers(self, 'ui_font_changed') ctrl.ui.redraw_panels()
def scrollContentsBy(self, x, y): ctrl.call_watchers(self, 'viewport_changed') QtWidgets.QGraphicsView.scrollContentsBy(self, x, y)