00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef OST_GUI_TOOL_OPTION_HH
00020 #define OST_GUI_TOOL_OPTION_HH
00021
00022
00023
00024
00025
00026 #include <limits>
00027 #include <vector>
00028 #include <iostream>
00029
00030
00031 #include <ost/gui/module_config.hh>
00032 #include <QObject>
00033
00034
00035 namespace ost { namespace gui {
00036
00037 class DLLEXPORT_OST_GUI ToolOption : public QObject {
00038 Q_OBJECT
00039 public:
00040 typedef enum {
00041 INT, FLOAT, ENUM, BUTTON
00042 } Type;
00043 protected:
00044 ToolOption(const String& key, const String& verbose_name, Type type);
00045 public:
00046 const String& GetKey() const;
00047 const String& GetVerboseName() const;
00048 Type GetType() const;
00049 private:
00050 String key_;
00051 String verbose_name_;
00052 Type type_;
00053 };
00054
00055
00056
00057
00058 template <typename T, ToolOption::Type C>
00059 class DLLEXPORT ToolOptionNum : public ToolOption {
00060 public:
00061 ToolOptionNum(const String& key, const String& verbose_name, T default_v,
00062 T min_value=std::numeric_limits<T>::min(),
00063 T max_value=std::numeric_limits<T>::max()):
00064 ToolOption(key, verbose_name, C), value_(default_v),
00065 default_(default_v), min_value_(min_value), max_value_(max_value)
00066 {
00067
00068 }
00069
00070 T GetDefault() const { return default_; }
00071 T GetUpperLimit() const { return max_value_; }
00072 T GetLowerLimit() const { return min_value_; }
00073 T GetValue() const { return value_; }
00074 bool SetValue(T value)
00075 {
00076 if (value>=min_value_ && value<=max_value_) {
00077 value_=value;
00078 return true;
00079 }
00080 return false;
00081 }
00082 private:
00083 T value_;
00084 T default_;
00085 T min_value_;
00086 T max_value_;
00087 };
00088
00089 typedef ToolOptionNum<int, ToolOption::INT> ToolOptionInt;
00090 typedef ToolOptionNum<float, ToolOption::FLOAT> ToolOptionFloat;
00091
00092
00093 #if !defined(_MSC_VER)
00094 extern template class ToolOptionNum<int,ToolOption::INT>;
00095 extern template class ToolOptionNum<float,ToolOption::FLOAT>;
00096 #endif
00097
00098
00099
00100 class DLLEXPORT_OST_GUI ToolOptionEnum : public ToolOption {
00101 public:
00102 struct Tuple {
00103 String text;
00104 int tag;
00105 };
00106 typedef std::vector<Tuple>::const_iterator ConstIterator;
00107 public:
00108 ToolOptionEnum(const String& key, const String& verbose_name);
00109
00110 void Add(const String& text, int tag);
00111
00112 void SetIndex(int index) { index_=index; }
00113
00114 int GetIndex() const { return index_; }
00115 int GetValue() const { return tuples_[index_].tag; }
00116
00117 ConstIterator Begin() const { return tuples_.begin(); }
00118 ConstIterator End() const { return tuples_.end(); }
00119 size_t Size() { return tuples_.size(); }
00120
00121 private:
00122 std::vector<Tuple> tuples_;
00123 int index_;
00124 };
00125
00126 class DLLEXPORT_OST_GUI ToolOptionButton : public ToolOption {
00127 public:
00128 ToolOptionButton(const String& key,
00129 const String& verbose_name,
00130 QObject* receiver,
00131 const char *slot_method);
00132 const char* GetSlotMethod() const { return slot_method_; }
00133 QObject* GetReceiver() const { return receiver_; }
00134 private:
00135 const char *slot_method_;
00136 QObject* receiver_;
00137 };
00138
00139
00140 typedef std::vector<ToolOption*> ToolOptionList;
00141
00142 }}
00143
00144 #endif