Engauge Digitizer  2
DlgSettingsAbstractBase.cpp
1 /******************************************************************************************************
2  * (C) 2014 markummitchell@github.com. This file is part of Engauge Digitizer, which is released *
3  * under GNU General Public License version 2 (GPLv2) or (at your option) any later version. See file *
4  * LICENSE or go to gnu.org/licenses for details. Distribution requires prior written permission. *
5  ******************************************************************************************************/
6 
7 #include "CmdMediator.h"
8 #include "DlgSettingsAbstractBase.h"
9 #include "EngaugeAssert.h"
10 #include "Logger.h"
11 #include "MainWindow.h"
12 #include <QColor>
13 #include <QComboBox>
14 #include <QPushButton>
15 #include <QScrollArea>
16 #include <QSettings>
17 #include <QSpacerItem>
18 #include <QVBoxLayout>
19 
20 int DlgSettingsAbstractBase::MINIMUM_DIALOG_WIDTH = 380; // May be overridden by subclass
22 
24  const QString &dialogName,
25  MainWindow &mainWindow) :
26  QDialog (&mainWindow),
27  m_mainWindow (mainWindow),
28  m_cmdMediator (0),
29  m_dialogName (dialogName),
30  m_disableOkAtStartup (true)
31 {
32  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsAbstractBase::DlgSettingsAbstractBase"
33  << " name=" << m_dialogName.toLatin1().data();
34 
35  setWindowTitle (title);
36  setModal (true);
37 }
38 
39 DlgSettingsAbstractBase::~DlgSettingsAbstractBase()
40 {
41  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsAbstractBase::~DlgSettingsAbstractBase"
42  << " name=" << m_dialogName.toLatin1().data();
43 }
44 
46 {
47  ENGAUGE_CHECK_PTR (m_cmdMediator);
48 
49  return *m_cmdMediator;
50 }
51 
53 {
54  m_btnOk->setEnabled (enable);
55 }
56 
57 void DlgSettingsAbstractBase::finishPanel (QWidget *subPanel,
58  int minimumWidth,
59  int minimumHeightOrZero)
60 {
61  const int STRETCH_OFF = 0, STRETCH_ON = 1;
62 
63  m_scroll = new QScrollArea (this);
64  m_scroll->setStyleSheet ("QScrollArea { border: 0; margin: 0; padding: 0;}"); // Need QScrollArea or interior frames are affected
65  m_scroll->setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOff);
66  m_scroll->setVerticalScrollBarPolicy (Qt::ScrollBarAsNeeded);
67  m_scroll->setSizePolicy (QSizePolicy::Minimum,
68  QSizePolicy::Minimum);
69  m_scroll->setMinimumWidth (minimumWidth);
70 
71  QWidget *viewport = new QWidget (this);
72  m_scroll->setWidget (viewport);
73  m_scroll->setWidgetResizable (true);
74 
75  QHBoxLayout *scrollLayout = new QHBoxLayout (this);
76  scrollLayout->addWidget (m_scroll);
77  setLayout (scrollLayout);
78 
79  QVBoxLayout *panelLayout = new QVBoxLayout (viewport);
80  viewport->setLayout (panelLayout);
81 
82  panelLayout->addWidget (subPanel);
83  panelLayout->setStretch (panelLayout->count () - 1, STRETCH_ON);
84 
85  QWidget *panelButtons = new QWidget (this);
86  QHBoxLayout *buttonLayout = new QHBoxLayout (panelButtons);
87 
88  createOptionalSaveDefault(buttonLayout);
89 
90  QHBoxLayout *layoutRightSide = new QHBoxLayout;
91 
92  QWidget *widgetRightSide = new QWidget;
93  widgetRightSide->setLayout (layoutRightSide);
94  buttonLayout->addWidget (widgetRightSide);
95 
96  QSpacerItem *spacerExpanding = new QSpacerItem (40, 5, QSizePolicy::Expanding, QSizePolicy::Expanding);
97  layoutRightSide->addItem (spacerExpanding);
98 
99  m_btnOk = new QPushButton (tr ("Ok"));
100  m_btnOk->setEnabled (false); // Nothing to save initially
101  layoutRightSide->addWidget (m_btnOk, 0, Qt::AlignRight);
102  connect (m_btnOk, SIGNAL (released ()), this, SLOT (slotOk ()));
103 
104  QSpacerItem *spacerFixed = new QSpacerItem (40, 5, QSizePolicy::Fixed, QSizePolicy::Fixed);
105  layoutRightSide->addItem (spacerFixed);
106 
107  m_btnCancel = new QPushButton (tr ("Cancel"));
108  layoutRightSide->addWidget (m_btnCancel, 0, Qt::AlignRight);
109  connect (m_btnCancel, SIGNAL (released ()), this, SLOT (slotCancel ()));
110 
111  panelLayout->addWidget (panelButtons, STRETCH_ON);
112  panelLayout->setStretch (panelLayout->count () - 1, STRETCH_OFF);
113 
114  setSizePolicy (QSizePolicy::Minimum,
115  QSizePolicy::Minimum);
116 
117  if (minimumHeightOrZero > 0) {
118  m_scroll->setMinimumHeight (minimumHeightOrZero);
119  }
120 }
121 
123 {
124  return m_mainWindow;
125 }
126 
128 {
129  return m_mainWindow;
130 }
131 
133 {
134  combo.addItem (colorPaletteToString (COLOR_PALETTE_BLUE),
135  QVariant (COLOR_PALETTE_BLUE));
136  combo.addItem (colorPaletteToString (COLOR_PALETTE_BLACK),
137  QVariant (COLOR_PALETTE_BLACK));
138  combo.addItem (colorPaletteToString (COLOR_PALETTE_CYAN),
139  QVariant (COLOR_PALETTE_CYAN));
140  combo.addItem (colorPaletteToString (COLOR_PALETTE_GOLD),
141  QVariant (COLOR_PALETTE_GOLD));
142  combo.addItem (colorPaletteToString (COLOR_PALETTE_GREEN),
143  QVariant (COLOR_PALETTE_GREEN));
144  combo.addItem (colorPaletteToString (COLOR_PALETTE_MAGENTA),
145  QVariant (COLOR_PALETTE_MAGENTA));
146  combo.addItem (colorPaletteToString (COLOR_PALETTE_RED),
147  QVariant (COLOR_PALETTE_RED));
148  combo.addItem (colorPaletteToString (COLOR_PALETTE_YELLOW),
149  QVariant (COLOR_PALETTE_YELLOW));
150 }
151 
153 {
155  combo.addItem ("Transparent", QVariant (COLOR_PALETTE_TRANSPARENT));
156 }
157 
158 void DlgSettingsAbstractBase::saveGeometryToSettings()
159 {
160  // Store the settings for use by showEvent
161  QSettings settings;
162  settings.setValue (m_dialogName, saveGeometry ());
163 }
164 
166 {
167  m_cmdMediator = &cmdMediator;
168 }
169 
171 {
172  m_disableOkAtStartup = disableOkAtStartup;
173 }
174 
175 void DlgSettingsAbstractBase::showEvent (QShowEvent * /* event */)
176 {
177  if (m_disableOkAtStartup) {
178  m_btnOk->setEnabled (false);
179  }
180 
181  QSettings settings;
182  if (settings.contains (m_dialogName)) {
183 
184  // Restore the settings that were stored by the last call to saveGeometryToSettings
185  restoreGeometry (settings.value (m_dialogName).toByteArray ());
186  }
187 }
188 
189 void DlgSettingsAbstractBase::slotCancel ()
190 {
191  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsAbstractBase::slotCancel";
192 
193  saveGeometryToSettings();
194  hide();
195 }
196 
197 void DlgSettingsAbstractBase::slotOk ()
198 {
199  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsAbstractBase::slotOk";
200 
201  saveGeometryToSettings();
202 
203  // Forward to leaf class
204  handleOk ();
205 }
static int MINIMUM_DIALOG_WIDTH
Dialog layout constant that guarantees every widget has sufficient room. Can be increased by finishPa...
void setDisableOkAtStartup(bool disableOkAtStartup)
Override the default Ok button behavior applied in showEvent.
DlgSettingsAbstractBase(const QString &title, const QString &dialogName, MainWindow &mainWindow)
Single constructor.
void setCmdMediator(CmdMediator &cmdMediator)
Store CmdMediator for easy access by the leaf class.
virtual void createOptionalSaveDefault(QHBoxLayout *layout)=0
Let subclass define an optional Save As Default button.
void finishPanel(QWidget *subPanel, int minimumWidth=MINIMUM_DIALOG_WIDTH, int minimumHeightOrZero=0)
Add Ok and Cancel buttons to subpanel to get the whole dialog.
void populateColorComboWithoutTransparent(QComboBox &combo)
Add colors in color palette to combobox, without transparent entry at end.
static int MINIMUM_PREVIEW_HEIGHT
Dialog layout constant that guarantees preview has sufficent room.
void enableOk(bool enable)
Let leaf subclass control the Ok button.
Command queue stack.
Definition: CmdMediator.h:23
virtual void handleOk()=0
Process slotOk.
void populateColorComboWithTransparent(QComboBox &combo)
Add colors in color palette to combobox, with transparent entry at end.
MainWindow & mainWindow()
Get method for MainWindow.
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
Definition: MainWindow.h:89
CmdMediator & cmdMediator()
Provide access to Document information wrapped inside CmdMediator.