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