From 0f2bd96586d89d915dc669fbc538bbb29835b50f Mon Sep 17 00:00:00 2001 From: sezanzeb Date: Sun, 8 Nov 2020 18:51:35 +0100 Subject: [PATCH] tests, status bar, tooltips --- README.md | 4 +-- bin/key-mapper-gtk | 62 +++++++++++++++++++++++++-------- data/key-mapper.glade | 39 ++++++++++++++++++++- data/screenshot.png | Bin 17825 -> 25873 bytes data/screenshot.png~ | Bin 0 -> 22739 bytes data/style.css | 10 ++++++ keymapper/X.py | 13 +++++-- keymapper/linux.py | 2 +- tests/testcases/config.py | 6 ++-- tests/testcases/integration.py | 27 ++++++++++++++ tests/testcases/mapping.py | 21 ++++++++--- 11 files changed, 154 insertions(+), 30 deletions(-) create mode 100644 data/screenshot.png~ diff --git a/README.md b/README.md index 6f7f1207..9e4b2ea5 100644 --- a/README.md +++ b/README.md @@ -24,10 +24,8 @@ No idea which one are relevant at the moment # Tests -sudo is required because some tests actually read /dev stuff. - ```bash -sudo python3 setup.py install && sudo python3 tests/test.py +sudo python3 setup.py install && python3 tests/test.py ``` # Roadmap diff --git a/bin/key-mapper-gtk b/bin/key-mapper-gtk index 810dfa88..700ca0a7 100755 --- a/bin/key-mapper-gtk +++ b/bin/key-mapper-gtk @@ -32,7 +32,7 @@ from gi.repository import Gtk, Gdk, GLib from keymapper.data import get_data_path from keymapper.X import create_setxkbmap_config, apply_preset, \ - create_preset, Mapping + create_preset, mapping from keymapper.presets import get_presets, find_newest_preset, \ delete_preset, rename_preset from keymapper.logger import logger, update_verbosity, log_info @@ -43,7 +43,6 @@ window = None # TODO check for sudo rights -# TODO NUM1 doesnt work anymore def gtk_iteration(): @@ -54,7 +53,10 @@ def gtk_iteration(): keycode_reader = KeycodeReader() -mapping = Mapping() + +CTX_SAVE = 0 +CTX_APPLY = 1 +CTX_KEYCODE = 2 class SingleKeyMapping: @@ -109,10 +111,13 @@ class SingleKeyMapping: # keycode is already set by some other row if mapping.get(new_keycode) is not None: - logger.info('Keycode %s is already mapped', new_keycode) + msg = f'Keycode {new_keycode} is already mapped' + logger.info(msg) + window.get('status_bar').push(CTX_KEYCODE, msg) return # it's legal to display the keycode + window.get('status_bar').remove_all(CTX_KEYCODE) self.keycode.set_label(str(new_keycode)) # the character is empty and therefore the mapping is not complete @@ -185,7 +190,9 @@ class SingleKeyMapping: def on_delete_button_clicked(self, *args): """Destroy the row and remove it from the config.""" - mapping.clear() + keycode = self.get_keycode() + if keycode is not None: + mapping.clear(keycode) self.delete_callback(self) @@ -195,6 +202,14 @@ class Window: self.selected_device = None self.selected_preset = None + css_provider = Gtk.CssProvider() + css_provider.load_from_path(get_data_path('style.css')) + Gtk.StyleContext.add_provider_for_screen( + Gdk.Screen.get_default(), + css_provider, + Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION + ) + gladefile = get_data_path('key-mapper.glade') builder = Gtk.Builder() builder.add_from_file(gladefile) @@ -209,13 +224,7 @@ class Window: self.select_newest_preset() - css_provider = Gtk.CssProvider() - css_provider.load_from_path(get_data_path('style.css')) - Gtk.StyleContext.add_provider_for_screen( - Gdk.Screen.get_default(), - css_provider, - Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION - ) + GLib.timeout_add(100, self.check_add_row) def get(self, name): """Get a widget from the window""" @@ -225,6 +234,18 @@ class Window: """Safely close the application.""" Gtk.main_quit() + def check_add_row(self): + """Ensure that one empty row is available at all times.""" + rows = len(self.get('key_list').get_children()) + + # verify that all mappings are displayed + assert rows >= len(mapping) + + if rows == len(mapping): + self.add_empty() + + return True + def select_newest_preset(self): """Find and select the newest preset.""" device, preset = find_newest_preset() @@ -269,10 +290,16 @@ class Window: def on_save_preset_clicked(self, button): """Save changes to a preset to the file system.""" new_name = self.get('preset_name_input').get_text() + self.save_config() if new_name != '' and new_name != self.selected_preset: rename_preset(self.selected_device, self.selected_preset, new_name) - self.populate_presets() - self.save_config() + # after saving the config, its modification date will be the newest, + # so populate_presets will automatically select the right one again. + self.populate_presets() + self.get('status_bar').push( + CTX_SAVE, + f'Saved "{self.selected_preset}"' + ) def on_delete_preset_clicked(self, button): """Delete a preset from the file system.""" @@ -287,6 +314,10 @@ class Window: self.selected_device ) apply_preset(self.selected_device, self.selected_preset) + self.get('status_bar').push( + CTX_APPLY, + f'Applied "{self.selected_preset}"' + ) def on_select_device(self, dropdown): """List all presets, create one if none exist yet.""" @@ -369,6 +400,9 @@ class Window: self.selected_preset ) + print('lkjahsdfkjashdkj') + print(list(mapping)) + create_setxkbmap_config( self.selected_device, self.selected_preset, diff --git a/data/key-mapper.glade b/data/key-mapper.glade index dda82022..c44c9b87 100644 --- a/data/key-mapper.glade +++ b/data/key-mapper.glade @@ -87,6 +87,7 @@ True True True + In order to apply any changes, save the preset first. True @@ -230,11 +231,41 @@ - False + True True 2 + + + True + False + + + False + True + 3 + + + + + True + False + 10 + 10 + 10 + 10 + 6 + 6 + vertical + 2 + + + False + True + 4 + + False @@ -267,6 +298,7 @@ True False + Click on a cell below and hit a key on your device 5 5 Key @@ -282,6 +314,11 @@ True False + a-z, A-Z, 0-9 +KP_0 - KP_9 +Shift_L, Shift_R +Alt_L, Alt_R +LCTL, RCTL 5 5 Mapping diff --git a/data/screenshot.png b/data/screenshot.png index 3d9384880c70cac65501d8478bae54d5cbe2d5ce..28634a8cd10180772665111e89dbc890465dd34a 100644 GIT binary patch literal 25873 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 literal 17825 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 lojMIPWG}mt!6}f)BSzLx { [ a ] };', content) - self.assertIn('key <11> { [ NUM1 ] };', content) + self.assertIn('key <11> { [ KP_1 ] };', content) self.assertIn('key <12> { [ 3 ] };', content) def test_generate_content(self): @@ -80,7 +80,7 @@ class TestConfig(unittest.TestCase): content = generate_symbols_content('device', 'preset', self.mapping) self.assertIn('key <10> { [ a ] };', content) - self.assertIn('key <11> { [ NUM1 ] };', content) + self.assertIn('key <11> { [ KP_1 ] };', content) self.assertIn('key <12> { [ 3 ] };', content) diff --git a/tests/testcases/integration.py b/tests/testcases/integration.py index aab1b993..ed89f592 100644 --- a/tests/testcases/integration.py +++ b/tests/testcases/integration.py @@ -32,6 +32,8 @@ import shutil gi.require_version('Gtk', '3.0') from gi.repository import Gtk +from keymapper.X import mapping + from test import tmp @@ -89,6 +91,31 @@ class Integration(unittest.TestCase): self.assertIsNotNone(self.window) self.assertTrue(self.window.window.get_visible()) + def test_adds_empty_rows(self): + rows = len(self.window.get('key_list').get_children()) + self.assertEqual(rows, 1) + + mapping.change(None, 13, 'a') + time.sleep(0.2) + gtk_iteration() + + rows = len(self.window.get('key_list').get_children()) + self.assertEqual(rows, 2) + + def test_rename_and_save(self): + mapping.change(None, 14, 'a') + self.assertEqual(self.window.selected_preset, 'new preset') + self.window.on_save_preset_clicked(None) + self.assertEqual(mapping.get(14), 'a') + + mapping.change(None, 14, 'b') + self.window.get('preset_name_input').set_text('asdf') + self.window.on_save_preset_clicked(None) + self.assertEqual(self.window.selected_preset, 'asdf') + self.assertTrue(os.path.exists(f'{tmp}/symbols/device_1/asdf')) + self.assertTrue(os.path.exists(f'{tmp}/.config/device_1/asdf')) + self.assertEqual(mapping.get(14), 'b') + def test_select_device_and_preset(self): class FakeDropdown(Gtk.ComboBoxText): def __init__(self, name): diff --git a/tests/testcases/mapping.py b/tests/testcases/mapping.py index 308074d0..40de4a6d 100644 --- a/tests/testcases/mapping.py +++ b/tests/testcases/mapping.py @@ -27,10 +27,12 @@ from keymapper.X import Mapping class TestMapping(unittest.TestCase): def setUp(self): self.mapping = Mapping() + self.assertFalse(self.mapping.changed) def test_change(self): # 1 is not assigned yet, ignore it self.mapping.change(1, 2, 'a') + self.assertTrue(self.mapping.changed) self.assertIsNone(self.mapping.get(1)) self.assertEqual(self.mapping.get(2), 'a') self.assertEqual(len(self.mapping), 1) @@ -58,13 +60,22 @@ class TestMapping(unittest.TestCase): self.assertEqual(len(self.mapping), 2) def test_clear(self): - self.mapping.change(None, 10, 'NUM1') - self.mapping.change(None, 20, 'NUM2') - self.mapping.change(None, 30, 'NUM3') + # does nothing + self.mapping.clear(40) + self.assertFalse(self.mapping.changed) + + self.mapping._mapping[40] = 'b' + self.mapping.clear(40) + self.assertTrue(self.mapping.changed) + + self.mapping.change(None, 10, 'KP_1') + self.assertTrue(self.mapping.changed) + self.mapping.change(None, 20, 'KP_2') + self.mapping.change(None, 30, 'KP_3') self.mapping.clear(20) - self.assertEqual(self.mapping.get(10), 'NUM1') + self.assertEqual(self.mapping.get(10), 'KP_1') self.assertIsNone(self.mapping.get(20)) - self.assertEqual(self.mapping.get(30), 'NUM3') + self.assertEqual(self.mapping.get(30), 'KP_3') def test_iterate_and_convert(self): self.mapping.change(None, 10, 1)