Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/ka_controller.py
blob: eef70ff4269a71bb98e4011b76ec5493af0e5866 (plain)
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
119
120
121
122
123
124
125
126
127
# coding: UTF-8
# Copyright 2009, 2010 Thomas Jourdan
#
# This program 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.
#
# This program 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 this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

import ka_extensionpoint
import ka_debug

class KandidController(object):
    """
    inv: self._widget_list is not None
    inv: self._activity_root is not None
    """

    def __init__(self, widget, activity_root, started_anew):
        """
        pre: widget is not None
        """
        self._widget = widget
        self._widget_list = widget.widget_list
        self._activity_root = activity_root        
        self._started_anew = started_anew

        self._pages = []
        

    @staticmethod
    def numeric_compare(page1, page2):
        """
        pre: page1 is not None
        pre: page2 is not None
        """
        return page1.position - page2.position

    def create_pages(self):
        """
        Add optional pages to kandid notebook
        """
        page_names = ka_extensionpoint.list_extensions('page')
        for name in page_names:
            page_controller = ka_extensionpoint.create(name, self,
                                                       self._widget_list,
                                                       self._activity_root,
                                                       self._started_anew)
            self._pages.append(page_controller)
        self._pages.sort(cmp=KandidController.numeric_compare)
        for page_controller in self._pages:
            self._widget._notebook.append_page(*page_controller.create_gui())
            page_controller.autoconnect_events()
            page_controller.localize()
            page_controller.activate_gui()

    def find_page(self, page_name):
        """
        pre: page_name is not None and len(page_name) > 1
        """
        for page_controller in self._pages:
            pattern1 = "<class 'ep_page_"
            pattern2 = "." + page_name + "'>"
            type_str = str(type(page_controller))
            if type_str.startswith(pattern1) and type_str.endswith(pattern2):
                return page_controller
        ka_debug.err('Missing ' + page_name)
        return None
    
    def find_page_number(self, page_name):
        """
        pre: page_name is not None and len(page_name) > 1
        """
        for page_number, page_controller in enumerate(self._pages):
            pattern1 = "<class 'ep_page_"
            pattern2 = "." + page_name + "'>"
            type_str = str(type(page_controller))
            if type_str.startswith(pattern1) and type_str.endswith(pattern2):
                return page_number
        return -1
        
    
    def switch_page(self, page_name):
        """
        pre: page_name is not None and len(page_name) > 1
        pre: self.find_page(page_name) is not None
        """
        for page_number, page_controller in enumerate(self._pages):
            pattern1 = "<class 'ep_page_"
            pattern2 = "." + page_name + "'>"
            type_str = str(type(page_controller))
            if type_str.startswith(pattern1) and type_str.endswith(pattern2):
                self._widget_list.get_widget('kandidNotebook'). \
                                                   set_current_page(page_number)
                return
    
    def close(self):
        """Clean up on close"""
        for page in self._pages:
            page.close()

def name_to_index(name):
    """Extract index from last part of a name.
    Parts are separated by _.
    pre: name[-1].isdigit()
    post: __return__ >= 0
    """
    return int(name.rsplit('_')[-1])

def create_context(widget):
    """ Create cairo context for widget.
    pre: widget is not None
    pre: widget.window is not None
    """
    ctx = widget.window.cairo_create()
    ctx.rectangle(0, 0, \
                  widget.allocation.width, widget.allocation.height)
    ctx.clip()
    return ctx