From a44b3348e29b5993ea37025c79b5fc7dea6f63f3 Mon Sep 17 00:00:00 2001 From: defnax Date: Thu, 10 Sep 2009 20:49:54 +0000 Subject: [PATCH] added ColorCode plugin git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@1630 b45a01b8-16f6-495d-af2f-9b41ad6348cc --- .../plugins/ColorCode_plugin/ColorCode.pro | 50 + .../ColorCode_plugin/ColorCode.pro_win | 28 + .../gui/plugins/ColorCode_plugin/ColorCode.rc | 1 + .../ColorCode_plugin/ColorCodePlugin.cpp | 53 + .../ColorCode_plugin/ColorCodePlugin.h | 48 + .../src/gui/plugins/ColorCode_plugin/INSTALL | 8 + .../gui/plugins/ColorCode_plugin/about.cpp | 48 + .../src/gui/plugins/ColorCode_plugin/about.h | 20 + .../src/gui/plugins/ColorCode_plugin/about.ui | 185 +++ .../src/gui/plugins/ColorCode_plugin/cc32.ico | Bin 0 -> 4286 bytes .../gui/plugins/ColorCode_plugin/colorpeg.cpp | 232 ++++ .../gui/plugins/ColorCode_plugin/colorpeg.h | 77 ++ .../plugins/ColorCode_plugin/docs/GPL.html | 492 +++++++ .../gui/plugins/ColorCode_plugin/gameboard.h | 4 + .../plugins/ColorCode_plugin/img/GNU-icon.png | Bin 0 -> 6228 bytes .../ColorCode_plugin/img/GNU-icon16.png | Bin 0 -> 826 bytes .../ColorCode_plugin/img/GNU-icon32.png | Bin 0 -> 2228 bytes .../ColorCode_plugin/img/GNU-icon64.png | Bin 0 -> 6085 bytes .../plugins/ColorCode_plugin/img/Thumbs.db | Bin 0 -> 30720 bytes .../ColorCode_plugin/img/application-exit.png | Bin 0 -> 842 bytes .../gui/plugins/ColorCode_plugin/img/bm03.png | Bin 0 -> 368533 bytes .../gui/plugins/ColorCode_plugin/img/cc16.png | Bin 0 -> 1140 bytes .../gui/plugins/ColorCode_plugin/img/cc32.png | Bin 0 -> 4228 bytes .../gui/plugins/ColorCode_plugin/img/cc64.png | Bin 0 -> 16572 bytes .../ColorCode_plugin/img/document-new.png | Bin 0 -> 579 bytes .../ColorCode_plugin/img/edit-clear.png | Bin 0 -> 802 bytes .../ColorCode_plugin/img/edit-copy.png | Bin 0 -> 485 bytes .../plugins/ColorCode_plugin/img/face-sad.png | Bin 0 -> 1592 bytes .../ColorCode_plugin/img/help-about.png | Bin 0 -> 734 bytes .../gui/plugins/ColorCode_plugin/img/qt.png | Bin 0 -> 514 bytes .../ColorCode_plugin/img/story-editor.png | Bin 0 -> 764 bytes .../img/system-switch-user.png | Bin 0 -> 761 bytes .../ColorCode_plugin/img/view-refresh.png | Bin 0 -> 931 bytes .../src/gui/plugins/ColorCode_plugin/main.cpp | 71 ++ .../plugins/ColorCode_plugin/mainwindow.cpp | 1136 +++++++++++++++++ .../gui/plugins/ColorCode_plugin/mainwindow.h | 169 +++ .../src/gui/plugins/ColorCode_plugin/msg.cpp | 83 ++ .../src/gui/plugins/ColorCode_plugin/msg.h | 31 + .../gui/plugins/ColorCode_plugin/pegrow.cpp | 238 ++++ .../src/gui/plugins/ColorCode_plugin/pegrow.h | 70 + .../gui/plugins/ColorCode_plugin/resource.qrc | 25 + .../gui/plugins/ColorCode_plugin/rowhint.cpp | 154 +++ .../gui/plugins/ColorCode_plugin/rowhint.h | 49 + .../gui/plugins/ColorCode_plugin/trans_de.qm | Bin 0 -> 5741 bytes .../gui/plugins/ColorCode_plugin/trans_de.ts | 250 ++++ .../gui/plugins/ColorCode_plugin/trans_en.ts | 248 ++++ 46 files changed, 3770 insertions(+) create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCode.pro create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCode.pro_win create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCode.rc create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCodePlugin.cpp create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCodePlugin.h create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/INSTALL create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/about.cpp create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/about.h create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/about.ui create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/cc32.ico create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/colorpeg.cpp create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/colorpeg.h create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/docs/GPL.html create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/gameboard.h create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/GNU-icon.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/GNU-icon16.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/GNU-icon32.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/GNU-icon64.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/Thumbs.db create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/application-exit.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/bm03.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/cc16.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/cc32.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/cc64.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/document-new.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/edit-clear.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/edit-copy.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/face-sad.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/help-about.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/qt.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/story-editor.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/system-switch-user.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/img/view-refresh.png create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/main.cpp create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/mainwindow.cpp create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/mainwindow.h create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/msg.cpp create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/msg.h create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/pegrow.cpp create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/pegrow.h create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/resource.qrc create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/rowhint.cpp create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/rowhint.h create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/trans_de.qm create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/trans_de.ts create mode 100644 retroshare-gui/src/gui/plugins/ColorCode_plugin/trans_en.ts diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCode.pro b/retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCode.pro new file mode 100644 index 000000000..fd1b784c5 --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCode.pro @@ -0,0 +1,50 @@ +# ------------------------------------------------- +# Project created by QtCreator 2009-06-24T21:25:25 +# ------------------------------------------------- +#=== this part is common (similar) for all plugin projects ===================== +TEMPLATE = lib +CONFIG += plugin release + +# this is directory, where PluginInterface.h is located +INCLUDEPATH += ../ + +# and, the result (*.so or *.dll) should appear in this directory +DESTDIR = ../bin +OBJECTS_DIR = temp/obj +RCC_DIR = temp/qrc +UI_DIR = temp/ui +MOC_DIR = temp/moc + + +# the name of the result file; +TARGET = $$qtLibraryTarget(colorcode_plugin) + +HEADERS += ../PluginInterface.h \ + ColorCodePlugin.h +SOURCES += ColorCodePlugin.cpp + +#=============================================================================== + + +SOURCES += main.cpp \ + mainwindow.cpp \ + colorpeg.cpp \ + rowhint.cpp \ + pegrow.cpp \ + msg.cpp \ + about.cpp +HEADERS += mainwindow.h \ + colorpeg.h \ + rowhint.h \ + pegrow.h \ + msg.h \ + about.h +RESOURCES += resource.qrc +FORMS += about.ui +OTHER_FILES += docs/GPL.html \ + trans_en.ts \ + trans_de.ts +TRANSLATIONS = trans_en.ts \ + trans_de.ts +CODECFORTR = UTF-8 +CODECFORSRC = UTF-8 diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCode.pro_win b/retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCode.pro_win new file mode 100644 index 000000000..cb3c44055 --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCode.pro_win @@ -0,0 +1,28 @@ +# ------------------------------------------------- +# Project created by QtCreator 2009-06-24T21:25:25 +# ------------------------------------------------- +TARGET = ColorCode +TEMPLATE = app +SOURCES += main.cpp \ + mainwindow.cpp \ + colorpeg.cpp \ + rowhint.cpp \ + pegrow.cpp \ + msg.cpp \ + about.cpp +HEADERS += mainwindow.h \ + colorpeg.h \ + rowhint.h \ + pegrow.h \ + msg.h \ + about.h +RESOURCES += resource.qrc +FORMS += about.ui +OTHER_FILES += docs/GPL.html \ + trans_en.ts \ + trans_de.ts +RC_FILE = ColorCode.rc +TRANSLATIONS = trans_en.ts \ + trans_de.ts +CODECFORTR = UTF-8 +CODECFORSRC = UTF-8 diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCode.rc b/retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCode.rc new file mode 100644 index 000000000..074a40e26 --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCode.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON DISCARDABLE "cc32.ico" diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCodePlugin.cpp b/retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCodePlugin.cpp new file mode 100644 index 000000000..154efb18d --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCodePlugin.cpp @@ -0,0 +1,53 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2009 RetroShare Team + * + * 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 +//#include +//#include + +#include "ColorCodePlugin.h" +#include "mainwindow.h" + +QString +ColorCodePlugin::pluginDescription() const +{ + QString res; + res = "a StegoSaurus plugin" ; + + return res; +} + +QString +ColorCodePlugin::pluginName() const +{ + return "ColorCode" ; +} + +QWidget* +ColorCodePlugin::pluginWidget(QWidget * parent ) +{ + MainWindow* window = new MainWindow(); + + return window; +} + + +Q_EXPORT_PLUGIN2(colorcode_plugin, ColorCodePlugin) diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCodePlugin.h b/retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCodePlugin.h new file mode 100644 index 000000000..035cd4b33 --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/ColorCodePlugin.h @@ -0,0 +1,48 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2009 RetroShare Team + * + * 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. + ****************************************************************/ + +#ifndef _COLORCODE_PLUGIN_H_ +#define _COLORCODE_PLUGIN_H_ + +#include + +#include +#include + +#include + +#include + +class ColorCodePlugin: public QObject, public PluginInterface +{ + Q_OBJECT + Q_INTERFACES(PluginInterface) + + public slots: + + virtual QString pluginDescription() const ; + virtual QString pluginName() const ; + + virtual QWidget* pluginWidget(QWidget * parent = 0) ; + +}; + +#endif diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/INSTALL b/retroshare-gui/src/gui/plugins/ColorCode_plugin/INSTALL new file mode 100644 index 000000000..944d72672 --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/INSTALL @@ -0,0 +1,8 @@ +ColorCode 0.1 + +simply run: + +qmake-qt4 -project +qmake-qt4 +make + diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/about.cpp b/retroshare-gui/src/gui/plugins/ColorCode_plugin/about.cpp new file mode 100644 index 000000000..72c1cf9cf --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/about.cpp @@ -0,0 +1,48 @@ +#include "about.h" + +About::About(QWidget* parent, Qt::WindowFlags f) : QDialog(parent, f) +{ + setupUi(this); + setWindowIcon(QIcon(QPixmap(":/img/help-about.png"))); + mAuthorIcon->setPixmap(QPixmap(":/img/cc32.png")); + mLicenseIcon->setPixmap(QPixmap(":/img/GNU-icon32.png")); + + mAuthorText->setText("" + tr("ColorCode") + "
" + + tr("A needful game to train your brain ;-)") + + "

Version: 0.2
Author: Dirk Laebisch"); + + QString license_file = ":/docs/GPL.html"; + if (QFile::exists(license_file)) + { + QFont fixed_font; + fixed_font.setStyleHint(QFont::TypeWriter); + fixed_font.setFamily("Courier"); + mLicenseText->setFont(fixed_font); + + QFile f(license_file); + if (f.open(QIODevice::ReadOnly)) + { + mLicenseText->setText(QString::fromUtf8(f.readAll().constData())); + } + f.close(); + } + else + { + mLicenseText->setText( + "" + + tr("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.") + "" + ); + } +} + +About::~About() +{ +} + +QSize About::sizeHint () const +{ + return QSize(320, 240); +} diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/about.h b/retroshare-gui/src/gui/plugins/ColorCode_plugin/about.h new file mode 100644 index 000000000..74d94c664 --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/about.h @@ -0,0 +1,20 @@ +#ifndef ABOUT_H +#define ABOUT_H + +#include "ui_about.h" + +#include +#include + +class About : public QDialog, public Ui::About +{ + Q_OBJECT + + public: + About(QWidget* parent = 0, Qt::WindowFlags f = 0); + ~About(); + + virtual QSize sizeHint () const; +}; + +#endif // ABOUT_H diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/about.ui b/retroshare-gui/src/gui/plugins/ColorCode_plugin/about.ui new file mode 100644 index 000000000..3a65f1f6d --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/about.ui @@ -0,0 +1,185 @@ + + + About + + + Qt::ApplicationModal + + + + 0 + 0 + 320 + 240 + + + + About ColorCode + + + + 6 + + + 9 + + + + + QTabWidget::Rounded + + + 0 + + + + &Author + + + + 6 + + + 9 + + + + + 6 + + + 0 + + + + + icon + + + + + + + Qt::Vertical + + + + 20 + 111 + + + + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + true + + + + + + + + &License + + + + 6 + + + 9 + + + + + 6 + + + 0 + + + + + icon + + + + + + + Qt::Vertical + + + + 20 + 111 + + + + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + true + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Ok + + + + + + + tabWidget + mAuthorText + buttonBox + mLicenseText + + + + + buttonBox + accepted() + About + accept() + + + 248 + 254 + + + 157 + 274 + + + + + diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/cc32.ico b/retroshare-gui/src/gui/plugins/ColorCode_plugin/cc32.ico new file mode 100644 index 0000000000000000000000000000000000000000..f77ffc71623c5b0cff9d4fcaf1c2538a1e2a1c01 GIT binary patch literal 4286 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 VdW7 + +#include "colorpeg.h" + +using namespace std; + + +const QBrush ColorPeg::mShadowBrush = ColorPeg::GetShadowBrush(); +const QPen ColorPeg::mPen = ColorPeg::GetOutlinePen(); + +QBrush ColorPeg::GetShadowBrush() +{ + QRadialGradient rgrad(22, 22, 22, 22, 22); + rgrad.setColorAt(0.3, QColor(0, 0, 0, 0xff)); + rgrad.setColorAt(1.0, QColor(0, 0, 0, 0)); + + return QBrush(rgrad); +} + +QPen ColorPeg::GetOutlinePen() +{ + QRadialGradient rgrad(20, 20, 32, 0, 0); + rgrad.setColorAt(0.0, Qt::black); + rgrad.setColorAt(1.0, Qt::white); + return QPen(QBrush(rgrad), 2); +} + + +ColorPeg::ColorPeg(QObject*) +{ + setFlags(QGraphicsItem::GraphicsItemFlags(0)); + mPegType = NULL; + mPegRow = NULL; + SetBtn(true); + mIsDragged = false; + mId = -1; +} + +ColorPeg::~ColorPeg() +{ +} + +void ColorPeg::SetPegType(PegType *pt) +{ + mPegType = pt; + setFlags(ItemIsMovable | ItemIsSelectable); +} + +void ColorPeg::SetPegRow(PegRow *pr) +{ + mPegRow = pr; +} + +PegType* ColorPeg::GetPegType() +{ + return mPegType; +} + +void ColorPeg::SetId(int id) +{ + mId = id; +} + +bool ColorPeg::IsBtn() const +{ + return mIsBtn; +} + +void ColorPeg::SetBtn(bool b) +{ + mIsBtn = b; + SetCursorShape(); +} + +int ColorPeg::GetType() const +{ + return mType; +} + +void ColorPeg::SetType(const int t) +{ + mType = t; +} + +void ColorPeg::Reset() +{ + SetIsDragged(false); + setSelected(false); + if (mPegRow != NULL) + { + mPegRow->RemovePeg(this); + mPegRow = NULL; + } +} + +void ColorPeg::SetIsDragged(bool b) +{ + if (false == b) + { + update(boundingRect()); + } + mIsDragged = b; +} + +void ColorPeg::SetEnabled(const bool b) +{ + setEnabled(b); + //setFlags(QGraphicsItem::GraphicsItemFlags(0)); + SetCursorShape(); +} + +void ColorPeg::SetCursorShape(Qt::CursorShape shape, const bool force) +{ + if (!force) + { + if (mIsDragged) + { + shape = Qt::ClosedHandCursor; + } + else if (isEnabled()) + { + shape = Qt::OpenHandCursor; + } + } + if (cursor().shape() != shape) + { + setCursor(QCursor(shape)); + } +} + +QVariant ColorPeg::itemChange(GraphicsItemChange change, const QVariant &value) +{ + if (change == ItemPositionHasChanged) + { + } + else if (change == ItemPositionChange) + { + } + else if (change == ItemFlagsChange) + { + } + else if (change == ItemSelectedHasChanged) + { + scene()->update(scene()->sceneRect()); + } + return QGraphicsItem::itemChange(change, value); +} + +void ColorPeg::mousePressEvent(QGraphicsSceneMouseEvent *e) +{ + if (mPegType != NULL) + { + if (e->button() == Qt::LeftButton) + { + Reset(); + SetIsDragged(true); + emit PegPressSignal(this); + SetCursorShape(); + } + } + QGraphicsItem::mousePressEvent(e); +} + +void ColorPeg::mouseReleaseEvent (QGraphicsSceneMouseEvent *e) +{ + if (mPegType != NULL) + { + if (e->button() == Qt::LeftButton) + { + SetIsDragged(false); + emit PegReleasedSignal(this); + SetCursorShape(); + } + } + QGraphicsItem::mouseReleaseEvent(e); +} + +QPainterPath ColorPeg::shape() const +{ + QPainterPath path; + path.addEllipse(boundingRect()); + return path; +} + +QRectF ColorPeg::boundingRect() const +{ + int margin; + if (mIsDragged) + { + margin = 8; + } + else + { + margin = 1; + } + return outlineRect().adjusted(-margin, -margin, +margin, +margin); +} + +QRectF ColorPeg::outlineRect() const +{ + QRectF rect(0.0, 0.0, 36.0, 36.0); + return rect; +} + +void ColorPeg::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget* /* widget */) +{ + /* + QPen pen(Qt::red); + pen.setWidth(2); + if (option->state & QStyle::State_Selected) + { + pen.setStyle(Qt::DotLine); + } + */ + + + if (mIsDragged) + { + painter->setPen(Qt::NoPen); + painter->translate(QPointF(-2, -2)); + painter->setBrush(ColorPeg::mShadowBrush); + painter->drawEllipse(QRectF(0, 0, 44, 44)); + painter->translate(QPointF(2, 2)); + } + else + { + painter->setPen(ColorPeg::mPen); + } + + painter->setBrush(QBrush(mPegType->grad)); + painter->drawEllipse(outlineRect()); +} diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/colorpeg.h b/retroshare-gui/src/gui/plugins/ColorCode_plugin/colorpeg.h new file mode 100644 index 000000000..f85b587a0 --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/colorpeg.h @@ -0,0 +1,77 @@ +#ifndef COLORPEG_H +#define COLORPEG_H + +#include +#include +#include +#include +#include +#include +#include "mainwindow.h" +#include "pegrow.h" +#include "rowhint.h" + + +class ColorPeg : public QObject, public QGraphicsItem +{ + Q_OBJECT + //Q_DECLARE_TR_FUNCTIONS(ColorPeg) + +public: + ColorPeg(QObject* parent = 0); + ~ColorPeg(); + + int mId; + void SetId(int id); + + void SetPegType(PegType* pt); + void SetPegRow(PegRow* pr); + + QRectF boundingRect() const; + QPainterPath shape() const; + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget); + + void SetType(const int t); + void SetEnabled(const bool b); + void SetCursorShape( Qt::CursorShape shape = Qt::ArrowCursor, const bool force = false); + PegType* GetPegType(); + int GetType() const; + QColor GetPenColor() const; + QColor GetBrushColor() const; + + bool IsBtn() const; + void SetBtn(bool b); + void Reset(); + +signals: + void PegReleasedSignal(ColorPeg* cp); + void PegPressSignal(ColorPeg* cp); + +protected: + PegType* mPegType; + QVariant itemChange(GraphicsItemChange change, const QVariant &value); + + void mousePressEvent(QGraphicsSceneMouseEvent* e); + void mouseReleaseEvent(QGraphicsSceneMouseEvent* e); + +private: + static const QBrush mShadowBrush; + static QBrush GetShadowBrush(); + static const QPen mPen; + static QPen GetOutlinePen(); + + QRectF outlineRect() const; + void SetIsDragged(bool b); + + PegRow* mPegRow; + + const QBrush mBrush; + + int mType; + bool mIsBtn; + bool mIsDragged; +}; + + + +#endif // COLORPEG_H diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/docs/GPL.html b/retroshare-gui/src/gui/plugins/ColorCode_plugin/docs/GPL.html new file mode 100644 index 000000000..24d8b7b9b --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/docs/GPL.html @@ -0,0 +1,492 @@ + + + + + + + + + +GNU General Public License v2.0 - GNU Project - Free Software Foundation (FSF) + + + +

GNU GENERAL PUBLIC LICENSE

+

+Version 2, June 1991 +

+ +
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.  
+51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+ +

Preamble

+ +

+ The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. +

+ +

+ When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. +

+ +

+ To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. +

+ +

+ For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. +

+ +

+ We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. +

+ +

+ Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. +

+ +

+ Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. +

+ +

+ The precise terms and conditions for copying, distribution and +modification follow. +

+ + +

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

+ + +

+0. + This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". +

+ +

+Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. +

+ +

+1. + You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. +

+ +

+You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. +

+ +

+2. + You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: +

+ +
+
+
+ a) + You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. +
+
+
+ b) + You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. +
+
+
+ c) + If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) +
+
+ +

+These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. +

+ +

+Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. +

+ +

+In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. +

+ +

+3. + You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: +

+ + + + +
+
+
+ a) + Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, +
+
+
+ b) + Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, +
+
+
+ c) + Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) +
+
+ +

+The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. +

+ +

+If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. +

+ +

+4. + You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. +

+ +

+5. + You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. +

+ +

+6. + Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. +

+ +

+7. + If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. +

+ +

+If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. +

+ +

+It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. +

+ +

+This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. +

+ +

+8. + If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. +

+ +

+9. + The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. +

+ +

+Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. +

+ +

+10. + If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. +

+ +

NO WARRANTY

+ +

+11. + BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. +

+ +

+12. + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. +

+ +

END OF TERMS AND CONDITIONS

+ +

How to Apply These Terms to Your New Programs

+ +

+ If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. +

+ +

+ To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. +

+ +
+one line to give the program's name and an idea of what it does.
+Copyright (C) yyyy  name of author
+
+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.
+
+ +

+Also add information on how to contact you by electronic and paper mail. +

+ +

+If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: +

+ +
+Gnomovision version 69, Copyright (C) year name of author
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+type `show w'.  This is free software, and you are welcome
+to redistribute it under certain conditions; type `show c' 
+for details.
+
+ +

+The hypothetical commands `show w' and `show c' should show +the appropriate parts of the General Public License. Of course, the +commands you use may be called something other than `show w' and +`show c'; they could even be mouse-clicks or menu items--whatever +suits your program. +

+ +

+You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: +

+ + +
+Yoyodyne, Inc., hereby disclaims all copyright
+interest in the program `Gnomovision'
+(which makes passes at compilers) written 
+by James Hacker.
+
+signature of Ty Coon, 1 April 1989
+Ty Coon, President of Vice
+
+ +

+This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the +GNU Lesser General Public License +instead of this License. +

+ + + diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/gameboard.h b/retroshare-gui/src/gui/plugins/ColorCode_plugin/gameboard.h new file mode 100644 index 000000000..6e253219a --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/gameboard.h @@ -0,0 +1,4 @@ +#ifndef GAMEBOARD_H +#define GAMEBOARD_H + +#endif // GAMEBOARD_H diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/GNU-icon.png b/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/GNU-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c32ad6db89afb276a859b536d9ba0e17cee0d8f1 GIT binary patch literal 6228 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 I;?Mm42i$*byZ`_I literal 0 HcmV?d00001 diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/GNU-icon16.png b/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/GNU-icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..245d84ed7473423d0a5fb0f1b3fd5543a55f0f3a GIT binary patch literal 826 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 literal 0 HcmV?d00001 diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/bm03.png b/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/bm03.png new file mode 100644 index 0000000000000000000000000000000000000000..9654e54b76162ae74ef68ed582fea5a238fcc994 GIT binary patch literal 368533 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

mP4 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 SB!2O`zw`^g`Pcr=ul+w}np?5} literal 0 HcmV?d00001 diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/cc16.png b/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/cc16.png new file mode 100644 index 0000000000000000000000000000000000000000..fc878582cdce163fa5c2c68519d777d71415a529 GIT binary patch literal 1140 zcmXw&%WoT16vn@K*p4TUI-+q&>a=NNOOaYYX%!SCAhNO3x>71sRS|3=Di$meDwTj0 zV#mUZN<>}+vG5;Iv9pL;qNEF;0ZLVY+9nDr*mWG&@nbyWdEI+CGr&k^?u_m|zw@2P z{qpV07lyS74Zv{zV)hEHG2aHl^ggMJYqUt$uUyFB)~|^={X{;_FXbYSqe}c`7|*>| z0rhx3o4z_fD#g^6E71|WpI=Bno}4easrf{dg>YW{jnjiRpoIKw$g+&>pEi)s4q$W$ z=ybG7`NxwhUl%{!kbLLO+y~z)OYg$@s|WAEfnMcUwC`al(Lf{`#rpah*4A=x^?k5@ z3ou)#R}~b#eJ!JCnRo75*FGBIZ5!MY;C&9I@8V%?3~#^Fw2JE4!~%2 zJq*ZQ#KPuVs+*io_>mzbaFapUWFChmyLixy<6M#h{WiEKK`;WiE`dCN3yhDn6Y3xj zp+>SH5rCX|m#jx-afD^y$nYqbQ2}Qvgdn&>3LFQVK(50f&r-qk3Wry>!5R+OA#HYD z=!Xos85hdXE3gi`1nGbqJxb9exCPmcQLhAvQWS57*~*F*y-O z>eM*yJj_Grhop=^Jp+o_#!mGZ{xr@*T3uZgBSRWGZY0P#M6wrW9CAKJSp{9DMhZN8 zR>!Eg2Ss#I(~qO&zKFijhU)h@GN55+=XabvxQ*eXad^rC{&)5FB}qoDR>g016|vZ9 z*tU(aG3IYUDi(|4mtp}$V;80yM%Pi$5K%n2@flL-bTCAvQVGk;%b1%x2aDS2I3CL7 zG8&Brl%tXG=iluA01F{FB*>OjFs?woy@lqbi+J+r5z+*jojnsMktFUn3@1*U!rtB< zE*3~KJSRk7*7t9|d!V5nFJ&{NRa(jHLqFXX_Cxo6yu>U}o>7t+dw_twG z9!;kY@jU-q3JTe5HY@V|Hx^bZ@hP;)u|oizDd^E9Jvj3c#MC5Jdn_oJ=>zGWSTv!A zVFm@<+S*zPx^?5`&GgywdTFr!JmHZ1)=Ua4^Ewo|H2&k#*lL=FWHK4Z_9Jg@Zmtvx Zg^fSlyB~hC{j}hp%jYg2i%9I2-+6} zQV3QRHz`O(P)Jj$w+BpG(o$3@v=vk(Kq({yTnxxueZe-^#@@Aecdq^ZGak!S?MTPx z%q~21=3FnsjPdW*ZQF93w5>0{xEe=3o)__CUfjNQ7ggmt=A=xRi8S(V2`tNL-}}>dcFa~d zBjrbLy|w(*-;Q7Gir4vxjoY|Kl%o@}eFTl|Of=g$u*05RVg>~DJqu`fRd zKhND%=u$o$%yzRr|Cw4}*(&s0~&F9Rv*ELb@JDyVRafVIB9KI#rWDOXui_1f0 zSed?wd6~x)1D%Keh@W&kfvQR}=Zj){TDcfwLlZD+P^K%xL48@y*XOM_^j-#>xpAB3 zjuzn;xY43QQ9KP^41mv2;U{@yibs5WbibZ*D4f3c?LK_ri{%8Fr~U$m#f?O(ET=pk z;$K?Ng%YKs-0aaBYK-lMW6p(@UI2Z{g{D)OY~oqP1pNmNKNLjt0!Y(*bUmC$fkPM> z$>F6J=E2M6;K302JS;58UILK-P%h!Sz*laNbsY7XK^R&x4a?RLvjYI?Je4Tgg?{CN zV5SCWbdBJ7kc}c9Gmy)TqOqm~j#XfgFdj66AOwhfqby;>(@>t8f-&c@ z6x?wep1}7+2RGxb#$ukszghy8ptpE_^UV&>4uNiSXI!X1Q4E|wp3Z37cd+}9;Qp& zqK{>jgLo`cqk{0%RnGQps$@M@6_Rok2JRQy1pr+vGpJl#;S?S8Wf^<%)Lg8#Pouy} zdDwZKE&>fQx zZEXEg52|YxDCLrdk2lui-0cB3mtObB7vvmEg$!2Vrh6Ok+lp_ zeEITabar+kLxs)F%_uJ~SJqy+az#;I&-21`_!yy}-o8E@e(zlzjE$n%%_HX;C@@AX zSBHI-8FJ#UxY5*%f31H7Pd7EG^RofSdf&c%c<|r>_Uze%y1F{0aJFmYw-YB$uz!qT z?%d!~6KQR2eM3GR-Ma@L&lyG~>$lB%?)fq_coghv5x6X~iT**PKKT?^8yZkmT|L8u zSiXP%ex%cBHK$Suvf;8-YqVBVcLv!LV=Of`HY&ID(O?OFT@ZHu?)Uh6*@SBUB$i># zp1?_#(j8csSs*zgI?S;#RR8>!xP9;541lh#E@gRpdpi%=6da+_7>5LLgh1G4*k?>L zuILY4BUzx|xO*3yChqd;#b|YDsi%WWWxeoB*YXiG(^ZzipS;?Q$x~-k)XVonhYq2m zql4!yDq{df;+zFQlmG;TJ`IA!nk>jIYSpS$n4Fx1ey6t&>kW%N#~=fwds?~7KHue0 z7=(vl0VGV6p1Xkiqoc}l2{`e&SSr^{OMxl`;)zR#Qw(Q>zBfUw|Dqkyo56@FLD$oE7NE-RW88L4Ul zKw?PKq#Cm8aewd#3jrH~Q5X!s0@-X9hLlW$~E3YgoOZz zrDhHJMXc$RD1Pkj?xtV~;;=aJqyjRHfebiK5JN66Bn}In>>nB$VuSMB_M1zV`$b+f zie7|%)q|N9s5P09;N<;R&BBJ2FCw?{XRa9Gt;iT{^rh|e#^mwOhtPp4umz~Ls3rUV!61X=xTVla3P#6n_vcEui`*JtXsEE z<+&;_j5Y~4@oKeE;)Vn>{%5L(txDb7Ya;ovQj7%kq!sr#NWg~Po6xfUAuOz>A-;l>YvjY0HLrS?tEicwc~A1_1s1xH%aQ5YHS?&C5s?8 ziMSDTvak__=R!r|3SmHkQ}SF=Etkt-aBvX){r&B`ckkX2o{>4ZYw?HQd;aS;W!>7c LcFmF18{hm7vl>5T literal 0 HcmV?d00001 diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/cc64.png b/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/cc64.png new file mode 100644 index 0000000000000000000000000000000000000000..2b2857056d2c6ce36315448f21d22de920a3d8f2 GIT binary patch literal 16572 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 literal 0 HcmV?d00001 diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/document-new.png b/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/document-new.png new file mode 100644 index 0000000000000000000000000000000000000000..8431237bd374e68931a13df798bc0996452f705f GIT binary patch literal 579 zcmV-J0=)f+P)VxXK$hi6FoGM6#-0&DYi+BPO7z*s9d>{0vUq8c z&G}94mG91_zoj3m9VHsT2!GA?={D6)mHkfz06td>m_bcrSPcMDDeJM*+y>fjK<#^t z=uU*oi<@Nt)FU+;02V?7_3H~3cIR1VuFMcTS6l_&FA2GV;y{3lgxXDZuxrZSS;?#* z=QUvpn-9RT!7#-`zX5oG|B7vHE(aR6zHX6znI;PO!UTD_B~KNw&}=sMyujCO=T4U( z2yTeTTYCpkegjtzCeCEM0NlE6vV;ClKoWLfLST%sZMP!DEsaU~GX3SIsdMei7bh)})pLEh`3!Xi^UM4W+LIZr$zxaOz7mw|A28X|&gK2(h zZfSoyEkX7Ar7SOshe$kJ@wtDv=f<5!bjpH@N4L9nR{6W;bYuBbX#H42w#$q|FGoYkR7TQxAVVC~AgvlcDbQ{K}v zz)cqHtE#WH+tMnPL>x$^K&cL@=%%l{d{cK)X)1KPX3v;gl4lwwgdERi@@M$WfsL{? zP3)eLTi{~|fOrH9%Ru@V9LpV0qngA+;sn5whQ6+jjvrr!>i^mx(;;26*la$T(-0mV zM6EV|5;_BFz$$UjH5GQd1)8dx zW$%Zmk#1*hIjlV+=?;EPa9k=7g`$b#;sWMW{kp}nRc!428shS@9j29Ip{OZjyKMj{ zG9;eH^E^zu)Bdikvh?_!mu@q(n3*v73Z?HG|HJ$KtcH9J10IQl4im gAunrc0{^W1Pl-(m{G3O!W1aTUgGKN%6@}cL`d0sS5o>yped=IE{-7;x28@w z?{(Ng;8?o(vZal2UCV9SDn2q^kz14h;ArvQ8^O9iIQDs;w`*7+VDp{f_ZlWKjr z)#jWRvnDK(uc_Jn=1hKh7{h^v8aJ_m2#-3&dS~D8ALfP$ET*!d=Iaj$ESaLv%HXJJ zadX**`|pc8)DD~|l;Q1I%+aL4pv!&XZJDLtiIt|8wDsLQZsnLs95p=my!g*?kHg2f ze}skYh-*HqEXlpecGB}onN3VDlz0sp?)p^E4K+@`E$^}V!kg~`uY(tgCWzj2SkAUA zhv5~wSpvTuPll7r+MOC)9ESz0WW}p&`9(OEY-(cc;=5QH8+dok<}z*b-~0I2y#2;5 zm%ceYifxa*+WiUnz4IqbQQ=IBY~#^CEhHY#9paTJbKGK|^!~uRnp-kXG?@4ro-by5 zaqMZ<%Gv6Zf0wV?sdn1z0IR9imMNmDb$a0zwKG0V)~~O%Gci?|KU*m}BkiApw!tmN Y4DJ^lh1J@%z&K#=boFyt=akR{0F^SkGXMYp literal 0 HcmV?d00001 diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/face-sad.png b/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/face-sad.png new file mode 100644 index 0000000000000000000000000000000000000000..929672d593c13f516acb3193a963d25d10b77175 GIT binary patch literal 1592 zcmV-82FLk{P)DzTDg{j6csDT#VS$;rP@-Uz_<4_ImwbO63#!roG0J=Jn#GE zJKw=3dJu}kF$E!^7{iPXBUF)$Vbc_-t)dshW>X0gI$x zp!*L@14QbATP`Cs#Ce)=*h|A!FDSTYcOxQ-@cl$^St+2bFDxhDvOJhF6x5WTuzEBe z`DhM2zK#12&Jq^^(XgHDI!^t~jvEHnb}l#QLCy6z2e(zy0U??yaRjIXxH zm&5`*-X~nzJ^LcpVz{F5uYF=D98hC?HW*Fmss0@TwQm*C$sP#p(}u2J*A8>qDjj*p zfu>3q-ZRj3p#eUouuiKG9pyni>gkX94(d(RYxuhn8aX6ewm%J_UfShi+6%4)kqZq7 zm~dFR$|KoVY;x~2NBrsqp0+S(Y^#S)J3d%v>c(hg!XeOG;XcJ`0NyoSBe7Im z@6yHw8g!DC9@k&b+$Ds%(av7~rQnm*D)bqG267roJTNR+>hZkjW9ch#Aae1~P5|F2)@gtCgvH(~g@X+K zZKwILWxTpLs}z_ZyfJ~=42LMHw#RH8LW!EN(diJd(U`S#mK-5}=OwikFk$N6J?0d! z)lsE>W(T1zzOkBm416Bdy|ZG$S$SOI>$Cu&H_qo)Q`uJviCkzPGZTZoc*Z@mo)Y3m z>JQ1`Gm{Z#m?mzYcNGk@k|@RwgmTU$U9*Pw7nLP?Uwmg?v<3NQ1LbX@zA#yf5$NzW z6l5HawjP1WKbKr**u&O;Te)K1euPvHuazyLAkOo%>E4tcKN69P5szZD;A;$SO5wTvxw|9t`WE z>v%R?sJmJ{!deNF(;k@mE<&i)JL9$WVZjn2=YKAu3IrgDB2w7ohjXZ{4>BF+>*PGd?S1{g^L zGTY$}KasoqAdmdqty{P;vDWNeBBN$Jg>EIwE2^cXu&mniiiBxNM&>4ojNH(Jm1Kom zH&I9UOq4f?#;%qCW+GI*0vJw^&?oEn4|bjTVG+rpga7~lB6?I2D?NY%?PN(TTo*alb-Q_5Tb0000+f;K8PVh9!*!(H4p;$7};_ilHbUDwTN z?EK+lhc`R_y!UuRN-6x01pX48Suv4qP7`BO!vpET0O+gyXuns$BFJ1;k4`)2(jOVn zLP&)@|>CnmbvB7Sn((ujcbPt6Ul@NW0;qQtu$2F_1Pn zdL+kCE`>_XhusKJI@B)-#kg}{W z9&uoQx@d3IrvW^O3=C;bfeTc%K`7r3&~Sa+c={CK54R{p0ZhOU=EcOIP2%vo zY8yFAz%)4AmW%4$u+JEjmSXz;(N?9I}Yocf`GGok!G?x%fYd3ANf{pVvMA_*YXg{cv7nZBm2@ieWNras&G3D272l_l(i Qb^rhX07*qoM6N<$g0$m2kN^Mx literal 0 HcmV?d00001 diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/qt.png b/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/qt.png new file mode 100644 index 0000000000000000000000000000000000000000..cbed1a90192da7cf5d1a54309c5e0a404749f0fd GIT binary patch literal 514 zcmV+d0{#7oP)Cq z9(hiVJ*Rs(Rh}YT)7v=3sS?v$nEEu+={4Rwo$!8z1AvvFv2T41?AthU9#LrrCn4*` z!mdIm4--!$wk6W~M3@|0b#J<#YU2}>&nMU(iwu35xSM^gFvC;nYT*WZJzI2fK{o?u z4CtqY#?Z2Xi#ZI;R}8Xf+_0oAG|D%HH#*i9HSuvPoKe=cBsP~NmQM)#b}h!RBo=2G zeXD`RSc+v38AuO;;I!v0Vz?v8d ziXQ>PfCV;k4&loHq)$ literal 0 HcmV?d00001 diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/story-editor.png b/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/story-editor.png new file mode 100644 index 0000000000000000000000000000000000000000..7f9b3c4df24c6fa5d8eb65bf0202043808c588e2 GIT binary patch literal 764 zcmVbb+XcqM}G5eTj?=f{56P2tp82s36@=7qT9Nf{3E%p`tRhi|M+aT=&x1{vLEU zEr}W!nE7YE@Be3hB_aS+RaFUqrfJmH)+&a^@A2b1Ro;33#C!QOie81o;R;gq}`D5c60>*4WvvnTIrJhAey@$f-UYwPEQ4u_*&0cF(C*ig`rym%?KhDm8207}{q z3GYQDmw`dS42q$2066Zb5uk~Of@8E zj7FmvhJjKFP1BI@d)CfuqM|y)K+MkdlR4-)TXE->my1YKBD+4+Hk4A7mX>0(*@*Oa zGOqJ9drk=-zY4c}`NUI~;hB=`E+Yg9iKb~-F%#E^9UQB-xc}J1I9rGso6GoueSg3s zDgZDHgFr_c9j^mixf|u|p$UXSeLNpn$-4QY^1mw3G!3uU%l+FCGBeW2$-cw%Nfx=Q z{LI!}qtk#kT+q^TgE8_6XZ!`08b|t~E7<-5|M3UseP^(15z061WOwzpzk(wKx~?N4 uH2d#jx7+^-OeO|q0Q3HXc`PFD5}Tip!ThK^G2J`>0000?dOq_EFs)h8y$IRyYF)#w)_z=>OLJP+tC7D8G zW>}kROsGf2X7bx4ExTJ7I6c7O;$hx?ev3&G(pCW|DM7*X+B9dM zoTX`N6RT>Kj-Z3hVlx;R85^OkyNxSnu3%%!ozg8*@&P9wK*Q|M+3eoFy`7n^8MM}< z_`Z+ld4yreaPKg4-`+9t^>IF+r348G^3#C@v%t{Y5Jg?Y)-9%LxLCYMduuzTku}g{sY_r<{F%SVE-~&H_3Q*1O zNA@1!_1bItANEtP*C{9sV3oC0cQv(6C>fneYyv;>0lN-XkYNqnn7afq?2a2yZZjfO r6KN{|TF#*bYykxShqX{$e@^rZO#Lf0n5^ literal 0 HcmV?d00001 diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/view-refresh.png b/retroshare-gui/src/gui/plugins/ColorCode_plugin/img/view-refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..86b6f82c1ddd53740bd95cd9a252d6d0341b0656 GIT binary patch literal 931 zcmV;U16=%xP)4TMNw)Y6{994!H+hHY0`A;By%&J`*F@a z_jpGPX3-x!yYsx~<$2$ij4{{`Jx5hAT(G*VCr2tHljW{5TiIM$s&CaVL*qm9nfdd- zcS8Vpr@)?(f$&OswEV{T6X)GZe+7emgRq!|AP8{d_6^Kjor$;Cwl5*WkEKfSlO#yu zPJw^T%%N|mPMw-MGx?NYHpBhUQse5v74_@-FLd$gm-u@hzYC5WVtBPS_VCn+vByLZ z2B478Xf&{Kdjn($)!{0<9uFNRj@HCPwT8?XFc5hD`-A-hJ(rFi85fOa13J~1|9KvN zto#l~3wXAND|6qYw^GK*<0sKu>;(*984HXUI1yf`l!lyk+(t)>*B9}3ebW?NAw#Jy zCz;Yd6K9)o!=7E8rRni$xW)xZf<*-G_~MMwpzY>1c7t7P+**h4i)c4W9_=KacQ^?P z&zMJu9yojuE#5+OFG8>rfHD{^99E09LK+09->t*a3~i~t-Wyk!=k|#r^F*(Q^iG1c z;3iskS}^SlX{^5_|ALTN+Y;b_aukFjNU3M_Om=qPZnywS0v3Uc&T?sEl=;-Om`wCF zgehVXLzgwoDB!r(bSGT=&ml(i5lv8^u4P;dTdKS0#K_^P%)W4K@i-2oggzka&QLB2 zhnCn+?0NbeMC91~Txr;yONX-4iK5lGlx|wfY>O_^CgE8;twq17uc8msD$B!Kj$-w?zax~(J9FoG0Riq43dd}+ zCK$>7OcZ>(+U3~eCEFiM7W8ZJR(b?EdprA1V=Mfo=cb$VFb}Q}paNm{V2qtZ5t@TB zTKx%%+^I&_<>{~~mjHZ+oc+f{0AB7s;J)RJa<4L0Wbv^S?XrY*i{b8E+vsaq7~WHF z0(d*`Tq5Uw=X@Bzi@Bb#7#%kTlo_)C;D=oA=f-vH;~!CSYaU5(-z)$C002ovPDHLk FV1l!GvY-F} literal 0 HcmV?d00001 diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/main.cpp b/retroshare-gui/src/gui/plugins/ColorCode_plugin/main.cpp new file mode 100644 index 000000000..6a1c67b3c --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/main.cpp @@ -0,0 +1,71 @@ +#include +#include +#include +#include +#include +#include "mainwindow.h" + +int main(int argc, char* argv[]) +{ + using namespace std; + + string lang(""); + if (argc > 1) + { + string str; + for (int i = 1; i < argc; ++i) + { + str = argv[i]; + if (str == "-h" || str == "--help") + { + cout << "usage: ColorCode [options]" << endl; + cout << " options:" << endl; + cout << " -l cc, --lang=cc use country code cc instead of system locale, accepted values for cc: en|de" << endl; + cout << " -h, --help prints this message ;-)" << endl; + return 0; + } + else if (str == "-l" && i < argc - 1) + { + if (std::string(argv[i + 1]) == "de" || std::string(argv[i + 1]) == "en") + { + std::string test(argv[i]); + lang = argv[i + 1]; + } + } + else if ( str.size() == 9 + && str.find("--lang=") != string::npos + && (str.substr(7) == "en" || str.substr(7) == "de") ) + { + lang = str.substr(7); + } + } + } + + QApplication app(argc, argv); + + QTranslator qtTranslator; + if (lang == "") + { + qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); + } + else + { + qtTranslator.load("qt_" + QString::fromStdString(lang), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); + } + app.installTranslator(&qtTranslator); + + QTranslator appTranslator; + if (lang == "") + { + appTranslator.load("trans_" + QLocale::system().name()); + } + else + { + appTranslator.load(":/trans_" + QString::fromStdString(lang)); + } + app.installTranslator(&appTranslator); + + MainWindow w; + w.show(); + return app.exec(); +} diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/mainwindow.cpp b/retroshare-gui/src/gui/plugins/ColorCode_plugin/mainwindow.cpp new file mode 100644 index 000000000..c12b23671 --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/mainwindow.cpp @@ -0,0 +1,1136 @@ +#include + +#include "mainwindow.h" +#include "colorpeg.h" +#include "pegrow.h" +#include "rowhint.h" +#include "msg.h" +#include "about.h" + +using namespace std; + +const int IdRole = Qt::UserRole; + +MainWindow::Level MainWindow::mLevel = LEVEL_EASY; +int MainWindow::mColorCnt = 0; +int MainWindow::mMaxZ = 0; + +const int MainWindow::STATE_RUNNING = 0; +const int MainWindow::STATE_WON = 1; +const int MainWindow::STATE_LOST = 2; +const int MainWindow::STATE_GAVE_UP = 3; + +const int MainWindow::MAX_COLOR_CNT = 10; +const int MainWindow::LEVEL_COLOR_CNTS[3] = {6, 8, MainWindow::MAX_COLOR_CNT}; + +MainWindow::MainWindow() +{ + ROW_CNT = 10; + POS_CNT = 4; + + //setMaximumSize(334, 649); + + mOrigSize = NULL; + + setWindowTitle(tr("ColorCode")); + setWindowIcon(QIcon(QPixmap(":/img/cc16.png"))); + setIconSize(QSize(16, 16)); + + mMsg = new Msg; + scene = new QGraphicsScene(0, 0, 320, 560); + + scene->setBackgroundBrush(QImage(":/img/bm03.png")); + //scene->setItemIndexMethod(scene->NoIndex); + + view = new QGraphicsView; + view->setScene(scene); + view->setGeometry(0, 0, 320, 540); + view->setDragMode(QGraphicsView::NoDrag); + view->setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); + //view->setContextMenuPolicy(Qt::ActionsContextMenu); + //view->setContextMenuPolicy(Qt::DefaultContextMenu); + view->setContextMenuPolicy(Qt::NoContextMenu); + view->setAlignment(Qt::AlignCenter); + view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setCentralWidget(view); + scene->addItem(mMsg); + mMsg->setPos(20, 0); + + //view->setBackgroundBrush(QImage(":/img/metal5.png")); + //view->setCacheMode(QGraphicsView::CacheBackground); + + mCurRow = NULL; + mColorCnt = MAX_COLOR_CNT; + + FillTypesMap(); + + InitActions(); + InitMenus(); + InitToolBars(); + + statusBar(); + + InitSolution(); + InitRows(); + InitPegBtns(); + + NewGame(); +} + +void MainWindow::Scale() +{ + qreal w = geometry().width() - 4; + qreal h = geometry().height() - 4; + + if (ShowStatusbarAction->isChecked()) + { + h -= statusBar()->height(); + } + if (ShowMenubarAction->isChecked()) + { + h -= menuBar()->height(); + } + if (ShowToolbarAction->isChecked()) + { + h -= mGameToolbar->height(); + } + + if (w < 50 || h < 50) + { + return; + } + + if (mOrigSize == NULL) + { + mOrigSize = new QSize(320, 541); + scene->setSceneRect(QRectF(0, 0, 320, 540)); + } + else + { + qreal sc = min(w / mOrigSize->width(), h / mOrigSize->height()); + view->resetTransform(); + view->scale(sc, sc); + } +} + +void MainWindow::contextMenuEvent(QContextMenuEvent* e) +{ + + QList list = view->items(view->mapFromGlobal(e->globalPos())); + int i = 0; + bool isrow = false; + if (mGameState == STATE_RUNNING && mCurRow != NULL) + { + for (i = 0; i < list.size(); ++i) + { + if (list.at(i) == mCurRow || list.at(i) == mHintBtns[mCurRow->GetIx()]) + { + isrow = true; + break; + } + } + } + + if (isrow) + { + UpdateRowMenuSlot(); + RowContextMenu->exec(e->globalPos()); + } + else + { + GameMenu->exec(e->globalPos()); + } +} + +void MainWindow::UpdateRowMenuSlot() +{ + if (mGameState != STATE_RUNNING || mCurRow == NULL) + { + RandRowAction->setEnabled(false); + PrevRowAction->setEnabled(false); + ClearRowAction->setEnabled(false); + return; + } + else + { + RandRowAction->setEnabled(true); + } + + if (mCurRow->GetIx() < 1) + { + PrevRowAction->setEnabled(false); + } + else + { + PrevRowAction->setEnabled(true); + } + + if (mCurRow->GetPegCnt() == 0) + { + ClearRowAction->setEnabled(false); + } + else + { + ClearRowAction->setEnabled(true); + } +} + +void MainWindow::resizeEvent (QResizeEvent* e) +{ + Q_UNUSED(e); + Scale(); +} + +void MainWindow::NewGame() +{ + SetLevel(); + ResetRows(); + SetState(STATE_RUNNING); + + mCurRow = NULL; + SetSolution(); + NextRow(); +} + +void MainWindow::RestartGameSlot() +{ + for (int i = 0; i < 4; ++i) + { + if (mSolPegs[i] != NULL) + { + RemovePeg(mSolPegs[i]); + mSolPegs[i] = NULL; + } + } + ResetRows(); + SetState(STATE_RUNNING); + + mCurRow = NULL; + NextRow(); +} + +void MainWindow::NewGameSlot() +{ + if (mGameState == STATE_RUNNING && mCurRow != NULL) + { + int r = QMessageBox::warning( this, + tr("New Game"), + tr("Do you want to give in\nand start a new Game?"), + QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); + if (r == QMessageBox::Yes) + { + NewGame(); + } + } + else + { + NewGame(); + } +} + +void MainWindow::GiveInSlot() +{ + int r = QMessageBox::Yes; + if (mGameState == STATE_RUNNING && mCurRow != NULL) + { + r = QMessageBox::warning( this, + tr("Give In"), + tr("Do you really want to give in?"), + QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); + } + + if (r == QMessageBox::Yes) + { + SetState(STATE_GAVE_UP); + + if (mCurRow != NULL) + { + mCurRow->CloseRow(); + mHintBtns[mCurRow->GetIx()]->SetActive(false); + } + + ResolveGame(); + } +} +/* +void MainWindow::AboutSlot() +{ + QMessageBox::about( this, + tr("About"), + tr("ColorCode
A needful game to train your brain ;-)

Version: 0.0.1
Author: Dirk Laebisch")); +} +*/ +void MainWindow::AboutSlot() +{ + About ab(this); + ab.exec(); +} + +void MainWindow::AboutQtSlot() +{ + QMessageBox::aboutQt( this, + tr("About Qt")); +} + +void MainWindow::SetSolution() +{ + static bool firstrun = true; + + if (firstrun) + { + firstrun = false; + QTime midnight(0, 0, 0); + qsrand(midnight.secsTo(QTime::currentTime())); + } + + mSolution.clear(); + int i, rndm; + int check[mColorCnt]; + for (i = 0; i < mColorCnt; ++i) + { + check[i] = 0; + } + + for (i = 0; i < POS_CNT; ++i) + { + rndm = qrand() % mColorCnt; + if (!SameColorAction->isChecked() && check[rndm] != 0) + { + --i; + continue; + } + mSolution.push_back(rndm); + check[rndm] = 1; + if (mSolPegs[i] != NULL) + { + RemovePeg(mSolPegs[i]); + mSolPegs[i] = NULL; + } + } + mSolRow->update(mSolRow->boundingRect()); +} + +void MainWindow::ShowSolution() +{ + ColorPeg* peg; + for (int i = 0; i < POS_CNT; ++i) + { + peg = CreatePeg(mSolution.at(i)); + peg->setPos(i * 40 + 80, 62); + peg->SetBtn(false); + peg->SetEnabled(false); + mSolPegs[i] = peg; + } +} + +void MainWindow::ResetRows() +{ + for (int i = 0; i < ROW_CNT; ++i) + { + mPegRows[i]->Reset(); + mHintBtns[i]->Reset(); + } +} + +void MainWindow::FillTypesMap() +{ + int ix; + + QRadialGradient grad = QRadialGradient(20, 20, 40, 5, 5); + QRadialGradient grad2 = QRadialGradient(18, 18, 18, 12, 12); + + ix = 0; + mTypesMap[ix] = new PegType; + grad.setColorAt(0.0, QColor("#FFFF80")); + grad.setColorAt(1.0, QColor("#C05800")); + mTypesMap[ix]->grad = grad; + mTypesMap[ix]->ix = ix; + mTypesMap[ix]->pencolor = Qt::green; + + + ix = 1; + mTypesMap[ix] = new PegType; + grad.setColorAt(0.0, QColor("#FF3300")); + grad.setColorAt(1.0, QColor("#400040")); + mTypesMap[ix]->grad = grad; + mTypesMap[ix]->ix = ix; + mTypesMap[ix]->pencolor = Qt::green; + + ix = 2; + mTypesMap[ix] = new PegType; + grad.setColorAt(0.0, QColor("#33CCFF")); + grad.setColorAt(1.0, QColor("#000080")); + mTypesMap[ix]->grad = grad; + mTypesMap[ix]->ix = ix; + mTypesMap[ix]->pencolor = Qt::red; + + ix = 3; + mTypesMap[ix] = new PegType; + grad2.setColorAt(0.0, Qt::white); + grad2.setColorAt(0.5, QColor("#f8f8f0")); + grad2.setColorAt(0.7, QColor("#f0f0f0")); + //grad2.setColorAt(0.85, QColor("#d8dEFF")); + grad2.setColorAt(1.0, QColor("#d0d0d0")); + mTypesMap[ix]->grad = grad2; + mTypesMap[ix]->ix = ix; + mTypesMap[ix]->pencolor = Qt::green; + + ix = 4; + mTypesMap[ix] = new PegType; + grad.setColorAt(0.0, QColor("#808080")); + grad.setColorAt(1.0, Qt::black); + mTypesMap[ix]->grad = grad; + mTypesMap[ix]->ix = ix; + mTypesMap[ix]->pencolor = Qt::red; + + ix = 5; + mTypesMap[ix] = new PegType; + grad.setColorAt(0.0, QColor("#66FF33")); + grad.setColorAt(1.0, QColor("#385009")); + mTypesMap[ix]->grad = grad; + mTypesMap[ix]->ix = ix; + mTypesMap[ix]->pencolor = Qt::red; + + ix = 6; + mTypesMap[ix] = new PegType; + grad.setColorAt(0.0, QColor("#FF9900")); + grad.setColorAt(1.0, QColor("#A82A00")); + mTypesMap[ix]->grad = grad; + mTypesMap[ix]->ix = ix; + mTypesMap[ix]->pencolor = Qt::red; + + ix = 7; + mTypesMap[ix] = new PegType; + grad.setColorAt(0.0, QColor("#BA88FF")); + grad.setColorAt(1.0, QColor("#38005D")); + mTypesMap[ix]->grad = grad; + mTypesMap[ix]->ix = ix; + mTypesMap[ix]->pencolor = Qt::green; + + ix = 8; + mTypesMap[ix] = new PegType; + grad.setColorAt(0.0, QColor("#00FFFF")); + grad.setColorAt(1.0, QColor("#004040")); + mTypesMap[ix]->grad = grad; + mTypesMap[ix]->ix = ix; + mTypesMap[ix]->pencolor = Qt::green; + + ix = 9; + mTypesMap[ix] = new PegType; + grad.setColorAt(0.0, QColor("#FFC0FF")); + grad.setColorAt(1.0, QColor("#800080")); + mTypesMap[ix]->grad = grad; + mTypesMap[ix]->ix = ix; + mTypesMap[ix]->pencolor = Qt::green; +} + +void MainWindow::InitActions() +{ + NewGameAction = new QAction(tr("&New Game"), this); + NewGameAction->setIcon(QIcon(":/img/document-new.png")); + NewGameAction->setShortcut(tr("Ctrl+N")); + connect(NewGameAction, SIGNAL(triggered()), this, SLOT(NewGameSlot())); + + RestartGameAction = new QAction(tr("&Restart Game"), this); + RestartGameAction->setIcon(QIcon(":/img/view-refresh.png")); + RestartGameAction->setShortcut(tr("Ctrl+Shift+R")); + connect(RestartGameAction, SIGNAL(triggered()), this, SLOT(RestartGameSlot())); + + GiveInAction = new QAction(tr("&Throw In The Towel"), this); + GiveInAction->setIcon(QIcon(":/img/face-sad.png")); + GiveInAction->setShortcut(tr("Ctrl+G")); + connect(GiveInAction, SIGNAL(triggered()), this, SLOT(GiveInSlot())); + + ExitAction = new QAction(tr("E&xit"), this); + ExitAction->setIcon(QIcon(":/img/application-exit.png")); + ExitAction->setShortcut(tr("Ctrl+Q")); + //connect(ExitAction, SIGNAL(triggered()), qApp, SLOT(quit())); + connect(ExitAction, SIGNAL(triggered()), this, SLOT(close())); + + ShowToolbarAction = new QAction(tr("Show Toolbar"), this); + ShowToolbarAction->setCheckable(true); + ShowToolbarAction->setChecked(true); + //ShowToolbarAction->setIcon(QIcon(":/img/configure-toolbars.png")); + ShowToolbarAction->setShortcut(tr("Ctrl+T")); + connect(ShowToolbarAction, SIGNAL(triggered()), this, SLOT(ShowToolbarSlot())); + + ShowMenubarAction = new QAction(tr("Show Menubar"), this); + ShowMenubarAction->setCheckable(true); + ShowMenubarAction->setChecked(true); + //ShowToolbarAction->setIcon(QIcon(":/img/configure-toolbars.png")); + ShowMenubarAction->setShortcut(tr("Ctrl+M")); + connect(ShowMenubarAction, SIGNAL(triggered()), this, SLOT(ShowMenubarSlot())); + + ShowStatusbarAction = new QAction(tr("Show Statusbar"), this); + ShowStatusbarAction->setCheckable(true); + ShowStatusbarAction->setChecked(true); + //ShowToolbarAction->setIcon(QIcon(":/img/configure-toolbars.png")); + ShowStatusbarAction->setShortcut(tr("Ctrl+S")); + connect(ShowStatusbarAction, SIGNAL(triggered()), this, SLOT(ShowStatusbarSlot())); + + SameColorAction = new QAction(tr("Allow Pegs of the Same Color"), this); + SameColorAction->setCheckable(true); + SameColorAction->setChecked(true); + //SameColorAction->setIcon(QIcon(":/img/configure-toolbars.png")); + SameColorAction->setShortcut(tr("Ctrl+Shift+C")); + connect(SameColorAction, SIGNAL(triggered()), this, SLOT(SameColorSlot())); + + AutoCloseAction = new QAction(tr("Close Rows when the 4th Peg is placed"), this); + AutoCloseAction->setCheckable(true); + AutoCloseAction->setChecked(false); + //AutoCloseAction->setIcon(QIcon(":/img/configure-toolbars.png")); + AutoCloseAction->setShortcut(tr("Ctrl+4")); + connect(AutoCloseAction, SIGNAL(triggered()), this, SLOT(AutoCloseSlot())); + + AboutAction = new QAction(tr("About &ColorCode"), this); + AboutAction->setIcon(QIcon(":/img/help-about.png")); + AboutAction->setShortcut(tr("Ctrl+A")); + connect(AboutAction, SIGNAL(triggered()), this, SLOT(AboutSlot())); + + AboutQtAction = new QAction(tr("About &Qt"), this); + AboutQtAction->setIcon(QIcon(":/img/qt.png")); + AboutQtAction->setShortcut(tr("Ctrl+I")); + connect(AboutQtAction, SIGNAL(triggered()), this, SLOT(AboutQtSlot())); + + RandRowAction = new QAction(tr("Fill Row by Random"), this); + RandRowAction->setIcon(QIcon(":/img/system-switch-user.png")); + RandRowAction->setShortcut(tr("Ctrl+R")); + connect(RandRowAction, SIGNAL(triggered()), this, SLOT(RandRowSlot())); + + PrevRowAction = new QAction(tr("Duplicate Previous Row"), this); + PrevRowAction->setIcon(QIcon(":/img/edit-copy.png")); + PrevRowAction->setShortcut(tr("Ctrl+D")); + connect(PrevRowAction, SIGNAL(triggered()), this, SLOT(PrevRowSlot())); + + ClearRowAction = new QAction(tr("Clear Row"), this); + ClearRowAction->setIcon(QIcon(":/img/edit-clear.png")); + ClearRowAction->setShortcut(tr("Ctrl+C")); + connect(ClearRowAction, SIGNAL(triggered()), this, SLOT(ClearRowSlot())); + + mActLevelEasy = new QAction(tr("Easy - 6 Colors"), this); + mActLevelEasy->setData(int(LEVEL_EASY)); + mActLevelEasy->setCheckable(true); + mActLevelEasy->setChecked(false); + connect(mActLevelEasy, SIGNAL(triggered()), this, SLOT(ForceLevelSlot())); + + mActLevelMedium = new QAction(tr("Medium - 8 Colors"), this); + mActLevelMedium->setData(int(LEVEL_MEDIUM)); + mActLevelMedium->setCheckable(true); + mActLevelMedium->setChecked(true); + //mActLevelMedium->setEnabled(false); + connect(mActLevelMedium, SIGNAL(triggered()), this, SLOT(ForceLevelSlot())); + + mActLevelHard = new QAction(tr("Hard - 10 Colors"), this); + mActLevelHard->setData(int(LEVEL_HARD)); + mActLevelHard->setCheckable(true); + mActLevelHard->setChecked(false); + connect(mActLevelHard, SIGNAL(triggered()), this, SLOT(ForceLevelSlot())); +} + +void MainWindow::InitMenus() +{ + GameMenu = menuBar()->addMenu(tr("&Game")); + GameMenu->addAction(NewGameAction); + GameMenu->addAction(RestartGameAction); + GameMenu->addAction(GiveInAction); + GameMenu->addSeparator(); + GameMenu->addAction(ExitAction); + + RowMenu = menuBar()->addMenu(tr("&Row")); + RowMenu->addAction(RandRowAction); + RowMenu->addAction(PrevRowAction); + RowMenu->addAction(ClearRowAction); + connect(RowMenu, SIGNAL(aboutToShow()), this, SLOT(UpdateRowMenuSlot())); + + SettingsMenu = menuBar()->addMenu(tr("&Settings")); + SettingsMenu->addAction(ShowMenubarAction); + SettingsMenu->addAction(ShowToolbarAction); + SettingsMenu->addAction(ShowStatusbarAction); + SettingsMenu->addSeparator(); + + LevelMenu = SettingsMenu->addMenu(tr("Level")); + LevelMenu->addAction(mActLevelEasy); + LevelMenu->addAction(mActLevelMedium); + LevelMenu->addAction(mActLevelHard); + mLevelActions = new QActionGroup(LevelMenu); + mActLevelEasy->setActionGroup(mLevelActions); + mActLevelMedium->setActionGroup(mLevelActions); + mActLevelHard->setActionGroup(mLevelActions); + + SettingsMenu->addSeparator(); + SettingsMenu->addAction(SameColorAction); + SettingsMenu->addAction(AutoCloseAction); + + HelpMenu = menuBar()->addMenu(tr("&Help")); + HelpMenu->addAction(AboutAction); + HelpMenu->addAction(AboutQtAction); + + RowContextMenu = new QMenu(); + RowContextMenu->addAction(RandRowAction); + RowContextMenu->addAction(PrevRowAction); + RowContextMenu->addAction(ClearRowAction); + RowContextMenu->addSeparator(); + RowContextMenu->addAction(NewGameAction); + RowContextMenu->addAction(RestartGameAction); + RowContextMenu->addAction(GiveInAction); + RowContextMenu->addSeparator(); + RowContextMenu->addAction(ExitAction); + + addActions(menuBar()->actions()); +} + +void MainWindow::TestSlot() +{ +} + +void MainWindow::InitToolBars() +{ + mGameToolbar = addToolBar(tr("Game")); + mGameToolbar->setAllowedAreas(Qt::NoToolBarArea); + mGameToolbar->setFloatable(false); + mGameToolbar->setIconSize(QSize(16, 16)); + mGameToolbar->addAction(NewGameAction); + mGameToolbar->addAction(RestartGameAction); + mGameToolbar->addAction(GiveInAction); + mGameToolbar->addSeparator(); + mGameToolbar->addAction(AboutAction); + + mLevelCmb = new QComboBox(); + mLevelCmb->setLayoutDirection(Qt::LeftToRight); + mLevelCmb->setFixedWidth(132); + mLevelCmb->addItem(tr("Easy - 6 Colors"), int(LEVEL_EASY)); + mLevelCmb->addItem(tr("Medium - 8 Colors"), int(LEVEL_MEDIUM)); + mLevelCmb->addItem(tr("Hard - 10 Colors"), int(LEVEL_HARD)); + mLevelCmb->setCurrentIndex(1); + connect(mLevelCmb, SIGNAL(currentIndexChanged(int)), this, SLOT(LevelChangedSlot())); + + mLevelToolbar = addToolBar(tr("Level")); + mLevelToolbar->setAllowedAreas(Qt::NoToolBarArea); + mLevelToolbar->setFloatable(false); + mLevelToolbar->setIconSize(QSize(16, 16)); + mLevelToolbar->setLayoutDirection(Qt::RightToLeft); + mLevelToolbar->addWidget(mLevelCmb); +} + +void MainWindow::ShowToolbarSlot() +{ + if (!ShowToolbarAction->isChecked()) + { + mGameToolbar->hide(); + mLevelToolbar->hide(); + } + else + { + mGameToolbar->show(); + mLevelToolbar->show(); + } + Scale(); +} + +void MainWindow::ShowMenubarSlot() +{ + if (!ShowMenubarAction->isChecked()) + { + menuBar()->hide(); + } + else + { + menuBar()->show(); + } + Scale(); +} + +void MainWindow::ShowStatusbarSlot() +{ + if (!ShowStatusbarAction->isChecked()) + { + statusBar()->hide(); + } + else + { + statusBar()->show(); + } + Scale(); +} + +void MainWindow::SameColorSlot() +{ + int r = QMessageBox::Yes; + if (mGameState == STATE_RUNNING && mCurRow != NULL) + { + r = QMessageBox::question( this, + tr("Message"), + tr("The changed settings will only apply to new games!\nDo you want to give in the current and start a new Game?"), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::Yes); + } + + if (r == QMessageBox::Yes) + { + NewGame(); + } +} + +void MainWindow::AutoCloseSlot() +{ + +} + +void MainWindow::LevelChangedSlot() +{ + int ix = mLevelCmb->itemData(mLevelCmb->currentIndex(), IdRole).toInt(); + if (mLevelActions->checkedAction()->data().toInt() != ix) + { + QList list = LevelMenu->actions(); + for (int i = 0; i < list.size(); ++i) + { + if (list.at(i)->data().toInt() == ix) + { + list.at(i)->setChecked(true); + break; + } + } + } + + int r = QMessageBox::Yes; + if (mGameState == STATE_RUNNING && mCurRow != NULL) + { + r = QMessageBox::question( this, + tr("Message"), + tr("The changed settings will only apply to new games!\nDo you want to give in the current and start a new Game?"), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::Yes); + } + + if (r == QMessageBox::Yes) + { + NewGame(); + } +} + +void MainWindow::ForceLevelSlot() +{ + int i = mLevelActions->checkedAction()->data().toInt(); + + int ix = mLevelCmb->findData(i); + + if (ix != -1 && mLevelCmb->currentIndex() != ix) + { + mLevelCmb->setCurrentIndex(ix); + } +} + +void MainWindow::SetLevel() +{ + int ix = mLevelCmb->itemData(mLevelCmb->currentIndex(), IdRole).toInt(); + ix = max(0, min(2, ix)); + Level lv = Level(ix); + + if (mLevel == lv) + { + return; + } + + mLevel = lv; + mColorCnt = LEVEL_COLOR_CNTS[int(mLevel)]; + + int xpos = 260; + int ystart = 120 + (MAX_COLOR_CNT - mColorCnt) * 40; + int ypos; + int i; + + for (i = 0; i < MAX_COLOR_CNT; ++i) + { + ypos = ystart + i * 40; + mBtnPos[i] = QPoint(xpos, ypos); + + if (i < mColorCnt) + { + if (mPegBtns[i] == NULL) + { + mPegBtns[i] = CreatePeg(i); + } + mPegBtns[i]->setPos(mBtnPos[i]); + mPegBtns[i]->setVisible(true); + } + else if (mPegBtns[i] != NULL) + { + mPegBtns[i]->setVisible(false); + } + } +} + +void MainWindow::InitSolution() +{ + mSolRow = new PegRow(); + mSolRow->setPos(78, 60); + mSolRow->SetActive(false); + scene->addItem(mSolRow); + + for (int i = 0; i < POS_CNT; ++i) + { + mSolPegs[i] = NULL; + } +} + +void MainWindow::InitRows() +{ + + PegRow* row; + RowHint* hint; + + int xpos = 78; + int ypos = 120; + int i; + + for (i = 0; i < ROW_CNT; ++i) + { + row = new PegRow(); + row->SetIx(i); + row->setPos(QPoint(xpos, ypos + (ROW_CNT - (i + 1)) * 40)); + row->setZValue(++MainWindow::mMaxZ); + row->SetActive(false); + scene->addItem(row); + mPegRows[i] = row; + connect(row, SIGNAL(RemovePegSignal(ColorPeg*)), this, SLOT(RemovePegSlot(ColorPeg*))); + connect(row, SIGNAL(RowSolutionSignal(int)), this, SLOT(RowSolutionSlot(int))); + + hint = new RowHint; + hint->SetIx(i); + hint->setPos(QPoint(20, ypos + (ROW_CNT - (i + 1)) * 40)); + hint->setZValue(++MainWindow::mMaxZ); + hint->SetActive(false); + scene->addItem(hint); + mHintBtns[i] = hint; + connect(hint, SIGNAL(HintPressedSignal(int)), this, SLOT(HintPressedSlot(int))); + } +} + +void MainWindow::InitPegBtns() +{ + for (int i = 0; i < MAX_COLOR_CNT; ++i) + { + mPegBtns[i] = NULL; + } +} + +ColorPeg* MainWindow::CreatePeg(int ix) +{ + if (ix < 0 || ix >= mColorCnt) + { + ix = MainWindow::mMaxZ % mColorCnt; + } + + PegType *pt = mTypesMap[ix]; + ColorPeg *peg; + + if (mPegBuff.empty()) + { + peg = new ColorPeg; + peg->SetPegType(pt); + peg->SetBtn(true); + peg->SetId(MainWindow::mMaxZ); + scene->addItem(peg); + peg->setPos(mBtnPos[ix]); + peg->setZValue(MainWindow::mMaxZ); + scene->clearSelection(); + scene->update(mBtnPos[ix].x(), mBtnPos[ix].y(), 38, 38); + peg->setSelected(true); + + connect(peg, SIGNAL(PegPressSignal(ColorPeg *)), this, SLOT(PegPressSlot(ColorPeg *))); + connect(peg, SIGNAL(PegReleasedSignal(ColorPeg *)), this, SLOT(PegReleasedSlot(ColorPeg *))); + } + else + { + unsigned int sz = mPegBuff.size(); + peg = mPegBuff.at(sz - 1); + mPegBuff.resize(sz - 1); + + peg->setVisible(true); + + peg->SetPegType(pt); + peg->SetBtn(true); + peg->SetEnabled(true); + //peg->SetId(MainWindow::mMaxZ); + peg->setPos(mBtnPos[ix]); + //peg->setZValue(MainWindow::mMaxZ); + scene->clearSelection(); + scene->update(mBtnPos[ix].x(), mBtnPos[ix].y(), 38, 38); + peg->setSelected(true); + } + + + + ++MainWindow::mMaxZ; + + return peg; +} + +void MainWindow::RemovePeg(ColorPeg* cp) +{ + if (cp != NULL) + { + cp->Reset(); + cp->setVisible(false); + mPegBuff.push_back(cp); + } +} + +void MainWindow::RemovePegSlot(ColorPeg* cp) +{ + RemovePeg(cp); +} + +void MainWindow::ShowMsgSlot(QString msg) +{ + statusBar()->showMessage(msg); + mMsg->ShowMsg(msg); +} + +void MainWindow::PegPressSlot(ColorPeg* cp) +{ + if (cp == NULL) { return; } + if (cp->IsBtn()) + { + cp->SetBtn(false); + mPegBtns[cp->GetPegType()->ix] = CreatePeg(cp->GetPegType()->ix); + } + else + { + } + cp->setZValue(++MainWindow::mMaxZ); +} + +void MainWindow::PegReleasedSlot(ColorPeg* cp) +{ + if (cp == NULL || !cp) { return; } + + bool snapped = false; + QList list = scene->items(QPointF(cp->pos().x() + 18, cp->pos().y() + 18)); + int i = 0; + for (i = 0; i < list.size(); ++i) + { + if (mCurRow != NULL && list.at(i) == mCurRow) + { + snapped = mCurRow->SnapCP(cp); + break; + } + } + + if (!snapped) + { + RemovePeg(cp); + } + +} + +void MainWindow::RowSolutionSlot(int ix) +{ + std::vector s = mPegRows[ix]->GetSolution(); + if (s.size() == 4) + { + if (AutoCloseAction->isChecked()) + { + HintPressedSlot(ix); + } + else + { + mHintBtns[ix]->SetActive(true); + ShowMsgSlot(tr("Press the Hint Field if You're done.")); + } + } + else + { + mHintBtns[ix]->SetActive(false); + ShowMsgSlot(tr("Place Your pegs ...")); + } + +} + +void MainWindow::HintPressedSlot(int) +{ + mCurRow->CloseRow(); + ResolveRow(); + NextRow(); + ResolveGame(); +} + +void MainWindow::RandRowSlot() +{ + if (mCurRow == NULL || mGameState != STATE_RUNNING) + { + return; + } + + mCurRow->ClearRow(); + + int i, rndm; + int check[mColorCnt]; + ColorPeg* peg; + for (i = 0; i < mColorCnt; ++i) + { + check[i] = 0; + } + + for (i = 0; i < POS_CNT; ++i) + { + rndm = qrand() % mColorCnt; + if (!SameColorAction->isChecked() && check[rndm] != 0) + { + --i; + continue; + } + + check[rndm] = 1; + + peg = CreatePeg(rndm); + mCurRow->ForceSnap(peg, i); + } +} + +void MainWindow::PrevRowSlot() +{ + if (mCurRow == NULL || mGameState != STATE_RUNNING) + { + return; + } + + if (mCurRow->GetIx() < 1) + { + return; + } + + mCurRow->ClearRow(); + + ColorPeg* peg; + std::vector prev = mPegRows[mCurRow->GetIx() - 1]->GetSolution(); + int i; + for (i = 0; i < POS_CNT; ++i) + { + peg = CreatePeg(prev.at(i)); + mCurRow->ForceSnap(peg, i); + } +} + +void MainWindow::ClearRowSlot() +{ + if (mCurRow == NULL || mGameState != STATE_RUNNING) + { + return; + } + + mCurRow->ClearRow(); +} + +void MainWindow::ResolveRow() +{ + std::vector res; + std::vector left1; + std::vector left0; + std::vector rowsol = mCurRow->GetSolution(); + int i, p0, p1; + for (i = 0; i < POS_CNT; ++i) + { + p0 = rowsol.at(i); + p1 = mSolution.at(i); + if (p0 == p1) + { + res.push_back(2); + } + else + { + left0.push_back(p0); + left1.push_back(p1); + } + } + + if (res.size() == (unsigned) POS_CNT) + { + SetState(STATE_WON); + } + else + { + int len0 = left0.size(); + for (i = 0; i < len0; ++i) + { + p0 = left0.at(i); + for (unsigned j = 0; j < left1.size(); ++j) + { + p1 = left1.at(j); + if (p0 == p1) + { + res.push_back(1); + left1.erase(left1.begin() + j); + break; + } + } + } + } + mHintBtns[mCurRow->GetIx()]->DrawHints(res); +} + +void MainWindow::NextRow() +{ + if (mGameState != STATE_RUNNING) + { + return; + } + + if (mCurRow == NULL) + { + mCurRow = mPegRows[0]; + } + else if (mCurRow->GetIx() < ROW_CNT - 1) + { + mCurRow = mPegRows[mCurRow->GetIx() + 1]; + } + else + { + mCurRow = NULL; + SetState(STATE_LOST); + } + + if (mCurRow != NULL) + { + mCurRow->SetActive(true); + ShowMsgSlot(tr("Place Your pegs ...")); + } +} + +void MainWindow::ResolveGame() +{ + switch (mGameState) + { + case STATE_WON: + ShowMsgSlot(tr("Congratulation! You have won!")); + break; + case STATE_LOST: + ShowMsgSlot(tr("Sorry! You lost!")); + break; + case STATE_GAVE_UP: + ShowMsgSlot(tr("Sure, You're too weak for me!")); + break; + case STATE_RUNNING: + default: + return; + break; + } + + ShowSolution(); +} + +void MainWindow::SetState(const int s) +{ + if (mGameState == s) + { + return; + } + + mGameState = s; + + bool running = mGameState == STATE_RUNNING; + + RestartGameAction->setEnabled(running); + GiveInAction->setEnabled(running); +} diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/mainwindow.h b/retroshare-gui/src/gui/plugins/ColorCode_plugin/mainwindow.h new file mode 100644 index 000000000..f1adad133 --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/mainwindow.h @@ -0,0 +1,169 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include + +struct PegType +{ + int ix; + QRadialGradient grad; + QColor pencolor; +}; + +//typedef std::vector TypesMap; + +class QAction; +class QActionGroup; +class QComboBox; +class QGraphicsItem; +class QGraphicsTextItem; +class QGraphicsScene; +class QGraphicsView; +class ColorPeg; +class PegRow; +class RowHint; +class Msg; + +class MainWindow : public QMainWindow +{ + Q_OBJECT + + public: + MainWindow(); + + static const int STATE_RUNNING; + static const int STATE_WON; + static const int STATE_LOST; + static const int STATE_GAVE_UP; + + static const int MAX_COLOR_CNT; + static const int LEVEL_COLOR_CNTS[3]; + + int ROW_CNT; + int POS_CNT; + + public slots: + void PegPressSlot(ColorPeg *cp); + void PegReleasedSlot(ColorPeg *cp); + void RowSolutionSlot(int ix); + void HintPressedSlot(int ix); + void ShowMsgSlot(QString msg); + void RemovePegSlot(ColorPeg* cp); + + protected : + void resizeEvent(QResizeEvent* e); + void contextMenuEvent(QContextMenuEvent* e); + + private slots: + void InitRows(); + void InitPegBtns(); + void NewGameSlot(); + void RestartGameSlot(); + void GiveInSlot(); + void ResetRows(); + void AboutSlot(); + void AboutQtSlot(); + void ShowToolbarSlot(); + void ShowMenubarSlot(); + void ShowStatusbarSlot(); + void SameColorSlot(); + void AutoCloseSlot(); + void ForceLevelSlot(); + + void RandRowSlot(); + void PrevRowSlot(); + void ClearRowSlot(); + + void LevelChangedSlot(); + + void UpdateRowMenuSlot(); + + void TestSlot(); + + private: + enum Level { LEVEL_EASY, + LEVEL_MEDIUM, + LEVEL_HARD }; + + static Level mLevel; + static int mColorCnt; + static int mMaxZ; + + int mGameState; + + std::vector mSolution; + + QGraphicsScene* scene; + QGraphicsView* view; + QSize* mOrigSize; + + Msg* mMsg; + + PegRow* mCurRow; + + std::vector mPegBuff; + PegRow* mSolRow; + PegRow* mPegRows[10]; + RowHint* mHintBtns[10]; + + PegType* mTypesMap[10]; + ColorPeg* mPegBtns[10]; + ColorPeg* mSolPegs[4]; + QPoint mBtnPos[10]; + + void FillTypesMap(); + + void InitSolution(); + void InitActions(); + void InitMenus(); + void InitToolBars(); + + void SetLevel(); + void SetState(const int s); + void NewGame(); + void SetSolution(); + void ShowSolution(); + void NextRow(); + void ResolveRow(); + void ResolveGame(); + void Scale(); + + ColorPeg* CreatePeg(int ix); + void RemovePeg(ColorPeg* cp); + + QMenu* GameMenu; + QMenu* RowMenu; + QMenu* SettingsMenu; + QMenu* LevelMenu; + QMenu* HelpMenu; + QMenu* RowContextMenu; + QToolBar* mGameToolbar; + QToolBar* mLevelToolbar; + + QComboBox* mLevelCmb; + + QActionGroup* mLevelActions; + QAction* NewGameAction; + QAction* RestartGameAction; + QAction* GiveInAction; + QAction* ShowToolbarAction; + QAction* ShowMenubarAction; + QAction* ShowStatusbarAction; + QAction* SameColorAction; + QAction* AutoCloseAction; + QAction* AboutAction; + QAction* AboutQtAction; + QAction* ExitAction; + + QAction* mActLevelEasy; + QAction* mActLevelMedium; + QAction* mActLevelHard; + + QAction* RandRowAction; + QAction* PrevRowAction; + QAction* ClearRowAction; + +}; + +#endif // MAINWINDOW_H diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/msg.cpp b/retroshare-gui/src/gui/plugins/ColorCode_plugin/msg.cpp new file mode 100644 index 000000000..82f846845 --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/msg.cpp @@ -0,0 +1,83 @@ +#include + +#include "msg.h" + +using namespace std; + +Msg::Msg() +{ + /* + setFont(QFont("Arial", 14, QFont::Bold, false)); + setDefaultTextColor(QColor("#cccccc")); + setTextWidth(300); + + mTd = new QTextDocument(); + mTd->setDefaultFont(QFont("Arial", 14, QFont::Bold, false)); + mTd->setTextWidth(300); + + + //QAbstractTextDocumentLayout* lay = mTd->documentLayout(); + + setDocument(mTd); + */ + mFont = QFont("Arial", 14, QFont::Bold, false); + mFont.setStyleHint(QFont::SansSerif); + mLay = new QTextLayout(); + mLay->setFont(mFont); + mLay->setTextOption(QTextOption(Qt::AlignHCenter)); + mUpdateRect = QRectF(0, 0, 10, 10); +} + +Msg::~Msg() +{ +} + +void Msg::ShowMsg(const QString str) +{ + //setPlainText(str); + //mTd->clear(); + //mTd->setPlainText(str); + mUpdateRect = boundingRect(); + + mLay->setText(str); + int leading = -3;//fontMetrics.leading(); + qreal h = 10; + qreal maxw = 0; + qreal maxh = 0; + mLay->beginLayout(); + + while (1) + { + QTextLine line = mLay->createLine(); + if (!line.isValid()) + { + break; + } + + line.setLineWidth(280); + h += leading; + line.setPosition(QPointF(0, h)); + h += line.height(); + maxw = qMax(maxw, line.naturalTextWidth()); + } + mLay->endLayout(); + + + maxw = qMax(mUpdateRect.width(), mLay->boundingRect().width()); + maxh = qMax(mUpdateRect.height(), mLay->boundingRect().height() + 8); + mUpdateRect = QRectF(0, 0, maxw, maxh); + + update(boundingRect()); +} + +QRectF Msg::boundingRect() const +{ + return mUpdateRect; +} + +void Msg::paint(QPainter* painter, const QStyleOptionGraphicsItem* /*option*/, QWidget* /* widget */) +{ + //painter->setBrush(Qt::NoBrush); + painter->setPen(QPen(QColor("#f0f0f0"))); + mLay->draw(painter, QPoint(0, 0)); +} diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/msg.h b/retroshare-gui/src/gui/plugins/ColorCode_plugin/msg.h new file mode 100644 index 000000000..b3271168c --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/msg.h @@ -0,0 +1,31 @@ +#ifndef MSG_H +#define MSG_H + +#include +#include +#include +#include +#include +#include + +class Msg : public QGraphicsTextItem +{ +public: + Msg(); + ~Msg(); + + void ShowMsg(const QString str); + QRectF boundingRect() const; + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget); + +private: + /* + QTextDocument* mTd; + QTextBlock mTb; + */ + QTextLayout* mLay; + QFont mFont; + QRectF mUpdateRect; +}; + +#endif // MSG_H diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/pegrow.cpp b/retroshare-gui/src/gui/plugins/ColorCode_plugin/pegrow.cpp new file mode 100644 index 000000000..d3dc55f34 --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/pegrow.cpp @@ -0,0 +1,238 @@ +#include + +#include "colorpeg.h" +#include "pegrow.h" +#include "rowhint.h" + +using namespace std; + +PegRow::PegRow(QObject*) +{ + mIx = -1; + + //setFlags(QGraphicsItem::GraphicsItemFlags(0)); + + mPen = QPen(QColor("#808080")); + + for (int i = 0; i < 4; ++i) + { + mColorPegs[i] = NULL; + } + + Reset(); +} + +PegRow::~PegRow() +{ +} + +void PegRow::Reset() +{ + ClearRow(); + SetActive(false); +} + +void PegRow::ClearRow() +{ + for (int i = 0; i < 4; ++i) + { + if (mColorPegs[i] != NULL) + { + emit(RemovePegSignal(mColorPegs[i])); + } + } +} + +int PegRow::GetIx() const +{ + return mIx; +} + +void PegRow::SetIx(const int ix) +{ + mIx = ix; +} + +int PegRow::GetPegCnt() +{ + int cnt = 0; + int i = 0; + for (i = 0; i < 4; ++i) + { + if (mColorPegs[i] != NULL) + { + ++cnt; + } + } + return cnt; +} + +ColorPeg** PegRow::GetPegs() +{ + return mColorPegs; +} + +void PegRow::SetActive(const bool b) +{ + mIsActive = b; + if (b) + { + setOpacity(1.0); + } + else + { + setOpacity(0.5); + } + update(boundingRect()); +} + +bool PegRow::SnapCP(ColorPeg *cp) +{ + + bool snapped = false; + if (mIsActive) + { + QPointF p = mapFromParent(cp->pos()); + + p.rx() += 18; + p.ry() += 18; + + int ix = -1; + int i; + + if (p.y() >= 0 && p.y() <= 40) + { + for (i = 0; i < 4; ++i) + { + if (p.x() >= i * 40 && p.x() < (i + 1) * 40) + { + if (mColorPegs[i] != NULL) + { + emit RemovePegSignal(mColorPegs[i]); + mColorPegs[i] = NULL; + } + mColorPegs[i] = cp; + cp->SetPegRow(this); + ix = i; + cp->setPos(mapToParent(i * 40 + 2, 2)); + break; + } + } + } + + snapped = ix > -1; + CheckSolution(); + } + + return snapped; +} + +void PegRow::ForceSnap(ColorPeg* cp, int posix) +{ + if (mIsActive) + { + if (mColorPegs[posix] != NULL) + { + emit RemovePegSignal(mColorPegs[posix]); + mColorPegs[posix] = NULL; + } + mColorPegs[posix] = cp; + cp->SetPegRow(this); + cp->setPos(mapToParent(posix * 40 + 2, 2)); + + CheckSolution(); + } +} + +void PegRow::CloseRow() +{ + for (int i = 0; i < 4; ++i) + { + if (mColorPegs[i] != NULL) + { + mColorPegs[i]->SetEnabled(false); + } + } + SetActive(false); +} + +void PegRow::CheckSolution() +{ + mSolution.clear(); + + for (int i = 0; i < 4; ++i) + { + if (mColorPegs[i] != NULL) + { + //mColorPegs[i]->setEnabled(false); + //mColorPegs[i]->setFlags(QGraphicsItem::GraphicsItemFlags(0)); + mSolution.push_back(mColorPegs[i]->GetPegType()->ix); + } + } + + emit RowSolutionSignal(mIx); +} + +std::vector PegRow::GetSolution() const +{ + return mSolution; +} + +void PegRow::RemovePeg(ColorPeg *cp) +{ + for (int i = 0; i < 4; ++i) + { + if (mColorPegs[i] == cp) + { + mColorPegs[i] = NULL; + if (mIsActive) + { + CheckSolution(); + } + } + } +} + +QVariant PegRow::itemChange(GraphicsItemChange change, const QVariant &value) +{ + return QGraphicsItem::itemChange(change, value); +} + +QPainterPath PegRow::shape() const +{ + QPainterPath path; + path.addRect(boundingRect()); + return path; +} + +QRectF PegRow::boundingRect() const +{ + const int Margin = 1; + return outlineRect().adjusted(-Margin, -Margin, +Margin, +Margin); +} + +QRectF PegRow::outlineRect() const +{ + return QRectF(0.0, 0.0, 160.0, 40.0); +} + +void PegRow::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* /* widget */) +{ + mPen.setWidth(2); + if (option->state & QStyle::State_Selected) + { + mPen.setStyle(Qt::DotLine); + } + + painter->setPen(mPen); + + int i; + for (i = 0; i < 4; i++) + { + QRadialGradient grad(QPointF(i * 40 + 10, 10), 100); + grad.setColorAt(0, QColor("#cccccc")); + grad.setColorAt(1, QColor("#ffffff")); + painter->setBrush(QBrush(grad)); + painter->drawRect(QRectF(i * 40, 0.0, 40.0, 40.0)); + } +} diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/pegrow.h b/retroshare-gui/src/gui/plugins/ColorCode_plugin/pegrow.h new file mode 100644 index 000000000..2e2d2e675 --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/pegrow.h @@ -0,0 +1,70 @@ +#ifndef PEGROW_H +#define PEGROW_H + +#include +#include +#include +#include +#include +#include +#include +#include "mainwindow.h" +#include "pegrow.h" +#include "colorpeg.h" + +class PegRow : public QObject, public QGraphicsItem +{ + Q_OBJECT + +public: + PegRow(QObject* parent = 0); + ~PegRow(); + + int GetIx() const; + int GetPegCnt(); + ColorPeg** GetPegs(); + std::vector GetSolution() const; + void SetIx(const int ix); + void SetActive(const bool b); + bool SnapCP(ColorPeg* cp); + void ForceSnap(ColorPeg* cp, int posix); + void RemovePeg(ColorPeg* cp); + + void CloseRow(); + void ClearRow(); + void Reset(); + + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget); + QRectF boundingRect() const; + QPainterPath shape() const; + +signals: + void RowSolutionSignal(int ix); + void RemovePegSignal(ColorPeg* cp); + +protected: + QVariant itemChange(GraphicsItemChange change, const QVariant &value); + //void contextMenuEvent(QGraphicsSceneContextMenuEvent* e); + +private slots: + //void FillRandSlot(); + +private: + std::vector mSolution; + QPen mPen; + bool mIsActive; + int mIx; + + void CheckSolution(); + ColorPeg* mColorPegs[4]; + QRectF outlineRect() const; + /* + void InitActions(); + void InitMenus(); + QAction* FillRandAct; + QAction* ClearRowAct; + QMenu* ContextMenu; + */ +}; + +#endif // PEGROW_H diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/resource.qrc b/retroshare-gui/src/gui/plugins/ColorCode_plugin/resource.qrc new file mode 100644 index 000000000..51a4a5e35 --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/resource.qrc @@ -0,0 +1,25 @@ + + + docs/GPL.html + img/application-exit.png + img/document-new.png + img/GNU-icon16.png + img/GNU-icon32.png + img/GNU-icon64.png + img/GNU-icon.png + img/help-about.png + img/qt.png + img/story-editor.png + img/view-refresh.png + img/bm03.png + trans_de.qm + img/face-sad.png + img/edit-clear.png + img/edit-copy.png + img/system-switch-user.png + img/cc16.png + img/cc32.png + img/cc64.png + cc32.ico + + diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/rowhint.cpp b/retroshare-gui/src/gui/plugins/ColorCode_plugin/rowhint.cpp new file mode 100644 index 000000000..72110cba9 --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/rowhint.cpp @@ -0,0 +1,154 @@ +#include + +#include "rowhint.h" + +using namespace std; + +RowHint::RowHint(QObject*) +{ + //setFlags(QGraphicsItem::GraphicsItemFlags(0)); + + mIx = -1; + + mPen = QPen(QColor("#808080")); + mPen.setWidth(2); + + QRadialGradient grad(QPointF(10, 10), 100); + grad.setColorAt(0, QColor("#d8d8d8")); + grad.setColorAt(1, QColor("#ffffff")); + mBrush1 = QBrush(grad); + grad.setColorAt(0, QColor(216, 216, 216, 51)); + grad.setColorAt(1, QColor(255, 255, 255, 51)); + mBrush0 = QBrush(grad); + + Reset(); +} + +RowHint::~RowHint() +{ + scene()->removeItem(this); +} + +void RowHint::Reset() +{ + mActive = true; + mHints.clear(); + mSolved = false; + SetActive(false); +} + +int RowHint::GetIx() const +{ + return mIx; +} + +void RowHint::SetIx(const int ix) +{ + mIx = ix; +} + +void RowHint::SetActive(bool b) +{ + if (b == mActive) + { + return; + } + + mActive = b; + setAcceptHoverEvents(b); + setEnabled(b); + if (b) + { + setCursor(Qt::PointingHandCursor); + //setOpacity(1); + setToolTip(tr("Commit Your solution")); + } + else + { + setCursor(Qt::ArrowCursor); + //setOpacity(0.2); + setToolTip(QString("")); + } + //scene()->update(mapRectToScene(boundingRect())); + update(boundingRect()); +} + +void RowHint::DrawHints(std::vector res) +{ + mHints = res; + mSolved = true; + for (unsigned i = 0; i < mHints.size(); ++i) + { + } + update(boundingRect()); +} + +void RowHint::mousePressEvent(QGraphicsSceneMouseEvent *e) +{ + if (mActive && !mSolved) + { + if (e->button() == Qt::LeftButton) + { + SetActive(false); + emit HintPressedSignal(mIx); + } + } + QGraphicsItem::mousePressEvent(e); +} + +QPainterPath RowHint::shape() const +{ + QPainterPath path; + path.addRect(boundingRect()); + return path; +} + +QRectF RowHint::boundingRect() const +{ + const int Margin = 1; + return outlineRect().adjusted(-Margin, -Margin, +Margin, +Margin); +} + +QRectF RowHint::outlineRect() const +{ + return QRectF(0.0, 0.0, 40.0, 40.0); +} + +void RowHint::paint(QPainter* painter, const QStyleOptionGraphicsItem* /*option*/, QWidget* /* widget */) +{ + painter->setPen(mPen); + if (mActive) + { + painter->setBrush(mBrush1); + } + else + { + painter->setBrush(mBrush0); + } + + QPainterPath path; + path.addRect(QRectF(0.0, 0.0, 40.0, 40.0)); + for (int i = 0; i < 4; i++) + { + //painter->drawEllipse(QRect((i % 2) * 16 + 6, floor(i / 2) * 16 + 6, 12, 12)); + path.addEllipse(QRectF((i % 2) * 16 + 6, floor(i / 2) * 16 + 6, 12, 12)); + } + //painter->drawRect(QRectF(0.0, 0.0, 40.0, 40.0)); + painter->drawPath(path); + + if (mSolved) + { + for (unsigned i = 0; i < mHints.size(); i++) + { + if (mHints.at(i) == 2) + { + painter->setBrush(QBrush(Qt::black)); + } + else + { + painter->setBrush(QBrush(Qt::white)); + } + painter->drawEllipse(QRectF((i % 2) * 16 + 6, floor(i / 2) * 16 + 6, 12, 12)); + } + } +} diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/rowhint.h b/retroshare-gui/src/gui/plugins/ColorCode_plugin/rowhint.h new file mode 100644 index 000000000..7a3dbdc59 --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/rowhint.h @@ -0,0 +1,49 @@ +#ifndef ROWHINT_H +#define ROWHINT_H + +#include +#include +#include +#include +#include +#include +#include "mainwindow.h" + +class RowHint : public QObject, public QGraphicsItem +{ + Q_OBJECT + +public: + RowHint(QObject* parent = 0); + ~RowHint(); + + int mIx; + bool mActive; + bool mSolved; + std::vector mHints; + + int GetIx() const; + void SetIx(const int ix); + void SetActive(bool b); + void DrawHints(std::vector res); + void Reset(); + + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget); + QRectF boundingRect() const; + QPainterPath shape() const; + +signals: + void HintPressedSignal(int ix); + +protected: + void mousePressEvent(QGraphicsSceneMouseEvent* e); + +private: + QPen mPen; + QBrush mBrush0; + QBrush mBrush1; + + QRectF outlineRect() const; +}; + +#endif // ROWHINT_H diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/trans_de.qm b/retroshare-gui/src/gui/plugins/ColorCode_plugin/trans_de.qm new file mode 100644 index 0000000000000000000000000000000000000000..35f15747f5f1014c20fa996821657cb2c160b04b GIT binary patch literal 5741 zcma)AYit}>6+U+Sj=gpsRQZvX>nPpEZtSLQ8l_1{;`kX68^`Mq6_v-V=kD&{*%@md z-nu}4pdb)JKt(G4AVDRB1dWK`2ZAbXC0;>Qsah%|5Gs`*kw8R>P^+Mzl<=KBvE78t377q-0m?Jt49cgt&+ze}|BS8ZFb9>@6aZ7+QN8d3KV(0_w|8uVSz3!v|T{t)y( zps$1827MRweWIRSp#KB?NZSkFXaUWGwt{{cbPMPuQ24X;f%fnHD1<$?JC3~h2cm&5 zcKq_IcQJpaN=5m32`&J&riHUwEd}W z+kict)bq8=h%Y4UyL}Pk8(S~zm};~#in%NuQNLq1|`?)#B=*t-VK8mX3l{53|aIvNpk4vn7u1| z##)k&FYEZ9q)Bi)Bq&EKc#>q(evCpYl_u*f^1K$O3%kwJQ69WO4~1B%|0X0XVYEbMMJQ1P1ptuiq?%L59?k0 ziv!VSExAteEntZ;EC!gEvpqWvG+@@AS)jpr%Q4-Gf-&ZwK|h#y0de#A{yySSclbotU}PNO5Gyts2<$dlD_PM^aH~S8cJjj79ht$qSZWT z%PzQ;GzWHrT_Z80ETgck&Wk$zvD)rzP6mPH6#X(qyrj*v+MA*eoqJ12|G(cY)*G|`Pm@Nh)iN# za#fdJmA>d0Qh?*gTgTW|L_B%KG0|u;g-Cg7gBguIyf+Xtg;lX(yT@!BVVal4_!#E6 zekniGY~5Acb0}q%EE>QOi|ih^rQwMNX|R}B&mdg`tQ@2S)v~U^oAdl&wZufO@*KP2 zSGS$#Yr5|rw_RVdZeLVN(osNhFetHuj94qSu_VnjznZV2^}Bu&1dc^;u7Gi zO&ElwIcx}T4z~_bk>G@{s6xXV=g?prxqHW52iO{fz#(ALpm+j^S~6Cps9?0g>UEgZ zF&=pKg9n>o8f%7Wycwp6W|*d%VLIIm(`++LbImZFZH8%~8K&IkOucGbawV$}Joo`2 zO|mwndU1nl)R`l69=XNfs*8D)f!rK<$WYxrF>LZFDyZg5XXc4G5AU0BRWbLZVcTn> zVmJXev_%Vp6Btbnekg+Q&Ms;Nk^K4e4G*QjK{Z#|&EbBq1A#~9) z(2nb3m}>4Jv{&3}YpAqT6hs1<7=J=EMjWj~+ZIRYo{4Y;{R!FyG4IJ$%MJZTfHy#= zP_-B)xoRcBs(mv1l$BZ#_Mp3suslE{M(}qCe>Fs}L0%5M}!*rlQJO*YA&qO>PKCnqZY9e(@&S6+qArFAw`VwTu#f z7#>7)lZ7_|jOhNrMJy`5T*^lIe{9x{d9J8js64U4O~mM^>YMBL@JZw@Hwt_UDbfkZ znE(KB(q5w*6hV$^nF$IXDoo$lqGFbSOvE4 z0Z$6kb!4h}S?nV#=VQPJPq(Oyk@&=*X4bcf;2YbQFBbC0|WD_$CQv$)$M?bpO zGE}jN<*FeyrT6ASPwtPlI&fW4k;bwp@YPeMSKy#AnM4VK%q+C~^ zUxSeXbc{H)nU6o3Buko3=jgMOmda(#tM-fRtqvX^i+~1E7H9DpMbE824$(1STU9o~ zhHH?dkCgtr5oy|3-D`!H^E+wdy4xf?Xk2!e`6{(kGMplA;ePd=CMsMfTnCMUv9f|+ zbP8O1`7@Y5*pptV)e&6^Jx}74HeI#%B4b?ad|r8w{9wa7ruV5<7 + + +UTF-8 + + About + + &Author + &Autor + + + icon + + + + &License + &Lizenz + + + A needful game to train your brain ;-) + Ein Spiel, um den Verstand<br>wachzuhalten ;-) + + + 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. + Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder (nach Ihrer Option) jeder späteren Version. + + + ColorCode + ColorCode + + + About ColorCode + Info ColorCode + + + + MainWindow + + New Game + Neues Spiel + + + Do you want to give in +and start a new Game? + Wollen Sie aufgeben und +ein neues Spiel beginnen? + + + About Qt + Info Qt + + + &New Game + &Neues Spiel + + + Ctrl+N + + + + &Restart Game + Spiel neu &beginnen + + + Ctrl+R + + + + E&xit + B&eenden + + + Ctrl+Q + + + + Ctrl+T + + + + Ctrl+C + + + + Ctrl+4 + + + + Ctrl+A + + + + About &Qt + Info &Qt + + + &Game + &Spiel + + + &Settings + &Einstellungen + + + &Help + &Hilfe + + + Game + Spiel + + + Message + Hinweis + + + The changed settings will only apply to new games! +Do you want to give in the current and start a new Game? + Die geänderten Einstellungen werden erst in neuen Spielen berücksichtigt! +Möchten Sie das gegenwärtige Spiel aufgeben und ein neues Spiel beginnen? + + + Press the Hint Field if You're done. + Fertig? Dann klicken Sie auf das Hinweis-Feld. + + + Place Your pegs ... + Setzen Sie Ihre Steine ... + + + Congratulation! You have won! + Glückwunsch! Sie haben gewonnen! + + + Sorry! You lost! + Schade, aber Sie haben es nicht vermocht! + + + Ctrl+I + + + + Give In + Aufgeben + + + Do you really want to give in? + Wollen Sie wirklich aufgeben? + + + &Throw In The Towel + &Handtuch werfen + + + Ctrl+G + + + + Sure, You're too weak for me! + Klar, Sie sind zu schwach für mich! + + + Ctrl+Shift+R + + + + Ctrl+Shift+C + + + + Fill Row by Random + Reihe zufällig füllen + + + Duplicate Previous Row + Vorherige Reihe duplizieren + + + Ctrl+D + + + + Clear Row + Reihe leeren + + + &Row + &Reihe + + + ColorCode + ColorCode + + + About &ColorCode + Info &ColorCode + + + Ctrl+M + + + + Ctrl+S + + + + Easy - 6 Colors + Leicht - 6 Farben + + + Medium - 8 Colors + Mittel - 8 Farben + + + Hard - 10 Colors + Schwer - 10 Farben + + + Show Toolbar + Toolbar anzeigen + + + Show Menubar + Menüleiste anzeigen + + + Show Statusbar + Statusleiste anzeigen + + + Allow Pegs of the Same Color + Steine gleicher Farbe erlauben + + + Close Rows when the 4th Peg is placed + Reihen nach Setzen des 4. Steins auswerten + + + Level + Schwierigkeitsgrad + + + + RowHint + + Commit Your solution + Kombination testen + + + diff --git a/retroshare-gui/src/gui/plugins/ColorCode_plugin/trans_en.ts b/retroshare-gui/src/gui/plugins/ColorCode_plugin/trans_en.ts new file mode 100644 index 000000000..78ab2de1e --- /dev/null +++ b/retroshare-gui/src/gui/plugins/ColorCode_plugin/trans_en.ts @@ -0,0 +1,248 @@ + + + +UTF-8 + + About + + &Author + + + + icon + + + + &License + + + + A needful game to train your brain ;-) + + + + 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. + + + + ColorCode + + + + About ColorCode + + + + + MainWindow + + New Game + + + + Do you want to give in +and start a new Game? + + + + About Qt + + + + &New Game + + + + Ctrl+N + + + + &Restart Game + + + + Ctrl+R + + + + E&xit + + + + Ctrl+Q + + + + Ctrl+T + + + + Ctrl+C + + + + Ctrl+4 + + + + Ctrl+A + + + + About &Qt + + + + &Game + + + + &Settings + + + + &Help + + + + Game + + + + Message + + + + The changed settings will only apply to new games! +Do you want to give in the current and start a new Game? + + + + Press the Hint Field if You're done. + + + + Place Your pegs ... + + + + Congratulation! You have won! + + + + Sorry! You lost! + + + + Ctrl+I + + + + Give In + + + + Do you really want to give in? + + + + &Throw In The Towel + + + + Ctrl+G + + + + Sure, You're too weak for me! + + + + Ctrl+Shift+R + + + + Ctrl+Shift+C + + + + Fill Row by Random + + + + Duplicate Previous Row + + + + Ctrl+D + + + + Clear Row + + + + &Row + + + + ColorCode + + + + About &ColorCode + + + + Ctrl+M + + + + Ctrl+S + + + + Easy - 6 Colors + + + + Medium - 8 Colors + + + + Hard - 10 Colors + + + + Show Toolbar + + + + Show Menubar + + + + Show Statusbar + + + + Allow Pegs of the Same Color + + + + Close Rows when the 4th Peg is placed + + + + Level + + + + + RowHint + + Commit Your solution + + + +