summaryrefslogtreecommitdiff
path: root/indra/llui/llviewmodel.h
blob: ffd67f455d818b7cd0b8a81aec3c3bb28ad627d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
/**
 * @file   llviewmodel.h
 * @author Nat Goodspeed
 * @date   2008-08-08
 * @brief  Define "View Model" classes intended to store data values for use
 *         by LLUICtrl subclasses. The phrase is borrowed from Microsoft
 *         terminology, in which "View Model" means the storage object
 *         underlying a specific widget object -- as in our case -- rather
 *         than the business "model" object underlying the overall "view"
 *         presented by the collection of widgets.
 * 
 * $LicenseInfo:firstyear=2008&license=viewerlgpl$
 * Second Life Viewer Source Code
 * Copyright (C) 2010, Linden Research, Inc.
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation;
 * version 2.1 of the License only.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 * 
 * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 * $/LicenseInfo$
 */

#if ! defined(LL_LLVIEWMODEL_H)
#define LL_LLVIEWMODEL_H

#include "llpointer.h"
#include "llsd.h"
#include "llrefcount.h"
#include "llstring.h"
#include "lltrace.h"
#include "llui.h"
#include <string>

class LLScrollListItem;

class LLViewModel;
class LLTextViewModel;
class LLListViewModel;
// Because LLViewModel is derived from LLRefCount, always pass, store
// and return LLViewModelPtr rather than plain LLViewModel*.
typedef LLPointer<LLViewModel> LLViewModelPtr;
typedef LLPointer<LLTextViewModel> LLTextViewModelPtr;
typedef LLPointer<LLListViewModel> LLListViewModelPtr;

/**
 * LLViewModel stores a scalar LLSD data item, the current display value of a
 * scalar LLUICtrl widget. LLViewModel subclasses are used to store data
 * collections used for aggregate widgets. LLViewModel is ref-counted because
 * -- for multiple skins -- we may have distinct widgets sharing the same
 * LLViewModel data. This way, the LLViewModel is quietly deleted when the
 * last referencing widget is destroyed.
 */
class LLViewModel 
:	public LLRefCount
{
public:
    LLViewModel();
    /// Instantiate an LLViewModel with an existing data value
    LLViewModel(const LLSD& value);

    /// Update the stored value
    virtual void setValue(const LLSD& value);
    /// Get the stored value, in appropriate type.
    virtual LLSD getValue() const;

    /// Has the value been changed since last time we checked?
    bool isDirty() const { return mDirty; }
    /// Once the value has been saved to a file, or otherwise consumed by the
    /// app, we no longer need to enable the Save button
    void resetDirty() { mDirty = false; }
	// 
    void setDirty() { mDirty = true; }

protected:
    LLSD mValue;
    bool mDirty;
};

/**
 * LLTextViewModel stores a value displayed as text. 
 */
class LLTextViewModel: public LLViewModel
{
public:
    LLTextViewModel();
    /// Instantiate an LLViewModel with an existing data value
    LLTextViewModel(const LLSD& value);
	
	// LLViewModel functions
    virtual void setValue(const LLSD& value);
    virtual LLSD getValue() const;
    const std::string& getStringValue() const;

	// New functions
    /// Get the stored value in string form
    const LLWString& getDisplay() const { return mDisplay; }
	LLWString& getEditableDisplay() { mDirty = true; mUpdateFromDisplay = true; return mDisplay; }

    /**
     * Set the display string directly (see LLTextEditor). What the user is
     * editing is actually the LLWString value rather than the underlying
     * UTF-8 value.
     */
    void setDisplay(const LLWString& value);
	
private:
    std::string mStringValue;

    /// To avoid converting every widget's stored value from LLSD to LLWString
    /// every frame, cache the converted value
    LLWString mDisplay;

    /// As the user edits individual characters (setDisplay()), defer
    /// LLWString-to-UTF8 conversions until s/he's done.
    bool mUpdateFromDisplay;

    friend void updateFromDisplayIfNeeded(const LLTextViewModel* model);
};

/**
 * LLListViewModel stores a list of data items. The semantics are borrowed
 * from LLScrollListCtrl.
 */
class LLListViewModel: public LLViewModel
{
public:
    LLListViewModel() {}
    LLListViewModel(const LLSD& values);

    virtual void addColumn(const LLSD& column, EAddPosition pos = ADD_BOTTOM);
    virtual void clearColumns();
    virtual void setColumnLabel(const std::string& column, const std::string& label);
    virtual LLScrollListItem* addElement(const LLSD& value, EAddPosition pos = ADD_BOTTOM,
                                         void* userdata = NULL);
    virtual LLScrollListItem* addSimpleElement(const std::string& value, EAddPosition pos,
                                               const LLSD& id);
    virtual void clearRows();
    virtual void sortByColumn(const std::string& name, bool ascending);
};

//namespace LLViewModel
//{
//	class Value
//	{
//	public:
//		Value(const LLSD& value = LLSD());
//
//		LLSD getValue() const { return mValue; }
//		void setValue(const LLSD& value) { mValue = value; }
//
//		bool isAvailable() const { return false; }
//		bool isReadOnly() const { return false; }
//
//		bool undo() { return false; }
//		bool redo() { return false; }
//
//	    /// Has the value been changed since last time we checked?
//		bool isDirty() const { return mDirty; }
//		/// Once the value has been saved to a file, or otherwise consumed by the
//		/// app, we no longer need to enable the Save button
//		void resetDirty() { mDirty = false; }
//		// 
//		void setDirty() { mDirty = true; }
//
//	protected:
//		LLSD	mValue;
//		bool mDirty;
//	};
//
//	class Numeric : public Value
//	{
//	public:
//		Numeric(S32 value = 0);
//		Numeric(F32 value);
//
//		F32 getPrecision();
//		F32 getMin();
//		F32 getMax();
//
//		void increment();
//		void decrement();
//	};
//
//	class MultipleValues : public Value
//	{
//		class Selector
//		{};
//
//		MultipleValues();
//		virtual S32 numElements();
//	};
//
//	class Tuple : public MultipleValues
//	{
//		Tuple(S32 size);
//		LLSD getValue(S32 which) const;
//		void setValue(S32 which, const LLSD& value);
//	};
//
//	class List : public MultipleValues
//	{
//		List();
//
//		void add(const ValueModel& value);
//		bool remove(const Selector& item);
//
//		void setSortElement(const Selector& element);
//		void sort();
//	};
//
//};
#endif /* ! defined(LL_LLVIEWMODEL_H) */