• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdesdk API Reference
  • KDE Home
  • Contact Us
 

okteta

  • sources
  • kde-4.12
  • kdesdk
  • okteta
  • kasten
  • controllers
  • view
  • structures
  • settings
structureaddremovewidget.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of the Okteta Kasten Framework, made within the KDE community.
3  *
4  * Copyright 2009, 2012 Alex Richardson <alex.richardson@gmx.de>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) version 3, or any
10  * later version accepted by the membership of KDE e.V. (or its
11  * successor approved by the membership of KDE e.V.), which shall
12  * act as a proxy defined in Section 6 of version 3 of the license.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
21  */
22 #include "structureaddremovewidget.h"
23 #include "../structtool.h"
24 #include "../structuresmanager.h"
25 #include "../structuredefinitionfile.h"
26 
27 #include <KPushButton>
28 #include <QLabel>
29 #include <QLayout>
30 #include <QTreeWidget>
31 #include <QTreeWidgetItem>
32 
33 #include <QRegExp>
34 #include <KLocale>
35 #include <KDebug>
36 #include <KConfigDialogManager>
37 
38 using namespace Kasten2;
39 StructureAddRemoveWidget::StructureAddRemoveWidget(const QStringList& selected, Kasten2::StructTool* tool, QWidget* parent) :
40  QWidget(parent), mTool(tool)
41 {
42  QHBoxLayout* baseLayout;
43  QVBoxLayout* tree1Layout;
44  QVBoxLayout* tree2Layout;
45  QVBoxLayout* leftRightLayout;
46  QVBoxLayout* upDownLayout;
47 
48  baseLayout = new QHBoxLayout();
49 
50  tree1Layout = new QVBoxLayout();
51  mTree1Label = new QLabel(i18nc("@info:label", "Installed structures:"), this);
52  tree1Layout->addWidget(mTree1Label);
53  mTreeAvailable = new QTreeWidget(this);
54  mTreeAvailable->setHeaderHidden(true);
55  mTreeAvailable->setSelectionMode(QAbstractItemView::ExtendedSelection);
56  mTreeAvailable->setColumnCount(2);
57  mTreeAvailable->setColumnHidden(1, true);
58  tree1Layout->addWidget(mTreeAvailable);
59 
60  tree2Layout = new QVBoxLayout();
61  mTree2Label = new QLabel(i18nc("@info:label", "Used structures:"), this);
62  tree2Layout->addWidget(mTree2Label);
63  mTreeSelected = new QTreeWidget(this);
64  mTreeSelected->setHeaderHidden(true);
65  mTreeSelected->setSelectionMode(QAbstractItemView::ExtendedSelection);
66  mTreeSelected->setColumnCount(2);
67  mTreeSelected->setColumnHidden(1, true);
68  tree2Layout->addWidget(mTreeSelected);
69 
70  leftRightLayout = new QVBoxLayout();
71  leftRightLayout->addStretch();
72  mRightButton = new KPushButton(KIcon(QLatin1String("arrow-right")), QString(), this);
73  leftRightLayout->addWidget(mRightButton);
74  mLeftButton = new KPushButton(KIcon(QLatin1String("arrow-left")), QString(), this);
75  leftRightLayout->addWidget(mLeftButton);
76  leftRightLayout->addStretch();
77 
78  upDownLayout = new QVBoxLayout();
79  upDownLayout->addStretch();
80  mUpButton = new KPushButton(KIcon(QLatin1String("arrow-up")), QString(), this);
81  upDownLayout->addWidget(mUpButton);
82  mDownButton = new KPushButton(KIcon(QLatin1String("arrow-down")), QString(), this);
83  upDownLayout->addWidget(mDownButton);
84  upDownLayout->addStretch();
85 
86  baseLayout->addLayout(tree1Layout);
87  baseLayout->addLayout(leftRightLayout);
88  baseLayout->addLayout(tree2Layout);
89  baseLayout->addLayout(upDownLayout);
90  setLayout(baseLayout);
91 
92  connect(mLeftButton, SIGNAL(pressed()), SLOT(moveLeft()));
93  connect(mRightButton, SIGNAL(pressed()), SLOT(moveRight()));
94  connect(mUpButton, SIGNAL(pressed()), SLOT(moveUp()));
95  connect(mDownButton, SIGNAL(pressed()), SLOT(moveDown()));
96 
97  buildAvailableList();
98 
99  //already loaded defs:
100  QRegExp regex(QLatin1String("'(.+)':'(.+)'"));
101  foreach(const QString& s, selected)
102  {
103  int pos = regex.indexIn(s);
104  if (pos > -1)
105  {
106  QString pluginName = regex.cap(1);
107  QString structName = regex.cap(2);
108  if (structName == QLatin1String("*")) {
109  //add all of them
110  for (int i = 0; i < mTreeAvailable->topLevelItemCount(); i++)
111  {
112  QTreeWidgetItem* avail = mTreeAvailable->topLevelItem(i);
113  if (avail->text(0) != pluginName)
114  continue;
115  for (int i = 0; i < avail->childCount(); i++)
116  {
117  QTreeWidgetItem* selStruct = avail->child(i);
118  QTreeWidgetItem* item = new QTreeWidgetItem(mTreeSelected,
119  QStringList() << selStruct->text(0) << pluginName);
120  mTreeSelected->addTopLevelItem(item);
121  }
122  break;
123  }
124  }
125  else {
126  QTreeWidgetItem* item = new QTreeWidgetItem(mTreeSelected,
127  QStringList() << structName << pluginName);
128  mTreeSelected->addTopLevelItem(item);
129  }
130  }
131  }
132  syncData();
133 }
134 
135 StructureAddRemoveWidget::~StructureAddRemoveWidget()
136 {
137 }
138 
139 void StructureAddRemoveWidget::buildAvailableList()
140 {
141  const QList<StructureDefinitionFile*> loadedDefs = mTool->manager()->structureDefs();
142  QList<QTreeWidgetItem*> availableItems;
143  foreach(StructureDefinitionFile* def,loadedDefs)
144  {
145  if (!def->isValid())
146  continue;
147  QString pluginName = def->pluginInfo().pluginName();
148  if (!def->pluginInfo().isPluginEnabled())
149  continue;
150  QTreeWidgetItem* item = new QTreeWidgetItem(mTreeAvailable,
151  QStringList() << def->pluginInfo().pluginName() << pluginName);
152  foreach(const QString& name, def->structureNames())
153  {
154  QTreeWidgetItem* subItem = new QTreeWidgetItem(item,
155  QStringList() << name << pluginName);
156  item->addChild(subItem);
157  }
158  availableItems.append(item);
159  }
160  mTreeAvailable->addTopLevelItems(availableItems);
161 
162 }
163 
164 void StructureAddRemoveWidget::moveLeft()
165 {
166  QList<QTreeWidgetItem*> selected = mTreeSelected->selectedItems();
167  bool changed = false;
168  foreach(QTreeWidgetItem* item,selected)
169  {
170  delete mTreeSelected->takeTopLevelItem(
171  mTreeSelected->indexOfTopLevelItem(item));
172  changed = true;
173  }
174  if (changed)
175  syncData();
176 }
177 
178 void StructureAddRemoveWidget::moveRight()
179 {
180  QList<QTreeWidgetItem*> selected = mTreeAvailable->selectedItems();
181  bool changed = false;
182  foreach(const QTreeWidgetItem* item,selected)
183  {
184  if (!item->parent())
185  continue; //maybe sometime add all subitems
186  QTreeWidgetItem* moveOver = new QTreeWidgetItem(mTreeSelected,
187  QStringList() << item->text(0) << item->text(1));
188  //item name then parent name then path
189  mTreeSelected->addTopLevelItem(moveOver);
190  changed = true;
191  }
192  if (changed)
193  syncData();
194 
195 }
196 
197 void StructureAddRemoveWidget::moveUp()
198 {
199  QList<QTreeWidgetItem*> selected = mTreeSelected->selectedItems();
200  bool changed = false;
201  int firstIndex = -1;
202  foreach(QTreeWidgetItem* item,selected)
203  {
204  int idx = mTreeSelected->indexOfTopLevelItem(item);
205  int newIdx = qMax(0, idx - 1);
206  mTreeSelected ->insertTopLevelItem(newIdx,
207  mTreeSelected->takeTopLevelItem(idx));
208  //only first index
209  firstIndex = firstIndex == -1 ? newIdx : firstIndex;
210  }
211  if (changed)
212  syncData();
213  if (firstIndex != -1)
214  mTreeSelected->setCurrentItem(mTreeSelected->topLevelItem(firstIndex));
215 }
216 
217 void StructureAddRemoveWidget::moveDown()
218 {
219  QList<QTreeWidgetItem*> selected = mTreeSelected->selectedItems();
220  bool changed = false;
221  int firstIndex = -1;
222  int maxItmCount = mTreeSelected->topLevelItemCount();
223  foreach(QTreeWidgetItem* item,selected)
224  {
225  int idx = mTreeSelected->indexOfTopLevelItem(item);
226  int newIdx = qMin(idx + 1, maxItmCount - 1);
227  mTreeSelected ->insertTopLevelItem(newIdx,
228  mTreeSelected->takeTopLevelItem(idx));
229  //only first index
230  firstIndex = firstIndex == -1 ? newIdx : firstIndex;
231  }
232  if (changed)
233  syncData();
234  if (firstIndex != -1)
235  mTreeSelected->setCurrentItem(mTreeSelected->topLevelItem(firstIndex));
236 }
237 void StructureAddRemoveWidget::syncData()
238 {
239  QStringList strings;
240  for (int i = 0; i < mTreeSelected->topLevelItemCount(); ++i)
241  {
242  QTreeWidgetItem* item = mTreeSelected->topLevelItem(i);
243  QString dataStr = QString::fromLatin1("\'%1\':\'%2\'").arg(item->text(1), item->text(0));
244  strings.append(dataStr);
245  }
246  kDebug() << "selection changed to: " << strings;
247  mValues = strings;
248 }
249 
250 void StructureAddRemoveWidget::updateAvailable()
251 {
252  //rebuild available tree
253  mTreeAvailable->clear();
254  buildAvailableList();
255 
256  //remove any structs that references not loaded files
257  QStringList plugins;
258  const QList<StructureDefinitionFile*> loadedDefs = mTool->manager()->structureDefs();
259  foreach(const StructureDefinitionFile* def, loadedDefs)
260  {
261  QString pluginName = def->pluginInfo().pluginName();
262  if (def->pluginInfo().isValid() && !def->pluginInfo().isPluginEnabled())
263  continue;
264  plugins << pluginName;
265  }
266  bool changed = false;
267  QList<QTreeWidgetItem*> toRemove;
268  kDebug() << "paths = " << plugins;
269  for (int i = 0; i < mTreeSelected->topLevelItemCount(); ++i)
270  {
271  QTreeWidgetItem* item = mTreeSelected->topLevelItem(i);
272  //text(1) is plugin name
273  if (!plugins.contains(item->text(1)))
274  {
275  kDebug() << "removed item: " << QString::fromLatin1("\'%1\':\'%2\'").arg(item->text(1),
276  item->text(0));
277 
278  changed = true;
279  toRemove.append(item);
280  }
281  else
282  {
283  kDebug() << "item " << QString::fromLatin1("\'%1\':\'%2\'").arg(item->text(1),
284  item->text(0)) << "still loaded -> keep";
285  }
286  }
287  foreach(QTreeWidgetItem* itm,toRemove)
288  {
289  kDebug() << "item " << QString::fromLatin1("\'%1\':\'%2\'").arg(itm->text(1),
290  itm->text(0)) << "removed";
291  delete mTreeSelected->takeTopLevelItem(mTreeSelected->indexOfTopLevelItem(itm));
292  }
293  if (changed)
294  syncData();
295 }
StructureAddRemoveWidget::~StructureAddRemoveWidget
~StructureAddRemoveWidget()
Definition: structureaddremovewidget.cpp:135
Kasten2::StructureDefinitionFile
This class takes care of all the XML parsing and stores the result.
Definition: structuredefinitionfile.h:43
QWidget
Kasten2::StructuresManager::structureDefs
const QList< StructureDefinitionFile * > structureDefs() const
Definition: structuresmanager.h:53
StructureAddRemoveWidget::updateAvailable
void updateAvailable()
Definition: structureaddremovewidget.cpp:250
Kasten2::StructureDefinitionFile::isValid
bool isValid() const
Definition: structuredefinitionfile.h:73
Kasten2::StructureDefinitionFile::structureNames
QStringList structureNames() const
Definition: structuredefinitionfile.cpp:86
StructureAddRemoveWidget::moveUp
void moveUp()
Definition: structureaddremovewidget.cpp:197
structureaddremovewidget.h
Kasten2::StructureDefinitionFile::pluginInfo
const KPluginInfo & pluginInfo() const
Definition: structuredefinitionfile.h:68
Kasten2::StructTool::manager
StructuresManager * manager() const
Definition: structtool.cpp:436
StructureAddRemoveWidget::moveRight
void moveRight()
Definition: structureaddremovewidget.cpp:178
StructureAddRemoveWidget::moveLeft
void moveLeft()
Definition: structureaddremovewidget.cpp:164
StructureAddRemoveWidget::moveDown
void moveDown()
Definition: structureaddremovewidget.cpp:217
StructureAddRemoveWidget::StructureAddRemoveWidget
StructureAddRemoveWidget(const QStringList &selected, Kasten2::StructTool *tool, QWidget *parent=0)
Definition: structureaddremovewidget.cpp:39
Kasten2::StructTool
Definition: structtool.h:49
QList
Definition: bookmarkable.h:29
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 23:04:09 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

okteta

Skip menu "okteta"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdesdk API Reference

Skip menu "kdesdk API Reference"
  • kapptemplate
  • kcachegrind
  • kompare
  • lokalize
  • okteta
  • umbrello
  •   umbrello

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal