source: src/mlx/gui/common.py@ 277:33fbad0ca891

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

Added popup menu to the list of flights

File size: 9.6 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
[246]62 WINDOW_STATE_ICONIFIED = gdk.WINDOW_STATE_ICONIFIED
63 WINDOW_STATE_WITHDRAWN = gdk.WINDOW_STATE_WITHDRAWN
64
[264]65 SORT_ASCENDING = gtk.SORT_ASCENDING
66 SORT_DESCENDING = gtk.SORT_DESCENDING
67
[277]68 EVENT_BUTTON_PRESS = gdk.BUTTON_PRESS
69
[227]70 pixbuf_new_from_file = gdk.pixbuf_new_from_file
71
[97]72 def text2unicode(text):
73 """Convert the given text, returned by a Gtk widget, to Unicode."""
74 return unicode(text)
[276]75
76 def text2str(text):
77 """Convert the given text, returned by xstr to a string."""
78 return str(text)
[28]79else:
80 print "Using PyGObject"
81 pygobject = True
[29]82 from gi.repository import Gdk as gdk
[227]83 from gi.repository import GdkPixbuf as gdkPixbuf
[28]84 from gi.repository import Gtk as gtk
85 from gi.repository import GObject as gobject
86 from gi.repository import AppIndicator3 as appindicator
[44]87 from gi.repository import Pango as pango
[28]88 appIndicator = True
[76]89
[42]90 MESSAGETYPE_ERROR = gtk.MessageType.ERROR
[76]91 MESSAGETYPE_QUESTION = gtk.MessageType.QUESTION
[97]92 MESSAGETYPE_INFO = gtk.MessageType.INFO
[124]93 RESPONSETYPE_OK = gtk.ResponseType.OK
[76]94 RESPONSETYPE_YES = gtk.ResponseType.YES
[124]95 RESPONSETYPE_NO = gtk.ResponseType.NO
[123]96 RESPONSETYPE_ACCEPT = gtk.ResponseType.ACCEPT
97 RESPONSETYPE_REJECT = gtk.ResponseType.REJECT
[149]98 RESPONSETYPE_CANCEL = gtk.ResponseType.CANCEL
[93]99 ACCEL_VISIBLE = gtk.AccelFlags.VISIBLE
100 CONTROL_MASK = gdk.ModifierType.CONTROL_MASK
[123]101 DIALOG_MODAL = gtk.DialogFlags.MODAL
[127]102 WRAP_WORD = gtk.WrapMode.WORD
[132]103 JUSTIFY_CENTER = gtk.Justification.CENTER
[42]104
[144]105 CONTROL_MASK = gdk.ModifierType.CONTROL_MASK
106 SHIFT_MASK = gdk.ModifierType.SHIFT_MASK
107 BUTTON1_MASK = gdk.ModifierType.BUTTON1_MASK
108
109 SCROLL_UP = gdk.ScrollDirection.UP
110 SCROLL_DOWN = gdk.ScrollDirection.DOWN
111
112 SPIN_USER_DEFINED = gtk.SpinType.USER_DEFINED
113
[149]114 FILE_CHOOSER_ACTION_SELECT_FOLDER = gtk.FileChooserAction.SELECT_FOLDER
[151]115 FILE_CHOOSER_ACTION_OPEN = gtk.FileChooserAction.OPEN
116 FILE_CHOOSER_ACTION_SAVE = gtk.FileChooserAction.SAVE
[149]117
[175]118 SELECTION_MULTIPLE = gtk.SelectionMode.MULTIPLE
119
[220]120 SHADOW_IN = gtk.ShadowType.IN
121
122 POLICY_AUTOMATIC = gtk.PolicyType.AUTOMATIC
123
[226]124 WEIGHT_BOLD = pango.Weight.BOLD
125
[246]126 WINDOW_STATE_ICONIFIED = gdk.WindowState.ICONIFIED
127 WINDOW_STATE_WITHDRAWN = gdk.WindowState.WITHDRAWN
128
[264]129 SORT_ASCENDING = gtk.SortType.ASCENDING
130 SORT_DESCENDING = gtk.SortType.DESCENDING
131
[277]132 EVENT_BUTTON_PRESS = gdk.EventType.BUTTON_PRESS
133
[227]134 pixbuf_new_from_file = gdkPixbuf.Pixbuf.new_from_file
135
[97]136 import codecs
137 _utf8Decoder = codecs.getdecoder("utf-8")
138
139 def text2unicode(str):
140 """Convert the given text, returned by a Gtk widget, to Unicode."""
141 return _utf8Decoder(str)[0]
142
[276]143 def text2str(text):
144 """Convert the given text, returned by xstr to a string."""
145 return _utf8Decoder(text)[0]
146
[28]147import cairo
148
[32]149#------------------------------------------------------------------------------
150
151class FlightStatusHandler(object):
152 """Base class for objects that handle the flight status in some way."""
153 def __init__(self):
154 self._stage = None
155 self._rating = 100
156 self._noGoReason = None
157
158 def resetFlightStatus(self):
159 """Reset the flight status."""
160 self._stage = None
161 self._rating = 100
162 self._noGoReason = None
163 self._updateFlightStatus()
164
165 def setStage(self, stage):
166 """Set the stage of the flight."""
167 if stage!=self._stage:
168 self._stage = stage
169 self._updateFlightStatus()
170
171 def setRating(self, rating):
172 """Set the rating to the given value."""
173 if rating!=self._rating:
174 self._rating = rating
175 if self._noGoReason is None:
176 self._updateFlightStatus()
177
178 def setNoGo(self, reason):
179 """Set a No-Go condition with the given reason."""
180 if self._noGoReason is None:
181 self._noGoReason = reason
182 self._updateFlightStatus()
183
184#------------------------------------------------------------------------------
[84]185
186class IntegerEntry(gtk.Entry):
187 """An entry that allows only either an empty value, or an integer."""
188 def __init__(self, defaultValue = None):
189 """Construct the entry."""
190 gtk.Entry.__init__(self)
191
[86]192 self.set_alignment(1.0)
193
[84]194 self._defaultValue = defaultValue
195 self._currentInteger = defaultValue
196 self._selfSetting = False
197 self._set_text()
198
199 self.connect("changed", self._handle_changed)
200
201 def get_int(self):
202 """Get the integer."""
203 return self._currentInteger
204
[241]205 def reset(self):
206 """Reset the integer."""
207 self.set_int(None)
208
[84]209 def set_int(self, value):
210 """Set the integer."""
211 if value!=self._currentInteger:
212 self._currentInteger = value
213 self.emit("integer-changed", self._currentInteger)
214 self._set_text()
215
216 def _handle_changed(self, widget):
217 """Handle the changed signal."""
218 if self._selfSetting:
219 return
220 text = self.get_text()
221 if text=="":
222 self.set_int(self._defaultValue)
223 else:
224 try:
225 self.set_int(int(text))
226 except:
227 self._set_text()
228
229 def _set_text(self):
230 """Set the text value from the current integer."""
231 self._selfSetting = True
232 self.set_text("" if self._currentInteger is None
233 else str(self._currentInteger))
234 self._selfSetting = False
235
236#------------------------------------------------------------------------------
237
238gobject.signal_new("integer-changed", IntegerEntry, gobject.SIGNAL_RUN_FIRST,
239 None, (object,))
240
241#------------------------------------------------------------------------------
[105]242
[227]243PROGRAM_NAME = "MAVA Logger X"
244
[232]245WINDOW_TITLE_BASE = PROGRAM_NAME + " " + _const.VERSION
[105]246
247#------------------------------------------------------------------------------
[175]248
249# A mapping of aircraft types to their screen names
[191]250aircraftNames = { _const.AIRCRAFT_B736 : xstr("aircraft_b736"),
251 _const.AIRCRAFT_B737 : xstr("aircraft_b737"),
252 _const.AIRCRAFT_B738 : xstr("aircraft_b738"),
253 _const.AIRCRAFT_B738C : xstr("aircraft_b738c"),
254 _const.AIRCRAFT_B733 : xstr("aircraft_b733"),
255 _const.AIRCRAFT_B734 : xstr("aircraft_b734"),
256 _const.AIRCRAFT_B735 : xstr("aircraft_b735"),
257 _const.AIRCRAFT_DH8D : xstr("aircraft_dh8d"),
258 _const.AIRCRAFT_B762 : xstr("aircraft_b762"),
259 _const.AIRCRAFT_B763 : xstr("aircraft_b763"),
260 _const.AIRCRAFT_CRJ2 : xstr("aircraft_crj2"),
261 _const.AIRCRAFT_F70 : xstr("aircraft_f70"),
262 _const.AIRCRAFT_DC3 : xstr("aircraft_dc3"),
263 _const.AIRCRAFT_T134 : xstr("aircraft_t134"),
264 _const.AIRCRAFT_T154 : xstr("aircraft_t154"),
265 _const.AIRCRAFT_YK40 : xstr("aircraft_yk40") }
[175]266
267#------------------------------------------------------------------------------
[221]268
[226]269def formatFlightLogLine(timeStr, line):
[221]270 """Format the given flight log line."""
271 """Format the given line for flight logging."""
272 if timeStr is not None:
273 line = timeStr + ": " + line
274 return line + "\n"
275
276#------------------------------------------------------------------------------
[226]277
278def addFaultTag(buffer):
279 """Add a tag named 'fault' to the given buffer."""
280 faultTag = gtk.TextTag(name = "fault")
281 faultTag.set_property("foreground", "red")
282 faultTag.set_property("weight", WEIGHT_BOLD)
283 buffer.get_tag_table().add(faultTag)
284
285#------------------------------------------------------------------------------
286
287def appendTextBuffer(buffer, text, isFault = False):
288 """Append the given line at the end of the given text buffer.
289
290 If isFault is set, use the tag named 'fault'."""
291 if isFault:
292 buffer.insert_with_tags_by_name(buffer.get_end_iter(), text,
293 "fault")
294 else:
295 buffer.insert(buffer.get_end_iter(), text)
296
297#------------------------------------------------------------------------------
Note: See TracBrowser for help on using the repository browser.