summaryrefslogtreecommitdiffstats
path: root/twin-styles/openlook/OpenLook.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'twin-styles/openlook/OpenLook.cpp')
-rw-r--r--twin-styles/openlook/OpenLook.cpp728
1 files changed, 728 insertions, 0 deletions
diff --git a/twin-styles/openlook/OpenLook.cpp b/twin-styles/openlook/OpenLook.cpp
new file mode 100644
index 00000000..46398e30
--- /dev/null
+++ b/twin-styles/openlook/OpenLook.cpp
@@ -0,0 +1,728 @@
+/*
+ 'OpenLook' twin client
+
+ Porting to trinity.2 API
+ Copyright 2003 Luciano Montanaro <mikelima@cirulla.net>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to
+ deal in the Software without restriction, including without limitation the
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "config.h"
+#include <unistd.h> // for usleep
+#include <math.h>
+
+#include <tqlayout.h>
+#include <tqpainter.h>
+#include <tqdrawutil.h>
+#include <tqtoolbutton.h>
+#include <tqimage.h>
+#include <tqlabel.h>
+#include <tqpixmap.h>
+
+#include <kapplication.h>
+#include <klocale.h>
+
+#include "OpenLook.h"
+
+extern "C" KDE_EXPORT KDecorationFactory* create_factory()
+{
+ return new OpenLook::DecorationFactory();
+}
+
+namespace OpenLook {
+
+static uint openLookCornerSize = 11;
+static uint openLookMargin = 5;
+static const uint openLookTextVMargin = 1;
+static uint titleHeight;
+
+// ---------------------------------------
+
+DecorationFactory::DecorationFactory()
+{
+}
+
+DecorationFactory::~DecorationFactory()
+{
+}
+
+KDecoration *DecorationFactory::createDecoration(KDecorationBridge *b)
+{
+ return new OpenLook(b, this);
+}
+
+bool DecorationFactory::reset(unsigned long /*changed*/)
+{
+ // TODO Do not recreate decorations if it is not needed. Look at
+ // ModernSystem for how to do that
+ // For now just return true.
+ return true;
+}
+
+bool DecorationFactory::supports( Ability ability )
+{
+ switch( ability )
+ {
+ case AbilityAnnounceButtons:
+ case AbilityButtonMinimize:
+ return true;
+ default:
+ return false;
+ };
+}
+
+TQValueList< DecorationFactory::BorderSize >
+DecorationFactory::borderSizes() const
+{
+ // the list must be sorted
+ return TQValueList< BorderSize >() << BorderNormal <<
+ BorderLarge << BorderVeryLarge << BorderHuge <<
+ BorderVeryHuge << BorderOversized;
+}
+
+// ---------------------------------------
+
+static inline const KDecorationOptions* options()
+{
+ return KDecoration::options();
+}
+
+// ---------------------------------------
+
+OpenLook::OpenLook(KDecorationBridge *b, KDecorationFactory *f) :
+ KDecoration(b, f),
+ titleSpacer_ (0),
+ mousePressPoint_(0, 0), // Anywhere outside button rect.
+ buttonDown_ (false)
+{
+}
+
+void OpenLook::init()
+{
+ static const int SUPPORTED_WINDOW_TYPES_MASK = NET::NormalMask |
+ NET::DesktopMask | NET::DockMask | NET::ToolbarMask | NET::MenuMask |
+ NET::DialogMask | NET::OverrideMask | NET::TopMenuMask |
+ NET::UtilityMask | NET::SplashMask;
+
+ createMainWidget(WStaticContents | WResizeNoErase | WRepaintNoErase);
+ widget()->installEventFilter(this);
+ widget()->setBackgroundMode(NoBackground);
+ NET::WindowType type = windowType(SUPPORTED_WINDOW_TYPES_MASK);
+ tool_ = (type == NET::Toolbar || type == NET::Utility || type == NET::Menu);
+ TQFontMetrics fm(options()->font(isActive(), tool_));
+
+ titleHeight = fm.height() + openLookTextVMargin * 2;
+
+ switch(KDecoration::options()->preferredBorderSize(factory())) {
+ case KDecoration::BorderLarge:
+ openLookMargin = 9;
+ break;
+ case KDecoration::BorderVeryLarge:
+ openLookMargin = 13;
+ break;
+ case KDecoration::BorderHuge:
+ openLookMargin = 18;
+ break;
+ case KDecoration::BorderVeryHuge:
+ openLookMargin = 27;
+ break;
+ case KDecoration::BorderOversized:
+ openLookMargin = 40;
+ break;
+ case KDecoration::BorderNormal:
+ default:
+ openLookMargin = 5;
+ }
+ openLookCornerSize = 2*openLookMargin + 1;
+ if (titleHeight <= openLookMargin)
+ titleHeight = openLookMargin+1;
+
+ doLayout();
+}
+
+OpenLook::~OpenLook()
+{
+ // Empty.
+}
+
+bool OpenLook::eventFilter(TQObject *o, TQEvent *e)
+{
+ if (TQT_BASE_OBJECT(o) != TQT_BASE_OBJECT(widget())) return false;
+ switch (e->type()) {
+ case TQEvent::Resize:
+ resizeEvent(TQT_TQRESIZEEVENT(e));
+ return true;
+ case TQEvent::Paint:
+ paintEvent(TQT_TQPAINTEVENT(e));
+ return true;
+ case TQEvent::MouseButtonDblClick:
+ mouseDoubleClickEvent(TQT_TQMOUSEEVENT(e));
+ return true;
+ case TQEvent::Wheel:
+ wheelEvent( TQT_TQWHEELEVENT( e ));
+ return true;
+ case TQEvent::MouseButtonPress:
+ if (!isButtonPress(TQT_TQMOUSEEVENT(e))) {
+ processMousePressEvent(TQT_TQMOUSEEVENT(e));
+ }
+ return true;
+ case TQEvent::MouseButtonRelease:
+ if (isButtonRelease(TQT_TQMOUSEEVENT(e))) {
+ return true;
+ } else {
+ return false;
+ }
+ case TQEvent::Show:
+ showEvent(TQT_TQSHOWEVENT(e));
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+
+ void
+OpenLook::borders(int &left, int &right, int &top, int &bottom) const
+{
+ // FRAME XXX Check
+ left = right = bottom = openLookMargin;
+ top = titleHeight + openLookMargin;
+}
+
+ void
+OpenLook::captionChange()
+{
+ widget()->update(titleRect());
+}
+
+ void
+OpenLook::shadeChange()
+{
+}
+
+TQSize OpenLook::tqminimumSize() const
+{
+ int left, right, top, bottom;
+ borders(left, right, top, bottom);
+ return TQSize(left + right + 2 * titleHeight, top + bottom);
+}
+
+ void
+OpenLook::resize(const TQSize& s)
+{
+ widget()->resize(s);
+ widget()->tqrepaint(); //there is some strange wrong tqrepaint of the frame without
+}
+
+ void
+OpenLook::paintEvent(TQPaintEvent * pe)
+{
+ TQRect tr(titleRect());
+
+ TQPainter p(widget());
+
+ TQRegion clipRegion(pe->region());
+
+ p.setClipRegion(clipRegion);
+
+ paintBorder(p);
+
+ paintTopLeftRect(p);
+ paintTopRightRect(p);
+ paintBottomLeftRect(p);
+ paintBottomRightRect(p);
+
+ p.setClipRegion(clipRegion + buttonRect());
+
+ TQBrush titleBackground(options()->color(KDecoration::ColorTitleBar, true));
+
+ if (isActive())
+ qDrawShadePanel(&p, tr, widget()->tqcolorGroup(), true, 1, &titleBackground);
+ else
+ p.fillRect(tr, widget()->tqcolorGroup().brush(TQColorGroup::Background));
+
+ p.setClipRegion(clipRegion);
+
+ paintButton(p);
+
+ p.setFont(options()->font(isActive(), tool_));
+
+ p.setPen(options()->color(KDecoration::ColorFont, isActive()));
+
+ tr.setLeft(openLookCornerSize + 3 + buttonRect().width() + 2);
+
+ p.drawText(tr, AlignCenter, caption());
+}
+
+ void
+OpenLook::showEvent(TQShowEvent *)
+{
+ widget()->tqrepaint();
+}
+
+ void
+OpenLook::mouseDoubleClickEvent(TQMouseEvent * e)
+{
+ if (e->button() == Qt::LeftButton && titleRect().contains(e->pos()))
+ {
+ titlebarDblClickOperation();
+ }
+}
+
+ void
+OpenLook::wheelEvent(TQWheelEvent *e)
+{
+ if (isSetShade() || titleRect().contains(e->pos()))
+ {
+ titlebarMouseWheelOperation( e->delta());
+ }
+}
+
+ void
+OpenLook::resizeEvent(TQResizeEvent* e)
+{
+ widget()->update();
+}
+
+ void
+OpenLook::activeChange()
+{
+ widget()->tqrepaint();
+}
+
+ KDecoration::Position
+OpenLook::mousePosition(const TQPoint & p) const
+{
+ if (topLeftRect().contains(p))
+ return PositionTopLeft;
+ else if (topRightRect().contains(p))
+ return PositionTopRight;
+ else if (bottomLeftRect().contains(p))
+ return PositionBottomLeft;
+ else if (bottomRightRect().contains(p))
+ return PositionBottomRight;
+ else
+ return PositionCenter;
+}
+
+ void
+OpenLook::iconChange()
+{
+}
+
+ void
+OpenLook::desktopChange()
+{
+}
+
+ void
+OpenLook::maximizeChange()
+{
+ widget()->tqrepaint(false);
+}
+
+ void
+OpenLook::doLayout()
+{
+ TQVBoxLayout * tqlayout = new TQVBoxLayout(widget(), openLookMargin);
+
+ titleSpacer_ =
+ new TQSpacerItem
+ (
+ 0,
+ titleHeight,
+ TQSizePolicy::Expanding,
+ TQSizePolicy::Fixed
+ );
+
+ tqlayout->addItem(titleSpacer_);
+
+ tqlayout->addSpacing(2);
+
+ TQBoxLayout * midLayout =
+ new TQBoxLayout(tqlayout, TQBoxLayout::LeftToRight, 0, 0);
+
+ if (isPreview()) {
+ midLayout->addWidget(new TQLabel(
+ i18n("<center><b>OpenLook preview</b></center>"),
+ widget()),
+ 1);
+ } else {
+ midLayout->addItem( new TQSpacerItem( 0, 0 ));
+ }
+
+}
+
+ bool
+OpenLook::animateMinimize(bool /*iconify*/)
+{
+#if 0
+ TQRect icongeom(iconGeometry());
+
+ if (!icongeom.isValid())
+ return false;
+
+ TQRect wingeom(tqgeometry());
+
+ TQPainter p(workspaceWidget());
+
+ p.setRasterOp(TQt::NotROP);
+
+#if 0
+ if (iconify)
+ p.setClipRegion(
+ TQRegion(workspace()->desktopWidget()->rect()) - wingeom
+ );
+#endif
+
+ for (uint count = 0; count < 4; count++)
+ {
+ grabXServer();
+
+ p.drawLine(wingeom.bottomRight(), icongeom.bottomRight());
+ p.drawLine(wingeom.bottomLeft(), icongeom.bottomLeft());
+ p.drawLine(wingeom.topLeft(), icongeom.topLeft());
+ p.drawLine(wingeom.topRight(), icongeom.topRight());
+
+ p.flush();
+
+ kapp->syncX();
+
+ usleep(10000);
+
+ p.drawLine(wingeom.bottomRight(), icongeom.bottomRight());
+ p.drawLine(wingeom.bottomLeft(), icongeom.bottomLeft());
+ p.drawLine(wingeom.topLeft(), icongeom.topLeft());
+ p.drawLine(wingeom.topRight(), icongeom.topRight());
+
+ p.flush();
+
+ kapp->syncX();
+
+ usleep(10000);
+
+ ungrabXServer();
+ }
+#endif
+ return true;
+}
+
+ TQRect
+OpenLook::topLeftRect() const
+{
+ return TQRect
+ (
+ 0,
+ 0,
+ openLookCornerSize,
+ openLookCornerSize
+ );
+}
+
+ TQRect
+OpenLook::topRightRect() const
+{
+ return TQRect
+ (
+ width() - openLookCornerSize,
+ 0,
+ openLookCornerSize,
+ openLookCornerSize
+ );
+}
+
+ TQRect
+OpenLook::bottomLeftRect() const
+{
+ return TQRect
+ (
+ 0,
+ height() - openLookCornerSize,
+ openLookCornerSize,
+ openLookCornerSize
+ );
+}
+
+ TQRect
+OpenLook::bottomRightRect() const
+{
+ return TQRect
+ (
+ width() - openLookCornerSize,
+ height() - openLookCornerSize,
+ openLookCornerSize,
+ openLookCornerSize
+ );
+}
+
+ void
+OpenLook::paintTopLeftRect(TQPainter & p) const
+{
+ TQColor handleColour(options()->color(KDecoration::ColorHandle, isActive()));
+
+ TQRect r(topLeftRect());
+
+ int x1(r.left());
+ int y1(r.top());
+ int x2(r.right());
+ int y2(r.bottom());
+
+ p.setPen(widget()->tqcolorGroup().light());
+
+ p.drawLine(x1, y1, x2, y1);
+ p.drawLine(x1, y1 + 1, x1, y2);
+
+ p.fillRect(x1 + 1, y1 + 1, r.width()-2, openLookMargin-2, handleColour);
+ p.fillRect(x1 + 1, y1 + 1, openLookMargin-2, r.height()-2, handleColour);
+
+ p.setPen(widget()->tqcolorGroup().dark());
+
+ p.drawLine(x2, y1 + 1, x2, y1 + openLookMargin-1);
+
+ p.drawLine(x1 + openLookMargin-1, y1 + openLookMargin-1, x2 - 1, y1 + openLookMargin-1);
+
+ p.drawLine(x1 + openLookMargin-1, y1 + openLookMargin, x1 + openLookMargin-1, y2 - 1);
+
+ p.drawLine(x1 + 1, y2, x1 + openLookMargin-1, y2);
+}
+
+ void
+OpenLook::paintTopRightRect(TQPainter & p) const
+{
+ TQColor handleColour(options()->color(KDecoration::ColorHandle, isActive()));
+
+ TQRect r(topRightRect());
+
+ int x1(r.left());
+ int y1(r.top());
+ int x2(r.right());
+ int y2(r.bottom());
+
+ p.setPen(widget()->tqcolorGroup().light());
+
+ p.drawLine(x1, y1, x2, y1);
+ p.drawLine(x1, y1 + 1, x1, y1 + openLookMargin-1);
+ p.drawLine(x2 - openLookMargin+1, y1 + openLookMargin, x2 - openLookMargin+1, y2);
+
+ p.fillRect(x1 + 1, y1 + 1, r.width()-2, openLookMargin-2, handleColour);
+ p.fillRect(x2 - openLookMargin + 2, y1 + 1, openLookMargin-2, r.height()-2, handleColour);
+
+ p.setPen(widget()->tqcolorGroup().dark());
+
+ p.drawLine(x1 + 1, y1 + openLookMargin-1, x2 - openLookMargin+1, y1 + openLookMargin-1);
+ p.drawLine(x2, y1 + 1, x2, y2);
+ p.drawLine(x2 - openLookMargin+1, y2, x2 - 1, y2);
+}
+
+ void
+OpenLook::paintBottomLeftRect(TQPainter & p) const
+{
+ TQColor handleColour(options()->color(KDecoration::ColorHandle, isActive()));
+
+ TQRect r(bottomLeftRect());
+
+ int x1(r.left());
+ int y1(r.top());
+ int x2(r.right());
+ int y2(r.bottom());
+
+ p.setPen(widget()->tqcolorGroup().light());
+
+ p.drawLine(x1, y1, x1 + openLookMargin-1, y1);
+ p.drawLine(x1, y1 + 1, x1, y2);
+ p.drawLine(x1 + openLookMargin, y2 - openLookMargin+1, x2, y2 - openLookMargin+1);
+
+ p.fillRect(x1 + 1, y2 - openLookMargin + 2, r.width()-2, openLookMargin-2, handleColour);
+ p.fillRect(x1 + 1, y1 + 1, openLookMargin-2, r.height()-2, handleColour);
+
+ p.setPen(widget()->tqcolorGroup().dark());
+
+ p.drawLine(x1 + openLookMargin-1, y1 + 1, x1 + openLookMargin-1, y2 - openLookMargin);
+ p.drawLine(x1 + 1, y2, x2, y2);
+ p.drawLine(x2, y2 - openLookMargin+2, x2, y2 - 1);
+}
+
+ void
+OpenLook::paintBottomRightRect(TQPainter & p) const
+{
+ TQColor handleColour(options()->color(KDecoration::ColorHandle, isActive()));
+
+ TQRect r(bottomRightRect());
+
+ int x1(r.left());
+ int y1(r.top());
+ int x2(r.right());
+ int y2(r.bottom());
+
+ p.setPen(widget()->tqcolorGroup().light());
+
+ p.drawLine(x1, y2 - openLookMargin+1, x1, y2);
+ p.drawLine(x1 + 1, y2 - openLookMargin+1, x2 - openLookMargin+1, y2 - openLookMargin+1);
+ p.drawLine(x2 - openLookMargin+1, y1 + 1, x2 - openLookMargin+1, y2 - openLookMargin);
+ p.drawLine(x2 - openLookMargin+1, y1, x2, y1);
+
+ p.fillRect(x1 + 1, y2 - openLookMargin + 2, r.width()-2, openLookMargin-2, handleColour);
+ p.fillRect(x2 - openLookMargin + 2, y1 + 1, openLookMargin-2, r.height()-2, handleColour);
+
+ p.setPen(widget()->tqcolorGroup().dark());
+
+ p.drawLine(x1 + 1, y2, x2, y2);
+ p.drawLine(x2, y1 + 1, x2, y2 - 1);
+}
+
+ TQRect
+OpenLook::buttonRect() const
+{
+ return TQRect
+ (
+ openLookCornerSize + 3,
+ titleRect().top(),
+ titleRect().height(),
+ titleRect().height()
+ );
+}
+
+ void
+OpenLook::paintButton(TQPainter & p) const
+{
+ TQRect r(buttonRect());
+
+ p.fillRect
+ (
+ r.left() + 1,
+ r.top() + 1,
+ r.width() - 2,
+ r.height() - 2,
+ buttonDown_
+ ? widget()->tqcolorGroup().dark()
+ : options()->color(KDecoration::ColorButtonBg, isActive())
+ );
+
+ p.setPen(buttonDown_ ? widget()->tqcolorGroup().dark() : widget()->tqcolorGroup().light());
+
+ p.drawLine(r.left() + 1, r.top(), r.right() - 1, r.top());
+ p.drawLine(r.left(), r.top() + 1, r.left(), r.bottom() - 1);
+
+ p.setPen(buttonDown_ ? widget()->tqcolorGroup().light() : widget()->tqcolorGroup().dark());
+
+ p.drawLine(r.right(), r.top() + 1, r.right(), r.bottom() - 1);
+ p.drawLine(r.left() + 1, r.bottom(), r.right() - 1, r.bottom());
+
+ paintArrow(p);
+}
+
+ void
+OpenLook::paintArrow(TQPainter & p) const
+{
+ TQRect br(buttonRect());
+
+ int x = br.left() + 5;
+ int y = br.top() + 5;
+ int w = br.width() - 10;
+ int h = br.height() - 10;
+
+ TQPointArray poly(3);
+
+ p.setBrush(widget()->tqcolorGroup().mid());
+
+ poly.setPoint(0, x, y);
+ poly.setPoint(1, x + w - 1, y);
+ poly.setPoint(2, x + (w / 2), y + h - 1);
+
+ p.drawPolygon(poly);
+
+ p.setPen(widget()->tqcolorGroup().dark());
+
+ p.drawLine(x, y, x + w - 1, y);
+
+ p.drawLine(x, y, x + (w / 2), y + h - 1);
+
+ p.setPen(widget()->tqcolorGroup().light());
+
+ p.drawLine(x + (w / 2), y + h - 1, x + w - 1, y);
+}
+
+ void
+OpenLook::paintBorder(TQPainter & p) const
+{
+ const uint cs(openLookCornerSize);
+
+ uint x = widget()->rect().left();
+ uint y = widget()->rect().top();
+ uint w = widget()->rect().width();
+ uint h = widget()->rect().height();
+ uint r = widget()->rect().right();
+ uint b = widget()->rect().bottom();
+
+ p.fillRect(x + cs, y, w - cs - cs, 2, widget()->tqcolorGroup().shadow());
+ p.fillRect(x + cs, b - 1, w - cs - cs, 2, widget()->tqcolorGroup().shadow());
+ p.fillRect(x, y + cs, 2, h - cs - cs, widget()->tqcolorGroup().shadow());
+ p.fillRect(r - 1, y + cs, 2, h - cs - cs, widget()->tqcolorGroup().shadow());
+
+ TQColor frameColour(options()->color(KDecoration::ColorFrame, isActive()));
+
+ p.fillRect(x + cs, y + 2, w - cs - cs, openLookMargin-2, frameColour);
+ p.fillRect(x + cs, b - openLookMargin + 1, w - cs - cs, openLookMargin-2, frameColour);
+ p.fillRect(x + 2, y + cs, openLookMargin-2, h - cs - cs, frameColour);
+ p.fillRect(r - openLookMargin + 1, y + cs, openLookMargin-2, h - cs - cs, frameColour);
+
+ p.fillRect
+ (
+ openLookMargin,
+ titleRect().bottom() + 1,
+ width() - 2 * openLookMargin,
+ 2,
+ widget()->tqcolorGroup().background()
+ );
+}
+
+ TQRect
+OpenLook::titleRect() const
+{
+ return titleSpacer_->tqgeometry();
+}
+
+ bool
+OpenLook::isButtonPress(TQMouseEvent * e)
+{
+ mousePressPoint_ = e->pos();
+
+ buttonDown_ = buttonRect().contains(mousePressPoint_);
+
+ widget()->tqrepaint(buttonRect());
+ return buttonDown_;
+}
+
+ bool
+OpenLook::isButtonRelease(TQMouseEvent * e)
+{
+ if (buttonDown_ && buttonRect().contains(e->pos()))
+ {
+ minimize();
+ return true;
+ }
+ buttonDown_ = false;
+ widget()->tqrepaint(buttonRect());
+
+ return false;
+}
+
+}
+
+#include "OpenLook.moc"
+// vim:ts=2:sw=2:tw=78:set et: