1 // Copyright (C) 2012-2019 The VPaint Developers.
2 // See the COPYRIGHT file at the top-level directory of this distribution
3 // and at https://github.com/dalboris/vpaint/blob/master/COPYRIGHT
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 
17 #include "ViewSettings.h"
18 
ViewSettings()19 ViewSettings::ViewSettings() :
20     // Display
21     zoom_(1.0),
22     displayMode_(ILLUSTRATION),
23     outlineOnly_(false),
24     drawBackground_(true),
25     drawCursor_(true),
26     isMainDrawing_(true),
27     vertexTopologySize_(5),
28     edgeTopologyWidth_(3),
29     drawTopologyFaces_(false),
30     screenRelative_(true),
31 
32     time_(),
33 
34     // Onion skinning
35     onionSkinningIsEnabled_(false),
36     areOnionSkinsPickable_(true),
37     numOnionSkinsBefore_(3),
38     numOnionSkinsAfter_(3),
39     onionSkinsTimeOffset_(Time(1)),
40     onionSkinsXOffset_(0.0),
41     onionSkinsYOffset_(0.0),
42     onionSkinsTransparencyRatio_(1.0)
43 {
44 }
45 
~ViewSettings()46 ViewSettings::~ViewSettings()
47 {
48 }
49 
50 
time() const51 Time ViewSettings::time() const
52 {
53     return time_;
54 }
55 
setTime(const Time & t)56 void ViewSettings::setTime(const Time & t)
57 {
58     time_ = t;
59 }
60 
61 // Zoom level
zoom() const62 double ViewSettings::zoom() const
63 {
64     return zoom_;
65 }
setZoom(double newValue)66 void ViewSettings::setZoom(double newValue)
67 {
68     if(zoom_ != newValue)
69     {
70         zoom_ = newValue;
71     }
72 }
73 
displayMode() const74 ViewSettings::DisplayMode ViewSettings::displayMode() const
75 {
76     return displayMode_;
77 }
setDisplayMode(DisplayMode mode)78 void ViewSettings::setDisplayMode(DisplayMode mode)
79 {
80     if(displayMode_ != mode)
81     {
82         displayMode_ = mode;
83     }
84 }
85 
toggleOutline()86 void ViewSettings::toggleOutline()
87 {
88     if(displayMode() == ILLUSTRATION)
89     {
90         if(outlineOnly_)
91             setDisplayMode(OUTLINE);
92         else
93             setDisplayMode(ILLUSTRATION_OUTLINE);
94     }
95     else
96         setDisplayMode(ILLUSTRATION);
97 }
98 
toggleOutlineOnly()99 void ViewSettings::toggleOutlineOnly()
100 {
101     if(displayMode() != ILLUSTRATION)
102     {
103         outlineOnly_ = !outlineOnly_;
104         if(outlineOnly_)
105             setDisplayMode(OUTLINE);
106         else
107             setDisplayMode(ILLUSTRATION_OUTLINE);
108     }
109 }
110 
drawCursor() const111 bool ViewSettings::drawCursor() const
112 {
113     return drawCursor_;
114 }
setDrawCursor(bool newValue)115 void ViewSettings::setDrawCursor(bool newValue)
116 {
117     drawCursor_ = newValue;
118 }
119 
isMainDrawing() const120 bool ViewSettings::isMainDrawing() const
121 {
122     return isMainDrawing_;
123 }
setMainDrawing(bool newValue)124 void ViewSettings::setMainDrawing(bool newValue)
125 {
126     if(isMainDrawing_ != newValue)
127     {
128         isMainDrawing_ = newValue;
129     }
130 }
131 
vertexTopologySize() const132 int ViewSettings::vertexTopologySize() const
133 {
134     return vertexTopologySize_;
135 }
setVertexTopologySize(int newValue)136 void ViewSettings::setVertexTopologySize(int newValue)
137 {
138     if(vertexTopologySize_ != newValue)
139     {
140         vertexTopologySize_ = newValue;
141     }
142 }
143 
edgeTopologyWidth() const144 int ViewSettings::edgeTopologyWidth() const
145 {
146     return edgeTopologyWidth_;
147 }
setEdgeTopologyWidth(int newValue)148 void ViewSettings::setEdgeTopologyWidth(int newValue)
149 {
150     if(edgeTopologyWidth_ != newValue)
151     {
152         edgeTopologyWidth_ = newValue;
153     }
154 }
155 
drawTopologyFaces() const156 bool ViewSettings::drawTopologyFaces() const
157 {
158     return drawTopologyFaces_;
159 }
setDrawTopologyFaces(bool newValue)160 void ViewSettings::setDrawTopologyFaces(bool newValue)
161 {
162     if(drawTopologyFaces_ != newValue)
163     {
164         drawTopologyFaces_ = newValue;
165     }
166 }
167 
screenRelative() const168 bool ViewSettings::screenRelative() const
169 {
170     return screenRelative_;
171 }
setScreenRelative(bool newValue)172 void ViewSettings::setScreenRelative(bool newValue)
173 {
174     if(screenRelative_ != newValue)
175     {
176         screenRelative_ = newValue;
177     }
178 }
179 
180 
181 
182 
183 
onionSkinningIsEnabled() const184 bool ViewSettings::onionSkinningIsEnabled() const
185 {
186     return onionSkinningIsEnabled_;
187 }
setOnionSkinningIsEnabled(bool newValue)188 void ViewSettings::setOnionSkinningIsEnabled(bool newValue)
189 {
190     onionSkinningIsEnabled_ = newValue;
191 }
192 
areOnionSkinsPickable() const193 bool ViewSettings::areOnionSkinsPickable() const
194 {
195     return areOnionSkinsPickable_;
196 }
setAreOnionSkinsPickable(bool newValue)197 void ViewSettings::setAreOnionSkinsPickable(bool newValue)
198 {
199     areOnionSkinsPickable_ = newValue;
200 }
201 
numOnionSkinsBefore() const202 int ViewSettings::numOnionSkinsBefore() const
203 {
204     return numOnionSkinsBefore_;
205 }
setNumOnionSkinsBefore(int newValue)206 void ViewSettings::setNumOnionSkinsBefore(int newValue)
207 {
208     numOnionSkinsBefore_ = newValue;
209 }
210 
numOnionSkinsAfter() const211 int ViewSettings::numOnionSkinsAfter() const
212 {
213     return numOnionSkinsAfter_;
214 }
setNumOnionSkinsAfter(int newValue)215 void ViewSettings::setNumOnionSkinsAfter(int newValue)
216 {
217     numOnionSkinsAfter_ = newValue;
218 }
219 
onionSkinsTimeOffset() const220 Time ViewSettings::onionSkinsTimeOffset() const
221 {
222     return onionSkinsTimeOffset_;
223 }
setOnionSkinsTimeOffset(Time newValue)224 void ViewSettings::setOnionSkinsTimeOffset(Time newValue)
225 {
226     onionSkinsTimeOffset_ = newValue;
227 }
228 
setOnionSkinsTimeOffset(double newValue)229 void ViewSettings::setOnionSkinsTimeOffset(double newValue)
230 {
231     int intValue = newValue;
232     if(newValue == (double) intValue)
233         onionSkinsTimeOffset_ = Time(intValue); // Exact frame
234     else
235         onionSkinsTimeOffset_ = Time(newValue); // float time
236 }
237 
onionSkinsXOffset() const238 double ViewSettings::onionSkinsXOffset() const
239 {
240     return onionSkinsXOffset_;
241 }
setOnionSkinsXOffset(double newValue)242 void ViewSettings::setOnionSkinsXOffset(double newValue)
243 {
244     onionSkinsXOffset_ = newValue;
245 }
246 
onionSkinsYOffset() const247 double ViewSettings::onionSkinsYOffset() const
248 {
249     return onionSkinsYOffset_;
250 }
setOnionSkinsYOffset(double newValue)251 void ViewSettings::setOnionSkinsYOffset(double newValue)
252 {
253     onionSkinsYOffset_ = newValue;
254 }
255 
onionSkinsTransparencyRatio() const256 double ViewSettings::onionSkinsTransparencyRatio() const
257 {
258     return onionSkinsTransparencyRatio_;
259 }
setOnionSkinsTransparencyRatio(double newValue)260 void ViewSettings::setOnionSkinsTransparencyRatio(double newValue)
261 {
262     onionSkinsTransparencyRatio_ = newValue;
263 }
264 
265 #include <QWidgetAction>
266 #include <QMenuBar>
267 #include <QMenu>
268 #include <QLabel>
269 #include <QComboBox>
270 #include <QPushButton>
271 #include <QLineEdit>
272 
ViewSettingsWidget(ViewSettings & viewSettings,QWidget * parent)273 ViewSettingsWidget::ViewSettingsWidget(ViewSettings & viewSettings, QWidget * parent) :
274     QWidget(parent),
275     viewSettings_(viewSettings),
276     ignoreZoomValueChangedSignal_(false)
277 {
278     // Set style
279     setCursor(Qt::ArrowCursor);
280 
281     zoomSpinBox_ = new QSpinBox();
282     zoomSpinBox_->setMaximumWidth(70);
283     zoomSpinBox_->setRange(1,1e7);
284     zoomSpinBox_->setValue(100);
285     zoomSpinBox_->setSuffix(" %");
286     zoomSpinBox_->setAlignment(Qt::AlignCenter);
287 
288     QPushButton * goToPreviousFrameButton = new QPushButton();
289     int frameButtonWidth = 40;
290     goToPreviousFrameButton->setMaximumWidth(frameButtonWidth);
291     goToPreviousFrameButton->setIcon(QIcon(":/images/go-first-view.png"));
292 
293     frameLineEdit_ = new QLineEdit();
294     frameLineEdit_->setMaximumWidth(50);
295     frameLineEdit_->setAlignment(Qt::AlignCenter);
296 
297     QPushButton * goToNextFrameButton = new QPushButton();
298     goToNextFrameButton->setMaximumWidth(frameButtonWidth);
299     goToNextFrameButton->setIcon(QIcon(":/images/go-last-view.png"));
300 
301     // Menu to change the display mode and options
302 
303     QSize buttonSize(68, 48);
304     QSize buttonIconSize(24, 24);
305 
306     QHBoxLayout * displayModeLayout = new QHBoxLayout();
307     displayModeLayout->setMargin(0);
308     displayModeLayout->setSpacing(0);
309 
310     QVBoxLayout * displayModeLayoutLeftColumn = new QVBoxLayout();
311     displayModeLayoutLeftColumn->setMargin(0);
312     displayModeLayoutLeftColumn->setSpacing(0);
313 
314     QFormLayout * displayModeLayoutRightColumn = new QFormLayout();
315     displayModeLayoutRightColumn->setMargin(10);
316     displayModeLayoutRightColumn->setSpacing(10);
317 
318     displayModeButton_Normal_ = new QPushButton();
319     displayModeButton_Normal_->setToolTip("Normal display mode");
320     displayModeButton_Normal_->setIcon(QIcon(":images/display-mode-normal.png"));
321     displayModeButton_Normal_->setIconSize(buttonIconSize);
322     displayModeButton_Normal_->setFixedSize(buttonSize);
323     displayModeButton_Normal_->setAutoExclusive(true);
324     displayModeButton_Normal_->setCheckable(true);
325     displayModeButton_Normal_->setChecked(true);
326 
327     displayModeButton_NormalOutline_ = new QPushButton();
328     displayModeButton_NormalOutline_->setToolTip("Normal+Outline display mode");
329     displayModeButton_NormalOutline_->setIcon(QIcon(":images/display-mode-normal-outline.png"));
330     displayModeButton_NormalOutline_->setIconSize(buttonIconSize);
331     displayModeButton_NormalOutline_->setFixedSize(buttonSize);
332     displayModeButton_NormalOutline_->setAutoExclusive(true);
333     displayModeButton_NormalOutline_->setCheckable(true);
334     displayModeButton_NormalOutline_->setChecked(false);
335 
336     displayModeButton_Outline_ = new QPushButton();
337     displayModeButton_Outline_->setToolTip("Outline display mode");
338     displayModeButton_Outline_->setIcon(QIcon(":images/display-mode-outline.png"));
339     displayModeButton_Outline_->setIconSize(buttonIconSize);
340     displayModeButton_Outline_->setFixedSize(buttonSize);
341     displayModeButton_Outline_->setAutoExclusive(true);
342     displayModeButton_Outline_->setCheckable(true);
343     displayModeButton_Outline_->setChecked(false);
344 
345     displayModeLayoutLeftColumn->addWidget(displayModeButton_Normal_);
346     displayModeLayoutLeftColumn->addWidget(displayModeButton_NormalOutline_);
347     displayModeLayoutLeftColumn->addWidget(displayModeButton_Outline_);
348     displayModeLayoutLeftColumn->addStretch();
349 
350 
351     vertexTopologySize_ = new QSlider();
352     vertexTopologySize_->setOrientation(Qt::Horizontal);
353     vertexTopologySize_->setRange(0,100);
354     displayModeLayoutRightColumn->addRow(tr("Vertex outline size"), vertexTopologySize_);
355 
356     edgeTopologyWidth_ = new QSlider();
357     edgeTopologyWidth_->setOrientation(Qt::Horizontal);
358     edgeTopologyWidth_->setRange(0,100);
359     displayModeLayoutRightColumn->addRow(tr("Edge outline width"), edgeTopologyWidth_);
360 
361     drawTopologyFaces_ = new QCheckBox();
362     displayModeLayoutRightColumn->addRow(tr("Display faces in outline mode"), drawTopologyFaces_);
363 
364     QWidget * displayModeWidget = new QWidget();
365     displayModeLayout->addLayout(displayModeLayoutLeftColumn);
366     displayModeLayout->addLayout(displayModeLayoutRightColumn);
367     displayModeWidget->setLayout(displayModeLayout);
368 
369     QMenu * displayModeMenu = new QMenu();
370     QWidgetAction * displayModeWidgetAction = new QWidgetAction(this);
371     displayModeWidgetAction->setDefaultWidget(displayModeWidget);
372     displayModeMenu->addAction(displayModeWidgetAction);
373 
374 
375     // Button to show/hide the display mode menu
376 
377     int dropdownButtonWidth = 60;
378     displayModeButton_ = new QPushButton();
379     displayModeButton_->setToolTip("Display mode settings");
380     displayModeButton_->setIcon(QIcon(":images/display-mode-normal.png"));
381     displayModeButton_->setMaximumWidth(dropdownButtonWidth);
382     displayModeButton_->setMenu(displayModeMenu);
383 
384 
385     // Menu to change onion skinning options
386 
387     QHBoxLayout * onionSkinningLayout = new QHBoxLayout();
388     onionSkinningLayout->setMargin(0);
389     onionSkinningLayout->setSpacing(0);
390 
391     QVBoxLayout * onionSkinningLayoutLeftColumn = new QVBoxLayout();
392     onionSkinningLayoutLeftColumn->setMargin(0);
393     onionSkinningLayoutLeftColumn->setSpacing(0);
394 
395     QFormLayout * onionSkinningLayoutRightColumn = new QFormLayout();
396     onionSkinningLayoutRightColumn->setMargin(10);
397     onionSkinningLayoutRightColumn->setSpacing(10);
398 
399     QFormLayout * onionSkinningLayoutRightColumn2 = new QFormLayout();
400     onionSkinningLayoutRightColumn2->setMargin(10);
401     onionSkinningLayoutRightColumn2->setSpacing(10);
402 
403     onionSkinningButton_Off_ = new QPushButton();
404     onionSkinningButton_Off_->setToolTip("Onion skinning off");
405     onionSkinningButton_Off_->setIcon(QIcon(":images/onion-skinning-off.png"));
406     onionSkinningButton_Off_->setIconSize(buttonIconSize);
407     onionSkinningButton_Off_->setFixedSize(buttonSize);
408     onionSkinningButton_Off_->setAutoExclusive(true);
409     onionSkinningButton_Off_->setCheckable(true);
410     onionSkinningButton_Off_->setChecked(true);
411 
412     onionSkinningButton_On_ = new QPushButton();
413     onionSkinningButton_On_->setToolTip("Onion skinning on");
414     onionSkinningButton_On_->setIcon(QIcon(":images/onion-skinning-on.png"));
415     onionSkinningButton_On_->setIconSize(buttonIconSize);
416     onionSkinningButton_On_->setFixedSize(buttonSize);
417     onionSkinningButton_On_->setAutoExclusive(true);
418     onionSkinningButton_On_->setCheckable(true);
419     onionSkinningButton_On_->setChecked(false);
420 
421     onionSkinningLayoutLeftColumn->addWidget(onionSkinningButton_Off_);
422     onionSkinningLayoutLeftColumn->addWidget(onionSkinningButton_On_);
423     onionSkinningLayoutLeftColumn->addStretch();
424 
425     numOnionSkinsBefore_ = new QSpinBox();
426     numOnionSkinsBefore_->setRange(0,100);
427     onionSkinningLayoutRightColumn->addRow(tr("Num skins before"), numOnionSkinsBefore_);
428 
429     numOnionSkinsAfter_ = new QSpinBox();
430     numOnionSkinsAfter_->setRange(0,100);
431     onionSkinningLayoutRightColumn->addRow(tr("Num skins after"), numOnionSkinsAfter_);
432 
433     areOnionSkinsPickable_ = new QCheckBox();
434     onionSkinningLayoutRightColumn->addRow(tr("Are skins pickable"), areOnionSkinsPickable_);
435 
436     onionSkinsTimeOffset_ = new QDoubleSpinBox();
437     onionSkinsTimeOffset_->setRange(-100,100);
438     onionSkinsTimeOffset_->setDecimals(2);
439     onionSkinningLayoutRightColumn2->addRow(tr("Skins frame offset"), onionSkinsTimeOffset_);
440 
441     onionSkinsXOffset_ = new QDoubleSpinBox();
442     onionSkinsXOffset_->setRange(-10000,10000);
443     onionSkinsXOffset_->setDecimals(2);
444     onionSkinningLayoutRightColumn2->addRow(tr("Skin X offset"), onionSkinsXOffset_);
445 
446     onionSkinsYOffset_ = new QDoubleSpinBox();
447     onionSkinsYOffset_->setRange(-10000,10000);
448     onionSkinsYOffset_->setDecimals(2);
449     onionSkinningLayoutRightColumn2->addRow(tr("Skin Y offset"), onionSkinsYOffset_);
450 
451     QWidget * onionSkinningWidget = new QWidget();
452     onionSkinningLayout->addLayout(onionSkinningLayoutLeftColumn);
453     onionSkinningLayout->addLayout(onionSkinningLayoutRightColumn);
454     onionSkinningLayout->addLayout(onionSkinningLayoutRightColumn2);
455     onionSkinningWidget->setLayout(onionSkinningLayout);
456 
457     QMenu * onionSkinningMenu = new QMenu();
458     QWidgetAction * onionSkinningWidgetAction = new QWidgetAction(this);
459     onionSkinningWidgetAction->setDefaultWidget(onionSkinningWidget);
460     onionSkinningMenu->addAction(onionSkinningWidgetAction);
461 
462 
463     // Button to show/hide the onion skinning menu
464 
465     onionSkinningButton_ = new QPushButton();
466     onionSkinningButton_->setToolTip("Onion skinning settings");
467     onionSkinningButton_->setIcon(QIcon(":images/display-mode-normal.png"));
468     onionSkinningButton_->setMaximumWidth(dropdownButtonWidth);
469     onionSkinningButton_->setMenu(onionSkinningMenu);
470 
471 
472     // Horizontal layout
473     int spacing = 5;
474     QHBoxLayout * hlayout = new QHBoxLayout();
475     hlayout->setContentsMargins(spacing, spacing, spacing, spacing);
476     hlayout->setSpacing(0);
477     hlayout->addWidget(zoomSpinBox_);
478     hlayout->addSpacing(spacing);
479     hlayout->addWidget(goToPreviousFrameButton);
480     hlayout->addWidget(frameLineEdit_);
481     hlayout->addWidget(goToNextFrameButton);
482     hlayout->addSpacing(spacing);
483     hlayout->addWidget(displayModeButton_);
484     hlayout->addSpacing(spacing);
485     hlayout->addWidget(onionSkinningButton_);
486     hlayout->addStretch();
487     setLayout(hlayout);
488 
489 
490     // ----------------- Backend/Gui connections -----------------
491 
492     updateWidgetFromSettings(); // Might not be an exact match due to widget min/max values
493     updateSettingsFromWidget(); // Make sure its an exact match
494 
495     /* THE FOLLOWING ARE NOT IMPLEMENTED OR DEEMED IRRELEVANT
496     connect(screenRelative_, SIGNAL(stateChanged(int)), this, SLOT(updateSettingsFromWidget()));
497     connect(onionSkinsTransparencyRatio_, SIGNAL(valueChanged(double)), this, SLOT(updateSettingsFromWidget()));
498     */
499 
500     // Widget -> Settings connection
501     connect(zoomSpinBox_, SIGNAL(valueChanged(int)), this, SLOT(processZoomValueChangedSignal(int)));
502     connect(frameLineEdit_, SIGNAL(returnPressed()), this,  SLOT(updateSettingsFromWidget()));
503     connect(goToPreviousFrameButton, SIGNAL(clicked(bool)), this, SLOT(decrFrame()));
504     connect(goToNextFrameButton, SIGNAL(clicked(bool)), this, SLOT(incrFrame()));
505 
506     connect(displayModeButton_Normal_, SIGNAL(clicked(bool)), this, SLOT(updateSettingsFromWidget()));
507     connect(displayModeButton_NormalOutline_, SIGNAL(clicked(bool)), this, SLOT(updateSettingsFromWidget()));
508     connect(displayModeButton_Outline_, SIGNAL(clicked(bool)), this, SLOT(updateSettingsFromWidget()));
509     connect(onionSkinningButton_Off_, SIGNAL(clicked(bool)), this, SLOT(updateSettingsFromWidget()));
510     connect(onionSkinningButton_On_, SIGNAL(clicked(bool)), this, SLOT(updateSettingsFromWidget()));
511 
512     connect(vertexTopologySize_, SIGNAL(valueChanged(int)), this, SLOT(updateSettingsFromWidget()));
513     connect(edgeTopologyWidth_, SIGNAL(valueChanged(int)), this, SLOT(updateSettingsFromWidget()));
514     connect(drawTopologyFaces_, SIGNAL(stateChanged(int)), this, SLOT(updateSettingsFromWidget()));
515 
516     connect(areOnionSkinsPickable_, SIGNAL(stateChanged(int)), this, SLOT(updateSettingsFromWidget()));
517     connect(numOnionSkinsBefore_, SIGNAL(valueChanged(int)), this, SLOT(updateSettingsFromWidget()));
518     connect(numOnionSkinsAfter_, SIGNAL(valueChanged(int)), this, SLOT(updateSettingsFromWidget()));
519     connect(onionSkinsTimeOffset_, SIGNAL(valueChanged(double)), this, SLOT(updateSettingsFromWidget()));
520     connect(onionSkinsXOffset_, SIGNAL(valueChanged(double)), this, SLOT(updateSettingsFromWidget()));
521     connect(onionSkinsYOffset_, SIGNAL(valueChanged(double)), this, SLOT(updateSettingsFromWidget()));
522 
523 
524     // Settings -> Widget connection
525     //  -> must be done manually by owner of ViewSettings and ViewSettingsWidget
526 
527 
528     // ----------------- Set position and size -----------------
529 
530     setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
531 }
532 
~ViewSettingsWidget()533 ViewSettingsWidget::~ViewSettingsWidget()
534 {
535 }
536 
setActive(bool isActive)537 void ViewSettingsWidget::setActive(bool isActive)
538 {
539 
540 }
541 
processZoomValueChangedSignal(int n)542 void ViewSettingsWidget::processZoomValueChangedSignal(int n)
543 {
544     // Only set value from spinbox when user actual change value from
545     // spinbox, not when setValue() is called programmatically. We do
546     // this by manually setting
547     //     ignoreZoomValueChangedSignal_ = true;
548     // before calling setValue()
549     if(!ignoreZoomValueChangedSignal_)
550     {
551         zoomValue_ = 0.01 * n;
552         updateSettingsFromWidget();
553     }
554 }
555 
556 
updateWidgetFromSettings()557 void ViewSettingsWidget::updateWidgetFromSettings()
558 {
559     /* THE FOLLOWING ARE NOT IMPLEMENTED OR DEEMED IRRELEVANT
560     screenRelative_->setChecked(viewSettings_.screenRelative());
561     onionSkinsTransparencyRatio_->setValue(viewSettings_.onionSkinsTransparencyRatio());
562 */
563 
564     vertexTopologySize_->setValue(viewSettings_.vertexTopologySize());
565     edgeTopologyWidth_->setValue(viewSettings_.edgeTopologyWidth());
566     drawTopologyFaces_->setChecked(viewSettings_.drawTopologyFaces());
567 
568     areOnionSkinsPickable_->setChecked(viewSettings_.areOnionSkinsPickable());
569     numOnionSkinsBefore_->setValue(viewSettings_.numOnionSkinsBefore());
570     numOnionSkinsAfter_->setValue(viewSettings_.numOnionSkinsAfter());
571     onionSkinsTimeOffset_->setValue(viewSettings_.onionSkinsTimeOffset().floatTime());
572     onionSkinsXOffset_->setValue(viewSettings_.onionSkinsXOffset());
573     onionSkinsYOffset_->setValue(viewSettings_.onionSkinsYOffset());
574 
575     zoomValue_ = viewSettings_.zoom();
576     ignoreZoomValueChangedSignal_ = true;
577     zoomSpinBox_->setValue(100*viewSettings_.zoom());
578     ignoreZoomValueChangedSignal_ = false;
579 
580     frameLineEdit_->setText(QString().setNum(viewSettings_.time().frame()));
581 
582     switch(viewSettings_.displayMode())
583     {
584     case ViewSettings::ILLUSTRATION:
585         displayModeButton_Normal_->setChecked(true);
586         displayModeButton_->setIcon(QIcon(":images/display-mode-normal.png"));
587         break;
588     case ViewSettings::ILLUSTRATION_OUTLINE:
589         displayModeButton_NormalOutline_->setChecked(true);
590         displayModeButton_->setIcon(QIcon(":images/display-mode-normal-outline.png"));
591         break;
592     case ViewSettings::OUTLINE:
593         displayModeButton_Outline_->setChecked(true);
594         displayModeButton_->setIcon(QIcon(":images/display-mode-outline.png"));
595         break;
596     }
597 
598     if(viewSettings_.onionSkinningIsEnabled())
599     {
600         onionSkinningButton_On_->setChecked(true);
601         onionSkinningButton_->setIcon(QIcon(":images/onion-skinning-on.png"));
602     }
603     else
604     {
605         onionSkinningButton_Off_->setChecked(true);
606         onionSkinningButton_->setIcon(QIcon(":images/onion-skinning-off.png"));
607     }
608 }
609 
updateSettingsFromWidget()610 void ViewSettingsWidget::updateSettingsFromWidget()
611 {
612     updateSettingsFromWidgetSilent();
613     emit changed();
614 }
615 
getFrame_()616 int ViewSettingsWidget::getFrame_()
617 {
618     bool ok;
619     int frame = frameLineEdit_->text().toInt(&ok);
620     if(ok)
621     {
622         return frame;
623     }
624     else
625     {
626         return viewSettings_.time().frame();
627     }
628 }
629 
incrFrame()630 void ViewSettingsWidget::incrFrame()
631 {
632     int frame = getFrame_();
633     frame++;
634     frameLineEdit_->setText(QString().setNum(frame));
635     updateSettingsFromWidget();
636 }
637 
decrFrame()638 void ViewSettingsWidget::decrFrame()
639 {
640     int frame = getFrame_();
641     frame--;
642     frameLineEdit_->setText(QString().setNum(frame));
643     updateSettingsFromWidget();
644 }
645 
updateSettingsFromWidgetSilent()646 void ViewSettingsWidget::updateSettingsFromWidgetSilent()
647 {
648     /* THE FOLLOWING ARE NOT IMPLEMENTED OR DEEMED IRRELEVANT
649     viewSettings_.setScreenRelative(screenRelative_->isChecked());
650     viewSettings_.setOnionSkinsTransparencyRatio(onionSkinsTransparencyRatio_->value());
651     */
652 
653     viewSettings_.setVertexTopologySize(vertexTopologySize_->value());
654     viewSettings_.setEdgeTopologyWidth(edgeTopologyWidth_->value());
655     viewSettings_.setDrawTopologyFaces(drawTopologyFaces_->isChecked());
656 
657     viewSettings_.setAreOnionSkinsPickable(areOnionSkinsPickable_->isChecked());
658     viewSettings_.setNumOnionSkinsBefore(numOnionSkinsBefore_->value());
659     viewSettings_.setNumOnionSkinsAfter(numOnionSkinsAfter_->value());
660     viewSettings_.setOnionSkinsTimeOffset(onionSkinsTimeOffset_->value());
661     viewSettings_.setOnionSkinsXOffset(onionSkinsXOffset_->value());
662     viewSettings_.setOnionSkinsYOffset(onionSkinsYOffset_->value());
663 
664     viewSettings_.setZoom(zoomValue_);
665     QString textFrame = frameLineEdit_->text();
666     bool ok;
667     int frame = textFrame.toInt(&ok);
668     if(ok)
669     {
670         viewSettings_.setTime(Time(frame));
671     }
672     else
673     {
674         frameLineEdit_->setText(QString().setNum(viewSettings_.time().frame()));
675     }
676 
677     if(displayModeButton_Normal_->isChecked())
678     {
679         viewSettings_.setDisplayMode(ViewSettings::ILLUSTRATION);
680         displayModeButton_->setIcon(QIcon(":images/display-mode-normal.png"));
681     }
682     else if(displayModeButton_NormalOutline_->isChecked())
683     {
684         viewSettings_.setDisplayMode(ViewSettings::ILLUSTRATION_OUTLINE);
685         displayModeButton_->setIcon(QIcon(":images/display-mode-normal-outline.png"));
686 
687     }
688     else if(displayModeButton_Outline_->isChecked())
689     {
690         viewSettings_.setDisplayMode(ViewSettings::OUTLINE);
691         displayModeButton_->setIcon(QIcon(":images/display-mode-outline.png"));
692     }
693 
694     if(onionSkinningButton_Off_->isChecked())
695     {
696         viewSettings_.setOnionSkinningIsEnabled(false);
697         onionSkinningButton_->setIcon(QIcon(":images/onion-skinning-off.png"));
698     }
699     else if(onionSkinningButton_On_->isChecked())
700     {
701         viewSettings_.setOnionSkinningIsEnabled(true);
702         onionSkinningButton_->setIcon(QIcon(":images/onion-skinning-on.png"));
703     }
704 
705 }
706