Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

#! /usr/bin/env python3 

# -*- coding: utf-8 -*- 

 

#       Copyright 2012-2013, Marten de Vries 

# 

#       This file is part of OpenTeacher. 

# 

#       OpenTeacher is free software: you can redistribute it and/or modify 

#       it under the terms of the GNU General Public License as published by 

#       the Free Software Foundation, either version 3 of the License, or 

#       (at your option) any later version. 

# 

#       OpenTeacher is distributed in the hope that it will be useful, 

#       but WITHOUT ANY WARRANTY; without even the implied warranty of 

#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 

#       GNU General Public License for more details. 

# 

#       You should have received a copy of the GNU General Public License 

#       along with OpenTeacher.  If not, see <http://www.gnu.org/licenses/>. 

 

class Button: 

        """Represents a Button. UI modules should draw a button and handle 

           the events so they're updated on changes. User modules use it 

           as an abstract way of changing the buttons, by sending the change 

           events with arguments. Note that the UI can't always respect all 

           the values passed in via the events. That's up to the UI 

           implementation. 

 

           Properties: 

 

           - category (read-only) 

 

           Events: 

 

           - clicked() -> gui to user 

           - changeText(text) -> user to gui 

           - changeIcon(icon_path) -> user to gui 

           - changeSize(size) -> user to gui 

             size is a string: either 'small' or 'large'. 

           - changePriority(priority) -> user to gui 

             piority is a number; 0 is high, inifinity low. 

 

        """ 

        def __init__(self, category, createEvent, *args, **kwargs): 

                """category must be either 'create', 'load' or 

                   'load-from-internet'. 

 

                """ 

                super().__init__(*args, **kwargs) 

 

                self.category = category 

 

                self.clicked = createEvent() 

                self.changeText = createEvent() 

                self.changeIcon = createEvent() 

                self.changePriority = createEvent() 

                self.changeSize = createEvent() 

 

class ButtonRegisterModule: 

        """Module that provides a register of all 'buttons', a way for 

           features to present themselves to the user next to the menus. 

 

           UI's keep track of all registered an unregistered buttons by 

           handling the ``addButton`` and ``removeButton`` events. They get 

           passed the same kind of object as the caller of 

           ``registerButton`` gets back. 

 

        """ 

        def __init__(self, moduleManager, *args, **kwargs): 

                super().__init__(*args, **kwargs) 

                self._mm = moduleManager 

 

                self.type = "buttonRegister" 

 

                self.requires = ( 

                        self._mm.mods(type="event"), 

                ) 

 

        def enable(self): 

                self._modules = set(self._mm.mods(type="modules")).pop() 

                self._createEvent = self._modules.default(type="event").createEvent 

                self.addButton = self._createEvent() 

                self.removeButton = self._createEvent() 

 

                self.active = True 

 

        def disable(self): 

                self.active = False 

 

                del self._modules 

                del self._createEvent 

                del self.addButton 

                del self.removeButton 

 

        def registerButton(self, category): 

                """Creates a new Button object, and tells the world (mostly the 

                   gui modules) it has been created. It returns the resulting 

                   object to the user. `category` can be everything in theory, 

                   if you want your button to be shown using a string with value 

                   'load', 'load-from-internet' or 'create' is a good idea. 

 

                        Returns an object, the docstring of that objects is: 

 

                """ 

                b = Button(category, self._createEvent) 

                self.addButton.send(b) 

                return b 

        registerButton.__doc__ += Button.__doc__ 

 

        def unregisterButton(self, b): 

                """Tell 'the world' the button `b` isn't in use anymore. User 

                   responsibility to call this on disable. 

 

                """ 

                self.removeButton.send(b) 

 

def init(moduleManager): 

        return ButtonRegisterModule(moduleManager)