source: subversion/applications/routing/pyroute-dev/overlayArea.py @ 18454

Last change on this file since 18454 was 18454, checked in by buerste, 10 years ago

-further updates of spaces to tabs

  • Property svn:keywords set to Rev
File size: 4.3 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4"""Graphics library for drawing pyroute GUI menus
5
6Usage:
7        (library code for pyroute GUI)
8
9Features:
10        Start by initialising a 'rectangle' that covers a certain bit of screen
11        Then you can
12                * Draw an icon there
13                * Draw text in the rectangle
14                * Make it clickable (so that it triggers an event when clicked)
15                * Split it into smaller rectangles (to do complex GUI layouts)
16"""
17
18__version__ = "$Rev: 18454 $"
19__license__ = """This program is free software: you can redistribute it and/or modify
20it under the terms of the GNU General Public License as published by
21the Free Software Foundation, either version 3 of the License, or
22(at your option) any later version.
23
24This program is distributed in the hope that it will be useful,
25but WITHOUT ANY WARRANTY; without even the implied warranty of
26MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27GNU General Public License for more details.
28
29You should have received a copy of the GNU General Public License
30along with this program. If not, see <http://www.gnu.org/licenses/>."""
31_debug = 0
32
33
34import cairo
35import os
36
37class overlayArea:
38        def __init__(self,cr,x,y,dx,dy,modules,iconSet):
39                self.cr = cr
40                self.x1 = x;
41                self.y1 = y;
42                self.x2 = x + dx;
43                self.y2 = y + dy;
44                self.w = dx
45                self.h = dy
46                self.cx = x + 0.5 * dx
47                self.cy = y + 0.5 * dy
48                self.event = None
49                self.modules = modules
50                self.iconSet = iconSet
51        def fill(self,r,g,b,outline=0,alpha=None):
52                if(alpha == None):
53                        self.cr.set_source_rgb(r,g,b)
54                else:
55                        self.cr.set_source_rgba(r,g,b,alpha)
56                self.cr.rectangle(self.x1,self.y1,self.w,self.h)
57                if(outline):
58                        self.cr.stroke()
59                else:
60                        self.cr.fill()
61        def drawTextSomewhere(self,text,px1,py1,px2,py2):
62                if(text == None or text == ''):
63                        return
64                innerBox = self.copyself(px1,py1,px2,py2)
65                innerBox.drawText(text)
66        def drawText(self,text):
67                self.cr.select_font_face('Verdana', cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
68                test_fontsize = 60
69                self.cr.set_font_size(test_fontsize)
70                xbearing, ybearing, textwidth, textheight, xadvance, yadvance = self.cr.text_extents(text)
71                # Resize the font to fit
72                ratiox = textwidth / self.w
73                ratioy = textheight / self.h
74                ratio = max(ratiox,ratioy)
75
76                self.cr.set_font_size(test_fontsize / ratio)
77                textwidth = textwidth / ratio
78                textheight = textheight / ratio
79
80                marginx = 0.5 * (self.w - textwidth)
81                marginy = 0.5 * (self.h - textheight)
82                # Text
83                self.cr.move_to(self.x1 + marginx, self.y2 - marginy)
84                self.cr.set_source_rgba(0, 0, 0, 0.5)
85                self.cr.show_text(text)
86
87        def button(self,text=None,event=None,icon=None):
88                # Rectangle
89                if(not icon):
90                        if(text):
91                                self.icon("generic")
92                        else:
93                                self.icon("blank")
94                else:
95                        self.icon(icon)
96                if(text):
97                        self.drawTextSomewhere(text,0.2,0.6,0.8,0.8)
98                if(event):
99                        self.setEvent(event)
100
101        def icon(self, icon):
102                self.iconSet.draw(self.cr,icon,self.x1,self.y1,self.w,self.h)
103        def setEvent(self,text):
104                self.event = text
105        def xc(self,p):
106                return(self.x1 + p * self.w)
107        def yc(self,p):
108                return(self.y1 + p * self.h)
109        def copyself(self,px1,py1,px2,py2):
110                x1 = self.xc(px1)
111                y1 = self.yc(py1)
112                return(overlayArea( \
113                        self.cr,
114                        x1,
115                        y1,
116                        self.xc(px2) - x1,
117                        self.yc(py2) - y1,
118                        self.modules,
119                        self.iconSet))
120        def copyAndExtendTo(self,otherRect):
121                return(overlayArea( \
122                        self.cr,
123                        self.x1,
124                        self.y1,
125                        otherRect.x2 - self.x1,
126                        otherRect.y2 - self.y1,
127                        self.modules,
128                        self.iconSet))
129        def xsplit(self,p):
130                a = self.copyself(0,0,p,1)
131                b = self.copyself(p,0,1,1)
132                return(a,b)
133        def ysplit(self,p):
134                a = self.copyself(0,0,1,p)
135                b = self.copyself(0,p,1,1)
136                return(a,b)
137        def xsplitn(self,px1,py1,px2,py2,n):
138                dpx = (px2 - px1) / n
139                cells = []
140                for i in range(0,n-1):
141                        px = px1 + i * dpx
142                        cells.append(self.copyself(px,py1,px + dpx,py2))
143                return(cells)
144        def ysplitn(self,px1,py1,px2,py2,n):
145                dpy = (py2 - py1) / n
146                cells = []
147                for i in range(0,n):
148                        py = py1 + i * dpy
149                        cells.append(self.copyself(px1,py,px2,py+dpy))
150                return(cells)
151
152        def contains(self,x,y):
153                if(x > self.x1 and x < self.x2 and y > self.y1 and y < self.y2):
154                        return(1)
155        def handleClick(self,x,y):
156                if(self.event):
157                        self.modules['events'].handleEvent(self.event)
158                        return(1)
159                return(0)
Note: See TracBrowser for help on using the repository browser.