Beispiel #1
0
    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()))
Beispiel #3
0
 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)
Beispiel #6
0
    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()))
Beispiel #7
0
    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)
Beispiel #8
0
 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
Beispiel #9
0
    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)
Beispiel #11
0
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
Beispiel #12
0
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)
Beispiel #15
0
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()
Beispiel #18
0
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)
Beispiel #19
0
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)),
        ])
Beispiel #20
0
    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()
Beispiel #21
0
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)
Beispiel #23
0
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)),]
                     )