Example #1
0
 def AddSpinFloat(self,
                  label,
                  min_value,
                  max_value,
                  increment,
                  default,
                  digits=2):
     c = wx.SpinCtrlDouble(self.panel, -1)
     c.SetRange(min_value, max_value)
     c.SetValue(default)
     c.SetIncrement(increment)
     c.SetDigits(digits)
     s1 = "%.*f" % (digits, min_value)
     s2 = "%.*f" % (digits, max_value)
     if len(s1) > len(s2):
         s = s1
     else:
         s = s2
     if hasattr(c, 'GetSizeFromText'):
         size = c.GetSizeFromText(s + " ")
         c.SetMinSize(size)
     self.AddControl(c, label, default)
     self.row.Add(wx.StaticText(self.panel, label=label), 0, wx.LEFT, 20)
     self.row.Add(c, 0, wx.LEFT, 20)
     self.row.Add(wx.StaticText(self.panel, label=""), 0, wx.LEFT, 20)
     self.Bind(wx.EVT_SPINCTRLDOUBLE, self.OnValue)
Example #2
0
    def __init__(self, title, graphdef, callback):
        wx.Dialog.__init__(self, None, -1, title, size=(900, 400))

        self.callback = callback
        self.graphdef = graphdef

        self.panel = wx.Panel(self, -1)
        vbox = wx.BoxSizer(wx.VERTICAL)

        # name entry
        hbox_name = wx.BoxSizer(wx.HORIZONTAL)
        st_name = wx.StaticText(self.panel, -1, 'Name: ')
        self.tc_name = wx.TextCtrl(self.panel, -1, size=(400, -1))
        self.tc_name.Value = self.graphdef.name
        hbox_name.Add(st_name, 0, wx.LEFT, 10)
        hbox_name.Add(self.tc_name, 0, wx.LEFT, 35)
        vbox.Add(hbox_name, 0, wx.TOP, 10)

        # expression entry
        st = wx.StaticText(self.panel, -1, 'Expressions: ')
        vbox.Add(st, 0, wx.LEFT, 10)

        hbox_expressions = wx.BoxSizer(wx.HORIZONTAL)
        self.tc_expressions = wx.TextCtrl(self.panel,
                                          -1,
                                          style=wx.TE_MULTILINE | wx.HSCROLL,
                                          size=(800, 80))
        elist = []
        for e in self.graphdef.expressions:
            e = ' '.join(e.split())
            elist.append(e)
        self.tc_expressions.Value = '\n'.join(elist)
        vbox.Add(self.tc_expressions, 0, wx.LEFT, 15)

        # description entry
        st = wx.StaticText(self.panel, -1, 'Description: ')
        vbox.Add(st, 0, wx.LEFT, 10)
        self.tc_description = wx.TextCtrl(self.panel,
                                          -1,
                                          style=wx.TE_MULTILINE)
        vbox.Add(self.tc_description, 1,
                 wx.EXPAND | wx.TOP | wx.RIGHT | wx.LEFT, 15)
        self.tc_description.Value = self.graphdef.description

        # buttons
        button_save = wx.Button(self.panel, 1, 'Save')
        button_cancel = wx.Button(self.panel, 2, 'Cancel')
        button_test = wx.Button(self.panel, 3, 'Test')
        hbox_buttons = wx.BoxSizer(wx.HORIZONTAL)
        hbox_buttons.Add(button_save, 0, wx.LEFT, 10)
        hbox_buttons.Add(button_cancel, 0, wx.LEFT, 10)
        hbox_buttons.Add(button_test, 0, wx.LEFT, 10)
        vbox.Add(hbox_buttons, 0, wx.TOP, 10)
        self.Bind(wx.EVT_BUTTON, self.OnSave, id=1)
        self.Bind(wx.EVT_BUTTON, self.OnCancel, id=2)
        self.Bind(wx.EVT_BUTTON, self.OnTest, id=3)

        self.panel.SetSizer(vbox)
        self.Centre()
Example #3
0
 def AddSpinInteger(self, label, min_value, max_value, default):
     c = wx.SpinCtrl(self.panel, -1)
     c.SetRange(min_value, max_value)
     c.SetValue(default)
     self.AddControl(c, label, default)
     self.row.Add(wx.StaticText(self.panel, label=label), 0, wx.LEFT, 20)
     self.row.Add(c, 0, wx.LEFT, 20)
     self.row.Add(wx.StaticText(self.panel, label=""), 0, wx.LEFT, 20)
     self.Bind(wx.EVT_SPINCTRL, self.OnValue)
Example #4
0
    def on_timer(self, event):
        state = self.state
        if state.close_event.wait(0.001):
            self.timer.Stop()
            self.Destroy()
            return
        while state.child_pipe_recv.poll():
            try:
                obj = state.child_pipe_recv.recv()
            except EOFError:
                self.timer.Stop()
                self.Destroy()
                return

            if isinstance(obj, Value):
                # request to set a status field
                if not obj.name in self.values:
                    # create a new status field
                    value = wx.StaticText(self.panel, -1, obj.text)
                    # possibly add more status rows
                    for i in range(len(self.status), obj.row + 1):
                        self.status.append(wx.BoxSizer(wx.HORIZONTAL))
                        self.vbox.Insert(len(self.status) - 1,
                                         self.status[i],
                                         0,
                                         flag=wx.ALIGN_LEFT | wx.TOP)
                        self.vbox.Layout()
                    self.status[obj.row].Add(value, border=5)
                    self.status[obj.row].AddSpacer(20)
                    self.values[obj.name] = value
                value = self.values[obj.name]
                value.SetForegroundColour(obj.fg)
                value.SetBackgroundColour(obj.bg)
                value.SetLabel(obj.text)
                self.panel.Layout()
                #self.values_rest[obj.name] = {"text": obj.text, "fg": obj.fg, "bg": obj.bg, "row": obj.row}
            elif isinstance(obj, Text):
                '''request to add text to the console'''
                #self.text_rest.add({"text": obj.text, "fg": obj.fg, "bg": obj.bg})
                self.pending.append(obj)
                for p in self.pending:
                    # we're scrolled at the bottom
                    oldstyle = self.control.GetDefaultStyle()
                    style = wx.TextAttr()
                    style.SetTextColour(p.fg)
                    style.SetBackgroundColour(p.bg)
                    self.control.SetDefaultStyle(style)
                    self.control.AppendText(p.text)
                    self.control.SetDefaultStyle(oldstyle)
                self.pending = []
            elif isinstance(obj, mp_menu.MPMenuTop):
                if obj is not None:
                    self.SetMenuBar(None)
                    self.menu = obj
                    self.SetMenuBar(self.menu.wx_menu())
                    self.Bind(wx.EVT_MENU, self.on_menu)
                self.Refresh()
                self.Update()
            elif isinstance(obj, win_layout.WinLayout):
                win_layout.set_wx_window_layout(self, obj)
Example #5
0
 def AddCombo(self, label, choices):
     c = wx.ComboBox(choices=choices,
                     parent=self.panel,
                     style=0,
                     value=choices[0])
     self.AddControl(c, label, choices[0])
     c.Bind(wx.EVT_COMBOBOX, self.OnValue)
     self.row.Add(wx.StaticText(self.panel, label=label), 0, wx.LEFT, 20)
     self.row.Add(c, 0, wx.LEFT, 20)
        def InitUI(self):
            color = wx.Colour()
            color.SetFromString(LIGHT_BACKGROUND)
            self.SetBackgroundColour(scale_color(color, 0.95))

            font = self.GetFont()
            font.SetWeight(wx.FONTWEIGHT_BOLD)
            font.SetPointSize(24)
            self.SetFont(font)

            self.SetMinSize((400, -1))

            self.compass_text = wx.StaticText(self)

            self.fitness_value_text = wx.StaticText(self)
            font.SetWeight(wx.FONTWEIGHT_NORMAL)
            self.fitness_value_text.SetFont(font)

            self.parameters_sizer = self.CalibrationParameters()

            fitness_sizer = wx.BoxSizer(wx.HORIZONTAL)
            text = wx.StaticText(self, label='Fitness')
            text.SetFont(self.fitness_value_text.GetFont())
            fitness_sizer.Add(text, proportion=1, flag=wx.EXPAND)
            fitness_sizer.Add(self.fitness_value_text)

            sizer = wx.BoxSizer(wx.VERTICAL)
            self.SetSizer(sizer)
            sizer.AddSpacer(16)
            sizer.Add(self.compass_text, border=16, flag=wx.LEFT | wx.RIGHT)
            sizer.AddSpacer(16)
            sizer.Add(self.StatusPanel(), flag=wx.EXPAND)
            sizer.AddSpacer(16)
            sizer.Add(fitness_sizer,
                      border=16,
                      flag=wx.LEFT | wx.RIGHT | wx.EXPAND)
            sizer.AddSpacer(16)
            sizer.Add(self.parameters_sizer,
                      border=16,
                      flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND)

            sizer.Hide(self.parameters_sizer)
Example #7
0
 def StartRow(self, label=None):
     if self.row:
         self.EndRow()
     if label:
         self.row = wx.BoxSizer(wx.HORIZONTAL)
         text = wx.StaticText(self.panel, label=label)
         font = wx.Font(16, wx.DEFAULT, wx.NORMAL, wx.BOLD)
         text.SetFont(font)
         self.row.Add(text, 0, wx.LEFT, 10)
         self.vbox.Add(self.row, 0, wx.TOP, 10)
     self.row = wx.BoxSizer(wx.HORIZONTAL)
Example #8
0
    def legend_panel(*k, **kw):
        if MagcalPanel._legend_panel:
            return MagcalPanel._legend_panel

        p = MagcalPanel._legend_panel = wx.Panel(*k, **kw)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        p.SetSizer(sizer)

        marker = wx.Panel(p, wx.ID_ANY, size=(10, 10))
        marker.SetBackgroundColour(MagcalPanel._empty_color)
        sizer.Add(marker, flag=wx.ALIGN_CENTER)
        text = wx.StaticText(p, wx.ID_ANY)
        text.SetLabel('Sections not hit')
        sizer.Add(text, border=4, flag=wx.ALIGN_CENTER | wx.LEFT)

        marker = wx.Panel(p, wx.ID_ANY, size=(10, 10))
        marker.SetBackgroundColour(MagcalPanel._filled_color)
        sizer.Add(marker, border=10, flag=wx.ALIGN_CENTER | wx.LEFT)
        text = wx.StaticText(p, wx.ID_ANY)
        text.SetLabel('Sections hit')
        sizer.Add(text, border=4, flag=wx.ALIGN_CENTER | wx.LEFT)
        return p
Example #9
0
    def __init__(self, *k, **kw):
        super(MagcalPanel, self).__init__(*k, **kw)

        facecolor = self.GetBackgroundColour().GetAsString(wx.C2S_HTML_SYNTAX)
        fig = plt.figure(facecolor=facecolor, figsize=(1, 1))

        self._canvas = FigureCanvas(self, wx.ID_ANY, fig)
        self._canvas.SetMinSize((300, 300))

        self._id_text = wx.StaticText(self, wx.ID_ANY)
        self._status_text = wx.StaticText(self, wx.ID_ANY)
        self._completion_pct_text = wx.StaticText(self, wx.ID_ANY)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self._id_text)
        sizer.Add(self._status_text)
        sizer.Add(self._completion_pct_text)
        sizer.Add(self._canvas, proportion=1, flag=wx.EXPAND)
        self.SetSizer(sizer)

        ax = fig.add_subplot(111, axis_bgcolor=facecolor, projection='3d')
        self.configure_plot(ax)
Example #10
0
    def Header(self, parent):
        header = Panel(parent)
        header.SetBackgroundColour(LIGHT_BACKGROUND)

        sizer = wx.BoxSizer(wx.VERTICAL)
        header.SetSizer(sizer)

        font = header.GetFont()
        font.SetWeight(wx.FONTWEIGHT_BOLD)

        text = wx.StaticText(header)
        text.SetLabel('Compass Calibration')
        text.SetForegroundColour(PRIMARY_HIGHLIGHT)
        font.SetPointSize(26)
        text.SetFont(font)
        sizer.Add(text, border=16, flag=wx.ALL & ~wx.BOTTOM)

        text = wx.StaticText(header)
        text.SetLabel('Follow the procedure to calibrate your compass')
        font.SetPointSize(14)
        text.SetFont(font)
        sizer.Add(text, border=16, flag=wx.ALL & ~wx.TOP)

        return header
Example #11
0
        def StatusPanel(self):
            panel = Panel(self)

            panel.SetBackgroundColour(ReportDialog.light_background)

            self.status_icon = ReportDialog.StatusIcon(panel, size=(44, 44))
            self.status_text = wx.StaticText(panel)

            sizer = wx.BoxSizer(wx.HORIZONTAL)
            panel.SetSizer(sizer)
            sizer.AddSpacer(16)
            sizer.Add(self.status_icon, border=5, flag=wx.TOP | wx.BOTTOM)
            sizer.AddSpacer(16)
            sizer.Add(self.status_text, flag=wx.ALIGN_CENTER)
            sizer.AddSpacer(16)

            return panel
Example #12
0
 def _add_input(self, setting, ctrl, ctrl2=None, value=None):
     tab_name = setting.tab
     label = setting.label
     tab = self.panel(tab_name)
     box = wx.BoxSizer(wx.HORIZONTAL)
     labelctrl = wx.StaticText(tab, -1, label)
     box.Add(labelctrl, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
     box.Add(ctrl, 1, wx.ALIGN_CENTRE | wx.ALL, 5)
     if ctrl2 is not None:
         box.Add(ctrl2, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
     self.sizer(tab_name).Add(box, 0, wx.GROW | wx.ALL, 5)
     self.controls[label] = ctrl
     if value is not None:
         ctrl.Value = value
     else:
         ctrl.Value = str(setting.value)
     self.control_map[ctrl.GetId()] = label
     self.setting_map[label] = setting
Example #13
0
    def LoaderProgress(self, parent):
        panel = wx.Panel(parent)
        panel.SetBackgroundColour(parent.GetBackgroundColour())

        font = panel.GetFont()
        font.MakeItalic()
        panel.SetFont(font)

        self.load_progress = wx.Gauge(panel, size=(-1, 10))
        self.load_progress_last_time = time.time()
        self.load_text = wx.StaticText(panel)

        sizer = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(sizer)
        sizer.Add(self.load_progress, border=10, flag=wx.EXPAND | wx.LEFT | wx.RIGHT)
        sizer.Add(self.load_text, border=10, flag=wx.LEFT | wx.RIGHT)

        return panel
Example #14
0
    def __init__(self, state, parent):
        wx.Panel.__init__(self, parent)  # , style=wx.BORDER_SIMPLE)
        self.state = state

        self.sizer = wx.BoxSizer(wx.VERTICAL)

        self.titleText = wx.StaticText(
            self, label="Unassigned Vehicles -->\n\nTools:")
        self.sizer.Add(self.titleText, flag=wx.EXPAND |
                       wx.LEFT | wx.RIGHT, border=5)

        self.getParamsButton = wx.Button(
            self, label="Get offsets", size=wx.Size(100, 50))
        self.Bind(wx.EVT_BUTTON, self.getParams, self.getParamsButton)
        self.resetButton = wx.Button(
            self, label="Reset layout", size=wx.Size(100, 50))
        self.Bind(wx.EVT_BUTTON, self.reset, self.resetButton)

        self.sizer.Add(self.getParamsButton)
        self.sizer.Add(self.resetButton)

        # Do the sizer layout
        self.SetSizer(self.sizer)
Example #15
0
    def ProgressPanel(self, parent):
        panel = Panel(parent)
        panel.SetBackgroundColour(LIGHT_BACKGROUND)

        self.progress = wx.StaticText(panel, label='0%')
        font = self.progress.GetFont()
        font.SetPointSize(70)
        font.SetWeight(wx.FONTWEIGHT_BOLD)
        self.progress.SetFont(font)

        self.grid = GeodesicGrid(panel)
        self.grid.SetMinSize((365, 365))

        sizer = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(sizer)
        sizer.AddStretchSpacer()
        sizer.Add(self.grid, flag=wx.ALIGN_CENTER)
        sizer.AddStretchSpacer()
        sizer.AddSpacer(16)
        sizer.Add(self.progress, flag=wx.ALIGN_CENTER)
        sizer.AddStretchSpacer()

        return panel
        def CalibrationParameters(self):
            self.offsets_texts = tuple(wx.StaticText(self) for _ in range(3))
            self.diagonals_texts = tuple(wx.StaticText(self) for _ in range(3))
            self.offdiagonals_texts = tuple(
                wx.StaticText(self) for _ in range(3))

            table = (
                ('Offsets', self.offsets_texts),
                ('Diagonals', self.diagonals_texts),
                ('Off-diagonals', self.offdiagonals_texts),
            )

            sizer = wx.FlexGridSizer(len(table) + 1, 4, 4, 10)
            sizer.AddGrowableCol(0)

            font = self.GetFont()
            font.SetPointSize(14)
            font.MakeItalic()

            text = wx.StaticText(self, label='Parameter')
            text.SetFont(font)
            sizer.Add(text)
            for label in ('X', 'Y', 'Z'):
                text = wx.StaticText(self, label=label)
                text.SetFont(font)
                sizer.Add(text, flag=wx.ALIGN_CENTER)

            font.SetWeight(wx.FONTWEIGHT_NORMAL)

            for label, (x, y, z) in table:
                text = wx.StaticText(self)
                text.SetLabel(label)

                text.SetFont(font)
                x.SetFont(font)
                y.SetFont(font)
                z.SetFont(font)

                sizer.Add(text)
                sizer.Add(x, flag=wx.ALIGN_RIGHT)
                sizer.Add(y, flag=wx.ALIGN_RIGHT)
                sizer.Add(z, flag=wx.ALIGN_RIGHT)

            return sizer
Example #17
0
    def __init__(self, conn):
        super(MagcalFrame, self).__init__(
            None,
            wx.ID_ANY,
            title='Magcal Graph',
        )

        self.SetMinSize((300, 300))

        self._conn = conn

        self._main_panel = wx.ScrolledWindow(self, wx.ID_ANY)
        self._main_panel.SetScrollbars(1, 1, 1, 1)

        self._magcal_panels = {}

        self._sizer = wx.BoxSizer(wx.VERTICAL)
        self._main_panel.SetSizer(self._sizer)

        idle_text = wx.StaticText(self._main_panel, wx.ID_ANY)
        idle_text.SetLabelMarkup(
            '<i>No calibration messages received yet...</i>')
        idle_text.SetForegroundColour('#444444')

        self._sizer.AddStretchSpacer()
        self._sizer.Add(
            idle_text,
            proportion=0,
            flag=wx.ALIGN_CENTER | wx.ALL,
            border=10,
        )
        self._sizer.AddStretchSpacer()

        self._timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.timer_callback, self._timer)
        self._timer.Start(200)
Example #18
0
    def updateLayout(self, layout):
        '''Update (recreate) the GUI layout, based on known vehicles'''
        leaders = []  # array of (sysid, compid, followid, vehtype)

        # create list of leaders, another vehicle has it's sysid as leader
        for veh in layout:
            for vehL in layout:
                if vehL[2] == veh[0] and veh not in leaders:
                    leaders.append(veh)

        # create list of followers
        followers = {}  # dict of key=leadersysid, (sysid, compid, vehtype)
        maxfollowers = 0
        for veh in layout:
            # don't include leaders in the follower list
            if veh[2] != 0:
                if veh[2] not in followers.keys():
                    followers[veh[2]] = [(veh[0], veh[1], veh[3])]
                else:
                    followers[veh[2]].append((veh[0], veh[1], veh[3]))
                if len(followers[veh[2]]) > maxfollowers:
                    maxfollowers = len(followers[veh[2]])

        # sort followers by sysid increasing
        for fwr in followers.keys():
            followers[fwr].sort(key=lambda tup: tup[0])

        # Any unassigned vehicles: Leader with 0 followers OR leader not present
        # OR vehicles not present in either list (leftovers)
        unassignedVeh = []  # (sysid, compid, vehtype)

        # Leader with no followers
        for index, veh in enumerate(leaders):
            if veh[0] not in followers.keys():
                del leaders[index]
                unassignedVeh.append((veh[0], veh[1], veh[3]))

        # Not present in either list
        allfollowersflat = []
        for fl in followers.items():
            for vv in fl[1]:
                allfollowersflat.append(vv[0])
        for veh in layout:
            if (veh not in leaders) and veh[0] not in allfollowersflat:
                unassignedVeh.append((veh[0], veh[1], veh[3]))

        # Leader not present
        for leader in followers.copy().keys():
            if leader not in [i[0] for i in leaders]:
                for veh in followers[leader]:
                    unassignedVeh.append(veh)
                del followers[leader]  # followers.remove(leader)

        self.sizer.Clear(True)
        colsVeh = max(maxfollowers, len(unassignedVeh))
        self.sizer = wx.FlexGridSizer((len(leaders)*2) + 1, colsVeh+1+1, 5, 0)

        # start populating the grid
        # for each row:
        for leader in leaders:
            panelLeader = VehiclePanel(
                self.state, self.panel, leader[0], leader[1], leader[3], True, followers[leader[0]], self.takeoffalt)
            self.sizer.Add(panelLeader)

            # add vertical line
            line = wx.StaticLine(self.panel, style=wx.LI_VERTICAL)
            self.sizer.Add(line, proportion=0, flag=wx.EXPAND |
                           wx.LEFT | wx.RIGHT, border=5)

            for follower in range(colsVeh):
                if leader[0] in followers.keys() and len(followers[leader[0]]) > follower:
                    panelFollower = VehiclePanel(self.state, self.panel, followers[leader[0]][follower][0], followers[
                                                 leader[0]][follower][1], followers[leader[0]][follower][2], False, None, self.takeoffalt)
                else:
                    panelFollower = wx.StaticText(self.panel, label="N/A")
                self.sizer.Add(panelFollower, flag=wx.EXPAND |
                               wx.LEFT | wx.RIGHT, border=5)

            # add horizontal line, column by column
            for follower in range(colsVeh+1+1):
                line = wx.StaticLine(self.panel, style=wx.LI_HORIZONTAL)
                self.sizer.Add(line, proportion=0,
                               flag=wx.EXPAND | wx.ALL, border=0)

        # add "unassigned" row
        panelUnassigned = UnassignedPanel(self.state, self.panel)
        self.sizer.Add(panelUnassigned, flag=wx.EXPAND |
                       wx.LEFT | wx.RIGHT, border=5)
        line = wx.StaticLine(self.panel, style=wx.LI_VERTICAL)
        self.sizer.Add(line, proportion=0, flag=wx.EXPAND |
                       wx.LEFT | wx.RIGHT, border=5)

        for veh in unassignedVeh:
            panelunassigned = VehiclePanel(
                self.state, self.panel, veh[0], veh[1], veh[2], False, None, self.takeoffalt)
            self.sizer.Add(panelunassigned)

        self.panel.SetSizer(self.sizer)
        self.panel.Layout()
        self.panel.SetupScrolling()
Example #19
0
    def on_timer(self, event):
        state = self.state
        if state.close_event.wait(0.001):
            self.timer.Stop()
            self.Destroy()
            return
        while state.child_pipe_recv.poll():
            try:
                obj = state.child_pipe_recv.recv()
            except EOFError:
                self.timer.Stop()
                self.Destroy()
                return

            if isinstance(obj, Value):
                # request to set a status field
                if obj.name not in self.values:
                    # create a new status field
                    statictextbox = wx.StaticText(self.panel, -1, obj.text)
                    font = wx.Font(18, wx.DEFAULT, wx.NORMAL, wx.NORMAL)
                    statictextbox.SetFont(font)
                    # possibly add more status rows
                    for i in range(len(self.status), obj.row + 1):
                        self.status.append(wx.BoxSizer(wx.HORIZONTAL))
                        self.vbox.Insert(len(self.status) - 1,
                                         self.status[i],
                                         0,
                                         flag=wx.ALIGN_LEFT | wx.TOP)
                        self.vbox.Layout()
                    self.status[obj.row].Add(statictextbox, border=5)
                    self.status[obj.row].AddSpacer(20)
                    self.values[obj.name] = statictextbox
                statictextbox = self.values[obj.name]
                statictextbox.SetForegroundColour(obj.fg)
                statictextbox.SetBackgroundColour(obj.bg)
                statictextbox.SetLabel(obj.text)
                self.panel.Layout()
            elif isinstance(obj, Text):
                '''request to add text to the console'''
                self.pending.append(obj)
                for p in self.pending:
                    # we're scrolled at the bottom
                    oldstyle = self.control.GetDefaultStyle()
                    style = wx.TextAttr()
                    style.SetTextColour(p.fg)
                    style.SetBackgroundColour(p.bg)
                    self.control.SetDefaultStyle(style)
                    self.control.AppendText(p.text)
                    self.control.SetDefaultStyle(oldstyle)
                self.pending = []
            elif isinstance(obj, mp_menu.MPMenuTop):
                if obj is not None:
                    self.SetMenuBar(None)
                    self.menu = obj
                    self.SetMenuBar(self.menu.wx_menu())
                    self.Bind(wx.EVT_MENU, self.on_menu)
                self.Refresh()
                self.Update()
            elif isinstance(obj, mp_menu.MPButton):
                if obj is not None:
                    newbtn = wx.Button(self.panel, label=obj.label)
                    newbtn.Bind(wx.EVT_BUTTON, self.on_button)
                    self.buttongridsizer.Add(newbtn, 0, wx.EXPAND)
                    self.buttons.append(obj)
            elif isinstance(obj, win_layout.WinLayout):
                win_layout.set_wx_window_layout(self, obj)
Example #20
0
    def __init__(self, state, parent, sysid, compid, vehtype, isLeader, listFollowers, takeoffalt):
        wx.Panel.__init__(self, parent)
        self.state = state
        self.sysid = sysid
        self.compid = compid
        self.listFollowers = listFollowers
        self.isLeader = isLeader
        self.vehtype = vehtype

        self.takeoffalt = takeoffalt

        self.inLinkLoss = False

        # XYZ offsets. Filled are we get params
        self.offsetValues = [None, None, None]

        self.sizer = wx.BoxSizer(wx.VERTICAL)

        # Status boxes
        if self.isLeader:
            self.title = wx.StaticText(self, label="Leader {0}:{1} {2}".format(
                sysid, compid, get_vehicle_name(vehtype)))
            self.offsets = wx.StaticText(self, label="Offset: N/A")
        else:
            self.title = wx.StaticText(self, label="Veh {0}:{1} {2}".format(
                sysid, compid, get_vehicle_name(vehtype)))
            self.offsets = wx.StaticText(self, label="Offset: xxxxxx")

        self.armmode = wx.StaticText(self, label="armed/mode N/A    ")
        self.thrAlt = wx.StaticText(
            self, label="Alt: {0}m    Thr: {1}%".format(0, 0))
        self.altRel = wx.StaticText(self, label="Rel Alt: {0}m".format(0))
        self.battery = wx.StaticText(self, label="Battery: {0}V".format(0))
        self.status = wx.StaticText(self, label="Status: N/A")
        self.prearm = wx.StaticText(self, label="Prearm: N/A")
        self.statusText = wx.TextCtrl(
            self, style=wx.TE_READONLY | wx.TE_MULTILINE, size=wx.Size(140, 100))

        # Command buttons
        self.doArm = wx.Button(self, label="XXX", size=wx.Size(100, 50))
        self.Bind(wx.EVT_BUTTON, self.arm, self.doArm)
        if self.isLeader:
            self.armSizer = wx.BoxSizer(wx.HORIZONTAL)
            self.doArmAll = wx.Button(self, label="ALL", size=wx.Size(70, 50))
            self.Bind(wx.EVT_BUTTON, self.armAll, self.doArmAll)

        self.doGuided = wx.Button(
            self, label="Mode GUIDED", size=wx.Size(100, 50))
        self.Bind(wx.EVT_BUTTON, self.guided, self.doGuided)
        if self.isLeader:
            self.guidedSizer = wx.BoxSizer(wx.HORIZONTAL)
            self.doGuidedAll = wx.Button(
                self, label="ALL", size=wx.Size(70, 50))
            self.Bind(wx.EVT_BUTTON, self.guidedAll, self.doGuidedAll)

        if vehtype != mavutil.mavlink.MAV_TYPE_GROUND_ROVER:
            self.doGuidedTakeoff = wx.Button(
                self, label="GUIDED T/O {0}m".format(self.takeoffalt), size=wx.Size(130, 50))
            self.Bind(wx.EVT_BUTTON, self.guidedTakeoff, self.doGuidedTakeoff)
            if self.isLeader:
                self.takeoffSizer = wx.BoxSizer(wx.HORIZONTAL)
                self.doGuidedTakeoffAll = wx.Button(
                    self, label="ALL".format(self.takeoffalt), size=wx.Size(70, 50))
                self.Bind(wx.EVT_BUTTON, self.guidedTakeoffAll,
                          self.doGuidedTakeoffAll)

        self.doRTL = wx.Button(self, label="Mode RTL", size=wx.Size(100, 50))
        self.Bind(wx.EVT_BUTTON, self.rtl, self.doRTL)
        if self.isLeader:
            self.rtlSizer = wx.BoxSizer(wx.HORIZONTAL)
            self.doRTLAll = wx.Button(self, label="ALL", size=wx.Size(70, 50))
            self.Bind(wx.EVT_BUTTON, self.rtlAll, self.doRTLAll)

        self.doKill = wx.Button(self, label="KILL", size=wx.Size(100, 50))
        self.killTimer = None
        self.Bind(wx.EVT_BUTTON, self.kill, self.doKill)
        if self.isLeader:
            self.killSizer = wx.BoxSizer(wx.HORIZONTAL)
            self.doKillAll = wx.Button(self, label="ALL", size=wx.Size(70, 50))
            self.killAllTimer = None
            self.Bind(wx.EVT_BUTTON, self.killall, self.doKillAll)

        if self.isLeader:
            self.doFollowAll = wx.Button(
                self, label="All Follow Leader", size=wx.Size(130, 50))
            self.Bind(wx.EVT_BUTTON, self.followAll, self.doFollowAll)
            self.doAUTO = wx.Button(
                self, label="Mode AUTO", size=wx.Size(100, 50))
            self.Bind(wx.EVT_BUTTON, self.auto, self.doAUTO)
        else:
            self.doFollow = wx.Button(
                self, label="Mode Follow", size=wx.Size(100, 50))
            self.Bind(wx.EVT_BUTTON, self.follow, self.doFollow)

        # Do the sizer layout
        self.doSizer()

        # get offset params. Needs to be after GUI elements are created
        time.sleep(0.05)
        self.state.child_pipe.send(("getoffsets", self.sysid, self.compid))