View difference between Paste ID: AAusSQ3F and Yh4FPpKq
SHOW: | | - or go back to the newest paste.
1
class SaveAsOziWaypointFileDialog(wx.Dialog):
2
    def __init__(self, parent, document, path):
3
        wx.Dialog.__init__(self, parent, -1, 'Save as Ozi waypoint file',
4
                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
5
6
        self.document = document
7
        self.path = path
8
9
        self.initialize_ui()
10
11
        # Increase the width of the dialog and centre it on the screen.
12
        self.SetSizeWH(600, -1)
13
        self.CenterOnScreen()
14
15
        self.Bind(wx.EVT_BUTTON, self.on_button)
16
        self.Bind(wx.EVT_RADIOBUTTON, self.on_radio_button)
17
18
    def _column_picker_row(self, parent, grid, row_index, label):
19
        # The label.
20
        grid.Add(
21
            wx.StaticText(parent, -1, label), (row_index, 0),
22
            (1, 1), wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL
23
        )
24
25
        # The text control.
26
        tc = wx.TextCtrl(parent, -1)
27
        tc.Font = wx.Font(*const.FONT_FIXEDWIDTH)
28
29
        grid.Add(
30
            tc, (row_index, 1), (1, 1),
31
            wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND
32
        )
33
34
        # The "add column" button.
35
        add_btn = wx.Button(parent, -1, '+', style=wx.BU_EXACTFIT)
36
        self.Bind(
37
            wx.EVT_BUTTON, partial(self.on_add_to_tc, tc), source=add_btn
38
        )
39
40
        grid.Add(add_btn, (row_index, 2), (1, 1), wx.ALIGN_CENTER_VERTICAL)
41
42
        # Tie the add button to the text control for future use.
43
        tc.add_column_button = add_btn
44
45
        return tc
46
47
    def initialize_ui(self):
48
        # Create a main sizer to get padding from the edges of the window, and
49
        # create a layout sizer inside it for positioning controls.
50
        main_sizer = wx.BoxSizer(wx.VERTICAL)
51
52
        # Add the text controls for the waypoint info.
53
        waypoint_info_box = wx.StaticBox(self, -1, 'Waypoint info')
54
        waypoint_info_box_sizer = wx.StaticBoxSizer(waypoint_info_box)
55
        waypoint_info_layout = wx.GridBagSizer(5, 5)
56
57
        self.tc_wpname = self._column_picker_row(
58
            waypoint_info_box, waypoint_info_layout, 0, 'Waypoint name'
59
        )
60
        self.tc_wpdescr = self._column_picker_row(
61
            waypoint_info_box, waypoint_info_layout, 1, 'Waypoint description'
62
        )
63
        waypoint_info_layout.AddGrowableCol(1)
64
65
        waypoint_info_box_sizer.Add(
66
            waypoint_info_layout, 1, wx.ALL | wx.EXPAND, 10
67
        )
68
        main_sizer.Add(
69
            waypoint_info_box_sizer, 0, flag=wx.ALL | wx.EXPAND, border=10
70
        )
71
72
        # Add the controls for waypoint coordinates.
73
        coords_box = wx.StaticBox(self, -1, 'Waypoint coordinates')
74
        coords_box_sizer = wx.StaticBoxSizer(coords_box,
75
                                                      wx.HORIZONTAL)
76
        waypoint_coords_layout = wx.GridBagSizer(5, 5)
77
78
        wgs84_sizer = wx.GridBagSizer(5, 5)
79
80
        # The WGS 84 radio button.
81
        self.rb_wgs84 = wx.RadioButton(coords_box, -1, 'WGS 84 decimals')
82
        self.rb_wgs84.Value = True
83
        wgs84_sizer.Add(self.rb_wgs84, (0, 0), (1, 2), wx.BOTTOM, 10)
84
85
        # The column WGS 84 column pickers.
86
        self.tc_lat = self._column_picker_row(
87
            coords_box, wgs84_sizer, 1, 'Latitude'
88
        )
89
        self.tc_lng = self._column_picker_row(
90
            coords_box, wgs84_sizer, 2, 'Longitude'
91
        )
92
        wgs84_sizer.AddGrowableCol(1)
93
94
        # The UTM coordinate radio button and column pickers.
95
        utm_sizer = wx.GridBagSizer(5, 5)
96
97
        self.rb_utm = wx.RadioButton(coords_box, -1, 'UTM')
98
        utm_sizer.Add(self.rb_utm, (0, 0), (1, 2), wx.BOTTOM, 10)
99
100
        self.tc_utmz = self._column_picker_row(
101
            coords_box, utm_sizer, 1, 'Zone'
102
        )
103
        self.tc_utmx = self._column_picker_row(
104
            coords_box, utm_sizer, 2, 'Northing'
105
        )
106
        self.tc_utmy = self._column_picker_row(
107
            coords_box, utm_sizer, 3, 'Easting'
108
        )
109
        utm_sizer.AddGrowableCol(1)
110
111
        # Disable the UTM controls initially.
112
        for tc in [self.tc_utmz, self.tc_utmx, self.tc_utmy]:
113
            tc.Disable()
114
            tc.add_column_button.Disable()
115
116
        coords_box_sizer.Add(wgs84_sizer, 1, wx.EXPAND | wx.ALL, 10)
117
        coords_box_sizer.Add(utm_sizer, 1, wx.EXPAND | wx.ALL, 10)
118
        main_sizer.Add(coords_box_sizer, 0, wx.ALL | wx.EXPAND, border=10)
119
120
        # Add the save and cancel buttons.
121
        button_sizer = wx.BoxSizer(wx.HORIZONTAL)
122
        button_sizer.Add(wx.Button(self, wx.ID_OK, 'Save'), 0, wx.RIGHT, 5)
123
        button_sizer.Add(wx.Button(self, wx.ID_CANCEL, 'Cancel'), 0)
124
125
        main_sizer.AddStretchSpacer()
126
        main_sizer.Add(wx.StaticLine(self, -1), flag=wx.EXPAND | wx.ALL,
127
                       border=5)
128
        main_sizer.Add(button_sizer, flag=wx.ALIGN_RIGHT | wx.ALL,
129
                       border=5)
130
131
        # Set the OK button to the default button.
132
        self.FindWindowById(wx.ID_OK).SetDefault()
133
134
        self.SetSizerAndFit(main_sizer)
135
136
    def on_add_to_tc(self, tc, event):
137
        """Event handler for the small + buttons."""
138
        # Give the user a list of column headers to choose from.
139
        headers = self.document.table.column_headers
140
141
        dialog = wx.SingleChoiceDialog(
142
            self, 'Which column would you like to add?', 'Choose a column',
143
            headers, wx.CHOICEDLG_STYLE
144
        )
145
146
        if dialog.ShowModal() == wx.ID_OK:
147
            choice = dialog.StringSelection
148
            tc.AppendText('{{{}}}'.format(choice))
149
150
    def on_button(self, event):
151
        # Validate input when OK is clicked. If there are any errors, inform
152
        # the user and stop the dialog from closing.
153
        if event.Id == wx.ID_OK:
154
            pass
155
        else:
156
            event.Skip()
157
158
    def on_radio_button(self, event):
159
        source = self.FindWindowById(event.Id)
160
        wgs84_checked = source is self.rb_wgs84 and event.Checked()
161
        utm_checked = not wgs84_checked
162
163
        # Set the control states.
164
        for tc in [self.tc_lat, self.tc_lng]:
165
            tc.Enable(wgs84_checked)
166
            tc.add_column_button.Enable(wgs84_checked)
167
168
        for tc in [self.tc_utmz, self.tc_utmx, self.tc_utmy]:
169
            tc.Enable(utm_checked)
170
            tc.add_column_button.Enable(utm_checked)