* 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);
 | 
						|
};
 |