Files
create/src/Gui/TaskView/TaskSelectLinkProperty.cpp
wmayer 96adb98f46 Gui: modernize C++11
* use nullptr
2022-03-23 18:41:21 +01:00

243 lines
8.5 KiB
C++

/***************************************************************************
* Copyright (c) 2010 Jürgen Riegel <juergen.riegel@web.de> *
* *
* 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"
#include <App/Document.h>
#include <App/DocumentObject.h>
#include <Base/Console.h>
#include <Gui/BitmapFactory.h>
#include <Gui/SelectionFilter.h>
#include <Gui/SelectionObject.h>
#include "ui_TaskSelectLinkProperty.h"
#include "TaskSelectLinkProperty.h"
using namespace Gui::TaskView;
/* TRANSLATOR Gui::TaskView::TaskSelectLinkProperty */
TaskSelectLinkProperty::TaskSelectLinkProperty(const char *sFilter,App::Property *prop,QWidget *parent)
: TaskBox(Gui::BitmapFactory().pixmap("mouse_pointer"),tr("edit selection"),true, parent),Filter(nullptr),LinkSub(nullptr),LinkList(nullptr)
{
// we need a separate container widget to add all controls to
proxy = new QWidget(this);
ui = new Ui_TaskSelectLinkProperty();
ui->setupUi(proxy);
QMetaObject::connectSlotsByName(this);
this->groupLayout()->addWidget(proxy);
Gui::Selection().Attach(this);
ui->Remove->setIcon(Gui::BitmapFactory().iconFromTheme("delete"));
ui->Add->setIcon(Gui::BitmapFactory().iconFromTheme("list-add"));
ui->Invert->setIcon(Gui::BitmapFactory().iconFromTheme("list-remove"));
ui->Help->setIcon(Gui::BitmapFactory().iconFromTheme("help-browser"));
// deactivate not implemented stuff
ui->Remove->setDisabled(true);
ui->Add->setDisabled(true);
ui->Invert->setDisabled(true);
ui->Help->setDisabled(true);
// property have to be set!
assert(prop);
StartObject = nullptr;
if (prop->getTypeId().isDerivedFrom(App::PropertyLinkSub::getClassTypeId())) {
LinkSub = dynamic_cast<App::PropertyLinkSub *>(prop);
}
else if (prop->getTypeId().isDerivedFrom(App::PropertyLinkList::getClassTypeId())) {
LinkList = dynamic_cast<App::PropertyLinkList *>(prop);
}
else {
Base::Console().Warning("Unknown Link property type in "
"Gui::TaskView::TaskSelectLinkProperty::TaskSelectLinkProperty()");
}
setFilter(sFilter);
}
TaskSelectLinkProperty::~TaskSelectLinkProperty()
{
delete ui;
Gui::Selection().Detach(this);
}
void TaskSelectLinkProperty::changeEvent(QEvent *e)
{
TaskBox::changeEvent(e);
if (e->type() == QEvent::LanguageChange) {
ui->retranslateUi(proxy);
}
}
/// @cond DOXERR
bool TaskSelectLinkProperty::setFilter(const char * sFilter)
{
Filter = new SelectionFilter(sFilter);
return Filter->isValid();
}
void TaskSelectLinkProperty::activate(void)
{
// first clear the selection
Gui::Selection().clearSelection();
// set the gate for the filter
Gui::Selection().addSelectionGate(new SelectionFilterGate(Filter));
// In case of LinkSub property
if (LinkSub) {
// save the start values for a cnacel operation (reject())
StartValueBuffer = LinkSub->getSubValues();
StartObject = LinkSub->getValue();
if(StartObject) {
std::string ObjName = StartObject->getNameInDocument();
std::string DocName = StartObject->getDocument()->getName();
for (std::vector<std::string>::const_iterator it = StartValueBuffer.begin();it!=StartValueBuffer.end();++it)
{
Gui::Selection().addSelection(DocName.c_str(),ObjName.c_str(),it->c_str());
}
}
}
// In case of LinkList property
else if (LinkList) {
// save the start values for a cnacel operation (reject())
const std::vector<App::DocumentObject*> &Values = LinkList->getValues();
for(std::vector<App::DocumentObject*>::const_iterator it = Values.begin();it!=Values.end();++it)
{
std::string ObjName = (*it)->getNameInDocument();
std::string DocName = (*it)->getDocument()->getName();
Gui::Selection().addSelection(DocName.c_str(),ObjName.c_str());
}
}
checkSelectionStatus();
}
bool TaskSelectLinkProperty::accept(void)
{
// set the proptery with the selection
sendSelection2Property();
// clear selection and remove gate (return to normal operation)
Gui::Selection().clearSelection();
Gui::Selection().rmvSelectionGate();
return true;
}
bool TaskSelectLinkProperty::reject(void)
{
if(LinkSub){
// restore the old values
LinkSub->setValue(StartObject,StartValueBuffer);
}
// clear selection and remove gate (return to normal operation)
Gui::Selection().clearSelection();
Gui::Selection().rmvSelectionGate();
return true;
}
void TaskSelectLinkProperty::sendSelection2Property(void)
{
if (LinkSub) {
std::vector<Gui::SelectionObject> temp = Gui::Selection().getSelectionEx();
assert(temp.size() >= 1);
LinkSub->setValue(temp[0].getObject(),temp[0].getSubNames());
}
else if (LinkList) {
std::vector<Gui::SelectionObject> sel = Gui::Selection().getSelectionEx();
std::vector<App::DocumentObject*> temp;
for (std::vector<Gui::SelectionObject>::iterator it=sel.begin();it!=sel.end();++it)
temp.push_back(it->getObject());
LinkList->setValues(temp);
}
}
void TaskSelectLinkProperty::checkSelectionStatus(void)
{
QPalette palette(QApplication::palette());
if (Filter->match()) {
palette.setBrush(QPalette::Base,QColor(200,250,200));
emitSelectionFit();
}
else {
palette.setBrush(QPalette::Base,QColor(250,200,200));
emitSelectionMisfit();
}
//ui->listWidget->setAutoFillBackground(true);
ui->listWidget->setPalette(palette);
}
void TaskSelectLinkProperty::OnChange(Gui::SelectionSingleton::SubjectType &rCaller,
Gui::SelectionSingleton::MessageType Reason)
{
Q_UNUSED(rCaller);
if (Reason.Type == SelectionChanges::AddSelection ||
Reason.Type == SelectionChanges::RmvSelection ||
Reason.Type == SelectionChanges::SetSelection ||
Reason.Type == SelectionChanges::ClrSelection) {
ui->listWidget->clear();
std::vector<Gui::SelectionSingleton::SelObj> sel = Gui::Selection().getSelection();
for (std::vector<Gui::SelectionSingleton::SelObj>::const_iterator it=sel.begin();it!=sel.end();++it){
std::string temp;
temp += it->FeatName;
if (strcmp(it->SubName, "") != 0){
temp += "::";
temp += it->SubName;
}
new QListWidgetItem(QString::fromLatin1(temp.c_str()), ui->listWidget);
}
checkSelectionStatus();
}
}
/// @endcond
void TaskSelectLinkProperty::on_Remove_clicked(bool)
{
}
void TaskSelectLinkProperty::on_Add_clicked(bool)
{
}
void TaskSelectLinkProperty::on_Invert_clicked(bool)
{
}
void TaskSelectLinkProperty::on_Help_clicked(bool)
{
}
#include "moc_TaskSelectLinkProperty.cpp"