 79920a3522
			
		
	
	
		79920a3522
		
			
		
	
	
	
	
		
			
			* File browser module and test app * nfc: Add support for saved files in subdirectories * nfc: Use helper function to get shadow path when loading data * File browser dialog integration pt.1 * File browser dialog integration pt.2 * Gui,Dialogs: drop file select * Correct use of dynamic string_t(string_ptr) Co-authored-by: Yukai Li <yukaili.geek@gmail.com> Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
		
			
				
	
	
		
			190 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
|   * @file infrared_app_remote_manager.h
 | |
|   * Infrared: Remote manager class.
 | |
|   * It holds remote, can load/save/rename remote,
 | |
|   * add/remove/rename buttons.
 | |
|   */
 | |
| #pragma once
 | |
| 
 | |
| #include "infrared_app_signal.h"
 | |
| 
 | |
| #include "m-string.h"
 | |
| #include <infrared_worker.h>
 | |
| #include <infrared.h>
 | |
| 
 | |
| #include <cstdint>
 | |
| #include <string>
 | |
| #include <memory>
 | |
| #include <vector>
 | |
| 
 | |
| /** Class to handle remote button */
 | |
| class InfraredAppRemoteButton {
 | |
|     /** Allow field access */
 | |
|     friend class InfraredAppRemoteManager;
 | |
|     /** Name of signal */
 | |
|     std::string name;
 | |
|     /** Signal data */
 | |
|     InfraredAppSignal signal;
 | |
| 
 | |
| public:
 | |
|     /** Initialize remote button
 | |
|      *
 | |
|      * @param name - button name
 | |
|      * @param signal - signal to copy for remote button
 | |
|      */
 | |
|     InfraredAppRemoteButton(const char* name, const InfraredAppSignal& signal)
 | |
|         : name(name)
 | |
|         , signal(signal) {
 | |
|     }
 | |
| 
 | |
|     /** Initialize remote button
 | |
|      *
 | |
|      * @param name - button name
 | |
|      * @param signal - signal to move for remote button
 | |
|      */
 | |
|     InfraredAppRemoteButton(const char* name, InfraredAppSignal&& signal)
 | |
|         : name(name)
 | |
|         , signal(std::move(signal)) {
 | |
|     }
 | |
| 
 | |
|     /** Deinitialize remote button */
 | |
|     ~InfraredAppRemoteButton() {
 | |
|     }
 | |
| };
 | |
| 
 | |
| /** Class to handle remote */
 | |
| class InfraredAppRemote {
 | |
|     /** Allow field access */
 | |
|     friend class InfraredAppRemoteManager;
 | |
|     /** Button container */
 | |
|     std::vector<InfraredAppRemoteButton> buttons;
 | |
|     /** Name of remote */
 | |
|     std::string name;
 | |
|     /** Path to remote file */
 | |
|     string_t path;
 | |
| 
 | |
| public:
 | |
|     /** Initialize new remote
 | |
|      * 
 | |
|      * @param path - remote file path
 | |
|      */
 | |
|     InfraredAppRemote(string_t file_path) {
 | |
|         string_init_set(path, file_path);
 | |
|     }
 | |
| 
 | |
|     ~InfraredAppRemote() {
 | |
|         string_clear(path);
 | |
|     }
 | |
| };
 | |
| 
 | |
| /** Class to handle remote manager */
 | |
| class InfraredAppRemoteManager {
 | |
|     /** Remote instance. There can be 1 remote loaded at a time. */
 | |
|     std::unique_ptr<InfraredAppRemote> remote;
 | |
| 
 | |
| public:
 | |
|     /** Restriction to button name length. Buttons larger are ignored. */
 | |
|     static constexpr const uint32_t max_button_name_length = 22;
 | |
| 
 | |
|     /** Restriction to remote name length. Remotes larger are ignored. */
 | |
|     static constexpr const uint32_t max_remote_name_length = 22;
 | |
| 
 | |
|     /** Construct button from signal, and create remote
 | |
|      *
 | |
|      * @param button_name - name of button to create
 | |
|      * @param signal - signal to create button from
 | |
|      * @retval true for success, false otherwise
 | |
|      * */
 | |
|     bool add_remote_with_button(const char* button_name, const InfraredAppSignal& signal);
 | |
| 
 | |
|     /** Add button to current remote
 | |
|      *
 | |
|      * @param button_name - name of button to create
 | |
|      * @param signal - signal to create button from
 | |
|      * @retval true for success, false otherwise
 | |
|      * */
 | |
|     bool add_button(const char* button_name, const InfraredAppSignal& signal);
 | |
| 
 | |
|     /** Rename button in current remote
 | |
|      *
 | |
|      * @param index - index of button to rename
 | |
|      * @param str - new button name
 | |
|      */
 | |
|     bool rename_button(uint32_t index, const char* str);
 | |
| 
 | |
|     /** Rename current remote
 | |
|      *
 | |
|      * @param str - new remote name
 | |
|      */
 | |
|     bool rename_remote(const char* str);
 | |
| 
 | |
|     /** Find vacant remote name. If suggested name is occupied,
 | |
|      * incremented digit(2,3,4,etc) added to name and check repeated.
 | |
|      *
 | |
|      * @param name - suggested remote name
 | |
|      * @param path - remote file path
 | |
|      */
 | |
|     void find_vacant_remote_name(string_t name, string_t path);
 | |
| 
 | |
|     /** Get button list
 | |
|      *
 | |
|      * @retval container of button names
 | |
|      */
 | |
|     std::vector<std::string> get_button_list() const;
 | |
| 
 | |
|     /** Get button name by index
 | |
|      *
 | |
|      * @param index - index of button to get name from
 | |
|      * @retval button name
 | |
|      */
 | |
|     std::string get_button_name(uint32_t index);
 | |
| 
 | |
|     /** Get remote name
 | |
|      *
 | |
|      * @retval remote name
 | |
|      */
 | |
|     std::string get_remote_name();
 | |
| 
 | |
|     /** Get number of buttons
 | |
|      *
 | |
|      * @retval number of buttons
 | |
|      */
 | |
|     size_t get_number_of_buttons();
 | |
| 
 | |
|     /** Get button's signal
 | |
|      *
 | |
|      * @param index - index of interested button
 | |
|      * @retval signal
 | |
|      */
 | |
|     const InfraredAppSignal& get_button_data(size_t index) const;
 | |
| 
 | |
|     /** Delete button
 | |
|      *
 | |
|      * @param index - index of interested button
 | |
|      * @retval true if success, false otherwise
 | |
|      */
 | |
|     bool delete_button(uint32_t index);
 | |
| 
 | |
|     /** Delete remote
 | |
|      *
 | |
|      * @retval true if success, false otherwise
 | |
|      */
 | |
|     bool delete_remote();
 | |
| 
 | |
|     /** Clean all loaded info in current remote */
 | |
|     void reset_remote();
 | |
| 
 | |
|     /** Store current remote data on disk
 | |
|      *
 | |
|      * @retval true if success, false otherwise
 | |
|      */
 | |
|     bool store();
 | |
| 
 | |
|     /** Load data from disk into current remote
 | |
|      *
 | |
|      * @param path - path to remote file
 | |
|      * @retval true if success, false otherwise
 | |
|      */
 | |
|     bool load(string_t path);
 | |
| };
 |