1 /*******************************************************************
2
3 Part of the Fritzing project - http://fritzing.org
4 Copyright (c) 2007-2014 Fachhochschule Potsdam - http://fh-potsdam.de
5
6 Fritzing 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 3 of the License, or
9
10 Fritzing is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with Fritzing. If not, see <http://www.gnu.org/licenses/>.
17
18 ********************************************************************
19
20 $Revision: 6904 $:
21 $Author: irascibl@gmail.com $:
22 $Date: 2013-02-26 16:26:03 +0100 (Di, 26. Feb 2013) $
23
24 ********************************************************************/
25
26 #include <QSizeGrip>
27 #include <QStatusBar>
28 #include <QtDebug>
29 #include <QApplication>
30
31 #include "mainwindow.h"
32 #include "../utils/fsizegrip.h"
33 #include "../utils/misc.h"
34 #include "../partsbinpalette/binmanager/binmanager.h"
35 #include "../infoview/htmlinfoview.h"
36 #include "../dock/layerpalette.h"
37 #include "../mainwindow/fdockwidget.h"
38 #include "../utils/fileprogressdialog.h"
39 #include "../debugdialog.h"
40
41 /////////////////////////////////////
42
43 static const int PartsBinMinHeight = 100;
44 static const int UndoHistoryDefaultHeight = 70;
45 static const int UndoHistoryMinHeight = UndoHistoryDefaultHeight;
46 const int MainWindow::DockMinWidth = 130;
47 const int MainWindow::DockMinHeight = 30;
48
49 ///////////////////////////////////////
50
dockChangeActivation(bool activate,QWidget * originator)51 void MainWindow::dockChangeActivation(bool activate, QWidget * originator) {
52 Q_UNUSED(activate);
53 Q_UNUSED(originator);
54 if (!m_closing) {
55 m_sizeGrip->rearrange();
56 }
57
58 }
59
createDockWindows()60 void MainWindow::createDockWindows()
61 {
62 QWidget * widget = new QWidget();
63 widget->setMinimumHeight(0);
64 widget->setMaximumHeight(0);
65
66 makeDock(BinManager::Title, m_binManager, PartsBinMinHeight, PartsBinHeightDefault/*, Qt::LeftDockWidgetArea*/);
67
68 makeDock(tr("Inspector"), m_infoView, InfoViewMinHeight, InfoViewHeightDefault);
69
70 makeDock(tr("Undo History"), m_undoView, UndoHistoryMinHeight, UndoHistoryDefaultHeight)->hide();
71 m_undoView->setMinimumSize(DockMinWidth, UndoHistoryMinHeight);
72
73 makeDock(tr("Layers"), m_layerPalette, DockMinWidth, DockMinHeight)->hide();
74 m_layerPalette->setMinimumSize(DockMinWidth, DockMinHeight);
75 m_layerPalette->setShowAllLayersAction(m_showAllLayersAct);
76 m_layerPalette->setHideAllLayersAction(m_hideAllLayersAct);
77
78 if (m_programView == NULL) {
79 m_windowMenu->addSeparator();
80 m_windowMenu->addAction(m_openProgramWindowAct);
81 }
82
83 #ifndef QT_NO_DEBUG
84 m_windowMenu->addSeparator();
85 m_windowMenu->addAction(m_toggleDebuggerOutputAct);
86 #endif
87
88 m_windowMenuSeparator = m_windowMenu->addSeparator();
89 }
90
makeDock(const QString & title,QWidget * widget,int dockMinHeight,int dockDefaultHeight,Qt::DockWidgetArea area,DockFactory dockFactory)91 FDockWidget * MainWindow::makeDock(const QString & title, QWidget * widget, int dockMinHeight, int dockDefaultHeight, Qt::DockWidgetArea area, DockFactory dockFactory) {
92 FDockWidget * dock = ((dockFactory) ? dockFactory(title, this) : new FDockWidget(title, this));
93 dock->setObjectName(title);
94 dock->setWidget(widget);
95 widget->setParent(dock);
96 widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
97
98 connect(dock, SIGNAL(positionChanged()), this, SLOT(keepMargins()));
99 connect(dock, SIGNAL(topLevelChanged(bool)), this, SLOT(keepMargins()));
100 connect(dock, SIGNAL(visibilityChanged(bool)), this, SLOT(keepMargins()));
101
102 return dockIt(dock, dockMinHeight, dockDefaultHeight, area);
103 }
104
dockIt(FDockWidget * dock,int dockMinHeight,int dockDefaultHeight,Qt::DockWidgetArea area)105 FDockWidget *MainWindow::dockIt(FDockWidget* dock, int dockMinHeight, int dockDefaultHeight, Qt::DockWidgetArea area) {
106 dock->setAllowedAreas(area);
107 addDockWidget(area, dock);
108 if (m_windowMenu) {
109 m_windowMenu->addAction(dock->toggleViewAction());
110 }
111
112 dock->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
113 dock->setMinimumSize(DockMinWidth, dockMinHeight);
114 dock->resize(DockWidthDefault, dockDefaultHeight);
115 connect(dock, SIGNAL(dockChangeActivationSignal(bool, QWidget *)), this, SLOT(dockChangeActivation(bool, QWidget *)));
116 connect(dock, SIGNAL(destroyed(QObject *)), qApp, SLOT(topLevelWidgetDestroyed(QObject *)));
117 connect(dock, SIGNAL(dockChangeActivationSignal(bool, QWidget *)), qApp, SLOT(changeActivation(bool, QWidget *)), Qt::DirectConnection);
118
119 m_docks << dock;
120
121 return dock;
122 }
123
newTopWidget()124 FDockWidget *MainWindow::newTopWidget() {
125 int topMostY = 10000;
126 FDockWidget *topWidget = NULL;
127 foreach(FDockWidget* dock, m_docks) {
128 if(/*!dock->isFloating() && dock->isVisible() &&*/
129 dockWidgetArea(dock) == Qt::RightDockWidgetArea
130 && dock->pos().y() < topMostY) {
131 topMostY = dock->pos().y();
132 topWidget = dock;
133 }
134 }
135 return topWidget;
136 }
137
newBottomWidget()138 FDockWidget *MainWindow::newBottomWidget() {
139 int bottomMostY = -1;
140 FDockWidget *bottomWidget = NULL;
141 foreach(FDockWidget* dock, m_docks) {
142 if(!dock->isFloating() && dock->isVisible() &&
143 dockWidgetArea(dock) == Qt::RightDockWidgetArea
144 && dock->pos().y() > bottomMostY) {
145 bottomMostY = dock->pos().y();
146 bottomWidget = dock;
147 }
148 }
149 return bottomWidget;
150 }
151
keepMargins()152 void MainWindow::keepMargins() {
153 if (m_dontKeepMargins) return;
154
155 /*FDockWidget* newTopWidget = this->newTopWidget();
156 if(m_topDock != newTopWidget) {
157 removeMargin(m_topDock);
158 m_topDock = newTopWidget;
159 if(m_topDock) m_oldTopDockStyle = m_topDock->styleSheet();
160 addTopMargin(m_topDock);
161 }*/
162
163 FDockWidget* newBottomWidget = this->newBottomWidget();
164 if(m_bottomDock != newBottomWidget) {
165 removeMargin(m_bottomDock);
166 m_bottomDock = newBottomWidget;
167 if(m_bottomDock) m_oldBottomDockStyle = m_bottomDock->styleSheet();
168 addBottomMargin(m_bottomDock);
169 m_sizeGrip->raise();
170 }
171 }
172
173
removeMargin(FDockWidget * dock)174 void MainWindow::removeMargin(FDockWidget* dock) {
175 if(dock) {
176 dockMarginAux(dock, "", m_oldBottomDockStyle);
177 }
178 }
179
addTopMargin(FDockWidget * dock)180 void MainWindow::addTopMargin(FDockWidget* dock) {
181 if(dock) dockMarginAux(dock, "topMostDock", dock->widget()->styleSheet());
182 }
183
addBottomMargin(FDockWidget * dock)184 void MainWindow::addBottomMargin(FDockWidget* dock) {
185 if(dock) {
186 if(qobject_cast<BinManager*>(dock->widget())) {
187 // already has enought space
188 } else {
189 dockMarginAux(dock, "bottomMostDock", dock->widget()->styleSheet());
190 }
191 }
192 }
193
194
dockMarginAux(FDockWidget * dock,const QString & name,const QString & style)195 void MainWindow::dockMarginAux(FDockWidget* dock, const QString &name, const QString &style) {
196 if(dock) {
197 dock->widget()->setObjectName(name);
198 dock->widget()->setStyleSheet(style);
199 dock->setStyleSheet(dock->styleSheet());
200 } else {
201 qWarning() << tr("Couldn't get the dock widget");
202 }
203
204 }
205
dontKeepMargins()206 void MainWindow::dontKeepMargins() {
207 m_dontKeepMargins = true;
208 }
209
initDock()210 void MainWindow::initDock() {
211 m_layerPalette = new LayerPalette(this);
212
213 m_infoView = new HtmlInfoView();
214 m_infoView->init(false);
215 connect(m_infoView, SIGNAL(clickObsoleteSignal()), this, SLOT(selectAllObsolete()));
216 //DebugDialog::debug("after html view");
217
218 m_binManager = new BinManager(m_referenceModel, m_infoView, m_undoStack, this);
219 m_binManager->initStandardBins();
220
221 //DebugDialog::debug("after creating bins");
222 if (m_fileProgressDialog) {
223 m_fileProgressDialog->setValue(89);
224 }
225 }
226
moreInitDock()227 void MainWindow::moreInitDock() {
228 //DebugDialog::debug("create view switcher");
229
230 createDockWindows();
231
232 if (m_fileProgressDialog) {
233 m_fileProgressDialog->setValue(93);
234 }
235 }
236
237
saveDocks()238 void MainWindow::saveDocks()
239 {
240 for (int i = 0; i < children().count(); i++) {
241 FDockWidget * dock = qobject_cast<FDockWidget *>(children()[i]);
242 if (dock == NULL) continue;
243
244 //DebugDialog::debug(QString("saving dock %1").arg(dock->windowTitle()));
245 dock->saveState();
246
247 if (dock->isFloating() && dock->isVisible()) {
248 //DebugDialog::debug(QString("hiding dock %1").arg(dock->windowTitle()));
249 dock->hide();
250 }
251 }
252 }
253
restoreDocks()254 void MainWindow::restoreDocks() {
255 for (int i = 0; i < children().count(); i++) {
256 FDockWidget * dock = qobject_cast<FDockWidget *>(children()[i]);
257 if (dock == NULL) continue;
258
259 // DebugDialog::debug(QString("restoring dock %1").arg(dock->windowTitle()));
260 dock->restoreState();
261 }
262 }
263
264