added all files
[ffqwlibrary] / libffqw-1.0 / sources / ffabstractcombobox.cpp
diff --git a/libffqw-1.0/sources/ffabstractcombobox.cpp b/libffqw-1.0/sources/ffabstractcombobox.cpp
new file mode 100644 (file)
index 0000000..f2c35a7
--- /dev/null
@@ -0,0 +1,372 @@
+/*
+         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 ffabstractcombobox.cpp
+ * @brief Implementation of the FFAbstractComboBox and FFComboPopUp class.
+ *
+ * @author  ComArch S.A.
+ * @date 2009.10.09
+ * @version 1.0
+ *
+ * This widget has activator(to open popup window) and popup window(to select item)
+ * FFAbstractComboBox and FFComboPopUp are friend classes in both directions
+ */
+
+#include "ffabstractcombobox.h"
+
+/**
+ * Rounds argument up.
+ * @param var is an argument to round up
+ * @return value of rounded up argument
+ */
+
+float roundUp(float var)
+{
+       if(0 > ((int)var - var  ))
+       {
+               return (int)var + 1;
+       }
+       else
+       {
+               return (int)var;
+       }
+}
+
+/**
+ * Constructs a FFAbstractButton with a parent.
+ * Sets variable to initial values.
+ */
+FFAbstractComboBox::FFAbstractComboBox(FFAbstractButton* activator, QWidget* parent):
+       QWidget(parent)
+{
+       cols_ = 1;
+
+       //sets activator
+       activator_ = activator;
+       activator_->setObjectName("Activator");
+
+       //sets layout of combobx
+       mainLayout = new QGridLayout();
+       mainLayout->setMargin(0);
+       mainLayout->setSpacing(0);
+       mainLayout->addWidget(activator_);
+       setLayout(mainLayout);
+
+       //sets popup
+       popUp = new FFComboPopUp(this);
+       popUp->setWindowFlags(Qt::SplashScreen);
+       popUp->setGeometry(QApplication::desktop()->geometry());
+       popUp->hide();
+       popUp->setWindowModality(Qt::WindowModal);
+
+       setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
+
+       //connects
+       connect(activator_, SIGNAL(clicked()), popUp, SLOT(exec()));
+       connect(this, SIGNAL(reset()),popUp,SLOT(recreatePopUp()));
+       connect(this, SIGNAL(itemsChanged(FFAbstractButton*)),popUp,SLOT(registerNewItem(FFAbstractButton*)));
+}
+/**
+ * A virtual destructor of  FFAbstractButton.
+ */
+FFAbstractComboBox::~FFAbstractComboBox()
+{
+       ;
+}
+
+/**
+ * Removes item from combobox
+ * @param index is a index of item
+ */
+void FFAbstractComboBox::removeItem(int index)
+{
+       if(items_.size()>index)
+       {
+               disconnect(items_.at(index));
+               delete items_.takeAt(index);
+       }
+       emit reset();
+}
+/**
+ * Calls setActivatorSpecs and emits signals activated(QVariant),activated(int)
+ * @param index is a index of item
+ */
+void FFAbstractComboBox::setCurrentItem(int index)
+{
+       if(items_.size()>index)
+       {
+               setActivatorSpecs(items_.at(index));
+               if(!signalsBlocked())
+               {
+                       emit activated(activatorSpecs());
+                       emit activated(index);
+               }
+       }
+}
+/**
+ * Returns pointer to activator
+ */
+FFAbstractButton* FFAbstractComboBox::activator()
+{
+       return activator_;
+}
+/**
+ * Returns number of columns
+ */
+int FFAbstractComboBox::cols()
+{
+       return cols_;
+}
+/**
+ * Returns list of items
+ */
+QList<FFAbstractButton*> FFAbstractComboBox::items()
+{
+       return items_;
+}
+/**
+ * Returns popup's layout spacing
+ */
+int FFAbstractComboBox::spacing()
+{
+       return popUp->scrollAreaLayout->spacing();
+}
+/**
+ * Sets columns number
+ * @param cols a number of columns
+ */
+void FFAbstractComboBox::setCols(int cols)
+{
+       cols_ = cols;
+       emit reset();
+}
+/**
+ * Sets popup's layout spacing
+ * @param spacing a size of spacing
+ */
+void FFAbstractComboBox::setSpacing(int spacing)
+{
+       popUp->scrollAreaLayout->setSpacing(spacing);
+       emit reset();
+}
+/**
+ * Adds item to combobox
+ * @param item a pointer to adding item
+ * @param autoRecreate defines if layout should be recreated automatically
+ */
+void FFAbstractComboBox::insertItem(FFAbstractButton* item, bool autoRecreate)
+{
+       items_.append(item);
+       emit itemsChanged(item);
+
+       if(autoRecreate)
+       {
+               emit reset();
+       }
+}
+
+/**
+ * Constructs a FFComboPopUp with a parent.
+ * Sets variable to initial values.
+ */
+FFComboPopUp::FFComboPopUp(QWidget* parent) : QDialog(parent)
+{
+
+       parentCB = dynamic_cast<FFAbstractComboBox*>(parent);
+       //sets popup window's layout
+       popUpLayout = new QGridLayout();
+       popUpLayout->setMargin(0);
+       popUpLayout->setSpacing(0);
+
+       //sets scrollarea and scrollarea's widget
+       scrollArea = new FFScrollArea();
+       scrollArea->setWidgetResizable(true);
+
+       popUpLayout->addWidget(scrollArea,0,0);
+       setLayout(popUpLayout);
+
+       scrollAreaLayout = new QGridLayout();
+       scrollAreaLayout->setSpacing(5);
+       scrollAreaLayout->setMargin(0);
+
+       scrollAreaWidget = new QWidget();
+       scrollAreaWidget->setStyleSheet("background-color:black;");
+
+       scrollAreaWidget->setLayout(scrollAreaLayout);
+       scrollArea->setWidget(scrollAreaWidget);
+
+       //sets back button
+       backButton = new FFAbstractButton;
+       backButton->setMargins(0,0,5,5);
+       backButton->setIconAlignment(Qt::AlignRight);
+       backButton->setIcon(QIcon(QPixmap(":/standard/combo_colorarrow.svg")));
+       scrollAreaLayout->addWidget(backButton,0,0,1,parentCB->cols_);
+
+       //connect
+       connect(backButton,SIGNAL(clicked()),this,SLOT(reject()));
+}
+/**
+ * Serves show event. Override method from mother class.
+ */
+void FFComboPopUp::showEvent(QShowEvent* event)
+{
+       // The calculation of the size of the window so that it occupied little space as possible.
+
+       int itemsHeight = 0;
+
+       // for each row
+       for(int i=0; i<roundUp((float)parentCB->items_.size()/(float)parentCB->cols_); ++i)
+       {
+               // height of an element
+               itemsHeight += parentCB->items_.at(i)->minimumHeight();
+
+               //height of an spacing
+               itemsHeight += scrollAreaLayout->spacing();
+       }
+       itemsHeight += backButton->minimumHeight();
+
+       if(itemsHeight > QApplication::desktop()->geometry().height())
+         itemsHeight = QApplication::desktop()->geometry().height();
+
+       setGeometry(0,0,QApplication::desktop()->geometry().width(),itemsHeight);
+
+       QDialog::showEvent(event);
+
+}
+/**
+ * Refreshes popup layout at view event
+ */
+void FFComboPopUp::recreatePopUp()
+{
+       // Deleting old objects
+       QLayoutItem *child;
+       while((child = scrollAreaLayout->takeAt(0)) != 0)
+       {
+               delete child;
+       }
+
+       // Arranging objects on the popup
+       scrollAreaLayout->addWidget(backButton,0,0,1,parentCB->cols_);
+       for(int i=0, cols=0, rows=1; i<parentCB->items_.size();++i,++cols)
+       {
+               if(cols==parentCB->cols_)
+               {
+                       ++rows;
+               }
+               cols%=parentCB->cols_;
+               scrollAreaLayout->addWidget(parentCB->items_.at(i),rows,cols);
+       }
+
+       // Force refresh FFScrollArea (this line exist because FFScrollArea have a little imperfection - event filter problem)
+       scrollArea->setWidget(scrollAreaWidget);
+}
+/**
+ * Connects new item signal clicked to actual widget's slot accept
+ */
+void FFComboPopUp::registerNewItem(FFAbstractButton* newItem)
+{
+       connect(newItem,SIGNAL(clicked()),this,SLOT(accept()));
+}
+/**
+ * Calls setCurrentItem with widget index
+ */
+void FFComboPopUp::accept()
+{
+       parentCB->setCurrentItem(scrollAreaLayout->indexOf(dynamic_cast<QWidget*>(sender()))-1);
+       QDialog::accept();
+}
+
+/**
+ \fn void FFAbstractComboBox::reset()
+ *This signal is emitted when is necessary to refresh layout of popup window.
+ */
+
+/**
+ \fn void FFAbstractComboBox::activated(QVariant spec)
+ *This signal is emitted when option on combobox was chosen.
+ *@param spec contains specific chosen value
+ */
+
+/**
+ \fn void FFAbstractComboBox::activated(int index)
+ *This signal is emitted when option on combobox was chosen.
+ *@param index contains index of chosen item
+ */
+
+
+/**
+ \fn void FFComboPopUp::selected(FFAbstractButton* selectedButton)
+ *This signal is emitted when item was selected
+ *@param selectedButton pointer to selected item
+ */