Re: changing the content of a model/view/store at run time

pcr <[email protected]>
Newsgroups gmane.comp.gnome.gtkmm
Message-ID <[email protected]>
A grand "Thank you" to Daniel Boles and Phil Wolff for their help.  I 
had been mixing up gtk and gtkmm documentation!  I am attaching the 
complete now working code for anyone interested.

On 8/10/19 10:04 AM, Phil Wolff via gtkmm-list wrote:
> As indicated by the error message, liststore1 is a RefPtr to a 
> ListStore model, which is a C++ entity that
>
>     1) cannot be used as an argument to a gtk+ function, and
>
>     2) cannot be dereferenced with the * operator.
>
> At a more fundamental level, this approach is unnecessarily 
> complicated. The entire contents of the function can be replace with a 
> single statement:
>
>     liststore1->clear ();
>
>
> On 8/10/19 8:20 AM, pcr wrote:
>>
>> I have changed from a tree store to a list store now, and I have 
>> working code, except for the last line in this call back used when a 
>> radio button is clicked in order to erase the list store and replace 
>> it with another at run time:
>>
>>   void ExampleWindow::on_rb2_clicked()
>>  {
>>     std::cout << "rb2 clicked" << std::endl;
>>
>>     typedef Gtk::TreeModel::Children type_children;
>>     type_children children = liststore1->children();
>>     type_children::iterator iter;
>>     for(iter=children.begin(); iter!=children.end(); ++iter)
>>                gtk_list_store_remove (*liststore1,*iter);
>>
>> }
>>
>> The compiler message I get is
>>
>> test3.cc: In member function ‘void ExampleWindow::on_rb2_clicked()’:
>> test3.cc:104:27: error: no match for ‘operator*’ (operand type is 
>> ‘Glib::RefPtr<Gtk::ListStore>’)
>>     gtk_list_store_remove (*liststore1,*iter);
>>
>> So my question is, I suppose, what is the proper syntax for using 
>> gtk_list_store_remove ???
>>
>> On 8/8/19 3:46 PM, pcr wrote:
>>>
>>> I'm trying to learn how to iterate over model rows in a manner 
>>> similar to the code segment in section 9.3 of the gnome gtkmm 
>>> tutorial.  Consider me a newbie; the "something" I want to do below 
>>> is delete/clear/erase a row - really all rows so I can display a new 
>>> set of rows in response to a user action like changing a radio 
>>> button.  But I haven't been able to do it. Here is the snippit from 
>>> section 9.3:
>>>
>>> typedef Gtk::TreeModel::Children type_children; //minimise code length.
>>> type_children children = refModel->children();
>>> for(type_children::iterator iter = children.begin();
>>>      iter != children.end(); ++iter)
>>> {
>>>    Gtk::TreeModel::Row row = *iter;
>>>    //Do something with the row - see above for set/get.
>>> }
>>>
>>> *I'm also confused by the following comment I found on line; I don't 
>>> see how this can work with the above code either. ***
>>> iterator Gtk::TreeStore:erase(const iterator& iter)
>>>     Returns an iterator to the next row or end() if there is none"
>>>
>>> I hope you can help me .  Thanks, PCR
>>>
>>>
>>> _______________________________________________
>>> gtkmm-list mailing list
>>> [email protected]
>>> https://mail.gnome.org/mailman/listinfo/gtkmm-list
>>
>> _______________________________________________
>> gtkmm-list mailing list
>> [email protected]
>> https://mail.gnome.org/mailman/listinfo/gtkmm-list

_______________________________________________
gtkmm-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/gtkmm-list
test3.cc (text/x-c++src, 3.1 KB)
//compile me with:  g++ -g -Wall -o test3 test3.cc `(pkg-config --cflags --libs gtkmm-3.0)`
#include <gtkmm.h>
#include <iostream>
#include <gtkmm/application.h>

class ExampleWindow : public Gtk::Window
{
public:
  ExampleWindow();
  virtual ~ExampleWindow();

protected:
  //Signal handlers:
  void on_rb1_clicked();
  void on_rb2_clicked();
  void on_treeview_row_activated(const Gtk::TreeModel::Path& path,
	Gtk::TreeViewColumn* column);

  //Tree model columns:
  class ModelColumns : public Gtk::TreeModel::ColumnRecord
  {
  public:

    ModelColumns(){ add(columnid); add(columnname);}
    Gtk::TreeModelColumn<unsigned int> columnid;
    Gtk::TreeModelColumn<Glib::ustring> columnname;
   };

  ModelColumns modelcolumns;                   //the ModelColumns object

  //Child widgets:
  Gtk::Box vbox1;
  Gtk::Box hbox1;
  Gtk::RadioButton rb1, rb2;
  Gtk::ScrolledWindow scroll1;
  Gtk::TreeView treeview1;
  Glib::RefPtr<Gtk::ListStore> liststore1;
 };

ExampleWindow::ExampleWindow():vbox1(Gtk::ORIENTATION_VERTICAL),hbox1(Gtk::ORIENTATION_HORIZONTAL),rb1("with Model1"),rb2("Model2")
{
  set_title("Gtk::TreeView (ListStore) with callbacks");
  set_border_width(5);
  set_default_size(400, 400);

  rb2.join_group(rb1);
  add(vbox1);
  vbox1.add(hbox1);
 
  hbox1.pack_start(rb1);
  hbox1.pack_end(rb2);

  //Add the TreeView, inside a ScrolledWindow
  scroll1.add(treeview1);
  scroll1.set_min_content_height(400);

  //Only show the scrollbars when they are necessary:
  scroll1.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);

  vbox1.add(scroll1);
 
  //Create the Tree model:
  liststore1 = Gtk::ListStore::create(modelcolumns);
  treeview1.set_model(liststore1);

  //Add the TreeView's view columns:
  treeview1.append_column("ID", modelcolumns.columnid);
  treeview1.append_column("Name", modelcolumns.columnname);

 //Conection from signals to callbacks 
  rb1.signal_clicked().connect(sigc::mem_fun(*this,&ExampleWindow::on_rb1_clicked));
  rb2.signal_clicked().connect(sigc::mem_fun(*this,&ExampleWindow::on_rb2_clicked));

  treeview1.signal_row_activated().connect( sigc::mem_fun(*this,
 	&ExampleWindow::on_treeview_row_activated));
 
  show_all_children();
}

void ExampleWindow::on_rb1_clicked()
{
  int count=5;
  std::string names[count] =  {"alpha", "beta", "gamma", "delta", "epsilon"};

  liststore1->clear();
  for(int j=0;j<count;j++)
  {
  	Gtk::TreeModel::Row row = *(liststore1->append());
	row[modelcolumns.columnid] = j;
	row[modelcolumns.columnname] = names[j]; 
  }
}

void ExampleWindow::on_rb2_clicked()
{
  std::string newnames[]= {"Alpha", "Beta", "Gamma", "Delta", "Epsilon"};

  liststore1->clear();
  int count=5;
  for(int j=0;j<count;j++)
  {
  	Gtk::TreeModel::Row row = *(liststore1->append());
	row[modelcolumns.columnid] = j;
	row[modelcolumns.columnname] = newnames[j]; 
  }
}

void ExampleWindow::on_treeview_row_activated(const Gtk::TreeModel::Path& path,
	Gtk::TreeViewColumn*)
{
	std::cout << "row_activated has been called"  << std::endl;
}

ExampleWindow::~ExampleWindow()
{
}

int main(int argc, char *argv[])
{
	auto app = Gtk::Application::create(argc,argv, "org.pcrt.example");
	ExampleWindow window;
	return app->run(window);
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.