#ifndef __WidgetUpdate_h__
#define __WidgetUpdate_h__
#include <gtk/gtk.h>
#include <set>
#include <string>
struct Update
{
std::string id;
long ntrig;
long nwriten;
double eff;
double rate;
double time;
double throughput;
};
void RunManager_update(const std::string &, Update &);
void Module_update(const std::string &, Update &);
void Update_all(int &nRm, Update **, int &nMd, Update **);
class Widget
{
private:
GtkWidget *w;
bool disconnecting;
static void disconnect(GtkWidget *wdgt, gpointer ptr);
public:
Widget(GtkWidget *o) :
w(0), disconnecting(false)
{
set_widget(o);
}
virtual ~Widget();
GtkWidget *wdgt() const
{
return w;
}
operator GtkWidget *()
{
return w;
}
void set_widget(GtkWidget *o);
};
class WidgetUpdate : public Widget
{
public:
WidgetUpdate(GtkWidget *o = 0) :
Widget(o)
{
}
virtual int update(Update & ptr) = 0; // returning !=0 will unsubscribe
};
class WidgetHolder
{
public:
typedef std::set<WidgetUpdate *> updateList;
private:
updateList updates;
public:
virtual ~WidgetHolder()
{
deleteAll();
}
virtual void addUpdate(WidgetUpdate *u)
{
updates.insert(u);
}
virtual void deleteUpdate(WidgetUpdate *u)
{
if (u)
{
updates.erase(u);
gtk_widget_hide(u->wdgt() );
gtk_widget_destroy(u->wdgt() );
}
}
virtual void deleteAll();
virtual int countUpdates()
{
return updates.size();
}
virtual bool empty()
{
return updates.empty();
}
virtual void updateAll(Update & ptr);
};
inline void WidgetHolder::updateAll(Update & ptr)
{
updateList::iterator it;
for (it = updates.begin(); it != updates.end(); ++it)
if ((*it)->update(ptr) )
deleteUpdate( *it);
}
inline void WidgetHolder::deleteAll()
{
updateList::iterator it;
for (it = updates.begin(); it != updates.end(); ++it)
deleteUpdate( *it);
// delete *it;
updates.clear();
}
//---------------------------------------------------------------------
// Some WidgetUpdates
//---------------------------------------------------------------------
class UpdateLabelNtrig : public WidgetUpdate
{
public:
UpdateLabelNtrig(GtkWidget *o) :
WidgetUpdate(o)
{
}
~UpdateLabelNtrig()
{
}
int update(Update & ptr);
};
class UpdateLabelTime : public WidgetUpdate
{
public:
UpdateLabelTime(GtkWidget *o) :
WidgetUpdate(o)
{
}
~UpdateLabelTime()
{
}
int update(Update & ptr);
};
class UpdateGaugeEff : public WidgetUpdate
{
public:
UpdateGaugeEff(GtkWidget *o) :
WidgetUpdate(o)
{
}
~UpdateGaugeEff()
{
}
int update(Update & ptr);
};
class UpdateGaugeRate : public WidgetUpdate
{
public:
UpdateGaugeRate(GtkWidget *o) :
WidgetUpdate(o)
{
}
~UpdateGaugeRate()
{
}
int update(Update & ptr);
};
class UpdateLabelRate : public WidgetUpdate
{
public:
UpdateLabelRate(GtkWidget *o) :
WidgetUpdate(o)
{
}
~UpdateLabelRate()
{
}
int update(Update & ptr);
};
class UpdateThroughPut : public WidgetUpdate
{
private:
double thrp;
double tm0;
public:
UpdateThroughPut(GtkWidget *o) :
WidgetUpdate(o), thrp(0.), tm0(0.)
{
}
int update(Update & ptr);
};
//////////////////////////////////////////////////////////////////////////
// class ToggleButton
//
// Created: Mon May 27 11:53:21 2002 Author: Carlos Lacasta
// Purpose:
//
//////////////////////////////////////////////////////////////////////////
class ToggleButton : public Widget
{
private:
public:
ToggleButton(GtkWidget *o) :
Widget(o)
{
if ( !GTK_IS_TOGGLE_BUTTON(o))
set_widget(0);
}
bool get_state()
{
if ( !wdgt() )
return false;
return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wdgt())) ? true : false;
}
void set_state(bool x)
{
if ( !wdgt() || !GTK_IS_TOGGLE_BUTTON(wdgt()))
return;
gtk_toggle_button_set_active(
GTK_TOGGLE_BUTTON(wdgt()), x ? TRUE : FALSE);
}
};
#endif