Skip to content

Commit 9abf0c5

Browse files
authored
Fix 'General' settings not available after upgrade (blocks startup) (#3013)
- Add migration from settings version 8 to 9 that ensures General section exists with all required keys - Add safe access to General settings in application.py, mainframe.py, treeplugin.py, and dialog.py - Use .get() with fallback values instead of direct dictionary access - This prevents KeyError when user settings file is missing or corrupted Closes #3000
1 parent eedf25c commit 9abf0c5

6 files changed

Lines changed: 44 additions & 19 deletions

File tree

src/robotide/application/application.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,9 @@ class Message:
147147
self._controller = Project(self.namespace, self.settings)
148148
# print(f"DEBUG: application.py RIDE OnInit after defining controller= {self._controller}")
149149
# Try to get FontInfo as soon as possible
150-
font_size = self.settings['General'].get('font size', 12)
151-
font_face = self.settings['General'].get('font face', 'Helvetica')
150+
general = self.settings.get('General', {})
151+
font_size = general.get('font size', 12) if general else 12
152+
font_face = general.get('font face', 'Helvetica') if general else 'Helvetica'
152153
self.fontinfo = wx.FontInfo(font_size).FaceName(font_face).Bold(False)
153154
self.fileexplorerplugin = FileExplorerPlugin(self, self._controller)
154155
self.frame = RideFrame(self, self._controller)

src/robotide/preferences/settings.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
settings_version = 8
1+
settings_version = 9
22
mainframe size = (1100, 700)
33
mainframe position = (50, 30)
44
mainframe maximized = False

src/robotide/preferences/settings.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ def migrate(self):
122122
self.migrate_from_6_to_7(self._old_settings)
123123
if self._old_settings.get(self.SETTINGS_VERSION) == 7:
124124
self.migrate_from_7_to_8(self._old_settings)
125+
if self._old_settings.get(self.SETTINGS_VERSION) == 8:
126+
self.migrate_from_8_to_9(self._old_settings)
125127
self.merge()
126128

127129
def merge(self):
@@ -208,6 +210,28 @@ def migrate_from_7_to_8(self, settings):
208210
os.remove(lib_xml_path)
209211
settings[self.SETTINGS_VERSION] = 8
210212

213+
def migrate_from_8_to_9(self, settings):
214+
"""Ensure General section exists with all required keys."""
215+
if 'General' not in settings:
216+
settings['General'] = {}
217+
general = settings['General']
218+
defaults = {
219+
'font size': 11,
220+
'font face': '',
221+
'foreground': '#5E5C64',
222+
'background': 'light grey',
223+
'secondary foreground': '#DEDDDA',
224+
'secondary background': '#0A4A8A',
225+
'background help': '#A5F173',
226+
'foreground text': '#080240',
227+
'apply to panels': False,
228+
'ui language': 'English'
229+
}
230+
for key, value in defaults.items():
231+
if key not in general:
232+
general[key] = value
233+
settings[self.SETTINGS_VERSION] = 9
234+
211235
@staticmethod
212236
def _key_with_underscore(settings, keyname, section=None):
213237
keyname_old = keyname.replace('_', ' ')

src/robotide/ui/mainframe.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -160,14 +160,14 @@ def __init__(self, application, controller):
160160
self.tasks = application.settings.get('tasks', False)
161161
self.doc_language = application.settings.get('doc language', '')
162162
self._notebook_theme = application.settings.get('notebook theme', 0)
163-
self.general_settings = application.settings['General'] # .get_without_default('General')
164-
self.color_background_help = self.general_settings.get('background help', (240, 242, 80))
165-
self.color_foreground_text = self.general_settings.get('foreground text', (7, 0, 70))
166-
self.color_background = self.general_settings.get_without_default('background')
167-
self.color_foreground = self.general_settings.get_without_default('foreground')
168-
self.font_face = self.general_settings.get('font face', '')
169-
self.font_size = self.general_settings.get('font size', 11)
170-
self.ui_language = self.general_settings.get('ui language', 'English')
163+
self.general_settings = application.settings.get('General', {})
164+
self.color_background_help = self.general_settings.get('background help', (240, 242, 80)) if self.general_settings else (240, 242, 80)
165+
self.color_foreground_text = self.general_settings.get('foreground text', (7, 0, 70)) if self.general_settings else (7, 0, 70)
166+
self.color_background = self.general_settings.get('background', 'light grey') if self.general_settings else 'light grey'
167+
self.color_foreground = self.general_settings.get('foreground', '#5E5C64') if self.general_settings else '#5E5C64'
168+
self.font_face = self.general_settings.get('font face', '') if self.general_settings else ''
169+
self.font_size = self.general_settings.get('font size', 11) if self.general_settings else 11
170+
self.ui_language = self.general_settings.get('ui language', 'English') if self.general_settings else 'English'
171171
self.main_menu = None
172172
self._init_ui()
173173
self.SetIcon(wx.Icon(self._image_provider.RIDE_ICON))

src/robotide/ui/treeplugin.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -288,9 +288,9 @@ def __init__(self, parent, action_registerer, settings=None):
288288
self._RESOURCES_NODE_LABEL = _('External Resources')
289289
# print(f"DEBUG: treeplugin.py Tree after importing TreeController __init__ "
290290
# f"translated label={self._RESOURCES_NODE_LABEL}")
291-
self.theme = settings.get_without_default('General')
292-
self.background = self.theme['background']
293-
self.foreground = self.theme['foreground']
291+
self.theme = settings.get('General', {}) if settings else {}
292+
self.background = self.theme.get('background', 'light grey') if self.theme else 'light grey'
293+
self.foreground = self.theme.get('foreground', '#5E5C64') if self.theme else '#5E5C64'
294294
self._checkboxes_for_tests = False
295295
self._test_selection_controller = self._create_test_selection_controller()
296296
self.controller = TreeController(self, action_registerer, settings=settings,

src/robotide/widgets/dialog.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,16 @@ def __init__(self, parent, size=wx.DefaultSize, text=None, color_background=None
3131
html.HtmlWindow.__init__(self, parent, size=size, style=html.HW_DEFAULT_STYLE)
3232
from ..preferences import RideSettings
3333
_settings = RideSettings()
34-
self.general_settings = _settings['General']
35-
self.color_background_help = color_background if color_background else self.general_settings['background help']
36-
self.color_foreground_text = color_foreground if color_foreground else self.general_settings['foreground text']
34+
self.general_settings = _settings.get('General', {})
35+
self.color_background_help = color_background if color_background else (self.general_settings.get('background help', '#A5F173') if self.general_settings else '#A5F173')
36+
self.color_foreground_text = color_foreground if color_foreground else (self.general_settings.get('foreground text', '#080240') if self.general_settings else '#080240')
3737
self.SetBorders(2)
3838
self.SetStandardFonts(size=9)
3939
if text:
4040
self.set_content(text)
4141
self.font = self.GetFont()
42-
self.font.SetFaceName(self.general_settings['font face'])
43-
self.font.SetPointSize(self.general_settings['font size'])
42+
self.font.SetFaceName(self.general_settings.get('font face', '') if self.general_settings else '')
43+
self.font.SetPointSize(self.general_settings.get('font size', 11) if self.general_settings else 11)
4444
self.SetFont(self.font)
4545
self.Refresh(True)
4646
self.Bind(wx.EVT_KEY_DOWN, self.on_key_down)

0 commit comments

Comments
 (0)