From 1126a0ef17ea74f99caa7c4963dc079c31588c65 Mon Sep 17 00:00:00 2001 From: Torsten Paul Date: Tue, 16 Dec 2014 23:15:11 +0100 Subject: [PATCH 01/11] Use separate project for winconsole and don't statically link Qt (fixes #870). --- openscad.pro | 4 ---- scripts/release-common.sh | 4 ++-- winconsole.pri | 28 ---------------------------- winconsole.pro | 23 +++++++++++++++++++++++ 4 files changed, 25 insertions(+), 34 deletions(-) delete mode 100644 winconsole.pri create mode 100644 winconsole.pro diff --git a/openscad.pro b/openscad.pro index d745c708..5ffa39fe 100644 --- a/openscad.pro +++ b/openscad.pro @@ -546,7 +546,3 @@ INSTALLS += icons man.path = $$PREFIX/share/man/man1 man.extra = cp -f doc/openscad.1 \"\$(INSTALL_ROOT)$${man.path}/$${FULLNAME}.1\" INSTALLS += man - -CONFIG(winconsole) { - include(winconsole.pri) -} diff --git a/scripts/release-common.sh b/scripts/release-common.sh index f9faf8a6..709d508a 100755 --- a/scripts/release-common.sh +++ b/scripts/release-common.sh @@ -254,8 +254,8 @@ case $OS in echo "cant find $TARGET/openscad.exe. build failed. stopping." exit fi - # make console pipe-able openscad.com - see winconsole.pri for info - qmake CONFIG+=winconsole ../openscad.pro + # make console pipe-able openscad.com - see winconsole.pro for info + qmake ../winconsole.pro make if [ ! -e $TARGET/openscad.com ]; then echo "cant find $TARGET/openscad.com. build failed. stopping." diff --git a/winconsole.pri b/winconsole.pri deleted file mode 100644 index a3991ae7..00000000 --- a/winconsole.pri +++ /dev/null @@ -1,28 +0,0 @@ -# Windows console issues workaround stub. -# -# Usage: put at the end of .pro file, then run qmake CONFIG+=winconsole -# -# This attempts to solve the problem of piping OpenSCAD under windows -# command line (GUI mode programs in Windows dont allow this). We use -# the 'devenv' solution, which means building two binaries: -# openscad.exe, and openscad.com, the latter being a wrapper for the -# former. See src/winconsole.c for more details. -# -# Qmake doesn't like building two binaries in the same directory so we -# depend on release-common.sh to call qmake twice and package the file properly - -CONFIG(winconsole) { - TEMPLATE = app - TARGET = openscad_winconsole - FORMS = - HEADERS = - FLEXSOURCES = - BISONSOURCES = - RESOURCES = - SOURCES = src/winconsole.c - CONFIG += console # sets IMAGE_SUBSYSTEM_WINDOWS_CUI in binary - LIBS -= $$LIBS - RC_FILE -= $$RC_FILE - QMAKE_POST_LINK = cd $(DESTDIR) && mv openscad_winconsole.exe openscad.com -} - diff --git a/winconsole.pro b/winconsole.pro new file mode 100644 index 00000000..11078f36 --- /dev/null +++ b/winconsole.pro @@ -0,0 +1,23 @@ +# Windows console issues workaround stub. +# +# This attempts to solve the problem of piping OpenSCAD under windows +# command line (GUI mode programs in Windows dont allow this). We use +# the 'devenv' solution, which means building two binaries: +# openscad.exe, and openscad.com, the latter being a wrapper for the +# former. See src/winconsole.c for more details. +# +# Qmake doesn't like building two binaries in the same directory so we +# depend on release-common.sh to call qmake twice and package the file +# properly + +TEMPLATE = app +TARGET = openscad_winconsole +FORMS = +HEADERS = +FLEXSOURCES = +BISONSOURCES = +RESOURCES = +SOURCES = src/winconsole.c +CONFIG -= qt +CONFIG += console # sets IMAGE_SUBSYSTEM_WINDOWS_CUI in binary +QMAKE_POST_LINK = cd $(DESTDIR) && mv openscad_winconsole.exe openscad.com From b2227c719169357a8eb929e04456491697a0b1e2 Mon Sep 17 00:00:00 2001 From: Torsten Paul Date: Tue, 23 Dec 2014 00:05:42 +0100 Subject: [PATCH 02/11] Quote special characters when copying the font selector. --- src/FontListDialog.cc | 27 ++++++++++++++++++++++++++- src/FontListDialog.h | 2 ++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/FontListDialog.cc b/src/FontListDialog.cc index 0ee7ef59..f515774c 100644 --- a/src/FontListDialog.cc +++ b/src/FontListDialog.cc @@ -66,7 +66,7 @@ void FontListDialog::selection_changed(const QItemSelection ¤t, const QIte const QModelIndex &idx = proxy->mapToSource(current.indexes().at(0)); const QString name = model->item(idx.row(), 0)->text(); const QString style = model->item(idx.row(), 1)->text(); - selection = QString("\"%1:style=%2\"").arg(name).arg(style); + selection = QString("\"%1:style=%2\"").arg(quote(name)).arg(quote(style)); copyButton->setEnabled(true); } @@ -117,3 +117,28 @@ void FontListDialog::update_font_list() delete list; } + +/** + * Quote a string according to the requirements of font-config. + * See http://www.freedesktop.org/software/fontconfig/fontconfig-user.html + * + * The '\', '-', ':' and ',' characters in family names must be preceded + * by a '\' character to avoid having them misinterpreted. Similarly, values + * containing '\', '=', '_', ':' and ',' must also have them preceded by a + * '\' character. The '\' characters are stripped out of the family name and + * values as the font name is read. + * + * @param text unquoted string + * @return quoted text + */ +QString FontListDialog::quote(const QString& text) +{ + QString result = text; + result.replace('\\', "\\\\") + .replace('-', "\\-") + .replace(':', "\\:") + .replace(',', "\\,") + .replace('=', "\\=") + .replace('_', "\\_"); + return result; +} diff --git a/src/FontListDialog.h b/src/FontListDialog.h index 9f9a2532..5624f833 100644 --- a/src/FontListDialog.h +++ b/src/FontListDialog.h @@ -27,6 +27,8 @@ signals: void font_selected(const QString font); private: + QString quote(const QString& text); + QString selection; QStandardItemModel *model; QSortFilterProxyModel *proxy; From 77a568cda081c10d49c8365256de2fdeb4549570 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 22 Dec 2014 19:31:40 -0500 Subject: [PATCH 03/11] Less verbose --- scripts/translation-make.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/translation-make.sh b/scripts/translation-make.sh index 89ebd91e..5fadf01d 100755 --- a/scripts/translation-make.sh +++ b/scripts/translation-make.sh @@ -11,5 +11,3 @@ cd "$TOPDIR" || exit 1 echo "Compiling language files..." ./scripts/translation-update.sh updatemo - -echo "Done." From c4e895a81364a04c36aba74be82223962f916842 Mon Sep 17 00:00:00 2001 From: Torsten Paul Date: Tue, 23 Dec 2014 03:07:27 +0100 Subject: [PATCH 04/11] Add drag&drop to the FontListDialog. --- openscad.pro | 2 ++ src/FontListDialog.cc | 2 ++ src/FontListDialog.h | 3 -- src/FontListDialog.ui | 19 +++++++++++- src/FontListTableView.cc | 66 ++++++++++++++++++++++++++++++++++++++++ src/FontListTableView.h | 18 +++++++++++ 6 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 src/FontListTableView.cc create mode 100644 src/FontListTableView.h diff --git a/openscad.pro b/openscad.pro index c90942ea..92f1b720 100644 --- a/openscad.pro +++ b/openscad.pro @@ -259,6 +259,7 @@ HEADERS += src/typedefs.h \ src/OpenCSGWarningDialog.h \ src/AboutDialog.h \ src/FontListDialog.h \ + src/FontListTableView.h \ src/builtin.h \ src/calc.h \ src/context.h \ @@ -428,6 +429,7 @@ SOURCES += src/version_check.cc \ src/UIUtils.cc \ src/Dock.cc \ src/FontListDialog.cc \ + src/FontListTableView.cc \ src/launchingscreen.cc \ src/legacyeditor.cc \ src/LibraryInfoDialog.cc diff --git a/src/FontListDialog.cc b/src/FontListDialog.cc index f515774c..474c2ef3 100644 --- a/src/FontListDialog.cc +++ b/src/FontListDialog.cc @@ -60,6 +60,7 @@ void FontListDialog::selection_changed(const QItemSelection ¤t, const QIte { if (current.count() == 0) { copyButton->setEnabled(false); + tableView->setDragText(""); return; } @@ -68,6 +69,7 @@ void FontListDialog::selection_changed(const QItemSelection ¤t, const QIte const QString style = model->item(idx.row(), 1)->text(); selection = QString("\"%1:style=%2\"").arg(quote(name)).arg(quote(style)); copyButton->setEnabled(true); + tableView->setDragText(selection); } void FontListDialog::update_font_list() diff --git a/src/FontListDialog.h b/src/FontListDialog.h index 5624f833..d1927631 100644 --- a/src/FontListDialog.h +++ b/src/FontListDialog.h @@ -6,9 +6,6 @@ #include "qtgettext.h" #include "ui_FontListDialog.h" -#define STRINGIFY(x) #x -#define TOSTRING(x) STRINGIFY(x) - class FontListDialog : public QDialog, public Ui::FontListDialog { Q_OBJECT; diff --git a/src/FontListDialog.ui b/src/FontListDialog.ui index dda5eb1b..70ff4fff 100644 --- a/src/FontListDialog.ui +++ b/src/FontListDialog.ui @@ -67,7 +67,17 @@ - + + + true + + + QAbstractItemView::DragOnly + + + QAbstractItemView::SelectRows + + @@ -100,6 +110,13 @@ + + + FontListTableView + QTableView +
FontListTableView.h
+
+
diff --git a/src/FontListTableView.cc b/src/FontListTableView.cc new file mode 100644 index 00000000..b013d81f --- /dev/null +++ b/src/FontListTableView.cc @@ -0,0 +1,66 @@ +/* + * OpenSCAD (www.openscad.org) + * Copyright (C) 2009-2011 Clifford Wolf and + * Marius Kintel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * As a special exception, you have permission to link this program + * with the CGAL library and distribute executables, as long as you + * follow the requirements of the GNU GPL in regard to all of the + * software in the executable aside from CGAL. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include +#include +#include +#include + +#include "qtgettext.h" +#include "FontListDialog.h" + +FontListTableView::FontListTableView(QWidget *parent) : QTableView(parent) +{ +} + +void FontListTableView::setDragText(const QString &text) +{ + this->text = text.trimmed(); +} + +void FontListTableView::startDrag(Qt::DropActions supportedActions) +{ + if (text.isEmpty()) { + return; + } + + QMimeData *mimeData = new QMimeData; + mimeData->setText(text); + + QFontMetrics fm(font()); + QRect rect(0, 0, fm.width(text), fm.height()); + QPixmap pixmap(rect.width(), rect.height()); + pixmap.fill(Qt::transparent); + + QPainter painter(&pixmap); + painter.setFont(font()); + painter.drawText(rect, Qt::AlignCenter, text); + + QDrag *drag = new QDrag(this); + drag->setPixmap(pixmap); + drag->setMimeData(mimeData); + drag->setHotSpot(QPoint(-10, rect.height() + 6)); + drag->exec(supportedActions, Qt::CopyAction); +} diff --git a/src/FontListTableView.h b/src/FontListTableView.h new file mode 100644 index 00000000..70348c46 --- /dev/null +++ b/src/FontListTableView.h @@ -0,0 +1,18 @@ +#pragma once + +#include + +class FontListTableView : public QTableView +{ + Q_OBJECT; + +public: + FontListTableView(QWidget *parent = NULL); + void setDragText(const QString &text); + +protected: + void startDrag(Qt::DropActions supportedActions); + +private: + QString text; +}; From 5ad36c82b69e4fecd27f3a861d2284928554cb76 Mon Sep 17 00:00:00 2001 From: Torsten Paul Date: Tue, 23 Dec 2014 03:33:42 +0100 Subject: [PATCH 05/11] Add OpenSCAD version to the status bar. --- src/mainwin.cc | 13 ++++++++++--- src/openscad.cc | 3 +++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/mainwin.cc b/src/mainwin.cc index 8f399c21..684b9fc9 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -127,12 +127,16 @@ unsigned int GuiLocker::gui_locked = 0; #define QUOTE(x__) # x__ #define QUOTED(x__) QUOTE(x__) -static char helptitle[] = - "OpenSCAD " QUOTED(OPENSCAD_VERSION) +static std::string versionnumber = QUOTED(OPENSCAD_VERSION) #ifdef OPENSCAD_COMMIT " (git " QUOTED(OPENSCAD_COMMIT) ")" #endif - "\nhttp://www.openscad.org\n\n"; +; + +static std::string openscad_version = "OpenSCAD " + versionnumber; + +static std::string helptitle = openscad_version + "\nhttp://www.openscad.org\n\n"; + static char copyrighttext[] = "Copyright (C) 2009-2014 The OpenSCAD Developers\n" "\n" @@ -189,6 +193,9 @@ MainWindow::MainWindow(const QString &filename) this->consoleDock->setConfigKey("view/hideConsole"); this->consoleDock->setAction(this->viewActionHideConsole); + QLabel *versionLabel = new QLabel(openscad_version.c_str()); + this->statusbar->addPermanentWidget(versionLabel); + QSettings settings; editortype = settings.value("editor/editortype").toString(); useScintilla = (editortype != "Simple Editor"); diff --git a/src/openscad.cc b/src/openscad.cc index 89d2bf12..47ff6461 100644 --- a/src/openscad.cc +++ b/src/openscad.cc @@ -616,6 +616,9 @@ int gui(vector &inputFiles, const fs::path &original_path, int argc, cha } #endif QApplication app(argc, argv, true); //useGUI); + // remove ugly frames in the QStatusBar when using additional widgets + app.setStyleSheet("QStatusBar::item { border: 0px solid black }; "); + #ifdef Q_OS_MAC app.installEventFilter(new EventFilter(&app)); #endif From b37b49f4078e22b305e773639f05d74f70f637f8 Mon Sep 17 00:00:00 2001 From: Torsten Paul Date: Tue, 23 Dec 2014 03:56:17 +0100 Subject: [PATCH 06/11] Add version number to launching screen and main windows (fixes #1101). --- src/launchingscreen.cc | 9 ++++++--- src/launchingscreen.ui | 36 +++++++++++++++++++++++++++++------- src/mainwin.cc | 12 +----------- src/openscad.cc | 11 +++++++++++ src/openscad.h | 8 ++++++++ 5 files changed, 55 insertions(+), 21 deletions(-) diff --git a/src/launchingscreen.cc b/src/launchingscreen.cc index 4f08b7d0..3a27f7e4 100644 --- a/src/launchingscreen.cc +++ b/src/launchingscreen.cc @@ -2,6 +2,7 @@ #include #include +#include "openscad.h" #include "launchingscreen.h" #include "ui_launchingscreen.h" @@ -26,7 +27,9 @@ LaunchingScreen::LaunchingScreen(QWidget *parent) : QDialog(parent) setupUi(this); this->setStyleSheet("QDialog {background-image:url(':/icons/background.png')}" "QPushButton {color:white;}"); - + + this->versionNumberLabel->setText(openscad_version.c_str()); + QStringList recentFiles = UIUtils::recentFiles(); for (int a = 0;a < recentFiles.size();a++) { QFileInfo fileInfo(recentFiles[a]); @@ -75,7 +78,7 @@ QString LaunchingScreen::selectedFile() return this->selection; } -void LaunchingScreen::enableRecentButton(const QModelIndex & current, const QModelIndex & previous) +void LaunchingScreen::enableRecentButton(const QModelIndex &, const QModelIndex &) { this->openRecentButton->setEnabled(true); this->openRecentButton->setDefault(true); @@ -91,7 +94,7 @@ void LaunchingScreen::openRecent() checkOpen(item->data(Qt::UserRole)); } -void LaunchingScreen::enableExampleButton(QTreeWidgetItem *current, QTreeWidgetItem *previous) +void LaunchingScreen::enableExampleButton(QTreeWidgetItem *current, QTreeWidgetItem *) { const bool enable = current->childCount() == 0; this->openExampleButton->setEnabled(enable); diff --git a/src/launchingscreen.ui b/src/launchingscreen.ui index 67a7d1ea..cd4c8cd8 100644 --- a/src/launchingscreen.ui +++ b/src/launchingscreen.ui @@ -6,10 +6,16 @@ 0 0 - 618 + 620 418 + + + 600 + 0 + + Welcome to OpenSCAD @@ -331,16 +337,32 @@ QPushButton:pressed { - + + + + + 0 + 0 + + + + Version + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + true - - - 600 - 0 - + + + 0 + 0 + false diff --git a/src/mainwin.cc b/src/mainwin.cc index 684b9fc9..620d9fec 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -24,6 +24,7 @@ * */ #include +#include "openscad.h" #include "GeometryCache.h" #include "ModuleCache.h" #include "MainWindow.h" @@ -124,17 +125,6 @@ QSet *MainWindow::getWindows() // Global application state unsigned int GuiLocker::gui_locked = 0; -#define QUOTE(x__) # x__ -#define QUOTED(x__) QUOTE(x__) - -static std::string versionnumber = QUOTED(OPENSCAD_VERSION) -#ifdef OPENSCAD_COMMIT - " (git " QUOTED(OPENSCAD_COMMIT) ")" -#endif -; - -static std::string openscad_version = "OpenSCAD " + versionnumber; - static std::string helptitle = openscad_version + "\nhttp://www.openscad.org\n\n"; static char copyrighttext[] = diff --git a/src/openscad.cc b/src/openscad.cc index 47ff6461..293918ae 100644 --- a/src/openscad.cc +++ b/src/openscad.cc @@ -90,6 +90,17 @@ std::string currentdir; static bool arg_info = false; static std::string arg_colorscheme; +#define QUOTE(x__) # x__ +#define QUOTED(x__) QUOTE(x__) + +std::string openscad_versionnumber = QUOTED(OPENSCAD_VERSION) +#ifdef OPENSCAD_COMMIT + " (git " QUOTED(OPENSCAD_COMMIT) ")" +#endif +; + +std::string openscad_version = "OpenSCAD " + openscad_versionnumber; + class Echostream : public std::ofstream { public: diff --git a/src/openscad.h b/src/openscad.h index 0e979659..f37f0253 100644 --- a/src/openscad.h +++ b/src/openscad.h @@ -34,3 +34,11 @@ extern std::string commandline_commands; // The CWD when application started. We shouldn't change CWD, but until we stop // doing this, use currentdir to get the original CWD. extern std::string currentdir; + +extern std::string versionnumber; + +// Just the number (might have the git commit as suffix), e.g. 2014.12.23. +extern std::string openscad_versionnumber; + +// The string "OpenSCAD " and the version number. +extern std::string openscad_version; From 4c11d6b62f09a035f24e31811a27a1ea721669bf Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Tue, 23 Dec 2014 00:09:05 -0500 Subject: [PATCH 07/11] Updated test results for offset tests --- .../cgalpngtest/offset-tests-expected.png | Bin 4980 -> 8621 bytes .../opencsgtest/offset-tests-expected.png | Bin 3846 -> 7396 bytes .../offset-tests-expected.png | Bin 3869 -> 7424 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/regression/cgalpngtest/offset-tests-expected.png b/tests/regression/cgalpngtest/offset-tests-expected.png index fbcd7248bf689cec8e19ba0c7a47c4dc599965a7..3da4452ba21358a8b6113f2129167febbf922208 100644 GIT binary patch literal 8621 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

u6X6t!8jW8P-a&c{1fL< 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 literal 3846 zcmds4c{r8p7GK}qwt3vdHg8kNkV2V& zmtyG`aa>&MnU#y(9M+0vuA@??g%NUr)M@ReQ89h;;f2`Nt4Wz5{0w$~ypbYT;BeMr zsbQC2*O?REK3_R`dM{kb%?r4oNqA(nnq;o!+0>5TDsp%{%}nmu17Za}aQUv>h#Icr zHqZVJaYVtg5D-eS#AxTJ$ExW)B^97K^hb)l%ewWL-$vx}0`Vz6Zi2Mh@(;$4B@0vlmihYCaq6-mXn zav!s#_6x<2ozG<_hEsf zZ*b%fdB63>s#8%@0{UdW&)Rm8KN-(N28ebcld5xb{Zy`nw9;JxJ5rNtq`SNaW( zk9-XdZDmxcgdnT)Ej2=gLWg0kWO-RZaGnfl^}Tdm{qd~E_W6!w90zPrK6}i3S>gAw z*=9D6mEoHgbEe9sGqBvb*mzY5@n=>B;lRA#Ptb&_K#j&yY)N1+^zq?s+L^M z9-`+V1Q_WGsJN@Qn8UVEVlRj3)ZQxtPI-J0I5g7OpbSwjjgnnmYe`Z>CHV@tA=wlW zi<{`)e9}!sEfrAp<1N8{o>xb*sY3U0BwVz=z@Xh+`wNnrcB1nUP~$D6NP9HUcDXpQ zQ_`$N4_dC@rf-_mw1vfsY=mv{ODdpS0pj?FdL0r3UTEbr;u0{*(Ubqo3X}+(ma_GG z-2)S$Co}q_@~3t@1xn`gM^ARdd`Ka=>E(W}SAZxhS`m|sOY_WVO^IUR6c2VvBbD>5Hzy3H zL+x=dHaKhtEVM9W@fL1X`E9dqt%Zglx?cf~M;_O<8mEizb{Cgf&?t;5TxP)tHxvoF zEEnU!+onuv-q><#8F*!&hz7GeondMd_A^0(I$lK^o^`>gnQY(9+z?W0esnpe<2vQ^ zb(%dCa)T5P> zLV7kASySUFS>Z`N(kj<;eI8pT_3LH3AVqpNC(fmap0Cft!!JHusf9CkE1J1+H7#X( z@o02l&uORrvRFMcAq5U0qeP$kH?BDsU+CW&zBt4;l~D)@+4is|daNvM&4>+Io8cgL zoaGYO;YJ=xXD}wr0??aYz=49! zj*t7h5-Mey(of-Nf|Fsp4dr!4XcSs;ilG)U9Mgy_o^(cr-s2113eg!8S%H7;Bkt2iaRXs1iGp)xUd15CDBQk z|Lt|c=&uQ7uFoH;R|-}X?`U+Qhe}N3M_Y?|jtaczyz!(bTG+>Lg=TPHyuf|9K&MC2 z1y?E!s_orAlOu~7L1k%XSCQm%(f5juzG!afJ7g0+CKD3B9CUit$1PWa9sU?e=A>5z zAN^X?8|`me?d!1+Y~2}nXKvYANvq~r>-&wJ9DtH^nW_Dpyg;+=7h(-%g8k=Q>#i|@ zk$vnW4wXzOtGeNwNOb9=6n*ItZ~@q}Ey8HXIf&Sei?|qqu5~8?cn@N1EQPDWs~%t{3r8lRgK`x7sDxg z)mN;i%pL=2&|QAiokO%!r|O#RyiD~ktrrBr)KT7Aq+InAnpzTbIWtW(aBE}ZJbfVC z_RUWNQ*B3o*6DcL{d3vJ)M-D$^G{dP^BR!(echSj*$(LV2Np&@`KEukbiqH8d$q}v zv)>mMGT(LiD|VKzKWfI!_i93Fz99aYA>-%@1hB^O1N$wAsr&Te50?Cu{@%jBIDmlwl&Vxx*HO? zl6Kmr){m8FrbfK%!H+ym4d{?G>{>adA7p1X_ik4F z%aXP0)jL*8IY`&{(oC}h>$i&6Mr77LzzXM3O>K2*3JqY*o&;*I>%v7+cs@Dp%1RP zpI>5ezR{Cdan?V>?AS+lkQ6hWh;}>XwFCjhAw1OnwHn*n7fd6A@e^oLz<@E#8Kkj)GWvj_e3YsxJ(zOXJ@Z1F$23Yrk9O9{=fLeT2MP2 z@M5q2Kal_53A?Z1=kHYN>;yp1kj94n^=D2om_SeJZ_w$p{ri}bkG!bV;l+l&?HNZu lW-!qNlKKBu!_5!Kc!wenZfVUCc5I#li$gXh`3ERr{{$L-aZvyO diff --git a/tests/regression/throwntogethertest/offset-tests-expected.png b/tests/regression/throwntogethertest/offset-tests-expected.png index cd8450499950c1e7e7bf12d68b1ef68c7d93beb2..2c25d2920837eaacb2bb62a3d95716fba1996dd9 100644 GIT binary patch literal 7424 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 A%>V!Z literal 3869 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 Date: Tue, 23 Dec 2014 05:57:34 +0100 Subject: [PATCH 08/11] Fix crash on startup for the MinGW version. --- src/mainwin.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/mainwin.cc b/src/mainwin.cc index 620d9fec..8ddfe668 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -125,8 +125,6 @@ QSet *MainWindow::getWindows() // Global application state unsigned int GuiLocker::gui_locked = 0; -static std::string helptitle = openscad_version + "\nhttp://www.openscad.org\n\n"; - static char copyrighttext[] = "Copyright (C) 2009-2014 The OpenSCAD Developers\n" "\n" @@ -404,6 +402,7 @@ MainWindow::MainWindow(const QString &filename) setCurrentOutput(); + std::string helptitle = openscad_version + "\nhttp://www.openscad.org\n\n"; PRINT(helptitle); PRINT(copyrighttext); PRINT(""); @@ -2400,7 +2399,6 @@ void MainWindow::helpAbout() qApp->setWindowIcon(QApplication::windowIcon()); AboutDialog *dialog = new AboutDialog(this); dialog->exec(); - //QMessageBox::information(this, "About OpenSCAD", QString(helptitle) + QString(copyrighttext)); } void MainWindow::helpHomepage() From 5dc88d0eed4d7f4609a68d77b63f36194476b652 Mon Sep 17 00:00:00 2001 From: Torsten Paul Date: Tue, 23 Dec 2014 06:24:57 +0100 Subject: [PATCH 09/11] Switch between progress widget and status label. --- src/MainWindow.h | 2 ++ src/mainwin.cc | 48 +++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/MainWindow.h b/src/MainWindow.h index 5d415734..50d4bb6d 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -71,6 +71,7 @@ public: QAction *actionRecentFile[UIUtils::maxRecentFiles]; QMap knownFileExtensions; + QLabel *versionLabel; QWidget *editorDockTitleWidget; QWidget *consoleDockTitleWidget; @@ -116,6 +117,7 @@ private: void show_examples(); void setDockWidgetTitle(QDockWidget *dockWidget, QString prefix, bool topLevel); void addKeyboardShortCut(const QList &actions); + void updateStatusBar(class ProgressWidget *progressWidget); EditorInterface *editor; diff --git a/src/mainwin.cc b/src/mainwin.cc index 8ddfe668..8841349a 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -181,8 +181,8 @@ MainWindow::MainWindow(const QString &filename) this->consoleDock->setConfigKey("view/hideConsole"); this->consoleDock->setAction(this->viewActionHideConsole); - QLabel *versionLabel = new QLabel(openscad_version.c_str()); - this->statusbar->addPermanentWidget(versionLabel); + this->versionLabel = NULL; // must be initialized before calling updateStatusBar() + updateStatusBar(NULL); QSettings settings; editortype = settings.value("editor/editortype").toString(); @@ -683,7 +683,7 @@ MainWindow::~MainWindow() void MainWindow::showProgress() { - this->statusBar()->addPermanentWidget(qobject_cast(sender())); + updateStatusBar(qobject_cast(sender())); } void MainWindow::report_func(const class AbstractNode*, void *vp, int mark) @@ -1056,9 +1056,7 @@ void MainWindow::compileCSG(bool procevents) PRINT("CSG generation cancelled."); } progress_report_fin(); - this->statusBar()->removeWidget(this->progresswidget); - delete this->progresswidget; - this->progresswidget = NULL; + updateStatusBar(NULL); PRINT("Compiling design (CSG Products normalization)..."); if (procevents) QApplication::processEvents(); @@ -1796,15 +1794,47 @@ void MainWindow::actionRenderDone(shared_ptr root_geom) PRINT("WARNING: No top level geometry to render"); } - this->statusBar()->removeWidget(this->progresswidget); - delete this->progresswidget; - this->progresswidget = NULL; + updateStatusBar(NULL); + this->contentschanged = false; compileEnded(); } #endif /* ENABLE_CGAL */ +/** + * Switch version label and progress widget. When switching to the progress + * widget, the new instance is passed by the caller. + * In case of resetting back to the version label, NULL will be passed and + * multiple calls can happen. So this method must guard against adding the + * version label multiple times. + * + * @param progressWidget a pointer to the progress widget to show or NULL in + * case the display should switch back to the version label. + */ +void MainWindow::updateStatusBar(ProgressWidget *progressWidget) +{ + QStatusBar *sb = this->statusBar(); + if (progressWidget == NULL) { + if (this->progresswidget != NULL) { + sb->removeWidget(this->progresswidget); + delete this->progresswidget; + this->progresswidget = NULL; + } + if (versionLabel == NULL) { + versionLabel = new QLabel(openscad_version.c_str()); + sb->addPermanentWidget(this->versionLabel); + } + } else { + if (this->versionLabel != NULL) { + sb->removeWidget(this->versionLabel); + delete this->versionLabel; + this->versionLabel = NULL; + } + sb->addPermanentWidget(progressWidget); + } +} + void MainWindow::actionDisplayAST() { setCurrentOutput(); From c5e4715575be48f6cf724510b8908f5290d65768 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Tue, 23 Dec 2014 00:37:43 -0500 Subject: [PATCH 10/11] bugfix: highlighted differences didn't render correctly --- src/OpenCSGRenderer.cc | 19 +++++++++++------- src/ThrownTogetherRenderer.cc | 13 +++++------- src/polyset.cc | 4 ++-- .../2D/features/highlight-modifier-2d.scad | 10 +++++++++ .../highlight-modifier-2d-expected.png | Bin 0 -> 6147 bytes .../highlight-modifier-2d-expected.csg | 15 ++++++++++++++ .../opencsgtest/difference-tests-expected.png | Bin 11035 -> 10981 bytes .../highlight-modifier-2d-expected.png | Bin 0 -> 5819 bytes .../difference-tests-expected.png | Bin 11622 -> 11628 bytes .../highlight-modifier-2d-expected.png | Bin 0 -> 5796 bytes 10 files changed, 44 insertions(+), 17 deletions(-) create mode 100644 testdata/scad/2D/features/highlight-modifier-2d.scad create mode 100644 tests/regression/cgalpngtest/highlight-modifier-2d-expected.png create mode 100644 tests/regression/dumptest/highlight-modifier-2d-expected.csg create mode 100644 tests/regression/opencsgtest/highlight-modifier-2d-expected.png create mode 100644 tests/regression/throwntogethertest/highlight-modifier-2d-expected.png diff --git a/src/OpenCSGRenderer.cc b/src/OpenCSGRenderer.cc index 3c6f0b48..aa2d6bbb 100644 --- a/src/OpenCSGRenderer.cc +++ b/src/OpenCSGRenderer.cc @@ -90,7 +90,12 @@ void OpenCSGRenderer::renderCSGChain(CSGChain *chain, GLint *shaderinfo, const Color4f &c = j_obj.color; glPushMatrix(); glMultMatrixd(j_obj.matrix.data()); - csgmode_e csgmode = j_obj.type == CSGTerm::TYPE_DIFFERENCE ? CSGMODE_DIFFERENCE : CSGMODE_NORMAL; + csgmode_e csgmode = csgmode_e( + (highlight ? + CSGMODE_HIGHLIGHT : + (background ? CSGMODE_BACKGROUND : CSGMODE_NORMAL)) | + (j_obj.type == CSGTerm::TYPE_DIFFERENCE ? CSGMODE_DIFFERENCE : 0)); + ColorMode colormode = COLORMODE_NONE; if (background) { if (j_obj.flag & CSGTerm::FLAG_HIGHLIGHT) { @@ -99,11 +104,9 @@ void OpenCSGRenderer::renderCSGChain(CSGChain *chain, GLint *shaderinfo, else { colormode = COLORMODE_BACKGROUND; } - csgmode = csgmode_e(csgmode + 10); } else if (j_obj.type == CSGTerm::TYPE_DIFFERENCE) { if (j_obj.flag & CSGTerm::FLAG_HIGHLIGHT) { colormode = COLORMODE_HIGHLIGHT; - csgmode = csgmode_e(csgmode + 20); } else { colormode = COLORMODE_CUTOUT; @@ -111,7 +114,6 @@ void OpenCSGRenderer::renderCSGChain(CSGChain *chain, GLint *shaderinfo, } else { if (j_obj.flag & CSGTerm::FLAG_HIGHLIGHT) { colormode = COLORMODE_HIGHLIGHT; - csgmode = csgmode_e(csgmode + 20); } else { colormode = COLORMODE_MATERIAL; @@ -139,9 +141,12 @@ void OpenCSGRenderer::renderCSGChain(CSGChain *chain, GLint *shaderinfo, prim->geom = i_obj.geom; prim->m = i_obj.matrix; - prim->csgmode = i_obj.type == CSGTerm::TYPE_DIFFERENCE ? CSGMODE_DIFFERENCE : CSGMODE_NORMAL; - if (highlight) prim->csgmode = csgmode_e(prim->csgmode + 20); - else if (background) prim->csgmode = csgmode_e(prim->csgmode + 10); + prim->csgmode = csgmode_e( + (highlight ? + CSGMODE_HIGHLIGHT : + (background ? CSGMODE_BACKGROUND : CSGMODE_NORMAL)) | + (i_obj.type == CSGTerm::TYPE_DIFFERENCE ? CSGMODE_DIFFERENCE : 0)); + primitives.push_back(prim); } } diff --git a/src/ThrownTogetherRenderer.cc b/src/ThrownTogetherRenderer.cc index 4b114041..dbdf527c 100644 --- a/src/ThrownTogetherRenderer.cc +++ b/src/ThrownTogetherRenderer.cc @@ -74,12 +74,15 @@ void ThrownTogetherRenderer::renderCSGChain(CSGChain *chain, bool highlight, const Color4f &c = obj.color; glPushMatrix(); glMultMatrixd(m.data()); - csgmode_e csgmode = obj.type == CSGTerm::TYPE_DIFFERENCE ? CSGMODE_DIFFERENCE : CSGMODE_NORMAL; + csgmode_e csgmode = csgmode_e( + (highlight ? + CSGMODE_HIGHLIGHT : + (background ? CSGMODE_BACKGROUND : CSGMODE_NORMAL)) | + (obj.type == CSGTerm::TYPE_DIFFERENCE ? CSGMODE_DIFFERENCE : 0)); ColorMode colormode = COLORMODE_NONE; ColorMode edge_colormode = COLORMODE_NONE; if (highlight) { - csgmode = csgmode_e(csgmode + 20); colormode = COLORMODE_HIGHLIGHT; edge_colormode = COLORMODE_HIGHLIGHT_EDGES; } else if (background) { @@ -89,16 +92,11 @@ void ThrownTogetherRenderer::renderCSGChain(CSGChain *chain, bool highlight, else { colormode = COLORMODE_BACKGROUND; } - csgmode = csgmode_e(csgmode + 10); edge_colormode = COLORMODE_BACKGROUND_EDGES; } else if (fberror) { - if (highlight) csgmode = csgmode_e(csgmode + 20); - else if (background) csgmode = csgmode_e(csgmode + 10); - else csgmode = csgmode_e(csgmode); } else if (obj.type == CSGTerm::TYPE_DIFFERENCE) { if (obj.flag & CSGTerm::FLAG_HIGHLIGHT) { colormode = COLORMODE_HIGHLIGHT; - csgmode = csgmode_e(csgmode + 20); } else { colormode = COLORMODE_CUTOUT; @@ -107,7 +105,6 @@ void ThrownTogetherRenderer::renderCSGChain(CSGChain *chain, bool highlight, } else { if (obj.flag & CSGTerm::FLAG_HIGHLIGHT) { colormode = COLORMODE_HIGHLIGHT; - csgmode = csgmode_e(csgmode + 20); } else { colormode = COLORMODE_MATERIAL; diff --git a/src/polyset.cc b/src/polyset.cc index ad6b6e59..00ae963f 100644 --- a/src/polyset.cc +++ b/src/polyset.cc @@ -240,7 +240,7 @@ void PolySet::render_surface(Renderer::csgmode_e csgmode, const Transform3d &m, #endif /* ENABLE_OPENCSG */ if (this->dim == 2) { // Render 2D objects 1mm thick, but differences slightly larger - double zbase = 1 + (csgmode & CSGMODE_DIFFERENCE_FLAG) * 0.1; + double zbase = 1 + ((csgmode & CSGMODE_DIFFERENCE_FLAG) ? 0.1 : 0); glBegin(GL_TRIANGLES); // Render top+bottom @@ -369,7 +369,7 @@ void PolySet::render_edges(Renderer::csgmode_e csgmode) const } else { // Render 2D objects 1mm thick, but differences slightly larger - double zbase = 1 + (csgmode & CSGMODE_DIFFERENCE_FLAG) * 0.1; + double zbase = 1 + ((csgmode & CSGMODE_DIFFERENCE_FLAG) ? 0.1 : 0); BOOST_FOREACH(const Outline2d &o, polygon.outlines()) { // Render top+bottom outlines diff --git a/testdata/scad/2D/features/highlight-modifier-2d.scad b/testdata/scad/2D/features/highlight-modifier-2d.scad new file mode 100644 index 00000000..7779fd69 --- /dev/null +++ b/testdata/scad/2D/features/highlight-modifier-2d.scad @@ -0,0 +1,10 @@ +difference() { + square(10, center=true); + #circle(3); +} +#if (true) square([11,12]); + +#translate([0,-12]) difference() { + square(10, center = true); + square(5, center = true); +} diff --git a/tests/regression/cgalpngtest/highlight-modifier-2d-expected.png b/tests/regression/cgalpngtest/highlight-modifier-2d-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..9c2cedf1993ca5e4e2887029cc429909e76b5489 GIT binary patch literal 6147 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 z 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 literal 0 HcmV?d00001 diff --git a/tests/regression/throwntogethertest/difference-tests-expected.png b/tests/regression/throwntogethertest/difference-tests-expected.png index 4702fbff83a332fbe76956e2bb16c83639f62b06..fb1753c546db9329ceb2ad801d103bbf303fca21 100644 GIT binary patch literal 11628 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

JXfZ%n|GE`q3yic6EiWdvW*dZGiG3v z&ZAlgux$Gx>=GGYFcp;JY^ADTph~D*L84f?njh;Ds9rYFKtL1s4e>rb{4uQWX=!_= z6p2x~x;I%_QdBD(E8%PS8Mp$B$m+7dgxM@t4p2u!d7L$1o3hUr&_Tkx2J>6$()fW-XB0^{T#j35 z{_Fm1qb>2ml)zNYkP-nv*w?)fYXreyE-uU3ePoyyGp~*P-bG6}uLG1eq}wq;#M})A ztVN$&CB5XD^BX=#WGnyiI?jn$!cxlF-llXz>EdX5Uk$8Pi9Ldok-;-G)@3|!(z4*d z(4~AE_i+K=R!7=Mr=8kqVImHsmh9xhKOommDb5Ro3%1Wgf&CiE&nink!&N^y zx{ixr{r)lMD{UX2^jqxOhB~hd^j%<`lcOqMMB}Z=@)ALxgQO-WJ#mk%MJz5{n7e3P z*7ng)2IZ<3$J32-^3W{8N)3r{3X)T+tL&e*Hv zl7;nw$Xpwm-d1Wa+_ZfV!ofQuZ*9T%R0$_pz8N~Ms$~g z0YY3IlUdAn>2fbT%F}xbN_S;J+CW%qVI{d0znTl=;wq+HCNF`8*1yYp@A0ea00>nb zoj#ho99_X)f**7l6ORYLc)&GJXu1{1)v}C$Ysv+V3483qzs!uW@1(nR>atxAr-rR) z>Rvp@z=fkObS1$o(R7a}>LvbzjJkP+rJM@6xYiR}@cz*`c#i+$>soCCgZ!;4Fb)_ZK$GF7&O4o`CD1HCX7r$HrmVLkxkh7mha0 zU`TFDgh%Mo{jDs_2vi}=(AXtwl^t$>*~I{03Gc3lMB~o2Oz)q8{NZ>>cnP4ucUC2A zzF4dIz8yQPqe-EtGriHbi22M&(J3s35muG4S?7rr6>I(umnCzR7X`t3gk0+NMIheM z!25TfV&x7QxKgF&AG_+R?`Y9(L}rKyjRlynZ0S0G+<|vEukGs$gh^Q0$=1uSk{pGH9yU%e-m;9A*Lg+AR+d(0fF9}nj;KPGYWO^WFBX_y^S|E z$lJAlOXurA_lPAmcvn&Ip1`C-+6nTG(#Eo;u6{;yKMz&A-JrtMt0q^k{7&PL_Mblt z@uxDMU7XpK>F^wagoHeFj}d_A;kFKf8vqRYa1(+Ko6QKp%Xu+y^u=8ICUNM01Z*9^ z==9;cLwpYV|J1u}2=+hBm4ayCnfRgqPs585rwxu}9g82|Aoze3H$#LZ3r|5+{INPyli(5yhRNd>tE0- I(s2p-AFi*4=>Px# literal 11622 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 literal 0 HcmV?d00001 From 9b00f693118d429fb2e1bbba51c44435c53c6930 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Tue, 23 Dec 2014 00:49:37 -0500 Subject: [PATCH 11/11] #1065 Made font cache progress dialog indeterminate also on Windows --- src/openscad.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/openscad.cc b/src/openscad.cc index 293918ae..7dbffad8 100644 --- a/src/openscad.cc +++ b/src/openscad.cc @@ -600,7 +600,9 @@ void dialogThreadFunc(FontCacheInitializer *initializer) void dialogInitHandler(FontCacheInitializer *initializer, void *) { QProgressDialog dialog; - dialog.setLabelText("Fontconfig needs to update its font cache.\nThis can take up to a couple of minutes."); + dialog.setLabelText(_("Fontconfig needs to update its font cache.\nThis can take up to a couple of minutes.")); + dialog.setMinimum(0); + dialog.setMaximum(0); dialog.setCancelButton(0); QFutureWatcher futureWatcher;