Engauge Digitizer  2
 All Classes Files Functions Variables Enumerations Enumerator Friends Pages
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 {
60  const int STRETCH_OFF = 0, STRETCH_ON = 1;
61 
62  m_scroll = new QScrollArea (this);
63  m_scroll->setStyleSheet ("QScrollArea { border: 0; margin: 0; padding: 0;}"); // Need QScrollArea or interior frames are affected
64  m_scroll->setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOff);
65  m_scroll->setVerticalScrollBarPolicy (Qt::ScrollBarAsNeeded);
66  m_scroll->setMinimumWidth (minimumWidth);
67 
68  QWidget *viewport = new QWidget (this);
69  m_scroll->setWidget (viewport);
70  m_scroll->setWidgetResizable (true);
71 
72  QHBoxLayout *scrollLayout = new QHBoxLayout (this);
73  scrollLayout->addWidget (m_scroll);
74  setLayout (scrollLayout);
75 
76  QVBoxLayout *panelLayout = new QVBoxLayout (viewport);
77  viewport->setLayout (panelLayout);
78 
79  panelLayout->addWidget (subPanel);
80  panelLayout->setStretch (panelLayout->count () - 1, STRETCH_ON);
81 
82  QWidget *panelButtons = new QWidget (this);
83  QHBoxLayout *buttonLayout = new QHBoxLayout (panelButtons);
84 
85  createOptionalSaveDefault(buttonLayout);
86 
87  QHBoxLayout *layoutRightSide = new QHBoxLayout;
88 
89  QWidget *widgetRightSide = new QWidget;
90  widgetRightSide->setLayout (layoutRightSide);
91  buttonLayout->addWidget (widgetRightSide);
92 
93  QSpacerItem *spacerExpanding = new QSpacerItem (40, 5, QSizePolicy::Expanding, QSizePolicy::Expanding);
94  layoutRightSide->addItem (spacerExpanding);
95 
96  m_btnOk = new QPushButton (tr ("Ok"));
97  m_btnOk->setEnabled (false); // Nothing to save initially
98  layoutRightSide->addWidget (m_btnOk, 0, Qt::AlignRight);
99  connect (m_btnOk, SIGNAL (released ()), this, SLOT (slotOk ()));
100 
101  QSpacerItem *spacerFixed = new QSpacerItem (40, 5, QSizePolicy::Fixed, QSizePolicy::Fixed);
102  layoutRightSide->addItem (spacerFixed);
103 
104  m_btnCancel = new QPushButton (tr ("Cancel"));
105  layoutRightSide->addWidget (m_btnCancel, 0, Qt::AlignRight);
106  connect (m_btnCancel, SIGNAL (released ()), this, SLOT (slotCancel ()));
107 
108  panelLayout->addWidget (panelButtons, STRETCH_ON);
109  panelLayout->setStretch (panelLayout->count () - 1, STRETCH_OFF);
110 }
111 
113 {
114  return m_mainWindow;
115 }
116 
118 {
119  return m_mainWindow;
120 }
121 
123 {
124  combo.addItem (colorPaletteToString (COLOR_PALETTE_BLUE),
125  QVariant (COLOR_PALETTE_BLUE));
126  combo.addItem (colorPaletteToString (COLOR_PALETTE_BLACK),
127  QVariant (COLOR_PALETTE_BLACK));
128  combo.addItem (colorPaletteToString (COLOR_PALETTE_CYAN),
129  QVariant (COLOR_PALETTE_CYAN));
130  combo.addItem (colorPaletteToString (COLOR_PALETTE_GOLD),
131  QVariant (COLOR_PALETTE_GOLD));
132  combo.addItem (colorPaletteToString (COLOR_PALETTE_GREEN),
133  QVariant (COLOR_PALETTE_GREEN));
134  combo.addItem (colorPaletteToString (COLOR_PALETTE_MAGENTA),
135  QVariant (COLOR_PALETTE_MAGENTA));
136  combo.addItem (colorPaletteToString (COLOR_PALETTE_RED),
137  QVariant (COLOR_PALETTE_RED));
138  combo.addItem (colorPaletteToString (COLOR_PALETTE_YELLOW),
139  QVariant (COLOR_PALETTE_YELLOW));
140 }
141 
143 {
145  combo.addItem ("Transparent", QVariant (COLOR_PALETTE_TRANSPARENT));
146 }
147 
148 void DlgSettingsAbstractBase::saveGeometryToSettings()
149 {
150  // Store the settings for use by showEvent
151  QSettings settings;
152  settings.setValue (m_dialogName, saveGeometry ());
153 }
154 
156 {
157  m_cmdMediator = &cmdMediator;
158 }
159 
161 {
162  m_disableOkAtStartup = disableOkAtStartup;
163 }
164 
165 void DlgSettingsAbstractBase::showEvent (QShowEvent * /* event */)
166 {
167  if (m_disableOkAtStartup) {
168  m_btnOk->setEnabled (false);
169  }
170 
171  QSettings settings;
172  if (settings.contains (m_dialogName)) {
173 
174  // Restore the settings that were stored by the last call to saveGeometryToSettings
175  restoreGeometry (settings.value (m_dialogName).toByteArray ());
176  }
177 }
178 
179 void DlgSettingsAbstractBase::slotCancel ()
180 {
181  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsAbstractBase::slotCancel";
182 
183  saveGeometryToSettings();
184  hide();
185 }
186 
187 void DlgSettingsAbstractBase::slotOk ()
188 {
189  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsAbstractBase::slotOk";
190 
191  saveGeometryToSettings();
192 
193  // Forward to leaf class
194  handleOk ();
195 }
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 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.
void finishPanel(QWidget *subPanel, int minimumWidth=MINIMUM_DIALOG_WIDTH)
Add Ok and Cancel buttons to subpanel to get the whole dialog.
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:83
CmdMediator & cmdMediator()
Provide access to Document information wrapped inside CmdMediator.