[neon/backports-noble/kcolorpicker-noble/Neon/unstable] /: New upstream version 0.1.1
Boyuan Yang
null at kde.org
Wed Jul 3 15:10:15 BST 2024
Git commit 1ad22e9f885f3daf307dd53af353f81c71232a7d by Boyuan Yang.
Committed on 29/03/2020 at 14:11.
Pushed by jriddell into branch 'Neon/unstable'.
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-noble/kcolorpicker-noble/-/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