def _set_cell_text_time(self, _, cell, model, iter_): """Set cell text for "update-time" column.""" suite_update_time = model.get_value(iter_, self.UPDATE_TIME_COLUMN) time_point = timepoint_from_epoch(suite_update_time) time_point.set_time_zone_to_local() current_point = timepoint_from_epoch(time()) if str(time_point).split("T")[0] == str(current_point).split("T")[0]: time_string = str(time_point).split("T")[1] else: time_string = str(time_point) is_stopped = model.get_value(iter_, self.STOPPED_COLUMN) cell.set_property("sensitive", not is_stopped) cell.set_property("text", time_string)
def _on_query_tooltip(self, _, x, y, kbd_ctx, tooltip): """Handle a tooltip creation request.""" tip_context = self.treeview.get_tooltip_context(x, y, kbd_ctx) if tip_context is None: self._prev_tooltip_location_id = None return False x, y = self.treeview.convert_widget_to_bin_window_coords(x, y) path, column, cell_x = (self.treeview.get_path_at_pos(x, y))[:3] model = self.treeview.get_model() iter_ = model.get_iter(path) parent_iter = model.iter_parent(iter_) if parent_iter is None or parent_iter and model.iter_has_child(iter_): host, owner, suite = model.get(iter_, self.HOST_COLUMN, self.OWNER_COLUMN, self.SUITE_COLUMN) child_row_number = None else: host, owner, suite = model.get(parent_iter, self.HOST_COLUMN, self.OWNER_COLUMN, self.SUITE_COLUMN) child_row_number = path[-1] suite_update_time = model.get_value(iter_, self.UPDATE_TIME_COLUMN) location_id = (host, owner, suite, suite_update_time, column.get_title(), child_row_number) if location_id != self._prev_tooltip_location_id: self._prev_tooltip_location_id = location_id tooltip.set_text(None) return False gsfg = GScanConfig.get_inst() if column.get_title() in [ gsfg.COL_HOST, gsfg.COL_OWNER, gsfg.COL_SUITE ]: tooltip.set_text("%s - %s:%s" % (suite, owner, host)) return True if column.get_title() == gsfg.COL_UPDATED: suite_update_point = timepoint_from_epoch(suite_update_time) if (self.updater.prev_norm_update is not None and suite_update_time != int(self.updater.prev_norm_update)): text = "Last changed at %s\n" % suite_update_point text += "Last scanned at %s" % timepoint_from_epoch( int(self.updater.prev_norm_update)) else: # An older suite (or before any updates are made?) text = "Last scanned at %s" % suite_update_point tooltip.set_text(text) return True if column.get_title() != gsfg.COL_STATUS: tooltip.set_text(None) return False # Generate text for the number of tasks in each state state_texts = [] state_text = model.get_value(iter_, self.STATUS_COLUMN) if state_text is None: tooltip.set_text(None) return False info = re.findall(r'\D+\d+', state_text) for status_number in info: status, number = status_number.rsplit(" ", 1) state_texts.append(number + " " + status.strip()) tooltip_prefix = ("<span foreground=\"#777777\">Tasks: " + ", ".join(state_texts) + "</span>") # If hovering over a status indicator set tooltip to show most recent # tasks. dot_offset, dot_width = tuple( column.cell_get_position(column.get_cell_renderers()[2])) try: cell_index = ((cell_x - dot_offset) // dot_width) + 1 except ZeroDivisionError: return False if cell_index >= 0: # NOTE: TreeViewColumn.get_cell_renderers() does not always return # cell renderers for the correct row. if cell_index == 0: # Hovering over the error symbol. point_string = model.get(iter_, self.CYCLE_COLUMN)[0] if point_string: return False if not self.warnings.get((host, owner, suite)): return False tooltip.set_markup( tooltip_prefix + '\n<b>New failures</b> (<i>last 5</i>) <i><span ' + 'foreground="#2222BB">click to dismiss</span></i>\n' + self.warnings[(host, owner, suite)]) return True else: # Hovering over a status indicator. info = re.findall(r'\D+\d+', model.get(iter_, self.STATUS_COLUMN)[0]) if cell_index > len(info): return False state = info[cell_index - 1].strip().split(' ')[0] point_string = model.get(iter_, self.CYCLE_COLUMN)[0] tooltip_text = tooltip_prefix if suite: tasks = self.updater.get_last_n_tasks( host, owner, suite, state, point_string) tooltip_text += ( '\n<b>Recent {state} tasks</b>\n{tasks}').format( state=state, tasks='\n'.join(tasks)) tooltip.set_markup(tooltip_text) return True # Set the tooltip to a generic status for this suite. tooltip.set_markup(tooltip_prefix) return True
def _on_query_tooltip(self, _, x, y, kbd_ctx, tooltip): """Handle a tooltip creation request.""" tip_context = self.treeview.get_tooltip_context(x, y, kbd_ctx) if tip_context is None: self._prev_tooltip_location_id = None return False x, y = self.treeview.convert_widget_to_bin_window_coords(x, y) path, column, cell_x, _ = ( self.treeview.get_path_at_pos(x, y)) model = self.treeview.get_model() iter_ = model.get_iter(path) parent_iter = model.iter_parent(iter_) if parent_iter is None or parent_iter and model.iter_has_child(iter_): host, owner, suite = model.get( iter_, self.HOST_COLUMN, self.OWNER_COLUMN, self.SUITE_COLUMN) child_row_number = None else: host, owner, suite = model.get( parent_iter, self.HOST_COLUMN, self.OWNER_COLUMN, self.SUITE_COLUMN) child_row_number = path[-1] suite_update_time = model.get_value(iter_, self.UPDATE_TIME_COLUMN) location_id = ( host, owner, suite, suite_update_time, column.get_title(), child_row_number) if location_id != self._prev_tooltip_location_id: self._prev_tooltip_location_id = location_id tooltip.set_text(None) return False if column.get_title() in [ gsfg.COL_HOST, gsfg.COL_OWNER, gsfg.COL_SUITE]: tooltip.set_text("%s - %s:%s" % (suite, owner, host)) return True if column.get_title() == gsfg.COL_UPDATED: suite_update_point = timepoint_from_epoch(suite_update_time) if (self.updater.last_update_time is not None and suite_update_time != int(self.updater.last_update_time)): retrieval_point = timepoint_from_epoch( int(self.updater.last_update_time)) text = "Last changed at %s\n" % suite_update_point text += "Last scanned at %s" % retrieval_point else: # An older suite (or before any updates are made?) text = "Last scanned at %s" % suite_update_point tooltip.set_text(text) return True if column.get_title() != gsfg.COL_STATUS: tooltip.set_text(None) return False # Generate text for the number of tasks in each state state_texts = [] state_text = model.get_value(iter_, self.STATUS_COLUMN) if state_text is None: tooltip.set_text(None) return False info = re.findall(r'\D+\d+', state_text) for status_number in info: status, number = status_number.rsplit(" ", 1) state_texts.append(number + " " + status.strip()) tooltip_prefix = ( "<span foreground=\"#777777\">Tasks: " + ", ".join(state_texts) + "</span>" ) # If hovering over a status indicator set tooltip to show most recent # tasks. dot_offset, dot_width = tuple(column.cell_get_position( column.get_cell_renderers()[2])) try: cell_index = ((cell_x - dot_offset) // dot_width) + 1 except ZeroDivisionError: return False if cell_index >= 0: # NOTE: TreeViewColumn.get_cell_renderers() does not always return # cell renderers for the correct row. if cell_index == 0: # Hovering over the error symbol. point_string = model.get(iter_, self.CYCLE_COLUMN)[0] if point_string: return False if not self.warnings.get((host, owner, suite)): return False tooltip.set_markup( tooltip_prefix + '\n<b>New failures</b> (<i>last 5</i>) <i><span ' + 'foreground="#2222BB">click to dismiss</span></i>\n' + self.warnings[(host, owner, suite)]) return True else: # Hovering over a status indicator. info = re.findall(r'\D+\d+', model.get(iter_, self.STATUS_COLUMN)[0]) if cell_index > len(info): return False state = info[cell_index - 1].strip().split(' ')[0] point_string = model.get(iter_, self.CYCLE_COLUMN)[0] tooltip_text = tooltip_prefix if suite: tasks = self.updater.get_last_n_tasks( host, owner, suite, state, point_string) tooltip_text += ( '\n<b>Recent {state} tasks</b>\n{tasks}').format( state=state, tasks='\n'.join(tasks)) tooltip.set_markup(tooltip_text) return True # Set the tooltip to a generic status for this suite. tooltip.set_markup(tooltip_prefix) return True