bauiv1lib.settings.touchscreen

UI settings functionality related to touchscreens.

  1# Released under the MIT License. See LICENSE for details.
  2#
  3"""UI settings functionality related to touchscreens."""
  4from __future__ import annotations
  5
  6import bauiv1 as bui
  7import bascenev1 as bs
  8
  9
 10class TouchscreenSettingsWindow(bui.Window):
 11    """Settings window for touchscreens."""
 12
 13    def __del__(self) -> None:
 14        # Note - this happens in 'back' too;
 15        # we just do it here too in case the window is closed by other means.
 16
 17        # FIXME: Could switch to a UI destroy callback now that those are a
 18        #  thing that exists.
 19        bs.set_touchscreen_editing(False)
 20
 21    def __init__(self) -> None:
 22        self._width = 650
 23        self._height = 380
 24        self._spacing = 40
 25        self._r = 'configTouchscreenWindow'
 26
 27        bs.set_touchscreen_editing(True)
 28
 29        assert bui.app.classic is not None
 30        uiscale = bui.app.ui_v1.uiscale
 31        super().__init__(
 32            root_widget=bui.containerwidget(
 33                size=(self._width, self._height),
 34                transition='in_right',
 35                scale=(
 36                    1.9
 37                    if uiscale is bui.UIScale.SMALL
 38                    else 1.55
 39                    if uiscale is bui.UIScale.MEDIUM
 40                    else 1.2
 41                ),
 42            )
 43        )
 44
 45        btn = bui.buttonwidget(
 46            parent=self._root_widget,
 47            position=(55, self._height - 60),
 48            size=(120, 60),
 49            label=bui.Lstr(resource='backText'),
 50            button_type='back',
 51            scale=0.8,
 52            on_activate_call=self._back,
 53        )
 54        bui.containerwidget(edit=self._root_widget, cancel_button=btn)
 55
 56        bui.textwidget(
 57            parent=self._root_widget,
 58            position=(25, self._height - 50),
 59            size=(self._width, 25),
 60            text=bui.Lstr(resource=self._r + '.titleText'),
 61            color=bui.app.ui_v1.title_color,
 62            maxwidth=280,
 63            h_align='center',
 64            v_align='center',
 65        )
 66
 67        bui.buttonwidget(
 68            edit=btn,
 69            button_type='backSmall',
 70            size=(60, 60),
 71            label=bui.charstr(bui.SpecialChar.BACK),
 72        )
 73
 74        self._scroll_width = self._width - 100
 75        self._scroll_height = self._height - 110
 76        self._sub_width = self._scroll_width - 20
 77        self._sub_height = 360
 78
 79        self._scrollwidget = bui.scrollwidget(
 80            parent=self._root_widget,
 81            position=(
 82                (self._width - self._scroll_width) * 0.5,
 83                self._height - 65 - self._scroll_height,
 84            ),
 85            size=(self._scroll_width, self._scroll_height),
 86            claims_left_right=True,
 87            claims_tab=True,
 88            selection_loops_to_parent=True,
 89        )
 90        self._subcontainer = bui.containerwidget(
 91            parent=self._scrollwidget,
 92            size=(self._sub_width, self._sub_height),
 93            background=False,
 94            claims_left_right=True,
 95            claims_tab=True,
 96            selection_loops_to_parent=True,
 97        )
 98        self._build_gui()
 99
100    def _build_gui(self) -> None:
101        from bauiv1lib.config import ConfigNumberEdit, ConfigCheckBox
102        from bauiv1lib.radiogroup import make_radio_group
103
104        # Clear anything already there.
105        children = self._subcontainer.get_children()
106        for child in children:
107            child.delete()
108        h = 30
109        v = self._sub_height - 85
110        clr = (0.8, 0.8, 0.8, 1.0)
111        clr2 = (0.8, 0.8, 0.8)
112        bui.textwidget(
113            parent=self._subcontainer,
114            position=(-10, v + 43),
115            size=(self._sub_width, 25),
116            text=bui.Lstr(resource=self._r + '.swipeInfoText'),
117            flatness=1.0,
118            color=(0, 0.9, 0.1, 0.7),
119            maxwidth=self._sub_width * 0.9,
120            scale=0.55,
121            h_align='center',
122            v_align='center',
123        )
124        cur_val = bui.app.config.get('Touch Movement Control Type', 'swipe')
125        bui.textwidget(
126            parent=self._subcontainer,
127            position=(h, v - 2),
128            size=(0, 30),
129            text=bui.Lstr(resource=self._r + '.movementText'),
130            maxwidth=190,
131            color=clr,
132            v_align='center',
133        )
134        cb1 = bui.checkboxwidget(
135            parent=self._subcontainer,
136            position=(h + 220, v),
137            size=(170, 30),
138            text=bui.Lstr(resource=self._r + '.joystickText'),
139            maxwidth=100,
140            textcolor=clr2,
141            scale=0.9,
142        )
143        cb2 = bui.checkboxwidget(
144            parent=self._subcontainer,
145            position=(h + 357, v),
146            size=(170, 30),
147            text=bui.Lstr(resource=self._r + '.swipeText'),
148            maxwidth=100,
149            textcolor=clr2,
150            value=False,
151            scale=0.9,
152        )
153        make_radio_group(
154            (cb1, cb2), ('joystick', 'swipe'), cur_val, self._movement_changed
155        )
156        v -= 50
157        ConfigNumberEdit(
158            parent=self._subcontainer,
159            position=(h, v),
160            xoffset=65,
161            configkey='Touch Controls Scale Movement',
162            displayname=bui.Lstr(
163                resource=self._r + '.movementControlScaleText'
164            ),
165            changesound=False,
166            minval=0.1,
167            maxval=4.0,
168            increment=0.1,
169        )
170        v -= 50
171        cur_val = bui.app.config.get('Touch Action Control Type', 'buttons')
172        bui.textwidget(
173            parent=self._subcontainer,
174            position=(h, v - 2),
175            size=(0, 30),
176            text=bui.Lstr(resource=self._r + '.actionsText'),
177            maxwidth=190,
178            color=clr,
179            v_align='center',
180        )
181        cb1 = bui.checkboxwidget(
182            parent=self._subcontainer,
183            position=(h + 220, v),
184            size=(170, 30),
185            text=bui.Lstr(resource=self._r + '.buttonsText'),
186            maxwidth=100,
187            textcolor=clr2,
188            scale=0.9,
189        )
190        cb2 = bui.checkboxwidget(
191            parent=self._subcontainer,
192            position=(h + 357, v),
193            size=(170, 30),
194            text=bui.Lstr(resource=self._r + '.swipeText'),
195            maxwidth=100,
196            textcolor=clr2,
197            scale=0.9,
198        )
199        make_radio_group(
200            (cb1, cb2), ('buttons', 'swipe'), cur_val, self._actions_changed
201        )
202        v -= 50
203        ConfigNumberEdit(
204            parent=self._subcontainer,
205            position=(h, v),
206            xoffset=65,
207            configkey='Touch Controls Scale Actions',
208            displayname=bui.Lstr(resource=self._r + '.actionControlScaleText'),
209            changesound=False,
210            minval=0.1,
211            maxval=4.0,
212            increment=0.1,
213        )
214
215        v -= 50
216        ConfigCheckBox(
217            parent=self._subcontainer,
218            position=(h, v),
219            size=(400, 30),
220            maxwidth=400,
221            configkey='Touch Controls Swipe Hidden',
222            displayname=bui.Lstr(resource=self._r + '.swipeControlsHiddenText'),
223        )
224        v -= 65
225
226        bui.buttonwidget(
227            parent=self._subcontainer,
228            position=(self._sub_width * 0.5 - 70, v),
229            size=(170, 60),
230            label=bui.Lstr(resource=self._r + '.resetText'),
231            scale=0.75,
232            on_activate_call=self._reset,
233        )
234
235        bui.textwidget(
236            parent=self._root_widget,
237            position=(self._width * 0.5, 38),
238            size=(0, 0),
239            h_align='center',
240            text=bui.Lstr(resource=self._r + '.dragControlsText'),
241            maxwidth=self._width * 0.8,
242            scale=0.65,
243            color=(1, 1, 1, 0.4),
244        )
245
246    def _actions_changed(self, v: str) -> None:
247        cfg = bui.app.config
248        cfg['Touch Action Control Type'] = v
249        cfg.apply_and_commit()
250
251    def _movement_changed(self, v: str) -> None:
252        cfg = bui.app.config
253        cfg['Touch Movement Control Type'] = v
254        cfg.apply_and_commit()
255
256    def _reset(self) -> None:
257        cfg = bui.app.config
258        cfgkeys = [
259            'Touch Movement Control Type',
260            'Touch Action Control Type',
261            'Touch Controls Scale',
262            'Touch Controls Scale Movement',
263            'Touch Controls Scale Actions',
264            'Touch Controls Swipe Hidden',
265            'Touch DPad X',
266            'Touch DPad Y',
267            'Touch Buttons X',
268            'Touch Buttons Y',
269        ]
270        for cfgkey in cfgkeys:
271            if cfgkey in cfg:
272                del cfg[cfgkey]
273        cfg.apply_and_commit()
274        bui.apptimer(0, self._build_gui)
275
276    def _back(self) -> None:
277        from bauiv1lib.settings import controls
278
279        # no-op if our underlying widget is dead or on its way out.
280        if not self._root_widget or self._root_widget.transitioning_out:
281            return
282
283        bui.containerwidget(edit=self._root_widget, transition='out_right')
284        assert bui.app.classic is not None
285        bui.app.ui_v1.set_main_menu_window(
286            controls.ControlsSettingsWindow(
287                transition='in_left'
288            ).get_root_widget(),
289            from_window=self._root_widget,
290        )
291        bs.set_touchscreen_editing(False)
class TouchscreenSettingsWindow(bauiv1._uitypes.Window):
 11class TouchscreenSettingsWindow(bui.Window):
 12    """Settings window for touchscreens."""
 13
 14    def __del__(self) -> None:
 15        # Note - this happens in 'back' too;
 16        # we just do it here too in case the window is closed by other means.
 17
 18        # FIXME: Could switch to a UI destroy callback now that those are a
 19        #  thing that exists.
 20        bs.set_touchscreen_editing(False)
 21
 22    def __init__(self) -> None:
 23        self._width = 650
 24        self._height = 380
 25        self._spacing = 40
 26        self._r = 'configTouchscreenWindow'
 27
 28        bs.set_touchscreen_editing(True)
 29
 30        assert bui.app.classic is not None
 31        uiscale = bui.app.ui_v1.uiscale
 32        super().__init__(
 33            root_widget=bui.containerwidget(
 34                size=(self._width, self._height),
 35                transition='in_right',
 36                scale=(
 37                    1.9
 38                    if uiscale is bui.UIScale.SMALL
 39                    else 1.55
 40                    if uiscale is bui.UIScale.MEDIUM
 41                    else 1.2
 42                ),
 43            )
 44        )
 45
 46        btn = bui.buttonwidget(
 47            parent=self._root_widget,
 48            position=(55, self._height - 60),
 49            size=(120, 60),
 50            label=bui.Lstr(resource='backText'),
 51            button_type='back',
 52            scale=0.8,
 53            on_activate_call=self._back,
 54        )
 55        bui.containerwidget(edit=self._root_widget, cancel_button=btn)
 56
 57        bui.textwidget(
 58            parent=self._root_widget,
 59            position=(25, self._height - 50),
 60            size=(self._width, 25),
 61            text=bui.Lstr(resource=self._r + '.titleText'),
 62            color=bui.app.ui_v1.title_color,
 63            maxwidth=280,
 64            h_align='center',
 65            v_align='center',
 66        )
 67
 68        bui.buttonwidget(
 69            edit=btn,
 70            button_type='backSmall',
 71            size=(60, 60),
 72            label=bui.charstr(bui.SpecialChar.BACK),
 73        )
 74
 75        self._scroll_width = self._width - 100
 76        self._scroll_height = self._height - 110
 77        self._sub_width = self._scroll_width - 20
 78        self._sub_height = 360
 79
 80        self._scrollwidget = bui.scrollwidget(
 81            parent=self._root_widget,
 82            position=(
 83                (self._width - self._scroll_width) * 0.5,
 84                self._height - 65 - self._scroll_height,
 85            ),
 86            size=(self._scroll_width, self._scroll_height),
 87            claims_left_right=True,
 88            claims_tab=True,
 89            selection_loops_to_parent=True,
 90        )
 91        self._subcontainer = bui.containerwidget(
 92            parent=self._scrollwidget,
 93            size=(self._sub_width, self._sub_height),
 94            background=False,
 95            claims_left_right=True,
 96            claims_tab=True,
 97            selection_loops_to_parent=True,
 98        )
 99        self._build_gui()
100
101    def _build_gui(self) -> None:
102        from bauiv1lib.config import ConfigNumberEdit, ConfigCheckBox
103        from bauiv1lib.radiogroup import make_radio_group
104
105        # Clear anything already there.
106        children = self._subcontainer.get_children()
107        for child in children:
108            child.delete()
109        h = 30
110        v = self._sub_height - 85
111        clr = (0.8, 0.8, 0.8, 1.0)
112        clr2 = (0.8, 0.8, 0.8)
113        bui.textwidget(
114            parent=self._subcontainer,
115            position=(-10, v + 43),
116            size=(self._sub_width, 25),
117            text=bui.Lstr(resource=self._r + '.swipeInfoText'),
118            flatness=1.0,
119            color=(0, 0.9, 0.1, 0.7),
120            maxwidth=self._sub_width * 0.9,
121            scale=0.55,
122            h_align='center',
123            v_align='center',
124        )
125        cur_val = bui.app.config.get('Touch Movement Control Type', 'swipe')
126        bui.textwidget(
127            parent=self._subcontainer,
128            position=(h, v - 2),
129            size=(0, 30),
130            text=bui.Lstr(resource=self._r + '.movementText'),
131            maxwidth=190,
132            color=clr,
133            v_align='center',
134        )
135        cb1 = bui.checkboxwidget(
136            parent=self._subcontainer,
137            position=(h + 220, v),
138            size=(170, 30),
139            text=bui.Lstr(resource=self._r + '.joystickText'),
140            maxwidth=100,
141            textcolor=clr2,
142            scale=0.9,
143        )
144        cb2 = bui.checkboxwidget(
145            parent=self._subcontainer,
146            position=(h + 357, v),
147            size=(170, 30),
148            text=bui.Lstr(resource=self._r + '.swipeText'),
149            maxwidth=100,
150            textcolor=clr2,
151            value=False,
152            scale=0.9,
153        )
154        make_radio_group(
155            (cb1, cb2), ('joystick', 'swipe'), cur_val, self._movement_changed
156        )
157        v -= 50
158        ConfigNumberEdit(
159            parent=self._subcontainer,
160            position=(h, v),
161            xoffset=65,
162            configkey='Touch Controls Scale Movement',
163            displayname=bui.Lstr(
164                resource=self._r + '.movementControlScaleText'
165            ),
166            changesound=False,
167            minval=0.1,
168            maxval=4.0,
169            increment=0.1,
170        )
171        v -= 50
172        cur_val = bui.app.config.get('Touch Action Control Type', 'buttons')
173        bui.textwidget(
174            parent=self._subcontainer,
175            position=(h, v - 2),
176            size=(0, 30),
177            text=bui.Lstr(resource=self._r + '.actionsText'),
178            maxwidth=190,
179            color=clr,
180            v_align='center',
181        )
182        cb1 = bui.checkboxwidget(
183            parent=self._subcontainer,
184            position=(h + 220, v),
185            size=(170, 30),
186            text=bui.Lstr(resource=self._r + '.buttonsText'),
187            maxwidth=100,
188            textcolor=clr2,
189            scale=0.9,
190        )
191        cb2 = bui.checkboxwidget(
192            parent=self._subcontainer,
193            position=(h + 357, v),
194            size=(170, 30),
195            text=bui.Lstr(resource=self._r + '.swipeText'),
196            maxwidth=100,
197            textcolor=clr2,
198            scale=0.9,
199        )
200        make_radio_group(
201            (cb1, cb2), ('buttons', 'swipe'), cur_val, self._actions_changed
202        )
203        v -= 50
204        ConfigNumberEdit(
205            parent=self._subcontainer,
206            position=(h, v),
207            xoffset=65,
208            configkey='Touch Controls Scale Actions',
209            displayname=bui.Lstr(resource=self._r + '.actionControlScaleText'),
210            changesound=False,
211            minval=0.1,
212            maxval=4.0,
213            increment=0.1,
214        )
215
216        v -= 50
217        ConfigCheckBox(
218            parent=self._subcontainer,
219            position=(h, v),
220            size=(400, 30),
221            maxwidth=400,
222            configkey='Touch Controls Swipe Hidden',
223            displayname=bui.Lstr(resource=self._r + '.swipeControlsHiddenText'),
224        )
225        v -= 65
226
227        bui.buttonwidget(
228            parent=self._subcontainer,
229            position=(self._sub_width * 0.5 - 70, v),
230            size=(170, 60),
231            label=bui.Lstr(resource=self._r + '.resetText'),
232            scale=0.75,
233            on_activate_call=self._reset,
234        )
235
236        bui.textwidget(
237            parent=self._root_widget,
238            position=(self._width * 0.5, 38),
239            size=(0, 0),
240            h_align='center',
241            text=bui.Lstr(resource=self._r + '.dragControlsText'),
242            maxwidth=self._width * 0.8,
243            scale=0.65,
244            color=(1, 1, 1, 0.4),
245        )
246
247    def _actions_changed(self, v: str) -> None:
248        cfg = bui.app.config
249        cfg['Touch Action Control Type'] = v
250        cfg.apply_and_commit()
251
252    def _movement_changed(self, v: str) -> None:
253        cfg = bui.app.config
254        cfg['Touch Movement Control Type'] = v
255        cfg.apply_and_commit()
256
257    def _reset(self) -> None:
258        cfg = bui.app.config
259        cfgkeys = [
260            'Touch Movement Control Type',
261            'Touch Action Control Type',
262            'Touch Controls Scale',
263            'Touch Controls Scale Movement',
264            'Touch Controls Scale Actions',
265            'Touch Controls Swipe Hidden',
266            'Touch DPad X',
267            'Touch DPad Y',
268            'Touch Buttons X',
269            'Touch Buttons Y',
270        ]
271        for cfgkey in cfgkeys:
272            if cfgkey in cfg:
273                del cfg[cfgkey]
274        cfg.apply_and_commit()
275        bui.apptimer(0, self._build_gui)
276
277    def _back(self) -> None:
278        from bauiv1lib.settings import controls
279
280        # no-op if our underlying widget is dead or on its way out.
281        if not self._root_widget or self._root_widget.transitioning_out:
282            return
283
284        bui.containerwidget(edit=self._root_widget, transition='out_right')
285        assert bui.app.classic is not None
286        bui.app.ui_v1.set_main_menu_window(
287            controls.ControlsSettingsWindow(
288                transition='in_left'
289            ).get_root_widget(),
290            from_window=self._root_widget,
291        )
292        bs.set_touchscreen_editing(False)

Settings window for touchscreens.

Inherited Members
bauiv1._uitypes.Window
get_root_widget