[neon/backports-jammy/kcolorpicker] /: New upstream version 0.1.1

Boyuan Yang null at kde.org
Tue Jan 16 14:07:27 GMT 2024


Git commit 1ad22e9f885f3daf307dd53af353f81c71232a7d by Boyuan Yang.
Committed on 29/03/2020 at 16:11.
Pushed by jriddell into branch 'master'.

New upstream version 0.1.1

A  +4    -0    .github/FUNDING.yml
A  +71   -0    .gitignore
A  +28   -0    .travis.yml
A  +109  -0    CMakeLists.txt
A  +339  -0    LICENSE
A  +36   -0    README.md
A  +22   -0    cmake/cmake_uninstall.cmake.in
A  +9    -0    cmake/kColorPickerConfig.cmake.in
A  +3    -0    example/CMakeLists.txt
A  +40   -0    example/main.cpp     [License: LGPL (v2+)]
A  +-    --    icons/ellipsis.64.png
A  +6    -0    icons/kColorPicker_icons.qrc
A  +62   -0    include/kColorPicker/KColorPicker.h     [License: LGPL (v2+)]
A  +35   -0    include/kColorPicker/KColorPickerExport.h     [License: LGPL (v2+)]
A  +11   -0    src/CMakeLists.txt
A  +36   -0    src/IconCreator.cpp     [License: LGPL (v2+)]
A  +39   -0    src/IconCreator.h     [License: LGPL (v2+)]
A  +130  -0    src/KColorPicker.cpp     [License: LGPL (v2+)]
A  +130  -0    src/PopupMenu.cpp     [License: LGPL (v2+)]
A  +64   -0    src/PopupMenu.h     [License: LGPL (v2+)]
A  +59   -0    src/buttons/AbstractPopupMenuButton.cpp     [License: LGPL (v2+)]
A  +47   -0    src/buttons/AbstractPopupMenuButton.h     [License: LGPL (v2+)]
A  +40   -0    src/buttons/ColorButton.cpp     [License: LGPL (v2+)]
A  +43   -0    src/buttons/ColorButton.h     [License: LGPL (v2+)]
A  +35   -0    src/buttons/ColorDialogButton.cpp     [License: LGPL (v2+)]
A  +42   -0    src/buttons/ColorDialogButton.h     [License: LGPL (v2+)]
A  +14   -0    tests/CMakeLists.txt
A  +36   -0    tests/buttons/ColorButtonTest.cpp     [License: LGPL (v2+)]
A  +37   -0    tests/buttons/ColorButtonTest.h     [License: LGPL (v2+)]

https://invent.kde.org/neon/backports-jammy/kcolorpicker/-/commit/1ad22e9f885f3daf307dd53af353f81c71232a7d

diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..c54cb46
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,4 @@
+# These are supported funding model platforms
+
+github: [DamirPorobic]
+custom: paypal.me/damirporobic
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3b78c6a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,71 @@
+# C++ objects and libs
+*.slo
+*.lo
+*.o
+*.a
+*.la
+*.lai
+*.so
+*.dll
+*.dylib
+
+# Qt-es
+/.qmake.cache
+/.qmake.stash
+*.pro.user
+*.pro.user.*
+*.qbs.user
+*.qbs.user.*
+*.moc
+moc_*.cpp
+qrc_*.cpp
+ui_*.h
+Makefile*
+*build-*
+
+# QtCreator
+*.autosave
+
+# QtCtreator Qml
+*.qmlproject.user
+*.qmlproject.user.*
+
+# QtCtreator CMake
+CMakeLists.txt.user
+
+
+# kdevelop
+apidocs
+.kdev4
+build
+*~
+*.kdev4
+*.bak
+*.orig
+*.rej
+doxygen.log
+Doxyfile
+*.kdevelop
+*.kdevelop.filelist
+*.kdevelop.pcs
+*.kdevses
+.*kate-swp
+build/
+mem.log.*
+massif.*
+callgrind.*
+perf.data*
+
+# from kdiff3
+*.BACKUP.*
+*.BASE.*
+*.LOCAL.*
+*.REMOTE.*
+
+# visual studio code
+*.vscode/
+*.vs
+
+# clion
+*.idea
+*.idea/
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..4e1711c
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,28 @@
+language: cpp
+compiler: gcc
+sudo: required
+dist: trusty
+
+before_install:
+- sudo add-apt-repository ppa:beineri/opt-qt562-trusty -y
+- sudo apt-get update -qq
+
+install:
+- sudo apt-get -y install qt56base
+- source /opt/qt*/bin/qt*-env.sh
+
+jobs:
+  include:
+  - stage: build
+    script:
+    - mkdir build
+    - cd build
+    - cmake ..
+    - make VERBOSE=1
+  - stage: test
+    script:
+    - mkdir build
+    - cd build
+    - cmake .. -DBUILD_TESTS=ON
+    - make
+    - xvfb-run make test CTEST_OUTPUT_ON_FAILURE=1
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..90db463
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,109 @@
+cmake_minimum_required(VERSION 3.5)
+project(kColorPicker LANGUAGES CXX VERSION 0.1.1)
+
+set(QT_MIN_VERSION "5.6.1")
+
+set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_EXTENSIONS OFF)
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+
+option(BUILD_TESTS "Build Unit Tests" OFF)
+option(BUILD_EXAMPLE "Build Example Application" ON)
+
+find_package(Qt5 ${QT_MIN_VERSION} REQUIRED Widgets Test)
+
+include(GNUInstallDirs)
+include(FeatureSummary)
+
+add_subdirectory(src)
+
+if (BUILD_EXAMPLE)
+    add_subdirectory(example)
+endif (BUILD_EXAMPLE)
+
+if (BUILD_TESTS)
+    enable_testing()
+    add_subdirectory(tests)
+endif (BUILD_TESTS)
+
+include(CMakePackageConfigHelpers)
+
+add_library(kColorPicker
+			${KCOLORPICKER_SRCS}
+			${CMAKE_CURRENT_SOURCE_DIR}/include/kColorPicker/KColorPicker.h
+			${CMAKE_CURRENT_SOURCE_DIR}/icons/kColorPicker_icons.qrc
+			)
+
+add_library(kColorPicker::kColorPicker ALIAS kColorPicker)
+
+target_include_directories(kColorPicker
+						   PUBLIC
+						   $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+						   $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
+						   $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
+						   )
+
+target_link_libraries(kColorPicker PUBLIC Qt5::Widgets)
+
+target_compile_definitions(kColorPicker PRIVATE KIMAGEANNOTATOR_LIB)
+
+set_target_properties(kColorPicker
+					  PROPERTIES
+					  ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib
+					  LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib
+					  RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin
+					  SOVERSION ${PROJECT_VERSION}
+					  )
+
+install(TARGETS kColorPicker
+		EXPORT kColorPicker-targets
+		ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+		LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+		RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+		)
+
+install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/kColorPicker
+		DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+		)
+
+configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/kColorPickerConfig.cmake.in
+                              ${CMAKE_CURRENT_BINARY_DIR}/cmake/kColorPickerConfig.cmake
+                              INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/kColorPicker
+                              )
+
+write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/cmake/kColorPickerConfig-version.cmake
+                                 VERSION ${PROJECT_VERSION}
+                                 COMPATIBILITY AnyNewerVersion
+                                 )
+
+install(FILES
+        ${CMAKE_CURRENT_BINARY_DIR}/cmake/kColorPickerConfig.cmake
+        ${CMAKE_CURRENT_BINARY_DIR}/cmake/kColorPickerConfig-version.cmake
+        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/kColorPicker
+        )
+
+
+export(EXPORT kColorPicker-targets
+       FILE ${CMAKE_CURRENT_BINARY_DIR}/cmake/kColorPicker-targets.cmake
+       NAMESPACE kColorPicker::
+       )
+
+install(EXPORT kColorPicker-targets
+        FILE kColorPicker-targets.cmake
+        NAMESPACE kColorPicker::
+        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/kColorPicker
+        )
+        
+# uninstall target
+if(NOT TARGET uninstall)
+    configure_file(
+        "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
+        "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
+        IMMEDIATE @ONLY)
+
+    add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
+endif()
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..23cb790
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
+ 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.
+
+                    GNU GENERAL PUBLIC LICENSE
+   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.
+
+    {description}
+    Copyright (C) {year}  {fullname}
+
+    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/README.md b/README.md
new file mode 100644
index 0000000..b8b0c8e
--- /dev/null
+++ b/README.md
@@ -0,0 +1,36 @@
+# kColorPicker [![Build Status](https://travis-ci.org/ksnip/kColorPicker.svg?branch=master)](https://travis-ci.org/ksnip/kColorPicker)
+QToolButton with color popup menu with lets you select a color. The popup features a color dialog button which can be used to add custom colors to the popup menu.
+
+Version 0.1.1
+
+![kColorPicker](https://i.imgur.com/VkhUvFa.png "kColorPicker")
+
+### Building from source
+1. Get latest release from GitHub by cloning the repo:  
+    `$ git clone https://github.com/ksnip/kColorPicker`
+2. Change to repo directory:  
+    `$ cd kColorPicker`  
+3. Make new build directory and enter it:  
+    `$ mkdir build && cd build`  
+4. Create the makefile and build the project:  
+    `$ cmake .. && make`  
+5. Install shared library (not required when only using the example):  
+    `$ sudo make install`  
+6. Run the example application:  
+    `$ ./example/kColorPicker-example`  
+
+
+### Shared vs Static
+You can either build the project as shared library by providing the flag `-DBUILD_SHARED_LIBS=ON`
+to cmake or `-DBUILD_SHARED_LIBS=OFF` to build as static library. On Windows we currently can
+only build as static library.
+
+
+### Integrate library in project
+
+1. Let cmake find the shared library, optionally with version  
+    `set(KCOLORPICKER_MIN_VERSION "0.x.x")`  
+    `find_package(kColorPicker ${KCOLORPICKER_MIN_VERSION} REQUIRED)`  
+
+2. Link the library with your application  
+    `target_link_libraries(myApp kColorPicker)`  
diff --git a/cmake/cmake_uninstall.cmake.in b/cmake/cmake_uninstall.cmake.in
new file mode 100644
index 0000000..2b0d97c
--- /dev/null
+++ b/cmake/cmake_uninstall.cmake.in
@@ -0,0 +1,22 @@
+if(NOT EXISTS "@CMAKE_BINARY_DIR@/install_manifest.txt")
+  message(FATAL_ERROR "Cannot find install manifest: @CMAKE_BINARY_DIR@/install_manifest.txt")
+endif(NOT EXISTS "@CMAKE_BINARY_DIR@/install_manifest.txt")
+
+file(READ "@CMAKE_BINARY_DIR@/install_manifest.txt" files)
+string(REGEX REPLACE "\n" ";" files "${files}")
+foreach(file ${files})
+  message(STATUS "Uninstalling $ENV{DESTDIR}${file}")
+  if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
+    exec_program(
+      "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
+      OUTPUT_VARIABLE rm_out
+      RETURN_VALUE rm_retval
+      )
+    if(NOT "${rm_retval}" STREQUAL 0)
+      message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}")
+    endif(NOT "${rm_retval}" STREQUAL 0)
+  else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
+    message(STATUS "File $ENV{DESTDIR}${file} does not exist.")
+  endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
+endforeach(file)
+ 
diff --git a/cmake/kColorPickerConfig.cmake.in b/cmake/kColorPickerConfig.cmake.in
new file mode 100644
index 0000000..30037e3
--- /dev/null
+++ b/cmake/kColorPickerConfig.cmake.in
@@ -0,0 +1,9 @@
+include(CMakeFindDependencyMacro)
+
+ at PACKAGE_INIT@
+
+find_dependency(Qt5 @QT_MIN_VERSION@ COMPONENTS Widgets)
+
+if(NOT TARGET kColorPicker::kColorPicker)
+  include("${CMAKE_CURRENT_LIST_DIR}/kColorPicker-targets.cmake")
+endif()
\ No newline at end of file
diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt
new file mode 100644
index 0000000..ef8a50b
--- /dev/null
+++ b/example/CMakeLists.txt
@@ -0,0 +1,3 @@
+add_executable(kColorPicker-example main.cpp)
+
+target_link_libraries(kColorPicker-example kColorPicker)
\ No newline at end of file
diff --git a/example/main.cpp b/example/main.cpp
new file mode 100644
index 0000000..2d42bb4
--- /dev/null
+++ b/example/main.cpp
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2018 Damir Porobic <damir.porobic at gmx.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser 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 <QApplication>
+#include <QVBoxLayout>
+#include <kColorPicker/KColorPicker.h>
+
+using kColorPicker::KColorPicker;
+
+int main(int argc, char **argv)
+{
+    QApplication app(argc, argv);
+    auto widget = new QWidget();
+    widget->setFixedWidth(200);
+    widget->setFixedHeight(200);
+    auto layout = new QVBoxLayout();
+    auto colorPicker = new KColorPicker();
+    colorPicker->setColor(QColor(Qt::red));
+    layout->addWidget(colorPicker);
+    widget->setLayout(layout);
+    widget->show();
+
+    return app.exec();
+}
\ No newline at end of file
diff --git a/icons/ellipsis.64.png b/icons/ellipsis.64.png
new file mode 100644
index 0000000..4ae87b9
Binary files /dev/null and b/icons/ellipsis.64.png differ
diff --git a/icons/kColorPicker_icons.qrc b/icons/kColorPicker_icons.qrc
new file mode 100644
index 0000000..30d2426
--- /dev/null
+++ b/icons/kColorPicker_icons.qrc
@@ -0,0 +1,6 @@
+<!DOCTYPE RCC>
+<RCC version="1.0">
+    <qresource prefix="/icons">
+        <file alias="ellipsis">ellipsis.64.png</file>
+    </qresource>
+</RCC>
diff --git a/include/kColorPicker/KColorPicker.h b/include/kColorPicker/KColorPicker.h
new file mode 100644
index 0000000..c0b1be2
--- /dev/null
+++ b/include/kColorPicker/KColorPicker.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2018 Damir Porobic <damir.porobic at gmx.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser 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 KCOLORPICKER_KCOLORPICKER_H
+#define KCOLORPICKER_KCOLORPICKER_H
+
+#include <QToolButton>
+#include <QColor>
+#include <QList>
+
+#include <kColorPicker/KColorPickerExport.h>
+
+namespace kColorPicker {
+
+class KColorPickerPrivate;
+
+class KCOLORPICKER_EXPORT KColorPicker : public QToolButton
+{
+Q_OBJECT
+
+	Q_DECLARE_PRIVATE(KColorPicker)
+
+public:
+	explicit KColorPicker();
+	~KColorPicker() override;
+	void setFixedSize(const QSize &size);
+	void setFixedSize(int width, int height);
+	QColor color() const;
+
+public slots:
+	void setColor(const QColor &color);
+
+signals:
+	void colorChanged(const QColor &color) const;
+
+private:
+	QScopedPointer<KColorPickerPrivate> const d_ptr;
+
+private slots:
+	void setColorIcon(const QColor &color);
+	void setIconSize(const QSize &size);
+	void colorSelected(const QColor &color);
+};
+
+}
+#endif //KCOLORPICKER_KCOLORPICKER_H
diff --git a/include/kColorPicker/KColorPickerExport.h b/include/kColorPicker/KColorPickerExport.h
new file mode 100644
index 0000000..601b379
--- /dev/null
+++ b/include/kColorPicker/KColorPickerExport.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2018 Damir Porobic <damir.porobic at gmx.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser 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 KCOLORPICKER_KCOLORPICKEREXPORT_H
+#define KCOLORPICKER_KCOLORPICKEREXPORT_H
+
+#include <QtCore/qglobal.h>
+
+#if defined(_WIN32)
+	#   define KCOLORPICKER_EXPORT
+#else 
+	#if defined(KCOLORPICKER_LIB)
+	#   define KCOLORPICKER_EXPORT Q_DECL_EXPORT
+	#else
+	#   define KCOLORPICKER_EXPORT Q_DECL_IMPORT
+	#endif
+#endif
+
+#endif //KCOLORPICKER_KCOLORPICKEREXPORT_H
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000..6650eeb
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,11 @@
+set(KCOLORPICKER_SRCS
+        ${CMAKE_CURRENT_SOURCE_DIR}/KColorPicker.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/PopupMenu.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/IconCreator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/buttons/AbstractPopupMenuButton.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/buttons/ColorButton.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/buttons/ColorDialogButton.cpp
+        )
+
+set(KCOLORPICKER_SRCS ${KCOLORPICKER_SRCS} PARENT_SCOPE)
+
diff --git a/src/IconCreator.cpp b/src/IconCreator.cpp
new file mode 100644
index 0000000..06a0cdd
--- /dev/null
+++ b/src/IconCreator.cpp
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2018 Damir Porobic <damir.porobic at gmx.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser 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 "IconCreator.h"
+
+namespace kColorPicker {
+
+QIcon IconCreator::createIcon(const QColor &color, const QSize &size)
+{
+    QPixmap pixmap(size);
+    pixmap.fill(color);
+    QPainter painter(&pixmap);
+    auto penWidth = painter.pen().width();
+    painter.setPen(QColor(Qt::gray));
+    painter.drawRect(0, 0, size.width() - penWidth, size.height() - penWidth);
+
+    return QIcon(pixmap);
+}
+
+} // namespace kColorPicker
\ No newline at end of file
diff --git a/src/IconCreator.h b/src/IconCreator.h
new file mode 100644
index 0000000..3e1d077
--- /dev/null
+++ b/src/IconCreator.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2018 Damir Porobic <damir.porobic at gmx.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser 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 KCOLORPICKER_ICONCREATOR_H
+#define KCOLORPICKER_ICONCREATOR_H
+
+#include <QIcon>
+#include <QColor>
+#include <QPainter>
+
+namespace kColorPicker {
+
+class IconCreator
+{
+public:
+	explicit IconCreator() = delete;
+	~IconCreator() = delete;
+	static QIcon createIcon(const QColor &color, const QSize &size);
+};
+
+} // namespace kColorPicker
+
+#endif //KCOLORPICKER_ICONCREATOR_H
diff --git a/src/KColorPicker.cpp b/src/KColorPicker.cpp
new file mode 100644
index 0000000..1ee1b5d
--- /dev/null
+++ b/src/KColorPicker.cpp
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2018 Damir Porobic <damir.porobic at gmx.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser 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 <kColorPicker/KColorPicker.h>
+
+#include "IconCreator.h"
+#include "PopupMenu.h"
+
+inline void initResource()
+{
+	Q_INIT_RESOURCE(kColorPicker_icons);
+}
+
+namespace kColorPicker {
+
+class KColorPickerPrivate
+{
+	Q_DISABLE_COPY(KColorPickerPrivate)
+
+	Q_DECLARE_PUBLIC(KColorPicker)
+
+	explicit KColorPickerPrivate(KColorPicker *kColorPicker);
+
+	KColorPicker *const q_ptr;
+	QSize mIconSize;
+	PopupMenu mPopupMenu;
+	QColor mSelectedColor;
+};
+
+KColorPicker::KColorPicker() : d_ptr(new KColorPickerPrivate(this))
+{}
+
+KColorPicker::~KColorPicker()
+{}
+
+void KColorPicker::setColor(const QColor &color)
+{
+	Q_D(KColorPicker);
+	d->mSelectedColor = color;
+	setColorIcon(color);
+	d->mPopupMenu.selectColor(color);
+}
+
+void KColorPicker::colorSelected(const QColor &color)
+{
+	Q_D(KColorPicker);
+	d->mSelectedColor = color;
+	setColorIcon(color);
+	emit colorChanged(color);
+}
+
+void KColorPicker::setFixedSize(const QSize &size)
+{
+	Q_D(const KColorPicker);
+	QToolButton::setFixedSize(size);
+	setIconSize(size);
+	setColorIcon(d->mSelectedColor);
+}
+
+void KColorPicker::setFixedSize(int width, int height)
+{
+	Q_D(const KColorPicker);
+	QToolButton::setFixedSize(width, height);
+	setIconSize(QSize(width, height));
+	setColorIcon(d->mSelectedColor);
+}
+
+QColor KColorPicker::color() const
+{
+	Q_D(const KColorPicker);
+	return d->mSelectedColor;
+}
+
+void KColorPicker::setIconSize(const QSize &size)
+{
+	Q_D(KColorPicker);
+	auto scaleFactor = 0.6;
+	d->mIconSize = size * scaleFactor;
+	QToolButton::setIconSize(d->mIconSize);
+}
+
+void KColorPicker::setColorIcon(const QColor &color)
+{
+	Q_D(KColorPicker);
+	auto icon = IconCreator::createIcon(color, d->mIconSize);
+	setIcon(icon);
+}
+
+//
+// KColorPickerPrivate
+//
+
+KColorPickerPrivate::KColorPickerPrivate(KColorPicker *kColorPicker) : q_ptr(kColorPicker)
+{
+	initResource();
+
+	mIconSize = QSize(25, 25);
+	kColorPicker->setPopupMode(QToolButton::InstantPopup);
+	kColorPicker->setMenu(&mPopupMenu);
+	kColorPicker->connect(&mPopupMenu, &PopupMenu::colorChanged, kColorPicker, &KColorPicker::colorSelected);
+
+	// Default Colors
+	mPopupMenu.addColor(QColor(Qt::red));
+	mPopupMenu.addColor(QColor(Qt::green));
+	mPopupMenu.addColor(QColor(Qt::blue));
+	mPopupMenu.addColor(QColor(Qt::yellow));
+	mPopupMenu.addColor(QColor(Qt::magenta));
+	mPopupMenu.addColor(QColor(Qt::cyan));
+	mPopupMenu.addColor(QColor(Qt::white));
+	mPopupMenu.addColor(QColor(Qt::black));
+
+}
+
+} // namespace kColorPicker
diff --git a/src/PopupMenu.cpp b/src/PopupMenu.cpp
new file mode 100644
index 0000000..e535610
--- /dev/null
+++ b/src/PopupMenu.cpp
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2018 Damir Porobic <damir.porobic at gmx.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser 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 "PopupMenu.h"
+
+namespace kColorPicker {
+
+PopupMenu::PopupMenu()
+{
+	mButtonGroup = new QButtonGroup();
+	mLayout = new QGridLayout();
+	mLayout->setSpacing(0);
+	mLayout->setMargin(5);
+	setLayout(mLayout);
+	addColorDialogButton();
+}
+
+PopupMenu::~PopupMenu()
+{
+	delete mButtonGroup;
+	delete mColorDialogButton;
+}
+
+void PopupMenu::addColor(const QColor &color)
+{
+	if (!isColorInGrid(color)) {
+		addColorButton(color);
+	}
+}
+
+void PopupMenu::selectColor(const QColor &color)
+{
+	addColor(color);
+
+	for (auto button : mColorButtons) {
+		if (button->color() == color) {
+			button->setChecked(true);
+			return;
+		}
+	}
+}
+
+void PopupMenu::generateGrid()
+{
+	auto row = 0;
+	auto column = 0;
+
+	clearGrid();
+
+	for (auto button : mColorButtons) {
+		mLayout->addWidget(button, row, column % 4);
+		column++;
+		if (column % 4 == 0) {
+			row++;
+		}
+	}
+
+	mLayout->addWidget(mColorDialogButton, row, column % 4);
+}
+
+ColorButton *PopupMenu::createButton(const QColor &color)
+{
+	auto iconSize = getIconSize();
+	auto icon = IconCreator::createIcon(color, iconSize);
+	auto button = new ColorButton(icon, color);
+	return button;
+}
+QSize PopupMenu::getIconSize() const
+{ 	auto xScaleFactor = logicalDpiX() / 96.0;
+	auto yScaleFactor = logicalDpiY() / 96.0;
+	return {static_cast<int>(25 * xScaleFactor), static_cast<int>(25 * yScaleFactor) };
+}
+
+void PopupMenu::addColorButton(const QColor &color)
+{
+	auto button = createButton(color);
+	mButtonGroup->addButton(button);
+	mColorButtons.append(button);
+	connect(button, &AbstractPopupMenuButton::colorSelected, this, &PopupMenu::colorSelected);
+	generateGrid();
+}
+
+void PopupMenu::clearGrid()
+{
+	for (auto button : mColorButtons) {
+		mLayout->removeWidget(button);
+	}
+}
+
+bool PopupMenu::isColorInGrid(const QColor &color)
+{
+	for (auto button : mColorButtons) {
+		if (button->color() == color) {
+			return true;
+		}
+	}
+	return false;
+}
+
+void PopupMenu::colorSelected(const QColor &color)
+{
+	emit colorChanged(color);
+	selectColor(color);
+	hide();
+}
+
+void PopupMenu::addColorDialogButton()
+{
+	auto icon = QIcon(QStringLiteral(":/icons/ellipsis"));
+	mColorDialogButton = new ColorDialogButton(icon);
+	connect(mColorDialogButton, &AbstractPopupMenuButton::colorSelected, this, &PopupMenu::colorSelected);
+}
+
+} // namespace kColorPicker
\ No newline at end of file
diff --git a/src/PopupMenu.h b/src/PopupMenu.h
new file mode 100644
index 0000000..64bdb56
--- /dev/null
+++ b/src/PopupMenu.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2018 Damir Porobic <damir.porobic at gmx.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser 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 KCOLORPICKER_POPUPMENU_H
+#define KCOLORPICKER_POPUPMENU_H
+
+#include <QMenu>
+#include <QGridLayout>
+#include <QButtonGroup>
+
+#include "IconCreator.h"
+#include "buttons/ColorButton.h"
+#include "buttons/ColorDialogButton.h"
+
+namespace kColorPicker {
+
+class PopupMenu : public QMenu
+{
+Q_OBJECT
+public:
+	PopupMenu();
+	~PopupMenu() override;
+	void addColor(const QColor &color);
+	void selectColor(const QColor &color);
+
+signals:
+	void colorChanged(const QColor &color) const;
+
+private:
+	QButtonGroup *mButtonGroup;
+	QGridLayout *mLayout;
+	QList<ColorButton *> mColorButtons;
+	ColorDialogButton *mColorDialogButton;
+
+	void generateGrid();
+	ColorButton *createButton(const QColor &color);
+	void addColorButton(const QColor &color);
+	void addColorDialogButton();
+	void clearGrid();
+	bool isColorInGrid(const QColor &color);
+
+private slots:
+	void colorSelected(const QColor &color);
+	QSize getIconSize() const;
+};
+
+} // namespace kColorPicker
+#endif //KCOLORPICKER_POPUPMENU_H
diff --git a/src/buttons/AbstractPopupMenuButton.cpp b/src/buttons/AbstractPopupMenuButton.cpp
new file mode 100644
index 0000000..759c3e1
--- /dev/null
+++ b/src/buttons/AbstractPopupMenuButton.cpp
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2018 Damir Porobic <damir.porobic at gmx.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser 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 "AbstractPopupMenuButton.h"
+
+namespace kColorPicker {
+
+AbstractPopupMenuButton::AbstractPopupMenuButton(const QIcon &icon)
+{
+	setIcon(icon);
+	setFixedSize(getSizeBasedOnIcon());
+    connect(this, &QToolButton::clicked, this, &AbstractPopupMenuButton::buttonClicked);
+}
+QSize AbstractPopupMenuButton::getSizeBasedOnIcon() const
+{
+	auto xScaleFactor = logicalDpiX() / 96.0;
+	auto yScaleFactor = logicalDpiY() / 96.0;
+	return iconSize() + QSize(static_cast<int>(4 * xScaleFactor), static_cast<int>(4 * yScaleFactor));
+}
+
+void AbstractPopupMenuButton::paintEvent(QPaintEvent *event)
+{
+	QPainter painter(this);
+	QStyleOption styleOption;
+	styleOption.initFrom(this);
+	auto buttonRect = event->rect();
+	auto selectionRect = QRect(buttonRect.topLeft().x(), buttonRect.topLeft().y(), iconSize().width() + 3, iconSize().height() + 3);
+	auto hoverRect = QRect(buttonRect.topLeft().x() + 1, buttonRect.topLeft().y() + 1, iconSize().width() + 1, iconSize().height() + 1);
+
+	painter.drawPixmap(buttonRect.topLeft() + QPointF(2, 2), icon().pixmap(iconSize()));
+
+	if(isChecked()) {
+		painter.drawRect(selectionRect);
+	}
+	
+	if(styleOption.state & QStyle::State_MouseOver)
+	{
+		painter.setPen(QColor(QStringLiteral("#add8e6")));
+		painter.drawRect(hoverRect);
+	}
+}
+
+} // namespace kColorPicker
diff --git a/src/buttons/AbstractPopupMenuButton.h b/src/buttons/AbstractPopupMenuButton.h
new file mode 100644
index 0000000..86f1736
--- /dev/null
+++ b/src/buttons/AbstractPopupMenuButton.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2018 Damir Porobic <damir.porobic at gmx.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser 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 KCOLORPICKER_ABSTRACTPOPUPMENUBUTTON_H
+#define KCOLORPICKER_ABSTRACTPOPUPMENUBUTTON_H
+
+#include <QToolButton>
+#include <QPainter>
+#include <QPaintEvent>
+#include <QStyleOption>
+
+namespace kColorPicker {
+
+class AbstractPopupMenuButton : public QToolButton
+{
+Q_OBJECT
+public:
+	explicit AbstractPopupMenuButton(const QIcon &icon);
+
+signals:
+	void colorSelected(const QColor &color) const;
+
+protected slots:
+	void paintEvent(QPaintEvent *event) override;
+	virtual void buttonClicked() = 0;
+	QSize getSizeBasedOnIcon() const;
+};
+
+} // namespace kColorPicker
+
+#endif //KCOLORPICKER_ABSTRACTPOPUPMENUBUTTON_H
diff --git a/src/buttons/ColorButton.cpp b/src/buttons/ColorButton.cpp
new file mode 100644
index 0000000..e439fd9
--- /dev/null
+++ b/src/buttons/ColorButton.cpp
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2018 Damir Porobic <damir.porobic at gmx.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser 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 "ColorButton.h"
+
+namespace kColorPicker {
+
+ColorButton::ColorButton(const QIcon &icon, const QColor &color) : AbstractPopupMenuButton(icon)
+{
+    setCheckable(true);
+    mColor = color;
+}
+
+QColor ColorButton::color() const
+{
+    return mColor;
+}
+
+void ColorButton::buttonClicked()
+{
+    emit colorSelected(mColor);
+}
+
+} // namespace kColorPicker
\ No newline at end of file
diff --git a/src/buttons/ColorButton.h b/src/buttons/ColorButton.h
new file mode 100644
index 0000000..8e7caba
--- /dev/null
+++ b/src/buttons/ColorButton.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2018 Damir Porobic <damir.porobic at gmx.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser 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 KCOLORPICKER_COLORBUTTON_H
+#define KCOLORPICKER_COLORBUTTON_H
+
+#include "AbstractPopupMenuButton.h"
+
+namespace kColorPicker {
+
+class ColorButton : public AbstractPopupMenuButton
+{
+Q_OBJECT
+public:
+	ColorButton(const QIcon &icon, const QColor &color);
+	QColor color() const;
+
+protected:
+	void buttonClicked() override;
+
+private:
+	QColor mColor;
+};
+
+} // namespace kColorPicker
+
+#endif //KCOLORPICKER_COLORBUTTON_H
diff --git a/src/buttons/ColorDialogButton.cpp b/src/buttons/ColorDialogButton.cpp
new file mode 100644
index 0000000..8e57660
--- /dev/null
+++ b/src/buttons/ColorDialogButton.cpp
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2018 Damir Porobic <damir.porobic at gmx.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser 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 "ColorDialogButton.h"
+
+namespace kColorPicker {
+
+ColorDialogButton::ColorDialogButton(const QIcon &icon) : AbstractPopupMenuButton(icon)
+{
+    setCheckable(false);
+}
+
+void ColorDialogButton::buttonClicked()
+{
+    auto color = QColorDialog::getColor();
+    emit colorSelected(color);
+}
+
+} // namespace kColorPicker
\ No newline at end of file
diff --git a/src/buttons/ColorDialogButton.h b/src/buttons/ColorDialogButton.h
new file mode 100644
index 0000000..7585a88
--- /dev/null
+++ b/src/buttons/ColorDialogButton.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2018 Damir Porobic <damir.porobic at gmx.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser 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 KCOLORPICKER_COLORDIALOGBUTTON_H
+#define KCOLORPICKER_COLORDIALOGBUTTON_H
+
+#include <QColorDialog>
+
+#include "AbstractPopupMenuButton.h"
+
+namespace kColorPicker {
+
+class ColorDialogButton : public AbstractPopupMenuButton
+{
+Q_OBJECT
+public:
+	explicit ColorDialogButton(const QIcon &icon);
+
+protected:
+	void buttonClicked() override;
+
+};
+
+} // namespace kColorPicker
+
+#endif //KCOLORPICKER_COLORDIALOGBUTTON_H
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
new file mode 100644
index 0000000..5a15d7c
--- /dev/null
+++ b/tests/CMakeLists.txt
@@ -0,0 +1,14 @@
+set(UNITTEST_SRC
+        buttons/ColorButtonTest.cpp
+        )
+
+add_library(KCOLORPICKER_STATIC STATIC ${KCOLORPICKER_SRCS})
+
+target_link_libraries(KCOLORPICKER_STATIC Qt5::Widgets kColorPicker)
+
+foreach (UnitTest ${UNITTEST_SRC})
+    get_filename_component(UnitTestName ${UnitTest} NAME_WE)
+    add_executable(${UnitTestName} ${UnitTest})
+    target_link_libraries(${UnitTestName} KCOLORPICKER_STATIC Qt5::Test)
+    add_test(${UnitTestName} ${UnitTestName})
+endforeach (UnitTest)
\ No newline at end of file
diff --git a/tests/buttons/ColorButtonTest.cpp b/tests/buttons/ColorButtonTest.cpp
new file mode 100644
index 0000000..ea47cc7
--- /dev/null
+++ b/tests/buttons/ColorButtonTest.cpp
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2018 Damir Porobic <damir.porobic at gmx.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser 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 "ColorButtonTest.h"
+
+void ColorButtonTest::Clicked_Should_EmitColorSelected()
+{
+    auto color = QColor(Qt::blue);
+    ColorButton colorButton(QIcon(), color);
+    QSignalSpy spy(&colorButton, &ColorButton::colorSelected);
+
+    colorButton.click();
+
+    QCOMPARE(spy.count(), 1);
+    auto selectedColor = qvariant_cast<QColor>(spy.at(0).at(0));
+    QCOMPARE(selectedColor, color);
+}
+
+QTEST_MAIN(ColorButtonTest);
diff --git a/tests/buttons/ColorButtonTest.h b/tests/buttons/ColorButtonTest.h
new file mode 100644
index 0000000..741a1a0
--- /dev/null
+++ b/tests/buttons/ColorButtonTest.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2018 Damir Porobic <damir.porobic at gmx.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser 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 KCOLORPICKER_COLORBUTTONTEST_H
+#define KCOLORPICKER_COLORBUTTONTEST_H
+
+#include <QtTest>
+
+#include "../../src/buttons/ColorButton.h"
+
+using kColorPicker::ColorButton;
+
+class ColorButtonTest : public QObject
+{
+Q_OBJECT
+
+private slots:
+    void Clicked_Should_EmitColorSelected();
+};
+
+#endif // KCOLORPICKER_COLORBUTTONTEST_H



More information about the Neon-commits mailing list