refacting data parts

This commit is contained in:
ben-caldwell
2018-01-05 18:52:14 +13:00
parent 274eb32728
commit 35470fac2f
19 changed files with 1044 additions and 879 deletions

758
.idea/workspace.xml generated
View File

@@ -2,8 +2,21 @@
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="908505e2-8b2f-4abb-8017-7a9728876708" name="Default" comment=""> <list default="true" id="908505e2-8b2f-4abb-8017-7a9728876708" name="Default" comment="">
<change beforePath="$PROJECT_DIR$/data_objects/settings.json" afterPath="$PROJECT_DIR$/data_objects/settings.json" /> <change beforePath="" afterPath="$PROJECT_DIR$/data_centre/browser_data.py" />
<change beforePath="" afterPath="$PROJECT_DIR$/data_centre/json_objects/settings.json" />
<change beforePath="" afterPath="$PROJECT_DIR$/display_centre/menu.py" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
<change beforePath="$PROJECT_DIR$/README.md" afterPath="$PROJECT_DIR$/README.md" />
<change beforePath="$PROJECT_DIR$/data_centre.py" afterPath="$PROJECT_DIR$/data_centre/data.py" />
<change beforePath="$PROJECT_DIR$/data_objects/display_data.json" afterPath="$PROJECT_DIR$/data_centre/json_objects/display_data.json" />
<change beforePath="$PROJECT_DIR$/data_objects/key_map.json" afterPath="$PROJECT_DIR$/data_centre/json_objects/key_map.json" />
<change beforePath="$PROJECT_DIR$/data_objects/next_bank_number.json" afterPath="$PROJECT_DIR$/data_centre/json_objects/next_bank_number.json" />
<change beforePath="$PROJECT_DIR$/data_objects/settings.json" afterPath="" />
<change beforePath="$PROJECT_DIR$/display_centre/display.py" afterPath="$PROJECT_DIR$/display_centre/display.py" /> <change beforePath="$PROJECT_DIR$/display_centre/display.py" afterPath="$PROJECT_DIR$/display_centre/display.py" />
<change beforePath="$PROJECT_DIR$/r_e_c_u_r.py" afterPath="$PROJECT_DIR$/r_e_c_u_r.py" />
<change beforePath="$PROJECT_DIR$/user_input/actions.py" afterPath="$PROJECT_DIR$/actions.py" />
<change beforePath="$PROJECT_DIR$/user_input/numpad_input.py" afterPath="$PROJECT_DIR$/user_input/numpad_input.py" />
<change beforePath="$PROJECT_DIR$/video_centre/video_driver.py" afterPath="$PROJECT_DIR$/video_centre/video_driver.py" />
<change beforePath="$PROJECT_DIR$/video_centre/video_player.py" afterPath="$PROJECT_DIR$/video_centre/video_player.py" /> <change beforePath="$PROJECT_DIR$/video_centre/video_player.py" afterPath="$PROJECT_DIR$/video_centre/video_player.py" />
</list> </list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
@@ -18,8 +31,8 @@
<file leaf-file-name="r_e_c_u_r.py" pinned="false" current-in-tab="false"> <file leaf-file-name="r_e_c_u_r.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/r_e_c_u_r.py"> <entry file="file://$PROJECT_DIR$/r_e_c_u_r.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="275"> <state relative-caret-position="1000">
<caret line="17" column="20" lean-forward="false" selection-start-line="17" selection-start-column="20" selection-end-line="17" selection-end-column="20" /> <caret line="40" column="7" lean-forward="true" selection-start-line="40" selection-start-column="7" selection-end-line="40" selection-end-column="7" />
<folding> <folding>
<element signature="e#0#16#0" expanded="true" /> <element signature="e#0#16#0" expanded="true" />
</folding> </folding>
@@ -27,48 +40,94 @@
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="display.py" pinned="false" current-in-tab="true"> <file leaf-file-name="numpad_input.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/display_centre/display.py"> <entry file="file://$PROJECT_DIR$/user_input/numpad_input.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="335">
<caret line="52" column="50" lean-forward="false" selection-start-line="52" selection-start-column="50" selection-end-line="52" selection-end-column="50" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="data.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/data_centre/data.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-281">
<caret line="189" column="42" lean-forward="false" selection-start-line="189" selection-start-column="29" selection-end-line="189" selection-end-column="42" />
<folding>
<element signature="e#0#11#0" expanded="true" />
<element signature="e#2087#2270#0" expanded="false" />
<element signature="e#2659#2709#0" expanded="false" />
<element signature="e#3319#3350#0" expanded="false" />
<element signature="e#3406#3438#0" expanded="false" />
<element signature="e#5383#5585#0" expanded="false" />
<element signature="e#5652#6805#0" expanded="false" />
<element signature="e#7808#8385#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="browser_data.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/data_centre/browser_data.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="175"> <state relative-caret-position="175">
<caret line="87" column="21" lean-forward="false" selection-start-line="87" selection-start-column="21" selection-end-line="87" selection-end-column="21" /> <caret line="7" column="30" lean-forward="true" selection-start-line="7" selection-start-column="30" selection-end-line="7" selection-end-column="30" />
<folding>
<element signature="e#0#9#0" expanded="true" />
<element signature="e#350#504#0" expanded="false" />
<element signature="e#1322#1553#0" expanded="false" />
<element signature="e#1635#2579#0" expanded="false" />
<element signature="e#2637#2818#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="actions.py" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/actions.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="282">
<caret line="29" column="73" lean-forward="false" selection-start-line="29" selection-start-column="60" selection-end-line="29" selection-end-column="73" />
<folding>
<element signature="e#315#424#0" expanded="false" />
<element signature="e#475#580#0" expanded="false" />
<element signature="e#633#1022#0" expanded="false" />
<element signature="e#1239#1346#0" expanded="false" />
<element signature="e#1576#1680#0" expanded="false" />
<element signature="e#1743#1819#0" expanded="false" />
<element signature="e#1864#1900#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="display.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/display_centre/display.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1350">
<caret line="82" column="40" lean-forward="false" selection-start-line="82" selection-start-column="40" selection-end-line="82" selection-end-column="40" />
<folding> <folding>
<element signature="e#0#29#0" expanded="true" /> <element signature="e#0#29#0" expanded="true" />
<element signature="e#8427#8619#0" expanded="false" /> <element signature="e#837#898#0" expanded="false" />
<element signature="e#8662#9090#0" expanded="false" /> <element signature="e#933#1579#0" expanded="false" />
<element signature="e#9131#9452#0" expanded="false" /> <element signature="e#1618#1760#0" expanded="false" />
<element signature="e#9491#9935#0" expanded="false" /> <element signature="e#1797#1935#0" expanded="false" />
<element signature="e#10459#10788#0" expanded="false" /> <element signature="e#1973#2361#0" expanded="false" />
<element signature="e#10828#10904#0" expanded="false" /> <element signature="e#3775#4623#0" expanded="false" />
</folding> <element signature="e#4663#5519#0" expanded="false" />
</state> <element signature="e#5558#6144#0" expanded="false" />
</provider> <element signature="e#6194#6331#0" expanded="false" />
</entry> <element signature="e#6383#6526#0" expanded="false" />
</file> <element signature="e#6572#7087#0" expanded="false" />
<file leaf-file-name="actions.py" pinned="false" current-in-tab="false"> <element signature="e#6925#7087#0" expanded="false" />
<entry file="file://$PROJECT_DIR$/user_input/actions.py"> <element signature="e#7182#7845#0" expanded="false" />
<provider selected="true" editor-type-id="text-editor"> <element signature="e#7196#7453#0" expanded="false" />
<state relative-caret-position="299"> <element signature="e#7898#7982#0" expanded="false" />
<caret line="55" column="42" lean-forward="true" selection-start-line="55" selection-start-column="42" selection-end-line="55" selection-end-column="42" /> <element signature="e#8023#8229#0" expanded="false" />
<folding> <element signature="e#8306#9464#0" expanded="false" />
<element signature="e#240#272#0" expanded="false" /> <element signature="e#9536#9732#0" expanded="false" />
<element signature="e#748#777#0" expanded="false" />
<element signature="e#819#923#0" expanded="false" />
<element signature="e#986#1074#0" expanded="false" />
<element signature="e#1119#1155#0" expanded="false" />
<element signature="e#1199#1497#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="video_driver.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/video_centre/video_driver.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="866">
<caret line="70" column="42" lean-forward="false" selection-start-line="70" selection-start-column="42" selection-end-line="70" selection-end-column="42" />
<folding>
<element signature="e#0#18#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
@@ -77,62 +136,25 @@
<file leaf-file-name="video_player.py" pinned="false" current-in-tab="false"> <file leaf-file-name="video_player.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/video_centre/video_player.py"> <entry file="file://$PROJECT_DIR$/video_centre/video_player.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="358"> <state relative-caret-position="334">
<caret line="106" column="80" lean-forward="true" selection-start-line="106" selection-start-column="80" selection-end-line="106" selection-end-column="80" /> <caret line="124" column="34" lean-forward="true" selection-start-line="124" selection-start-column="34" selection-end-line="124" selection-end-column="34" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="data_centre.py" pinned="false" current-in-tab="false"> <file leaf-file-name="messages.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/data_centre.py"> <entry file="file://$PROJECT_DIR$/display_centre/messages.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="265"> <state relative-caret-position="500">
<caret line="26" column="26" lean-forward="true" selection-start-line="26" selection-start-column="26" selection-end-line="26" selection-end-column="26" /> <caret line="20" column="19" lean-forward="false" selection-start-line="20" selection-start-column="8" selection-end-line="20" selection-end-column="19" />
<folding> <folding>
<element signature="e#0#11#0" expanded="true" /> <element signature="e#0#14#0" expanded="true" />
<element signature="e#791#900#0" expanded="false" />
<element signature="e#939#1050#0" expanded="false" />
<element signature="e#1112#1288#0" expanded="false" />
<element signature="e#1402#1553#0" expanded="false" />
<element signature="e#1580#1910#0" expanded="false" />
<element signature="e#1943#1983#0" expanded="false" />
<element signature="e#2375#3326#0" expanded="false" />
<element signature="e#3407#3999#0" expanded="false" />
<element signature="e#4083#5027#0" expanded="false" />
<element signature="e#5087#5253#0" expanded="false" />
<element signature="e#5321#5546#0" expanded="false" />
<element signature="e#5607#5884#0" expanded="false" />
<element signature="e#6004#6303#0" expanded="false" />
<element signature="e#6376#6693#0" expanded="false" />
<element signature="e#6734#6773#0" expanded="false" />
<element signature="e#6813#7057#0" expanded="false" />
<element signature="e#7128#7346#0" expanded="false" />
<element signature="e#7375#7546#0" expanded="false" />
<element signature="e#7639#8116#0" expanded="false" />
<element signature="e#8211#8494#0" expanded="false" />
<element signature="e#8536#8838#0" expanded="false" />
<element signature="e#8878#9917#0" expanded="false" />
<element signature="e#9997#11105#0" expanded="false" />
<element signature="e#11152#11910#0" expanded="false" />
<element signature="e#11997#12533#0" expanded="false" />
<element signature="e#12579#12838#0" expanded="false" />
<element signature="e#12878#13028#0" expanded="false" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="display_data.json" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/data_objects/display_data.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="447">
<caret line="62" column="25" lean-forward="true" selection-start-line="62" selection-start-column="25" selection-end-line="62" selection-end-column="25" />
<folding />
</state>
</provider>
</entry>
</file>
</leaf> </leaf>
</component> </component>
<component name="FileTemplateManagerImpl"> <component name="FileTemplateManagerImpl">
@@ -144,21 +166,42 @@
</component> </component>
<component name="FindInProjectRecents"> <component name="FindInProjectRecents">
<findStrings> <findStrings>
<find>refr</find>
<find>data_ob</find>
<find>self.display</find>
<find>settings</find>
<find>video_driver</find> <find>video_driver</find>
<find>browser_start_index</find> <find>logger</find>
<find>MAX_LINES</find> <find>browser_list</find>
<find>data_object</find> <find>is_file_in_memory_bank</find>
<find>create_new_bank_mapping_in_first_open</find>
<find>generate_browser_list</find>
<find>inspect</find>
<find>browser_data</find>
<find>convert_int_to_string_for_display</find>
<find>load_message</find>
<find>create_new_slot_mapping_in_first_open</find>
<find>get_context_options_from_settings</find>
<find>data</find>
<find>get_info</find>
<find>settings_list</find> <find>settings_list</find>
<find>TITLE</find> <find>extract_file_type_and_name_from_browser_format</find>
<find>DISPLAY_MODE</find> <find>LOOPER</find>
<find>color</find> <find>refresh_display</find>
<find>color</find> <find>update_screen_every_second</find>
<find>has_omx</find> <find>player</find>
<find>data_centre</find>
<find>browser_list.a</find>
<find>self.read_json</find>
<find>self.write_json</find>
<find>get_the_current_dir_path</find>
<find>Data</find>
<find>PATH_TO_BROWSER</find>
<find>PATH_TO_DATA_OBJECTS</find>
<find>SETTINGS_JSON</find>
<find>selected_list_index</find>
</findStrings> </findStrings>
<replaceStrings>
<replace>read_json</replace>
<replace>SAMPLER</replace>
<replace>write_json</replace>
</replaceStrings>
</component> </component>
<component name="Git.Settings"> <component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
@@ -171,14 +214,22 @@
<option value="$PROJECT_DIR$/data_objects/key_map.json" /> <option value="$PROJECT_DIR$/data_objects/key_map.json" />
<option value="$PROJECT_DIR$/display_centre/navigation.py" /> <option value="$PROJECT_DIR$/display_centre/navigation.py" />
<option value="$PROJECT_DIR$/display_centre/actions.py" /> <option value="$PROJECT_DIR$/display_centre/actions.py" />
<option value="$PROJECT_DIR$/r_e_c_u_r.py" />
<option value="$PROJECT_DIR$/user_input/actions.py" />
<option value="$PROJECT_DIR$/video_centre/videodriver.py" /> <option value="$PROJECT_DIR$/video_centre/videodriver.py" />
<option value="$PROJECT_DIR$/data_objects/display_data.json" /> <option value="$PROJECT_DIR$/data_objects/display_data.json" />
<option value="$PROJECT_DIR$/user_input/numpad_input.py" />
<option value="$PROJECT_DIR$/video_centre/video_driver.py" />
<option value="$PROJECT_DIR$/data_centre.py" /> <option value="$PROJECT_DIR$/data_centre.py" />
<option value="$PROJECT_DIR$/user_input/actions.py" />
<option value="$PROJECT_DIR$/display_centre/menu.py" />
<option value="$PROJECT_DIR$/data_centre/data_centre.py" />
<option value="$PROJECT_DIR$/display_centre/message.py" />
<option value="$PROJECT_DIR$/README.md" />
<option value="$PROJECT_DIR$/user_input/numpad_input.py" />
<option value="$PROJECT_DIR$/r_e_c_u_r.py" />
<option value="$PROJECT_DIR$/display_centre/messages.py" />
<option value="$PROJECT_DIR$/video_centre/video_driver.py" />
<option value="$PROJECT_DIR$/data_centre/browser_data.py" />
<option value="$PROJECT_DIR$/actions.py" />
<option value="$PROJECT_DIR$/video_centre/video_player.py" /> <option value="$PROJECT_DIR$/video_centre/video_player.py" />
<option value="$PROJECT_DIR$/data_centre/data.py" />
<option value="$PROJECT_DIR$/display_centre/display.py" /> <option value="$PROJECT_DIR$/display_centre/display.py" />
</list> </list>
</option> </option>
@@ -204,7 +255,7 @@
<foldersAlwaysOnTop value="true" /> <foldersAlwaysOnTop value="true" />
</navigator> </navigator>
<panes> <panes>
<pane id="Scope" /> <pane id="Scratches" />
<pane id="ProjectPane"> <pane id="ProjectPane">
<subPane> <subPane>
<expand> <expand>
@@ -215,18 +266,19 @@
<path> <path>
<item name="r_e_c_u_r" type="b2602c69:ProjectViewProjectNode" /> <item name="r_e_c_u_r" type="b2602c69:ProjectViewProjectNode" />
<item name="r_e_c_u_r" type="462c0819:PsiDirectoryNode" /> <item name="r_e_c_u_r" type="462c0819:PsiDirectoryNode" />
<item name="data_objects" type="462c0819:PsiDirectoryNode" /> <item name="data_centre" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="r_e_c_u_r" type="b2602c69:ProjectViewProjectNode" />
<item name="r_e_c_u_r" type="462c0819:PsiDirectoryNode" />
<item name="data_centre" type="462c0819:PsiDirectoryNode" />
<item name="json_objects" type="462c0819:PsiDirectoryNode" />
</path> </path>
<path> <path>
<item name="r_e_c_u_r" type="b2602c69:ProjectViewProjectNode" /> <item name="r_e_c_u_r" type="b2602c69:ProjectViewProjectNode" />
<item name="r_e_c_u_r" type="462c0819:PsiDirectoryNode" /> <item name="r_e_c_u_r" type="462c0819:PsiDirectoryNode" />
<item name="display_centre" type="462c0819:PsiDirectoryNode" /> <item name="display_centre" type="462c0819:PsiDirectoryNode" />
</path> </path>
<path>
<item name="r_e_c_u_r" type="b2602c69:ProjectViewProjectNode" />
<item name="r_e_c_u_r" type="462c0819:PsiDirectoryNode" />
<item name="user_input" type="462c0819:PsiDirectoryNode" />
</path>
<path> <path>
<item name="r_e_c_u_r" type="b2602c69:ProjectViewProjectNode" /> <item name="r_e_c_u_r" type="b2602c69:ProjectViewProjectNode" />
<item name="r_e_c_u_r" type="462c0819:PsiDirectoryNode" /> <item name="r_e_c_u_r" type="462c0819:PsiDirectoryNode" />
@@ -236,22 +288,23 @@
<select /> <select />
</subPane> </subPane>
</pane> </pane>
<pane id="Scratches" /> <pane id="Scope" />
</panes> </panes>
</component> </component>
<component name="PropertiesComponent"> <component name="PropertiesComponent">
<property name="last_opened_file_path" value="$PROJECT_DIR$/display_centre/display.py" /> <property name="last_opened_file_path" value="$PROJECT_DIR$/data_centre/browser_data.py" />
<property name="settings.editor.selected.configurable" value="configurable.group.tools" /> <property name="settings.editor.selected.configurable" value="configurable.group.tools" />
</component> </component>
<component name="RecentsManager"> <component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="C:\r_e_c_u_r\data_objects" />
</key>
<key name="MoveFile.RECENT_KEYS"> <key name="MoveFile.RECENT_KEYS">
<recent name="C:\r_e_c_u_r\data_centre" />
<recent name="C:\r_e_c_u_r\data_objects" />
<recent name="C:\r_e_c_u_r" />
<recent name="C:\r_e_c_u_r\user_input\" /> <recent name="C:\r_e_c_u_r\user_input\" />
<recent name="C:\r_e_c_u_r\scripts" /> <recent name="C:\r_e_c_u_r\scripts" />
<recent name="C:\r_e_c_u_r\data_objects\" /> </key>
<recent name="C:\r_e_c_u_r\video_centre" /> <key name="CopyFile.RECENT_KEYS">
<recent name="C:\r_e_c_u_r\data_objects" />
</key> </key>
</component> </component>
<component name="RunDashboard"> <component name="RunDashboard">
@@ -396,11 +449,113 @@
</component> </component>
<component name="XDebuggerManager"> <component name="XDebuggerManager">
<breakpoint-manager> <breakpoint-manager>
<option name="time" value="3" /> <option name="time" value="5" />
</breakpoint-manager> </breakpoint-manager>
<watches-manager /> <watches-manager />
</component> </component>
<component name="editorHistoryManager"> <component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/r_e_c_u_r.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="225">
<caret line="17" column="20" lean-forward="false" selection-start-line="17" selection-start-column="20" selection-end-line="17" selection-end-column="20" />
<folding>
<element signature="e#0#16#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/user_input/numpad_input.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1350">
<caret line="54" column="26" lean-forward="false" selection-start-line="54" selection-start-column="18" selection-end-line="54" selection-end-column="26" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/display_centre/display.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2700">
<caret line="192" column="42" lean-forward="true" selection-start-line="192" selection-start-column="42" selection-end-line="192" selection-end-column="42" />
<folding>
<element signature="e#0#29#0" expanded="true" />
<element signature="e#837#898#0" expanded="false" />
<element signature="e#933#1579#0" expanded="false" />
<element signature="e#1797#1935#0" expanded="false" />
<element signature="e#1973#2361#0" expanded="false" />
<element signature="e#2405#2852#0" expanded="false" />
<element signature="e#3284#3533#0" expanded="false" />
<element signature="e#3775#4623#0" expanded="false" />
<element signature="e#4663#5519#0" expanded="false" />
<element signature="e#5558#6144#0" expanded="false" />
<element signature="e#5614#5920#0" expanded="false" />
<element signature="e#6194#6331#0" expanded="false" />
<element signature="e#6383#6526#0" expanded="false" />
<element signature="e#6572#7087#0" expanded="false" />
<element signature="e#6925#7087#0" expanded="false" />
<element signature="e#7182#7845#0" expanded="false" />
<element signature="e#7196#7453#0" expanded="false" />
<element signature="e#7898#7982#0" expanded="false" />
<element signature="e#8023#8229#0" expanded="false" />
<element signature="e#8306#9464#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/video_centre/video_driver.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1825">
<caret line="74" column="21" lean-forward="false" selection-start-line="74" selection-start-column="21" selection-end-line="74" selection-end-column="21" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/data_centre/data.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1975">
<caret line="102" column="37" lean-forward="false" selection-start-line="102" selection-start-column="29" selection-end-line="102" selection-end-column="37" />
<folding>
<element signature="e#0#11#0" expanded="true" />
<element signature="e#2087#2270#0" expanded="false" />
<element signature="e#2659#2709#0" expanded="false" />
<element signature="e#3319#3350#0" expanded="false" />
<element signature="e#3406#3438#0" expanded="false" />
<element signature="e#5383#5585#0" expanded="false" />
<element signature="e#5652#6805#0" expanded="false" />
<element signature="e#7808#8385#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/data_centre/json_objects/display_data.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1550">
<caret line="62" column="25" lean-forward="true" selection-start-line="62" selection-start-column="25" selection-end-line="62" selection-end-column="25" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/video_centre/video_player.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="3150">
<caret line="126" column="14" lean-forward="false" selection-start-line="126" selection-start-column="14" selection-end-line="126" selection-end-column="14" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/actions.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="375">
<caret line="15" column="35" lean-forward="false" selection-start-line="15" selection-start-column="35" selection-end-line="15" selection-end-column="35" />
<folding>
<element signature="e#633#1022#0" expanded="false" />
<element signature="e#1507#1534#0" expanded="false" />
<element signature="e#1576#1680#0" expanded="false" />
<element signature="e#1743#1819#0" expanded="false" />
<element signature="e#1864#1900#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/r_e_c_u_r.py"> <entry file="file://$PROJECT_DIR$/r_e_c_u_r.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="200"> <state relative-caret-position="200">
@@ -417,27 +572,39 @@
<caret line="23" column="47" lean-forward="false" selection-start-line="23" selection-start-column="47" selection-end-line="23" selection-end-column="47" /> <caret line="23" column="47" lean-forward="false" selection-start-line="23" selection-start-column="47" selection-end-line="23" selection-end-column="47" />
<folding> <folding>
<element signature="e#0#29#0" expanded="true" /> <element signature="e#0#29#0" expanded="true" />
<element signature="e#8427#8619#0" expanded="false" /> <element signature="e#837#898#0" expanded="false" />
<element signature="e#8662#9090#0" expanded="false" /> <element signature="e#933#1579#0" expanded="false" />
<element signature="e#9131#9452#0" expanded="false" /> <element signature="e#1797#1935#0" expanded="false" />
<element signature="e#9491#9935#0" expanded="false" /> <element signature="e#1973#2361#0" expanded="false" />
<element signature="e#10459#10788#0" expanded="false" /> <element signature="e#2405#2852#0" expanded="false" />
<element signature="e#10828#10904#0" expanded="false" /> <element signature="e#3284#3533#0" expanded="false" />
<element signature="e#3775#4623#0" expanded="false" />
<element signature="e#4663#5519#0" expanded="false" />
<element signature="e#5558#6144#0" expanded="false" />
<element signature="e#5614#5920#0" expanded="false" />
<element signature="e#6194#6331#0" expanded="false" />
<element signature="e#6383#6526#0" expanded="false" />
<element signature="e#6572#7087#0" expanded="false" />
<element signature="e#6925#7087#0" expanded="false" />
<element signature="e#7182#7845#0" expanded="false" />
<element signature="e#7196#7453#0" expanded="false" />
<element signature="e#7898#7982#0" expanded="false" />
<element signature="e#8023#8229#0" expanded="false" />
<element signature="e#8306#9464#0" expanded="false" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/user_input/actions.py"> <entry file="file://$PROJECT_DIR$/actions.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="675"> <state relative-caret-position="675">
<caret line="30" column="0" lean-forward="false" selection-start-line="30" selection-start-column="0" selection-end-line="30" selection-end-column="0" /> <caret line="30" column="0" lean-forward="false" selection-start-line="30" selection-start-column="0" selection-end-line="30" selection-end-column="0" />
<folding> <folding>
<element signature="e#240#272#0" expanded="false" /> <element signature="e#633#1022#0" expanded="false" />
<element signature="e#748#777#0" expanded="false" /> <element signature="e#1507#1534#0" expanded="false" />
<element signature="e#819#923#0" expanded="false" /> <element signature="e#1576#1680#0" expanded="false" />
<element signature="e#986#1074#0" expanded="false" /> <element signature="e#1743#1819#0" expanded="false" />
<element signature="e#1119#1155#0" expanded="false" /> <element signature="e#1864#1900#0" expanded="false" />
<element signature="e#1199#1497#0" expanded="false" />
</folding> </folding>
</state> </state>
</provider> </provider>
@@ -446,9 +613,7 @@
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="300"> <state relative-caret-position="300">
<caret line="12" column="22" lean-forward="false" selection-start-line="12" selection-start-column="22" selection-end-line="12" selection-end-column="22" /> <caret line="12" column="22" lean-forward="false" selection-start-line="12" selection-start-column="22" selection-end-line="12" selection-end-column="22" />
<folding> <folding />
<element signature="e#0#18#0" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
@@ -460,39 +625,19 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/data_centre.py"> <entry file="file://$PROJECT_DIR$/data_centre/data.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="5400"> <state relative-caret-position="5400">
<caret line="222" column="4" lean-forward="false" selection-start-line="222" selection-start-column="4" selection-end-line="222" selection-end-column="4" /> <caret line="222" column="4" lean-forward="false" selection-start-line="222" selection-start-column="4" selection-end-line="222" selection-end-column="4" />
<folding> <folding>
<element signature="e#0#11#0" expanded="true" /> <element signature="e#0#11#0" expanded="true" />
<element signature="e#791#900#0" expanded="false" /> <element signature="e#2087#2270#0" expanded="false" />
<element signature="e#939#1050#0" expanded="false" /> <element signature="e#2659#2709#0" expanded="false" />
<element signature="e#1112#1288#0" expanded="false" /> <element signature="e#3319#3350#0" expanded="false" />
<element signature="e#1402#1553#0" expanded="false" /> <element signature="e#3406#3438#0" expanded="false" />
<element signature="e#1580#1910#0" expanded="false" /> <element signature="e#5383#5585#0" expanded="false" />
<element signature="e#1943#1983#0" expanded="false" /> <element signature="e#5652#6805#0" expanded="false" />
<element signature="e#2375#3326#0" expanded="false" /> <element signature="e#7808#8385#0" expanded="false" />
<element signature="e#3407#3999#0" expanded="false" />
<element signature="e#4083#5027#0" expanded="false" />
<element signature="e#5087#5253#0" expanded="false" />
<element signature="e#5321#5546#0" expanded="false" />
<element signature="e#5607#5884#0" expanded="false" />
<element signature="e#6004#6303#0" expanded="false" />
<element signature="e#6376#6693#0" expanded="false" />
<element signature="e#6734#6773#0" expanded="false" />
<element signature="e#6813#7057#0" expanded="false" />
<element signature="e#7128#7346#0" expanded="false" />
<element signature="e#7375#7546#0" expanded="false" />
<element signature="e#7639#8116#0" expanded="false" />
<element signature="e#8211#8494#0" expanded="false" />
<element signature="e#8536#8838#0" expanded="false" />
<element signature="e#8878#9917#0" expanded="false" />
<element signature="e#9997#11105#0" expanded="false" />
<element signature="e#11152#11910#0" expanded="false" />
<element signature="e#11997#12533#0" expanded="false" />
<element signature="e#12579#12838#0" expanded="false" />
<element signature="e#12878#13028#0" expanded="false" />
</folding> </folding>
</state> </state>
</provider> </provider>
@@ -529,27 +674,39 @@
<caret line="23" column="47" lean-forward="true" selection-start-line="23" selection-start-column="47" selection-end-line="23" selection-end-column="47" /> <caret line="23" column="47" lean-forward="true" selection-start-line="23" selection-start-column="47" selection-end-line="23" selection-end-column="47" />
<folding> <folding>
<element signature="e#0#29#0" expanded="true" /> <element signature="e#0#29#0" expanded="true" />
<element signature="e#8427#8619#0" expanded="false" /> <element signature="e#837#898#0" expanded="false" />
<element signature="e#8662#9090#0" expanded="false" /> <element signature="e#933#1579#0" expanded="false" />
<element signature="e#9131#9452#0" expanded="false" /> <element signature="e#1797#1935#0" expanded="false" />
<element signature="e#9491#9935#0" expanded="false" /> <element signature="e#1973#2361#0" expanded="false" />
<element signature="e#10459#10788#0" expanded="false" /> <element signature="e#2405#2852#0" expanded="false" />
<element signature="e#10828#10904#0" expanded="false" /> <element signature="e#3284#3533#0" expanded="false" />
<element signature="e#3775#4623#0" expanded="false" />
<element signature="e#4663#5519#0" expanded="false" />
<element signature="e#5558#6144#0" expanded="false" />
<element signature="e#5614#5920#0" expanded="false" />
<element signature="e#6194#6331#0" expanded="false" />
<element signature="e#6383#6526#0" expanded="false" />
<element signature="e#6572#7087#0" expanded="false" />
<element signature="e#6925#7087#0" expanded="false" />
<element signature="e#7182#7845#0" expanded="false" />
<element signature="e#7196#7453#0" expanded="false" />
<element signature="e#7898#7982#0" expanded="false" />
<element signature="e#8023#8229#0" expanded="false" />
<element signature="e#8306#9464#0" expanded="false" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/user_input/actions.py"> <entry file="file://$PROJECT_DIR$/actions.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="675"> <state relative-caret-position="675">
<caret line="30" column="0" lean-forward="true" selection-start-line="30" selection-start-column="0" selection-end-line="30" selection-end-column="0" /> <caret line="30" column="0" lean-forward="true" selection-start-line="30" selection-start-column="0" selection-end-line="30" selection-end-column="0" />
<folding> <folding>
<element signature="e#240#272#0" expanded="false" /> <element signature="e#633#1022#0" expanded="false" />
<element signature="e#748#777#0" expanded="false" /> <element signature="e#1507#1534#0" expanded="false" />
<element signature="e#819#923#0" expanded="false" /> <element signature="e#1576#1680#0" expanded="false" />
<element signature="e#986#1074#0" expanded="false" /> <element signature="e#1743#1819#0" expanded="false" />
<element signature="e#1119#1155#0" expanded="false" /> <element signature="e#1864#1900#0" expanded="false" />
<element signature="e#1199#1497#0" expanded="false" />
</folding> </folding>
</state> </state>
</provider> </provider>
@@ -558,9 +715,7 @@
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="300"> <state relative-caret-position="300">
<caret line="12" column="22" lean-forward="true" selection-start-line="12" selection-start-column="22" selection-end-line="12" selection-end-column="22" /> <caret line="12" column="22" lean-forward="true" selection-start-line="12" selection-start-column="22" selection-end-line="12" selection-end-column="22" />
<folding> <folding />
<element signature="e#0#18#0" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
@@ -572,39 +727,19 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/data_centre.py"> <entry file="file://$PROJECT_DIR$/data_centre/data.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="5400"> <state relative-caret-position="5400">
<caret line="222" column="4" lean-forward="false" selection-start-line="222" selection-start-column="4" selection-end-line="222" selection-end-column="4" /> <caret line="222" column="4" lean-forward="false" selection-start-line="222" selection-start-column="4" selection-end-line="222" selection-end-column="4" />
<folding> <folding>
<element signature="e#0#11#0" expanded="true" /> <element signature="e#0#11#0" expanded="true" />
<element signature="e#791#900#0" expanded="false" /> <element signature="e#2087#2270#0" expanded="false" />
<element signature="e#939#1050#0" expanded="false" /> <element signature="e#2659#2709#0" expanded="false" />
<element signature="e#1112#1288#0" expanded="false" /> <element signature="e#3319#3350#0" expanded="false" />
<element signature="e#1402#1553#0" expanded="false" /> <element signature="e#3406#3438#0" expanded="false" />
<element signature="e#1580#1910#0" expanded="false" /> <element signature="e#5383#5585#0" expanded="false" />
<element signature="e#1943#1983#0" expanded="false" /> <element signature="e#5652#6805#0" expanded="false" />
<element signature="e#2375#3326#0" expanded="false" /> <element signature="e#7808#8385#0" expanded="false" />
<element signature="e#3407#3999#0" expanded="false" />
<element signature="e#4083#5027#0" expanded="false" />
<element signature="e#5087#5253#0" expanded="false" />
<element signature="e#5321#5546#0" expanded="false" />
<element signature="e#5607#5884#0" expanded="false" />
<element signature="e#6004#6303#0" expanded="false" />
<element signature="e#6376#6693#0" expanded="false" />
<element signature="e#6734#6773#0" expanded="false" />
<element signature="e#6813#7057#0" expanded="false" />
<element signature="e#7128#7346#0" expanded="false" />
<element signature="e#7375#7546#0" expanded="false" />
<element signature="e#7639#8116#0" expanded="false" />
<element signature="e#8211#8494#0" expanded="false" />
<element signature="e#8536#8838#0" expanded="false" />
<element signature="e#8878#9917#0" expanded="false" />
<element signature="e#9997#11105#0" expanded="false" />
<element signature="e#11152#11910#0" expanded="false" />
<element signature="e#11997#12533#0" expanded="false" />
<element signature="e#12579#12838#0" expanded="false" />
<element signature="e#12878#13028#0" expanded="false" />
</folding> </folding>
</state> </state>
</provider> </provider>
@@ -645,24 +780,23 @@
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/data_objects/key_map_old.json" /> <entry file="file://$PROJECT_DIR$/data_objects/key_map_old.json" />
<entry file="file://$PROJECT_DIR$/data_objects/key_map.json"> <entry file="file://$PROJECT_DIR$/data_centre/json_objects/key_map.json">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="25"> <state relative-caret-position="25">
<caret line="1" column="9" lean-forward="false" selection-start-line="1" selection-start-column="9" selection-end-line="1" selection-end-column="9" /> <caret line="1" column="9" lean-forward="false" selection-start-line="1" selection-start-column="9" selection-end-line="1" selection-end-column="9" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/user_input/actions.py"> <entry file="file://$PROJECT_DIR$/actions.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="234"> <state relative-caret-position="234">
<caret line="17" column="67" lean-forward="false" selection-start-line="17" selection-start-column="67" selection-end-line="17" selection-end-column="67" /> <caret line="17" column="67" lean-forward="false" selection-start-line="17" selection-start-column="67" selection-end-line="17" selection-end-column="67" />
<folding> <folding>
<element signature="e#240#272#0" expanded="false" /> <element signature="e#633#1022#0" expanded="false" />
<element signature="e#748#777#0" expanded="false" /> <element signature="e#1507#1534#0" expanded="false" />
<element signature="e#819#923#0" expanded="false" /> <element signature="e#1576#1680#0" expanded="false" />
<element signature="e#986#1074#0" expanded="false" /> <element signature="e#1743#1819#0" expanded="false" />
<element signature="e#1119#1155#0" expanded="false" /> <element signature="e#1864#1900#0" expanded="false" />
<element signature="e#1199#1497#0" expanded="false" />
</folding> </folding>
</state> </state>
</provider> </provider>
@@ -674,129 +808,159 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/data_objects/path_to_browser.json"> <entry file="file://$PROJECT_DIR$/data_centre/json_objects/path_to_browser.json">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0"> <state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/data_objects/display_data.json"> <entry file="file://$PROJECT_DIR$/data_centre/json_objects/display_data.json">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="447"> <state relative-caret-position="1550">
<caret line="62" column="25" lean-forward="true" selection-start-line="62" selection-start-column="25" selection-end-line="62" selection-end-column="25" /> <caret line="62" column="25" lean-forward="true" selection-start-line="62" selection-start-column="25" selection-end-line="62" selection-end-column="25" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/user_input/numpad_input.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="672">
<caret line="32" column="38" lean-forward="false" selection-start-line="32" selection-start-column="38" selection-end-line="32" selection-end-column="38" />
<folding />
</state>
</provider>
</entry>
<entry file="file://C:/Program Files (x86)/Python36-32/Lib/tkinter/__init__.py"> <entry file="file://C:/Program Files (x86)/Python36-32/Lib/tkinter/__init__.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="169"> <state relative-caret-position="169">
<caret line="610" column="28" lean-forward="false" selection-start-line="610" selection-start-column="22" selection-end-line="610" selection-end-column="28" /> <caret line="610" column="28" lean-forward="false" selection-start-line="610" selection-start-column="22" selection-end-line="610" selection-end-column="28" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/display_centre/menu.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/README.md">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="25">
<caret line="1" column="12" lean-forward="false" selection-start-line="1" selection-start-column="12" selection-end-line="1" selection-end-column="12" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/user_input/numpad_input.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="335">
<caret line="52" column="50" lean-forward="false" selection-start-line="52" selection-start-column="50" selection-end-line="52" selection-end-column="50" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/video_centre/video_driver.py"> <entry file="file://$PROJECT_DIR$/video_centre/video_driver.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="866"> <state relative-caret-position="50">
<caret line="70" column="42" lean-forward="false" selection-start-line="70" selection-start-column="42" selection-end-line="70" selection-end-column="42" /> <caret line="2" column="0" lean-forward="true" selection-start-line="2" selection-start-column="0" selection-end-line="2" selection-end-column="0" />
<folding>
<element signature="e#0#18#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/user_input/actions.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="299">
<caret line="55" column="42" lean-forward="true" selection-start-line="55" selection-start-column="42" selection-end-line="55" selection-end-column="42" />
<folding>
<element signature="e#240#272#0" expanded="false" />
<element signature="e#748#777#0" expanded="false" />
<element signature="e#819#923#0" expanded="false" />
<element signature="e#986#1074#0" expanded="false" />
<element signature="e#1119#1155#0" expanded="false" />
<element signature="e#1199#1497#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/video_centre/video_player.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="358">
<caret line="106" column="80" lean-forward="true" selection-start-line="106" selection-start-column="80" selection-end-line="106" selection-end-column="80" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/data_centre.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="265">
<caret line="26" column="26" lean-forward="true" selection-start-line="26" selection-start-column="26" selection-end-line="26" selection-end-column="26" />
<folding>
<element signature="e#0#11#0" expanded="true" />
<element signature="e#791#900#0" expanded="false" />
<element signature="e#939#1050#0" expanded="false" />
<element signature="e#1112#1288#0" expanded="false" />
<element signature="e#1402#1553#0" expanded="false" />
<element signature="e#1580#1910#0" expanded="false" />
<element signature="e#1943#1983#0" expanded="false" />
<element signature="e#2375#3326#0" expanded="false" />
<element signature="e#3407#3999#0" expanded="false" />
<element signature="e#4083#5027#0" expanded="false" />
<element signature="e#5087#5253#0" expanded="false" />
<element signature="e#5321#5546#0" expanded="false" />
<element signature="e#5607#5884#0" expanded="false" />
<element signature="e#6004#6303#0" expanded="false" />
<element signature="e#6376#6693#0" expanded="false" />
<element signature="e#6734#6773#0" expanded="false" />
<element signature="e#6813#7057#0" expanded="false" />
<element signature="e#7128#7346#0" expanded="false" />
<element signature="e#7375#7546#0" expanded="false" />
<element signature="e#7639#8116#0" expanded="false" />
<element signature="e#8211#8494#0" expanded="false" />
<element signature="e#8536#8838#0" expanded="false" />
<element signature="e#8878#9917#0" expanded="false" />
<element signature="e#9997#11105#0" expanded="false" />
<element signature="e#11152#11910#0" expanded="false" />
<element signature="e#11997#12533#0" expanded="false" />
<element signature="e#12579#12838#0" expanded="false" />
<element signature="e#12878#13028#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/r_e_c_u_r.py"> <entry file="file://$PROJECT_DIR$/r_e_c_u_r.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="275"> <state relative-caret-position="1000">
<caret line="17" column="20" lean-forward="false" selection-start-line="17" selection-start-column="20" selection-end-line="17" selection-end-column="20" /> <caret line="40" column="7" lean-forward="true" selection-start-line="40" selection-start-column="7" selection-end-line="40" selection-end-column="7" />
<folding> <folding>
<element signature="e#0#16#0" expanded="true" /> <element signature="e#0#16#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/display_centre/display.py"> <entry file="file://$PROJECT_DIR$/video_centre/video_player.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="334">
<caret line="124" column="34" lean-forward="true" selection-start-line="124" selection-start-column="34" selection-end-line="124" selection-end-column="34" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/display_centre/messages.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="500">
<caret line="20" column="19" lean-forward="false" selection-start-line="20" selection-start-column="8" selection-end-line="20" selection-end-column="19" />
<folding>
<element signature="e#0#14#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/data_centre/browser_data.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="175"> <state relative-caret-position="175">
<caret line="87" column="21" lean-forward="false" selection-start-line="87" selection-start-column="21" selection-end-line="87" selection-end-column="21" /> <caret line="7" column="30" lean-forward="true" selection-start-line="7" selection-start-column="30" selection-end-line="7" selection-end-column="30" />
<folding>
<element signature="e#0#9#0" expanded="true" />
<element signature="e#350#504#0" expanded="false" />
<element signature="e#1322#1553#0" expanded="false" />
<element signature="e#1635#2579#0" expanded="false" />
<element signature="e#2637#2818#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/data_centre/data.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-281">
<caret line="189" column="42" lean-forward="false" selection-start-line="189" selection-start-column="29" selection-end-line="189" selection-end-column="42" />
<folding>
<element signature="e#0#11#0" expanded="true" />
<element signature="e#2087#2270#0" expanded="false" />
<element signature="e#2659#2709#0" expanded="false" />
<element signature="e#3319#3350#0" expanded="false" />
<element signature="e#3406#3438#0" expanded="false" />
<element signature="e#5383#5585#0" expanded="false" />
<element signature="e#5652#6805#0" expanded="false" />
<element signature="e#7808#8385#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/display_centre/display.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1350">
<caret line="82" column="40" lean-forward="false" selection-start-line="82" selection-start-column="40" selection-end-line="82" selection-end-column="40" />
<folding> <folding>
<element signature="e#0#29#0" expanded="true" /> <element signature="e#0#29#0" expanded="true" />
<element signature="e#8427#8619#0" expanded="false" /> <element signature="e#837#898#0" expanded="false" />
<element signature="e#8662#9090#0" expanded="false" /> <element signature="e#933#1579#0" expanded="false" />
<element signature="e#9131#9452#0" expanded="false" /> <element signature="e#1618#1760#0" expanded="false" />
<element signature="e#9491#9935#0" expanded="false" /> <element signature="e#1797#1935#0" expanded="false" />
<element signature="e#10459#10788#0" expanded="false" /> <element signature="e#1973#2361#0" expanded="false" />
<element signature="e#10828#10904#0" expanded="false" /> <element signature="e#3775#4623#0" expanded="false" />
<element signature="e#4663#5519#0" expanded="false" />
<element signature="e#5558#6144#0" expanded="false" />
<element signature="e#6194#6331#0" expanded="false" />
<element signature="e#6383#6526#0" expanded="false" />
<element signature="e#6572#7087#0" expanded="false" />
<element signature="e#6925#7087#0" expanded="false" />
<element signature="e#7182#7845#0" expanded="false" />
<element signature="e#7196#7453#0" expanded="false" />
<element signature="e#7898#7982#0" expanded="false" />
<element signature="e#8023#8229#0" expanded="false" />
<element signature="e#8306#9464#0" expanded="false" />
<element signature="e#9536#9732#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/actions.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="282">
<caret line="29" column="73" lean-forward="false" selection-start-line="29" selection-start-column="60" selection-end-line="29" selection-end-column="73" />
<folding>
<element signature="e#315#424#0" expanded="false" />
<element signature="e#475#580#0" expanded="false" />
<element signature="e#633#1022#0" expanded="false" />
<element signature="e#1239#1346#0" expanded="false" />
<element signature="e#1576#1680#0" expanded="false" />
<element signature="e#1743#1819#0" expanded="false" />
<element signature="e#1864#1900#0" expanded="false" />
</folding> </folding>
</state> </state>
</provider> </provider>

View File

@@ -1,5 +1,5 @@
# r_e_c_u_r # r_e_c_u_r
a diy videolooper for py/pi a diy video looper for py/pi
# things to do / bugs to fix: # things to do / bugs to fix:

71
actions.py Normal file
View File

@@ -0,0 +1,71 @@
class Actions(object):
def __init__(self, tk, message_handler, data, video_driver, display):
self.tk = tk
self.message_handler = message_handler
self.data = data
self.video_driver = video_driver
self.display = display
def move_browser_selection_down(self):
# self.display.move_browser_down()
self.display.navigate_menu('down', len(self.display.browser_list))
def move_browser_selection_up(self):
# self.display.move_browser_up()
self.display.navigate_menu('up', len(self.display.browser_list))
def enter_on_browser_selection(self):
is_file, name = self.data.browser_data.extract_file_type_and_name_from_browser_format(
self.data.browser_list[self.display.selected_list_index][0])
if is_file:
self.data.create_new_bank_mapping_in_first_open(name)
else:
self.data.browser_data.update_open_folders(name)
self.display.browser_list = self.data.rewrite_browser_list()
def move_settings_selection_down(self):
# self.display.move_settings_down()
self.display.navigate_menu('down', len(self.display.settings_list))
def move_settings_selection_up(self):
# self.display.move_settings_up()
self.display.navigate_menu('up', len(self.display.settings_list))
def enter_on_settings_selection(self):
self.data.switch_settings(self.display.selected_list_index)
def clear_all_sampler_slots(self):
self.data.clear_all_slots()
def quit_the_program(self):
if self.video_driver.has_omx:
self.video_driver.exit_all_players()
self.tk.destroy()
def load_this_slot_into_next_player(self, slot):
update_next_slot_number(slot)
self.video_driver.next_player.reload()
def trigger_next_player(self):
self.video_driver.manual_next = True
def cycle_display_mode(self):
self.display.topscreen_menu_index = 0
self.display.current_menu_index = self.display.topscreen_menu_index
if self.display.display_mode == "BROWSER":
self.display.display_mode = "SAMPLER"
elif self.display.display_mode == "SAMPLER":
self.display.display_mode = "SETTINGS"
elif self.display.display_mode == "SETTINGS":
self.display.display_mode = "BROWSER"
def toggle_pause_on_player(self):
self.video_driver.current_player.toggle_pause()
def seek_forward_on_player(self):
self.video_driver.current_player.seek(30)
def seek_back_on_player(self):
self.video_driver.current_player.seek(-30)

View File

@@ -1,356 +0,0 @@
import json
import logging
from collections import OrderedDict
import os
from random import randint
import time
import inspect
try:
from omxplayer.player import OMXPlayer
has_omx = True
except:
has_omx = False
print('data_centre has omx:{}'.format(has_omx))
current_message = [None, None, None]
number_of_messages = 0
def set_message(message_type,message ):
global current_message
global number_of_messages
current_message = [message_type, message,True]
number_of_messages = number_of_messages + 1
def clear_message():
global current_message
global number_of_messages
number_of_messages = number_of_messages - 1
if number_of_messages is 0:
current_message = [None, None, None]
######## sets names for the persistant data objects ########
NEXT_BANK_JSON = 'next_bank_number.json'
SETTINGS_JSON = 'settings.json'
BANK_DATA_JSON = 'display_data.json'
####<<<< generic methods for all tabs >>>>#####
def read_json(file_name):
with open(PATH_TO_DATA_OBJECTS + file_name) as data_file:
data = json.load(data_file)
return data
def update_json(file_name,data):
with open('{}{}'.format(PATH_TO_DATA_OBJECTS, file_name), 'w') as data_file:
json.dump(data, data_file)
def convert_int_to_string_for_display(time_in_seconds):
if time_in_seconds < 0:
return ''
elif time_in_seconds >= 6000:
return '99:99'
else:
return time.strftime("%M:%S", time.gmtime(time_in_seconds))
######## define how to get path to current dir and set up logging ########
def get_the_current_dir_path():
#TODO: investigate weird path formatting differences
current_file_path = inspect.stack()[0][1]
return os.path.split(current_file_path)[0] + '/'
def setup_logging():
logger = logging.getLogger('logfile')
current_dir = get_the_current_dir_path()
hdlr = logging.FileHandler(current_dir + 'logfile.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)
return logger
def get_path_to_browser():
return read_json('path_to_browser.json')
logger = setup_logging()
######## sets paths and constants ########
PATH_TO_DATA_OBJECTS = '{}data_objects/'.format(get_the_current_dir_path())
PATH_TO_BROWSER = get_path_to_browser()
EMPTY_BANK = dict(name='', location='', length=-1, start=-1, end=-1)
DEV_MODE = read_json(SETTINGS_JSON)[6]["value"]
print(DEV_MODE)
####<<<< data methods for browser tab >>>>#####
class data(object):
######## a data class used mainly for managing the browser list ########
def __init__(self):
self._open_folders = []
self._browser_list = []
def rewrite_browser_list(self):
self._browser_list = generate_browser_list(PATH_TO_BROWSER, 0, self._open_folders)
def get_browser_data_for_display(self):
######## map the browser_list to format for displaying ########
if not self._browser_list:
self.rewrite_browser_list()
browser_list_for_display = []
for index , dir in enumerate(self._browser_list):
browser_list_for_display.append([dir['name'],dir['bank']])
#logger.info(browser_list_for_display)
return browser_list_for_display
def update_open_folders(self, folder_name):
if folder_name not in self._open_folders:
self._open_folders.append(folder_name)
else:
self._open_folders.remove(folder_name)
def generate_browser_list(initial_path, current_level, open_folder_list):
######## starts the recursive process of listing all folders and video files to display ########
global results
results = []
add_folder_to_browser_list(initial_path, current_level,open_folder_list)
memory_bank = read_json(BANK_DATA_JSON)
for browser_line in results:
is_file, file_name = extract_file_type_and_name_from_browser_format(browser_line['name'])
if is_file:
is_banked, bank_number = is_file_in_memory_bank(file_name, memory_bank)
if is_banked:
browser_line['bank'] = str(bank_number)
return results
def add_folder_to_browser_list(current_path, current_level,open_folder_list):
######## adds the folders and mp4 files at the current level to the results list. recursively recalls at deeper level if folder is open ########
#TODO make note of / investigate what happens with multiple folders of same name
root, dirs, files = next(os.walk(current_path))
indent = ' ' * 4 * (current_level)
for folder in dirs:
is_open, char = check_folder_state(folder,open_folder_list)
#print('{}{}{}'.format(indent, folder, char))
results.append(dict(name='{}{}{}'.format(indent, folder, char), bank='x'))
if (is_open):
next_path = '{}/{}'.format(root, folder)
next_level = current_level + 1
add_folder_to_browser_list(next_path, next_level,open_folder_list)
for f in files:
if (os.path.splitext(f)[1] in ['.mp4', '.mkv']):
#print('{}{}'.format(indent, f))
results.append(dict(name='{}{}'.format(indent, f), bank='-'))
def check_folder_state(folder_name,open_folder_list):
######## used for displaying folders as open or closed ########
if (folder_name in open_folder_list):
return True, '/'
else:
return False, '|'
def extract_file_type_and_name_from_browser_format(dir_name):
######## removes whitespace and folder state from display item ########
if(dir_name.endswith('|') or dir_name.endswith('/')):
return False , dir_name.lstrip()[:-1]
else:
return True , dir_name.lstrip()
def is_file_in_memory_bank(file_name, memory_bank=[]):
######## used for displaying the mappings in browser view ########
if not memory_bank:
memory_bank = read_json(BANK_DATA_JSON)
for index, bank in enumerate(memory_bank):
if(file_name == bank['name']):
return True , index
return False, ''
####<<<< responding to user input in browser tab >>>>#####
def create_new_bank_mapping_in_first_open(file_name):
######## used for mapping current video to next available bank ########
memory_bank = read_json(BANK_DATA_JSON)
for index , bank in enumerate(memory_bank):
if(not bank['name']):
create_new_bank_mapping(index,file_name,memory_bank)
return True
return False
def create_new_bank_mapping(bank_number,file_name,memory_bank=[]):
######## used for mapping current video to a specific bank ########
has_location , location = get_path_for_file(file_name)
length = get_length_for_file(location)
new_bank = dict(name=file_name, location=location, length=length, start=-1, end=-1)
update_a_banks_data(bank_number, new_bank, memory_bank)
def get_length_for_file(location):
return get_duration_from_path(location)
def get_path_for_file(file_name):
######## returns full path for a given file name ########
for root, dirs, files in os.walk(PATH_TO_BROWSER):
if file_name in files:
print(root)
return True, '{}/{}'.format(root,file_name)
return False, ''
def update_a_banks_data(bank_number, bank_info, memory_bank=[]):
######## overwrite a given banks info with new data ########
if not memory_bank:
memory_bank = read_json(BANK_DATA_JSON)
memory_bank[bank_number] = bank_info
update_json(BANK_DATA_JSON, memory_bank)
def clear_all_banks():
memory_bank = read_json(BANK_DATA_JSON)
for index, bank in enumerate(memory_bank):
memory_bank[index] = EMPTY_BANK
update_json(BANK_DATA_JSON, memory_bank)
####<<<< data methods for looper tab >>>>#####
def get_all_looper_data_for_display():
######## read bank mappings from data object and format for displaying ########
memory_bank = read_json(BANK_DATA_JSON)
loop_data = []
for index, bank in enumerate(memory_bank):
length = convert_int_to_string_for_display(bank["length"])
start = convert_int_to_string_for_display(bank["start"])
end = convert_int_to_string_for_display(bank["end"])
loop_data.append([str(index), bank["name"], length, start, end])
return loop_data
####<<<< data methods for looper tab >>>>#####
def get_all_settings_data_for_display():
######## read settings from data object and format for displaying ########
settings = read_json(SETTINGS_JSON)
display_settings = []
for index, setting in enumerate(settings):
display_settings.append([setting['name'],setting['value']])
return display_settings
def switch_settings(setting_index):
######## update the value of selected setting by cycling through valid options ########
settings = read_json(SETTINGS_JSON)
for index, setting in enumerate(settings):
if index == setting_index:
setting = cycle_setting_value(setting)
update_json(SETTINGS_JSON,settings)
def cycle_setting_value(setting):
######## contains the valid setting values for each applicable option ########
if setting['name'] == 'PLAYBACK_MODE':
if setting['value'] == 'LOOPER':
setting['value'] = 'PLAYLIST'
elif setting['value'] == 'PLAYLIST':
setting['value'] = 'RANDOM'
else:
setting['value'] = 'LOOPER'
elif setting['name'] == 'SYNC_LENGTHS':
if setting['value'] == 'ON':
setting['value'] = 'OFF'
else:
setting['value'] = 'ON'
elif setting['name'] == 'RAND_START':
if setting['value'] == 'ON':
setting['value'] = 'OFF'
else:
setting['value'] = 'ON'
elif setting['name'] == 'VIDEO_OUTPUT':
if setting['value'] == 'HDMI':
setting['value'] = 'COMPOSITE'
else:
setting['value'] = 'HDMI'
elif setting['name'] == 'DEV_MODE':
if setting['value'] == 'ON':
setting['value'] = 'OFF'
else:
setting['value'] = 'ON'
return setting
####<<<< data methods for video_centre >>>>#####
def get_next_context():
######## loads the bank details, uses settings to modify them and then set next bank number ########
next_bank_number = read_json(NEXT_BANK_JSON)
memory_bank = read_json(BANK_DATA_JSON)
next_bank_details = memory_bank[next_bank_number]
start_value = next_bank_details['start']
end_value = next_bank_details['end']
length = next_bank_details['length']
use_rand_start, use_sync_length, sync_length, playback_mode = get_context_options_from_settings()
if use_rand_start and use_sync_length:
start_value = randint(0, length - sync_length)
end_value = start_value + sync_length
elif use_rand_start and not use_sync_length:
start_value = randint(0, end_value)
elif not use_rand_start and use_sync_length:
end_value = min(length, start_value + sync_length)
set_next_bank_number_from_playback_mode(playback_mode, next_bank_number)
context = dict(location=next_bank_details['location'],name=next_bank_details['name'],length=next_bank_details['length'],start=start_value,end=end_value, bank_number=next_bank_number)
return context
def get_context_options_from_settings():
######## looks up the settings data object and returns states of relevant options ########
settings = read_json(SETTINGS_JSON)
use_sync_length = False
sync_length = 0
use_rand_start = False
playback_mode = ''
for index, setting in enumerate(settings):
if setting['name'] == 'SYNC_LENGTHS' and setting['value'] == 'ON':
use_sync_length = True
elif setting['name'] == 'SYNC_LENGTHS_TO':
sync_length = setting['value']
elif setting['name'] == 'RAND_START' and setting['value'] == 'ON':
use_rand_start = True
elif setting['name'] == 'PLAYBACK_MODE':
playback_mode = setting['value']
return use_rand_start , use_sync_length , sync_length , playback_mode
def set_next_bank_number_from_playback_mode(playback_mode, current_bank_number):
######## sets next bank number by using playback mode logic ########
next_bank_number = 0
if playback_mode == 'LOOPER':
next_bank_number = current_bank_number
elif playback_mode == 'RANDOM':
#TODO: actually find which banks have value and only use those
next_bank_number = randint(0,14)
elif playback_mode == 'PLAYLIST':
#TODO: implement some playlist objects and logic at some point
next_bank_number = current_bank_number
update_json('next_bank_number.json',next_bank_number)
def update_next_bank_number(new_value):
global current_message
memory_bank = read_json(BANK_DATA_JSON)
if(memory_bank[new_value]['location'] == ''):
print('its empty!')
current_message = 'the bank you pressed is empty'
else:
update_json(NEXT_BANK_JSON, new_value)
def get_duration_from_path(path):
temp_player = OMXPlayer(path, args=['--alpha', '0'], dbus_name='t.t')
duration = temp_player.duration()
temp_player.quit()
return duration

View File

@@ -0,0 +1,82 @@
import os
import data_centre.data
class BrowserData(object):
######## a data class used mainly for managing the browser list ########
def __init__(self):
self.open_folders = []
self.browser_list = []
self.memory_bank = []
self.generate_browser_list()
def update_open_folders(self, folder_name):
if folder_name not in self.open_folders:
self.open_folders.append(folder_name)
else:
self.open_folders.remove(folder_name)
def generate_browser_list(self):
######## starts the recursive process of listing all folders and video files to display ########
self.browser_list = []
self._add_folder_to_browser_list(data_centre.data.PATH_TO_BROWSER, 0)
self.memory_bank = data_centre.data.read_json(data_centre.data.BANK_DATA_JSON)
for browser_line in self.browser_list:
is_file, file_name = self.extract_file_type_and_name_from_browser_format(browser_line['name'])
if is_file:
is_banked, bank_number = self._is_file_in_memory_bank(file_name)
if is_banked:
browser_line['bank'] = str(bank_number)
return self.browser_list
@staticmethod
def extract_file_type_and_name_from_browser_format(dir_name):
# removes whitespace and folder state from display item ########
if dir_name.endswith('|') or dir_name.endswith('/'):
return False, dir_name.lstrip()[:-1]
else:
return True, dir_name.lstrip()
def _add_folder_to_browser_list(self, current_path, current_level):
######## adds the folders and mp4 files at the current level to the results list. recursively recalls at deeper level if folder is open ########
# TODO make note of / investigate what happens with multiple folders of same name
root, dirs, files = next(os.walk(current_path))
indent = ' ' * 4 * (current_level)
for folder in dirs:
is_open, char = self._check_folder_state(folder)
self.browser_list.append(dict(name='{}{}{}'.format(indent, folder, char), bank='x'))
if (is_open):
next_path = '{}/{}'.format(root, folder)
next_level = current_level + 1
self._add_folder_to_browser_list(next_path, next_level)
for f in files:
split_name = os.path.splitext(f)
if (split_name[1] in ['.mp4', '.mkv']):
self.browser_list.append(dict(name='{}{}'.format(indent, split_name[0]), bank='-'))
def _check_folder_state(self, folder_name):
######## used for displaying folders as open or closed ########
if folder_name in self.open_folders:
return True, '/'
else:
return False, '|'
def _is_file_in_memory_bank(self, file_name):
######## used for displaying the mappings in browser view ########
if not self.memory_bank:
self.memory_bank = data_centre.data.read_json(data_centre.data.BANK_DATA_JSON)
for index, bank in enumerate(self.memory_bank):
if file_name == bank['name']:
return True, index
return False, ''

235
data_centre/data.py Normal file
View File

@@ -0,0 +1,235 @@
import json
import os
from random import randint
import inspect
from data_centre.browser_data import BrowserData
def get_the_current_dir_path():
# TODO: investigate weird path formatting differences
current_file_path = inspect.stack()[0][1]
return os.path.split(current_file_path)[0]
BANK_DATA_JSON = 'display_data.json'
NEXT_SLOT_JSON = 'next_bank_number.json'
SETTINGS_JSON = 'settings.json'
EMPTY_BANK = dict(name='', location='', length=-1, start=-1, end=-1)
PATH_TO_DATA_OBJECTS = '{}\\json_objects\\'.format(get_the_current_dir_path())
def read_json(file_name):
with open(PATH_TO_DATA_OBJECTS + file_name) as data_file:
data = json.load(data_file)
return data
def update_json(file_name, data):
with open('{}{}'.format(Data.PATH_TO_DATA_OBJECTS, file_name), 'w') as data_file:
json.dump(data, data_file)
def get_path_to_browser():
return read_json('path_to_browser.json')
PATH_TO_BROWSER = get_path_to_browser()
class Data(object):
def __init__(self, message_handler):
self.browser_data = BrowserData()
self.message_handler = message_handler
self.has_omx = self.try_import_omx()
self.DEV_MODE = read_json(SETTINGS_JSON)[6]["value"]
def create_new_slot_mapping_in_first_open(self, file_name):
######## used for mapping current video to next available slot ########
memory_bank = read_json(BANK_DATA_JSON)
for index, slot in enumerate(memory_bank):
if (not slot['name']):
self.create_new_slot_mapping(index, file_name)
return True
return False
def create_new_slot_mapping(self, slot_number, file_name):
######## used for mapping current video to a specific bank ########
has_location, location = self._get_path_for_file(file_name)
length = self._get_length_for_file(location)
new_slot = dict(name=file_name, location=location, length=length, start=-1, end=-1)
self._update_a_slots_data(slot_number, new_slot)
@staticmethod
def clear_all_slots():
memory_bank = read_json(BANK_DATA_JSON)
for index, bank in enumerate(memory_bank):
memory_bank[index] = EMPTY_BANK
update_json(BANK_DATA_JSON, memory_bank)
def update_next_slot_number(self, new_value):
memory_bank = read_json(BANK_DATA_JSON)
if memory_bank[new_value]['location'] == '':
print('its empty!')
self.message_handler.set_message('INFO', 'the slot you pressed is empty')
else:
update_json(NEXT_SLOT_JSON, new_value)
def add_open_folder(self, folder_name):
self.browser_data.update_open_folders(folder_name)
def switch_settings(self, setting_index):
######## update the value of selected setting by cycling through valid options ########
settings = read_json(SETTINGS_JSON)
for index, setting in enumerate(settings):
if index == setting_index:
self._cycle_setting_value(setting)
update_json(SETTINGS_JSON, settings)
def rewrite_browser_list(self):
return self.browser_data.generate_browser_list()
def return_browser_list(self):
return self.browser_data.browser_list()
@staticmethod
def get_settings_data():
return read_json(SETTINGS_JSON)
@staticmethod
def get_sampler_data():
return read_json(BANK_DATA_JSON)
def get_next_context(self):
######## loads the slot details, uses settings to modify them and then set next slot number ########
next_slot_number = read_json(NEXT_SLOT_JSON)
memory_bank = read_json(BANK_DATA_JSON)
next_slot_details = memory_bank[next_slot_number]
start_value = next_slot_details['start']
end_value = next_slot_details['end']
length = next_slot_details['length']
use_rand_start, use_sync_length, sync_length, playback_mode = self._get_context_options_from_settings()
if use_rand_start and use_sync_length:
start_value = randint(0, length - sync_length)
end_value = start_value + sync_length
elif use_rand_start and not use_sync_length:
start_value = randint(0, end_value)
elif not use_rand_start and use_sync_length:
end_value = min(length, start_value + sync_length)
self._set_next_slot_number_from_playback_mode(playback_mode, next_slot_number)
context = dict(location=next_slot_details['location'], name=next_slot_details['name'],
length=next_slot_details['length'], start=start_value, end=end_value,
bank_number=next_slot_number)
return context
def _get_length_for_file(self, path):
if self.has_omx:
temp_player = OMXPlayer(path, args=['--alpha', '0'], dbus_name='t.t')
duration = temp_player.duration()
temp_player.quit()
return duration
else:
return -1
def _get_path_for_file(self, file_name):
######## returns full path for a given file name ########
for root, dirs, files in os.walk(PATH_TO_BROWSER):
if file_name in files:
return True, '{}/{}'.format(root, file_name)
return False, ''
@staticmethod
def _update_a_slots_data(bank_number, slot_info):
######## overwrite a given banks info with new data ########
memory_bank = read_json(BANK_DATA_JSON)
memory_bank[bank_number] = slot_info
update_json(BANK_DATA_JSON, memory_bank)
@staticmethod
def _cycle_setting_value(setting):
######## contains the valid setting values for each applicable option ########
if setting['name'] == 'PLAYBACK_MODE':
if setting['value'] == 'SAMPLER':
setting['value'] = 'PLAYLIST'
elif setting['value'] == 'PLAYLIST':
setting['value'] = 'RANDOM'
else:
setting['value'] = 'SAMPLER'
elif setting['name'] == 'SYNC_LENGTHS':
if setting['value'] == 'ON':
setting['value'] = 'OFF'
else:
setting['value'] = 'ON'
elif setting['name'] == 'RAND_START':
if setting['value'] == 'ON':
setting['value'] = 'OFF'
else:
setting['value'] = 'ON'
elif setting['name'] == 'VIDEO_OUTPUT':
if setting['value'] == 'HDMI':
setting['value'] = 'COMPOSITE'
else:
setting['value'] = 'HDMI'
elif setting['name'] == 'DEV_MODE':
if setting['value'] == 'ON':
setting['value'] = 'OFF'
else:
setting['value'] = 'ON'
return setting
@staticmethod
def _get_context_options_from_settings():
######## looks up the settings data object and returns states of relevant options ########
settings = read_json(SETTINGS_JSON)
use_sync_length = False
sync_length = 0
use_rand_start = False
playback_mode = ''
for index, setting in enumerate(settings):
if setting['name'] == 'SYNC_LENGTHS' and setting['value'] == 'ON':
use_sync_length = True
elif setting['name'] == 'SYNC_LENGTHS_TO':
sync_length = setting['value']
elif setting['name'] == 'RAND_START' and setting['value'] == 'ON':
use_rand_start = True
elif setting['name'] == 'PLAYBACK_MODE':
playback_mode = setting['value']
return use_rand_start, use_sync_length, sync_length, playback_mode
@staticmethod
def _set_next_slot_number_from_playback_mode(playback_mode, current_slot_number):
######## sets next slot number by using playback mode logic ########
next_slot_number = 0
if playback_mode == 'SAMPLER':
next_slot_number = current_slot_number
elif playback_mode == 'RANDOM':
#TODO: actually find which banks have value and only use those
next_slot_number = randint(0,14)
elif playback_mode == 'PLAYLIST':
#TODO: implement some playlist objects and logic at some point
next_slot_number = current_slot_number
update_json('next_bank_number.json',next_slot_number)
@staticmethod
def try_import_omx():
try:
from omxplayer.player import OMXPlayer
return True
except:
return False

View File

@@ -0,0 +1 @@
[{"value": "PLAYLIST", "name": "PLAYBACK_MODE"}, {"value": "[1,1,1,4,1,2,1,4]", "name": "PLAYLIST"}, {"value": "ON", "name": "SYNC_LENGTHS"}, {"value": "00:08", "name": "SYNC_LENGTHS_TO"}, {"value": "ON", "name": "RAND_START"}, {"value": "COMPOSITE", "name": "VIDEO_OUTPUT"}, {"value": "ON", "name": "DEV_MODE"}]

View File

@@ -1 +0,0 @@
[{"value": "LOOPER", "name": "PLAYBACK_MODE"}, {"value": "[1,1,1,4,1,2,1,4]", "name": "PLAYLIST"}, {"value": "OFF", "name": "SYNC_LENGTHS"}, {"value": "00:08", "name": "SYNC_LENGTHS_TO"}, {"value": "OFF", "name": "RAND_START"}, {"value": "COMPOSITE", "name": "VIDEO_OUTPUT"}, {"value": "ON", "name": "DEV_MODE"}]

View File

@@ -1,37 +1,35 @@
from tkinter import Text, END from tkinter import Text, END
import math import math
import data_centre import time
class Display(object): class Display(object):
MAX_LINES = 10 MENU_HEIGHT = 10
SELECTOR_WIDTH = 0.47 SELECTOR_WIDTH = 0.47
ROW_OFFSET = 6.0 ROW_OFFSET = 6.0
VIDEO_DISPLAY_TEXT = ' NOW [{}] {} NEXT [{}] {}' VIDEO_DISPLAY_TEXT = ' NOW [{}] {} NEXT [{}] {}'
VIDEO_DISPLAY_BANNER_TEXT = ' {} {} {}' VIDEO_DISPLAY_BANNER_TEXT = ' {} {} {}'
def __init__(self, tk, video_driver): def __init__(self, tk, video_driver, message_handler, data):
self.video_driver = video_driver
self.display_mode = "LOOPER"
self.tk = tk self.tk = tk
self.video_driver = video_driver
self.message_handler = message_handler
self.data = data
self.browser_data = data_centre.data() self.display_mode = "SAMPLER"
self.browser_start_index = 0 self.top_menu_index = 0
self.browser_index = self.browser_start_index self.selected_list_index = self.top_menu_index
self.browser_list = self.browser_data.get_browser_data_for_display() self.browser_list = self.data.rewrite_browser_list()
self.settings_start_index = 0
self.settings_index = self.settings_start_index
self.settings_list = data_centre.get_all_settings_data_for_display()
self.display_text = self.create_display_text(self.tk) self.display_text = self._create_display_text(self.tk)
self.add_tags() self._add_tags()
self.update_screen() self._update_screen_every_second()
@staticmethod @staticmethod
def create_display_text(tk): def _create_display_text(tk):
return Text(tk, bg="black", fg="white", font=('courier', 13)) return Text(tk, bg="black", fg="white", font=('courier', 13))
def add_tags(self): def _add_tags(self):
self.display_text.tag_configure("SELECT", background="white", foreground="black") self.display_text.tag_configure("SELECT", background="white", foreground="black")
self.display_text.tag_configure("TITLE", background="black", foreground="red") self.display_text.tag_configure("TITLE", background="black", foreground="red")
self.display_text.tag_configure("DISPLAY_MODE", background="black", foreground="magenta") self.display_text.tag_configure("DISPLAY_MODE", background="black", foreground="magenta")
@@ -40,19 +38,19 @@ class Display(object):
self.display_text.tag_configure("PLAYER_INFO", background="black", foreground="yellow") self.display_text.tag_configure("PLAYER_INFO", background="black", foreground="yellow")
self.display_text.tag_configure("COLUMN_NAME", background="black", foreground="cyan") self.display_text.tag_configure("COLUMN_NAME", background="black", foreground="cyan")
def load_display(self): def _load_display(self):
self.load_title() self._load_title()
self.load_player() self._load_player()
self.load_display_body() self._load_display_body()
self.load_message() self._load_message()
self.display_text.pack() self.display_text.pack()
def load_title(self): def _load_title(self):
self.display_text.insert(END, '================== r_e_c_u_r ================== \n') self.display_text.insert(END, '================== r_e_c_u_r ================== \n')
self.display_text.tag_add("TITLE", 1.19, 1.28) self.display_text.tag_add("TITLE", 1.19, 1.28)
def load_player(self): def _load_player(self):
text, banner = self.get_text_for_video_display() text, banner = self._get_info_for_player()
end_of_text = float("3." + str(len(text))) end_of_text = float("3." + str(len(text)))
end_of_banner = float("3." + str(len(banner))) end_of_banner = float("3." + str(len(banner)))
self.display_text.insert(END, text + '\n') self.display_text.insert(END, text + '\n')
@@ -60,88 +58,92 @@ class Display(object):
self.display_text.insert(END, banner + '\n') self.display_text.insert(END, banner + '\n')
self.display_text.tag_add("PLAYER_INFO", 3.0, end_of_banner) self.display_text.tag_add("PLAYER_INFO", 3.0, end_of_banner)
def load_display_body(self): def _load_display_body(self):
if self.display_mode == 'BROWSER': if self.display_mode == 'BROWSER':
self.load_browser() self._load_browser()
elif self.display_mode == 'SETTINGS': elif self.display_mode == 'SETTINGS':
self.load_settings() self._load_settings()
else: else:
self.load_sampler() self._load_sampler()
self.display_text.tag_add("COLUMN_NAME", 5.0, 6.0) self.display_text.tag_add("COLUMN_NAME", 5.0, 6.0)
print('selected_list_index:{}, top_menu_index:{}'.format(self.selected_list_index, self.top_menu_index))
self._highlight_this_row(self.selected_list_index - self.top_menu_index)
def load_sampler(self): def _load_sampler(self):
bank_info = data_centre.get_all_looper_data_for_display() bank_info = self.data.get_sampler_data()
self.display_text.insert(END, '------------------ <SAMPLER> ------------------ \n') self.display_text.insert(END, '------------------ <SAMPLER> ------------------ \n')
self.display_text.tag_add("DISPLAY_MODE", 4.19, 4.29) self.display_text.tag_add("DISPLAY_MODE", 4.19, 4.29)
self.display_text.insert(END, '{:^4} {:<22} {:<4} {:<4} {:<4} \n'.format( self.display_text.insert(END, '{:^4} {:<22} {:<4} {:<4} {:<4} \n'.format(
'bank', 'name', 'length', 'start', 'end')) 'slot', 'name', 'length', 'start', 'end'))
for bank in bank_info: for index, slot in enumerate(bank_info):
self.display_text.insert(END, '{:^4} {:<22} {:<4} {:<4} {:<4} \n'.format( self.display_text.insert(END, '{:^4} {:<22} {:<4} {:<4} {:<4} \n'.format(
bank[0], bank[1][0:22], bank[2], bank[3], bank[4])) index, slot['name'][0:22], self.format_time_value(slot['length']),
self.select_current_playing(self.video_driver.current_player.bank_number) self.format_time_value(slot['start']), self.format_time_value(slot['end'])))
if self.video_driver.current_player.bank_number is '-':
self.selected_list_index = 0
else:
self.selected_list_index = self.video_driver.current_player.bank_number
def load_message(self): def _load_browser(self):
if data_centre.current_message[1]: number_of_lines_displayed = 0
self.display_text.insert(END, '{:5}: {:38}'.format(data_centre.current_message[0], data_centre.current_message[1][0:38]))
self.display_text.tag_add('{}_MESSAGE'.format(data_centre.current_message[0]), 16.0,16.0 + self.SELECTOR_WIDTH)
print(data_centre.current_message[2])
if data_centre.current_message[2]:
self.clear_message()
def clear_message(self):
data_centre.current_message[2] = False
message_length = 4000
self.tk.after(message_length, data_centre.clear_message)
def load_browser(self):
line_count = 0
self.display_text.insert(END, '------------------ <BROWSER> ------------------ \n') self.display_text.insert(END, '------------------ <BROWSER> ------------------ \n')
self.display_text.tag_add("DISPLAY_MODE", 4.19, 4.29) self.display_text.tag_add("DISPLAY_MODE", 4.19, 4.29)
self.display_text.insert(END, '{:40} {:5} \n'.format('path', 'bank')) self.display_text.insert(END, '{:40} {:5} \n'.format('path', 'bank'))
number_of_browser_items = len(self.browser_list) number_of_browser_items = len(self.browser_list)
for index in range(number_of_browser_items): for index in range(number_of_browser_items):
if line_count >= self.MAX_LINES: if number_of_lines_displayed >= self.MENU_HEIGHT:
break break
if index >= self.browser_start_index: if index >= self.top_menu_index:
path = self.browser_list[index] path = self.browser_list[index]
self.display_text.insert(END, '{:40} {:5} \n'.format(path[0][0:35], path[1])) self.display_text.insert(END, '{:40} {:5} \n'.format(path['name'][0:35], path['bank']))
line_count = line_count + 1 number_of_lines_displayed = number_of_lines_displayed + 1
for index in range(self.MAX_LINES - number_of_browser_items): for index in range(self.MENU_HEIGHT - number_of_browser_items):
self.display_text.insert(END, '\n') self.display_text.insert(END, '\n')
def load_settings(self): def _load_settings(self):
line_count = 0 line_count = 0
settings_list = self.data.get_settings_data()
self.display_text.insert(END, '------------------ <SETTINGS> ----------------- \n') self.display_text.insert(END, '------------------ <SETTINGS> ----------------- \n')
self.display_text.tag_add("DISPLAY_MODE", 4.19, 4.29) self.display_text.tag_add("DISPLAY_MODE", 4.19, 4.29)
self.display_text.insert(END, '{:^25} {:^20} \n'.format('SETTING', 'VALUE')) self.display_text.insert(END, '{:^25} {:^20} \n'.format('SETTING', 'VALUE'))
number_of_settings_items = len(self.settings_list) number_of_settings_items = len(settings_list)
for index in range(number_of_settings_items): for index in range(number_of_settings_items):
if line_count >= self.MAX_LINES: if line_count >= self.MENU_HEIGHT:
break break
if index >= self.settings_start_index: if index >= self.top_menu_index:
setting = self.settings_list[index] setting = settings_list[index]
self.display_text.insert(END, '{:>25} {:<20} \n'.format(setting[0], setting[1][0:20])) self.display_text.insert(END, '{:>25} {:<20} \n'.format(setting['name'], setting['value'][0:20]))
line_count = line_count + 1 line_count = line_count + 1
for index in range(self.MAX_LINES - number_of_settings_items): for index in range(self.MENU_HEIGHT - number_of_settings_items):
self.display_text.insert(END, '\n') self.display_text.insert(END, '\n')
def highlight_this_row(self, row): def _load_message(self):
if self.message_handler.current_message[1]:
self.display_text.insert(END, '{:5}: {:38}'.format(
self.message_handler.current_message[0], self.message_handler.current_message[1][0:38]))
self.display_text.tag_add('{}_MESSAGE'.format(
self.message_handler.current_message[0]), 16.0,16.0 + self.SELECTOR_WIDTH)
if self.message_handler.current_message[2]:
self.message_handler.current_message[2] = False
message_length = 4000
self.tk.after(message_length, self.message_handler.clear_message)
def _highlight_this_row(self, row):
self.display_text.tag_add("SELECT", self.ROW_OFFSET + row, self.display_text.tag_add("SELECT", self.ROW_OFFSET + row,
self.ROW_OFFSET + self.SELECTOR_WIDTH + row) self.ROW_OFFSET + self.SELECTOR_WIDTH + row)
def unhighlight_this_row(self, row): def _unhighlight_this_row(self, row):
self.display_text.tag_remove("SELECT", self.ROW_OFFSET + row, self.display_text.tag_remove("SELECT", self.ROW_OFFSET + row,
self.ROW_OFFSET + self.SELECTOR_WIDTH + row) self.ROW_OFFSET + self.SELECTOR_WIDTH + row)
def get_text_for_video_display(self): def _get_info_for_player(self):
now_bank, now_status, next_bank, next_status, position, video_length, start, end = self.video_driver.get_info_for_video_display() now_bank, now_status, next_bank, next_status, position, video_length, start, end = self.video_driver.get_info_for_player_display()
banner = self.create_video_display_banner(start, end, video_length, position) banner = self.create_video_display_banner(start, end, video_length, position)
time_been = data_centre.convert_int_to_string_for_display(position - start) time_been = self.format_time_value(position - start)
time_left = data_centre.convert_int_to_string_for_display( time_left = self.format_time_value(end - position)
end - position)
return self.VIDEO_DISPLAY_BANNER_TEXT.format(time_been, banner, time_left), \ return self.VIDEO_DISPLAY_BANNER_TEXT.format(time_been, banner, time_left), \
self.VIDEO_DISPLAY_TEXT.format(now_bank, now_status, next_bank, next_status) self.VIDEO_DISPLAY_TEXT.format(now_bank, now_status, next_bank, next_status)
@@ -165,75 +167,52 @@ class Display(object):
return ''.join(banner_list) return ''.join(banner_list)
def _update_screen_every_second(self):
self.refresh_display()
self.tk.after(1000, self._update_screen_every_second)
def refresh_display(self): def refresh_display(self):
self.display_text.configure(state='normal') self.display_text.configure(state='normal')
self.display_text.delete(1.0, END) self.display_text.delete(1.0, END)
self.load_display() self._load_display()
self.display_text.configure(state='disable') self.display_text.configure(state='disable')
if self.display_mode is 'BROWSER':
self.highlight_this_row(self.browser_index)
elif self.display_mode is 'SETTINGS':
self.highlight_this_row(self.settings_index)
self.display_text.focus_set() self.display_text.focus_set()
def update_screen(self): def navigate_menu(self, move_direction, number_items_in_list):
self.refresh_display() last_list_index = number_items_in_list - 1
self.tk.after(1000, self.update_screen) bottom_menu_index = self.top_menu_index + self.MENU_HEIGHT - 1
def select_current_playing(self, bank_number): self._unhighlight_this_row(self.selected_list_index - self.top_menu_index)
if bank_number != '-':
self.display_text.tag_add("SELECT", self.ROW_OFFSET + bank_number,
self.ROW_OFFSET + self.SELECTOR_WIDTH + bank_number)
def move_browser_down(self): if move_direction == 'down':
last_index = len(self.browser_list) - 1 if self.selected_list_index != last_list_index:
if self.browser_index + self.browser_start_index >= last_index: if self.selected_list_index == bottom_menu_index:
return self.top_menu_index += 1
if self.browser_index >= self.MAX_LINES - 1: self.selected_list_index += 1
self.browser_start_index = self.browser_start_index + 1 else:
return self.top_menu_index = 0
self.unhighlight_this_row(self.browser_index) self.selected_list_index = self.top_menu_index
self.browser_index = self.browser_index + 1
self.highlight_this_row(self.browser_index)
def move_browser_up(self): elif move_direction == 'up':
if self.browser_index == 0: if self.selected_list_index != 0:
if self.browser_start_index > 0: if self.selected_list_index == self.top_menu_index:
self.browser_start_index = self.browser_start_index - 1 self.top_menu_index -= 1
return self.selected_list_index -= 1
self.unhighlight_this_row(self.browser_index) else:
self.browser_index = self.browser_index - 1 self.selected_list_index = last_list_index
self.highlight_this_row(self.browser_index) self.top_menu_index = last_list_index - (self.MENU_HEIGHT - 1)
if self.top_menu_index < 0:
self.top_menu_index = 0
def browser_enter(self): self._highlight_this_row(self.selected_list_index - self.top_menu_index)
is_file, name = data_centre.extract_file_type_and_name_from_browser_format(
self.browser_list[self.browser_index + self.browser_start_index][0]) return
if is_file:
data_centre.create_new_bank_mapping_in_first_open(name) @staticmethod
def format_time_value(time_in_seconds):
if time_in_seconds < 0:
return ''
elif time_in_seconds >= 6000:
return '99:99'
else: else:
self.browser_data.update_open_folders(name) return time.strftime("%M:%S", time.gmtime(time_in_seconds))
self.browser_data.rewrite_browser_list()
self.browser_list = self.browser_data.get_browser_data_for_display()
def move_settings_down(self):
last_index = len(self.settings_list) - 1
if self.settings_index + self.settings_start_index >= last_index:
return
if self.settings_index >= self.MAX_LINES - 1:
self.settings_start_index = self.settings_start_index + 1
return
self.unhighlight_this_row(self.settings_index)
self.settings_index = self.settings_index + 1
self.highlight_this_row(self.settings_index)
def move_settings_up(self):
if self.settings_index == 0:
if self.settings_start_index > 0:
self.settings_start_index = self.settings_start_index - 1
return
self.unhighlight_this_row(self.settings_index)
self.settings_index = self.settings_index - 1
self.highlight_this_row(self.settings_index)
def settings_enter(self):
data_centre.switch_settings(self.settings_index + self.settings_start_index)

0
display_centre/menu.py Normal file
View File

View File

@@ -0,0 +1,31 @@
import logging
import data_centre.data
class MessageHandler(object):
def __init__(self):
self.current_message = [None, None, None]
self.number_of_messages = 0
self.logger = self.setup_logging()
def setup_logging(self):
logger = logging.getLogger('logfile')
current_dir = data_centre.data.get_the_current_dir_path()
hdlr = logging.FileHandler(current_dir + 'logfile.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.ERROR)
return logger
def set_message(self, message_type, message, stacktrace=''):
self.current_message = [message_type, message, True]
self.number_of_messages = self.number_of_messages + 1
if message_type is 'ERROR':
self.logger.error('ERROR MESSAGE IS: {} \n STACKTRACE IS: {}'.format(message, stacktrace))
def clear_message(self):
self.number_of_messages = self.number_of_messages - 1
if self.number_of_messages is 0:
self.current_message = [None, None, None]

View File

@@ -2,24 +2,34 @@ import traceback
from tkinter import Tk, Frame from tkinter import Tk, Frame
import sys import sys
from user_input.actions import Actions from actions import Actions
from data_centre.data import Data
from display_centre.display import Display from display_centre.display import Display
from display_centre.messages import MessageHandler
from user_input.numpad_input import NumpadInput from user_input.numpad_input import NumpadInput
from video_centre.video_driver import VideoDriver from video_centre.video_driver import VideoDriver
import data_centre import data_centre
## create tk object # create tk object
tk = Tk() tk = Tk()
frame = Frame(tk, width=500, height=400) frame = Frame(tk, width=500, height=400)
## setup the video driver # setup message handler
video_driver = VideoDriver(frame)
## setup the display message_handler = MessageHandler()
display = Display(tk, video_driver)
## setup the actions # setup data
actions = Actions(tk, video_driver, display)
data = Data(message_handler)
# setup the video driver
video_driver = VideoDriver(frame, message_handler, data)
# setup the display
display = Display(tk, video_driver, message_handler, data)
# setup the actions
actions = Actions(tk, message_handler, data, video_driver, display)
numpad_input = NumpadInput(display, actions) numpad_input = NumpadInput(display, actions)
@@ -29,4 +39,4 @@ tk.attributes("-fullscreen", True)
try: try:
tk.mainloop() tk.mainloop()
except: except:
data_centre.set_message(traceback.print_tb(sys.exc_traceback, limit=1, file=sys.stdout)) message_handler.set_message(traceback.print_tb(sys.exc_traceback, limit=1, file=sys.stdout))

View File

@@ -1,59 +0,0 @@
import data_centre
class Actions(object):
def __init__(self, tk, video_driver, display):
self.tk = tk
self.video_driver = video_driver
self.display = display
def move_browser_selection_down(self):
self.display.move_browser_down()
def move_browser_selection_up(self):
self.display.move_browser_up()
def enter_on_browser_selection(self):
self.display.browser_enter()
def move_settings_selection_down(self):
self.display.move_settings_down()
def move_settings_selection_up(self):
self.display.move_settings_up()
def enter_on_settings_selection(self):
self.display.settings_enter()
@staticmethod
def clear_all_sampler_banks():
data_centre.clear_all_banks()
def quit_the_program(self):
if self.video_driver.has_omx:
self.video_driver.exit_all_players()
self.tk.destroy()
def load_this_bank_into_next_player(self, bank):
data_centre.update_next_bank_number(bank)
self.video_driver.next_player.reload()
def trigger_next_player(self):
self.video_driver.manual_next = True
def cycle_display_mode(self):
if self.display.display_mode == "BROWSER":
self.display.display_mode = "LOOPER"
elif self.display.display_mode == "LOOPER":
self.display.display_mode = "SETTINGS"
elif self.display.display_mode == "SETTINGS":
self.display.display_mode = "BROWSER"
def toggle_pause_on_player(self):
self.video_driver.current_player.toggle_pause()
def seek_forward_on_player(self):
self.video_driver.current_player.seek(30)
def seek_back_on_player(self):
self.video_driver.current_player.seek(-30)

View File

@@ -33,7 +33,7 @@ class NumpadInput(object):
def on_backspace_press(self, event): def on_backspace_press(self, event):
if self.display.display_mode == 'BROWSER': if self.display.display_mode == 'BROWSER':
self.actions.enter_on_browser_selection() self.actions.enter_on_browser_selection()
elif self.display.display_mode == 'LOOPER': elif self.display.display_mode == 'SAMPLER':
self.actions.toggle_pause_on_player() self.actions.toggle_pause_on_player()
elif self.display.display_mode == 'SETTINGS': elif self.display.display_mode == 'SETTINGS':
self.actions.enter_on_settings_selection() self.actions.enter_on_settings_selection()
@@ -42,7 +42,7 @@ class NumpadInput(object):
def on_minus_press(self): def on_minus_press(self):
if self.display.display_mode == 'BROWSER': if self.display.display_mode == 'BROWSER':
self.actions.move_browser_selection_up() self.actions.move_browser_selection_up()
elif self.display.display_mode == 'LOOPER': elif self.display.display_mode == 'SAMPLER':
self.actions.seek_back_on_player() self.actions.seek_back_on_player()
elif self.display.display_mode == 'SETTINGS': elif self.display.display_mode == 'SETTINGS':
self.actions.move_settings_selection_up() self.actions.move_settings_selection_up()
@@ -50,7 +50,7 @@ class NumpadInput(object):
def on_plus_press(self): def on_plus_press(self):
if self.display.display_mode == 'BROWSER': if self.display.display_mode == 'BROWSER':
self.actions.move_browser_selection_down() self.actions.move_browser_selection_down()
elif self.display.display_mode == 'LOOPER': elif self.display.display_mode == 'SAMPLER':
self.actions.seek_forward_on_player() self.actions.seek_forward_on_player()
elif self.display.display_mode == 'SETTINGS': elif self.display.display_mode == 'SETTINGS':
self.actions.move_settings_selection_down() self.actions.move_settings_selection_down()

View File

@@ -1,13 +1,13 @@
import data_centre
from video_centre.video_player import video_player, fake_video_player # <== for deving only from video_centre.video_player import video_player, fake_video_player # <== for deving only
class VideoDriver(object): class VideoDriver(object):
def __init__(self, root=None): def __init__(self, root, message_handler, data):
self.root = root self.root = root
self.message_handler = message_handler
self.data = data
self.delay = 5 self.delay = 5
self.has_omx = data_centre.has_omx self.has_omx = self.data.has_omx
if self.has_omx: if self.has_omx:
self.last_player = video_player(self.root, 'a.a') self.last_player = video_player(self.root, 'a.a')
self.current_player = video_player(self.root, 'b.b') self.current_player = video_player(self.root, 'b.b')
@@ -62,7 +62,7 @@ class VideoDriver(object):
else: else:
self.root.after(self.delay, self.wait_for_next_load) self.root.after(self.delay, self.wait_for_next_load)
def get_info_for_video_display(self): def get_info_for_player_display(self):
if self.has_omx: if self.has_omx:
return self.current_player.bank_number, self.current_player.status, self.next_player.bank_number, \ return self.current_player.bank_number, self.current_player.status, self.next_player.bank_number, \
self.next_player.status, self.current_player.get_position(), self.current_player.length, \ self.next_player.status, self.current_player.get_position(), self.current_player.length, \

View File

@@ -2,16 +2,17 @@ try:
from omxplayer.player import OMXPlayer from omxplayer.player import OMXPlayer
except: except:
pass pass
import data_centre
if data_centre.DEV_MODE == 'ON':
screen_size = '50,350,550,750'
else:
screen_size = '45,15,970,760' #'--blank'
class video_player: class video_player:
def __init__(self, root, name): def __init__(self, root, message_handler, data, name):
self.root = root self.root = root
self.player = None self.message_handler = message_handler
self.data = data
self.screen_size = self.set_screen_size()
self.omx_player = None
self.name = name self.name = name
self.omx_running = False self.omx_running = False
self.status = 'N/A' self.status = 'N/A'
@@ -27,10 +28,10 @@ class video_player:
self.get_context_for_player() self.get_context_for_player()
self.status = 'LOADING' self.status = 'LOADING'
self.player = OMXPlayer(self.location, args=self.arguments, dbus_name=self.name) self.omx_player = OMXPlayer(self.location, args=self.arguments, dbus_name=self.name)
self.omx_running = True self.omx_running = True
print('duration is: {}'.format(self.duration)) print('duration is: {}'.format(self.duration))
self.duration = self.player.duration() # <-- uneeded once self.duration stores float self.duration = self.omx_player.duration() # <-- uneeded once self.duration stores float
print('new duration is: {}'.format(self.duration)) print('new duration is: {}'.format(self.duration))
if(self.end is -1): if(self.end is -1):
self.end = self.duration self.end = self.duration
@@ -46,14 +47,14 @@ class video_player:
start_threshold = self.start - 0.05 start_threshold = self.start - 0.05
if(position > start_threshold): if(position > start_threshold):
self.status = 'LOADED' self.status = 'LOADED'
self.player.pause() self.omx_player.pause()
self.player.set_alpha(255) self.omx_player.set_alpha(255)
elif(self.omx_running): elif(self.omx_running):
self.root.after(5,self.pause_at_start) self.root.after(5,self.pause_at_start)
def play(self): def play(self):
self.status = 'PLAYING' self.status = 'PLAYING'
self.player.play() self.omx_player.play()
self.pause_at_end() self.pause_at_end()
def pause_at_end(self): def pause_at_end(self):
@@ -61,7 +62,7 @@ class video_player:
end_threshold = self.end - 0.2 end_threshold = self.end - 0.2
if(position > end_threshold): if(position > end_threshold):
self.status = 'FINISHED' self.status = 'FINISHED'
self.player.pause() self.omx_player.pause()
print('its paused at end!') print('its paused at end!')
elif(self.omx_running): elif(self.omx_running):
self.root.after(5,self.pause_at_end) self.root.after(5,self.pause_at_end)
@@ -79,7 +80,7 @@ class video_player:
def get_position(self): def get_position(self):
try: try:
return self.player.position() return self.omx_player.position()
except: except:
print('{}: error get_position'.format(self.name)) print('{}: error get_position'.format(self.name))
return -1 return -1
@@ -94,8 +95,8 @@ class video_player:
self.bank_number = next_context['bank_number'] self.bank_number = next_context['bank_number']
def toggle_pause(self): def toggle_pause(self):
self.player.play_pause() self.omx_player.play_pause()
self.status = self.player.playback_status().upper() self.status = self.omx_player.playback_status().upper()
def seek(self, amount): def seek(self, amount):
position = self.get_position() position = self.get_position()
@@ -107,16 +108,23 @@ class video_player:
data_centre.set_message('INFO', 'can not seek outside range') data_centre.set_message('INFO', 'can not seek outside range')
def set_position(self, position): def set_position(self, position):
self.player.set_position(position) self.omx_player.set_position(position)
def exit(self): def exit(self):
try: try:
self.player.quit() self.omx_player.quit()
self.status = 'N/A' self.status = 'N/A'
self.omx_running = False self.omx_running = False
except: except:
pass pass
def set_screen_size(self):
if self.data.DEV_MODE == 'ON':
return '50,350,550,750'
else:
return '45,15,970,760'
class fake_video_player: class fake_video_player:
def __init__(self): def __init__(self):
self.player = None self.player = None