Beispiel #1
0
 def contextMenuEvent(self, event):
     wrapped = []
     menu = QMenu(self.parentWidget())
     for text, param in (
             ("Promote", 1),
             ("Demote", -1)):
         wrapper = functools.partial(self.promote, param)
         wrapped.append(wrapper)
         menu.addAction(text, wrapper)
     menu.exec_(event.screenPos())
Beispiel #2
0
class ControlBase(object):
	"""
	This class represents the most basic control that can exist
	A Control is a Widget or a group of widgets that can be reused from application to application

	@undocumented: __repr__
	"""

	def __init__(self, label='', default=None, helptext=None):
		self._help      = helptext
		self._value     = default
		self._form      = None  # Qt widget
		self._parent    = None  # Parent window
		self._label     = label # Label
		self._popup_menu = None
		
		self.init_form()


	def init_form(self):
		"""
		Load Control and initiate the events
		"""		
		if self.help: self.form.setToolTip(self.help)


	def __repr__(self): return str(self._value)

	##########################################################################
	############ Funcions ####################################################
	##########################################################################

	def load_form(self, data, path=None):
		"""
		Load a value from the dict variable
		@param data: dictionary with the value of the Control
		"""
		if 'value' in data:
			self.value = data['value']

	def save_form(self, data, path=None):
		"""
		Save a value to dict variable
		@param data: dictionary with to where the value of the Control will be added
		"""
		if self.value:
			data['value'] = self.value
		return data

	def show(self):
		"""
		Show the control
		"""
		if self.form is None:
			return
		self.form.show()

	def hide(self):
		"""
		Hide the control
		"""
		if self.form is None:
			return
		self.form.hide()


	def __create_popup_menu(self):
		if not self._popup_menu:
			self.form.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
			self.form.customContextMenuRequested.connect(self._open_popup_menu)
			self._popup_menu = QMenu(self.parent)
			self._popup_menu.aboutToShow.connect( self.about_to_show_contextmenu_event)

	def add_popup_submenu(self, label, submenu=None):
		self.__create_popup_menu()
		menu = submenu if submenu else self._popup_menu
		submenu = QMenu(label, menu)
		menu.addMenu(submenu)
		return submenu

	def add_popup_menu_option(self, label, function_action=None, key=None, icon=None, submenu=None):
		"""
		Add an option to the Control popup menu
		@param label:           label of the option.
		@param function_action:  function called when the option is selected.
		@param key:             shortcut key
		@param icon:            icon
		"""
		self.__create_popup_menu()

		menu = submenu if submenu else self._popup_menu

		if label == "-":
			return menu.addSeparator()
		else:
			action = QAction(label, self.form)
			if icon is not None:
				action.setIconVisibleInMenu(True)
				action.setIcon(icon if isinstance(icon, QIcon) else QIcon(icon) )
			if key != None:
				action.setShortcut(QKeySequence(key))
			if function_action:
				action.triggered.connect(function_action)
				menu.addAction(action)
			return action


	##########################################################################
	############ Events ######################################################
	##########################################################################

	def changed_event(self):
		"""
		Function called when ever the Control value is changed
		"""
		return True

	def about_to_show_contextmenu_event(self):
		"""
		Function called before open the Control popup menu
		"""
		pass

	def _open_popup_menu(self, position):
		if self._popup_menu:
			self._popup_menu.exec_(self.form.mapToGlobal(position))

	##########################################################################
	############ Properties ##################################################
	##########################################################################

	##########################################################################
	# Set the Control enabled or disabled

	@property
	def enabled(self):
		return self.form.isEnabled()

	@enabled.setter
	def enabled(self, value):
		"""@type  value: boolean"""
		self.form.setEnabled(value)

	##########################################################################
	# Return or update the value of the Control

	@property
	def value(self):
		return self._value

	@value.setter
	def value(self, value):
		"""
		This property return and set what the control should manage or store.
		@type  value: string
		"""
		oldvalue = self._value
		self._value = value
		if oldvalue != value:
			self.changed_event()

	@property
	def visible(self): return self.form.isVisible()

	@visible.setter
	def visible(self, value):
		self.show() if value else self.hide()

	@property
	def name(self): return self.form.objectName()

	@name.setter
	def name(self, value):
		"""
		This property return and set the name of the control
		@type  value: string
		"""
		self.form.setObjectName(value)

	##########################################################################
	# Return or update the label of the Control

	@property
	def label(self):
		return self._label

	@label.setter
	def label(self, value):
		"""
		Label of the control, if applies
		@type  value: string
		"""
		self._label = value

	##########################################################################
	# Return the QT widget

	@property
	def form(self):
		"""
		Returns the Widget of the control. 
		This property will be deprecated in a future version.
		"""
		return self._form

	##########################################################################
	# Parent window

	@property
	def parent(self): return self._parent

	@parent.setter
	def parent(self, value):
		"""
		Returns or set the parent basewidget where the Control is
		@type  value: BaseWidget
		"""
		self._parent = value

	@property
	def help(self): return self._help if self._help else ''
Beispiel #3
0
class ControlBase(object):
    """
    All the Controls inherit from this Control, therefore you can find its functions and properties in all the other controls listed below.

    """

    def __init__(self, *args, **kwargs):
        """
        :param str label: Control label. Default = ''.
        :param str helptext: Text shown when the mouse is over the control. Default = None.
        :param str default: Initial value of the control. Default = None.

        :param bool visible: Flag to set the control visible or hidden. Default = True.
        :param bool enabled: Flag to set the control enabled or Disabled. Default = True.
        :param bool readonly: Flag to set the control readonly. Default = False.
        :param function changed_event: Function to call whenever the control value is updated. Default = None.  

        """

        self._form       = None  # Qt widget
        self._parent     = None  # Parent window
        self._popup_menu = None

        self._help          = kwargs.get('helptext', None)
        self._value         = kwargs.get('default',  None)
        self._label         = kwargs.get('label', args[0] if len(args)>0 else '')
        self._style         = kwargs.get('style', None)

        self.init_form()

        self.changed_event  = kwargs.get('changed_event', self.changed_event)
        self.enabled        = kwargs.get('enabled', True)
        self.readonly       = kwargs.get('readonly', False)
        if not kwargs.get('visible', True):  self.hide()


    def __repr__(self): return str(self._value)

    ##########################################################################
    ############ Funcions ####################################################
    ##########################################################################

    def init_form(self):
        """
        Load the control UI and initiate all the events.
        """     
        if self.help: self.form.setToolTip(self.help)

        if self._style: self.form.setStyleSheet(self._style)
   


    def load_form(self, data, path=None):
        """
        Loads the value of the control.

        :param dict data: It is a dictionary with the required information to load the control. 
        :param str path: Optional parameter that can be used to save the data.  
        """
        if 'value' in data:
            self.value = data['value']

    def save_form(self, data, path=None):
        """
        Save a value of the control to a dictionary.  

        :param dict data: Dictionary where the control value should be saved.  
        :param str path: Optional parameter that can be used to load the data.  
        """
        data['value'] = self.value
        return data

    def show(self):
        """
        Show the control
        """
        if self.form is None:
            return
        elif self.form==self:
            super(ControlBase,self).show()
        else:
            self.form.show()

    def hide(self):
        """
        Hide the control
        """
        if self.form is None:
            return
        elif self.form==self:
            super(ControlBase,self).hide()
        else:
            self.form.hide()


    def __create_popup_menu(self):
        if not self._popup_menu:
            self.form.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
            self.form.customContextMenuRequested.connect(self._open_popup_menu)
            self._popup_menu = QMenu(self.parent)
            self._popup_menu.aboutToShow.connect( self.about_to_show_contextmenu_event)

    def add_popup_submenu(self, label, submenu=None):
        """
        It returns a new sub popup menu. If submenu is open the menu is added to the main popup menu.

        :param str label: Label of the option  
        :param QMenu submenu: Parent submenu to which the option should be added. If no value is set, then the option will be added to the main popup menu.  
        """
        self.__create_popup_menu()
        menu = submenu if submenu else self._popup_menu
        submenu = QMenu(label, menu)
        menu.addMenu(submenu)
        return submenu

    def add_popup_menu_option(self, label, function_action=None, key=None, icon=None, menu=None):
        """
        Add an option to the Control popup menu.  

        :param str label: Label of the option  
        :param function function_action: The function that should be executed when the menu is selected.  
        :param str key: Short key.  
        :param QIcon or str icon: Icon.  
        :param QMenu submenu: Parent submenu to which the option should be added. If no value is set, then the option will be added to the main popup menu.  
        
        .. code:: python

            control.add_popup_menu_option('option 0', function_action=self._do_something)
            submenu1 = control.add_popup_submenu('menu 1')
            submenu2 = control.add_popup_submenu('menu 2', submenu=submenu1)
            control.add_popup_menu_option('option 1', function_action=self._do_something, key='Control+Q', submenu=submenu2)
        """
        self.__create_popup_menu()

        menu = menu if menu else self._popup_menu

        if label == "-":
            return menu.addSeparator()
        else:
            action = QAction(label, self.form)
            if icon is not None:
                action.setIconVisibleInMenu(True)
                action.setIcon(icon if isinstance(icon, QIcon) else QIcon(icon) )
            if key != None:
                action.setShortcut(QKeySequence(key))
            if function_action:
                action.triggered.connect(function_action)
                menu.addAction(action)
            return action


    ##########################################################################
    ############ Events ######################################################
    ##########################################################################

    def changed_event(self):
        """
        Function called when ever the Control value is changed. The event function should return True if the data was saved with success.

        """
        return True

    def about_to_show_contextmenu_event(self):
        """
        Function called before the Control popup menu is opened.
        """
        pass

    def _open_popup_menu(self, position):
        if self._popup_menu:
            self._popup_menu.exec_(self.form.mapToGlobal(position))

    ##########################################################################
    ############ Properties ##################################################
    ##########################################################################

    ##########################################################################
    # Set the Control enabled or disabled

    @property
    def enabled(self):
        """
        Returns or set if the control is enable or disable.
        """
        return self.form.isEnabled()

    @enabled.setter
    def enabled(self, value):
        self.form.setEnabled(value)

    ##########################################################################
    # Return or update the value of the Control

    @property
    def value(self):
        """
        This property returns or set what the control should manage or store.
        """
        return self._value

    @value.setter
    def value(self, value):
        oldvalue = self._value
        self._value = value
        if oldvalue != value:
            self.changed_event()

    
    @property
    def name(self): 
        """
        This property returns or set the name of the control.
        """
        return self.form.objectName()

    @name.setter
    def name(self, value):
        self.form.setObjectName(value)

    ##########################################################################
    # Return or update the label of the Control

    @property
    def label(self):
        """
        Returns or sets the label of the control.
        """
        return self._label

    @label.setter
    def label(self, value):
        self._label = value

    ##########################################################################
    # Parent window

    @property
    def parent(self):
        """
        Returns or set the parent basewidget where the Control is.
        """
        return self._parent

    @parent.setter
    def parent(self, value):
        self._parent = value

    @property
    def visible(self):
        """
        Return the control visibility.
        """
        return self.form.isVisible()

    @property
    def help(self):
        """
        Returns or set the tip box of the control.
        """
        return self._help if self._help else ''

    @property
    def error(self): return None

    @error.setter
    def error(self, value):
        pass

    @property
    def label_visible(self): return None

    @label_visible.setter
    def label_visible(self, value):
        pass

    @property
    def readonly(self):
        """
        Set and return the control readonly state.
        """
        return None

    @readonly.setter
    def readonly(self, value):
        pass

    @property
    def css(self): return None

    @css.setter
    def css(self, value):
        pass


    ##########################################################################
    ############ Properties just for the GUI version #########################
    ##########################################################################

    ##########################################################################
    # Return the QT widget

    @property
    def form(self):
        """
        Returns the QWidget of the control.
        """
        return self._form