[TD]Allow selection of Page when adding View

This commit is contained in:
Wanderer Fan
2021-12-30 12:25:24 -05:00
committed by WandererFan
parent cec898c6b3
commit 4430e3ec8c
5 changed files with 284 additions and 4 deletions

View File

@@ -54,6 +54,7 @@ else()
endif()
set(TechDrawGui_UIC_SRCS
DlgPageChooser.ui
DlgPrefsTechDrawAdvanced.ui
DlgPrefsTechDrawAnnotation.ui
DlgPrefsTechDrawColors.ui
@@ -117,6 +118,9 @@ SET(TechDrawGui_SRCS
TaskProjGroup.ui
TaskProjGroup.cpp
TaskProjGroup.h
DlgPageChooser.ui
DlgPageChooser.cpp
DlgPageChooser.h
DlgPrefsTechDrawGeneral.ui
DlgPrefsTechDrawGeneralImp.cpp
DlgPrefsTechDrawGeneralImp.h

View File

@@ -0,0 +1,103 @@
/****************************************************************************
* Copyright (c) 2021 Wanderer Fan <wandererfan@gmail.com> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library 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 Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
****************************************************************************/
#include "PreCompiled.h"
#ifndef _PreComp_
# include <Qt>
# include <QListWidget>
# include <QListWidgetItem>
# include <QPushButton>
# include <QList>
#endif
#include <Base/Console.h>
#include <Base/Tools.h>
#include "DlgPageChooser.h"
#include "ui_DlgPageChooser.h"
FC_LOG_LEVEL_INIT("Gui",true,true)
using namespace TechDrawGui;
/* TRANSLATOR Gui::DlgPageChooser */
DlgPageChooser::DlgPageChooser(
const std::vector<std::string> labels,
const std::vector<std::string> names,
QWidget* parent, Qt::WindowFlags fl)
: QDialog(parent, fl), ui(new Ui_DlgPageChooser)
{
ui->setupUi(this);
ui->lwPages->setSortingEnabled(true);
fillList(labels, names);
connect(ui->bbButtons, SIGNAL(accepted()), this, SLOT(accept()));
connect(ui->bbButtons, SIGNAL(rejected()), this, SLOT(reject()));
}
/**
* Destroys the object and frees any allocated resources
*/
DlgPageChooser::~DlgPageChooser()
{
// no need to delete child widgets, Qt does it all for us
delete ui;
}
void DlgPageChooser::fillList(std::vector<std::string> labels, std::vector<std::string> names)
{
QListWidgetItem* item;
QString qLabel;
QString qName;
QString qText;
int labelCount = labels.size();
int i = 0;
for(; i < labelCount; i++) {
qLabel = Base::Tools::fromStdString(labels[i]);
qName = Base::Tools::fromStdString(names[i]);
qText = QString::fromUtf8("%1 (%2)").arg(qLabel).arg(qName);
item = new QListWidgetItem(qText, ui->lwPages);
item->setData(Qt::UserRole, qName);
}
}
std::string DlgPageChooser::getSelection() const
{
std::string result;
QList<QListWidgetItem*> sels = ui->lwPages->selectedItems();
if (!sels.empty()) {
QListWidgetItem* item = sels.front();
result = item->data(Qt::UserRole).toByteArray().constData();
}
return result;
}
void DlgPageChooser::accept() {
QDialog::accept();
}
void DlgPageChooser::reject() {
QDialog::reject();
}
#include "moc_DlgPageChooser.cpp"

View File

@@ -0,0 +1,57 @@
/****************************************************************************
* Copyright (c) 2021 Wanderer Fan <wandererfan@gmail.com> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library 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 Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
****************************************************************************/
#ifndef GUI_DLGPAGECHOOSER_H
#define GUI_DLGPAGECHOOSER_H
#include <QDialog>
namespace TechDrawGui {
class Ui_DlgPageChooser;
class TechDrawGuiExport DlgPageChooser : public QDialog
{
Q_OBJECT
public:
DlgPageChooser(const std::vector<std::string> labels,
const std::vector<std::string> names,
QWidget* parent = 0, Qt::WindowFlags fl = Qt::WindowFlags());
~DlgPageChooser();
std::string getSelection() const;
void accept();
void reject();
private Q_SLOTS:
private:
void fillList(std::vector<std::string> labels, std::vector<std::string> names);
private:
Ui_DlgPageChooser* ui;
};
} // namespace Gui
#endif // GUI_DLGPAGECHOOSER_H

View File

@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>TechDrawGui::DlgPageChooser</class>
<widget class="QDialog" name="TechDrawGui::DlgPageChooser">
<property name="windowModality">
<enum>Qt::WindowModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>360</width>
<height>280</height>
</rect>
</property>
<property name="windowTitle">
<string>Page Chooser</string>
</property>
<property name="toolTip">
<string/>
</property>
<property name="modal">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>FreeCAD could not determine which Page to use. Please select a Page.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QListWidget" name="lwPages">
<property name="toolTip">
<string>Select a Page that should be used</string>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="bbButtons">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
<property name="centerButtons">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>bbButtons</sender>
<signal>accepted()</signal>
<receiver>TechDrawGui::DlgPageChooser</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>179</x>
<y>228</y>
</hint>
<hint type="destinationlabel">
<x>179</x>
<y>139</y>
</hint>
</hints>
</connection>
<connection>
<sender>bbButtons</sender>
<signal>rejected()</signal>
<receiver>TechDrawGui::DlgPageChooser</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>179</x>
<y>228</y>
</hint>
<hint type="destinationlabel">
<x>179</x>
<y>139</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@@ -80,6 +80,7 @@
#include "QGVPage.h"
#include "MDIViewPage.h"
#include "ViewProviderPage.h"
#include "DlgPageChooser.h"
#include "DrawGuiUtil.h"
using namespace TechDrawGui;
@@ -104,6 +105,8 @@ void DrawGuiUtil::loadArrowBox(QComboBox* qcb)
TechDraw::DrawPage* DrawGuiUtil::findPage(Gui::Command* cmd)
{
TechDraw::DrawPage* page = nullptr;
std::vector<std::string> names;
std::vector<std::string> labels;
//check Selection for a page
std::vector<App::DocumentObject*> selPages = cmd->getSelection().
@@ -127,8 +130,18 @@ TechDraw::DrawPage* DrawGuiUtil::findPage(Gui::Command* cmd)
page = qp->getDrawPage();
} else {
// no active page
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Which page?"),
QObject::tr("Can not determine correct page."));
for(auto obj: selPages) {
std::string name = obj->getNameInDocument();
names.push_back(name);
std::string label = obj->Label.getValue();
labels.push_back(label);
}
DlgPageChooser dlg(labels, names, Gui::getMainWindow());
if(dlg.exec()==QDialog::Accepted) {
std::string selName = dlg.getSelection();
App::Document* doc = cmd->getDocument();
page = static_cast<TechDraw::DrawPage*>(doc->getObject(selName.c_str()));
}
}
} else {
//only 1 page in document - use it
@@ -136,8 +149,18 @@ TechDraw::DrawPage* DrawGuiUtil::findPage(Gui::Command* cmd)
}
} else if (selPages.size() > 1) {
//multiple pages in selection
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Too many pages"),
QObject::tr("Select only 1 page."));
for(auto obj: selPages) {
std::string name = obj->getNameInDocument();
names.push_back(name);
std::string label = obj->Label.getValue();
labels.push_back(label);
}
DlgPageChooser dlg(labels, names, Gui::getMainWindow());
if(dlg.exec()==QDialog::Accepted) {
std::string selName = dlg.getSelection();
App::Document* doc = cmd->getDocument();
page = static_cast<TechDraw::DrawPage*>(doc->getObject(selName.c_str()));
}
} else {
//exactly 1 page in selection, use it
page = static_cast<TechDraw::DrawPage*>(selPages.front());