Code: Select all
#include <gtkmm.h>
#include <sigc++/class_slot.h>
#include <sstream>
/*
* Test Window
*
*/
class TestWindow : public Gtk::Window
{
public:
TestWindow();
// Skapar en ny tråd med run()-funktionen
void launch();
private:
Gtk::VBox boxMain;
class TreeColumns : public Gtk::TreeModel::ColumnRecord
{
public:
TreeColumns()
{
add( colText );
}
Gtk::TreeModelColumn<Glib::ustring> colText;
};
// Lista som visar lite textmeddelanden
Gtk::TreeView treeView;
Gtk::ScrolledWindow scrolledWindow;
Glib::RefPtr<Gtk::ListStore> treeModel;
TreeColumns treeColumns;
// Lägg till meddelande i listan
void addMessage( Glib::ustring text );
// Funktionen som trådas ut och lägger till meddelanden i listan
void run();
};
TestWindow::TestWindow()
{
// Ändra några attribut
set_title( "Test window" );
set_border_width( 5 );
set_default_size( 300, 300 );
// Sätt ihop en lista och lägg i huvudboxen
treeModel = Gtk::ListStore::create( treeColumns );
treeView.set_model( treeModel );
treeView.append_column( "Message", treeColumns.colText );
scrolledWindow.add( treeView );
scrolledWindow.set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC );
boxMain.pack_start( scrolledWindow, Gtk::PACK_EXPAND_WIDGET );
// Lägg huvudboxen i fönstret och visa alla objekt
add( boxMain );
show_all_children();
}
void TestWindow::launch()
{
// Tråda ut run()-funktionen
Glib::Thread::create( SigC::slot_class( *this, &TestWindow::run ), false );
}
void TestWindow::addMessage( Glib::ustring text )
{
// Skapa en ny rad i listan och ändra texten i den
Gtk::TreeModel::Row row = *( treeModel->append() );
row[ treeColumns.colText ] = text;
}
void TestWindow::run()
{
unsigned int i;
std::stringstream sstream;
/*
* Detta måste fixas. Denna funktionen ska kunna ändra ALLA objekt
* i GUI:et helt trådsäkert på något sätt.
*
*/
for( i = 0; i < 1000; i++ )
{
sstream.str( "" );
sstream << i;
// Lägg till ett meddelande
addMessage( "Test " + sstream.str() );
}
}
/*
* Main window
*
*/
class MainWindow : public Gtk::Window
{
public:
MainWindow();
private:
// Visa ett test fönstret
void showTestWindow();
Gtk::VBox boxMain;
};
MainWindow::MainWindow()
{
set_title( "Main window" );
set_border_width( 5 );
set_default_size( 300, 300 );
Gtk::Button *button = new Gtk::Button( "Show window" );
boxMain.pack_start( *manage( button ), Gtk::PACK_SHRINK );
button->signal_clicked().connect(
sigc::mem_fun( *this, &MainWindow::showTestWindow ) );
button = new Gtk::Button( "Exit" );
boxMain.pack_start( *manage( button ), Gtk::PACK_SHRINK );
button->signal_clicked().connect(
sigc::mem_fun( *this, &MainWindow::hide ) );
add( boxMain );
show_all_children();
}
void MainWindow::showTestWindow()
{
TestWindow *window = new TestWindow();
window->set_modal( true );
window->set_transient_for( *this );
// Skapa en ny tråd när fönstret idl:ar
Glib::signal_idle().connect( sigc::bind_return(
sigc::mem_fun( window, &TestWindow::launch ), false ) );
window->show();
}
/*
* Main
*
*/
int main( int argc, char *argv[] )
{
Glib::thread_init();
Gtk::Main kit( argc, argv );
MainWindow main;
Gtk::Main::run( main );
return 0;
}