comparison frontends/sortilege_old/window.py @ 112:f551e44adb25

Primitivus first draft - Sortilège is recoded using urwid, and renamed in Primitivus as it is no more based on curses - soritlege code moved to sortilege_old, and deprecated - Primitivus first draft, begining of ProfileManager widget
author Goffi <goffi@goffi.org>
date Wed, 30 Jun 2010 14:24:24 +0800
parents frontends/sortilege/window.py@8f2ed279784b
children b1794cbb88e5
comparison
equal deleted inserted replaced
111:6c927140ba82 112:f551e44adb25
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 """
5 sortilege: a SAT frontend
6 Copyright (C) 2009, 2010 Jérôme Poisson (goffi@goffi.org)
7
8 This program is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
20 """
21
22
23 import curses
24 import os
25 import pdb
26
27
28 class Window():
29 def __init__(self, parent, height, width, y, x, border=False, title="", code="utf-8"):
30 self.__border=border
31 self.__title=title
32 self.__active=False
33 self.__parent=parent
34 self.__code=code
35 self.__hide=False
36
37 self.resize(height, width, y, x)
38 self.oriCoords=self.__coords #FIXME: tres moche, a faire en mieux
39
40 def hide(self, hide=True):
41 self.__hide=hide
42
43 def show(self):
44 self.__hide=False
45
46 def isHidden(self):
47 return self.__hide
48
49 def getY(self):
50 return self.__coords[2]
51
52 def getX(self):
53 return self.__coords[3]
54
55 def getHeight(self):
56 return self.__coords[0]
57
58 def getWidth(self):
59 return self.__coords[1]
60
61
62 #FIXME: tres moche, a faire en plus joli
63 def getOriY(self):
64 return self.oriCoords[2]
65
66 def getOriX(self):
67 return self.oriCoords[3]
68
69 def getOriHeight(self):
70 return self.oriCoords[0]
71
72 def getOriWidth(self):
73 return self.oriCoords[1]
74
75 def defInsideCoord(self):
76 """define the inside coordinates (win coordinates minus decorations)"""
77 height,width,y,x=self.__coords
78 self.oriX = x if not self.__border else x+1
79 self.oriY = y if not self.__border else y+1
80 self.endX = x+width if not self.__border else x+width-2
81 self.endY = y+height if not self.__border else y+height-2
82 self.rWidth = width if not self.__border else width-2
83 self.rHeight = height if not self.__border else height-2
84
85 def resize(self, height, width, y, x):
86 self.__coords=[height, width, y, x]
87
88 # we check that coordinates are under limits
89 self.__coordAdjust(self.__coords)
90 height,width,y,x=self.__coords
91
92 self.window = self.__parent.subwin(height, width, y, x)
93 self.defInsideCoord()
94
95 def __coordAdjust(self, coords):
96 """Check that coordinates are under limits, adjust them else otherwise"""
97 height,width,y,x=coords
98 parentY, parentX = self.__parent.getbegyx()
99 parentHeight, parentWidth = self.__parent.getmaxyx()
100
101 if y < parentY:
102 y = parentY
103 if x < parentX:
104 x = parentX
105 if height > parentHeight - y:
106 height = parentHeight - y
107 if width > parentWidth - x:
108 width = parentWidth - x
109 coords[0], coords[1], coords[2], coords[3] = [height, width, y, x]
110
111
112 def activate(self,state=True):
113 """Declare this window as current active one"""
114 self.__active=state
115 self.update()
116
117 def isActive(self):
118 return self.__active
119
120 def addYXStr(self, y, x, text, attr = 0, limit=0):
121 if self.__border:
122 x=x+1
123 y=y+1
124 n = self.rWidth-x if not limit else limit
125 encoded = text.encode(self.__code)
126 adjust = len(encoded) - len(text) # hack because addnstr doesn't manage unicode
127 try:
128 self.window.addnstr(y, x, encoded, n + adjust, attr)
129 except:
130 #We have to catch error to write on last line last col FIXME: is there a better way ?
131 pass
132
133 def move(self, y, x):
134 self.window.move(y,x)
135
136 def noutrefresh(self):
137 self.window.noutrefresh()
138
139 def update(self):
140 """redraw all the window"""
141 if self.__hide:
142 return
143 self.clear()
144
145 def border(self):
146 """redraw the border and title"""
147 y,x = self.window.getbegyx()
148 width = self.window.getmaxyx()[1]
149 if self.__border:
150 self.window.border()
151 if self.__title:
152 if len(self.__title)>width:
153 self.__title=""
154 else:
155 self.window.addstr(y,x+(width-len(self.__title))/2, self.__title)
156
157 def clear(self):
158 self.window.clear()
159 self.border()