Improved linking
This commit is contained in:
parent
dfe108cb82
commit
8513711d66
9 changed files with 335 additions and 4 deletions
|
@ -35,6 +35,7 @@ SET(OVQT_PLUGIN_GUI_EDITOR_HDR
|
||||||
action_property_manager.h
|
action_property_manager.h
|
||||||
texture_property_manager.h
|
texture_property_manager.h
|
||||||
expression_editor.h
|
expression_editor.h
|
||||||
|
expr_link_dlg.h
|
||||||
)
|
)
|
||||||
|
|
||||||
SET(OVQT_PLUGIN_GUI_EDITOR_UIS
|
SET(OVQT_PLUGIN_GUI_EDITOR_UIS
|
||||||
|
@ -53,6 +54,7 @@ SET(OVQT_PLUGIN_GUI_EDITOR_UIS
|
||||||
action_list.ui
|
action_list.ui
|
||||||
texture_chooser.ui
|
texture_chooser.ui
|
||||||
expression_editor.ui
|
expression_editor.ui
|
||||||
|
expr_link_dlg.ui
|
||||||
)
|
)
|
||||||
|
|
||||||
SET(QT_USE_QTGUI TRUE)
|
SET(QT_USE_QTGUI TRUE)
|
||||||
|
|
122
code/studio/src/plugins/gui_editor/expr_link_dlg.cpp
Normal file
122
code/studio/src/plugins/gui_editor/expr_link_dlg.cpp
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
// Ryzom Core Studio - Georges Editor Plugin
|
||||||
|
//
|
||||||
|
// Copyright (C) 2014 Laszlo Kis-Adam
|
||||||
|
// Copyright (C) 2010 Ryzom Core <http://ryzomcore.org/>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#include "expr_link_dlg.h"
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
ExprLinkDlg::ExprLinkDlg( QWidget *parent ) :
|
||||||
|
QDialog( parent )
|
||||||
|
{
|
||||||
|
m_ui.setupUi( this );
|
||||||
|
|
||||||
|
connect( m_ui.okButton, SIGNAL( clicked( bool ) ), this, SLOT( onOKClicked() ) );
|
||||||
|
connect( m_ui.cancelButton, SIGNAL( clicked( bool ) ), this, SLOT( onCancelClicked() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
ExprLinkDlg::~ExprLinkDlg()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExprLinkDlg::load( const QList< SlotInfo > &a, const QList< SlotInfo > &b )
|
||||||
|
{
|
||||||
|
QListIterator< SlotInfo > itra( a );
|
||||||
|
QListIterator< SlotInfo > itrb( b );
|
||||||
|
|
||||||
|
while( itra.hasNext() )
|
||||||
|
{
|
||||||
|
const SlotInfo &info = itra.next();
|
||||||
|
|
||||||
|
QListWidgetItem *item = new QListWidgetItem();
|
||||||
|
item->setText( info.name );
|
||||||
|
item->setData( Qt::UserRole, info.slot );
|
||||||
|
|
||||||
|
m_ui.list1->addItem( item );
|
||||||
|
}
|
||||||
|
|
||||||
|
while( itrb.hasNext() )
|
||||||
|
{
|
||||||
|
const SlotInfo &info = itrb.next();
|
||||||
|
|
||||||
|
QListWidgetItem *item = new QListWidgetItem();
|
||||||
|
item->setText( info.name );
|
||||||
|
item->setData( Qt::UserRole, info.slot );
|
||||||
|
|
||||||
|
m_ui.list2->addItem( item );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int ExprLinkDlg::getSlotA() const
|
||||||
|
{
|
||||||
|
QListWidgetItem *item = m_ui.list1->currentItem();
|
||||||
|
if( item == NULL )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
int slot = item->data( Qt::UserRole ).toInt();
|
||||||
|
return slot;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ExprLinkDlg::getSlotB() const
|
||||||
|
{
|
||||||
|
QListWidgetItem *item = m_ui.list2->currentItem();
|
||||||
|
if( item == NULL )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
int slot = item->data( Qt::UserRole ).toInt();
|
||||||
|
return slot;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExprLinkDlg::onOKClicked()
|
||||||
|
{
|
||||||
|
int slotA = getSlotA();
|
||||||
|
int slotB = getSlotB();
|
||||||
|
|
||||||
|
if( ( slotA == -1 ) || ( slotB == -1 ) )
|
||||||
|
{
|
||||||
|
QMessageBox::information( this,
|
||||||
|
tr( "No slots selected" ),
|
||||||
|
tr( "You need to select a slot on both sides." ) );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( slotA == 0 ) && ( slotB == 0 ) )
|
||||||
|
{
|
||||||
|
QMessageBox::information( this,
|
||||||
|
tr( "Wrong slots selected" ),
|
||||||
|
tr( "You can only select the 'Out' slot on one of the sides." ) );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( slotA != 0 ) && ( slotB != 0 ) )
|
||||||
|
{
|
||||||
|
QMessageBox::information( this,
|
||||||
|
tr( "Wrong slots selected" ),
|
||||||
|
tr( "One of the slots selected must be the 'Out' slot!" ) );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExprLinkDlg::onCancelClicked()
|
||||||
|
{
|
||||||
|
reject();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
49
code/studio/src/plugins/gui_editor/expr_link_dlg.h
Normal file
49
code/studio/src/plugins/gui_editor/expr_link_dlg.h
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
// Ryzom Core Studio - Georges Editor Plugin
|
||||||
|
//
|
||||||
|
// Copyright (C) 2014 Laszlo Kis-Adam
|
||||||
|
// Copyright (C) 2010 Ryzom Core <http://ryzomcore.org/>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef EXPR_LINK_DLG
|
||||||
|
#define EXPR_LINK_DLG
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QList>
|
||||||
|
#include "ui_expr_link_dlg.h"
|
||||||
|
#include "expr_slot_info.h"
|
||||||
|
|
||||||
|
class ExprLinkDlg : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
ExprLinkDlg( QWidget *parent = NULL );
|
||||||
|
~ExprLinkDlg();
|
||||||
|
|
||||||
|
void load( const QList< SlotInfo > &a, const QList< SlotInfo > &b );
|
||||||
|
|
||||||
|
int getSlotA() const;
|
||||||
|
int getSlotB() const;
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
void onOKClicked();
|
||||||
|
void onCancelClicked();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::ExprLinkDialog m_ui;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
58
code/studio/src/plugins/gui_editor/expr_link_dlg.ui
Normal file
58
code/studio/src/plugins/gui_editor/expr_link_dlg.ui
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>ExprLinkDialog</class>
|
||||||
|
<widget class="QDialog" name="ExprLinkDialog">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>581</width>
|
||||||
|
<height>388</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Linking nodes</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0" colspan="3">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QListWidget" name="list1"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QListWidget" name="list2"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<spacer name="horizontalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>398</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QPushButton" name="okButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Ok</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QPushButton" name="cancelButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Cancel</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
32
code/studio/src/plugins/gui_editor/expr_slot_info.h
Normal file
32
code/studio/src/plugins/gui_editor/expr_slot_info.h
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
// Ryzom Core Studio - Georges Editor Plugin
|
||||||
|
//
|
||||||
|
// Copyright (C) 2014 Laszlo Kis-Adam
|
||||||
|
// Copyright (C) 2010 Ryzom Core <http://ryzomcore.org/>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef EXPR_SLOT_INFO
|
||||||
|
#define EXPR_SLOT_INFO
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
struct SlotInfo
|
||||||
|
{
|
||||||
|
QString name;
|
||||||
|
int slot;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
|
|
||||||
#include "expression_node.h"
|
#include "expression_node.h"
|
||||||
#include "expression_link.h"
|
#include "expression_link.h"
|
||||||
|
#include "expr_link_dlg.h"
|
||||||
|
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
@ -119,16 +120,32 @@ void ExpressionEditor::onLinkItems()
|
||||||
ExpressionNode *from = static_cast< ExpressionNode* >( l[ 0 ] );
|
ExpressionNode *from = static_cast< ExpressionNode* >( l[ 0 ] );
|
||||||
ExpressionNode *to = static_cast< ExpressionNode* >( l[ 1 ] );
|
ExpressionNode *to = static_cast< ExpressionNode* >( l[ 1 ] );
|
||||||
|
|
||||||
if( ( from->link( 0 ) != NULL ) || ( to->link( 0 ) != NULL ) )
|
QList< SlotInfo > froml;
|
||||||
|
QList< SlotInfo > tol;
|
||||||
|
|
||||||
|
from->getSlots( froml );
|
||||||
|
to->getSlots( tol );
|
||||||
|
|
||||||
|
// If there are no free slots, or both "Out" slots are taken we can't link
|
||||||
|
if( froml.isEmpty() || tol.isEmpty() || ( !from->slotEmpty( 0 ) && !to->slotEmpty( 0 ) ) )
|
||||||
{
|
{
|
||||||
QMessageBox::information( this,
|
QMessageBox::information( this,
|
||||||
tr( "Failed to link nodes" ),
|
tr( "Failed to link nodes" ),
|
||||||
tr( "Unfortunately those nodes are already linked." ) );
|
tr( "Unfortunately those nodes are full." ) );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ExprLinkDlg d;
|
||||||
|
d.load( froml, tol );
|
||||||
|
int result = d.exec();
|
||||||
|
if( result == QDialog::Rejected )
|
||||||
|
return;
|
||||||
|
|
||||||
|
int slotA = d.getSlotA();
|
||||||
|
int slotB = d.getSlotB();
|
||||||
|
|
||||||
ExpressionLink *link = new ExpressionLink();
|
ExpressionLink *link = new ExpressionLink();
|
||||||
link->link( from, to, 0, 0 );
|
link->link( from, to, slotA, slotB );
|
||||||
|
|
||||||
m_scene->addItem( link );
|
m_scene->addItem( link );
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,13 +50,19 @@ void ExpressionLink::link( ExpressionNode *from, ExpressionNode *to, int fromSlo
|
||||||
|
|
||||||
void ExpressionLink::unlink()
|
void ExpressionLink::unlink()
|
||||||
{
|
{
|
||||||
|
if( m_from == NULL )
|
||||||
|
return;
|
||||||
|
|
||||||
m_from->setLink( NULL, m_fromSlot );
|
m_from->setLink( NULL, m_fromSlot );
|
||||||
m_to->setLink( NULL, m_toSlot );
|
m_to->setLink( NULL, m_toSlot );
|
||||||
|
|
||||||
|
m_from = NULL;
|
||||||
|
m_to = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExpressionLink::nodeMoved()
|
void ExpressionLink::nodeMoved()
|
||||||
{
|
{
|
||||||
setLine( QLineF( m_from->slotPos( 0 ), m_to->slotPos( 0 ) ) );
|
setLine( QLineF( m_from->slotPos( m_fromSlot ), m_to->slotPos( m_toSlot ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExpressionLink::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget )
|
void ExpressionLink::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget )
|
||||||
|
|
|
@ -89,6 +89,8 @@ public:
|
||||||
painter->drawText( tbox, Qt::AlignRight, m_info.text );
|
painter->drawText( tbox, Qt::AlignRight, m_info.text );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString text() const{ return m_info.text; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
NodeSlotInfo m_info;
|
NodeSlotInfo m_info;
|
||||||
};
|
};
|
||||||
|
@ -109,6 +111,8 @@ QGraphicsItem( parent )
|
||||||
|
|
||||||
ExpressionNode::~ExpressionNode()
|
ExpressionNode::~ExpressionNode()
|
||||||
{
|
{
|
||||||
|
clearLinks();
|
||||||
|
|
||||||
qDeleteAll( m_slots );
|
qDeleteAll( m_slots );
|
||||||
m_slots.clear();
|
m_slots.clear();
|
||||||
}
|
}
|
||||||
|
@ -169,6 +173,29 @@ QPointF ExpressionNode::slotPos( int slot ) const
|
||||||
return mp;
|
return mp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ExpressionNode::slotEmpty( int slot ) const
|
||||||
|
{
|
||||||
|
if( m_links[ 0 ] == NULL )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExpressionNode::getSlots( QList< SlotInfo > &l )
|
||||||
|
{
|
||||||
|
SlotInfo info;
|
||||||
|
|
||||||
|
for( int i = 0; i < m_slots.count(); i++ )
|
||||||
|
{
|
||||||
|
if( m_links[ i ] != NULL )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
info.name = m_slots[ i ]->text();
|
||||||
|
info.slot = i;
|
||||||
|
l.push_back( info );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ExpressionNode::setLink( ExpressionLink *link, int slot )
|
void ExpressionNode::setLink( ExpressionLink *link, int slot )
|
||||||
{
|
{
|
||||||
m_links[ slot ] = link;
|
m_links[ slot ] = link;
|
||||||
|
@ -239,3 +266,15 @@ void ExpressionNode::paintSlots( QPainter *painter )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ExpressionNode::clearLinks()
|
||||||
|
{
|
||||||
|
for( int i = 0; i < m_links.count(); i++ )
|
||||||
|
{
|
||||||
|
ExpressionLink *link = m_links[ i ];
|
||||||
|
if( link == NULL )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
link->unlink();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
#include <QGraphicsItem>
|
#include <QGraphicsItem>
|
||||||
#include <QList>
|
#include <QList>
|
||||||
|
#include "expr_slot_info.h"
|
||||||
|
|
||||||
class ExpressionLink;
|
class ExpressionLink;
|
||||||
class NodeSlot;
|
class NodeSlot;
|
||||||
|
@ -42,12 +43,17 @@ public:
|
||||||
|
|
||||||
int slotCount() const{ return m_slots.count(); }
|
int slotCount() const{ return m_slots.count(); }
|
||||||
|
|
||||||
|
bool slotEmpty( int slot ) const;
|
||||||
|
|
||||||
|
void getSlots( QList< SlotInfo > &l );
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void mouseMoveEvent( QGraphicsSceneMouseEvent *e );
|
void mouseMoveEvent( QGraphicsSceneMouseEvent *e );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void createSlots();
|
void createSlots();
|
||||||
void paintSlots( QPainter *painter );
|
void paintSlots( QPainter *painter );
|
||||||
|
void clearLinks();
|
||||||
|
|
||||||
qreal m_w;
|
qreal m_w;
|
||||||
qreal m_h;
|
qreal m_h;
|
||||||
|
|
Loading…
Reference in a new issue