added all files
[ffqwlibrary] / libffqw-1.0 / sources / ffdpad.cpp
diff --git a/libffqw-1.0/sources/ffdpad.cpp b/libffqw-1.0/sources/ffdpad.cpp
new file mode 100644 (file)
index 0000000..9381c3d
--- /dev/null
@@ -0,0 +1,268 @@
+/*
+         GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  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
+them 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 prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  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.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+http://www.gnu.org/licenses/gpl-3.0.txt
+*/
+/**
+ * @file ffdpad.cpp
+ * @brief Implementation of the FFDPad class
+ *
+ * @author ComArch S.A.
+ * @date 2009.08.11
+ * @version 1.0
+ */
+#include "ffdpad.h"
+
+
+/**
+ * Constructs a FFDPad with a parent
+ */
+FFDPad::FFDPad(QWidget* parent) :
+       FFAbstractWidget(parent), size_(DEFAULT_SIZE, DEFAULT_SIZE)
+{
+       init();
+}
+
+/**
+ * Constructs a FFDPad with given size and parent.
+ */
+FFDPad::FFDPad(QSize size, QWidget* parent) :
+       FFAbstractWidget(parent)
+{
+       this->size_ = QSize(size.width(),size.height());
+       init();
+}
+
+/** A virtual destructor */
+FFDPad::~FFDPad()
+{
+       ;
+}
+/**
+ * Initiates FFDPad class. Sets all needed fields, connections and calls.
+ * It is called by all constructors.
+ */
+void FFDPad::init()
+{
+
+       //sets size policy
+       setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+       setMinimumSize(QSize(DEFAULT_MIN_SIZE, DEFAULT_MIN_SIZE));
+
+       //Sets default values
+
+
+       path = DPAD_PATH;
+       ax = 0;
+       ay = 0;
+
+       if(size_.height() <= 0 || size_.width() <= 0)
+       {
+               this->size_ = QSize(DEFAULT_SIZE,DEFAULT_SIZE);
+       }
+
+       layout = new QGridLayout(this);
+               layout->setMargin(0);
+               layout->setSpacing(0);
+
+       background = new FFViewCache(this);
+
+       //creates FFDPadButtons
+       buttonUp = new FFDPadButton(path + "_button_up",
+                                   DPAD_UP,
+                                   this);
+       buttonDown = new FFDPadButton(path + "_button_down",
+                                     DPAD_DOWN,
+                                     this);
+       buttonLeft = new FFDPadButton(path + "_button_left",
+                                     DPAD_LEFT,
+                                     this);
+       buttonRight = new FFDPadButton(path + "_button_right",
+                                      DPAD_RIGHT,
+                                      this);
+       //connects
+       connect(buttonUp,SIGNAL(clicked(int)),this,SIGNAL(clicked(int)));
+       connect(buttonDown,SIGNAL(clicked(int)),this,SIGNAL(clicked(int)));
+       connect(buttonLeft,SIGNAL(clicked(int)),this,SIGNAL(clicked(int)));
+       connect(buttonRight,SIGNAL(clicked(int)),this,SIGNAL(clicked(int)));
+
+       //adds buttons to layout
+       layout->addWidget(buttonUp, 0, 0, 1, 1);
+       layout->addWidget(buttonDown, 0, 0, 1, 1);
+       layout->addWidget(buttonLeft, 0, 0, 1, 1);
+       layout->addWidget(buttonRight, 0, 0, 1, 1);
+
+       this->setSize(size_);
+
+       background->init(path + "_background.svg");
+       background->updateView(size_);
+
+}
+
+
+/**
+ * Returns size of FFDPad
+ */
+QSize FFDPad::size() const
+{
+       return this->geometry().size();
+}
+
+/**
+ * Sets FFDPad's size.
+ * If both edges are equal FFDPad have it`s maximum size cause it is always square.
+ * If size`s parameters are not equal then FFDPad is located in center of the widget.
+ * @param size Size of FFDPad widget
+ */
+void FFDPad::setSize(QSize size)
+{
+       calculateSize(size);
+       buttonUp -> setSize(size_);
+       buttonDown -> setSize(size_);
+       buttonLeft -> setSize(size_);
+       buttonRight -> setSize(size_);
+       setGeometry(geometry().x(), geometry().y(), size.width(), size.height());
+}
+
+/**
+ * Updates FFDPad view and events' mask after changing size of the widget,
+ * only when resizable_ is set up.
+ * Overrides the virtual method from QWidget.
+ * @param event Contains all informations about event.
+ */
+void FFDPad::resizeEvent(QResizeEvent* event)
+{
+       calculateSize(event->size());
+       buttonUp -> setSize(size_);
+       buttonDown -> setSize(size_);
+       buttonLeft -> setSize(size_);
+       buttonRight -> setSize(size_);
+       background -> updateView(size_);
+       ax = 0;
+       ay = 0;
+
+       if(event ->size().width() > event -> size().height())
+       {
+               ax = (size_.width() - event -> size().width()) / 2;
+       }
+       else
+       {
+               ay = (size_.height() - event -> size().height()) / 2;
+       }
+
+       buttonUp -> move(-ax, -ay);
+       buttonDown -> move(-ax, -ay);
+       buttonLeft -> move(-ax, -ay);
+       buttonRight -> move(-ax, -ay);
+
+}
+
+/**
+ * Repaints the view of the FFDPAd. Overrides the virtual method from QWidget.
+ * @param event Contains all informations about event.
+ */
+void FFDPad::paintEvent(QPaintEvent* event)
+{
+       Q_UNUSED(event)
+       QPainter paint(this);
+       paint.setOpacity(0.3);
+       paint.drawPixmap(-ax, -ay, background->pixmap());
+}
+
+/**
+ * Check and save size of the widget. Determine the size of the square.
+ * @param size Size to calculate square.
+ */
+void FFDPad::calculateSize(QSize size)
+{
+       if(size.height() <= 0 || size.width() <= 0)
+       {
+               this->size_ = QSize(DEFAULT_SIZE, DEFAULT_SIZE);
+       }
+       else
+       {
+               if(size.width() > size.height())
+               {
+                       this->size_ = QSize(size.height(),size.height());
+               }
+               else
+               {
+                       this->size_ = QSize(size.width(),size.width());
+               }
+       }
+       update();
+}
+
+/**
+ \fn void FFDPad::clicked(int type)
+
+ This signal is emitted when the one of four buttons will be released.
+ */