1 /***************************************************************************
2  *                                                                         *
3  *   copyright : (C) 2008 The University of Toronto                        *
4  *                   netterfield@astro.utoronto.ca                         *
5  *                                                                         *
6  *   This program is free software; you can redistribute it and/or modify  *
7  *   it under the terms of the GNU General Public License as published by  *
8  *   the Free Software Foundation; either version 2 of the License, or     *
9  *   (at your option) any later version.                                   *
10  *                                                                         *
11  ***************************************************************************/
12 
13 #include "legenditemdialog.h"
14 
15 #include "legendtab.h"
16 #include "dialogpage.h"
17 #include "application.h"
18 #include "objectstore.h"
19 #include "mainwindow.h"
20 #include "document.h"
21 
22 #include "curve.h"
23 #include "curvedialog.h"
24 #include "plotrenderitem.h"
25 #include "plotitem.h"
26 #include "image.h"
27 #include "imagedialog.h"
28 
29 namespace Kst {
30 
LegendItemDialog(LegendItem * item,QWidget * parent)31 LegendItemDialog::LegendItemDialog(LegendItem *item, QWidget *parent)
32     : ViewItemDialog(item, parent), _legendItem(item) {
33 
34   _store = kstApp->mainWindow()->document()->objectStore();
35 
36   _legendTab = new LegendTab(this);
37   connect(_legendTab, SIGNAL(apply()), this, SLOT(legendChanged()));
38 
39   DialogPage *page = new DialogPage(this);
40   page->setPageTitle(tr("Legend"));
41   page->addDialogTab(_legendTab);
42   addDialogPage(page);
43 
44   setupLegend();
45 
46   setSupportsMultipleEdit(true);
47 
48   QList<LegendItem *> legends = ViewItem::getItems<LegendItem>();
49 
50   clearMultipleEditOptions();
51   foreach(LegendItem* legend, legends) {
52     addMultipleEditOption(legend->Name(), legend->descriptionTip(), legend->shortName());
53   }
54 
55   _saveAsDefault->show();
56   connect(this, SIGNAL(editMultipleMode()), this, SLOT(editMultiple()));
57   connect(this, SIGNAL(editSingleMode()), this, SLOT(editSingle()));
58   connect(this, SIGNAL(apply()), this, SLOT(slotApply()));
59 }
60 
61 
~LegendItemDialog()62 LegendItemDialog::~LegendItemDialog() {
63 }
64 
slotApply()65 void LegendItemDialog::slotApply() {
66   //FIXME: it is not clear that slotApply must be executed last.
67   // experimentally, it seems to be...
68   if (_saveAsDefault->isChecked()) {
69     _legendItem->saveAsDialogDefaults();
70   }
71 }
72 
73 
setupLegend()74 void LegendItemDialog::setupLegend() {
75   QStringList displayedRelations;
76   QStringList availableRelations;
77   QStringList allRelations;
78   QStringList displayedRelationTips;
79   QStringList availableRelationTips;
80   QStringList allRelationTips;
81 
82   CurveList curves = _store->getObjects<Curve>();
83   ImageList images = _store->getObjects<Image>();
84 
85   if (_legendItem->relations().isEmpty()) {
86     foreach (RelationPtr relation, _legendItem->plot()->renderItem(PlotRenderItem::Cartesian)->relationList()) {
87       displayedRelations.append(relation->Name());
88       displayedRelationTips.append(relation->descriptionTip());
89     }
90   } else {
91     foreach (RelationPtr relation, _legendItem->relations()) {
92       displayedRelations.append(relation->Name());
93       displayedRelationTips.append(relation->descriptionTip());
94     }
95   }
96 
97   foreach (CurvePtr curve, curves) {
98     allRelations.append(curve->Name());
99     allRelationTips.append(curve->descriptionTip());
100     if (!displayedRelations.contains(curve->Name())) {
101       availableRelations.append(curve->Name());
102       availableRelationTips.append(curve->descriptionTip());
103     }
104   }
105 
106   foreach (ImagePtr image, images) {
107     allRelations.append(image->Name());
108     allRelationTips.append(image->descriptionTip());
109     if (!displayedRelations.contains(image->Name())) {
110       availableRelations.append(image->Name());
111       availableRelationTips.append(image->descriptionTip());
112     }
113   }
114 
115   _legendTab->setDisplayedRelations(displayedRelations, displayedRelationTips);
116   _legendTab->setAvailableRelations(availableRelations, availableRelationTips);
117 
118   _legendTab->setFont(_legendItem->font());
119   _legendTab->setFontScale(_legendItem->fontScale());
120   _legendTab->setTitle(_legendItem->title());
121   _legendTab->setAutoContents(_legendItem->autoContents());
122   _legendTab->setVerticalDisplay(_legendItem->verticalDisplay());
123   _legendTab->setColor(_legendItem->legendColor());
124 
125 }
126 
editMultiple()127 void LegendItemDialog::editMultiple() {
128   _legendTab->clearTabValues();
129   _legendTab->setSingle(false);
130 }
131 
editSingle()132 void LegendItemDialog::editSingle() {
133   _legendTab->setSingle(true);
134   setupLegend();
135 }
136 
legendChanged()137 void LegendItemDialog::legendChanged() {
138   if (editMode() == Multiple) {
139     foreach(ViewItem* item, selectedMultipleEditObjects()) {
140       LegendItem* legendItem = (LegendItem*)item;
141       saveLegend(legendItem, false);
142     }
143   } else {
144     saveLegend(_legendItem, true);
145   }
146 }
147 
saveLegend(LegendItem * legendItem,bool save_relations)148 void LegendItemDialog::saveLegend(LegendItem *legendItem, bool save_relations) {
149   legendItem->setLegendFont(_legendTab->font(legendItem->font()));
150   legendItem->setFontScale(_legendTab->fontScale());
151   legendItem->setTitle(_legendTab->title());
152   legendItem->setAutoContents(_legendTab->autoContents());
153   legendItem->setVerticalDisplay(_legendTab->verticalDisplay());
154   legendItem->setLegendColor(_legendTab->legendColor());
155 
156   QStringList displayedRelations = _legendTab->displayedRelations();
157 
158   if (save_relations) {
159     RelationList newRelations;
160     foreach (const QString &relationName, displayedRelations) {
161       if (RelationPtr relation = kst_cast<Relation>(_store->retrieveObject(relationName))) {
162         newRelations.append(relation);
163       }
164     }
165     legendItem->setRelations(newRelations);
166   }
167   legendItem->update();
168 }
169 
170 }
171 
172 // vim: ts=2 sw=2 et
173