diff --git a/application.cpp b/application.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..85579c2b9f28978bfb683c92aca8803c2b8796d2
--- /dev/null
+++ b/application.cpp
@@ -0,0 +1,72 @@
+#include "application.hpp"
+#include "widgets.hpp"
+
+using namespace genv;
+
+Application::Application() {}
+
+void Application::event_loop()
+{
+    event ev;
+    int focus=-1;
+    while(gin >> ev)
+    {
+        if (ev.type==ev_mouse)
+        {
+            if (ev.button==btn_left)
+            {
+                for (size_t i=0; i<widgets.size(); i++)
+                {
+                    if (widgets[i]->belul(ev.pos_x,ev.pos_y))
+                        {
+                            if (focus!=-1)
+                            {
+                                widgets[focus]->unfocus();
+                            }
+                            focus=i;
+                        }
+                }
+            }
+
+            /*else if (ev.button==btn_right)
+            {
+                if (focus!=-1)
+                {
+                    widgets[focus]->fajlba_ki("log.txt");
+                }
+            }*/
+
+            if (focus!=-1)
+            {
+                widgets[focus]->kezel(ev);
+            }
+        }
+
+        if (ev.type==ev_key)
+        {
+            if (focus!=-1)
+            {
+                widgets[focus]->kezel(ev);
+            }
+            if (ev.keycode==key_enter)
+            {
+                action("enter");
+            }
+            else if(ev.keycode==key_space)
+            {
+                action("space");
+            }
+
+        }
+        for (Widget* w : widgets)
+        {
+            w->rajzol();
+        }
+        gout << refresh;
+    }
+}
+
+void Application::widget_hozzaado(Widget* w)
+{
+    widgets.push_back(w);
+}
diff --git a/application.hpp b/application.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..dac48dd1ec83d9659b9ccac41d8327bf2ad8c5bc
--- /dev/null
+++ b/application.hpp
@@ -0,0 +1,23 @@
+#ifndef APPLICATION_HPP_INCLUDED
+#define APPLICATION_HPP_INCLUDED
+
+#include <vector>
+#include <string>
+
+class Widget;
+
+class Application
+{
+protected:
+    std::vector<Widget*> widgets;
+
+public:
+    Application();
+
+    virtual void event_loop();
+    virtual void widget_hozzaado(Widget*);
+
+    virtual void action(std::string) = 0;
+};
+
+#endif // APPLICATION_HPP_INCLUDED
diff --git a/checkbox.cpp b/checkbox.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9fbd27b1d0a72e68730fd70e5a78f9c92cd126ec
--- /dev/null
+++ b/checkbox.cpp
@@ -0,0 +1,40 @@
+#include "checkbox.hpp"
+
+using namespace genv;
+
+Checkbox::Checkbox(Application* parent, int x, int y, int szel, int mag):
+    Widget(parent,x,y,szel,mag)
+    {
+        _xelt=false;
+    }
+
+void Checkbox::rajzol()
+{
+    g0 color(black) << move_to(_x,_y) << box(_szel,_mag);
+
+    g0 color(light_purple);
+    g0 move_to(_x,_y)
+        << line(_szel,0)
+        << line(0,_mag)
+        << line(-_szel,0)
+        << line(0,-_mag);  //korvonal
+
+    if (_xelt)
+    {
+        g0 move_to(_x,_y) << line_to(_x+_szel,_y+_mag)
+            <<  move_to(_x,_y+_mag) << line_to(_x+_szel,_y);
+    }
+}
+
+void Checkbox::kezel(event ev)
+{
+    if (ev.type==ev_mouse && belul(ev.pos_x,ev.pos_y) && ev.button==btn_left)
+    {
+        _xelt = !_xelt;
+    }
+}
+
+bool Checkbox::xelt_e()
+{
+    return _xelt;
+}
diff --git a/checkbox.hpp b/checkbox.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..7da8dd42c885ed702f70df88a85f781d66204cb9
--- /dev/null
+++ b/checkbox.hpp
@@ -0,0 +1,17 @@
+#ifndef CHECKBOX_HPP_INCLUDED
+#define CHECKBOX_HPP_INCLUDED
+
+#include "widgets.hpp"
+
+class Checkbox : public Widget
+{
+protected:
+    bool _xelt;
+public:
+    Checkbox(Application*,int,int,int,int);
+    virtual void rajzol() override;
+    virtual void kezel(genv::event ev) override;
+    bool xelt_e();
+};
+
+#endif // CHECKBOX_HPP_INCLUDED
diff --git a/dropdown.cpp b/dropdown.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..29976d9217749a278f5dd914bca9303e600487df
--- /dev/null
+++ b/dropdown.cpp
@@ -0,0 +1,202 @@
+#include "dropdown.hpp"
+#include <iostream>
+#include <fstream>
+
+using namespace genv;
+using namespace std;
+
+Dropdown::Dropdown(Application* parent, int x, int y, int szel, int mag, int doboz_mag, vector<string> ertekek):
+    Widget(parent,x,y,szel,mag), _doboz_mag(doboz_mag), _ertekek(ertekek)
+    {
+        _doboz_mag_ertekado();
+        _honnan=0;
+        _doboz_db=_mag/_doboz_mag;
+        _futas_db=_futas_db_ertekado();
+        _csuszka_szel=10;
+        _csuszka_mag=_csuszka_mag_ertekado();
+        _ertek_index=-1;
+    }
+
+void Dropdown::_doboz_mag_ertekado()
+{
+    if (_doboz_mag < gout.cascent()+gout.cdescent())
+    {
+        _doboz_mag=gout.cascent()+gout.cdescent();
+    }
+    if (_mag%_doboz_mag != 0)
+    {
+        _mag-=_mag%_doboz_mag;
+    }
+}
+
+int Dropdown::_futas_db_ertekado()
+{
+    if (_doboz_db > _ertekek.size())
+    {
+        return _ertekek.size();
+    }
+    else
+    {
+        return _doboz_db;
+    }
+}
+
+int Dropdown::_csuszka_mag_ertekado()
+{
+    if (_doboz_db > _ertekek.size())
+    {
+        return _mag;
+    }
+    else
+    {
+        return _mag/_ertekek.size()*_doboz_db;
+    }
+}
+
+void Dropdown::rajzol()
+{
+    if (_kijelolt)
+    {
+        g0 color(light_purple);
+    }
+    else
+    {
+        g0 color(dark_purple);
+    }
+
+    g0 move_to(_x,_y)
+        << line(_szel,0)
+        << line(0,_mag)
+        << line(-_szel,0)
+        << line(0,-_mag);  // korvonal
+    g0 move_to(_x+_szel-_csuszka_szel, _y) << line(0,_mag);
+
+    int vonal_y=_y;
+    for(int i=0; i<_doboz_db-1; i++)
+    {
+        vonal_y+=_doboz_mag;
+        g0 move_to(_x,vonal_y) << line(_szel-_csuszka_szel,0);  // vizszintes vonalak
+    }
+
+    elemrajzolo();
+    csuszkarajzolo();
+}
+
+void Dropdown::elemrajzolo()
+{
+    for(int i=0; i<_futas_db; i++)
+    {
+        g0 color(black) << move_to(_x+1, _y+1+i*_doboz_mag) << box(_szel-_csuszka_szel-1,_doboz_mag-2);
+    }
+
+    kijelolesrajzolo();
+
+    if (_kijelolt)
+    {
+        g0 color(light_purple);
+    }
+    else
+    {
+        g0 color(dark_purple);
+    }
+
+    int doboz_index=0;
+    for(int i=_honnan; i<_futas_db+_honnan; i++)
+    {
+        g0 move_to(_x+5, _y + _doboz_mag/2+gout.cascent()/2 + doboz_index*_doboz_mag)
+            << text(_ertekek[i]);
+        doboz_index++;
+    }
+}
+
+void Dropdown::csuszkarajzolo()
+{
+    g0 color(black) << move_to(_x+_szel-_csuszka_szel+1,_y+1) << box(_csuszka_szel-2,_mag-2);
+
+    if (_kijelolt)
+    {
+        g0 color(light_purple);
+    }
+    else
+    {
+        g0 color(dark_purple);
+    }
+    g0 move_to(_x+_szel-_csuszka_szel, _y+_mag/_ertekek.size()*_honnan) << box(_csuszka_szel,_csuszka_mag);
+}
+
+void Dropdown::dobozkijelolo(int eger_x, int eger_y)
+{
+    int _kijelolt_doboz_szama=-1;
+
+    for(int i=0; i<_futas_db;i++)
+    {
+        if (eger_x>_x && eger_x<_x+_szel &&
+            eger_y>_y+i*_doboz_mag && eger_y<_y+i*_doboz_mag+_doboz_mag)
+        {
+            _kijelolt_doboz_szama=i+_honnan;
+        }
+    }
+
+    if (_kijelolt_doboz_szama!=-1)
+    {
+        _ertek_index=_kijelolt_doboz_szama;
+
+        cout << _ertekek[_ertek_index] << endl;
+    }
+}
+
+void Dropdown::kijelolesrajzolo()
+{
+    if (_ertek_index!=-1)
+    {
+        if ((_y+1 + _ertek_index*_doboz_mag - _honnan*_doboz_mag) > _y &&
+            (_y+1 + _ertek_index*_doboz_mag - _honnan*_doboz_mag) < _y+_mag)
+        {
+            g0 color(white)
+            << move_to(_x+1, _y+1 + _ertek_index*_doboz_mag - _honnan*_doboz_mag)
+            << box(_szel-1-_csuszka_szel,_doboz_mag-2);
+        }
+    }
+}
+
+void Dropdown::kezel(event ev)
+{
+    if (ev.type == ev_mouse)
+    {
+        if (ev.button==btn_left)
+        {
+            if (belul(ev.pos_x, ev.pos_y))
+            {
+                _kijelolt = !_kijelolt;
+                dobozkijelolo(ev.pos_x,ev.pos_y);
+
+            }
+            else if (!belul(ev.pos_x, ev.pos_y))
+            {
+                _kijelolt = false;
+            }
+        }
+
+        if (_ertekek.size()!=_futas_db)
+        {
+            if (ev.button==btn_wheelup && _honnan>0)
+            {
+                _honnan--;
+                cout << _honnan << endl;
+                elemrajzolo();
+            }
+            if (ev.button==btn_wheeldown && _honnan<_ertekek.size()-_doboz_db)
+            {
+                _honnan++;
+                cout << _honnan << endl;
+                elemrajzolo();
+            }
+        }
+    }
+}
+
+std::string Dropdown::get_ertek()
+{
+    return _ertekek[_ertek_index];
+}
+
diff --git a/dropdown.hpp b/dropdown.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..34fdf0f3c1bb9d1dd8cc7649cf9c5a695d373b0f
--- /dev/null
+++ b/dropdown.hpp
@@ -0,0 +1,34 @@
+#ifndef DROPDOWN_HPP_INCLUDED
+#define DROPDOWN_HPP_INCLUDED
+
+#include "graphics.hpp"
+#include "widgets.hpp"
+#include <vector>
+#include <string>
+
+class Dropdown : public Widget
+{
+protected:
+    std::vector<std::string> _ertekek;
+    int _doboz_mag, _doboz_db;
+    int _futas_db, _honnan;
+    int _csuszka_szel, _csuszka_mag;
+    int _ertek_index;
+
+    int _futas_db_ertekado();
+    int _csuszka_mag_ertekado();
+    void _doboz_mag_ertekado();
+
+public:
+    Dropdown(Application*, int x, int y, int szel, int mag, int doboz_mag, std::vector<std::string> ertekek);
+    virtual void rajzol() override;
+    virtual void kezel(genv::event ev) override;
+
+    virtual void dobozkijelolo(int,int);
+    virtual void kijelolesrajzolo();
+    virtual void elemrajzolo();
+    virtual void csuszkarajzolo();
+    std::string get_ertek();
+};
+
+#endif // DROPDOWN_HPP_INCLUDED
diff --git a/fajl_beolvas.cpp b/fajl_beolvas.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7791f5974fd41f5caa839ecbba0881c80e13526c
--- /dev/null
+++ b/fajl_beolvas.cpp
@@ -0,0 +1,18 @@
+#include "fajl_beolvas.hpp"
+
+std::vector<std::vector<int>> fajl_beolvas(std::ifstream& fajlnev)
+{
+    std::vector<std::vector<int>> teljes;
+    for (int i=0; i<9; i++)
+    {
+        std::vector<int> sor;
+        for (int j=0; i<9; i++)
+        {
+            int szam;
+            fajlnev >> szam;
+            sor.pushback(szam);
+        }
+        teljes.push_back(sor)
+    }
+    return teljes;
+}
diff --git a/fajl_beolvas.hpp b/fajl_beolvas.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..f1512cfb0f7046ecce667f0ddf65a14d8c11b9c6
--- /dev/null
+++ b/fajl_beolvas.hpp
@@ -0,0 +1,12 @@
+#ifndef FAJL_BEOLVAS_HPP_INCLUDED
+#define FAJL_BEOLVAS_HPP_INCLUDED
+
+#include <vector>
+#include <fstream>
+
+std::vector<std::vector<int>> fajl_beolvas(std::ifstream& fajlnev)
+{
+
+}
+
+#endif // FAJL_BEOLVAS_HPP_INCLUDED
diff --git a/multiline.cpp b/multiline.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..42d21c259c4d877509a2a998d5ecaba0d2867c96
--- /dev/null
+++ b/multiline.cpp
@@ -0,0 +1,79 @@
+#include "multiline.hpp"
+
+#include <fstream>
+
+using namespace genv;
+
+Multiline::Multiline(Application* parent, int x, int y, int szel, int mag, std::string filenev):
+    Widget(parent,x,y,szel,mag), _elso(0)
+    {
+        std::ifstream file(filenev);
+
+        while (file.good())
+        {
+            std::string sor;
+            getline(file,sor) >> std::ws;
+
+            _sorok.push_back(sor);
+        }
+
+        file.close();
+    }
+
+void Multiline::rajzol()
+{
+    //gout.load_font("LiberationsSans-Regular.ttf",10);
+
+    if (_kijelolt)
+        g0 color(light_purple);
+    else
+        g0 color(dark_purple);
+
+    g0 move_to(_x,_y)
+        << line(_szel,0)
+        << line(0,_mag)
+        << line(-_szel,0)
+        << line(0,-_mag);
+
+    int height = gout.cascent()+gout.cdescent()+5;
+
+    for(int i=_elso; i<_sorok.size(); i++)
+    {
+        g0 move_to(_x + 5, _y + 5 + (i-_elso)*height)
+            << text(_sorok[i]);
+    }
+}
+
+void Multiline::kezel(event ev)
+{
+    if (ev.type == ev_mouse)
+    {
+        if (ev.button == btn_wheelup)
+            fel();
+        else if (ev.button == btn_wheeldown)
+            le();
+    }
+
+    if (ev.type==ev_mouse && ev.button==btn_left)
+    {
+        if(belul(ev.pos_x, ev.pos_y))
+        {
+            _kijelolt = !_kijelolt;
+        }
+        else if (!belul(ev.pos_x, ev.pos_y))
+        {
+            _kijelolt = false;
+        }
+    }
+}
+
+void Multiline::fel()
+{
+    if (_elso > 0)
+        _elso--;
+}
+
+void Multiline::le()
+{
+    _elso++;
+}
diff --git a/multiline.hpp b/multiline.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..95040670349edbcf50b03332b17f68ee55f37953
--- /dev/null
+++ b/multiline.hpp
@@ -0,0 +1,22 @@
+#ifndef MULTILINE_HPP_INCLUDED
+#define MULTILINE_HPP_INCLUDED
+
+#include "widgets.hpp"
+
+class Multiline : public Widget
+{
+protected:
+    std::vector<std::string> _sorok;
+    int _elso;
+
+public:
+    Multiline(Application*,int,int,int,int, std::string);
+
+    void rajzol() override;
+    void kezel(genv::event) override;
+
+    void fel();
+    void le();
+};
+
+#endif // MULTILINE_HPP_INCLUDED
diff --git a/palya.cpp b/palya.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e3b1c425b8977a86c6690605a4dec323bdd13f27
--- /dev/null
+++ b/palya.cpp
@@ -0,0 +1,65 @@
+#include "palya.hpp"
+
+using namespace genv;
+using namespace std;
+
+Palya::Palya(Application* parent,int x,int y,int meret,
+             std::string mo, std::string fe):
+                 Widget(parent,x,y,meret,meret), _fajl_megoldas(mo), _fajl_feladat(fe)
+{
+    _megoldas = fajl_beolvas(_fajl_megoldas);
+    _feladat = fajl_beolvas(_fajl_feladat);
+    _mentes = _feladat;
+    _fajl_mentes = "mentes.txt"
+}
+
+void Palya::rajzol()
+{
+    g0 color(bg_color) << move_to(_x,_y) << box(_szel,_mag);
+
+    g0 color(dark_purple);
+    for (int i=1; i<9; i++)
+    {
+        g0 move_to(_x+i*(_szel/9),_y) << line(0,_mag);
+        if (i%3==0)
+        {
+            g0 move_to(_x+i*(_szel/9)-1,_y) << line(0,_mag);
+            g0 move_to(_x+i*(_szel/9)+1,_y) << line(0,_mag);
+        }
+    }
+    for (int i=1; i<9; i++)
+    {
+        g0 move_to(_x,_y+i*(_mag/9)) << line(_szel,0);
+        if (i%3==0)
+        {
+            g0 move_to(_x,_y+i*(_mag/9)-1) << line(_szel,0);
+            g0 move_to(_x,_y+i*(_mag/9)+1) << line(_szel,0);
+        }
+    }
+
+}
+
+void Palya::kezel(event ev)
+{
+
+}
+
+std::vector<std::vector<int>> Palya::fajl_beolvas(std::string fajlnev)
+{
+    ifstream& fajl(fajlnev);
+
+    std::vector<std::vector<int>> teljes;
+    for (int i=0; i<9; i++)
+    {
+        std::vector<int> sor;
+        for (int j=0; i<9; i++)
+        {
+            int szam;
+            fajl >> szam;
+            sor.push_back(szam);
+        }
+        teljes.push_back(sor);
+    }
+    return teljes;
+}
+
diff --git a/palya.hpp b/palya.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..a0a4a7d1154f50c472fbb1c6c4453eb29767d44c
--- /dev/null
+++ b/palya.hpp
@@ -0,0 +1,29 @@
+#ifndef PALYA_HPP_INCLUDED
+#define PALYA_HPP_INCLUDED
+
+#include "widgets.hpp"
+#include <vector>
+#include <fstream>
+#include <iostream>
+
+#define bg_color 246,232,255
+
+class Palya : public Widget
+{
+protected:
+    std::string _fajl_megoldas, _fajl_feladat, _fajl_mentes;
+    std::vector<std::vector<int>> _megoldas;
+    std::vector<std::vector<int>> _feladat;
+    std::vector<std::vector<int>> _mentes;
+
+public:
+    Palya(Application* parent,int x,int y,int meret,
+          std::vector<std::vector<int>> mo, std::vector<std::vector<int>> fe);
+    virtual void rajzol() override;
+    virtual void kezel(genv::event) override;
+
+    std::vector<std::vector<int>> fajl_beolvas(std::ifstream& fajlnev);
+};
+
+
+#endif // PALYA_HPP_INCLUDED
diff --git a/spinbox.cpp b/spinbox.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e3555612fdb1abc7770c85d976f63e14559e50d1
--- /dev/null
+++ b/spinbox.cpp
@@ -0,0 +1,120 @@
+#include "spinbox.hpp"
+#include <iostream>
+#include <fstream>
+#define g0 gout<<
+using namespace genv;
+using namespace std;
+
+Spinbox::Spinbox(Application* parent,int x, int y, int szel, int mag, int min_ertek, int max_ertek):
+    Widget(parent,x,y,szel,mag), _min(min_ertek), _max(max_ertek)
+{
+    _ertek=_min;
+
+    _alsogomb_y = _y+_mag/2;
+    _gomb_x = _x+_szel-_mag/2;
+    _gomb_meret = _mag/2;
+}
+
+void Spinbox::rajzol()
+{
+    if (_kijelolt)
+        g0 color(light_purple);
+    else
+        g0 color(dark_purple);
+
+    g0 move_to(_x,_y)
+        << line(_szel,0)
+        << line(0,_mag)
+        << line(-_szel,0)
+        << line(0,-_mag);   // doboz
+    g0 move_to(_gomb_x,_y) << line(0,_mag);  // fuggoleges vonal
+    g0 move_to(_gomb_x,_alsogomb_y) << line(_gomb_meret,0);  // gombok k�zti v�zszintes vonal
+
+    g0 move_to(_gomb_x+_gomb_meret/4, _alsogomb_y-_gomb_meret/4)
+        << line(_gomb_meret/4,-_gomb_meret/2)
+        << line(_gomb_meret/4,_gomb_meret/2);  // felfele nyil
+
+    g0 move_to(_gomb_x+_gomb_meret/4, _alsogomb_y+_gomb_meret/4)
+        << line(_gomb_meret/4,_gomb_meret/2)
+        << line(_gomb_meret/4,-_gomb_meret/2);  // lefele nyil
+
+    g0 move_to(_x+5,_y+_mag/2+gout.cascent()/2)
+        << text(to_string(_ertek));  // ertekkiiras
+}
+
+void Spinbox::szamnovelo(int mennyivel)
+{
+    if (_ertek+mennyivel <= _max)
+    {
+        _ertek+=mennyivel;
+        cout << _ertek << endl;
+        g0 color(black) << move_to(_x+1,_y+1) << box(_szel-2,_mag-2);
+    }
+}
+
+void Spinbox::szamcsokkento(int mennyivel)
+{
+    if (_ertek-mennyivel >= _min)
+    {
+        _ertek-=mennyivel;
+        cout << _ertek << endl;
+        g0 color(black) << move_to(_x+1,_y+1) << box(_szel-2,_mag-2);
+    }
+}
+
+void Spinbox::kezel(event ev)
+{
+    if (ev.type == ev_mouse && ev.button==btn_left)
+    {
+        if (belul(ev.pos_x, ev.pos_y))
+        {
+            _kijelolt = !_kijelolt;
+
+            if (ev.pos_x>_gomb_x && ev.pos_x<_x+_szel &&
+                ev.pos_y>_y && ev.pos_y<_alsogomb_y)
+            {
+                szamnovelo(1);
+                _kijelolt=true;
+            }
+            else if (ev.pos_x>_gomb_x && ev.pos_x<_x+_szel &&
+                ev.pos_y>_alsogomb_y && ev.pos_y<_y+_mag)
+            {
+                szamcsokkento(1);
+                _kijelolt=true;
+            }
+        }
+        else if (!belul(ev.pos_x, ev.pos_y))
+        {
+            _kijelolt = false;
+        }
+
+    }
+
+    if (ev.type == ev_key && _kijelolt)
+    {
+
+        if (ev.keycode==key_up)
+        {
+            szamnovelo(1);
+        }
+        if (ev.keycode==key_pgup)
+        {
+            szamnovelo(10);
+        }
+        if (ev.keycode==key_down)
+        {
+            szamcsokkento(1);
+        }
+        if (ev.keycode==key_pgdn)
+        {
+            szamcsokkento(10);
+        }
+    }
+
+}
+
+int Spinbox::get_ertek()
+{
+    return _ertek;
+}
+
diff --git a/spinbox.hpp b/spinbox.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..a72b5abe418997e01eb615a3cc20c67b71f36133
--- /dev/null
+++ b/spinbox.hpp
@@ -0,0 +1,23 @@
+#ifndef SPINBOX_HPP_INCLUDED
+#define SPINBOX_HPP_INCLUDED
+
+#include "graphics.hpp"
+#include "widgets.hpp"
+
+class Spinbox : public Widget
+{
+protected:
+    int _ertek, _min, _max;
+    int _alsogomb_y, _gomb_x, _gomb_meret;
+
+public:
+    Spinbox(Application*, int x, int y, int szel, int mag, int min_ertek, int max_ertek);
+    virtual void rajzol() override;
+    virtual void kezel(genv::event ev) override;
+
+    virtual void szamnovelo(int mennyivel);
+    virtual void szamcsokkento(int mennyivel);
+    int get_ertek();
+};
+
+#endif // SPINBOX_HPP_INCLUDED
diff --git a/statictext.cpp b/statictext.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2cb0c328956e1faa2b97fec1a301b149b362d636
--- /dev/null
+++ b/statictext.cpp
@@ -0,0 +1,33 @@
+#include "statictext.hpp"
+#include <string>
+#define g0 gout<<
+
+using namespace genv;
+using namespace std;
+
+Statictext::Statictext(Application* parent, int x, int y, int szel, int mag, std::string szoveg):
+    Widget(parent,x,y,szel,mag), _szoveg(szoveg)
+{
+    _kijelolt=false;
+}
+
+void Statictext::rajzol()
+{
+    if (_kijelolt)
+        g0 color(light_purple);
+    else
+        g0 color(dark_purple);
+
+    g0 move_to(_x,_y)
+        << line(_szel,0)
+        << line(0,_mag)
+        << line(-_szel,0)
+        << line(0,-_mag);
+
+    g0 move_to(_x+5,_y+_mag/2+gout.cascent()/2)
+        << text(_szoveg);
+}
+
+void Statictext::kezel(event ev)
+{
+}
diff --git a/statictext.hpp b/statictext.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..66dcc1b43d7456c8f018494b37803b46e55a5684
--- /dev/null
+++ b/statictext.hpp
@@ -0,0 +1,18 @@
+#ifndef STATICTEXT_HPP_INCLUDED
+#define STATICTEXT_HPP_INCLUDED
+
+#include "graphics.hpp"
+#include "widgets.hpp"
+
+class Statictext : public Widget
+{
+protected:
+    std::string _szoveg;
+
+public:
+    Statictext(Application*, int, int, int, int, std::string);
+    virtual void rajzol() override;
+    virtual void kezel(genv::event ev) override;
+};
+
+#endif // STATICTEXT_HPP_INCLUDED
diff --git a/textedit.cpp b/textedit.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6e4f38d62dbaf7808f2b4506a3fe519b5e6cf2f7
--- /dev/null
+++ b/textedit.cpp
@@ -0,0 +1,63 @@
+#include "textedit.hpp"
+
+using namespace genv;
+using namespace std;
+
+Textedit::Textedit(Application* parent, int x, int y, int szel, int mag, std::string szoveg): Widget(parent,x,y,szel,mag), _szoveg(szoveg)
+{
+}
+
+void Textedit::rajzol()
+{
+    g0 color(black) << move_to(_x,_y) << box(_szel,_mag);
+
+    if (_kijelolt)
+    {
+        g0 color(light_purple);
+    }
+    else
+    {
+        g0 color(dark_purple);
+    }
+
+    g0 move_to(_x,_y)
+        << line(_szel,0)
+        << line(0,_mag)
+        << line(-_szel,0)
+        << line(0,-_mag);  // korvonal
+    g0 move_to(_x+5,_y+gout.cascent()) << text(_szoveg);
+}
+
+void Textedit::kezel(event ev)
+{
+    if (ev.type == ev_key && _kijelolt)
+    {
+        if (ev.keycode == key_backspace)
+        {
+            _szoveg = utf8_remove_last(_szoveg);
+        }
+        else
+        {
+            if (gout.twidth(_szoveg + ev.keyutf8) < _szel-10)
+            {
+                _szoveg += ev.keyutf8;
+            }
+        }
+    }
+    if (ev.type==ev_mouse && ev.button==btn_left)
+    {
+        if(belul(ev.pos_x, ev.pos_y))
+        {
+            _kijelolt = !_kijelolt;
+        }
+        else if (!belul(ev.pos_x, ev.pos_y))
+        {
+            _kijelolt = false;
+        }
+    }
+}
+
+std::string Textedit::get_szoveg()
+{
+    return _szoveg;
+}
diff --git a/textedit.hpp b/textedit.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..e27c3f05dd56fbffb887198ef57fa1ffd272648d
--- /dev/null
+++ b/textedit.hpp
@@ -0,0 +1,20 @@
+#ifndef TEXTEDIT_HPP_INCLUDED
+#define TEXTEDIT_HPP_INCLUDED
+
+#include "widgets.hpp"
+
+class Textedit : public Widget
+{
+protected:
+    std::string _szoveg;
+
+public:
+    Textedit(Application*, int, int ,int ,int , std::string);
+    virtual void rajzol() override;
+    virtual void kezel(genv::event) override;
+    std::string get_szoveg();
+
+};
+
+
+#endif // TEXTEDIT_HPP_INCLUDED
diff --git a/widgets.cpp b/widgets.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c8ecefba82fd069465a109e3daec4203cb9e6a24
--- /dev/null
+++ b/widgets.cpp
@@ -0,0 +1,28 @@
+#include "graphics.hpp"
+#include "widgets.hpp"
+
+
+
+using namespace genv;
+
+Widget::Widget(Application* parent, int x, int y, int szel, int mag):
+    _parent(parent),_x(x), _y(y), _szel(szel), _mag(mag)
+{
+    _kijelolt=false;
+    _parent->widget_hozzaado(this);
+}
+
+bool Widget::belul(int eger_x, int eger_y)
+{
+    if (eger_x>_x && eger_x<_x+_szel &&
+        eger_y>_y && eger_y<_y+_mag)
+        return true;
+    else
+        return false;
+}
+
+void Widget::unfocus()
+{
+    _kijelolt=false;
+}
+
diff --git a/widgets.hpp b/widgets.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..668de3e83e94215c2a7f215b2a6333acc5ab6078
--- /dev/null
+++ b/widgets.hpp
@@ -0,0 +1,29 @@
+#ifndef WIDGETS_HPP_INCLUDED
+#define WIDGETS_HPP_INCLUDED
+
+#include "graphics.hpp"
+#include "application.hpp"
+
+#define g0 gout<<
+#define dark_purple 130,37,184
+#define light_purple 210,145,255
+#define white 255,255,255
+#define black 0,0,0
+
+class Widget
+{
+protected:
+    int _x, _y, _szel, _mag;
+    Application* _parent;
+    bool _kijelolt;
+
+public:
+    Widget(Application*, int x, int y, int szel, int mag);
+    virtual bool belul(int eger_x, int eger_y);
+    virtual void unfocus();
+
+    virtual void rajzol() = 0;
+    virtual void kezel(genv::event ev) = 0;
+};
+
+#endif // WIDGETS_HPP_INCLUDED