/* Copyright (C) 1999 Stefan Westerfeld stefan@space.twc.de 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. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "structureport.h" #include "drawutils.h" #include #include #include #include #include #include #include using namespace std; StructurePort::StructurePort(Arts::StructurePortDesc SPortDesc, Arts::StructureDesc StructureDesc, StructureCanvas *canvas) : StructureComponent(canvas) { string portname = SPortDesc.name(); this->SPortDesc = SPortDesc; this->StructureDesc = StructureDesc; _x = SPortDesc.x(); _y = SPortDesc.y(); _selected = false; _visible = false; ModulePort::Direction dir; if(SPortDesc.type().direction == Arts::input) dir = ModulePort::in; else dir = ModulePort::out; if(SPortDesc.type().connType == Arts::conn_property) arts_debug("got property here...."); // owner, description, portnr arts_debug(">>creating structureport: %s",portname.c_str()); _port = new ModulePort(this, portname.c_str(), 0, dir,this->SPortDesc); arts_debug("<<"); } StructurePort::~StructurePort() { hide(); StructureDesc.freeStructurePortDesc(SPortDesc); delete _port; } bool StructurePort::moveInternal(int x, int y) { return SPortDesc.moveTo(x, y); } int StructurePort::width() const { return 1; } int StructurePort::height() const { return 1; } StructureComponent::ComponentType StructurePort::type() { return ctPort; } bool StructurePort::drawNeedsBackground(int segment) { assert(segment==0); return true; } void StructurePort::drawSegment(TQPainter *dest, int cellsize, int segment) { TQString pname = TQString::fromLocal8Bit(SPortDesc.name().c_str()); assert(segment==0); TQPainter &p = *dest; int direction = (_port->direction == ModulePort::out)?1:0; // FIXME: make these color defs available at one central place, they // are currently copied from main.cpp TQColor mcolor(43,43,168); TQColor mcolorlight(164,176,242); TQColorGroup g( TQt::white, TQt::blue, mcolorlight, mcolor.dark(), mcolor, TQt::black, TQt::black ); TQBrush fill( mcolor ); TQPen textpen(TQColor(255,255,180),1); int border = cellsize/10; int boxtop = (cellsize/2)*(1-direction); qDrawShadePanel(&p,0,boxtop,cellsize,cellsize/2, g, false, 1, &fill); p.setPen(textpen); // Selection box if(_selected) { TQPen pen(TQt::white,1,TQt::DotLine); p.setPen(pen); p.drawRect(0,boxtop,cellsize,cellsize/2); } // ... doesn't look centered without the 2*border ?!? int textwidth; TQString label=DrawUtils::cropText(&p, pname, cellsize-border*2, textwidth); p.drawText(border,border+boxtop,cellsize-border-1,(cellsize/2-1)-2*border, TQt::AlignCenter,label); int arrowwidth = cellsize/4; int i; for(i=0;i<3;i++) { TQBrush fbrush; int delta = 0; switch(i) { case 0: delta = 0; fbrush = TQBrush(g.light()); break; case 1: delta = 2; fbrush = TQBrush(g.dark()); break; case 2: delta = 1; fbrush = fill; break; } /********************** - | | c | | - -+ +- d | | - \ / \ / \_/ |b| w |b| *********************/ int t = (cellsize/2-1)*direction; // top int l = delta; // left int w = arrowwidth-2; // arrow body width int h = cellsize/2; // total arrow height int b = (cellsize/2-arrowwidth)/2; // x border width /* int c = cellsize/10; int d = cellsize/6; */ int c = cellsize/12; int d = cellsize/5; TQPointArray a(9); a.setPoint(0,b+l,t); a.setPoint(1,b+l,t+c); a.setPoint(2,l,t+c); a.setPoint(3,l,t+c+d); a.setPoint(4,b+w/2+l,t+h); a.setPoint(5,b*2+w+l,t+c+d); a.setPoint(6,b*2+w+l,t+c); a.setPoint(7,b+w+l,t+c); a.setPoint(8,b+w+l,t); //a.setPoint(9,b+l,t); /* a.setPoint(0,t,b+l); a.setPoint(1,t+c,b+l); a.setPoint(2,t+c,l); a.setPoint(3,t+c+d,l); a.setPoint(4,t+h,b+w/2+l); a.setPoint(5,t+c+d,b*2+w+l); a.setPoint(6,t+c,b*2+w+l); a.setPoint(7,t+c,b+w+l); a.setPoint(8,t,b+w+l); a.setPoint(9,t,b+l); */ p.setPen(TQt::NoPen); p.setBrush(fbrush); p.drawPolygon(a); if(delta==1 && direction==0) { p.setPen(g.light()); p.drawLine(b+l,t,b+w+l,t); } /* p.fillRect((cellsize/2-arrowwidth)/2+delta,cellsize/2-1, arrowwidth,cellsize/2,fbrush); */ } { int border = cellsize/7; TQBrush pbrush(_port->color(false)); _port->clickrect = TQRect(border,direction * cellsize/2 + border, cellsize/2-2*border, cellsize/2-2*border); qDrawShadePanel(&p, _port->clickrect, g, _port->down(), 2, &pbrush); } } ModulePort *StructurePort::portAt(int segment, int x, int y) { assert(segment == 0); TQPoint clickpoint(x,y); if(_port->clickrect.contains(clickpoint)) return _port; return 0; } void StructurePort::dumpPorts(list& ports) { ports.push_back(_port); } TQPixmap *StructurePort::pixmap() { return 0; } TQString StructurePort::name() { return TQString::fromLocal8Bit(SPortDesc.name().c_str()); } void StructurePort::raisePosition() { SPortDesc.raisePosition(); } void StructurePort::lowerPosition() { SPortDesc.lowerPosition(); } void StructurePort::rename(const char *newname) { SPortDesc.rename(newname); canvas->redrawRect(_x,_y,1,1); } long StructurePort::id() { return SPortDesc.ID(); } long StructurePort::position() { return SPortDesc.position(); } ModulePort *StructurePort::port() { return _port; } const char *StructurePort::inheritedInterface() { static string ii; ii = SPortDesc.inheritedInterface(); return ii.c_str(); } void StructurePort::inheritedInterface(const char *iface) { SPortDesc.inheritedInterface(iface); }