def __init__(self, data_manager): ''' init docs ''' # Init. gtk.VBox.__init__(self) self.data_manager = data_manager self.keywords = [] self.all_pkg_names = [] self.message_bar = MessageBar(18) self.content_box = gtk.VBox() self.treeview = TreeView(enable_drag_drop=False, expand_column=0) global_event.register_event("delete-search-page-items", self.treeview.delete_items) self.cute_message_image = gtk.VBox() self.cute_message_pixbuf = utils.get_common_locale_image_pixbuf("info", "noresult.png") self.cute_message_image.connect("expose-event", self.expose_cute_message_image) self.content_box.pack_start(self.message_bar, False, False) self.content_box.pack_start(self.treeview) self.loading_box = LoadingBox() self.pack_start(self.loading_box, True, True) self.treeview.connect("items-change", self.update_message_bar) self.treeview.draw_mask = self.draw_mask
def __init__(self, bus_interface, data_manager): ''' init docs ''' # Init. gtk.VBox.__init__(self) self.bus_interface = bus_interface self.data_manager = data_manager self.message_bar = MessageBar(32) self.message_box = gtk.HBox() self.treeview = TreeView(enable_drag_drop=False) self.treeview.set_expand_column(0) self.cute_message_image = gtk.VBox() self.content_box = gtk.VBox() self.pack_start(self.message_box, False, False) self.pack_start(self.content_box, True, True) self.cute_message_pixbuf = utils.get_common_locale_image_pixbuf( "info", "no_download.png") self.content_box.pack_start(self.cute_message_image, True, True) self.treeview.draw_mask = self.draw_mask self.cute_message_image.connect("expose-event", self.expose_cute_message_image) self.treeview.connect("items-change", self.update_message_bar) self.treeview.connect( "items-change", lambda treeview: global_event.emit( "update-install-notify-number", self.get_installing_pkgs_number()))
def __init__(self, tableset, nrmlfile, parent=None): QtGui.QWidget.__init__(self, parent) self.tableset = tableset self.nrmlfile = nrmlfile self.message_bar = MessageBar(nrmlfile, self) self.init_tv() # this goes before setupUi self.setupUi()
def __init__(self, data_manager): ''' init docs ''' # Init. gtk.VBox.__init__(self) self.data_manager = data_manager self.keywords = [] self.all_pkg_names = [] self.message_bar = MessageBar(18) self.content_box = gtk.VBox() self.treeview = TreeView(enable_drag_drop=False, expand_column=0) self.cute_message_image = gtk.VBox() self.cute_message_pixbuf = utils.get_common_locale_image_pixbuf("info", "noresult.png") self.cute_message_image.connect("expose-event", self.expose_cute_message_image) self.content_box.pack_start(self.message_bar, False, False) self.content_box.pack_start(self.treeview) self.loading_box = LoadingBox() self.pack_start(self.loading_box, True, True) self.treeview.connect("items-change", self.update_message_bar) self.treeview.draw_mask = self.draw_mask
def button_press(self, column, offset_x, offset_y): # init Loading widget loading_box = LoadingBox() global_event.emit("show-pkg-view", loading_box) self.page_box = gtk.VBox() self.all_pkg_names = self.data_manager.get_second_category_packages(self.second_category_name) self.message_bar = MessageBar(18) self.message_bar.set_message(_("%s > %s : %s applications") % ( get_category_name(self.first_category_name), get_category_name(self.second_category_name), len(self.all_pkg_names), )) self.pkg_icon_view = IconView() self.pkg_icon_view.connect("motion-notify-item", tooltip_aciton) if len(self.all_pkg_names) > LOAD_ITEMS_NUMBER: self.load_new_items(self.all_pkg_names[:LOAD_ITEMS_NUMBER]) else: self.load_new_items(self.all_pkg_names) self.pkg_icon_scrolled_window = ScrolledWindow() self.pkg_icon_scrolled_window.connect("vscrollbar-state-changed", self.scrolled_window_vscrollbar_handler) self.pkg_icon_scrolled_window.add_child(self.pkg_icon_view) self.pkg_icon_view.draw_mask = self.draw_mask self.pkg_icon_view.draw_row_mask = self.draw_row_mask self.page_box.pack_start(self.message_bar, False, False) self.page_box.pack_start(self.pkg_icon_scrolled_window, True, True) global_event.emit("update-current-status-pkg-page", self.pkg_icon_view)
def __init__(self, bus_interface, data_manager): ''' init docs ''' # Init. gtk.VBox.__init__(self) self.bus_interface = bus_interface self.data_manager = data_manager self.message_bar = MessageBar(32) self.message_box = gtk.HBox() self.treeview = TreeView(enable_drag_drop=False) self.treeview.set_expand_column(0) self.cute_message_image = gtk.VBox() self.content_box = gtk.VBox() self.pack_start(self.message_box, False, False) self.pack_start(self.content_box, True, True) self.cute_message_pixbuf = utils.get_common_locale_image_pixbuf("info", "no_download.png") self.content_box.pack_start(self.cute_message_image, True, True) self.treeview.draw_mask = self.draw_mask self.cute_message_image.connect("expose-event", self.expose_cute_message_image) self.treeview.connect("items-change", self.update_message_bar) self.treeview.connect("items-change", lambda treeview: global_event.emit("update-install-notify-number", self.get_installing_pkgs_number()))
def __init__(self, tableset, nrmlfile, parent=None): QtGui.QWidget.__init__(self, parent) self.tableset = tableset self.nrmlfile = nrmlfile self.message_bar = MessageBar(nrmlfile, self) self.tables = [tableset.tableExposure, tableset.tableCostType, tableset.tableLocation, tableset.tableAsset, tableset.tableCost, tableset.tableOccupancy] self.tv = collections.OrderedDict() for table, attr in zip(self.tables, self.table_attrs): table.attr.update(attr) tv = attr['viewclass'](table, self.getdefault) if len(table) == 0: # hide empty tables tv.hide() tv.tableModel.validationFailed.connect( lambda idx, err, tv=tv: self.show_validation_error(tv, idx, err)) self.tv[table.name] = tv self.setupUi() self.tv['tableLocation'].tableView.clicked.connect( self.show_asset) self.tv['tableAsset'].tableView.clicked.connect( self.show_cost_occupancy)
def get_info(ticker, indicators): con = sqlite3.connect('base.db') cur = con.cursor() try: cur.execute('SELECT * FROM table_' + ticker) except sqlite3.OperationalError: return 'Такой компании нет в базе данных' data_table = cur.fetchall() list_indicators = list(indicators.keys()) for line in data_table: date = line[0] for i, item in enumerate(line[1:]): indicators[list_indicators[i]][date] = item return MessageBar().signal_true
def button_press(self, column, offset_x, offset_y): # init Loading widget loading_box = LoadingBox() global_event.emit("show-pkg-view", loading_box) self.page_box = gtk.VBox() self.all_pkg_names = self.data_manager.get_second_category_packages( self.second_category_name) self.message_bar = MessageBar(18) self.message_bar.set_message( _("%s > %s : %s applications") % ( get_category_name(self.first_category_name), get_category_name(self.second_category_name), len(self.all_pkg_names), )) self.pkg_icon_view = IconView() self.pkg_icon_view.connect("motion-notify-item", tooltip_aciton) if len(self.all_pkg_names) > LOAD_ITEMS_NUMBER: self.load_new_items(self.all_pkg_names[:LOAD_ITEMS_NUMBER]) else: self.load_new_items(self.all_pkg_names) self.pkg_icon_scrolled_window = ScrolledWindow() self.pkg_icon_scrolled_window.connect( "vscrollbar-state-changed", self.scrolled_window_vscrollbar_handler) self.pkg_icon_scrolled_window.add_child(self.pkg_icon_view) self.pkg_icon_view.draw_mask = self.draw_mask self.pkg_icon_view.draw_row_mask = self.draw_row_mask self.page_box.pack_start(self.message_bar, False, False) self.page_box.pack_start(self.pkg_icon_scrolled_window, True, True) global_event.emit("update-current-status-pkg-page", self.pkg_icon_view)
def single_click(self, column, offset_x, offset_y): # init Loading widget loading_box = LoadingBox() global_event.emit("show-pkg-view", loading_box) self.page_box = gtk.VBox() self.all_pkg_names = [] self.all_desktop_infos = {} for (second_category, pkg_dict) in self.second_category_items.items(): for (pkg_name, desktop_info) in pkg_dict.items(): self.all_pkg_names.append(pkg_name) self.all_desktop_infos[pkg_name] = desktop_info self.message_bar = MessageBar(18) self.message_bar.set_message(_("%s: %s applications") % ( get_category_name(self.first_category_name), len(self.all_pkg_names), )) self.pkg_icon_view = IconView() self.pkg_icon_view.connect("motion-notify-item", tooltip_aciton) if len(self.all_pkg_names) > LOAD_ITEMS_NUMBER: self.load_new_items(self.all_pkg_names[:LOAD_ITEMS_NUMBER]) else: self.load_new_items(self.all_pkg_names) self.pkg_icon_view.draw_mask = self.draw_mask self.pkg_icon_view.draw_row_mask = self.draw_row_mask self.pkg_icon_scrolled_window = ScrolledWindow() self.pkg_icon_scrolled_window.connect("vscrollbar-state-changed", self.scrolled_window_vscrollbar_handler) self.pkg_icon_scrolled_window.add_child(self.pkg_icon_view) self.page_box.pack_start(self.message_bar, False, False) self.page_box.pack_start(self.pkg_icon_scrolled_window, True, True) global_event.emit("update-current-status-pkg-page", self.pkg_icon_view)
class WidgetWindow(Gtk.EventBox): def __init__(self, package): Gtk.EventBox.__init__(self) self.package = package self.action = None self.drag_active = False # Add style class self.style_context = self.get_style_context() self.style_context.add_class("WidgetWindow") # Used to remove focus when clicking a non focusable widget self.connect('button-press-event', self.on_button_press) builder = Gtk.Builder() builder.add_from_file(UI_FILE) builder.connect_signals(self) # WidgetWindow - the whole thing self.widget_window = builder.get_object('widget_window') # Overlay - covers the whole window to catch event for drag/resize self.overlay = builder.get_object('overlay') self.overlay.add_events(Gdk.EventMask.KEY_PRESS_MASK) self.overlay_style_context = self.overlay.get_style_context() # The inner window, used only for getting the icon image self.window = builder.get_object('window') # TitleBar - the title bar at the top of the window self.title_bar = builder.get_object('title_bar') self.title_bar_label = builder.get_object('title_bar_label') self.title_bar_button = builder.get_object('title_bar_button') # WidgetBox - the box that the widget actually gets added to self.widget_box = builder.get_object('widget_box') # MessageBar self.message_bar = MessageBar() self.widget_box.add_overlay(self.message_bar) # Import the Widget and add to WidgetWindow module = importlib.import_module(self.package) widget = getattr(module, 'Widget')(self) self.widget_dir = os.path.abspath(os.path.dirname(module.__file__)) if hasattr(widget, 'title'): # Use widget title attribute if specified title = widget.title else: # Use the package name title = self.package.split('.')[-1] # Set up the WidgetWindow self.title_bar_label.set_text(title) widget.set_margin_right(5) widget.set_margin_left(5) widget.set_margin_top(5) widget.set_margin_bottom(5) self.widget_box.add(widget) self.add(self.widget_window) if hasattr(widget, 'on_settings_button_pressed'): self.title_bar_button.connect('clicked', widget.on_settings_button_pressed) self.show_all() def set_title(self, title): self.title_bar_label.set_text(title) def show_info(self, *args, **kwargs): self.message_bar.show_info(*args, **kwargs) def show_warning(self, *args, **kwargs): self.message_bar.show_warning(*args, **kwargs) def show_error(self, *args, **kwargs): self.message_bar.show_error(*args, **kwargs) def show_question(self, *args, **kwargs): self.message_bar.show_question(*args, **kwargs) def on_button_press(self, widget, event): # Remove focus when clicking on WidgetWindow self.get_toplevel().set_focus(None) def on_delete_clicked(self, widget): # Remove self from the WidgetArea self.destroy() def show_overlay(self, visible): self.overlay.set_visible(visible) def get_widget_image(self): # Gets an image for use as an icon in the WidgetChooser # Need to implement some way to call from a GUI menu. window = self.window.get_window() if window is None: return width, height = window.get_width(), window.get_height() surface = Gdk.Window.create_similar_surface(window, cairo.CONTENT_COLOR, width, height) cairo_context = cairo.Context(surface) Gdk.cairo_set_source_window(cairo_context, window, 0, 0) cairo_context.paint() surface.write_to_png(os.path.join(self.widget_dir, 'widget.png')) def on_key_press(self, widget, event): # Events that don't need to know about modifiers if event.keyval == Gdk.KEY_Escape: self.get_toplevel().set_focus(None) return True if event.keyval == Gdk.KEY_Delete: self.destroy() # Remove the widget return True if event.keyval == Gdk.KEY_Tab: # TODO Implement move focus to next widget pass # Get any active, but not pressed modifiers, like CapsLock and NumLock persistant_modifiers = Gtk.accelerator_get_default_mod_mask() # Determine the actively pressed modifier modifier = event.get_state() & persistant_modifiers # Bool of Control or Shift modifier states control = modifier == Gdk.ModifierType.CONTROL_MASK shift = modifier == Gdk.ModifierType.SHIFT_MASK # If neither Shift or Control we want to move the Widget if event.keyval == Gdk.KEY_Up and not (shift or control): self.parent.child_incremental_move(self, self.parent.Incremental.Move.UP) elif event.keyval == Gdk.KEY_Down and not (shift or control): self.parent.child_incremental_move( self, self.parent.Incremental.Move.DOWN) elif event.keyval == Gdk.KEY_Left and not (shift or control): self.parent.child_incremental_move( self, self.parent.Incremental.Move.LEFT) elif event.keyval == Gdk.KEY_Right and not (shift or control): self.parent.child_incremental_move( self, self.parent.Incremental.Move.RIGHT) # If either Shift or Control we want to resize the Widget elif event.keyval == Gdk.KEY_Up and (shift or control): self.parent.child_incremental_move( self, self.parent.Incremental.Resize.Height.SMALLER) elif event.keyval == Gdk.KEY_Down and (shift or control): self.parent.child_incremental_move( self, self.parent.Incremental.Resize.Height.BIGGER) elif event.keyval == Gdk.KEY_Left and (shift or control): self.parent.child_incremental_move( self, self.parent.Incremental.Resize.Width.SMALLER) elif event.keyval == Gdk.KEY_Right and (shift or control): self.parent.child_incremental_move( self, self.parent.Incremental.Resize.Width.BIGGER) # Indicate the event was handled return True #=================================== # Drag to Move / Resize #=================================== def on_drag_begin(self, widget, event): self.drag_active = True self.overlay.grab_focus() # Bring self to top of z-order # FIXME this does not work. Why?????? # https://stackoverflow.com/questions/1066012/stacking-widgets-in-gtk # https://lazka.github.io/pgi-docs/#Gdk-3.0/classes/Window.html#Gdk.Window.raise_ self.get_window().raise_() # Get the WidgetArea that self is a child of self.parent = self.get_parent() # Get dimensions of self w = widget.get_allocation().width h = widget.get_allocation().height # Determine what drag action based on position of event if event.y <= 50: self.action = self.parent.Drag.MOVE self.parent.child_move_begin(self, event) elif event.x >= w - 50 and event.y >= h - 50: self.action = self.parent.Drag.RESIZE_XY self.parent.child_resize_begin(self, event) elif event.x >= w - 50: self.action = self.parent.Drag.RESIZE_X self.parent.child_resize_begin(self, event) elif event.y >= h - 50: self.action = self.parent.Drag.RESIZE_Y self.parent.child_resize_begin(self, event) else: self.action = None # Indicate the event was handled return True def on_drag_motion(self, widget, event): if self.action == self.parent.Drag.MOVE: self.parent.child_move_motion(self, event) elif self.action >= self.parent.Drag.RESIZE_X: self.parent.child_resize_motion(self, event, self.action) def on_drag_end(self, widget, event): if not self.drag_active: return if self.action == self.parent.Drag.MOVE: self.parent.child_move_end(self) elif self.action >= self.parent.Drag.RESIZE_X: self.parent.child_resize_end(self) self.drag_active = False
class SearchPage(gtk.VBox): ''' class docs ''' def __init__(self, data_manager): ''' init docs ''' # Init. gtk.VBox.__init__(self) self.data_manager = data_manager self.keywords = [] self.all_pkg_names = [] self.message_bar = MessageBar(18) self.content_box = gtk.VBox() self.treeview = TreeView(enable_drag_drop=False, expand_column=0) global_event.register_event("delete-search-page-items", self.treeview.delete_items) self.cute_message_image = gtk.VBox() self.cute_message_pixbuf = utils.get_common_locale_image_pixbuf("info", "noresult.png") self.cute_message_image.connect("expose-event", self.expose_cute_message_image) self.content_box.pack_start(self.message_bar, False, False) self.content_box.pack_start(self.treeview) self.loading_box = LoadingBox() self.pack_start(self.loading_box, True, True) self.treeview.connect("items-change", self.update_message_bar) self.treeview.draw_mask = self.draw_mask def expose_cute_message_image(self, widget, event): if self.cute_message_pixbuf: cr = widget.window.cairo_create() rect = widget.allocation cr.set_source_rgba(1, 1, 1, 0) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() draw_pixbuf( cr, self.cute_message_pixbuf, rect.x + (rect.width - self.cute_message_pixbuf.get_width()) / 2, rect.y + (rect.height - self.cute_message_pixbuf.get_height()) / 2, ) def update_message_bar(self, treeview): if len(treeview.visible_items) > 0: self.message_bar.set_message( " ".join(self.keywords) + ": " + _("%s applications searched") % len(self.all_pkg_names)) container_remove_all(self) self.pack_start(self.content_box) global_event.emit("update-current-status-pkg-page", treeview) else: container_remove_all(self) self.pack_start(self.cute_message_image) def draw_mask(self, cr, x, y, w, h): ''' Draw mask interface. @param cr: Cairo context. @param x: X coordiante of draw area. @param y: Y coordiante of draw area. @param w: Width of draw area. @param h: Height of draw area. ''' draw_vlinear(cr, x, y, w, h, [(0, ("#FFFFFF", 0.9)), (1, ("#FFFFFF", 0.9)),] ) def update(self, keywords): self.keywords = keywords self.treeview.delete_all_items() self.all_pkg_names = self.data_manager.search_query(keywords) if self.all_pkg_names: if len(self.all_pkg_names) > LOAD_ITEMS_NUMBER: self.load_new_items(self.all_pkg_names[:LOAD_ITEMS_NUMBER]) else: self.load_new_items(self.all_pkg_names) else: self.update_message_bar(self.treeview) self.treeview.scrolled_window.connect('vscrollbar-state-changed', self.scrolled_window_vscrollbar_handler) def scrolled_window_vscrollbar_handler(self, widget, state): if state == "bottom": current_item_number = len(self.treeview.visible_items) all_pkgs_number = len(self.all_pkg_names) start = current_item_number if current_item_number < all_pkgs_number and (current_item_number+LOAD_ITEMS_NUMBER) < all_pkgs_number: end = current_item_number+LOAD_ITEMS_NUMBER elif current_item_number < all_pkgs_number and (current_item_number+LOAD_ITEMS_NUMBER) >= all_pkgs_number: end = all_pkgs_number else: return self.load_new_items(self.all_pkg_names[start:end]) def load_new_items(self, pkg_names): if pkg_names: items = [] for pkg_name in pkg_names: items.append(SearchItem(pkg_name, self.data_manager, self.keywords)) self.treeview.add_items(items) #global_event.emit("show-pkg-view", self.page_box) else: self.update_message_bar(self.treeview)
class SearchPage(gtk.VBox): ''' class docs ''' def __init__(self, data_manager): ''' init docs ''' # Init. gtk.VBox.__init__(self) self.data_manager = data_manager self.keywords = [] self.all_pkg_names = [] self.message_bar = MessageBar(18) self.content_box = gtk.VBox() self.treeview = TreeView(enable_drag_drop=False, expand_column=0) self.cute_message_image = gtk.VBox() self.cute_message_pixbuf = utils.get_common_locale_image_pixbuf("info", "noresult.png") self.cute_message_image.connect("expose-event", self.expose_cute_message_image) self.content_box.pack_start(self.message_bar, False, False) self.content_box.pack_start(self.treeview) self.loading_box = LoadingBox() self.pack_start(self.loading_box, True, True) self.treeview.connect("items-change", self.update_message_bar) self.treeview.draw_mask = self.draw_mask def expose_cute_message_image(self, widget, event): if self.cute_message_pixbuf: cr = widget.window.cairo_create() rect = widget.allocation cr.set_source_rgba(1, 1, 1, 0) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() draw_pixbuf( cr, self.cute_message_pixbuf, rect.x + (rect.width - self.cute_message_pixbuf.get_width()) / 2, rect.y + (rect.height - self.cute_message_pixbuf.get_height()) / 2, ) def update_message_bar(self, treeview): if len(treeview.visible_items) > 0: self.message_bar.set_message(_("%s: %s matched applications") % (' '.join(self.keywords), len(self.all_pkg_names))) container_remove_all(self) self.pack_start(self.content_box) global_event.emit("update-current-status-pkg-page", treeview) else: container_remove_all(self) self.pack_start(self.cute_message_image) def draw_mask(self, cr, x, y, w, h): ''' Draw mask interface. @param cr: Cairo context. @param x: X coordiante of draw area. @param y: Y coordiante of draw area. @param w: Width of draw area. @param h: Height of draw area. ''' draw_vlinear(cr, x, y, w, h, [(0, ("#FFFFFF", 0.9)), (1, ("#FFFFFF", 0.9)),] ) def update(self, keywords): self.keywords = keywords self.treeview.delete_all_items() self.all_pkg_names = self.data_manager.search_query(keywords) if self.all_pkg_names: if len(self.all_pkg_names) > LOAD_ITEMS_NUMBER: self.load_new_items(self.all_pkg_names[:LOAD_ITEMS_NUMBER]) else: self.load_new_items(self.all_pkg_names) else: self.update_message_bar(self.treeview) self.treeview.scrolled_window.connect('vscrollbar-state-changed', self.scrolled_window_vscrollbar_handler) def scrolled_window_vscrollbar_handler(self, widget, state): if state == "bottom": current_item_number = len(self.treeview.visible_items) all_pkgs_number = len(self.all_pkg_names) start = current_item_number if current_item_number < all_pkgs_number and (current_item_number+LOAD_ITEMS_NUMBER) < all_pkgs_number: end = current_item_number+LOAD_ITEMS_NUMBER elif current_item_number < all_pkgs_number and (current_item_number+LOAD_ITEMS_NUMBER) >= all_pkgs_number: end = all_pkgs_number else: return self.load_new_items(self.all_pkg_names[start:end]) def load_new_items(self, pkg_names): if pkg_names: results = self.data_manager.get_search_pkgs_info(pkg_names) self.data_manager.get_pkgs_install_status( pkg_names, reply_handler=lambda status: self.search_reply_handler(status, results), error_handler=handle_dbus_error) else: self.update_message_bar(self.treeview) def search_reply_handler(self, status, results): for (i, result) in enumerate(results): result.append(status[i]) self.render_search_info(results, self.keywords) def render_search_info(self, pkg_infos, keywords): self.keywords = keywords items = [] for pkg_info in pkg_infos: items.append(SearchItem(pkg_info, self.data_manager, keywords)) self.treeview.add_items(items)
class MainWindow(QMainWindow): def __init__(self, parent=None): QMainWindow.__init__(self) self.file_name = None self.initUI(self) def initUI(self, MainWindow): settings = Settings() self.company_details = CompanyDetails() dates = settings.dates row_label = settings.get_list_of_financial_performance_items() MainWindow.setObjectName("MainWindow") MainWindow.setFixedSize(settings.screen_width, settings.screen_height) self.setWindowTitle('Security Analysis ' + settings.version) self.setWindowIcon(QtGui.QIcon('img/graph.png')) self.centralWidget = QtWidgets.QWidget(MainWindow) self.centralWidget.resize(settings.table_width, settings.table_height) width_table = self.centralWidget.width() distance_from_table = settings.distance_from_table distance_between_items = settings.distance_between_items vbox = QtWidgets.QVBoxLayout(self.centralWidget) self.TableWidget = QtWidgets.QTableWidget() vbox.addWidget(self.TableWidget) self.TableWidget.setColumnCount(len(dates)) self.TableWidget.setRowCount(len(row_label)) self.line_input_ticker = QtWidgets.QLineEdit(self) self.line_input_ticker.move(width_table + distance_from_table, 32) line_width = width_table + self.line_input_ticker.width() self.line_input_ticker.resize(70, 33) self.line_input_ticker.setAlignment(Qt.AlignCenter) self.line_input_ticker.setFont(QtGui.QFont("Calibri", 14, QtGui.QFont.Bold)) self.line_input_ticker.setPlaceholderText("----") self.line_input_ticker.setMaxLength(4) self.line_input_ticker.setValidator(Validator(self)) self.line_input_ticker.setToolTip('enter ticker of company') self.information_panel = QtWidgets.QTextEdit(self) self.information_panel.move(width_table + distance_from_table, 84 + distance_between_items*7) self.information_panel.resize(350 , 285) self.information_panel.setFont(QtGui.QFont("Calibri", 12)) self.information_panel.setReadOnly(True) self.message = MessageBar(bar=self.information_panel) self.button_search_info = QtWidgets.QPushButton(QtGui.QIcon('img/Search_find_locate_1892.png'), '', self) self.button_search_info.move(line_width, 32) self.button_search_info.resize(41, 33) self.button_search_info.setToolTip('Click to find and\n' ' fill in the table\n' ' with company information') self.button_search_info.clicked.connect(self.search_info) self.button_to_get_estimate = QtWidgets.QPushButton(QtGui.QIcon('img/a_4466.png'), ' Get estimate', self) self.button_to_get_estimate.move(width_table + distance_from_table, 32 + distance_between_items) self.button_to_get_estimate.resize(130, 33) self.button_to_get_estimate.setStyleSheet("QPushButton {text-align: left;}") self.button_to_get_estimate.clicked.connect(self.obtain_estimate) self.button_save_as = QtWidgets.QPushButton(QtGui.QIcon('img/savetheapplication_guardar_2958.png'), ' Save as', self) self.button_save_as.move(width_table + distance_from_table, 32 + distance_between_items*2) self.button_save_as.resize(130, 33) self.button_save_as.setStyleSheet("QPushButton {text-align: left;}") self.button_save_as.clicked.connect(self.file_save_as) self.button_save = QtWidgets.QPushButton(QtGui.QIcon('img/savetheapplication_guardar_2958.png'), ' Save', self) self.button_save.move(width_table + distance_from_table, 32 + distance_between_items*3) self.button_save.resize(130, 33) self.button_save.setStyleSheet("QPushButton {text-align: left;}") self.button_save.setEnabled(False) self.button_save.clicked.connect(self.file_save) self.button_open = QtWidgets.QPushButton(QtGui.QIcon('img/open-folder_icon-icons.com_70017.png'), ' Open', self) self.button_open.move(width_table + distance_from_table, 32 + distance_between_items*4) self.button_open.resize(130, 33) self.button_open.setStyleSheet("QPushButton {text-align: left;}") self.button_open.clicked.connect(self.file_open) self.button_clear_message = QtWidgets.QPushButton(QtGui.QIcon('img/clear.png'), ' Clear', self) self.button_clear_message.move(width_table + distance_from_table, 32 + distance_between_items*7) self.button_clear_message.resize(130, 33) self.button_clear_message.setStyleSheet("QPushButton {text-align: left;}") self.button_clear_message.clicked.connect(self.message_clear) self.TableWidget.setHorizontalHeaderLabels(dates) self.TableWidget.setVerticalHeaderLabels(row_label) style = """ QTableWidget::item {background-color: white; border-style: outset} QHeaderView::section{Background-color: rgb(230,230,230)} QTableWidget::item:selected {border-width: 1px; color: black ; border-color: green} """ self.setStyleSheet(style) self.show() def file_open(self): file = QtWidgets.QFileDialog.getOpenFileName(self, 'Open File', ".", "Text Files(*.xl* )") if file[0]: self.file_name = file print(self.file_name[0]) xl = xlrd.open_workbook(self.file_name[0], formatting_info=False) sheet = xl.sheet_by_index(0) for i, item in enumerate(Settings().list_of_financial_performance_items, 1): r = sheet.row_values(i) for j, date in enumerate(Settings().dates, 1): if r[0] == Settings().list_of_financial_performance_items[item]: self.company_details.indicators[item][date] = r[j] self.fill_table() self.button_save.setEnabled(True) def file_save_as(self): file = QtWidgets.QFileDialog.getSaveFileName(self, 'Save File', ".", "Text Files(*.xls)") if file[0]: self.file_name = file self.file_save() self.button_save.setEnabled(True) def file_save(self): wb = xlwt.Workbook() ws = wb.add_sheet('Security Analysis') for i, date in enumerate(Settings().dates): ws.write(0, i + 1, date) for i, item in enumerate(Settings().list_of_financial_performance_items.values()): ws.write(i + 1, 0, item) for i, item in enumerate(Settings().list_of_financial_performance_items.keys()): for j, date in enumerate(Settings().dates): ws.write(i + 1, j + 1, self.company_details.indicators[item][date]) try: wb.save(self.file_name[0]) self.message.send_message("Document was saved successfully") except PermissionError: self.message.send_message("Program cannot execute the command, " + "while file is open.") def message_clear(self): self.message.clear() def write_table(self): for i, item in enumerate(Settings().list_of_financial_performance_items.keys()): for j, date in enumerate(Settings().dates): try: value = self.TableWidget.item(i, j).text() except AttributeError: continue if value == 'null': value = '' self.company_details.indicators[item][date] = value def fill_table(self): for i, item in enumerate(Settings().list_of_financial_performance_items.keys()): for j, date in enumerate(Settings().dates): widget_item = QtWidgets.QTableWidgetItem(self.company_details.indicators[item][date]) self.TableWidget.setItem(i, j, widget_item) def obtain_estimate(self): self.button_to_get_estimate.setEnabled(False) QtWidgets.qApp.processEvents() analysis = FundamentalAnalysis(self.company_details) self.message.send_block_message(analysis.gross_margin_estimate(), analysis.sg_and_a_estimate(), analysis.p_e_and_p_bv_estimate(), analysis.net_income_estimate(), analysis.roa_estimate(), analysis.amortization_estimate(), analysis.long_term_debt_estimate(), ticker=self.company_details.ticker) self.button_to_get_estimate.setEnabled(True) def search_info(self): self.button_search_info.setEnabled(False) QtWidgets.qApp.processEvents() ticker = self.line_input_ticker.text() if len(self.line_input_ticker.text()) == 4: self.company_details.cancel_data() search_info = SearchInfo() result = search_info.get_info(ticker.lower(), self.company_details.indicators) self.message.clear() self.message.send_message(str(result)) self.fill_table() else: self.message.send_message('enter ticker') self.button_search_info.setEnabled(True)
class InstallPage(gtk.VBox): ''' class docs ''' def __init__(self, bus_interface, data_manager): ''' init docs ''' # Init. gtk.VBox.__init__(self) self.bus_interface = bus_interface self.data_manager = data_manager self.message_bar = MessageBar(32) self.message_box = gtk.HBox() self.treeview = TreeView(enable_drag_drop=False) self.treeview.set_expand_column(0) self.cute_message_image = gtk.VBox() self.content_box = gtk.VBox() self.pack_start(self.message_box, False, False) self.pack_start(self.content_box, True, True) self.cute_message_pixbuf = utils.get_common_locale_image_pixbuf("info", "no_download.png") self.content_box.pack_start(self.cute_message_image, True, True) self.treeview.draw_mask = self.draw_mask self.cute_message_image.connect("expose-event", self.expose_cute_message_image) self.treeview.connect("items-change", self.update_message_bar) self.treeview.connect("items-change", lambda treeview: global_event.emit("update-install-notify-number", self.get_installing_pkgs_number())) #self.get_action_item("deepin-webapps-baidu-map") #self.download_failed("deepin-webapps-baidu-map") def expose_cute_message_image(self, widget, event): if self.cute_message_pixbuf: cr = widget.window.cairo_create() rect = widget.allocation cr.set_source_rgb(1, 1, 1) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() draw_pixbuf( cr, self.cute_message_pixbuf, rect.x + (rect.width - self.cute_message_pixbuf.get_width()) / 2, rect.y + (rect.height - self.cute_message_pixbuf.get_height()) / 2, ) def update_install_status(self): global_event.emit("update-install-notify-number", self.get_installing_pkgs_number()) self.update_message_bar(self.treeview) def get_installing_pkgs_number(self): items = [] for item in self.treeview.visible_items: if not (item.status == item.STATUS_INSTALL_FINISH or \ item.status == item.STATUS_DOWNLOAD_FAILED): items.append(item) return len(items) def get_installed_pkgs_number(self): items = [] for item in self.treeview.visible_items: if item.status == item.STATUS_INSTALL_FINISH: items.append(item) return len(items) def delete_item_match_pkgname(self, pkg_name): for install_item in self.treeview.visible_items: if install_item.pkg_name == pkg_name: self.treeview.delete_items([install_item]) break def update_message_bar(self, treeview): if self.get_installing_pkgs_number() == 0: if self.get_installed_pkgs_number() == 0: container_remove_all(self.message_box) children = self.content_box.get_children() if len(children) == 0 or children[0] == self.treeview: if self.cute_message_pixbuf == None: self.cute_message_pixbuf = utils.get_common_locale_image_pixbuf("info", "no_download.png") container_remove_all(self.content_box) self.content_box.pack_start(self.cute_message_image, True, True) self.show_all() else: self.message_bar.set_message("") else: container_remove_all(self.message_box) self.message_box.pack_start(self.message_bar, True, True) self.message_bar.set_message(_("%s applications are being installed") % self.get_installing_pkgs_number()) children = self.content_box.get_children() if len(children) == 0 or children[0] == self.cute_message_image: if self.cute_message_pixbuf: del self.cute_message_pixbuf self.cute_message_pixbuf = None container_remove_all(self.content_box) self.content_box.pack_start(self.treeview, True, True) self.show_all() def draw_mask(self, cr, x, y, w, h): ''' Draw mask interface. @param cr: Cairo context. @param x: X coordiante of draw area. @param y: Y coordiante of draw area. @param w: Width of draw area. @param h: Height of draw area. ''' draw_vlinear(cr, x, y, w, h, [(0, ("#FFFFFF", 0.9)), (1, ("#FFFFFF", 0.9)),] ) def update_download_status(self, pkg_infos): pkg_items = [] for (pkg_name, download_status) in pkg_infos: pkg_item = None for item in self.treeview.visible_items: if item.pkg_name == pkg_name: pkg_item = item break if pkg_item == None: pkg_item = InstallItem(pkg_name, self.bus_interface.request_pkgs_install_version([pkg_name])[0], self.data_manager) if download_status == "wait": pkg_item.download_wait() elif download_status == "start": pkg_item.download_start() elif download_status == "update": pkg_item.download_update(0, 0) pkg_items.append(pkg_item) pkg_items = filter(lambda item: item not in self.treeview.visible_items, pkg_items) self.treeview.add_items(pkg_items) def update_action_status(self, pkg_infos): pkg_items = [] for (pkg_name, action_status) in pkg_infos: pkg_item = None for item in self.treeview.visible_items: if item.pkg_name == pkg_name: pkg_item = item break if pkg_item == None: pkg_item = InstallItem(pkg_name, self.bus_interface.request_pkgs_install_version([pkg_name])[0], self.data_manager) if action_status == "wait": pkg_item.download_finish() elif action_status == "start": pkg_item.action_start() elif action_status == "update": pkg_item.action_update(0) pkg_items.append(pkg_item) pkg_items = filter(lambda item: item not in self.treeview.visible_items, pkg_items) self.treeview.add_items(pkg_items) def add_install_actions(self, pkg_names): for pkg_name in pkg_names: self.get_action_item(pkg_name) def get_action_item(self, pkg_name): action_item = None for item in self.treeview.visible_items: if item.pkg_name == pkg_name: action_item = item break if action_item == None: action_item = InstallItem(pkg_name, self.bus_interface.request_pkgs_install_version([pkg_name])[0], self.data_manager) self.treeview.add_items([action_item]) return action_item def download_ready(self, pkg_name): self.get_action_item(pkg_name).download_ready() def download_wait(self, pkg_name): self.get_action_item(pkg_name).download_wait() def download_start(self, pkg_name): self.get_action_item(pkg_name).download_start() def download_update(self, pkg_name, percent, speed): self.get_action_item(pkg_name).download_update(percent, speed) def download_finish(self, pkg_name): self.get_action_item(pkg_name).download_finish() def download_stop(self, pkg_name): self.get_action_item(pkg_name).download_stop() def download_parse_failed(self, pkg_name): self.get_action_item(pkg_name).download_parse_failed() def download_failed(self, pkg_name): self.get_action_item(pkg_name).download_failed() def action_start(self, pkg_name): self.get_action_item(pkg_name).action_start() def action_update(self, pkg_name, percent): self.get_action_item(pkg_name).action_update(percent) def action_finish(self, pkg_name, pkg_info_list): self.get_action_item(pkg_name).action_finish()
def initUI(self, MainWindow): settings = Settings() self.company_details = CompanyDetails() dates = settings.dates row_label = settings.get_list_of_financial_performance_items() MainWindow.setObjectName("MainWindow") MainWindow.setFixedSize(settings.screen_width, settings.screen_height) self.setWindowTitle('Security Analysis ' + settings.version) self.setWindowIcon(QtGui.QIcon('img/graph.png')) self.centralWidget = QtWidgets.QWidget(MainWindow) self.centralWidget.resize(settings.table_width, settings.table_height) width_table = self.centralWidget.width() distance_from_table = settings.distance_from_table distance_between_items = settings.distance_between_items vbox = QtWidgets.QVBoxLayout(self.centralWidget) self.TableWidget = QtWidgets.QTableWidget() vbox.addWidget(self.TableWidget) self.TableWidget.setColumnCount(len(dates)) self.TableWidget.setRowCount(len(row_label)) self.line_input_ticker = QtWidgets.QLineEdit(self) self.line_input_ticker.move(width_table + distance_from_table, 32) line_width = width_table + self.line_input_ticker.width() self.line_input_ticker.resize(70, 33) self.line_input_ticker.setAlignment(Qt.AlignCenter) self.line_input_ticker.setFont(QtGui.QFont("Calibri", 14, QtGui.QFont.Bold)) self.line_input_ticker.setPlaceholderText("----") self.line_input_ticker.setMaxLength(4) self.line_input_ticker.setValidator(Validator(self)) self.line_input_ticker.setToolTip('enter ticker of company') self.information_panel = QtWidgets.QTextEdit(self) self.information_panel.move(width_table + distance_from_table, 84 + distance_between_items*7) self.information_panel.resize(350 , 285) self.information_panel.setFont(QtGui.QFont("Calibri", 12)) self.information_panel.setReadOnly(True) self.message = MessageBar(bar=self.information_panel) self.button_search_info = QtWidgets.QPushButton(QtGui.QIcon('img/Search_find_locate_1892.png'), '', self) self.button_search_info.move(line_width, 32) self.button_search_info.resize(41, 33) self.button_search_info.setToolTip('Click to find and\n' ' fill in the table\n' ' with company information') self.button_search_info.clicked.connect(self.search_info) self.button_to_get_estimate = QtWidgets.QPushButton(QtGui.QIcon('img/a_4466.png'), ' Get estimate', self) self.button_to_get_estimate.move(width_table + distance_from_table, 32 + distance_between_items) self.button_to_get_estimate.resize(130, 33) self.button_to_get_estimate.setStyleSheet("QPushButton {text-align: left;}") self.button_to_get_estimate.clicked.connect(self.obtain_estimate) self.button_save_as = QtWidgets.QPushButton(QtGui.QIcon('img/savetheapplication_guardar_2958.png'), ' Save as', self) self.button_save_as.move(width_table + distance_from_table, 32 + distance_between_items*2) self.button_save_as.resize(130, 33) self.button_save_as.setStyleSheet("QPushButton {text-align: left;}") self.button_save_as.clicked.connect(self.file_save_as) self.button_save = QtWidgets.QPushButton(QtGui.QIcon('img/savetheapplication_guardar_2958.png'), ' Save', self) self.button_save.move(width_table + distance_from_table, 32 + distance_between_items*3) self.button_save.resize(130, 33) self.button_save.setStyleSheet("QPushButton {text-align: left;}") self.button_save.setEnabled(False) self.button_save.clicked.connect(self.file_save) self.button_open = QtWidgets.QPushButton(QtGui.QIcon('img/open-folder_icon-icons.com_70017.png'), ' Open', self) self.button_open.move(width_table + distance_from_table, 32 + distance_between_items*4) self.button_open.resize(130, 33) self.button_open.setStyleSheet("QPushButton {text-align: left;}") self.button_open.clicked.connect(self.file_open) self.button_clear_message = QtWidgets.QPushButton(QtGui.QIcon('img/clear.png'), ' Clear', self) self.button_clear_message.move(width_table + distance_from_table, 32 + distance_between_items*7) self.button_clear_message.resize(130, 33) self.button_clear_message.setStyleSheet("QPushButton {text-align: left;}") self.button_clear_message.clicked.connect(self.message_clear) self.TableWidget.setHorizontalHeaderLabels(dates) self.TableWidget.setVerticalHeaderLabels(row_label) style = """ QTableWidget::item {background-color: white; border-style: outset} QHeaderView::section{Background-color: rgb(230,230,230)} QTableWidget::item:selected {border-width: 1px; color: black ; border-color: green} """ self.setStyleSheet(style) self.show()
class InstallPage(gtk.VBox): ''' class docs ''' def __init__(self, bus_interface, data_manager): ''' init docs ''' # Init. gtk.VBox.__init__(self) self.bus_interface = bus_interface self.data_manager = data_manager self.message_bar = MessageBar(32) self.message_box = gtk.HBox() self.treeview = TreeView(enable_drag_drop=False) self.treeview.set_expand_column(0) self.cute_message_image = gtk.VBox() self.content_box = gtk.VBox() self.pack_start(self.message_box, False, False) self.pack_start(self.content_box, True, True) self.cute_message_pixbuf = utils.get_common_locale_image_pixbuf( "info", "no_download.png") self.content_box.pack_start(self.cute_message_image, True, True) self.treeview.draw_mask = self.draw_mask self.cute_message_image.connect("expose-event", self.expose_cute_message_image) self.treeview.connect("items-change", self.update_message_bar) self.treeview.connect( "items-change", lambda treeview: global_event.emit( "update-install-notify-number", self.get_installing_pkgs_number())) #self.get_action_item("deepin-webapps-baidu-map") #self.download_failed("deepin-webapps-baidu-map") def expose_cute_message_image(self, widget, event): if self.cute_message_pixbuf: cr = widget.window.cairo_create() rect = widget.allocation cr.set_source_rgb(1, 1, 1) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() draw_pixbuf( cr, self.cute_message_pixbuf, rect.x + (rect.width - self.cute_message_pixbuf.get_width()) / 2, rect.y + (rect.height - self.cute_message_pixbuf.get_height()) / 2, ) def update_install_status(self): global_event.emit("update-install-notify-number", self.get_installing_pkgs_number()) self.update_message_bar(self.treeview) def get_installing_pkgs_number(self): items = [] for item in self.treeview.visible_items: if not (item.status == item.STATUS_INSTALL_FINISH or \ item.status == item.STATUS_DOWNLOAD_FAILED): items.append(item) return len(items) def get_installed_pkgs_number(self): items = [] for item in self.treeview.visible_items: if item.status == item.STATUS_INSTALL_FINISH: items.append(item) return len(items) def delete_item_match_pkgname(self, pkg_name): for install_item in self.treeview.visible_items: if install_item.pkg_name == pkg_name: self.treeview.delete_items([install_item]) break def update_message_bar(self, treeview): if self.get_installing_pkgs_number() == 0: if self.get_installed_pkgs_number() == 0: container_remove_all(self.message_box) children = self.content_box.get_children() if len(children) == 0 or children[0] == self.treeview: if self.cute_message_pixbuf == None: self.cute_message_pixbuf = utils.get_common_locale_image_pixbuf( "info", "no_download.png") container_remove_all(self.content_box) self.content_box.pack_start(self.cute_message_image, True, True) self.show_all() else: self.message_bar.set_message("") else: container_remove_all(self.message_box) self.message_box.pack_start(self.message_bar, True, True) self.message_bar.set_message( _("%s applications are being installed") % self.get_installing_pkgs_number()) children = self.content_box.get_children() if len(children) == 0 or children[0] == self.cute_message_image: if self.cute_message_pixbuf: del self.cute_message_pixbuf self.cute_message_pixbuf = None container_remove_all(self.content_box) self.content_box.pack_start(self.treeview, True, True) self.show_all() def draw_mask(self, cr, x, y, w, h): ''' Draw mask interface. @param cr: Cairo context. @param x: X coordiante of draw area. @param y: Y coordiante of draw area. @param w: Width of draw area. @param h: Height of draw area. ''' draw_vlinear(cr, x, y, w, h, [ (0, ("#FFFFFF", 0.9)), (1, ("#FFFFFF", 0.9)), ]) def update_download_status(self, pkg_infos): pkg_items = [] for (pkg_name, download_status) in pkg_infos: pkg_item = None for item in self.treeview.visible_items: if item.pkg_name == pkg_name: pkg_item = item break if pkg_item == None: pkg_item = InstallItem( pkg_name, self.bus_interface.request_pkgs_install_version([pkg_name ])[0], self.data_manager) if download_status == "wait": pkg_item.download_wait() elif download_status == "start": pkg_item.download_start() elif download_status == "update": pkg_item.download_update(0, 0) pkg_items.append(pkg_item) pkg_items = filter( lambda item: item not in self.treeview.visible_items, pkg_items) self.treeview.add_items(pkg_items) def update_action_status(self, pkg_infos): pkg_items = [] for (pkg_name, action_status) in pkg_infos: pkg_item = None for item in self.treeview.visible_items: if item.pkg_name == pkg_name: pkg_item = item break if pkg_item == None: pkg_item = InstallItem( pkg_name, self.bus_interface.request_pkgs_install_version([pkg_name ])[0], self.data_manager) if action_status == "wait": pkg_item.download_finish() elif action_status == "start": pkg_item.action_start() elif action_status == "update": pkg_item.action_update(0) pkg_items.append(pkg_item) pkg_items = filter( lambda item: item not in self.treeview.visible_items, pkg_items) self.treeview.add_items(pkg_items) def add_install_actions(self, pkg_names): for pkg_name in pkg_names: self.get_action_item(pkg_name) def get_action_item(self, pkg_name): action_item = None for item in self.treeview.visible_items: if item.pkg_name == pkg_name: action_item = item break if action_item == None: action_item = InstallItem( pkg_name, self.bus_interface.request_pkgs_install_version([pkg_name])[0], self.data_manager) self.treeview.add_items([action_item]) return action_item def download_ready(self, pkg_name): self.get_action_item(pkg_name).download_ready() def download_wait(self, pkg_name): self.get_action_item(pkg_name).download_wait() def download_start(self, pkg_name): self.get_action_item(pkg_name).download_start() def download_update(self, pkg_name, percent, speed): self.get_action_item(pkg_name).download_update(percent, speed) def download_finish(self, pkg_name): self.get_action_item(pkg_name).download_finish() def download_stop(self, pkg_name): self.get_action_item(pkg_name).download_stop() def download_parse_failed(self, pkg_name): self.get_action_item(pkg_name).download_parse_failed() def download_failed(self, pkg_name): self.get_action_item(pkg_name).download_failed() def action_start(self, pkg_name): self.get_action_item(pkg_name).action_start() def action_update(self, pkg_name, percent): self.get_action_item(pkg_name).action_update(percent) def action_finish(self, pkg_name, pkg_info_list): self.get_action_item(pkg_name).action_finish()
class CategoryItem(TreeItem): ''' class docs ''' def __init__(self, index, first_category_name, data_manager): ''' init docs ''' TreeItem.__init__(self) self.index = index self.first_category_name = first_category_name self.data_manager = data_manager def render_name(self, cr, rect): text_color = "#333333" font_image_color = app_theme.get_color("sidebar_select").get_color() if self.is_select: cr.set_source_rgba(*color_hex_to_cairo( app_theme.get_color("sidebar_select").get_color())) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() text_color = "#FFFFFF" font_image_color = "#FFFFFF" elif self.is_hover: cr.set_source_rgba(*color_hex_to_cairo( app_theme.get_color("sidebar_hover").get_color())) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() pixbuf = app_theme.get_pixbuf("category/%s.png" % (self.index)).get_pixbuf() category_img_path = os.path.join(get_parent_dir(__file__, 2), "image", "category", "%s.png" % (self.index + 1, )) surface = cairo.ImageSurface.create_from_png(category_img_path) cr.set_source_rgb(*color_hex_to_cairo(font_image_color)) cr.mask_surface(surface, rect.x + 14, rect.y + (rect.height - 24) / 2) draw_text( cr, get_category_name(self.first_category_name), rect.x + pixbuf.get_width() + 22, rect.y, rect.width, rect.height, text_size=CATEGORY_ITEM_NAME_SIZE, text_color=text_color, ) if self.is_hover: if self.is_expand: pixbuf = app_theme.get_pixbuf("sidebar/close.png").get_pixbuf() else: pixbuf = app_theme.get_pixbuf("sidebar/open.png").get_pixbuf() draw_pixbuf(cr, pixbuf, rect.x + rect.width - CATEGORY_ITEM_EXPAND_PADDING_X, rect.y + (rect.height - pixbuf.get_height()) / 2) def get_height(self): return CATEGORY_ITEM_HEIGHT def get_column_widths(self): return [CATEGORY_ITEM_NAME_WIDTH] def get_column_renders(self): return [self.render_name] def hover(self, column, offset_x, offset_y): self.is_hover = True if self.redraw_request_callback: self.redraw_request_callback(self) def unhover(self, column, offset_x, offset_y): self.is_hover = False if self.redraw_request_callback: self.redraw_request_callback(self) def select(self): self.is_select = True if self.redraw_request_callback: self.redraw_request_callback(self) def unselect(self): self.is_select = False if self.redraw_request_callback: self.redraw_request_callback(self) def is_in_expand_button_area(self, column, offset_x, offset_y): pixbuf = app_theme.get_pixbuf("sidebar/close.png").get_pixbuf() return is_in_rect( (offset_x, offset_y), (CATEGORY_VIEW_WIDTH - CATEGORY_ITEM_EXPAND_PADDING_X, (self.get_height() - pixbuf.get_height()) / 2, pixbuf.get_width(), pixbuf.get_height())) def motion_notify(self, column, offset_x, offset_y): if self.is_in_expand_button_area(column, offset_x, offset_y): global_event.emit("set-cursor", gtk.gdk.HAND2) else: global_event.emit("set-cursor", None) def button_press(self, column, offset_x, offset_y): if self.is_in_expand_button_area(column, offset_x, offset_y): if self.is_expand: self.unexpand() else: self.expand() def scrolled_window_vscrollbar_handler(self, widget, state): if state == "bottom": current_item_number = len(self.pkg_icon_view.items) all_pkgs_number = len(self.all_pkg_names) start = current_item_number if current_item_number < all_pkgs_number and ( current_item_number + LOAD_ITEMS_NUMBER) < all_pkgs_number: end = current_item_number + LOAD_ITEMS_NUMBER elif current_item_number < all_pkgs_number and ( current_item_number + LOAD_ITEMS_NUMBER) >= all_pkgs_number: end = all_pkgs_number else: return self.load_new_items(self.all_pkg_names[start:end]) def load_new_items(self, pkg_names): items = [] for pkg_name in pkg_names: info = self.data_manager.get_item_pkg_info(pkg_name) items.append( PkgIconItem(info[0], info[1], info[2], self.data_manager)) self.pkg_icon_view.add_items(items) global_event.emit("show-pkg-view", self.page_box) def handle_pkg_install_status_request(self, status, items): for (index, state) in enumerate(status): items[index].is_installed = state items[index].emit_redraw_request() def single_click(self, column, offset_x, offset_y): # init Loading widget loading_box = LoadingBox() global_event.emit("show-pkg-view", loading_box) self.page_box = gtk.VBox() self.all_pkg_names = [] self.all_desktop_infos = {} self.all_pkg_names = self.data_manager.get_first_category_packages( self.first_category_name) self.message_bar = MessageBar(18) self.message_bar.set_message( _("%s: %s applications") % ( get_category_name(self.first_category_name), len(self.all_pkg_names), )) self.pkg_icon_view = IconView() self.pkg_icon_view.connect("motion-notify-item", tooltip_aciton) if len(self.all_pkg_names) > LOAD_ITEMS_NUMBER: self.load_new_items(self.all_pkg_names[:LOAD_ITEMS_NUMBER]) else: self.load_new_items(self.all_pkg_names) self.pkg_icon_view.draw_mask = self.draw_mask self.pkg_icon_view.draw_row_mask = self.draw_row_mask self.pkg_icon_scrolled_window = ScrolledWindow() self.pkg_icon_scrolled_window.connect( "vscrollbar-state-changed", self.scrolled_window_vscrollbar_handler) self.pkg_icon_scrolled_window.add_child(self.pkg_icon_view) self.page_box.pack_start(self.message_bar, False, False) self.page_box.pack_start(self.pkg_icon_scrolled_window, True, True) global_event.emit("update-current-status-pkg-page", self.pkg_icon_view) def draw_row_mask(self, cr, rect, row): if row % 2 == 1: cr.set_source_rgba(1, 1, 1, 0.5) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() def draw_mask(self, cr, x, y, w, h): ''' Draw mask interface. @param cr: Cairo context. @param x: X coordiante of draw area. @param y: Y coordiante of draw area. @param w: Width of draw area. @param h: Height of draw area. ''' draw_vlinear(cr, x, y, w, h, [ (0, ("#FFFFFF", 0.9)), (1, ("#FFFFFF", 0.9)), ]) def double_click(self, column, offset_x, offset_y): if self.is_expand: self.unexpand() else: self.expand() def add_child_item(self): items = [] second_category_names = self.data_manager.get_second_category( self.first_category_name) for second_category_name in second_category_names: items.append( SecondCategoryItem(self.first_category_name, second_category_name, self.data_manager)) self.child_items = items self.add_items_callback(self.child_items, self.row_index + 1) def delete_chlid_item(self): self.delete_items_callback(self.child_items) def expand(self): self.is_expand = True self.add_child_item() if self.redraw_request_callback: self.redraw_request_callback(self) global_event.emit("category-expand", self) def unexpand(self): self.is_expand = False self.delete_chlid_item() if self.redraw_request_callback: self.redraw_request_callback(self)
class SecondCategoryItem(TreeItem): ''' class docs ''' def __init__(self, first_category_name, second_category_name, data_manager): ''' init docs ''' TreeItem.__init__(self) self.first_category_name = first_category_name self.second_category_name = second_category_name self.data_manager = data_manager def render_name(self, cr, rect): text_color = "#333333" if self.is_select: cr.set_source_rgba(*color_hex_to_cairo( app_theme.get_color("sidebar_select").get_color())) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() text_color = "#FFFFFF" elif self.is_hover: cr.set_source_rgba(*color_hex_to_cairo( app_theme.get_color("sidebar_hover").get_color())) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() draw_text( cr, get_category_name(self.second_category_name), rect.x + SECOND_CATEGORY_PADDING_X, rect.y, rect.width, rect.height, text_size=SECOND_CATEGORY_ITEM_NAME_SIZE, text_color=text_color, ) def get_height(self): return SECOND_CATEGORY_ITEM_HEIGHT def get_column_widths(self): return [CATEGORY_ITEM_NAME_WIDTH] def get_column_renders(self): return [self.render_name] def hover(self, column, offset_x, offset_y): self.is_hover = True if self.redraw_request_callback: self.redraw_request_callback(self) def unhover(self, column, offset_x, offset_y): self.is_hover = False if self.redraw_request_callback: self.redraw_request_callback(self) def select(self): self.is_select = True if self.redraw_request_callback: self.redraw_request_callback(self) def unselect(self): self.is_select = False if self.redraw_request_callback: self.redraw_request_callback(self) def scrolled_window_vscrollbar_handler(self, widget, state): if state == "bottom": current_item_number = len(self.pkg_icon_view.items) all_pkgs_number = len(self.all_pkg_names) start = current_item_number if current_item_number < all_pkgs_number and ( current_item_number + LOAD_ITEMS_NUMBER) < all_pkgs_number: end = current_item_number + LOAD_ITEMS_NUMBER elif current_item_number < all_pkgs_number and ( current_item_number + LOAD_ITEMS_NUMBER) >= all_pkgs_number: end = all_pkgs_number else: return self.load_new_items(self.all_pkg_names[start:end]) def load_new_items(self, pkg_names): items = [] for pkg_name in pkg_names: info = self.data_manager.get_item_pkg_info(pkg_name) items.append( PkgIconItem(info[0], info[1], info[2], self.data_manager)) self.pkg_icon_view.add_items(items) global_event.emit("show-pkg-view", self.page_box) def handle_pkg_install_status_request(self, status, items): for (index, state) in enumerate(status): items[index].is_installed = state items[index].emit_redraw_request() def button_press(self, column, offset_x, offset_y): # init Loading widget loading_box = LoadingBox() global_event.emit("show-pkg-view", loading_box) self.page_box = gtk.VBox() self.all_pkg_names = self.data_manager.get_second_category_packages( self.second_category_name) self.message_bar = MessageBar(18) self.message_bar.set_message( _("%s > %s : %s applications") % ( get_category_name(self.first_category_name), get_category_name(self.second_category_name), len(self.all_pkg_names), )) self.pkg_icon_view = IconView() self.pkg_icon_view.connect("motion-notify-item", tooltip_aciton) if len(self.all_pkg_names) > LOAD_ITEMS_NUMBER: self.load_new_items(self.all_pkg_names[:LOAD_ITEMS_NUMBER]) else: self.load_new_items(self.all_pkg_names) self.pkg_icon_scrolled_window = ScrolledWindow() self.pkg_icon_scrolled_window.connect( "vscrollbar-state-changed", self.scrolled_window_vscrollbar_handler) self.pkg_icon_scrolled_window.add_child(self.pkg_icon_view) self.pkg_icon_view.draw_mask = self.draw_mask self.pkg_icon_view.draw_row_mask = self.draw_row_mask self.page_box.pack_start(self.message_bar, False, False) self.page_box.pack_start(self.pkg_icon_scrolled_window, True, True) global_event.emit("update-current-status-pkg-page", self.pkg_icon_view) def draw_row_mask(self, cr, rect, row): if row % 2 == 1: cr.set_source_rgba(1, 1, 1, 0.5) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() def draw_mask(self, cr, x, y, w, h): ''' Draw mask interface. @param cr: Cairo context. @param x: X coordiante of draw area. @param y: Y coordiante of draw area. @param w: Width of draw area. @param h: Height of draw area. ''' draw_vlinear(cr, x, y, w, h, [ (0, ("#FFFFFF", 0.9)), (1, ("#FFFFFF", 0.9)), ])
def __init__(self, package): Gtk.EventBox.__init__(self) self.package = package self.action = None self.drag_active = False # Add style class self.style_context = self.get_style_context() self.style_context.add_class("WidgetWindow") # Used to remove focus when clicking a non focusable widget self.connect('button-press-event', self.on_button_press) builder = Gtk.Builder() builder.add_from_file(UI_FILE) builder.connect_signals(self) # WidgetWindow - the whole thing self.widget_window = builder.get_object('widget_window') # Overlay - covers the whole window to catch event for drag/resize self.overlay = builder.get_object('overlay') self.overlay.add_events(Gdk.EventMask.KEY_PRESS_MASK) self.overlay_style_context = self.overlay.get_style_context() # The inner window, used only for getting the icon image self.window = builder.get_object('window') # TitleBar - the title bar at the top of the window self.title_bar = builder.get_object('title_bar') self.title_bar_label = builder.get_object('title_bar_label') self.title_bar_button = builder.get_object('title_bar_button') # WidgetBox - the box that the widget actually gets added to self.widget_box = builder.get_object('widget_box') # MessageBar self.message_bar = MessageBar() self.widget_box.add_overlay(self.message_bar) # Import the Widget and add to WidgetWindow module = importlib.import_module(self.package) widget = getattr(module, 'Widget')(self) self.widget_dir = os.path.abspath(os.path.dirname(module.__file__)) if hasattr(widget, 'title'): # Use widget title attribute if specified title = widget.title else: # Use the package name title = self.package.split('.')[-1] # Set up the WidgetWindow self.title_bar_label.set_text(title) widget.set_margin_right(5) widget.set_margin_left(5) widget.set_margin_top(5) widget.set_margin_bottom(5) self.widget_box.add(widget) self.add(self.widget_window) if hasattr(widget, 'on_settings_button_pressed'): self.title_bar_button.connect('clicked', widget.on_settings_button_pressed) self.show_all()
class ExposureWidget(QtGui.QWidget): table_attrs = [ {'addBtn': 0, 'delBtn': 0, 'viewclass': CustomTableView}, {'addBtn': 1, 'delBtn': 1, 'viewclass': CustomTableView}, {'addBtn': 1, 'delBtn': 1, 'viewclass': CustomTableView}, {'addBtn': 1, 'delBtn': 1, 'viewclass': CustomTableView}, {'addBtn': 1, 'delBtn': 1, 'viewclass': CustomTableView}, {'addBtn': 1, 'delBtn': 1, 'viewclass': CustomTableView}, ] def __init__(self, tableset, nrmlfile, parent=None): QtGui.QWidget.__init__(self, parent) self.tableset = tableset self.nrmlfile = nrmlfile self.message_bar = MessageBar(nrmlfile, self) self.tables = [tableset.tableExposure, tableset.tableCostType, tableset.tableLocation, tableset.tableAsset, tableset.tableCost, tableset.tableOccupancy] self.tv = collections.OrderedDict() for table, attr in zip(self.tables, self.table_attrs): table.attr.update(attr) tv = attr['viewclass'](table, self.getdefault) if len(table) == 0: # hide empty tables tv.hide() tv.tableModel.validationFailed.connect( lambda idx, err, tv=tv: self.show_validation_error(tv, idx, err)) self.tv[table.name] = tv self.setupUi() self.tv['tableLocation'].tableView.clicked.connect( self.show_asset) self.tv['tableAsset'].tableView.clicked.connect( self.show_cost_occupancy) def setupUi(self): layout = QtGui.QVBoxLayout() hlayout1 = QtGui.QHBoxLayout() hlayout2 = QtGui.QHBoxLayout() layout.addWidget(self.message_bar) hlayout1.addWidget(self.tv['tableExposure']) hlayout1.addWidget(self.tv['tableCostType']) hlayout1.addWidget(self.tv['tableLocation']) layout.addLayout(hlayout1) hlayout2.addWidget(self.tv['tableAsset']) hlayout2.addWidget(self.tv['tableCost']) hlayout2.addWidget(self.tv['tableOccupancy']) layout.addLayout(hlayout2) self.setLayout(layout) self.setSizePolicy( QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.MinimumExpanding) self.tv['tableAsset'].tableView.hideColumn(0) self.tv['tableCost'].tableView.hideColumn(0) self.tv['tableOccupancy'].tableView.hideColumn(0) self.tv['tableLocation'].tableView.hideColumn(0) self.show_asset(index(0, 0)) self.show_cost_occupancy(index(0, 0)) @QtCore.pyqtSlot(QtCore.QModelIndex, Exception) def show_validation_error(self, table_view, index, error): record = table_view.tableModel.table[index.row()] fieldname = record.fields[index.column()].name message = '%s: %s' % (fieldname, error) self.message_bar.show_message(message) def show_asset(self, row): # show only the assets at the given location try: loc_id, = self.tv['tableLocation'].tableModel.primaryKey(row) except IndexError: # empty table, nothing to show return self.tv['tableAsset'].showOnCondition( lambda rec: rec['location_id'] == loc_id) # reset Cost and Occupancy self.tv['tableCost'].showOnCondition(lambda rec: False) self.tv['tableOccupancy'].showOnCondition(lambda rec: False) def show_cost_occupancy(self, row): try: asset_ref, = self.tv['tableAsset'].tableModel.primaryKey(row) except IndexError: # empty table, nothing to show return # show only the rows corresponding to asset_ref self.tv['tableCost'].showOnCondition( lambda rec: rec['asset_ref'] == asset_ref) # show only the rows corresponding to asset_ref self.tv['tableOccupancy'].showOnCondition( lambda rec: rec['asset_ref'] == asset_ref) def getdefault(self, table): if table.name == 'tableAsset': return self.tv['tableLocation'].current_record()[:1] elif table.name in ('tableCost', 'tableOccupancy'): return [self.tv['tableAsset'].current_record()[1]] else: return []
class CategoryItem(TreeItem): ''' class docs ''' def __init__(self, index, first_category_name, data_manager): ''' init docs ''' TreeItem.__init__(self) self.index = index self.first_category_name = first_category_name self.data_manager = data_manager def render_name(self, cr, rect): text_color = "#333333" font_image_color = app_theme.get_color("sidebar_select").get_color() if self.is_select: cr.set_source_rgba(*color_hex_to_cairo(app_theme.get_color("sidebar_select").get_color())) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() text_color = "#FFFFFF" font_image_color = "#FFFFFF" elif self.is_hover: cr.set_source_rgba(*color_hex_to_cairo(app_theme.get_color("sidebar_hover").get_color())) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() pixbuf = app_theme.get_pixbuf("category/%s.png" % (self.index)).get_pixbuf() category_img_path = os.path.join(get_parent_dir(__file__, 2), "image", "category", "%s.png" % (self.index+1, )) surface = cairo.ImageSurface.create_from_png(category_img_path) cr.set_source_rgb(*color_hex_to_cairo(font_image_color)) cr.mask_surface(surface, rect.x+14, rect.y+(rect.height-24)/2) draw_text(cr, get_category_name(self.first_category_name), rect.x + pixbuf.get_width() + 22, rect.y, rect.width, rect.height, text_size=CATEGORY_ITEM_NAME_SIZE, text_color=text_color, ) if self.is_hover: if self.is_expand: pixbuf = app_theme.get_pixbuf("sidebar/close.png").get_pixbuf() else: pixbuf = app_theme.get_pixbuf("sidebar/open.png").get_pixbuf() draw_pixbuf( cr, pixbuf, rect.x + rect.width - CATEGORY_ITEM_EXPAND_PADDING_X, rect.y + (rect.height - pixbuf.get_height()) / 2) def get_height(self): return CATEGORY_ITEM_HEIGHT def get_column_widths(self): return [CATEGORY_ITEM_NAME_WIDTH] def get_column_renders(self): return [self.render_name] def hover(self, column, offset_x, offset_y): self.is_hover = True if self.redraw_request_callback: self.redraw_request_callback(self) def unhover(self, column, offset_x, offset_y): self.is_hover = False if self.redraw_request_callback: self.redraw_request_callback(self) def select(self): self.is_select = True if self.redraw_request_callback: self.redraw_request_callback(self) def unselect(self): self.is_select = False if self.redraw_request_callback: self.redraw_request_callback(self) def is_in_expand_button_area(self, column, offset_x, offset_y): pixbuf = app_theme.get_pixbuf("sidebar/close.png").get_pixbuf() return is_in_rect((offset_x, offset_y), (CATEGORY_VIEW_WIDTH - CATEGORY_ITEM_EXPAND_PADDING_X, (self.get_height() - pixbuf.get_height()) / 2, pixbuf.get_width(), pixbuf.get_height())) def motion_notify(self, column, offset_x, offset_y): if self.is_in_expand_button_area(column, offset_x, offset_y): global_event.emit("set-cursor", gtk.gdk.HAND2) else: global_event.emit("set-cursor", None) def button_press(self, column, offset_x, offset_y): if self.is_in_expand_button_area(column, offset_x, offset_y): if self.is_expand: self.unexpand() else: self.expand() def scrolled_window_vscrollbar_handler(self, widget, state): if state == "bottom": current_item_number = len(self.pkg_icon_view.items) all_pkgs_number = len(self.all_pkg_names) start = current_item_number if current_item_number < all_pkgs_number and (current_item_number+LOAD_ITEMS_NUMBER) < all_pkgs_number: end = current_item_number+LOAD_ITEMS_NUMBER elif current_item_number < all_pkgs_number and (current_item_number+LOAD_ITEMS_NUMBER) >= all_pkgs_number: end = all_pkgs_number else: return self.load_new_items(self.all_pkg_names[start:end]) def load_new_items(self, pkg_names): items = [] for pkg_name in pkg_names: info = self.data_manager.get_item_pkg_info(pkg_name) items.append(PkgIconItem(info[0], info[1], info[2], self.data_manager)) self.pkg_icon_view.add_items(items) global_event.emit("show-pkg-view", self.page_box) def handle_pkg_install_status_request(self, status, items): for (index, state) in enumerate(status): items[index].is_installed = state items[index].emit_redraw_request() def single_click(self, column, offset_x, offset_y): # init Loading widget loading_box = LoadingBox() global_event.emit("show-pkg-view", loading_box) self.page_box = gtk.VBox() self.all_pkg_names = [] self.all_desktop_infos = {} self.all_pkg_names = self.data_manager.get_first_category_packages(self.first_category_name) self.message_bar = MessageBar(18) self.message_bar.set_message(_("%s: %s applications") % ( get_category_name(self.first_category_name), len(self.all_pkg_names), )) self.pkg_icon_view = IconView() self.pkg_icon_view.connect("motion-notify-item", tooltip_aciton) if len(self.all_pkg_names) > LOAD_ITEMS_NUMBER: self.load_new_items(self.all_pkg_names[:LOAD_ITEMS_NUMBER]) else: self.load_new_items(self.all_pkg_names) self.pkg_icon_view.draw_mask = self.draw_mask self.pkg_icon_view.draw_row_mask = self.draw_row_mask self.pkg_icon_scrolled_window = ScrolledWindow() self.pkg_icon_scrolled_window.connect("vscrollbar-state-changed", self.scrolled_window_vscrollbar_handler) self.pkg_icon_scrolled_window.add_child(self.pkg_icon_view) self.page_box.pack_start(self.message_bar, False, False) self.page_box.pack_start(self.pkg_icon_scrolled_window, True, True) global_event.emit("update-current-status-pkg-page", self.pkg_icon_view) def draw_row_mask(self, cr, rect, row): if row % 2 == 1: cr.set_source_rgba(1, 1, 1, 0.5) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() def draw_mask(self, cr, x, y, w, h): ''' Draw mask interface. @param cr: Cairo context. @param x: X coordiante of draw area. @param y: Y coordiante of draw area. @param w: Width of draw area. @param h: Height of draw area. ''' draw_vlinear(cr, x, y, w, h, [(0, ("#FFFFFF", 0.9)), (1, ("#FFFFFF", 0.9)),] ) def double_click(self, column, offset_x, offset_y): if self.is_expand: self.unexpand() else: self.expand() def add_child_item(self): items = [] second_category_names = self.data_manager.get_second_category(self.first_category_name) for second_category_name in second_category_names: items.append(SecondCategoryItem(self.first_category_name, second_category_name, self.data_manager)) self.child_items = items self.add_items_callback(self.child_items, self.row_index + 1) def delete_chlid_item(self): self.delete_items_callback(self.child_items) def expand(self): self.is_expand = True self.add_child_item() if self.redraw_request_callback: self.redraw_request_callback(self) global_event.emit("category-expand", self) def unexpand(self): self.is_expand = False self.delete_chlid_item() if self.redraw_request_callback: self.redraw_request_callback(self)
class TripleTableWidget(QtGui.QWidget): table_attrs = [ {'addBtn': 1, 'delBtn': 1}, {'addBtn': 1, 'delBtn': 1}, {'addBtn': 1, 'delBtn': 1}, ] def __init__(self, tableset, nrmlfile, parent=None): QtGui.QWidget.__init__(self, parent) self.tableset = tableset self.nrmlfile = nrmlfile self.message_bar = MessageBar(nrmlfile, self) self.init_tv() # this goes before setupUi self.setupUi() def init_tv(self): self.tv = collections.OrderedDict() n_attrs = len(self.table_attrs) n_tables = len(self.tableset.tables) if n_attrs != n_tables: raise RuntimeError('There are %d tables but %d table attributes!' % (n_tables, n_attrs)) for i, (attr, table) in enumerate( zip(self.table_attrs, self.tableset.tables)): table.attr.update(attr) self.tv[table.name] = CustomTableView(table, self.getdefault, self) self.tv[i] = self.tv[table.name] # signals self.tv[LEFT].tableView.clicked.connect(self.show_right) self.tv[RIGHT].tableView.clicked.connect(self.show_down) for tv in self.tv.values(): tv.tableModel.validationFailed.connect( lambda idx, err, tv=tv: self.show_validation_error(tv, idx, err)) # hide primary key columns self.tv[RIGHT].tableView.hideColumn(0) self.tv[DOWN].tableView.hideColumn(0) self.tv[DOWN].tableView.hideColumn(1) def getdefault(self, table): # return the primary key tuple partially filled, depending on # the currently selected rows ordinal = table.ordinal if not ordinal: # top left table return [] return self.tv[ordinal - 1].current_record()[:ordinal] def plot(self, records, x_field, y_field, label): can_plot = Figure and records if can_plot: xs = [rec[x_field] for rec in records] ys = [rec[y_field] for rec in records] self.axes.clear() self.axes.grid(True) self.axes.plot(xs, ys, label=label) self.axes.legend(loc='upper left') self.canvas.draw() def reset_plot(self): if Figure: self.axes.clear() self.axes.grid(True) self.canvas.draw() def setupUi(self): layout = QtGui.QVBoxLayout() hlayout1 = QtGui.QHBoxLayout() hlayout2 = QtGui.QHBoxLayout() layout.addWidget(self.message_bar) hlayout1.addWidget(self.tv[LEFT]) hlayout1.addWidget(self.tv[RIGHT]) layout.addLayout(hlayout1) hlayout2.addWidget(self.tv[DOWN]) if Figure: # matplotlib is available self.fig = Figure() self.axes = self.fig.add_subplot(111) self.canvas = FigureCanvasQTAgg(self.fig) self.canvas.setParent(self) hlayout2.addWidget(self.canvas) layout.addLayout(hlayout2) self.setLayout(layout) self.setSizePolicy( QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.MinimumExpanding) # display table 1 and table 2 as if rows 0 and 0 where selected self.show_right(index(0, 0)) self.show_down(index(0, 0)) @QtCore.pyqtSlot(QtCore.QModelIndex, Exception) def show_validation_error(self, table_view, index, error): record = table_view.tableModel.table[index.row()] fieldname = record.fields[index.column()].name message = '%s: %s' % (fieldname, error) self.message_bar.show_message(message) def show_right(self, index): try: k0, = self.tv[LEFT].tableModel.primaryKey(index) except IndexError: # empty table, nothing to show return # show only the rows in table 1 corresponding to k0 self.tv[RIGHT].showOnCondition(lambda rec: rec[0] == k0) # table 2 must disappear because no index in table 1 is selected self.tv[DOWN].showOnCondition(lambda rec: False) self.reset_plot() def show_down(self, index): # show only the rows in table 2 corresponding to k0 and k1 try: k0, k1 = self.tv[RIGHT].tableModel.primaryKey(index) except IndexError: # empty table, nothing to show return self.tv[DOWN].showOnCondition( lambda rec: rec[0] == k0 and rec[1] == k1) self.plot([rec for rec in self.tableset.tables[2] if rec[0] == k0 and rec[1] == k1], 'IML', 'lossRatio', '%s-%s' % (k0, k1))
class SecondCategoryItem(TreeItem): ''' class docs ''' def __init__(self, first_category_name, second_category_name, data_manager): ''' init docs ''' TreeItem.__init__(self) self.first_category_name = first_category_name self.second_category_name = second_category_name self.data_manager = data_manager def render_name(self, cr, rect): text_color = "#333333" if self.is_select: cr.set_source_rgba(*color_hex_to_cairo(app_theme.get_color("sidebar_select").get_color())) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() text_color = "#FFFFFF" elif self.is_hover: cr.set_source_rgba(*color_hex_to_cairo(app_theme.get_color("sidebar_hover").get_color())) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() draw_text(cr, get_category_name(self.second_category_name), rect.x + SECOND_CATEGORY_PADDING_X, rect.y, rect.width, rect.height, text_size=SECOND_CATEGORY_ITEM_NAME_SIZE, text_color=text_color, ) def get_height(self): return SECOND_CATEGORY_ITEM_HEIGHT def get_column_widths(self): return [CATEGORY_ITEM_NAME_WIDTH] def get_column_renders(self): return [self.render_name] def hover(self, column, offset_x, offset_y): self.is_hover = True if self.redraw_request_callback: self.redraw_request_callback(self) def unhover(self, column, offset_x, offset_y): self.is_hover = False if self.redraw_request_callback: self.redraw_request_callback(self) def select(self): self.is_select = True if self.redraw_request_callback: self.redraw_request_callback(self) def unselect(self): self.is_select = False if self.redraw_request_callback: self.redraw_request_callback(self) def scrolled_window_vscrollbar_handler(self, widget, state): if state == "bottom": current_item_number = len(self.pkg_icon_view.items) all_pkgs_number = len(self.all_pkg_names) start = current_item_number if current_item_number < all_pkgs_number and (current_item_number+LOAD_ITEMS_NUMBER) < all_pkgs_number: end = current_item_number+LOAD_ITEMS_NUMBER elif current_item_number < all_pkgs_number and (current_item_number+LOAD_ITEMS_NUMBER) >= all_pkgs_number: end = all_pkgs_number else: return self.load_new_items(self.all_pkg_names[start:end]) def load_new_items(self, pkg_names): items = [] for pkg_name in pkg_names: info = self.data_manager.get_item_pkg_info(pkg_name) items.append(PkgIconItem(info[0], info[1], info[2], self.data_manager)) self.pkg_icon_view.add_items(items) global_event.emit("show-pkg-view", self.page_box) def handle_pkg_install_status_request(self, status, items): for (index, state) in enumerate(status): items[index].is_installed = state items[index].emit_redraw_request() def button_press(self, column, offset_x, offset_y): # init Loading widget loading_box = LoadingBox() global_event.emit("show-pkg-view", loading_box) self.page_box = gtk.VBox() self.all_pkg_names = self.data_manager.get_second_category_packages(self.second_category_name) self.message_bar = MessageBar(18) self.message_bar.set_message(_("%s > %s : %s applications") % ( get_category_name(self.first_category_name), get_category_name(self.second_category_name), len(self.all_pkg_names), )) self.pkg_icon_view = IconView() self.pkg_icon_view.connect("motion-notify-item", tooltip_aciton) if len(self.all_pkg_names) > LOAD_ITEMS_NUMBER: self.load_new_items(self.all_pkg_names[:LOAD_ITEMS_NUMBER]) else: self.load_new_items(self.all_pkg_names) self.pkg_icon_scrolled_window = ScrolledWindow() self.pkg_icon_scrolled_window.connect("vscrollbar-state-changed", self.scrolled_window_vscrollbar_handler) self.pkg_icon_scrolled_window.add_child(self.pkg_icon_view) self.pkg_icon_view.draw_mask = self.draw_mask self.pkg_icon_view.draw_row_mask = self.draw_row_mask self.page_box.pack_start(self.message_bar, False, False) self.page_box.pack_start(self.pkg_icon_scrolled_window, True, True) global_event.emit("update-current-status-pkg-page", self.pkg_icon_view) def draw_row_mask(self, cr, rect, row): if row % 2 == 1: cr.set_source_rgba(1, 1, 1, 0.5) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() def draw_mask(self, cr, x, y, w, h): ''' Draw mask interface. @param cr: Cairo context. @param x: X coordiante of draw area. @param y: Y coordiante of draw area. @param w: Width of draw area. @param h: Height of draw area. ''' draw_vlinear(cr, x, y, w, h, [(0, ("#FFFFFF", 0.9)), (1, ("#FFFFFF", 0.9)),] )