5 #ifndef __uibasedatasource__ 6 #define __uibasedatasource__ 8 #include "../iuidescription.h" 10 #if VSTGUI_LIVE_EDITING 12 #include "../uiattributes.h" 13 #include "../../lib/cdatabrowser.h" 14 #include "../../lib/controls/csearchtextedit.h" 15 #include "../../lib/controls/cscrollbar.h" 22 class UIBaseDataSource :
public GenericStringListDataBrowserSource,
public IControlListener
25 using StringVector = GenericStringListDataBrowserSource::StringVector;
27 UIBaseDataSource (UIDescription* description, IActionPerformer* actionPerformer, IdStringPtr descriptionMessage, IGenericStringListDataBrowserSourceSelectionChanged* delegate =
nullptr)
28 : GenericStringListDataBrowserSource (0, delegate) , description (description), actionPerformer (actionPerformer), descriptionMessage (descriptionMessage)
30 description->addDependency (
this);
34 ~UIBaseDataSource ()
override 36 description->removeDependency (
this);
39 void setSearchFieldControl (CSearchTextEdit* searchControl)
41 searchField = searchControl;
42 searchField->setListener (
this);
47 if (dataBrowser && actionPerformer)
49 std::string newName (filterString.empty () ?
"New" : filterString);
50 if (createUniqueName (newName))
52 addItem (newName.data ());
53 int32_t row = selectName (newName.data ());
56 dbOnMouseDown (CPoint (0, 0), CButtonState (kLButton|kDoubleClick), row, 0, dataBrowser);
64 virtual bool remove ()
66 if (dataBrowser && actionPerformer)
68 int32_t selectedRow = dataBrowser->getSelectedRow ();
69 if (selectedRow != CDataBrowser::kNoSelection)
71 removeItem (names.at (static_cast<uint32_t> (selectedRow)).data ());
72 dbSelectionChanged (dataBrowser);
73 dataBrowser->setSelectedRow (selectedRow);
80 virtual void setFilter (
const UTF8String& filter)
82 if (filterString != filter)
84 filterString = filter;
85 int32_t selectedRow = dataBrowser ? dataBrowser->getSelectedRow () : CDataBrowser::kNoSelection;
86 std::string selectedName;
87 if (selectedRow != CDataBrowser::kNoSelection)
88 selectedName = names.at (static_cast<uint32_t> (selectedRow));
90 if (selectedRow != CDataBrowser::kNoSelection)
91 selectName (selectedName.data ());
95 virtual int32_t selectName (UTF8StringPtr name)
98 for (
auto& it : names)
102 dataBrowser->setSelectedRow (index,
true);
104 delegate->dbSelectionChanged (index,
this);
112 virtual void getNames (std::list<const std::string*>& names) = 0;
113 virtual bool addItem (UTF8StringPtr name) = 0;
114 virtual bool removeItem (UTF8StringPtr name) = 0;
115 virtual bool performNameChange (UTF8StringPtr oldName, UTF8StringPtr newName) = 0;
116 virtual UTF8StringPtr getDefaultsName () = 0;
118 virtual void update ()
121 textEditControl->looseFocus ();
123 std::list<const std::string*> tmpNames;
126 std::string filter = filterString.getString ();
127 std::transform (filter.begin (), filter.end (), filter.begin (), ::tolower);
129 for (
auto& name : tmpNames)
131 if (!filter.empty ())
133 std::string tmp (*name);
134 std::transform (tmp.begin (), tmp.end (), tmp.begin (), ::tolower);
135 if (tmp.find (filter) == std::string::npos)
138 if (name->find (
"~ ") == 0)
140 names.emplace_back (UTF8String (*name));
142 bool vsbIsVisible =
false;
145 if (
auto vsb = dataBrowser->getVerticalScrollbar ())
146 vsbIsVisible = vsb->isVisible ();
148 setStringList (&names);
151 if (
auto vsb = dataBrowser->getVerticalScrollbar ())
153 if (vsb->isVisible() != vsbIsVisible)
154 dataBrowser->recalculateLayout ();
159 CMessageResult notify (CBaseObject* sender, IdStringPtr message)
override 161 if (message == descriptionMessage)
163 int32_t selectedRow = dataBrowser ? dataBrowser->getSelectedRow () : CDataBrowser::kNoSelection;
164 std::string selectedName;
165 if (selectedRow != CDataBrowser::kNoSelection)
166 selectedName = names.at (static_cast<uint32_t> (selectedRow));
168 if (selectedRow != CDataBrowser::kNoSelection)
169 selectName (selectedName.data ());
170 return kMessageNotified;
172 else if (message == UIDescription::kMessageBeforeSave)
175 return kMessageNotified;
177 return kMessageUnknown;
180 virtual void saveDefaults ()
182 UTF8StringPtr name = getDefaultsName ();
185 UIAttributes* attributes = description->getCustomAttributes (name,
true);
188 attributes->setAttribute (
"FilterString", filterString.getString ());
191 int32_t selectedRow = dataBrowser->getSelectedRow ();
192 attributes->setIntegerAttribute (
"SelectedRow", selectedRow);
198 virtual void loadDefaults ()
200 UTF8StringPtr name = getDefaultsName ();
203 UIAttributes* attributes = description->getCustomAttributes (name,
true);
206 const std::string* str = attributes->getAttributeValue (
"FilterString");
208 setFilter (str->data ());
212 if (attributes->getIntegerAttribute(
"SelectedRow", selectedRow))
213 dataBrowser->setSelectedRow (selectedRow,
true);
219 void dbAttached (CDataBrowser* browser)
override 225 searchField->setText (filterString);
228 void dbRemoved (CDataBrowser* browser)
override 234 void valueChanged (CControl* control)
override 236 CTextEdit* edit =
dynamic_cast<CTextEdit*
>(control);
238 setFilter (edit->getText ());
241 bool createUniqueName (std::string& name, int32_t count = 0)
243 std::stringstream str;
250 for (
auto& it : names)
252 if (it == str.str ())
253 return createUniqueName (name, count+1);
259 CMouseEventResult dbOnMouseDown (
const CPoint& where,
const CButtonState& buttons, int32_t row, int32_t column, CDataBrowser* browser)
override 261 if (buttons.isLeftButton () && buttons.isDoubleClick ())
263 browser->beginTextEdit (CDataBrowser::Cell (row, column), names.at (static_cast<uint32_t> (row)).data ());
265 return kMouseDownEventHandledButDontNeedMovedOrUpEvents;
268 void dbCellTextChanged (int32_t _row, int32_t column, UTF8StringPtr newText, CDataBrowser* browser)
override 270 textEditControl =
nullptr;
271 if (_row < 0 || _row >= static_cast<int32_t> (names.size ()))
273 auto row =
static_cast<size_t> (_row);
274 for (
auto& name : names)
279 auto& currentName = names.at (row);
280 if (performNameChange (currentName.data (), newText))
282 if (selectName (newText) == -1 && row < names.size ())
283 selectName (names.at (row).data ());
287 void dbCellSetupTextEdit (int32_t row, int32_t column, CTextEdit* control, CDataBrowser* browser)
override 289 textEditControl = control;
290 textEditControl->setBackColor (kWhiteCColor);
291 textEditControl->setFontColor (fontColor);
292 textEditControl->setFont (drawFont);
293 textEditControl->setHoriAlign (textAlignment);
294 textEditControl->setTextInset (textInset);
297 SharedPointer<UIDescription> description;
298 SharedPointer<CSearchTextEdit> searchField;
299 SharedPointer<CTextEdit> textEditControl;
300 IActionPerformer* actionPerformer;
301 IdStringPtr descriptionMessage;
304 UTF8String filterString;
309 #endif // VSTGUI_LIVE_EDITING 311 #endif // __uibasedatasource__ void dbAttached(CDataBrowser *browser) override
databrowser view was attached to a parent
Definition: cdatabrowser.cpp:1146
void dbRemoved(CDataBrowser *browser) override
databrowser view will be removed from its parent
Definition: cdatabrowser.cpp:1152
Definition: customcontrols.cpp:8