and here is solution for vector<GtkWidget*>
I have two solutions and do not know which is better
1:
#include <gtk/gtk.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <vector>
using namespace std;
void CloseApp (GtkWidget* wid, GtkWidget* data) {
vector<GtkWidget*> *vektorRadioButtonuPtr = (vector<GtkWidget*>*) g_object_get_data(G_OBJECT(data),"vektorRadioButtonu");
delete vektorRadioButtonuPtr;
g_object_unref(G_OBJECT(wid));
}
void What (GtkWidget* wid, GtkWidget* data) {
cout << "what"<< endl;
vector<GtkWidget*> *vektorRadioButtonuPtr = (vector<GtkWidget*>*) g_object_get_data(G_OBJECT(data),"vektorRadioButtonu");
GtkWidget *testovanyRadioBtn = nullptr;
for (unsigned int i = 0; i < vektorRadioButtonuPtr->size(); ++i) {
testovanyRadioBtn = vektorRadioButtonuPtr->at(i);
if (gtk_check_button_get_active(GTK_CHECK_BUTTON(testovanyRadioBtn))) {
cout << "activated button found: " << gtk_check_button_get_label (GTK_CHECK_BUTTON(testovanyRadioBtn)) << endl;
return;
}
}
cout << "no button selected" << endl;
}
static void appActivate (GApplication *app, gpointer user_data)
{
GtkWidget *win = gtk_application_window_new (GTK_APPLICATION (app));
GtkWidget *vBox = gtk_box_new (GTK_ORIENTATION_VERTICAL,10);
gtk_window_set_child (GTK_WINDOW (win), vBox);
vector<GtkWidget *> *vektorRadioButtonuPtr = new std::vector<GtkWidget *>() ;
GtkWidget *radioBtn;
string text;
GtkWidget* skupina = NULL;
for (int i = 0; i < 10; ++i)
{
text = "btn " + to_string(i);
radioBtn = gtk_check_button_new_with_label(text.c_str());
if (skupina == NULL)
{
skupina = radioBtn;
}
else
{
gtk_check_button_set_group (GTK_CHECK_BUTTON (radioBtn), GTK_CHECK_BUTTON (skupina));
}
gtk_box_append (GTK_BOX (vBox), radioBtn);
vektorRadioButtonuPtr->push_back(radioBtn);
}
GtkWidget *tlac = gtk_button_new_with_mnemonic("what is selected");
gtk_box_append (GTK_BOX (vBox), tlac);
g_object_set_data(G_OBJECT(tlac),"vektorRadioButtonu",vektorRadioButtonuPtr);
g_signal_connect_swapped(GTK_BUTTON(tlac), "clicked", G_CALLBACK(What), tlac);
GtkWidget *btnBack = gtk_button_new_with_label("Close");
gtk_box_append (GTK_BOX (vBox), btnBack);
g_object_set_data(G_OBJECT(win),"vektorRadioButtonu",vektorRadioButtonuPtr);
g_signal_connect_swapped(GTK_BUTTON(btnBack), "clicked", G_CALLBACK(CloseApp), win);
gtk_widget_show (win);
}
int main(int argc, char **argv)
{
GtkApplication *app;
app = gtk_application_new ("testing.app", G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "activate", G_CALLBACK (appActivate), NULL);
return g_application_run (G_APPLICATION (app), NULL, NULL);
g_object_unref (app);
return 0;
}
2:
#include <gtk/gtk.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <vector>
using namespace std;
class RadioButtonGroup
{
private:
vector<GtkWidget*> vektorRadioButtonu;
public:
void appendRadioBtn(GtkWidget* radio)
{
vektorRadioButtonu.push_back(radio);
}
string getSelectedText()
{
GtkWidget* testovanyRadioBtn;
for (unsigned int cnt = 0; cnt < vektorRadioButtonu.size(); ++cnt )
{
testovanyRadioBtn = vektorRadioButtonu.at(cnt);
if (gtk_check_button_get_active(GTK_CHECK_BUTTON(testovanyRadioBtn)))
{
return gtk_check_button_get_label(GTK_CHECK_BUTTON(testovanyRadioBtn));
}
}
return "";
}
};
RadioButtonGroup mojeSkupinaRBtns;
void CloseApp (GtkWidget* wid, GtkWidget* data) {
g_object_unref(G_OBJECT(wid));
}
void What (GtkWidget* wid, GtkWidget* data) {
cout << "what"<< endl;
cout << "selected: " << mojeSkupinaRBtns.getSelectedText() << endl;
}
static void appActivate (GApplication *app, gpointer user_data)
{
GtkWidget *win = gtk_application_window_new (GTK_APPLICATION (app));
GtkWidget *vBox = gtk_box_new (GTK_ORIENTATION_VERTICAL,10);
gtk_window_set_child (GTK_WINDOW (win), vBox);
GtkWidget *radioBtn;
string text;
GtkWidget* skupina = NULL;
for (int i = 0; i < 10; ++i)
{
text = "btn " + to_string(i);
radioBtn = gtk_check_button_new_with_label(text.c_str());
if (skupina == NULL)
{
skupina = radioBtn;
}
else
{
gtk_check_button_set_group (GTK_CHECK_BUTTON (radioBtn), GTK_CHECK_BUTTON (skupina));
}
gtk_box_append (GTK_BOX (vBox), radioBtn);
mojeSkupinaRBtns.appendRadioBtn(radioBtn);
}
GtkWidget *tlac = gtk_button_new_with_mnemonic("what is selected");
gtk_box_append (GTK_BOX (vBox), tlac);
g_signal_connect_swapped(GTK_BUTTON(tlac), "clicked", G_CALLBACK(What), tlac);
GtkWidget *btnBack = gtk_button_new_with_label("Close");
gtk_box_append (GTK_BOX (vBox), btnBack);
g_signal_connect_swapped(GTK_BUTTON(btnBack), "clicked", G_CALLBACK(CloseApp), win);
gtk_widget_show (win);
}
int main(int argc, char **argv)
{
GtkApplication *app;
app = gtk_application_new ("testing.app", G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "activate", G_CALLBACK (appActivate), NULL);
return g_application_run (G_APPLICATION (app), NULL, NULL);
g_object_unref (app);
return 0;
}