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
  6from typing import override
  7
  8import bauiv1 as bui
  9import bascenev1 as bs
 10
 11
 12class TouchscreenSettingsWindow(bui.MainWindow):
 13    """Settings window for touchscreens."""
 14
 15    def __del__(self) -> None:
 16        bs.set_touchscreen_editing(False)
 17
 18    def __init__(
 19        self,
 20        transition: str | None = 'in_right',
 21        origin_widget: bui.Widget | None = None,
 22    ) -> None:
 23        self._width = 780
 24        self._height = 380
 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                scale=(
 35                    1.9
 36                    if uiscale is bui.UIScale.SMALL
 37                    else 1.55 if uiscale is bui.UIScale.MEDIUM else 1.2
 38                ),
 39                toolbar_visibility=(
 40                    'menu_minimal'
 41                    if uiscale is bui.UIScale.SMALL
 42                    else 'menu_full'
 43                ),
 44                stack_offset=(
 45                    (0, -20) if uiscale is bui.UIScale.SMALL else (0, 0)
 46                ),
 47            ),
 48            transition=transition,
 49            origin_widget=origin_widget,
 50        )
 51
 52        if uiscale is bui.UIScale.SMALL:
 53            bui.containerwidget(
 54                edit=self._root_widget, on_cancel_call=self.main_window_back
 55            )
 56        else:
 57            btn = bui.buttonwidget(
 58                parent=self._root_widget,
 59                position=(55, self._height - 60),
 60                size=(60, 60),
 61                label=bui.charstr(bui.SpecialChar.BACK),
 62                button_type='backSmall',
 63                scale=0.8,
 64                on_activate_call=self.main_window_back,
 65            )
 66            bui.containerwidget(edit=self._root_widget, cancel_button=btn)
 67
 68        bui.textwidget(
 69            parent=self._root_widget,
 70            position=(25, self._height - 57),
 71            size=(self._width, 25),
 72            text=bui.Lstr(resource=f'{self._r}.titleText'),
 73            color=bui.app.ui_v1.title_color,
 74            maxwidth=280,
 75            h_align='center',
 76            v_align='center',
 77        )
 78
 79        self._scroll_width = self._width - 100
 80        self._scroll_height = self._height - 110
 81        self._sub_width = self._scroll_width - 20
 82        self._sub_height = 360
 83
 84        self._scrollwidget = bui.scrollwidget(
 85            parent=self._root_widget,
 86            position=(
 87                (self._width - self._scroll_width) * 0.5,
 88                self._height - 65 - self._scroll_height,
 89            ),
 90            size=(self._scroll_width, self._scroll_height),
 91            claims_left_right=True,
 92            claims_tab=True,
 93            selection_loops_to_parent=True,
 94        )
 95        self._subcontainer = bui.containerwidget(
 96            parent=self._scrollwidget,
 97            size=(self._sub_width, self._sub_height),
 98            background=False,
 99            claims_left_right=True,
100            claims_tab=True,
101            selection_loops_to_parent=True,
102        )
103        self._build_gui()
104
105    @override
106    def get_main_window_state(self) -> bui.MainWindowState:
107        # Support recreating our window for back/refresh purposes.
108        cls = type(self)
109        return bui.BasicMainWindowState(
110            create_call=lambda transition, origin_widget: cls(
111                transition=transition, origin_widget=origin_widget
112            )
113        )
114
115    def _build_gui(self) -> None:
116        # pylint: disable=too-many-locals
117        from bauiv1lib.config import ConfigNumberEdit, ConfigCheckBox
118        from bauiv1lib.radiogroup import make_radio_group
119
120        # Clear anything already there.
121        children = self._subcontainer.get_children()
122        for child in children:
123            child.delete()
124        h = 30
125        hoffs = 100
126        hoffs2 = 70
127        hoffs3 = 320
128        v = self._sub_height - 85
129        clr = (0.8, 0.8, 0.8, 1.0)
130        clr2 = (0.8, 0.8, 0.8)
131        bui.textwidget(
132            parent=self._subcontainer,
133            position=(self._sub_width * 0.5, v + 63),
134            size=(0, 0),
135            text=bui.Lstr(resource=f'{self._r}.swipeInfoText'),
136            flatness=1.0,
137            color=(0, 0.9, 0.1, 0.7),
138            maxwidth=self._sub_width * 0.9,
139            scale=0.55,
140            h_align='center',
141            v_align='center',
142        )
143        cur_val = bui.app.config.get('Touch Movement Control Type', 'swipe')
144        bui.textwidget(
145            parent=self._subcontainer,
146            position=(h, v - 2),
147            size=(0, 30),
148            text=bui.Lstr(resource=f'{self._r}.movementText'),
149            maxwidth=190,
150            color=clr,
151            v_align='center',
152        )
153        cb1 = bui.checkboxwidget(
154            parent=self._subcontainer,
155            position=(h + hoffs + 220, v),
156            size=(170, 30),
157            text=bui.Lstr(resource=f'{self._r}.joystickText'),
158            maxwidth=100,
159            textcolor=clr2,
160            scale=0.9,
161        )
162        cb2 = bui.checkboxwidget(
163            parent=self._subcontainer,
164            position=(h + hoffs + 357, v),
165            size=(170, 30),
166            text=bui.Lstr(resource=f'{self._r}.swipeText'),
167            maxwidth=100,
168            textcolor=clr2,
169            value=False,
170            scale=0.9,
171        )
172        make_radio_group(
173            (cb1, cb2), ('joystick', 'swipe'), cur_val, self._movement_changed
174        )
175        v -= 50
176        ConfigNumberEdit(
177            parent=self._subcontainer,
178            position=(h, v),
179            xoffset=hoffs2 + 65,
180            configkey='Touch Controls Scale Movement',
181            displayname=bui.Lstr(
182                resource=f'{self._r}.movementControlScaleText'
183            ),
184            changesound=False,
185            minval=0.1,
186            maxval=4.0,
187            increment=0.1,
188        )
189        v -= 50
190        cur_val = bui.app.config.get('Touch Action Control Type', 'buttons')
191        bui.textwidget(
192            parent=self._subcontainer,
193            position=(h, v - 2),
194            size=(0, 30),
195            text=bui.Lstr(resource=f'{self._r}.actionsText'),
196            maxwidth=190,
197            color=clr,
198            v_align='center',
199        )
200        cb1 = bui.checkboxwidget(
201            parent=self._subcontainer,
202            position=(h + hoffs + 220, v),
203            size=(170, 30),
204            text=bui.Lstr(resource=f'{self._r}.buttonsText'),
205            maxwidth=100,
206            textcolor=clr2,
207            scale=0.9,
208        )
209        cb2 = bui.checkboxwidget(
210            parent=self._subcontainer,
211            position=(h + hoffs + 357, v),
212            size=(170, 30),
213            text=bui.Lstr(resource=f'{self._r}.swipeText'),
214            maxwidth=100,
215            textcolor=clr2,
216            scale=0.9,
217        )
218        make_radio_group(
219            (cb1, cb2), ('buttons', 'swipe'), cur_val, self._actions_changed
220        )
221        v -= 50
222        ConfigNumberEdit(
223            parent=self._subcontainer,
224            position=(h, v),
225            xoffset=hoffs2 + 65,
226            configkey='Touch Controls Scale Actions',
227            displayname=bui.Lstr(resource=f'{self._r}.actionControlScaleText'),
228            changesound=False,
229            minval=0.1,
230            maxval=4.0,
231            increment=0.1,
232        )
233
234        v -= 50
235        bui.textwidget(
236            parent=self._subcontainer,
237            position=(h, v - 2),
238            size=(0, 30),
239            text=bui.Lstr(resource=f'{self._r}.swipeControlsHiddenText'),
240            maxwidth=190,
241            color=clr,
242            v_align='center',
243        )
244
245        ConfigCheckBox(
246            parent=self._subcontainer,
247            position=(h + hoffs3, v),
248            size=(100, 30),
249            maxwidth=400,
250            configkey='Touch Controls Swipe Hidden',
251            displayname='',
252        )
253        v -= 65
254
255        bui.buttonwidget(
256            parent=self._subcontainer,
257            position=(self._sub_width * 0.5 - 70, v),
258            size=(170, 60),
259            label=bui.Lstr(resource=f'{self._r}.resetText'),
260            scale=0.75,
261            on_activate_call=self._reset,
262        )
263
264        bui.textwidget(
265            parent=self._root_widget,
266            position=(self._width * 0.5, 38),
267            size=(0, 0),
268            h_align='center',
269            text=bui.Lstr(resource=f'{self._r}.dragControlsText'),
270            maxwidth=self._width * 0.8,
271            scale=0.65,
272            color=(1, 1, 1, 0.4),
273        )
274
275    def _actions_changed(self, v: str) -> None:
276        cfg = bui.app.config
277        cfg['Touch Action Control Type'] = v
278        cfg.apply_and_commit()
279
280    def _movement_changed(self, v: str) -> None:
281        cfg = bui.app.config
282        cfg['Touch Movement Control Type'] = v
283        cfg.apply_and_commit()
284
285    def _reset(self) -> None:
286        cfg = bui.app.config
287        cfgkeys = [
288            'Touch Movement Control Type',
289            'Touch Action Control Type',
290            'Touch Controls Scale',
291            'Touch Controls Scale Movement',
292            'Touch Controls Scale Actions',
293            'Touch Controls Swipe Hidden',
294            'Touch DPad X',
295            'Touch DPad Y',
296            'Touch Buttons X',
297            'Touch Buttons Y',
298        ]
299        for cfgkey in cfgkeys:
300            if cfgkey in cfg:
301                del cfg[cfgkey]
302        cfg.apply_and_commit()
303        bui.apptimer(0, self._build_gui)
class TouchscreenSettingsWindow(bauiv1._uitypes.MainWindow):
 13class TouchscreenSettingsWindow(bui.MainWindow):
 14    """Settings window for touchscreens."""
 15
 16    def __del__(self) -> None:
 17        bs.set_touchscreen_editing(False)
 18
 19    def __init__(
 20        self,
 21        transition: str | None = 'in_right',
 22        origin_widget: bui.Widget | None = None,
 23    ) -> None:
 24        self._width = 780
 25        self._height = 380
 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                scale=(
 36                    1.9
 37                    if uiscale is bui.UIScale.SMALL
 38                    else 1.55 if uiscale is bui.UIScale.MEDIUM else 1.2
 39                ),
 40                toolbar_visibility=(
 41                    'menu_minimal'
 42                    if uiscale is bui.UIScale.SMALL
 43                    else 'menu_full'
 44                ),
 45                stack_offset=(
 46                    (0, -20) if uiscale is bui.UIScale.SMALL else (0, 0)
 47                ),
 48            ),
 49            transition=transition,
 50            origin_widget=origin_widget,
 51        )
 52
 53        if uiscale is bui.UIScale.SMALL:
 54            bui.containerwidget(
 55                edit=self._root_widget, on_cancel_call=self.main_window_back
 56            )
 57        else:
 58            btn = bui.buttonwidget(
 59                parent=self._root_widget,
 60                position=(55, self._height - 60),
 61                size=(60, 60),
 62                label=bui.charstr(bui.SpecialChar.BACK),
 63                button_type='backSmall',
 64                scale=0.8,
 65                on_activate_call=self.main_window_back,
 66            )
 67            bui.containerwidget(edit=self._root_widget, cancel_button=btn)
 68
 69        bui.textwidget(
 70            parent=self._root_widget,
 71            position=(25, self._height - 57),
 72            size=(self._width, 25),
 73            text=bui.Lstr(resource=f'{self._r}.titleText'),
 74            color=bui.app.ui_v1.title_color,
 75            maxwidth=280,
 76            h_align='center',
 77            v_align='center',
 78        )
 79
 80        self._scroll_width = self._width - 100
 81        self._scroll_height = self._height - 110
 82        self._sub_width = self._scroll_width - 20
 83        self._sub_height = 360
 84
 85        self._scrollwidget = bui.scrollwidget(
 86            parent=self._root_widget,
 87            position=(
 88                (self._width - self._scroll_width) * 0.5,
 89                self._height - 65 - self._scroll_height,
 90            ),
 91            size=(self._scroll_width, self._scroll_height),
 92            claims_left_right=True,
 93            claims_tab=True,
 94            selection_loops_to_parent=True,
 95        )
 96        self._subcontainer = bui.containerwidget(
 97            parent=self._scrollwidget,
 98            size=(self._sub_width, self._sub_height),
 99            background=False,
100            claims_left_right=True,
101            claims_tab=True,
102            selection_loops_to_parent=True,
103        )
104        self._build_gui()
105
106    @override
107    def get_main_window_state(self) -> bui.MainWindowState:
108        # Support recreating our window for back/refresh purposes.
109        cls = type(self)
110        return bui.BasicMainWindowState(
111            create_call=lambda transition, origin_widget: cls(
112                transition=transition, origin_widget=origin_widget
113            )
114        )
115
116    def _build_gui(self) -> None:
117        # pylint: disable=too-many-locals
118        from bauiv1lib.config import ConfigNumberEdit, ConfigCheckBox
119        from bauiv1lib.radiogroup import make_radio_group
120
121        # Clear anything already there.
122        children = self._subcontainer.get_children()
123        for child in children:
124            child.delete()
125        h = 30
126        hoffs = 100
127        hoffs2 = 70
128        hoffs3 = 320
129        v = self._sub_height - 85
130        clr = (0.8, 0.8, 0.8, 1.0)
131        clr2 = (0.8, 0.8, 0.8)
132        bui.textwidget(
133            parent=self._subcontainer,
134            position=(self._sub_width * 0.5, v + 63),
135            size=(0, 0),
136            text=bui.Lstr(resource=f'{self._r}.swipeInfoText'),
137            flatness=1.0,
138            color=(0, 0.9, 0.1, 0.7),
139            maxwidth=self._sub_width * 0.9,
140            scale=0.55,
141            h_align='center',
142            v_align='center',
143        )
144        cur_val = bui.app.config.get('Touch Movement Control Type', 'swipe')
145        bui.textwidget(
146            parent=self._subcontainer,
147            position=(h, v - 2),
148            size=(0, 30),
149            text=bui.Lstr(resource=f'{self._r}.movementText'),
150            maxwidth=190,
151            color=clr,
152            v_align='center',
153        )
154        cb1 = bui.checkboxwidget(
155            parent=self._subcontainer,
156            position=(h + hoffs + 220, v),
157            size=(170, 30),
158            text=bui.Lstr(resource=f'{self._r}.joystickText'),
159            maxwidth=100,
160            textcolor=clr2,
161            scale=0.9,
162        )
163        cb2 = bui.checkboxwidget(
164            parent=self._subcontainer,
165            position=(h + hoffs + 357, v),
166            size=(170, 30),
167            text=bui.Lstr(resource=f'{self._r}.swipeText'),
168            maxwidth=100,
169            textcolor=clr2,
170            value=False,
171            scale=0.9,
172        )
173        make_radio_group(
174            (cb1, cb2), ('joystick', 'swipe'), cur_val, self._movement_changed
175        )
176        v -= 50
177        ConfigNumberEdit(
178            parent=self._subcontainer,
179            position=(h, v),
180            xoffset=hoffs2 + 65,
181            configkey='Touch Controls Scale Movement',
182            displayname=bui.Lstr(
183                resource=f'{self._r}.movementControlScaleText'
184            ),
185            changesound=False,
186            minval=0.1,
187            maxval=4.0,
188            increment=0.1,
189        )
190        v -= 50
191        cur_val = bui.app.config.get('Touch Action Control Type', 'buttons')
192        bui.textwidget(
193            parent=self._subcontainer,
194            position=(h, v - 2),
195            size=(0, 30),
196            text=bui.Lstr(resource=f'{self._r}.actionsText'),
197            maxwidth=190,
198            color=clr,
199            v_align='center',
200        )
201        cb1 = bui.checkboxwidget(
202            parent=self._subcontainer,
203            position=(h + hoffs + 220, v),
204            size=(170, 30),
205            text=bui.Lstr(resource=f'{self._r}.buttonsText'),
206            maxwidth=100,
207            textcolor=clr2,
208            scale=0.9,
209        )
210        cb2 = bui.checkboxwidget(
211            parent=self._subcontainer,
212            position=(h + hoffs + 357, v),
213            size=(170, 30),
214            text=bui.Lstr(resource=f'{self._r}.swipeText'),
215            maxwidth=100,
216            textcolor=clr2,
217            scale=0.9,
218        )
219        make_radio_group(
220            (cb1, cb2), ('buttons', 'swipe'), cur_val, self._actions_changed
221        )
222        v -= 50
223        ConfigNumberEdit(
224            parent=self._subcontainer,
225            position=(h, v),
226            xoffset=hoffs2 + 65,
227            configkey='Touch Controls Scale Actions',
228            displayname=bui.Lstr(resource=f'{self._r}.actionControlScaleText'),
229            changesound=False,
230            minval=0.1,
231            maxval=4.0,
232            increment=0.1,
233        )
234
235        v -= 50
236        bui.textwidget(
237            parent=self._subcontainer,
238            position=(h, v - 2),
239            size=(0, 30),
240            text=bui.Lstr(resource=f'{self._r}.swipeControlsHiddenText'),
241            maxwidth=190,
242            color=clr,
243            v_align='center',
244        )
245
246        ConfigCheckBox(
247            parent=self._subcontainer,
248            position=(h + hoffs3, v),
249            size=(100, 30),
250            maxwidth=400,
251            configkey='Touch Controls Swipe Hidden',
252            displayname='',
253        )
254        v -= 65
255
256        bui.buttonwidget(
257            parent=self._subcontainer,
258            position=(self._sub_width * 0.5 - 70, v),
259            size=(170, 60),
260            label=bui.Lstr(resource=f'{self._r}.resetText'),
261            scale=0.75,
262            on_activate_call=self._reset,
263        )
264
265        bui.textwidget(
266            parent=self._root_widget,
267            position=(self._width * 0.5, 38),
268            size=(0, 0),
269            h_align='center',
270            text=bui.Lstr(resource=f'{self._r}.dragControlsText'),
271            maxwidth=self._width * 0.8,
272            scale=0.65,
273            color=(1, 1, 1, 0.4),
274        )
275
276    def _actions_changed(self, v: str) -> None:
277        cfg = bui.app.config
278        cfg['Touch Action Control Type'] = v
279        cfg.apply_and_commit()
280
281    def _movement_changed(self, v: str) -> None:
282        cfg = bui.app.config
283        cfg['Touch Movement Control Type'] = v
284        cfg.apply_and_commit()
285
286    def _reset(self) -> None:
287        cfg = bui.app.config
288        cfgkeys = [
289            'Touch Movement Control Type',
290            'Touch Action Control Type',
291            'Touch Controls Scale',
292            'Touch Controls Scale Movement',
293            'Touch Controls Scale Actions',
294            'Touch Controls Swipe Hidden',
295            'Touch DPad X',
296            'Touch DPad Y',
297            'Touch Buttons X',
298            'Touch Buttons Y',
299        ]
300        for cfgkey in cfgkeys:
301            if cfgkey in cfg:
302                del cfg[cfgkey]
303        cfg.apply_and_commit()
304        bui.apptimer(0, self._build_gui)

Settings window for touchscreens.

TouchscreenSettingsWindow( transition: str | None = 'in_right', origin_widget: _bauiv1.Widget | None = None)
 19    def __init__(
 20        self,
 21        transition: str | None = 'in_right',
 22        origin_widget: bui.Widget | None = None,
 23    ) -> None:
 24        self._width = 780
 25        self._height = 380
 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                scale=(
 36                    1.9
 37                    if uiscale is bui.UIScale.SMALL
 38                    else 1.55 if uiscale is bui.UIScale.MEDIUM else 1.2
 39                ),
 40                toolbar_visibility=(
 41                    'menu_minimal'
 42                    if uiscale is bui.UIScale.SMALL
 43                    else 'menu_full'
 44                ),
 45                stack_offset=(
 46                    (0, -20) if uiscale is bui.UIScale.SMALL else (0, 0)
 47                ),
 48            ),
 49            transition=transition,
 50            origin_widget=origin_widget,
 51        )
 52
 53        if uiscale is bui.UIScale.SMALL:
 54            bui.containerwidget(
 55                edit=self._root_widget, on_cancel_call=self.main_window_back
 56            )
 57        else:
 58            btn = bui.buttonwidget(
 59                parent=self._root_widget,
 60                position=(55, self._height - 60),
 61                size=(60, 60),
 62                label=bui.charstr(bui.SpecialChar.BACK),
 63                button_type='backSmall',
 64                scale=0.8,
 65                on_activate_call=self.main_window_back,
 66            )
 67            bui.containerwidget(edit=self._root_widget, cancel_button=btn)
 68
 69        bui.textwidget(
 70            parent=self._root_widget,
 71            position=(25, self._height - 57),
 72            size=(self._width, 25),
 73            text=bui.Lstr(resource=f'{self._r}.titleText'),
 74            color=bui.app.ui_v1.title_color,
 75            maxwidth=280,
 76            h_align='center',
 77            v_align='center',
 78        )
 79
 80        self._scroll_width = self._width - 100
 81        self._scroll_height = self._height - 110
 82        self._sub_width = self._scroll_width - 20
 83        self._sub_height = 360
 84
 85        self._scrollwidget = bui.scrollwidget(
 86            parent=self._root_widget,
 87            position=(
 88                (self._width - self._scroll_width) * 0.5,
 89                self._height - 65 - self._scroll_height,
 90            ),
 91            size=(self._scroll_width, self._scroll_height),
 92            claims_left_right=True,
 93            claims_tab=True,
 94            selection_loops_to_parent=True,
 95        )
 96        self._subcontainer = bui.containerwidget(
 97            parent=self._scrollwidget,
 98            size=(self._sub_width, self._sub_height),
 99            background=False,
100            claims_left_right=True,
101            claims_tab=True,
102            selection_loops_to_parent=True,
103        )
104        self._build_gui()

Create a MainWindow given a root widget and transition info.

Automatically handles in and out transitions on the provided widget, so there is no need to set transitions when creating it.

@override
def get_main_window_state(self) -> bauiv1.MainWindowState:
106    @override
107    def get_main_window_state(self) -> bui.MainWindowState:
108        # Support recreating our window for back/refresh purposes.
109        cls = type(self)
110        return bui.BasicMainWindowState(
111            create_call=lambda transition, origin_widget: cls(
112                transition=transition, origin_widget=origin_widget
113            )
114        )

Return a WindowState to recreate this window, if supported.