source: src/mlx/gui/common.py@ 228:bc6592d202b4

Last change on this file since 228:bc6592d202b4 was 228:bc6592d202b4, checked in by István Váradi <ivaradi@…>, 12 years ago

Minor fixes and added the screenshots for the English manual

File size: 8.8 KB
RevLine 
[28]1# Common things for the GUI
2
[105]3import mlx.const as _const
[175]4from mlx.i18n import xstr
[105]5
[28]6import os
7
8appIndicator = False
9
10if os.name=="nt" or "FORCE_PYGTK" in os.environ:
11 print "Using PyGTK"
12 pygobject = False
13 import pygtk
[29]14 import gtk.gdk as gdk
[28]15 import gtk
16 import gobject
[44]17 import pango
[28]18 try:
19 import appindicator
20 appIndicator = True
21 except Exception, e:
22 pass
[42]23
24 MESSAGETYPE_ERROR = gtk.MESSAGE_ERROR
[76]25 MESSAGETYPE_QUESTION = gtk.MESSAGE_QUESTION
[97]26 MESSAGETYPE_INFO = gtk.MESSAGE_INFO
[175]27
[124]28 RESPONSETYPE_OK = gtk.RESPONSE_OK
[76]29 RESPONSETYPE_YES = gtk.RESPONSE_YES
[124]30 RESPONSETYPE_NO = gtk.RESPONSE_NO
[123]31 RESPONSETYPE_ACCEPT = gtk.RESPONSE_ACCEPT
32 RESPONSETYPE_REJECT = gtk.RESPONSE_REJECT
[149]33 RESPONSETYPE_CANCEL = gtk.RESPONSE_CANCEL
[175]34
[93]35 ACCEL_VISIBLE = gtk.ACCEL_VISIBLE
36 CONTROL_MASK = gdk.CONTROL_MASK
[123]37 DIALOG_MODAL = gtk.DIALOG_MODAL
[127]38 WRAP_WORD = gtk.WRAP_WORD
[132]39 JUSTIFY_CENTER = gtk.JUSTIFY_CENTER
[97]40
[144]41 CONTROL_MASK = gdk.CONTROL_MASK
42 SHIFT_MASK = gdk.SHIFT_MASK
43 BUTTON1_MASK = gdk.BUTTON1_MASK
44
45 SCROLL_UP = gdk.SCROLL_UP
46 SCROLL_DOWN = gdk.SCROLL_DOWN
47
48 SPIN_USER_DEFINED = gtk.SPIN_USER_DEFINED
49
[149]50 FILE_CHOOSER_ACTION_SELECT_FOLDER = gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER
[151]51 FILE_CHOOSER_ACTION_OPEN = gtk.FILE_CHOOSER_ACTION_OPEN
52 FILE_CHOOSER_ACTION_SAVE = gtk.FILE_CHOOSER_ACTION_SAVE
[149]53
[175]54 SELECTION_MULTIPLE = gtk.SELECTION_MULTIPLE
55
[220]56 SHADOW_IN = gtk.SHADOW_IN
57
58 POLICY_AUTOMATIC = gtk.POLICY_AUTOMATIC
59
[226]60 WEIGHT_BOLD = pango.WEIGHT_BOLD
61
[227]62 pixbuf_new_from_file = gdk.pixbuf_new_from_file
63
[97]64 def text2unicode(text):
65 """Convert the given text, returned by a Gtk widget, to Unicode."""
66 return unicode(text)
[28]67else:
68 print "Using PyGObject"
69 pygobject = True
[29]70 from gi.repository import Gdk as gdk
[227]71 from gi.repository import GdkPixbuf as gdkPixbuf
[28]72 from gi.repository import Gtk as gtk
73 from gi.repository import GObject as gobject
74 from gi.repository import AppIndicator3 as appindicator
[44]75 from gi.repository import Pango as pango
[28]76 appIndicator = True
[76]77
[42]78 MESSAGETYPE_ERROR = gtk.MessageType.ERROR
[76]79 MESSAGETYPE_QUESTION = gtk.MessageType.QUESTION
[97]80 MESSAGETYPE_INFO = gtk.MessageType.INFO
[124]81 RESPONSETYPE_OK = gtk.ResponseType.OK
[76]82 RESPONSETYPE_YES = gtk.ResponseType.YES
[124]83 RESPONSETYPE_NO = gtk.ResponseType.NO
[123]84 RESPONSETYPE_ACCEPT = gtk.ResponseType.ACCEPT
85 RESPONSETYPE_REJECT = gtk.ResponseType.REJECT
[149]86 RESPONSETYPE_CANCEL = gtk.ResponseType.CANCEL
[93]87 ACCEL_VISIBLE = gtk.AccelFlags.VISIBLE
88 CONTROL_MASK = gdk.ModifierType.CONTROL_MASK
[123]89 DIALOG_MODAL = gtk.DialogFlags.MODAL
[127]90 WRAP_WORD = gtk.WrapMode.WORD
[132]91 JUSTIFY_CENTER = gtk.Justification.CENTER
[42]92
[144]93 CONTROL_MASK = gdk.ModifierType.CONTROL_MASK
94 SHIFT_MASK = gdk.ModifierType.SHIFT_MASK
95 BUTTON1_MASK = gdk.ModifierType.BUTTON1_MASK
96
97 SCROLL_UP = gdk.ScrollDirection.UP
98 SCROLL_DOWN = gdk.ScrollDirection.DOWN
99
100 SPIN_USER_DEFINED = gtk.SpinType.USER_DEFINED
101
[149]102 FILE_CHOOSER_ACTION_SELECT_FOLDER = gtk.FileChooserAction.SELECT_FOLDER
[151]103 FILE_CHOOSER_ACTION_OPEN = gtk.FileChooserAction.OPEN
104 FILE_CHOOSER_ACTION_SAVE = gtk.FileChooserAction.SAVE
[149]105
[175]106 SELECTION_MULTIPLE = gtk.SelectionMode.MULTIPLE
107
[220]108 SHADOW_IN = gtk.ShadowType.IN
109
110 POLICY_AUTOMATIC = gtk.PolicyType.AUTOMATIC
111
[226]112 WEIGHT_BOLD = pango.Weight.BOLD
113
[227]114 pixbuf_new_from_file = gdkPixbuf.Pixbuf.new_from_file
115
[97]116 import codecs
117 _utf8Decoder = codecs.getdecoder("utf-8")
118
119 def text2unicode(str):
120 """Convert the given text, returned by a Gtk widget, to Unicode."""
121 return _utf8Decoder(str)[0]
122
[28]123import cairo
124
[32]125#------------------------------------------------------------------------------
126
127class FlightStatusHandler(object):
128 """Base class for objects that handle the flight status in some way."""
129 def __init__(self):
130 self._stage = None
131 self._rating = 100
132 self._noGoReason = None
133
134 def resetFlightStatus(self):
135 """Reset the flight status."""
136 self._stage = None
137 self._rating = 100
138 self._noGoReason = None
139 self._updateFlightStatus()
140
141 def setStage(self, stage):
142 """Set the stage of the flight."""
143 if stage!=self._stage:
144 self._stage = stage
145 self._updateFlightStatus()
146
147 def setRating(self, rating):
148 """Set the rating to the given value."""
149 if rating!=self._rating:
150 self._rating = rating
151 if self._noGoReason is None:
152 self._updateFlightStatus()
153
154 def setNoGo(self, reason):
155 """Set a No-Go condition with the given reason."""
156 if self._noGoReason is None:
157 self._noGoReason = reason
158 self._updateFlightStatus()
159
160#------------------------------------------------------------------------------
[84]161
162class IntegerEntry(gtk.Entry):
163 """An entry that allows only either an empty value, or an integer."""
164 def __init__(self, defaultValue = None):
165 """Construct the entry."""
166 gtk.Entry.__init__(self)
167
[86]168 self.set_alignment(1.0)
169
[84]170 self._defaultValue = defaultValue
171 self._currentInteger = defaultValue
172 self._selfSetting = False
173 self._set_text()
174
175 self.connect("changed", self._handle_changed)
176
177 def get_int(self):
178 """Get the integer."""
179 return self._currentInteger
180
181 def set_int(self, value):
182 """Set the integer."""
183 if value!=self._currentInteger:
184 self._currentInteger = value
185 self.emit("integer-changed", self._currentInteger)
186 self._set_text()
187
188 def _handle_changed(self, widget):
189 """Handle the changed signal."""
190 if self._selfSetting:
191 return
192 text = self.get_text()
193 if text=="":
194 self.set_int(self._defaultValue)
195 else:
196 try:
197 self.set_int(int(text))
198 except:
199 self._set_text()
200
201 def _set_text(self):
202 """Set the text value from the current integer."""
203 self._selfSetting = True
204 self.set_text("" if self._currentInteger is None
205 else str(self._currentInteger))
206 self._selfSetting = False
207
208#------------------------------------------------------------------------------
209
210gobject.signal_new("integer-changed", IntegerEntry, gobject.SIGNAL_RUN_FIRST,
211 None, (object,))
212
213#------------------------------------------------------------------------------
[105]214
[227]215PROGRAM_NAME = "MAVA Logger X"
216
[228]217WINDOW_TITLE_BASE = PROGRAM_NAME # + " " + _const.VERSION
[105]218
219#------------------------------------------------------------------------------
[175]220
221# A mapping of aircraft types to their screen names
[191]222aircraftNames = { _const.AIRCRAFT_B736 : xstr("aircraft_b736"),
223 _const.AIRCRAFT_B737 : xstr("aircraft_b737"),
224 _const.AIRCRAFT_B738 : xstr("aircraft_b738"),
225 _const.AIRCRAFT_B738C : xstr("aircraft_b738c"),
226 _const.AIRCRAFT_B733 : xstr("aircraft_b733"),
227 _const.AIRCRAFT_B734 : xstr("aircraft_b734"),
228 _const.AIRCRAFT_B735 : xstr("aircraft_b735"),
229 _const.AIRCRAFT_DH8D : xstr("aircraft_dh8d"),
230 _const.AIRCRAFT_B762 : xstr("aircraft_b762"),
231 _const.AIRCRAFT_B763 : xstr("aircraft_b763"),
232 _const.AIRCRAFT_CRJ2 : xstr("aircraft_crj2"),
233 _const.AIRCRAFT_F70 : xstr("aircraft_f70"),
234 _const.AIRCRAFT_DC3 : xstr("aircraft_dc3"),
235 _const.AIRCRAFT_T134 : xstr("aircraft_t134"),
236 _const.AIRCRAFT_T154 : xstr("aircraft_t154"),
237 _const.AIRCRAFT_YK40 : xstr("aircraft_yk40") }
[175]238
239#------------------------------------------------------------------------------
[221]240
[226]241def formatFlightLogLine(timeStr, line):
[221]242 """Format the given flight log line."""
243 """Format the given line for flight logging."""
244 if timeStr is not None:
245 line = timeStr + ": " + line
246 return line + "\n"
247
248#------------------------------------------------------------------------------
[226]249
250def addFaultTag(buffer):
251 """Add a tag named 'fault' to the given buffer."""
252 faultTag = gtk.TextTag(name = "fault")
253 faultTag.set_property("foreground", "red")
254 faultTag.set_property("weight", WEIGHT_BOLD)
255 buffer.get_tag_table().add(faultTag)
256
257#------------------------------------------------------------------------------
258
259def appendTextBuffer(buffer, text, isFault = False):
260 """Append the given line at the end of the given text buffer.
261
262 If isFault is set, use the tag named 'fault'."""
263 if isFault:
264 buffer.insert_with_tags_by_name(buffer.get_end_iter(), text,
265 "fault")
266 else:
267 buffer.insert(buffer.get_end_iter(), text)
268
269#------------------------------------------------------------------------------
Note: See TracBrowser for help on using the repository browser.