class Interface(BaseWidget): def __init__(self): super(Interface, self).__init__('IR project') self._query = ControlText(label='Type your query and press "Enter"; for example:', defaultValue='Albert Einstein') self._query.key_pressed = self.__enter_pressed_event self._pages_result = ControlList('Found web-pages:') self._pages_result.readOnly = True self._pages_result.currentCellChanged = self.__page_selected self._pages_displayed = [] self._papers_result = ControlList('Found papers (by author):') self._papers_result.readOnly = True self._papers_result.currentCellChanged = self.__paper_selected self._papers_displayed = [] self.formset = ['_query', ('_pages_result', '_papers_result')] def __enter_pressed_event(self, e): if e.key() == QtCore.Qt.Key_Return: query = query_words(self._query.value) self._pages_displayed, self._papers_displayed = process_query(query, self._query.value) self._pages_result.clear() self._pages_result.value = [(QtGui.QLabel(format_text(query, document, 'pages')),) for document in self._pages_displayed] self._pages_result.resizeRowsToContents() self._papers_result.clear() self._papers_result.value = [(QtGui.QLabel(format_text(query, document, 'papers')),) for document in self._papers_displayed] self._papers_result.resizeRowsToContents() def __page_selected(self, next_row, unused1, unused2, unused3): open_url(self._pages_displayed[next_row]['url']) def __paper_selected(self, next_row, unused1, unused2, unused3): open_url(self._papers_displayed[next_row]['url'])
class PointsTab(BaseWidget): """ A Tab for a list of points """ _axis = [] _update_function = None _controller = None _sensor = None _lightsource = None _saved_points = None def __init__(self, update_function=None): super().__init__("Points") self._update_function = update_function self._open_file = ControlFile( label="Points File: " ) self._open_file.changed_event = self._on_open_file self._save_file = ControlButton( label="Save" ) self._save_file.value = self._save_points self._points_list = ControlList( label="Points", add_function=self._add_point, remove_function=self._remove_point, auto_resize=False ) self._points_list.data_changed_event = self._change_point self._points_list.horizontal_headers = [ axis.get_name() for axis in self._axis] self._pre_delay_time = ControlNumber( label="Pre Delay Time (s)", default=1, minimum=0, maximum=float('inf'), decimals=5 ) self._measure_time = ControlNumber( label="Measure Time (s)", default=5, minimum=0, maximum=float('inf'), decimals=5 ) self._post_delay_time = ControlNumber( label="Post Delay Time (s)", default=1, minimum=0, maximum=float('inf'), decimals=5 ) self._scan_frequency = ControlNumber( label="Scan Frequency (Hz)", default=10, minimum=0, maximum=float('inf'), decimals=5 ) self._out_file = ControlDir( label="Output Folder: " ) self._scan_button = ControlButton( label="Scan" ) self._scan_button.value = self._begin_scan self.formset = [ ('_open_file', '_save_file'), '_points_list', ('_pre_delay_time', '_post_delay_time'), ('_measure_time', '_scan_frequency'), '_out_file', '_scan_button', ] def update_events(self, events): """ Updates all events """ # Update the points with the most recent axis if 'axis' in events: self._axis = events['axis'] self._update_lists() if 'sensor' in events: self._sensor = events['sensor'] if 'lightsource' in events: self._lightsource = events['lightsource'] if 'scan' in events: state = events['scan'][0] if state == AxisControllerState.DONE: self._scan_button.label = "Scan" else: self._scan_button.label = "Stop" if 'saved_points' in events: self._saved_points = events['saved_points'] def _update_lists(self): self._points_list.clear() self._points_list.horizontal_headers = [ axis.get_name() for axis in self._axis] self._points_list.resize_rows_contents() length = self._max_axis_len() for i in range(0, length): point = [] for axis in self._axis: assert isinstance(axis, ControlAxis) # Add enough extra points to the axis so it matches the rest of the axis if it is missing points if len(axis.points) <= i: for j in range(len(axis.points) - 1, i): axis.points.append(str(axis.get_min())) point.append(str(axis.points[i])) self._points_list += point self._points_list.resize_rows_contents() def _max_axis_len(self): """ Get the number of points in the axis that has the most points """ max_len = 0 for axis in self._axis: assert isinstance(axis, ControlAxis) if len(axis.points) > max_len: max_len = len(axis.points) return max_len def _add_point(self): for axis in self._axis: assert isinstance(axis, ControlAxis) axis.points.append("0.0") self._update_lists() def _remove_point(self): index = self._points_list.selected_row_index if index is not None: for axis in self._axis: assert isinstance(axis, ControlAxis) axis.points.pop(index) self._update_lists() def _change_point(self, row, col, item): if len(self._axis) > col and len(self._axis[col].points) > row: try: self._axis[col].points[row] = float(item) except ValueError: self._axis[col].points[row] = item def _begin_scan(self): """ Create an AxisController and begin scanning """ if self._controller is None or self._controller.get_state() == AxisControllerState.DONE: self._controller = AxisController( self._axis, self._sensor, self._lightsource, self._pre_delay_time.value, self._measure_time.value, self._post_delay_time.value, self._scan_frequency.value, self._saved_points, self._out_file.value, self._update_function) self._controller.begin() else: self._controller.stop() def _on_open_file(self): """ Open a csv file and rearange columns accoring to header """ print("Opening File:", self._open_file.value) if self._open_file.value is not None and self._open_file.value != '': with open(self._open_file.value, newline='') as csvfile: try: csvreader = csv.reader(csvfile) self._parse_file(csvreader) except: print("Failed to read file") def _parse_file(self, csvreader): for axis in self._axis: if isinstance(axis, ControlAxis): axis.points.clear() self._points_list.clear() points = [] for row in csvreader: for index, data in enumerate(row): if len(points) <= index: points.append([]) points[index].append(data) #print(points) for points_list in points: print(points_list[0]) if isinstance(points_list[0], str): for axis in self._axis: if points_list[0] == axis.get_name(): axis.points.clear() for point in points_list[1:]: try: axis.points.append(float(point)) except ValueError: axis.points.append(point) #print(axis.get_name(), axis.points) self._update_lists() def _save_points(self): points_file = QFileDialog.getSaveFileName( caption="Save Points", filter='CSV Files (*.csv)') if points_file[0] is not None and points_file[0] != '': out_points = [] headers = [] for axis in self._axis: headers.append(axis.get_name()) out_points.append(headers) length = self._max_axis_len() for i in range(0, length): point = [] for axis in self._axis: assert isinstance(axis, ControlAxis) # Add enough extra points to the axis so it matches the rest of the axis if it is missing points if len(axis.points) <= i: for j in range(len(axis.points) - 1, i): axis.points.append(str(axis.get_min())) point.append(str(axis.points[i])) out_points.append(point) with open(points_file[0], 'w', newline='') as csvfile: csvwriter = csv.writer(csvfile, quoting=csv.QUOTE_MINIMAL) csvwriter.writerows(out_points) self._open_file.value = points_file[0]
class SavedPointsTab(BaseWidget): """ The Saved Points tab """ _saved_points = {} _update_function = None def __init__(self, update_function=None): super().__init__("Saved Points") self._update_function = update_function self._open_file = ControlFile(label="Saved Points File") self._open_file.changed_event = self._on_open_file self._save_file = ControlButton(label="Save") self._save_file.value = self._on_save_file self._saved_points_list = ControlList( label="Saved Points", add_function=self._add_saved_point, remove_function=self._remove_saved_point) self._saved_points_list.data_changed_event = self._change_point self._saved_points_list.horizontal_headers = ["Name", "Value"] self.formset = [('_open_file', '_save_file'), '_saved_points_list'] def update_events(self, events): pass def _send_events(self): if self._update_function is not None: self._update_function({'saved_points': self._saved_points}) def _update_saved_points(self): self._saved_points_list.clear() for name, value in self._saved_points.items(): self._saved_points_list += [name, value] def add_saved_point(self, name): if not name in self._saved_points: self._saved_points[name] = "0.0" self._update_saved_points() self._send_events() return True else: return False def _add_saved_point(self): window = NewPointWindow(self.add_saved_point) window.show() def _remove_saved_point(self): index = self._saved_points_list.selected_row_index if index is not None: name = self._saved_points_list.get_value(0, index) self._saved_points.pop(name) self._update_saved_points() self._send_events() def _change_point(self, row, col, item): name = self._saved_points_list.get_value(0, row) if col == 1: # The data was edited self._saved_points[name] = item self._send_events() else: # Something else (name) was edited and needs to be changed back if not name in self._saved_points: self._update_saved_points() def _on_open_file(self): if self._open_file.value is not None and self._open_file.value != '': with open(self._open_file.value, newline='') as csvfile: try: csvreader = csv.reader(csvfile) self._saved_points = {} for point in csvreader: self._saved_points[point[0]] = point[1] except: print("Failed to read file") self._update_saved_points() def _on_save_file(self): points_file = QFileDialog.getSaveFileName(caption="Save Points", filter='CSV Files (*.csv)') if points_file[0] is not None and points_file[0] != '': out_points = [] for name, value in self._saved_points.items(): out_points.append([name, value]) with open(points_file[0], 'w', newline='') as csvfile: csvwriter = csv.writer(csvfile, quoting=csv.QUOTE_MINIMAL) csvwriter.writerows(out_points)
class GraphsProperties(BaseWidget): def __init__(self, timelineWidget=None, parentWindow=None): super(GraphsProperties, self).__init__('Graphs properties', parentWindow=parentWindow) self.setContentsMargins(10, 10, 10, 10) self._timeline = timelineWidget # Definition of the forms fields self._graphs_list = ControlList('Datasets') self._name = ControlText('Name') self._min_value = ControlNumber('Min', 0, -sys.float_info.max, sys.float_info.max) self._max_value = ControlNumber('Max', 0, -sys.float_info.max, sys.float_info.max) self._values_zoom = ControlSlider('Amplitude', 100, 60, 400) self._values_top = ControlNumber('Bottom', 0, -1000, 1000) self._remove_graph_btn = ControlButton('Remove graph') self._value = ControlLabel() self._formset = [ ( ['_graphs_list','_remove_graph_btn'], '||', [ ' ', '_name', ('_min_value', '_max_value'), ('_values_top',' '), '_values_zoom', 'info:Choose one dataset and move the mouse over the graph line to visualize the coordenates.', '_value' ]), ] self._graphs_list.itemSelectionChanged = self.__graphs_list_selection_changed self._loaded = False self._name.changed = self.__save_graphs_changes self._min_value.changed = self.__save_graphs_changes self._max_value.changed = self.__save_graphs_changes self._values_zoom.changed = self.__save_graphs_changes self._values_top.changed = self.__save_graphs_changes self._name.enabled = False self._min_value.enabled = False self._max_value.enabled = False self._values_zoom.enabled = False self._values_top.enabled = False self._remove_graph_btn.enabled = False self._remove_graph_btn.value = self.__remove_chart @property def selected_chart(self): index = self._graphs_list.mouseSelectedRowIndex return self._timeline._charts[0] if (index is not None) else None @property def coordenate_text(self): return self._value @coordenate_text.setter def coordenate_text(self, value): self._value.value = str(value) if value else '' def show(self): super(GraphsProperties, self).show() self._loaded = False self._graphs_list.clear() for graph in self._timeline._charts: self._graphs_list += [graph.name] def __remove_chart(self): index = self._graphs_list.mouseSelectedRowIndex if index is not None: self._graphs_list -= -1 self._timeline._charts.pop(index) self._timeline.repaint() def __graphs_list_selection_changed(self): index = self._graphs_list.mouseSelectedRowIndex if index is not None: graph = self._timeline._charts[index] exponent_min = abs(decimal.Decimal(graph._graphMin).as_tuple().exponent) exponent_max = abs(decimal.Decimal(graph._graphMax).as_tuple().exponent) exponent_min = 4 if exponent_min>4 else exponent_min exponent_max = 4 if exponent_min>4 else exponent_min self._name.value = graph.name self._min_value.decimals = exponent_min self._min_value.value = graph._graphMin self._max_value.decimals = exponent_max self._max_value.value = graph._graphMax self._values_zoom.value = graph._zoom * 100.0 self._values_top.value = graph._top self._loaded = True self._name.enabled = True self._min_value.enabled = True self._max_value.enabled = True self._values_zoom.enabled = True self._values_top.enabled = True self._remove_graph_btn.enabled = True else: self._name.enabled = False self._min_value.enabled = False self._max_value.enabled = False self._values_zoom.enabled = False self._values_top.enabled = False self._remove_graph_btn.enabled = False def __save_graphs_changes(self): index = self._graphs_list.mouseSelectedRowIndex if self._loaded and index is not None: graph = self._timeline._charts[index] logger.debug('Before: Min: {0} | Max: {1} Zoom: {2}'.format(graph.graph_min, graph.graph_max,graph.zoom ) ) graph.name = self._name.value; self._graphs_list.setValue(0, index, self._name.value) graph.graph_min = self._min_value.value graph.graph_max = self._max_value.value graph.zoom = self._values_zoom.value / 100.0 graph.top = self._values_top.value logger.debug('Min: {0} | Max: {1} Zoom: {2}'.format(graph.graph_min, graph.graph_max,graph.zoom ) ) self._timeline.repaint() @property def charts(self): return self._timeline._charts
class GraphsProperties(BaseWidget): def __init__(self, timelineWidget=None): super(GraphsProperties, self).__init__('Graphs properties') self.setContentsMargins(10, 10, 10, 10) self._timeline = timelineWidget # Definition of the forms fields self._graphs_list = ControlList('Graphs list') self._name = ControlText('Name') self._min_value = ControlNumber('Min') self._max_value = ControlNumber('Max') self._values_zoom = ControlSlider('Amplitude', 100, 60, 400) self._values_top = ControlNumber('Top position', 0, -1000, 1000) self._remove_graph_btn = ControlButton('Remove graph') self._formset = [ (['_graphs_list', '_remove_graph_btn'], '||', [ ' ', '_name', ('_min_value', '_max_value'), ('_values_top', ' '), '_values_zoom', ' ' ]), ] self._graphs_list.itemSelectionChanged = self.__graphs_list_selection_changed self._loaded = False self._name.changed = self.__save_graphs_changes self._min_value.changed = self.__save_graphs_changes self._max_value.changed = self.__save_graphs_changes self._values_zoom.changed = self.__save_graphs_changes self._values_top.changed = self.__save_graphs_changes def show(self): super(GraphsProperties, self).show() self._loaded = False self._graphs_list.clear() for graph in self._timeline._charts: self._graphs_list += [graph.name] def __graphs_list_selection_changed(self): index = self._graphs_list.mouseSelectedRowIndex if index is not None: graph = self._timeline._charts[index] exponent_min = abs( decimal.Decimal(graph._graphMin).as_tuple().exponent) exponent_max = abs( decimal.Decimal(graph._graphMax).as_tuple().exponent) exponent_min = 4 if exponent_min > 4 else exponent_min exponent_max = 4 if exponent_min > 4 else exponent_min self._name.value = graph.name self._min_value.decimals = exponent_min self._min_value.value = graph._graphMin self._max_value.decimals = exponent_max self._max_value.value = graph._graphMax self._values_zoom.value = graph._zoom * 100.0 self._values_top.value = graph._top self._loaded = True def __save_graphs_changes(self): index = self._graphs_list.mouseSelectedRowIndex if self._loaded and index is not None: graph = self._timeline._charts[index] graph.name = self._name.value self._graphs_list.setValue(0, index, self._name.value) graph._graphMin = self._min_value.value graph._graphMax = self._max_value.value graph._zoom = self._values_zoom.value / 100.0 graph._top = self._values_top.value self._timeline.repaint()
class GraphsProperties(BaseWidget): def __init__(self, timelineWidget=None): super(GraphsProperties, self).__init__('Graphs properties') self.setContentsMargins(10, 10, 10, 10) self._timeline = timelineWidget # Definition of the forms fields self._graphs_list = ControlList('Graphs list') self._name = ControlText('Name') self._min_value = ControlNumber('Min') self._max_value = ControlNumber('Max') self._values_zoom = ControlSlider('Amplitude', 100, 60, 400) self._values_top = ControlNumber('Top position', 0, -1000, 1000) self._remove_graph_btn = ControlButton('Remove graph') self._formset = [ ( ['_graphs_list','_remove_graph_btn'], '||', [ ' ', '_name', ('_min_value', '_max_value'), ('_values_top',' '), '_values_zoom', ' ' ]), ] self._graphs_list.itemSelectionChanged = self.__graphs_list_selection_changed self._loaded = False self._name.changed = self.__save_graphs_changes self._min_value.changed = self.__save_graphs_changes self._max_value.changed = self.__save_graphs_changes self._values_zoom.changed = self.__save_graphs_changes self._values_top.changed = self.__save_graphs_changes def show(self): super(GraphsProperties, self).show() self._loaded = False self._graphs_list.clear() for graph in self._timeline._charts: self._graphs_list += [graph.name] def __graphs_list_selection_changed(self): index = self._graphs_list.mouseSelectedRowIndex if index is not None: graph = self._timeline._charts[index] exponent_min = abs(decimal.Decimal(graph._graphMin).as_tuple().exponent) exponent_max = abs(decimal.Decimal(graph._graphMax).as_tuple().exponent) exponent_min = 4 if exponent_min>4 else exponent_min exponent_max = 4 if exponent_min>4 else exponent_min self._name.value = graph.name self._min_value.decimals = exponent_min self._min_value.value = graph._graphMin self._max_value.decimals = exponent_max self._max_value.value = graph._graphMax self._values_zoom.value = graph._zoom * 100.0 self._values_top.value = graph._top self._loaded = True def __save_graphs_changes(self): index = self._graphs_list.mouseSelectedRowIndex if self._loaded and index is not None: graph = self._timeline._charts[index] graph.name = self._name.value; self._graphs_list.setValue(0, index, self._name.value) graph._graphMin = self._min_value.value graph._graphMax = self._max_value.value graph._zoom = self._values_zoom.value / 100.0 graph._top = self._values_top.value self._timeline.repaint()