diff --git a/libs/ui/CMakeLists.txt b/libs/ui/CMakeLists.txt index d70c95b284..e2d481ff30 100644 --- a/libs/ui/CMakeLists.txt +++ b/libs/ui/CMakeLists.txt @@ -1,550 +1,550 @@ # Disable -Wswitch because of the extra definitions we here: # kis_input_manager.cpp: In member function ‘virtual bool KisInputManager::eventFilter(QObject*, QEvent*)’: # warning: case value ‘1001’ not in enumerated type ‘QEvent::Type’ [-Wswitch] # warning: case value ‘1002’ not in enumerated type ‘QEvent::Type’ [-Wswitch] if (CMAKE_COMPILER_IS_GNUCXX) add_definitions(${KDE4_ENABLE_EXCEPTIONS} -Wno-switch) endif () include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/qtlockedfile ${EXIV2_INCLUDE_DIR} ) include_directories(SYSTEM ${EIGEN3_INCLUDE_DIR} ${OCIO_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} ) add_subdirectory( tests ) if (APPLE) find_library(FOUNDATION_LIBRARY Foundation) endif () set(kritaui_LIB_SRCS canvas/kis_canvas_widget_base.cpp canvas/kis_canvas2.cpp canvas/kis_canvas_updates_compressor.cpp canvas/kis_canvas_controller.cpp canvas/kis_paintop_transformation_connector.cpp canvas/kis_display_color_converter.cpp canvas/kis_display_filter.cpp canvas/kis_exposure_gamma_correction_interface.cpp canvas/kis_tool_proxy.cpp canvas/kis_canvas_decoration.cc canvas/kis_coordinates_converter.cpp canvas/kis_grid_manager.cpp canvas/kis_grid_decoration.cpp canvas/kis_grid_config.cpp canvas/kis_prescaled_projection.cpp canvas/kis_qpainter_canvas.cpp canvas/kis_projection_backend.cpp canvas/kis_update_info.cpp canvas/kis_image_patch.cpp canvas/kis_image_pyramid.cpp canvas/kis_infinity_manager.cpp canvas/kis_change_guides_command.cpp canvas/kis_guides_decoration.cpp canvas/kis_guides_manager.cpp canvas/kis_guides_config.cpp canvas/kis_snap_config.cpp canvas/kis_snap_line_strategy.cpp dialogs/kis_about_application.cpp dialogs/kis_dlg_adj_layer_props.cc dialogs/kis_dlg_adjustment_layer.cc dialogs/kis_dlg_filter.cpp dialogs/kis_dlg_generator_layer.cpp dialogs/kis_dlg_file_layer.cpp dialogs/kis_dlg_image_properties.cc dialogs/kis_dlg_layer_properties.cc dialogs/kis_dlg_preferences.cc dialogs/slider_and_spin_box_sync.cpp dialogs/kis_dlg_blacklist_cleanup.cpp dialogs/kis_dlg_layer_style.cpp dialogs/kis_dlg_png_import.cpp dialogs/kis_dlg_import_image_sequence.cpp dialogs/kis_delayed_save_dialog.cpp dialogs/kis_internal_color_selector.cpp flake/kis_node_dummies_graph.cpp flake/kis_dummies_facade_base.cpp flake/kis_dummies_facade.cpp flake/kis_node_shapes_graph.cpp flake/kis_node_shape.cpp flake/kis_shape_controller.cpp flake/kis_shape_layer.cc flake/kis_shape_layer_canvas.cpp flake/kis_shape_selection.cpp flake/kis_shape_selection_canvas.cpp flake/kis_shape_selection_model.cpp flake/kis_take_all_shapes_command.cpp brushhud/kis_uniform_paintop_property_widget.cpp brushhud/kis_brush_hud.cpp brushhud/kis_round_hud_button.cpp brushhud/kis_dlg_brush_hud_config.cpp brushhud/kis_brush_hud_properties_list.cpp brushhud/kis_brush_hud_properties_config.cpp kis_aspect_ratio_locker.cpp kis_autogradient.cc kis_bookmarked_configurations_editor.cc kis_bookmarked_configurations_model.cc kis_bookmarked_filter_configurations_model.cc kis_canvas_resource_provider.cpp kis_derived_resources.cpp kis_categories_mapper.cpp kis_categorized_list_model.cpp kis_categorized_item_delegate.cpp kis_clipboard.cc kis_config.cc kis_config_notifier.cpp kis_control_frame.cpp kis_composite_ops_model.cc kis_paint_ops_model.cpp kis_cursor.cc kis_cursor_cache.cpp kis_custom_pattern.cc kis_file_layer.cpp kis_safe_document_loader.cpp kis_splash_screen.cpp kis_filter_manager.cc kis_filters_model.cc kis_histogram_view.cc kis_image_manager.cc kis_image_view_converter.cpp kis_import_catcher.cc kis_layer_manager.cc kis_mask_manager.cc kis_mimedata.cpp kis_node_commands_adapter.cpp kis_node_manager.cpp kis_node_juggler_compressed.cpp kis_node_selection_adapter.cpp kis_node_insertion_adapter.cpp kis_node_model.cpp kis_node_filter_proxy_model.cpp kis_model_index_converter_base.cpp kis_model_index_converter.cpp kis_model_index_converter_show_all.cpp kis_painting_assistant.cc kis_painting_assistants_decoration.cpp kis_painting_assistants_manager.cpp kis_paintop_box.cc kis_paintop_option.cpp kis_paintop_options_model.cpp kis_paintop_settings_widget.cpp kis_popup_palette.cpp kis_png_converter.cpp kis_preference_set_registry.cpp kis_resource_server_provider.cpp kis_selection_decoration.cc kis_selection_manager.cc kis_statusbar.cc kis_zoom_manager.cc kis_favorite_resource_manager.cpp kis_workspace_resource.cpp kis_action.cpp kis_action_manager.cpp kis_view_plugin.cpp kis_canvas_controls_manager.cpp kis_tooltip_manager.cpp kis_multinode_property.cpp kis_async_action_feedback.cpp kisexiv2/kis_exif_io.cpp kisexiv2/kis_exiv2.cpp kisexiv2/kis_iptc_io.cpp kisexiv2/kis_xmp_io.cpp kra/kis_kra_utils.cpp kra/kis_kra_load_visitor.cpp kra/kis_kra_loader.cpp kra/kis_kra_save_visitor.cpp kra/kis_kra_saver.cpp kra/kis_kra_savexml_visitor.cpp opengl/kis_opengl.cpp opengl/kis_opengl_canvas2.cpp opengl/kis_opengl_canvas_debugger.cpp opengl/kis_opengl_image_textures.cpp opengl/kis_texture_tile.cpp kis_fps_decoration.cpp ora/kis_open_raster_stack_load_visitor.cpp ora/kis_open_raster_stack_save_visitor.cpp ora/ora_load_context.cc ora/ora_save_context.cc recorder/kis_node_query_path_editor.cc recorder/kis_recorded_action_creator.cc recorder/kis_recorded_action_creator_factory.cc recorder/kis_recorded_action_creator_factory_registry.cc recorder/kis_recorded_action_editor_factory.cc recorder/kis_recorded_action_editor_factory_registry.cc recorder/kis_recorded_filter_action_editor.cc recorder/kis_recorded_filter_action_creator.cpp recorder/kis_recorded_paint_action_editor.cc tool/kis_selection_tool_helper.cpp tool/kis_selection_tool_config_widget_helper.cpp tool/kis_rectangle_constraint_widget.cpp tool/kis_shape_tool_helper.cpp tool/kis_tool.cc tool/kis_delegated_tool_policies.cpp tool/kis_tool_freehand.cc tool/kis_speed_smoother.cpp tool/kis_painting_information_builder.cpp tool/kis_stabilized_events_sampler.cpp tool/kis_tool_freehand_helper.cpp tool/kis_tool_multihand_helper.cpp tool/kis_figure_painting_tool_helper.cpp tool/kis_recording_adapter.cpp tool/kis_tool_paint.cc tool/kis_tool_shape.cc tool/kis_tool_ellipse_base.cpp tool/kis_tool_rectangle_base.cpp tool/kis_tool_polyline_base.cpp tool/kis_tool_utils.cpp tool/kis_resources_snapshot.cpp tool/kis_smoothing_options.cpp tool/strokes/freehand_stroke.cpp tool/strokes/kis_painter_based_stroke_strategy.cpp tool/strokes/kis_filter_stroke_strategy.cpp tool/strokes/kis_color_picker_stroke_strategy.cpp widgets/kis_cmb_composite.cc widgets/kis_cmb_contour.cpp widgets/kis_cmb_gradient.cpp widgets/kis_paintop_list_widget.cpp widgets/kis_cmb_idlist.cc widgets/kis_color_space_selector.cc widgets/kis_advanced_color_space_selector.cc widgets/kis_cie_tongue_widget.cpp widgets/kis_tone_curve_widget.cpp widgets/kis_curve_widget.cpp widgets/kis_custom_image_widget.cc widgets/kis_image_from_clipboard_widget.cpp widgets/kis_double_widget.cc widgets/kis_filter_selector_widget.cc widgets/kis_gradient_chooser.cc widgets/kis_gradient_slider_widget.cc widgets/kis_gradient_slider.cpp widgets/kis_iconwidget.cc widgets/kis_mask_widgets.cpp widgets/kis_meta_data_merge_strategy_chooser_widget.cc widgets/kis_multi_bool_filter_widget.cc widgets/kis_multi_double_filter_widget.cc widgets/kis_multi_integer_filter_widget.cc widgets/kis_multipliers_double_slider_spinbox.cpp widgets/kis_paintop_presets_popup.cpp widgets/kis_tool_options_popup.cpp widgets/kis_paintop_presets_chooser_popup.cpp widgets/kis_pattern_chooser.cc widgets/kis_popup_button.cc widgets/kis_preset_chooser.cpp widgets/kis_progress_widget.cpp widgets/kis_selection_options.cc widgets/kis_scratch_pad.cpp widgets/kis_scratch_pad_event_filter.cpp widgets/kis_preset_selector_strip.cpp widgets/kis_slider_spin_box.cpp widgets/kis_size_group.cpp widgets/kis_size_group_p.cpp widgets/kis_wdg_generator.cpp widgets/kis_workspace_chooser.cpp widgets/squeezedcombobox.cpp widgets/kis_categorized_list_view.cpp widgets/kis_widget_chooser.cpp widgets/kis_tool_button.cpp widgets/kis_floating_message.cpp widgets/kis_lod_availability_widget.cpp widgets/kis_color_label_selector_widget.cpp widgets/kis_color_filter_combo.cpp widgets/kis_elided_label.cpp widgets/kis_spinbox_color_selector.cpp widgets/kis_screen_color_picker.cpp widgets/kis_visual_color_selector.cpp widgets/KoDualColorButton.cpp widgets/kis_color_input.cpp - + widgets/kis_color_button.cpp input/kis_input_manager.cpp input/kis_input_manager_p.cpp input/kis_extended_modifiers_mapper.cpp input/kis_abstract_input_action.cpp input/kis_tool_invocation_action.cpp input/kis_pan_action.cpp input/kis_alternate_invocation_action.cpp input/kis_rotate_canvas_action.cpp input/kis_zoom_action.cpp input/kis_change_frame_action.cpp input/kis_gamma_exposure_action.cpp input/kis_show_palette_action.cpp input/kis_change_primary_setting_action.cpp input/kis_abstract_shortcut.cpp input/kis_single_action_shortcut.cpp input/kis_stroke_shortcut.cpp input/kis_shortcut_matcher.cpp input/kis_select_layer_action.cpp operations/kis_operation.cpp operations/kis_operation_configuration.cpp operations/kis_operation_registry.cpp operations/kis_operation_ui_factory.cpp operations/kis_operation_ui_widget.cpp operations/kis_filter_selection_operation.cpp actions/kis_selection_action_factories.cpp input/kis_touch_shortcut.cpp kis_document_undo_store.cpp kis_transaction_based_command.cpp kis_gui_context_command.cpp kis_gui_context_command_p.cpp input/kis_tablet_debugger.cpp input/kis_input_profile_manager.cpp input/kis_input_profile.cpp input/kis_shortcut_configuration.cpp input/config/kis_input_configuration_page.cpp input/config/kis_edit_profiles_dialog.cpp input/config/kis_input_profile_model.cpp input/config/kis_input_configuration_page_item.cpp input/config/kis_action_shortcuts_model.cpp input/config/kis_input_type_delegate.cpp input/config/kis_input_mode_delegate.cpp input/config/kis_input_button.cpp input/config/kis_input_editor_delegate.cpp input/config/kis_mouse_input_editor.cpp input/config/kis_wheel_input_editor.cpp input/config/kis_key_input_editor.cpp processing/fill_processing_visitor.cpp kis_asl_layer_style_serializer.cpp kis_psd_layer_style_resource.cpp canvas/kis_mirror_axis.cpp kis_abstract_perspective_grid.cpp KisApplication.cpp KisAutoSaveRecoveryDialog.cpp KisDetailsPane.cpp KisDocument.cpp KisNodeDelegate.cpp kis_node_view_visibility_delegate.cpp KisNodeToolTip.cpp KisNodeView.cpp kis_node_view_color_scheme.cpp KisFilterChain.cpp KisFilterChainLink.cpp KisFilterChainLinkList.cpp KisImportExportFilter.cpp KisFilterEdge.cpp KisFilterEntry.cpp KisFilterGraph.cpp KisImportExportManager.cpp KisFilterVertex.cpp KisMainWindow.cpp KisOpenPane.cpp KisPart.cpp KisPrintJob.cpp KisTemplate.cpp KisTemplateCreateDia.cpp KisTemplateGroup.cpp KisTemplates.cpp KisTemplatesPane.cpp KisTemplateTree.cpp KisUndoStackAction.cpp KisView.cpp thememanager.cpp kis_mainwindow_observer.cpp KisViewManager.cpp kis_mirror_manager.cpp qtlockedfile/qtlockedfile.cpp qtsingleapplication/qtlocalpeer.cpp qtsingleapplication/qtsingleapplication.cpp KisResourceBundle.cpp KisResourceBundleManifest.cpp kis_md5_generator.cpp KisApplicationArguments.cpp KisNetworkAccessManager.cpp KisMultiFeedRSSModel.cpp KisRemoteFileFetcher.cpp KisPaletteModel.cpp KisColorsetChooser.cpp KisSaveGroupVisitor.cpp ) if(WIN32) if (NOT Qt5Gui_PRIVATE_INCLUDE_DIRS) message(FATAL_ERROR "Qt5Gui Private header are missing!") endif() set(kritaui_LIB_SRCS ${kritaui_LIB_SRCS} input/kis_tablet_event.cpp input/wintab/kis_tablet_support_win.cpp input/wintab/kis_screen_size_choice_dialog.cpp qtlockedfile/qtlockedfile_win.cpp ) include_directories(${Qt5Gui_PRIVATE_INCLUDE_DIRS}) endif() set(kritaui_LIB_SRCS ${kritaui_LIB_SRCS} kis_animation_frame_cache.cpp kis_animation_cache_populator.cpp canvas/kis_animation_player.cpp kis_animation_exporter.cpp kis_animation_importer.cpp ) if(UNIX) set(kritaui_LIB_SRCS ${kritaui_LIB_SRCS} input/kis_tablet_event.cpp input/wintab/kis_tablet_support.cpp qtlockedfile/qtlockedfile_unix.cpp ) if(NOT APPLE) set(kritaui_LIB_SRCS ${kritaui_LIB_SRCS} input/wintab/kis_tablet_support_x11.cpp input/wintab/qxcbconnection_xi2.cpp input/wintab/qxcbconnection.cpp input/wintab/kis_xi2_event_filter.cpp ) endif() endif() if(WIN32) #ki18n_wrap_ui( # input/wintab/kis_screen_size_choice_dialog.ui #) endif() ki18n_wrap_ui(kritaui_LIB_SRCS forms/wdgdlgpngimport.ui forms/wdgfullscreensettings.ui forms/wdgautogradient.ui forms/wdggeneralsettings.ui forms/wdgperformancesettings.ui forms/wdggenerators.ui forms/wdgcustompalette.ui forms/wdgbookmarkedconfigurationseditor.ui forms/wdgapplyprofile.ui forms/wdgcustompattern.ui forms/wdglayerproperties.ui forms/wdgcolorsettings.ui forms/wdgtabletsettings.ui forms/wdgcolorspaceselector.ui forms/wdgcolorspaceselectoradvanced.ui forms/wdgdisplaysettings.ui forms/kis_previewwidgetbase.ui forms/kis_matrix_widget.ui forms/wdgselectionoptions.ui forms/wdggeometryoptions.ui forms/wdgnewimage.ui forms/wdgimageproperties.ui forms/wdgmaskfromselection.ui forms/wdgmasksource.ui forms/wdgfilterdialog.ui forms/wdgmetadatamergestrategychooser.ui forms/wdgpaintoppresets.ui forms/wdgpaintopsettings.ui forms/wdgdlggeneratorlayer.ui forms/wdgdlgfilelayer.ui forms/wdgfilterselector.ui forms/wdgfilternodecreation.ui forms/wdgpaintactioneditor.ui forms/wdgmultipliersdoublesliderspinbox.ui forms/wdgnodequerypatheditor.ui forms/wdgpresetselectorstrip.ui forms/wdgdlgblacklistcleanup.ui forms/wdgrectangleconstraints.ui forms/wdgimportimagesequence.ui forms/KisDetailsPaneBase.ui forms/KisOpenPaneBase.ui brushhud/kis_dlg_brush_hud_config.ui forms/wdgdlginternalcolorselector.ui dialogs/kis_delayed_save_dialog.ui input/config/kis_input_configuration_page.ui input/config/kis_edit_profiles_dialog.ui input/config/kis_input_configuration_page_item.ui input/config/kis_mouse_input_editor.ui input/config/kis_wheel_input_editor.ui input/config/kis_key_input_editor.ui layerstyles/wdgBevelAndEmboss.ui layerstyles/wdgblendingoptions.ui layerstyles/WdgColorOverlay.ui layerstyles/wdgContour.ui layerstyles/wdgdropshadow.ui layerstyles/WdgGradientOverlay.ui layerstyles/wdgInnerGlow.ui layerstyles/wdglayerstyles.ui layerstyles/WdgPatternOverlay.ui layerstyles/WdgSatin.ui layerstyles/WdgStroke.ui layerstyles/wdgstylesselector.ui layerstyles/wdgTexture.ui wdgsplash.ui input/wintab/kis_screen_size_choice_dialog.ui ) QT5_WRAP_CPP(kritaui_HEADERS_MOC KisNodePropertyAction_p.h) add_library(kritaui SHARED ${kritaui_HEADERS_MOC} ${kritaui_LIB_SRCS} ) generate_export_header(kritaui BASE_NAME kritaui) target_link_libraries(kritaui KF5::CoreAddons KF5::Completion KF5::I18n KF5::ItemViews Qt5::Network kritacolor kritaimage kritalibbrush kritawidgets kritawidgetutils ${PNG_LIBRARIES} ${EXIV2_LIBRARIES} ) if (HAVE_KIO) target_link_libraries(kritaui KF5::KIOCore) endif() if (NOT WIN32 AND NOT APPLE) target_link_libraries(kritaui ${X11_X11_LIB} ${X11_Xinput_LIB} ${XCB_LIBRARIES}) endif() if(APPLE) target_link_libraries(kritaui ${FOUNDATION_LIBRARY}) endif () target_link_libraries(kritaui ${OPENEXR_LIBRARIES}) # Add VSync disable workaround if(NOT WIN32 AND NOT APPLE) target_link_libraries(kritaui ${CMAKE_DL_LIBS} Qt5::X11Extras) endif() if(X11_FOUND) target_link_libraries(kritaui Qt5::X11Extras ${X11_LIBRARIES}) endif() target_link_libraries(kritaui LINK_INTERFACE_LIBRARIES kritaimage kritalibbrush kritapigment KF5::Completion KF5::I18n ${GL_INTERFACE_LIBRARIES}) target_include_directories(kritaui PUBLIC $ $ $ $ $ $ $ ) set_target_properties(kritaui PROPERTIES VERSION ${GENERIC_KRITA_LIB_VERSION} SOVERSION ${GENERIC_KRITA_LIB_SOVERSION} ) install(TARGETS kritaui ${INSTALL_TARGETS_DEFAULT_ARGS}) if (APPLE) install(FILES osx.stylesheet DESTINATION ${DATA_INSTALL_DIR}/krita) endif () diff --git a/libs/ui/widgets/kis_color_button.cpp b/libs/ui/widgets/kis_color_button.cpp new file mode 100644 index 0000000000..1607b29c8e --- /dev/null +++ b/libs/ui/widgets/kis_color_button.cpp @@ -0,0 +1,340 @@ +/* This file is part of the KDE libraries + Copyright (C) 1997 Martin Jones (mjones@kde.org) + Copyright (C) 1999 Cristian Tibirna (ctibirna@kde.org) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "kis_color_button.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +class KisColorButton::KisColorButtonPrivate +{ +public: + KisColorButtonPrivate(KisColorButton *q); + + void _k_chooseColor(); + void _k_colorChosen(); + + KisColorButton *q; + KoColor m_defaultColor; + bool m_bdefaultColor : 1; + bool m_alphaChannel : 1; + + KoColor col; + QPoint mPos; + + QPointer dialogPtr; + + void initStyleOption(QStyleOptionButton *opt) const; +}; + +///////////////////////////////////////////////////////////////////// +// Functions duplicated from KColorMimeData +// Should be kept in sync +void _k_populateMimeData(QMimeData *mimeData, const KoColor &color) +{ + mimeData->setColorData(color.toQColor()); + mimeData->setText(color.toQColor().name()); +} + +bool _k_canDecode(const QMimeData *mimeData) +{ + if (mimeData->hasColor()) { + return true; + } + if (mimeData->hasText()) { + const QString colorName = mimeData->text(); + if ((colorName.length() >= 4) && (colorName[0] == QLatin1Char('#'))) { + return true; + } + } + return false; +} + +QColor _k_fromMimeData(const QMimeData *mimeData) +{ + if (mimeData->hasColor()) { + return mimeData->colorData().value(); + } + if (_k_canDecode(mimeData)) { + return QColor(mimeData->text()); + } + return QColor(); +} + +QDrag *_k_createDrag(const KoColor &color, QObject *dragsource) +{ + QDrag *drag = new QDrag(dragsource); + QMimeData *mime = new QMimeData; + _k_populateMimeData(mime, color); + drag->setMimeData(mime); + QPixmap colorpix(25, 20); + colorpix.fill(color.toQColor()); + QPainter p(&colorpix); + p.setPen(Qt::black); + p.drawRect(0, 0, 24, 19); + p.end(); + drag->setPixmap(colorpix); + drag->setHotSpot(QPoint(-5, -7)); + return drag; +} +///////////////////////////////////////////////////////////////////// + +KisColorButton::KisColorButtonPrivate::KisColorButtonPrivate(KisColorButton *q) + : q(q) +{ + m_bdefaultColor = false; + m_alphaChannel = false; + q->setAcceptDrops(true); + + connect(q, SIGNAL(clicked()), q, SLOT(_k_chooseColor())); +} + +KisColorButton::KisColorButton(QWidget *parent) + : QPushButton(parent) + , d(new KisColorButtonPrivate(this)) +{ +} + +KisColorButton::KisColorButton(const KoColor &c, QWidget *parent) + : QPushButton(parent) + , d(new KisColorButtonPrivate(this)) +{ + d->col = c; +} + +KisColorButton::KisColorButton(const KoColor &c, const KoColor &defaultColor, QWidget *parent) + : QPushButton(parent) + , d(new KisColorButtonPrivate(this)) +{ + d->col = c; + setDefaultColor(defaultColor); +} + +KisColorButton::~KisColorButton() +{ + delete d; +} + +KoColor KisColorButton::color() const +{ + return d->col; +} + +void KisColorButton::setColor(const KoColor &c) +{ + d->col = c; + update(); + emit changed(d->col); +} + +void KisColorButton::setAlphaChannelEnabled(bool alpha) +{ + d->m_alphaChannel = alpha; +} + +bool KisColorButton::isAlphaChannelEnabled() const +{ + return d->m_alphaChannel; +} + +KoColor KisColorButton::defaultColor() const +{ + return d->m_defaultColor; +} + +void KisColorButton::setDefaultColor(const KoColor &c) +{ + d->m_bdefaultColor = true; + d->m_defaultColor = c; +} + +void KisColorButton::KisColorButtonPrivate::initStyleOption(QStyleOptionButton *opt) const +{ + opt->initFrom(q); + opt->state |= q->isDown() ? QStyle::State_Sunken : QStyle::State_Raised; + opt->features = QStyleOptionButton::None; + if (q->isDefault()) { + opt->features |= QStyleOptionButton::DefaultButton; + } + opt->text.clear(); + opt->icon = QIcon(); +} + +void KisColorButton::paintEvent(QPaintEvent *) +{ + QPainter painter(this); + QStyle *style = QWidget::style(); + + //First, we need to draw the bevel. + QStyleOptionButton butOpt; + d->initStyleOption(&butOpt); + style->drawControl(QStyle::CE_PushButtonBevel, &butOpt, &painter, this); + + //OK, now we can muck around with drawing out pretty little color box + //First, sort out where it goes + QRect labelRect = style->subElementRect(QStyle::SE_PushButtonContents, + &butOpt, this); + int shift = style->pixelMetric(QStyle::PM_ButtonMargin, &butOpt, this) / 2; + labelRect.adjust(shift, shift, -shift, -shift); + int x, y, w, h; + labelRect.getRect(&x, &y, &w, &h); + + if (isChecked() || isDown()) { + x += style->pixelMetric(QStyle::PM_ButtonShiftHorizontal, &butOpt, this); + y += style->pixelMetric(QStyle::PM_ButtonShiftVertical, &butOpt, this); + } + + QColor fillCol = isEnabled() ? d->col.toQColor() : palette().color(backgroundRole()); + qDrawShadePanel(&painter, x, y, w, h, palette(), true, 1, NULL); + if (fillCol.isValid()) { + const QRect rect(x + 1, y + 1, w - 2, h - 2); + if (fillCol.alpha() < 255) { + QPixmap chessboardPattern(16, 16); + QPainter patternPainter(&chessboardPattern); + patternPainter.fillRect(0, 0, 8, 8, Qt::black); + patternPainter.fillRect(8, 8, 8, 8, Qt::black); + patternPainter.fillRect(0, 8, 8, 8, Qt::white); + patternPainter.fillRect(8, 0, 8, 8, Qt::white); + patternPainter.end(); + painter.fillRect(rect, QBrush(chessboardPattern)); + } + painter.fillRect(rect, fillCol); + } + + if (hasFocus()) { + QRect focusRect = style->subElementRect(QStyle::SE_PushButtonFocusRect, &butOpt, this); + QStyleOptionFocusRect focusOpt; + focusOpt.init(this); + focusOpt.rect = focusRect; + focusOpt.backgroundColor = palette().background().color(); + style->drawPrimitive(QStyle::PE_FrameFocusRect, &focusOpt, &painter, this); + } +} + +QSize KisColorButton::sizeHint() const +{ + QStyleOptionButton opt; + d->initStyleOption(&opt); + return style()->sizeFromContents(QStyle::CT_PushButton, &opt, QSize(40, 15), this). + expandedTo(QApplication::globalStrut()); +} + +QSize KisColorButton::minimumSizeHint() const +{ + QStyleOptionButton opt; + d->initStyleOption(&opt); + return style()->sizeFromContents(QStyle::CT_PushButton, &opt, QSize(3, 3), this). + expandedTo(QApplication::globalStrut()); +} + +void KisColorButton::dragEnterEvent(QDragEnterEvent *event) +{ + event->setAccepted(_k_canDecode(event->mimeData()) && isEnabled()); +} + +void KisColorButton::dropEvent(QDropEvent *event) +{ + QColor c = _k_fromMimeData(event->mimeData()); + if (c.isValid()) { + KoColor col; + col.fromQColor(c); + setColor(col); + } +} + +void KisColorButton::keyPressEvent(QKeyEvent *e) +{ + int key = e->key() | e->modifiers(); + + if (QKeySequence::keyBindings(QKeySequence::Copy).contains(key)) { + QMimeData *mime = new QMimeData; + _k_populateMimeData(mime, color()); + QApplication::clipboard()->setMimeData(mime, QClipboard::Clipboard); + } else if (QKeySequence::keyBindings(QKeySequence::Paste).contains(key)) { + QColor color = _k_fromMimeData(QApplication::clipboard()->mimeData(QClipboard::Clipboard)); + KoColor col; + col.fromQColor(color); + setColor(col); + } else { + QPushButton::keyPressEvent(e); + } +} + +void KisColorButton::mousePressEvent(QMouseEvent *e) +{ + d->mPos = e->pos(); + QPushButton::mousePressEvent(e); +} + +void KisColorButton::mouseMoveEvent(QMouseEvent *e) +{ + if ((e->buttons() & Qt::LeftButton) && + (e->pos() - d->mPos).manhattanLength() > QApplication::startDragDistance()) { + _k_createDrag(color(), this)->start(); + setDown(false); + } +} + +void KisColorButton::KisColorButtonPrivate::_k_chooseColor() +{ + KisInternalColorSelector *dialog = dialogPtr.data(); + if (dialog) { + dialog->show(); + dialog->raise(); + dialog->activateWindow(); + return; + } + + KisInternalColorSelector::Config cfg; + + dialog = new KisInternalColorSelector(q, + q->color(), + cfg, + "Blabla"); + //dialog->setOption(QColorDialog::ShowAlphaChannel, m_alphaChannel); + dialog->setAttribute(Qt::WA_DeleteOnClose); + connect(dialog, SIGNAL(accepted()), q, SLOT(_k_colorChosen())); + dialogPtr = dialog; + dialog->show(); +} + +void KisColorButton::KisColorButtonPrivate::_k_colorChosen() +{ + KisInternalColorSelector *dialog = dialogPtr.data(); + if (!dialog) { + return; + } + + q->setColor(dialog->getCurrentColor()); +} + +#include "moc_kis_color_button.cpp" diff --git a/libs/ui/widgets/kis_color_button.h b/libs/ui/widgets/kis_color_button.h new file mode 100644 index 0000000000..5c974a3ad9 --- /dev/null +++ b/libs/ui/widgets/kis_color_button.h @@ -0,0 +1,124 @@ +/* + * Copyright (C) Wolthera van Hovell tot Westerflier , (C) 2016 + * This file is forked from the KF5 KColorButton + Copyright (C) 1997 Martin Jones (mjones@kde.org) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef KisColorButton_H +#define KisColorButton_H +#include + +#include +#include + +class KisColorButtonPrivate; +/** +* @short A pushbutton to display or allow user selection of a color. +* +* This widget can be used to display or allow user selection of a color. +* +* @see QColorDialog +* +* \image html KisColorButton.png "KDE Color Button" +*/ +class KRITAUI_EXPORT KisColorButton : public QPushButton +{ + Q_OBJECT + Q_PROPERTY(KoColor color READ color WRITE setColor NOTIFY changed USER true) + Q_PROPERTY(KoColor defaultColor READ defaultColor WRITE setDefaultColor) + Q_PROPERTY(bool alphaChannelEnabled READ isAlphaChannelEnabled WRITE setAlphaChannelEnabled) + +public: + /** + * Creates a color button. + */ + explicit KisColorButton(QWidget *parent = 0); + + /** + * Creates a color button with an initial color @p c. + */ + explicit KisColorButton(const KoColor &c, QWidget *parent = 0); + + /** + * Creates a color button with an initial color @p c and default color @p defaultColor. + */ + KisColorButton(const KoColor &c, const KoColor &defaultColor, QWidget *parent = 0); + + virtual ~KisColorButton(); + + /** + * Returns the currently chosen color. + */ + KoColor color() const; + + /** + * Sets the current color to @p c. + */ + void setColor(const KoColor &c); + + /** + * When set to true, allow the user to change the alpha component + * of the color. The default value is false. + * @since 4.5 + */ + void setAlphaChannelEnabled(bool alpha); + + /** + * Returns true if the user is allowed to change the alpha component. + * @since 4.5 + */ + bool isAlphaChannelEnabled() const; + + /** + * Returns the default color or an invalid color + * if no default color is set. + */ + KoColor defaultColor() const; + + /** + * Sets the default color to @p c. + */ + void setDefaultColor(const KoColor &c); + + QSize sizeHint() const Q_DECL_OVERRIDE; + QSize minimumSizeHint() const Q_DECL_OVERRIDE; + +Q_SIGNALS: + /** + * Emitted when the color of the widget + * is changed, either with setColor() or via user selection. + */ + void changed(const KoColor &newColor); + +protected: + void paintEvent(QPaintEvent *pe) Q_DECL_OVERRIDE; + void dragEnterEvent(QDragEnterEvent *) Q_DECL_OVERRIDE; + void dropEvent(QDropEvent *) Q_DECL_OVERRIDE; + void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE; + void mouseMoveEvent(QMouseEvent *e) Q_DECL_OVERRIDE; + void keyPressEvent(QKeyEvent *e) Q_DECL_OVERRIDE; + +private: + class KisColorButtonPrivate; + KisColorButtonPrivate *const d; + + Q_PRIVATE_SLOT(d, void _k_chooseColor()) + Q_PRIVATE_SLOT(d, void _k_colorChosen()) +}; + +#endif diff --git a/plugins/generators/solid/colorgenerator.cpp b/plugins/generators/solid/colorgenerator.cpp index d147d74b7a..67268884fc 100644 --- a/plugins/generators/solid/colorgenerator.cpp +++ b/plugins/generators/solid/colorgenerator.cpp @@ -1,103 +1,103 @@ /* * This file is part of the KDE project * * Copyright (c) 2008 Boudewijn Rempt * * 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. */ #include "colorgenerator.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "kis_wdg_color.h" #include "ui_wdgcoloroptions.h" K_PLUGIN_FACTORY_WITH_JSON(KritaColorGeneratorFactory, "kritacolorgenerator.json", registerPlugin();) KritaColorGenerator::KritaColorGenerator(QObject *parent, const QVariantList &) : QObject(parent) { KisGeneratorRegistry::instance()->add(new KisColorGenerator()); } KritaColorGenerator::~KritaColorGenerator() { } KisColorGenerator::KisColorGenerator() : KisGenerator(id(), KoID("basic"), i18n("&Solid Color...")) { setColorSpaceIndependence(FULLY_INDEPENDENT); setSupportsPainting(true); } KisFilterConfiguration* KisColorGenerator::factoryConfiguration(const KisPaintDeviceSP) const { KisFilterConfiguration* config = new KisFilterConfiguration("color", 1); QVariant v; v.setValue(KoColor()); config->setProperty("color", v); return config; } KisConfigWidget * KisColorGenerator::createConfigurationWidget(QWidget* parent, const KisPaintDeviceSP dev) const { Q_UNUSED(dev); return new KisWdgColor(parent); } void KisColorGenerator::generate(KisProcessingInformation dstInfo, const QSize& size, const KisFilterConfiguration* config, KoUpdater* progressUpdater) const { KisPaintDeviceSP dst = dstInfo.paintDevice(); Q_ASSERT(!dst.isNull()); Q_ASSERT(config); KoColor c; if (config) { c = config->getColor("color"); KisFillPainter gc(dst); gc.setProgress(progressUpdater); gc.setChannelFlags(config->channelFlags()); gc.setOpacity(100); gc.setSelection(dstInfo.selection()); gc.fillRect(QRect(dstInfo.topLeft(), size), c); gc.end(); } } -#include "colorgenerator.moc" \ No newline at end of file +#include "colorgenerator.moc" diff --git a/plugins/generators/solid/kis_wdg_color.cpp b/plugins/generators/solid/kis_wdg_color.cpp index a48e1f1eda..83624ece1b 100644 --- a/plugins/generators/solid/kis_wdg_color.cpp +++ b/plugins/generators/solid/kis_wdg_color.cpp @@ -1,60 +1,63 @@ /* * This file is part of Krita * * Copyright (c) 2006 Cyrille Berger * * 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. */ #include "kis_wdg_color.h" #include #include #include #include "ui_wdgcoloroptions.h" -KisWdgColor::KisWdgColor(QWidget* parent) +KisWdgColor::KisWdgColor(QWidget* parent, const KoColorSpace *cs) : KisConfigWidget(parent) { m_widget = new Ui_WdgColorOptions(); m_widget->setupUi(this); + m_cs = cs; } KisWdgColor::~KisWdgColor() { delete m_widget; } void KisWdgColor::setConfiguration(const KisPropertiesConfiguration* config) { QVariant value; - widget()->bnColor->setColor(config->getColor("color").toQColor()); + KoColor c =config->getColor("color"); + c.convertTo(m_cs); + widget()->bnColor->setColor(c); } KisPropertiesConfiguration* KisWdgColor::configuration() const { KisFilterConfiguration* config = new KisFilterConfiguration("color", 1); KoColor c; - c.fromQColor(this->widget()->bnColor->color()); + c.fromKoColor(this->widget()->bnColor->color()); QVariant v; v.setValue(c); config->setProperty("color", v); return config; } diff --git a/plugins/generators/solid/kis_wdg_color.h b/plugins/generators/solid/kis_wdg_color.h index 2410a144c3..55ce1e54f1 100644 --- a/plugins/generators/solid/kis_wdg_color.h +++ b/plugins/generators/solid/kis_wdg_color.h @@ -1,45 +1,48 @@ /* * This file is part of Krita * * Copyright (c) 2006 Cyrille Berger * * 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. */ #ifndef KIS_WDG_COLOR_H #define KIS_WDG_COLOR_H #include +#include +#include class Ui_WdgColorOptions; class KisWdgColor : public KisConfigWidget { Q_OBJECT public: - KisWdgColor(QWidget* parent = 0); + KisWdgColor(QWidget* parent = 0, const KoColorSpace *cs = KoColorSpaceRegistry::instance()->rgb8()); ~KisWdgColor(); public: inline const Ui_WdgColorOptions* widget() const { return m_widget; } virtual void setConfiguration(const KisPropertiesConfiguration*); virtual KisPropertiesConfiguration* configuration() const; private: Ui_WdgColorOptions* m_widget; + const KoColorSpace *m_cs; }; #endif diff --git a/plugins/generators/solid/wdgcoloroptions.ui b/plugins/generators/solid/wdgcoloroptions.ui index a28c4adea6..b1f3e5e03a 100644 --- a/plugins/generators/solid/wdgcoloroptions.ui +++ b/plugins/generators/solid/wdgcoloroptions.ui @@ -1,73 +1,73 @@ WdgColorOptions 0 0 158 78 &Color: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter bnColor - + Qt::Horizontal QSizePolicy::Expanding 21 20 Qt::Vertical QSizePolicy::Expanding 20 21 - KColorButton + KisColorButton QPushButton -
kcolorbutton.h
+
kis_color_button.h