added all files
[ffqwlibrary] / libffqw-1.0 / sources / ffscrollingcheckbox.cpp
diff --git a/libffqw-1.0/sources/ffscrollingcheckbox.cpp b/libffqw-1.0/sources/ffscrollingcheckbox.cpp
new file mode 100644 (file)
index 0000000..1a2e325
--- /dev/null
@@ -0,0 +1,318 @@
+/*
+         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 ffscrollingcheckbox.cpp
+ * @brief Implementation of the FFScrollingCheckBox class.
+ *
+ * @author ComArch S.A.
+ * @date 2009.08.03
+ * @version 1.0
+ */
+
+#include "ffscrollingcheckbox.h"
+
+
+/*Static FFViewCaches -improve performance*/
+FFViewCache* FFScrollingCheckBox::stateTrue = NULL;
+FFViewCache* FFScrollingCheckBox::stateFalse = NULL;
+/**
+ * Constructs a FFScrollingCheckBox with a parent.
+ * Sets variable to initial values and set graphics used in widget.
+ */
+FFScrollingCheckBox::FFScrollingCheckBox(QWidget* parent) :
+       FFScrollingButton(parent)
+{
+       path = SCROLLINGCHECKBOX_PATH;
+       init();
+}
+/**
+ * Constructs a FFScrollingCheckBox with a parent and new path to
+ * False/Normal Graphics.
+ * Set variable to initial values and set graphics used in widget.
+ */
+FFScrollingCheckBox::FFScrollingCheckBox(const QString& path, QWidget* parent ) :
+       FFScrollingButton(parent)
+{
+       this->path = path;
+       init();
+}
+
+/**
+ * A virtual destructor.
+ */
+FFScrollingCheckBox::~FFScrollingCheckBox()
+{
+       ;
+}
+
+/**
+ * Repaint the view of checkbox button. Overrides the virtual method from QWidget.
+ * @param event Contains all informations about event.
+ */
+void FFScrollingCheckBox::paintEvent(QPaintEvent* event)
+{
+       //calls parental paint event
+       FFAbstractButton::paintEvent(event);
+
+       //sets values for drawing
+       int x=0,y=0;
+       if(width() > height())
+       {
+               x = leftMargin() + indent();
+               y = topMargin() ;
+       }
+       else
+       {
+               x = leftMargin() + indent();
+               y = topMargin() ;
+       }
+
+       QPainter painter;
+       painter.begin(this);
+
+       //draws image.
+       if( isChecked())
+       {
+               painter.drawPixmap(x,y,stateTrue->pixmap());
+       }
+       else
+       {
+               painter.drawPixmap(x,y,stateFalse->pixmap());
+       }
+       painter.end();
+}
+
+/**
+ * Updates button`s view after changing size of the widget.
+ * Update size of all pixmap which need it (without corners)
+ * @param event Contains all informations about event.
+ */
+void FFScrollingCheckBox::resizeEvent(QResizeEvent* event)
+{
+       FFAbstractButton::resizeEvent(event);
+       calculateRatio();
+       updateView();
+}
+
+/**
+ * Support mouse press event.
+ * @param event Contains all informations about event.
+ */
+void FFScrollingCheckBox::mousePressEvent(QMouseEvent* event)
+{
+       FFScrollingButton::mousePressEvent(event);
+}
+
+/**
+ * Support mouse release event.
+ * @param event Contains all informations about event.
+ */
+void FFScrollingCheckBox::mouseReleaseEvent(QMouseEvent* event)
+{
+       if(isClicked_)
+       {
+               if(!signalsBlocked())
+               {
+                       toggle();
+               }
+       }
+       FFScrollingButton::mouseReleaseEvent(event);
+}
+/**
+ * Paints icon if it was set.
+ * @param painter is a tool to paint icon on widget.
+ */
+void FFScrollingCheckBox::paintIcon(QPainter* painter)
+{
+       // if icon was set paint it
+       if (!icon().isNull())
+       {
+               QRect rect(0+leftMargin() + qMin(width() - leftMargin() - rightMargin(),
+                                                height() - topMargin() - bottomMargin()),
+                          0+topMargin(),
+                          geometry().width()-rightMargin()-leftMargin(),
+                          geometry().height()-bottomMargin()-topMargin());
+
+               //paint icon in button center
+               icon().paint(painter,rect,iconAlignment(),QIcon::Normal, QIcon::Off);
+       }
+}
+/**
+ * Returns text icon space.
+ */
+int FFScrollingCheckBox::textIconSpace()
+{
+       return textIconSpace_;
+}
+
+/**
+ * Initiates an object of FFScrollingCheckBox. Sets all needed fields.
+ */
+void FFScrollingCheckBox::init()
+{
+
+
+       setCheckable(true);
+       setChecked(false);
+       textIconSpace_ = DEFAULT_TEXTICON_SPACE;
+
+       if(NULL == stateFalse)
+       {
+               stateFalse = new FFViewCache;
+               stateFalse->init(path + "_false.svg");
+               stateFalse->updateView(stateFalse->defaultSize());
+       }
+
+       if(NULL == stateTrue)
+       {
+
+               stateTrue = new FFViewCache;
+               stateTrue->init(path + "_true.svg");
+               stateTrue->updateView(stateTrue->defaultSize());
+       }
+       setTitleIndent(0);
+       setDescriptionIndent(0);
+       setMinimumWidth(minimumHeight() + leftMargin() + rightMargin() +  indent());
+       setMargins(0,0,0,0);
+}
+
+/**
+ * Sets text icon space
+ */
+void FFScrollingCheckBox::setTextIconSpace(int textIconSpace)
+{
+       textIconSpace_=textIconSpace;
+}
+/**
+ * Updates button's view parameters
+ */
+void FFScrollingCheckBox::updateView()
+{
+       int margins = topMargin() + bottomMargin() + hSpacing();
+       int checkboxEdge = qMin(width() - leftMargin() - rightMargin(),
+                               height() - topMargin() - bottomMargin());
+       QSize size= QSize(0,0);
+       if(width() > height())
+       {
+               titleWidget()->setVisible(true);
+               descriptionWidget()->setVisible(true);
+               //sets button's labels geometry
+               titleWidget()->setGeometry(vSpacing() + checkboxEdge + leftMargin() + iconSpace + textIconSpace_
+                               + titleIndent() + indent(),
+                               topMargin(),
+                               width() - leftMargin() - rightMargin() - titleIndent() - checkboxEdge - hSpacing() - iconSpace - textIconSpace_ - indent(),
+                               (height() - margins) * tRatio);
+
+               descriptionWidget()->setGeometry(vSpacing() + checkboxEdge + leftMargin() + descriptionIndent() + iconSpace + textIconSpace_ + indent(),
+                                                topMargin() + titleWidget()->size().height() + hSpacing(),
+                                                width() - checkboxEdge - leftMargin() - descriptionIndent() - rightMargin() - hSpacing() - iconSpace - textIconSpace_ - indent(),
+                                                (height() - margins) * (dRatio));
+               size = QSize(checkboxEdge, checkboxEdge);
+       }
+       else
+       {
+               size = QSize(width()-(leftMargin() + rightMargin() + 2* indent()),checkboxEdge-(topMargin()+bottomMargin()));
+       }
+
+       if(minimumSize().width() >= width() )
+       {
+               titleWidget()->setVisible(false);
+               descriptionWidget()->setVisible(false);
+       }
+
+       stateFalse->updateView(size);
+       stateTrue->updateView(size);
+
+       update();
+
+       //calls update view from parent
+       FFAbstractButton::updateView();
+}
+/**
+ * Sets icon alignment
+ * @param iconAlignment contains new alignemnt for icon
+ */
+void FFScrollingCheckBox::setIconAlignment(Qt::Alignment iconAlignment)
+{
+       //Sets only possible alignment options
+       switch(iconAlignment)
+       {
+               case  Qt::AlignLeft:
+                       FFAbstractButton::setIconAlignment(iconAlignment);
+                       break;
+               default:
+                       qDebug() << "You can only use Qt::AlignLeft or Qt::AlignRight";
+                       break;
+       }
+}