#ifndef GROUP_H_INCLUDED
#define GROUP_H_INCLUDED

class group;
#include "application.h"
#include "widget.h"
#include <functional>
#include <vector>

/// ----------------------------------------- Csoport egy tagja -----------------------------------------------
struct member
{
    widget* memberWidget;
    // Ezeket a függvényeket hajtaná végre, de mi szeretnénk, ha nem csak ezeket hajtaná végre.
    std::function<void(int, int, char, widget*)> eventClick;
    std::function<void(int, widget*)> eventKeyPress;

    /// ---- Konstruktor ----
    member (const widget &_memberWidget);
};

/// ----------------------------------------------- Csoport ----------------------------------------------------
class group
{
private:
    void eventClickForward (int x, int y, char button, widget*);
    void eventKeyPressForward (int keyCode, widget*);
    void eventChangedForward(widget* me);
    application *app;

public:
    /// ---- Mezők ----
    bool visible;
    std::vector<member*> members;

    /// ---- Csoportok közös eseményei ----
    std::function<void(int, int, char, int)> eventGroupClick;
    std::function<void(int, int)> eventGroupKeyPress;
    std::function<void(int)> eventGroupChanged;

    /// ---- Konstruktor, Destruktor ----
    group(application *_app);
    virtual ~group();

    /// ---- Bővítés ----
    void add(widget *newMember);

    widget& operator[] (int index);
};

group& operator<< (group &G, widget *newMember);

void eventChangedForward(group *myGroup, int newValueInt, std::string newValueStr, bool newValueBool, widget*);

#endif // GROUP_H_INCLUDED
