#ifndef MSP_GLTK_LISTDATA_H_
#define MSP_GLTK_LISTDATA_H_
+#include <stdexcept>
#include <string>
#include <vector>
#include <sigc++/signal.h>
#include <msp/strings/lexicalcast.h>
+#include "mspgltk_api.h"
namespace Msp {
namespace GLtk {
-class ListData
+class MSPGLTK_API ListData
{
public:
sigc::signal<void, unsigned> signal_item_added;
sigc::signal<void, unsigned> signal_item_removed;
sigc::signal<void> signal_cleared;
- sigc::signal<void> signal_refresh_strings;
+ sigc::signal<void, unsigned> signal_refresh_item;
protected:
- ListData() { }
+ ListData() = default;
public:
- virtual ~ListData() { }
+ virtual ~ListData() = default;
virtual unsigned size() const = 0;
virtual std::string get_string(unsigned) const = 0;
- void refresh_strings() const { signal_refresh_strings.emit(); }
+ void refresh(unsigned i) const
+ {
+ if(i>=size())
+ throw std::out_of_range("ListData::refresh");
+ signal_refresh_item.emit(i);
+ }
};
template<typename T>
protected:
std::vector<T> items;
- ListDataStore() { }
+ ListDataStore() = default;
public:
void append(const T &v) { insert(items.size(), v); }
- void insert(unsigned i, const T & v)
+ void insert(unsigned i, const T &v)
{
if(i>items.size())
throw std::out_of_range("ListDataStore::insert");
return -1;
}
+ using ListData::refresh;
+ void refresh(const T &v) const
+ {
+ int i = find(v);
+ if(i>=0)
+ signal_refresh_item.emit(i);
+ }
+
void remove(unsigned i)
{
if(i>=items.size())
signal_cleared.emit();
}
- virtual unsigned size() const { return items.size(); }
+ unsigned size() const override { return items.size(); }
};
template<typename T>
typedef std::string Func(const T &);
private:
- Func *func;
+ Func *func = 0;
public:
FunctionListData(Func f): func(f) { }
- virtual std::string get_string(unsigned i) const
+ std::string get_string(unsigned i) const override
{ return func(this->get(i)); }
};