MythTV  master
mythgenerictree.cpp
Go to the documentation of this file.
1 
2 // Mythui headers
3 #include "mythgenerictree.h"
4 #include "mythuibuttonlist.h"
5 
6 // Myth headers
9 
10 // QT headers
11 #include <algorithm>
12 
13 class SortableMythGenericTreeList : public QList<MythGenericTree*>
14 {
15  public:
16  SortableMythGenericTreeList() = default;
18 
19  void SetSortType(SortType stype) { m_sortType = stype; }
20  void SetAttributeIndex(int index)
21  { m_attributeIndex = (index >= 0) ? index : 0; }
22 
24  {
25  return one->GetSortText() < two->GetSortText();
26  }
27 
29  {
30  bool onesel = one->isSelectable();
31  bool twosel = two->isSelectable();
32 
33  if (onesel == twosel)
34  return 0;
35  if (onesel && !twosel)
36  return 1;
37  return -1;
38  }
39 
40  void Sort(SortType stype, int attributeIndex = 0)
41  {
42  m_sortType = stype;
43  m_attributeIndex = attributeIndex;
44  switch (m_sortType)
45  {
46  case SORT_STRING:
47  std::sort(begin(), end(), sortByString);
48  break;
49  case SORT_SELECTABLE:
50  std::sort(begin(), end(), sortBySelectable);
51  break;
52  }
53  }
54 
55  private:
57  int m_attributeIndex {0}; // for getAttribute
58 };
59 
61 
62 MythGenericTree::MythGenericTree(QString a_string, int an_int,
63  bool selectable_flag)
64  : m_text(std::move(a_string)),
65  m_int(an_int),
66  m_selectable(selectable_flag)
67 {
69 
71 }
72 
74 {
76  delete m_subnodes;
77 }
78 
80 {
81  std::shared_ptr<MythSortHelper>sh = getMythSortHelper();
82  if (m_sortText.isEmpty() and not m_text.isEmpty())
83  m_sortText = sh->doTitle(m_text);
84 }
85 
86 MythGenericTree* MythGenericTree::addNode(const QString &a_string, int an_int,
87  bool selectable_flag, bool visible)
88 {
89  auto *new_node = new MythGenericTree(a_string.simplified(),
90  an_int, selectable_flag);
91  new_node->SetVisible(visible);
92  return addNode(new_node);
93 }
94 
95 MythGenericTree* MythGenericTree::addNode(const QString &a_string,
96  const QString &sortText, int an_int, bool
97  selectable_flag, bool visible)
98 {
99  auto *new_node = new MythGenericTree(a_string.simplified(),
100  an_int, selectable_flag);
101  new_node->SetVisible(visible);
102  new_node->SetSortText(sortText);
103 
104  return addNode(new_node);
105 }
106 
108 {
109  child->setParent(this);
110  m_subnodes->append(child);
111  if (child->IsVisible())
112  IncVisibleCount();
113 
114  return child;
115 }
116 
118 {
119  if (!m_parent)
120  return;
121 
122  m_parent->removeNode(this);
123 }
124 
126 {
127  if (!child)
128  return;
129 
130  if (m_selectedSubnode == child)
131  m_selectedSubnode = nullptr;
132 
133  m_subnodes->removeAll(child);
134  child->setParent(nullptr);
135 
136  if (child && child->IsVisible())
137  DecVisibleCount();
138 }
139 
141 {
142  if (!child)
143  return;
144 
145  removeNode(child);
146  delete child;
147 }
148 
150 {
151  if (m_subnodes->count() > 0)
152  return m_subnodes->first()->findLeaf();
153 
154  return this;
155 }
156 
157 MythGenericTree* MythGenericTree::findNode(QList<int> route_of_branches)
158 {
159  // Starting from *this* node (which will often be root) find a set of
160  // branches that have id's that match the collection passed in
161  // route_of_branches. Return the end point of those branches.
162  //
163  // In practical terms, mythmusic will use this to force the playback
164  // screen's ManagedTreeList to move to a given track in a given playlist
165 
166  MythGenericTree *node = nullptr;
167  for (int i = 0; i < route_of_branches.count(); i++)
168  {
169  if (!node)
170  node = this;
171 
172  bool foundit = false;
173  QList<MythGenericTree*>::iterator it;
174  QList<MythGenericTree*> *children = node->getAllChildren();
175 
176  if (!children)
177  break;
178 
179  MythGenericTree *child = nullptr;
180 
181  for (it = children->begin(); it != children->end(); ++it)
182  {
183  child = *it;
184  if (!child)
185  continue;
186  if (child->getInt() == route_of_branches[i])
187  {
188  node = child;
189  foundit = true;
190  break;
191  }
192  }
193 
194  if (!foundit)
195  break;
196  }
197 
198  return nullptr;
199 }
200 
202 {
203  return m_subnodes->indexOf(child);
204 }
205 
207 {
208  if (m_parent)
209  return m_parent->getChildPosition(this);
210  return 0;
211 }
212 
214 {
215  QList<int> routeByID;
216 
217  routeByID.push_front(getInt());
218 
219  MythGenericTree *parent = this;
220  while( (parent = parent->getParent()) )
221  {
222  routeByID.push_front(parent->getInt());
223  }
224  return routeByID;
225 }
226 
228 {
229  QStringList routeByString;
230 
231  routeByString.push_front(GetText());
232 
233  MythGenericTree *parent = this;
234  while( (parent = parent->getParent()) )
235  {
236  routeByString.push_front(parent->GetText());
237  }
238  return routeByString;
239 }
240 
241 QList<MythGenericTree*> MythGenericTree::getRoute(void)
242 {
243  QList<MythGenericTree*> route;
244 
245  route.push_front(this);
246 
247  MythGenericTree *parent = this;
248  while( (parent = parent->getParent()) )
249  {
250  route.push_front(parent);
251  }
252  return route;
253 }
254 
256 {
257  return m_subnodes->count();
258 }
259 
261 {
262  if (m_parent)
263  return m_parent->childCount();
264  return 1;
265 }
266 
271 {
272  QList<MythGenericTree *> route = getRoute();
273 
274  return (route.size() - 1);
275 }
276 
277 QList<MythGenericTree*> *MythGenericTree::getAllChildren() const
278 {
279  return m_subnodes;
280 }
281 
283 {
284  if (reference >= (uint)m_subnodes->count())
285  return nullptr;
286 
287  return m_subnodes->at(reference);
288 }
289 
291 {
292  if (reference >= (uint)m_subnodes->count())
293  return nullptr;
294 
295  QList<MythGenericTree*> *list = m_subnodes;
296 
297  uint n = 0;
298  for (auto *child : qAsConst(*list))
299  {
300  if (child->IsVisible())
301  {
302  if (n == reference)
303  return child;
304  n++;
305  }
306  }
307 
308  return nullptr;
309 }
310 
312 {
313  MythGenericTree *selectedChild = nullptr;
314 
315  if (m_selectedSubnode)
316  selectedChild = m_selectedSubnode;
317  else if (onlyVisible)
318  selectedChild = getVisibleChildAt(0);
319  else
320  selectedChild = getChildAt(0);
321 
322  return selectedChild;
323 }
324 
326 {
327  if (m_parent)
328  m_parent->setSelectedChild(this);
329  else
330  LOG(VB_GENERAL, LOG_ERR, "Top level can't become selected child");
331 }
332 
334 {
335  if (!m_parent)
336  {
337  // I'm root = no siblings
338  return nullptr;
339  }
340 
341  int position = m_parent->getChildPosition(this);
342 
343  if (position < number_up)
344  {
345  // not enough siblings "above" me
346  return nullptr;
347  }
348 
349  return m_parent->getChildAt(position - number_up);
350 }
351 
353 {
354  if (!m_parent)
355  {
356  // I'm root = no siblings
357  return nullptr;
358  }
359 
360  int position = m_parent->getChildPosition(this);
361 
362  if (position + number_down >= m_parent->childCount())
363  {
364  // not enough siblings "below" me
365  return nullptr;
366  }
367 
368  return m_parent->getChildAt(position + number_down);
369 }
370 
372 {
373  if (m_parent)
374  return m_parent;
375  return nullptr;
376 }
377 
379 {
380  QList<MythGenericTree*> *children = getAllChildren();
381  if (children && children->count() > 0)
382  {
383  SortableMythGenericTreeList::Iterator it;
384  MythGenericTree *child = nullptr;
385 
386  for (it = children->begin(); it != children->end(); ++it)
387  {
388  child = *it;
389  if (!child)
390  continue;
391  if (child->GetText() == a_name)
392  return child;
393  }
394  }
395 
396  return nullptr;
397 }
398 
400 {
401  QList<MythGenericTree*> *children = getAllChildren();
402  if (children && children->count() > 0)
403  {
404  SortableMythGenericTreeList::Iterator it;
405  MythGenericTree *child = nullptr;
406 
407  for (it = children->begin(); it != children->end(); ++it)
408  {
409  child = *it;
410  if (!child)
411  continue;
412  if (child->getInt() == an_int)
413  return child;
414  }
415  }
416 
417  return nullptr;
418 }
419 
421 {
423 
424  QList<MythGenericTree*> *children = getAllChildren();
425  if (children && children->count() > 0)
426  {
427  SortableMythGenericTreeList::Iterator it;
428  MythGenericTree *child = nullptr;
429 
430  for (it = children->begin(); it != children->end(); ++it)
431  {
432  child = *it;
433  if (!child)
434  continue;
435  child->sortByString();
436  }
437  }
438 }
439 
441 {
443 
444  QList<MythGenericTree*>::iterator it;
445  it = m_subnodes->begin();
446  MythGenericTree *child = nullptr;
447  while ((child = *it) != nullptr)
448  {
449  child->sortBySelectable();
450  ++it;
451  }
452 }
453 
455 {
456  m_selectedSubnode = nullptr;
457  while (!m_subnodes->isEmpty())
458  {
459  MythGenericTree *child = m_subnodes->takeFirst();
460  delete child;
461  child = nullptr;
462  }
463  m_subnodes->clear();
464 }
465 
467 {
468  if (item == m_subnodes->first() && flag)
469  return;
470  if (item == m_subnodes->last() && !flag)
471  return;
472 
473  int num = m_subnodes->indexOf(item);
474 
475  int insertat = 0;
476  if (flag)
477  insertat = num - 1;
478  else
479  insertat = num + 1;
480 
481  m_subnodes->removeAt(num);
482  m_subnodes->insert(insertat, item);
483 }
484 
485 void MythGenericTree::SetVisible(bool visible)
486 {
487  if (m_visible == visible)
488  return;
489 
490  m_visible = visible;
491 
492  if (!m_parent)
493  return;
494 
495  if (visible)
497  else
499 }
500 
502 {
503  auto *item = new MythUIButtonListItem(list, GetText());
504  item->SetData(QVariant::fromValue(this));
505  item->SetTextFromMap(m_strings);
506  item->SetImageFromMap(m_imageFilenames);
507  item->SetStatesFromMap(m_states);
508  item->SetTextCb(m_textCb.fn, m_textCb.data);
509  item->SetImageCb(m_imageCb.fn, m_imageCb.data);
510  item->SetStateCb(m_stateCb.fn, m_stateCb.data);
511 
512  if (visibleChildCount() > 0)
513  item->setDrawArrow(true);
514 
515  return item;
516 }
517 
518 void MythGenericTree::SetText(const QString &text, const QString &name,
519  const QString &state)
520 {
521  if (!name.isEmpty())
522  {
523  TextProperties textprop;
524  textprop.text = text;
525  textprop.state = state;
526  m_strings.insert(name, textprop);
527  }
528  else
529  {
530  m_text = text;
531  m_sortText = nullptr;
533  }
534 }
535 
537  const QString &state)
538 {
539  InfoMap::const_iterator map_it = infoMap.begin();
540  while (map_it != infoMap.end())
541  {
542  TextProperties textprop;
543  textprop.text = (*map_it);
544  textprop.state = state;
545  m_strings[map_it.key()] = textprop;
546  ++map_it;
547  }
548 }
549 
551 {
552  m_textCb.fn = fn;
553  m_textCb.data = data;
554 }
555 
556 QString MythGenericTree::GetText(const QString &name) const
557 {
558  if (name.isEmpty())
559  return m_text;
560 
561  if (m_textCb.fn != nullptr)
562  {
563  QString result = m_textCb.fn(name, m_textCb.data);
564  if (!result.isEmpty())
565  return result;
566  }
567 
568  if (m_strings.contains(name))
569  return m_strings[name].text;
570  return {};
571 }
572 
573 void MythGenericTree::SetImage(const QString &filename, const QString &name)
574 {
575  if (!name.isEmpty())
576  m_imageFilenames.insert(name, filename);
577 }
578 
580 {
581  m_imageFilenames.clear();
582  m_imageFilenames = infoMap;
583 }
584 
586 {
587  m_imageCb.fn = fn;
588  m_imageCb.data = data;
589 }
590 
591 QString MythGenericTree::GetImage(const QString &name) const
592 {
593  if (name.isEmpty())
594  return {};
595 
596  if (m_imageCb.fn != nullptr)
597  {
598  QString result = m_imageCb.fn(name, m_imageCb.data);
599  if (!result.isEmpty())
600  return result;
601  }
602 
603  InfoMap::const_iterator it = m_imageFilenames.find(name);
604  if (it != m_imageFilenames.end())
605  return *it;
606 
607  return {};
608 }
609 
611 {
612  m_states.clear();
613  m_states = infoMap;
614 }
615 
617 {
618  m_stateCb.fn = fn;
619  m_stateCb.data = data;
620 }
621 
622 void MythGenericTree::DisplayState(const QString &state, const QString &name)
623 {
624  if (!name.isEmpty())
625  m_states.insert(name, state);
626 }
627 
628 QString MythGenericTree::GetState(const QString &name) const
629 {
630  if (name.isEmpty())
631  return {};
632 
633  if (m_stateCb.fn != nullptr)
634  {
635  QString result = m_stateCb.fn(name, m_stateCb.data);
636  if (!result.isEmpty())
637  return result;
638  }
639 
640  InfoMap::const_iterator it = m_states.find(name);
641  if (it != m_states.end())
642  return *it;
643 
644  return {};
645 }
SortableMythGenericTreeList::Sort
void Sort(SortType stype, int attributeIndex=0)
Definition: mythgenerictree.cpp:40
MythGenericTree::GetSortText
QString GetSortText() const
Definition: mythgenerictree.h:84
SortableMythGenericTreeList::SORT_STRING
@ SORT_STRING
Definition: mythgenerictree.cpp:17
getMythSortHelper
std::shared_ptr< MythSortHelper > getMythSortHelper(void)
Get a pointer to the MythSortHelper singleton.
Definition: mythsorthelper.cpp:133
MythGenericTree::GetText
QString GetText(const QString &name="") const
Definition: mythgenerictree.cpp:556
MythGenericTree::m_text
QString m_text
Definition: mythgenerictree.h:130
MythGenericTree::setParent
void setParent(MythGenericTree *a_parent)
Definition: mythgenerictree.h:75
SortableMythGenericTreeList::sortBySelectable
static int sortBySelectable(MythGenericTree *one, MythGenericTree *two)
Definition: mythgenerictree.cpp:28
MythGenericTree::SetTextFromMap
void SetTextFromMap(const InfoMap &infoMap, const QString &state="")
Definition: mythgenerictree.cpp:536
MythGenericTree::~MythGenericTree
virtual ~MythGenericTree()
Definition: mythgenerictree.cpp:73
MythGenericTree::m_textCb
mgtCbInfo m_textCb
Definition: mythgenerictree.h:135
MythGenericTree::setSelectedChild
void setSelectedChild(MythGenericTree *a_node)
Definition: mythgenerictree.h:116
MythGenericTree::m_states
InfoMap m_states
Definition: mythgenerictree.h:134
MythGenericTree::visibleChildCount
uint visibleChildCount() const
Definition: mythgenerictree.h:101
MythGenericTree::currentDepth
int currentDepth(void)
Establish how deep in the current tree this node lies.
Definition: mythgenerictree.cpp:270
MythGenericTree::getInt
int getInt() const
Definition: mythgenerictree.h:73
MythGenericTree::m_sortText
QString m_sortText
Definition: mythgenerictree.h:131
MythGenericTree::SetImageCb
void SetImageCb(mgtCbFn fn, void *data)
Definition: mythgenerictree.cpp:585
MythGenericTree::SetImageFromMap
void SetImageFromMap(const InfoMap &infoMap)
Definition: mythgenerictree.cpp:579
MythGenericTree::SetTextCb
void SetTextCb(mgtCbFn fn, void *data)
Definition: mythgenerictree.cpp:550
MythGenericTree::getChildByName
MythGenericTree * getChildByName(const QString &a_name) const
Definition: mythgenerictree.cpp:378
mgtCbInfo::data
void * data
Definition: mythgenerictree.h:24
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
MythGenericTree::DisplayStateFromMap
void DisplayStateFromMap(const InfoMap &infoMap)
Definition: mythgenerictree.cpp:610
SortableMythGenericTreeList::sortByString
static bool sortByString(MythGenericTree *one, MythGenericTree *two)
Definition: mythgenerictree.cpp:23
mythsorthelper.h
MythGenericTree::isSelectable
bool isSelectable() const
Definition: mythgenerictree.h:107
MythGenericTree::GetImage
QString GetImage(const QString &name="") const
Definition: mythgenerictree.cpp:591
mythuibuttonlist.h
MythGenericTree::SetStateCb
void SetStateCb(mgtCbFn fn, void *data)
Definition: mythgenerictree.cpp:616
mgtCbFn
QString(*)(const QString &name, void *data) mgtCbFn
Definition: mythgenerictree.h:20
InfoMap
QHash< QString, QString > InfoMap
Definition: mythtypes.h:15
MythGenericTree::getChildAt
MythGenericTree * getChildAt(uint reference) const
Definition: mythgenerictree.cpp:282
MythGenericTree::addNode
MythGenericTree * addNode(const QString &a_string, int an_int=0, bool selectable_flag=false, bool visible=true)
Definition: mythgenerictree.cpp:86
MythGenericTree::getSelectedChild
MythGenericTree * getSelectedChild(bool onlyVisible=false) const
Definition: mythgenerictree.cpp:311
MythUIButtonListItem
Definition: mythuibuttonlist.h:41
mythlogging.h
MythGenericTree::sortByString
void sortByString()
Definition: mythgenerictree.cpp:420
SortableMythGenericTreeList::m_attributeIndex
int m_attributeIndex
Definition: mythgenerictree.cpp:57
MythGenericTree::getRouteByString
QStringList getRouteByString(void)
Definition: mythgenerictree.cpp:227
MythGenericTree::sortBySelectable
void sortBySelectable()
Definition: mythgenerictree.cpp:440
MythGenericTree::IsVisible
bool IsVisible() const
Definition: mythgenerictree.h:110
MythGenericTree::SetImage
void SetImage(const QString &filename, const QString &name="")
Definition: mythgenerictree.cpp:573
SortableMythGenericTreeList::SORT_SELECTABLE
@ SORT_SELECTABLE
Definition: mythgenerictree.cpp:17
MythGenericTree::childCount
int childCount(void) const
Definition: mythgenerictree.cpp:255
MythGenericTree::prevSibling
MythGenericTree * prevSibling(int number_up)
Definition: mythgenerictree.cpp:333
TextProperties
Definition: mythuibuttonlist.h:23
MythGenericTree::nextSibling
MythGenericTree * nextSibling(int number_down)
Definition: mythgenerictree.cpp:352
MythGenericTree::m_parent
MythGenericTree * m_parent
Definition: mythgenerictree.h:145
SortableMythGenericTreeList::m_sortType
SortType m_sortType
Definition: mythgenerictree.cpp:56
TextProperties::state
QString state
Definition: mythuibuttonlist.h:25
MythGenericTree::CreateListButton
virtual MythUIButtonListItem * CreateListButton(MythUIButtonList *list)
Definition: mythgenerictree.cpp:501
MythGenericTree::MythGenericTree
MythGenericTree(QString a_string="", int an_int=0, bool selectable_flag=false)
Definition: mythgenerictree.cpp:62
MythGenericTree::getVisibleChildAt
MythGenericTree * getVisibleChildAt(uint reference) const
Definition: mythgenerictree.cpp:290
mythgenerictree.h
MythGenericTree::deleteAllChildren
void deleteAllChildren()
Definition: mythgenerictree.cpp:454
SortableMythGenericTreeList::SetAttributeIndex
void SetAttributeIndex(int index)
Definition: mythgenerictree.cpp:20
MythGenericTree::SetVisible
void SetVisible(bool visible)
Definition: mythgenerictree.cpp:485
uint
unsigned int uint
Definition: compat.h:81
MythGenericTree::getAllChildren
QList< MythGenericTree * > * getAllChildren() const
Definition: mythgenerictree.cpp:277
MythGenericTree::findNode
MythGenericTree * findNode(QList< int > route_of_branches)
Definition: mythgenerictree.cpp:157
MythGenericTree::siblingCount
int siblingCount(void) const
Definition: mythgenerictree.cpp:260
MythGenericTree::getPosition
int getPosition(void)
Definition: mythgenerictree.cpp:206
SortableMythGenericTreeList::SortType
SortType
Definition: mythgenerictree.cpp:17
MythGenericTree::DetachParent
void DetachParent(void)
Detach this node/branch from it's parent without deleting it, it can then be reattached elsewhere or ...
Definition: mythgenerictree.cpp:117
MythGenericTree::GetState
QString GetState(const QString &name="") const
Definition: mythgenerictree.cpp:628
SortableMythGenericTreeList::SortableMythGenericTreeList
SortableMythGenericTreeList()=default
MythGenericTree::deleteNode
void deleteNode(MythGenericTree *child)
Definition: mythgenerictree.cpp:140
MythGenericTree::m_imageFilenames
InfoMap m_imageFilenames
Definition: mythgenerictree.h:133
MythGenericTree::m_stateCb
mgtCbInfo m_stateCb
Definition: mythgenerictree.h:137
MythGenericTree::removeNode
void removeNode(MythGenericTree *child)
Definition: mythgenerictree.cpp:125
MythGenericTree::getParent
MythGenericTree * getParent(void) const
Definition: mythgenerictree.cpp:371
std
Definition: mythchrono.h:23
MythGenericTree::DecVisibleCount
void DecVisibleCount()
Definition: mythgenerictree.h:113
MythGenericTree
Definition: mythgenerictree.h:27
mgtCbInfo::fn
mgtCbFn fn
Definition: mythgenerictree.h:23
MythGenericTree::findLeaf
MythGenericTree * findLeaf()
Definition: mythgenerictree.cpp:149
MythGenericTree::DisplayState
void DisplayState(const QString &state, const QString &name="")
Definition: mythgenerictree.cpp:622
MythGenericTree::m_imageCb
mgtCbInfo m_imageCb
Definition: mythgenerictree.h:136
MythGenericTree::getRoute
QList< MythGenericTree * > getRoute(void)
Definition: mythgenerictree.cpp:241
MythGenericTree::getChildById
MythGenericTree * getChildById(int an_int) const
Definition: mythgenerictree.cpp:399
MythGenericTree::m_selectedSubnode
MythGenericTree * m_selectedSubnode
Definition: mythgenerictree.h:144
MythGenericTree::getRouteById
QList< int > getRouteById(void)
Definition: mythgenerictree.cpp:213
MythGenericTree::SetText
void SetText(const QString &text, const QString &name="", const QString &state="")
Definition: mythgenerictree.cpp:518
MythGenericTree::getChildPosition
int getChildPosition(MythGenericTree *child) const
Definition: mythgenerictree.cpp:201
SortableMythGenericTreeList::SetSortType
void SetSortType(SortType stype)
Definition: mythgenerictree.cpp:19
MythGenericTree::MoveItemUpDown
void MoveItemUpDown(MythGenericTree *item, bool flag)
Definition: mythgenerictree.cpp:466
MythUIButtonList
List widget, displays list items in a variety of themeable arrangements and can trigger signals when ...
Definition: mythuibuttonlist.h:191
MythGenericTree::ensureSortFields
void ensureSortFields(void)
Definition: mythgenerictree.cpp:79
build_compdb.filename
filename
Definition: build_compdb.py:21
MythGenericTree::IncVisibleCount
void IncVisibleCount()
Definition: mythgenerictree.h:112
TextProperties::text
QString text
Definition: mythuibuttonlist.h:24
MythGenericTree::becomeSelectedChild
void becomeSelectedChild(void)
Definition: mythgenerictree.cpp:325
SortableMythGenericTreeList
Definition: mythgenerictree.cpp:13
MythGenericTree::m_visible
bool m_visible
Definition: mythgenerictree.h:148
MythGenericTree::m_subnodes
SortableMythGenericTreeList * m_subnodes
Definition: mythgenerictree.h:142
MythGenericTree::m_strings
QMap< QString, TextProperties > m_strings
Definition: mythgenerictree.h:132