diff --git a/libs/ui/CMakeLists.txt b/libs/ui/CMakeLists.txt index 0cb23da1bc..29d2edacdb 100644 --- a/libs/ui/CMakeLists.txt +++ b/libs/ui/CMakeLists.txt @@ -1,542 +1,546 @@ # 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 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 + kis_stopgradient_editor.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_stopgradient_slider_widget.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/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 + forms/wdgstopgradienteditor.ui brushhud/kis_dlg_brush_hud_config.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 kritawidgets 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/forms/wdgstopgradienteditor.ui b/libs/ui/forms/wdgstopgradienteditor.ui new file mode 100644 index 0000000000..694799ace3 --- /dev/null +++ b/libs/ui/forms/wdgstopgradienteditor.ui @@ -0,0 +1,115 @@ + + + KisWdgStopGradientEditor + + + + 0 + 0 + 500 + 250 + + + + + 500 + 250 + + + + + + + + + Name: + + + + + + + + + + + + + + + + + + + + 0 + 1 + + + + Qt::ClickFocus + + + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + Qt::ClickFocus + + + + + + + + + + + + + KColorButton + QPushButton +
kcolorbutton.h
+ 1 +
+ + KisStopGradientSliderWidget + QWidget +
kis_stopgradient_slider_widget.h
+ 1 +
+ + KisDoubleSliderSpinBox + QWidget +
kis_slider_spin_box.h
+ 1 +
+
+ + +
diff --git a/libs/ui/kis_stopgradient_editor.cpp b/libs/ui/kis_stopgradient_editor.cpp new file mode 100644 index 0000000000..dd1d2b9ffd --- /dev/null +++ b/libs/ui/kis_stopgradient_editor.cpp @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2004 Cyrille Berger + * 2016 Sven Langkamp + * + * 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_stopgradient_editor.h" +#include +#include +#include + +#include +#include + +#include "kis_debug.h" + +#include "widgets/kis_gradient_slider_widget.h" +#include + +/****************************** KisStopGradientEditor ******************************/ + +KisStopGradientEditor::KisStopGradientEditor(KoStopGradient* gradient, QWidget *parent, const char* name, const QString& caption) + : QWidget(parent), m_gradient(gradient) +{ + setObjectName(name); + setupUi(this); + setWindowTitle(caption); + + connect(gradientSlider, SIGNAL(sigSelectedStop(int)), this, SLOT(stopChanged(int))); + gradientSlider->setGradientResource(m_gradient); + + nameedit->setText(gradient->name()); + connect(nameedit, SIGNAL(editingFinished()), this, SLOT(nameChanged())); + + connect(colorButton, SIGNAL(changed(const QColor&)), SLOT(colorChanged(const QColor&))); + + opacitySlider->setRange(0.0, 1.0, 2); + connect(opacitySlider, SIGNAL(valueChanged(qreal)), this, SLOT(opacityChanged(qreal))); + + buttonReverse->setIcon(KisIconUtils::loadIcon("mirrorAxis-HorizontalMove")); + KisIconUtils::updateIcon(buttonReverse); + connect(buttonReverse, SIGNAL(pressed()), this, SLOT(reverse())); + + stopChanged(gradientSlider->selectedStop()); +} + +void KisStopGradientEditor::activate() +{ + paramChanged(); +} + +void KisStopGradientEditor::stopChanged(int stop) +{ + QColor color = m_gradient->stops()[stop].second.toQColor(); + opacitySlider->setValue(color.alphaF()); + + color.setAlphaF(1.0); + colorButton->setColor(color); + + paramChanged(); +} + +void KisStopGradientEditor::colorChanged(const QColor& color) +{ + QList stops = m_gradient->stops(); + + int currentStop = gradientSlider->selectedStop(); + double t = stops[currentStop].first; + + KoColor c(color, stops[currentStop].second.colorSpace()); + c.setOpacity(stops[currentStop].second.opacityU8()); + + stops.removeAt(currentStop); + stops.insert(currentStop, KoGradientStop(t, c)); + + m_gradient->setStops(stops); + + paramChanged(); +} + +void KisStopGradientEditor::opacityChanged(qreal value) +{ + QList stops = m_gradient->stops(); + + int currentStop = gradientSlider->selectedStop(); + double t = stops[currentStop].first; + + KoColor c = stops[currentStop].second; + c.setOpacity(value); + + stops.removeAt(currentStop); + stops.insert(currentStop, KoGradientStop(t, c)); + + m_gradient->setStops(stops); + + paramChanged(); +} + + +void KisStopGradientEditor::nameChanged() +{ + m_gradient->setName(nameedit->text()); +} + +void KisStopGradientEditor::paramChanged() +{ + m_gradient->updatePreview(); + gradientSlider->update(); +} + +void KisStopGradientEditor::reverse() +{ + QList stops = m_gradient->stops(); + QList reversedStops; + for(const KoGradientStop& stop : stops) + { + reversedStops.push_front(KoGradientStop(1 - stop.first, stop.second)); + } + m_gradient->setStops(reversedStops); + gradientSlider->setSeletectStop(stops.size()-1 -gradientSlider->selectedStop()); + paramChanged(); +} + diff --git a/libs/ui/kis_stopgradient_editor.h b/libs/ui/kis_stopgradient_editor.h new file mode 100644 index 0000000000..88f9eebdd7 --- /dev/null +++ b/libs/ui/kis_stopgradient_editor.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2004 Cyrille Berger + * 2016 Sven Langkamp + * + * 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_STOPGRADIENT_EDITOR_H_ +#define _KIS_STOPGRADIENT_EDITOR_H_ + +#include "ui_wdgstopgradienteditor.h" + +class KoStopGradient; + +class KisStopGradientEditor : public QWidget, public Ui::KisWdgStopGradientEditor +{ + Q_OBJECT + +public: + KisStopGradientEditor(KoStopGradient* gradient, QWidget *parent, const char* name, const QString& caption); + void activate(); +private: + KoStopGradient* m_gradient; +private Q_SLOTS: + void stopChanged(int stop); + void colorChanged(const QColor& color); + void opacityChanged(qreal value); + void nameChanged(); + void reverse(); + + void paramChanged(); +}; + +#endif diff --git a/libs/ui/widgets/kis_gradient_chooser.cc b/libs/ui/widgets/kis_gradient_chooser.cc index c2fc53d209..a7c231dcda 100644 --- a/libs/ui/widgets/kis_gradient_chooser.cc +++ b/libs/ui/widgets/kis_gradient_chooser.cc @@ -1,153 +1,193 @@ /* * Copyright (c) 2004 Adrian Page * Copyright (C) 2011 Srikanth Tiyyagura * * 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 "widgets/kis_gradient_chooser.h" #include #include #include #include +#include #include #include #include #include +#include +#include #include #include #include +#include #include #include "KisViewManager.h" #include "kis_global.h" #include "kis_autogradient.h" #include "kis_canvas_resource_provider.h" +#include "kis_stopgradient_editor.h" -KisCustomGradientDialog::KisCustomGradientDialog(KoSegmentGradient* gradient, QWidget * parent, const char *name) +KisCustomGradientDialog::KisCustomGradientDialog(KoAbstractGradient* gradient, QWidget * parent, const char *name) : KoDialog(parent) { setCaption(i18n("Custom Gradient")); setButtons(Close); setDefaultButton(Close); setObjectName(name); setModal(false); - m_page = new KisAutogradient(gradient, this, "autogradient", i18n("Custom Gradient")); + + KoStopGradient* stopGradient = dynamic_cast(gradient); + if (stopGradient) { + m_page = new KisStopGradientEditor(stopGradient, this, "autogradient", i18n("Custom Gradient")); + } + KoSegmentGradient* segmentedGradient = dynamic_cast(gradient); + if (segmentedGradient) { + m_page = new KisAutogradient(segmentedGradient, this, "autogradient", i18n("Custom Gradient")); + } setMainWidget(m_page); } KisGradientChooser::KisGradientChooser(QWidget *parent, const char *name) : QFrame(parent) { setObjectName(name); m_lbName = new QLabel(); KoResourceServer * rserver = KoResourceServerProvider::instance()->gradientServer(false); QSharedPointer adapter (new KoResourceServerAdapter(rserver)); m_itemChooser = new KoResourceItemChooser(adapter, this); m_itemChooser->showTaggingBar(true); m_itemChooser->setFixedSize(250, 250); m_itemChooser->setColumnCount(1); connect(m_itemChooser, SIGNAL(resourceSelected(KoResource *)), this, SLOT(update(KoResource *))); connect(m_itemChooser, SIGNAL(resourceSelected(KoResource *)), this, SIGNAL(resourceSelected(KoResource *))); QWidget* buttonWidget = new QWidget(this); QHBoxLayout* buttonLayout = new QHBoxLayout(buttonWidget); - QPushButton* addGradient = new QPushButton(KisIconUtils::loadIcon("list-add"), i18n("Add..."), this); - connect(addGradient, SIGNAL(clicked()), this, SLOT(addGradient())); + QToolButton* addGradient = new QToolButton(this); + addGradient->setIcon(KisIconUtils::loadIcon("list-add")); + addGradient->setText(i18n("Add...")); + addGradient->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + connect(addGradient, SIGNAL(clicked()), this, SLOT(addStopGradient())); buttonLayout->addWidget(addGradient); + QMenu *menuAddGradient = new QMenu(); + + QAction* addStopGradient = new QAction(i18n("Stop gradient"), this); + connect(addStopGradient, SIGNAL(triggered(bool)), this, SLOT(addStopGradient())); + menuAddGradient->addAction(addStopGradient); + + QAction* addSegmentedGradient = new QAction(i18n("Segmented gradient"), this); + connect(addSegmentedGradient, SIGNAL(triggered(bool)), this, SLOT(addSegmentedGradient())); + menuAddGradient->addAction(addSegmentedGradient); + + addGradient->setMenu(menuAddGradient); + addGradient->setPopupMode(QToolButton::MenuButtonPopup); + m_editGradient = new QPushButton(KisIconUtils::loadIcon("configure"), i18n("Edit...")); m_editGradient->setEnabled(false); connect(m_editGradient, SIGNAL(clicked()), this, SLOT(editGradient())); buttonLayout->addWidget(m_editGradient); QVBoxLayout *mainLayout = new QVBoxLayout(this); mainLayout->setObjectName("main layout"); mainLayout->setMargin(2); mainLayout->addWidget(m_lbName); mainLayout->addWidget(m_itemChooser, 10); mainLayout->addWidget(buttonWidget); setLayout(mainLayout); } KisGradientChooser::~KisGradientChooser() { } KoResource *KisGradientChooser::currentResource() { return m_itemChooser->currentResource(); } void KisGradientChooser::setCurrentResource(KoResource *resource) { m_itemChooser->setCurrentResource(resource); } void KisGradientChooser::setCurrentItem(int row, int column) { m_itemChooser->setCurrentItem(row, column); if (currentResource()) update(currentResource()); } void KisGradientChooser::update(KoResource * resource) { KoAbstractGradient *gradient = static_cast(resource); m_lbName->setText(i18n(gradient->name().toUtf8().data())); - KoSegmentGradient *segmentGradient = dynamic_cast(gradient); - m_editGradient->setEnabled(segmentGradient && segmentGradient->removable()); + m_editGradient->setEnabled(gradient && gradient->removable()); } -void KisGradientChooser::addGradient() +void KisGradientChooser::addStopGradient() { - KoResourceServer * rserver = KoResourceServerProvider::instance()->gradientServer(); - QString saveLocation = rserver->saveLocation(); + KoStopGradient* gradient = new KoStopGradient(""); + + QList stops; + stops << KoGradientStop(0.0, KoColor(QColor(250, 250, 0), KoColorSpaceRegistry::instance()->rgb8())) << KoGradientStop(1.0, KoColor(QColor(255, 0, 0, 255), KoColorSpaceRegistry::instance()->rgb8())); + gradient->setType(QGradient::LinearGradient); + gradient->setStops(stops); + addGradient(gradient); +} +void KisGradientChooser::addSegmentedGradient() +{ KoSegmentGradient* gradient = new KoSegmentGradient(""); gradient->createSegment(INTERP_LINEAR, COLOR_INTERP_RGB, 0.0, 1.0, 0.5, Qt::black, Qt::white); gradient->setName(i18n("unnamed")); + addGradient(gradient); +} +void KisGradientChooser::addGradient(KoAbstractGradient* gradient) +{ + KoResourceServer * rserver = KoResourceServerProvider::instance()->gradientServer(); + QString saveLocation = rserver->saveLocation(); + KisCustomGradientDialog dialog(gradient, this, "autogradient"); dialog.exec(); - + gradient->setFilename(saveLocation + gradient->name() + gradient->defaultFileExtension()); gradient->setValid(true); rserver->addResource(gradient); m_itemChooser->setCurrentResource(gradient); } void KisGradientChooser::editGradient() { - KoSegmentGradient* gradient = dynamic_cast(currentResource()); - if (gradient) { - KisCustomGradientDialog dialog(gradient, this, "autogradient"); - dialog.exec(); - } + KisCustomGradientDialog dialog(static_cast(currentResource()), this, "autogradient"); + dialog.exec(); } diff --git a/libs/ui/widgets/kis_gradient_chooser.h b/libs/ui/widgets/kis_gradient_chooser.h index 6f08b35765..3a58fe3673 100644 --- a/libs/ui/widgets/kis_gradient_chooser.h +++ b/libs/ui/widgets/kis_gradient_chooser.h @@ -1,81 +1,85 @@ /* * Copyright (c) 2004 Adrian Page * * 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_GRADIENT_CHOOSER_H_ #define KIS_GRADIENT_CHOOSER_H_ #include #include #include -class KoSegmentGradient; +class KoAbstractGradient; +class KoStopGradient; class KisViewManager; class QLabel; class QPushButton; class KisAutogradient; class KoResource; class KoResourceItemChooser; class KisCustomGradientDialog : public KoDialog { Q_OBJECT public: - KisCustomGradientDialog(KoSegmentGradient* gradient, QWidget * parent, const char *name); + KisCustomGradientDialog(KoAbstractGradient* gradient, QWidget * parent, const char *name); private: - KisAutogradient * m_page; + QWidget * m_page; }; class KRITAUI_EXPORT KisGradientChooser : public QFrame { Q_OBJECT public: KisGradientChooser(QWidget *parent = 0, const char *name = 0); virtual ~KisGradientChooser(); /// Gets the currently selected resource /// @returns the selected resource, 0 is no resource is selected KoResource *currentResource(); void setCurrentResource(KoResource *resource); void setCurrentItem(int row, int column); Q_SIGNALS: /// Emitted when a resource was selected void resourceSelected(KoResource * resource); private Q_SLOTS: virtual void update(KoResource * resource); - void addGradient(); + void addStopGradient(); + void addSegmentedGradient(); void editGradient(); +private: + void addGradient(KoAbstractGradient* gradient); private: QLabel *m_lbName; KoResourceItemChooser * m_itemChooser; QPushButton* m_editGradient; }; #endif // KIS_GRADIENT_CHOOSER_H_ diff --git a/libs/ui/widgets/kis_stopgradient_slider_widget.cpp b/libs/ui/widgets/kis_stopgradient_slider_widget.cpp new file mode 100644 index 0000000000..8a02db371f --- /dev/null +++ b/libs/ui/widgets/kis_stopgradient_slider_widget.cpp @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2004 Cyrille Berger + * 2016 Sven Langkamp + * + * 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 "widgets/kis_stopgradient_slider_widget.h" +#include +#include +#include +#include +#include + +#define MARGIN 10 +#define HANDLE_SIZE 20 + +KisStopGradientSliderWidget::KisStopGradientSliderWidget(QWidget *parent, const char* name, Qt::WFlags f) + : QWidget(parent, f) + , m_selectedStop(0) + , m_drag(0) +{ + setMinimumHeight(30); +} + +void KisStopGradientSliderWidget::setGradientResource(KoStopGradient* gradient) +{ + m_gradient = gradient; + + emit sigSelectedStop(m_selectedStop); +} + +void KisStopGradientSliderWidget::paintEvent(QPaintEvent* pe) +{ + QWidget::paintEvent(pe); + QPainter painter(this); + painter.fillRect(rect(), palette().background()); + painter.setPen(Qt::black); + painter.drawRect(MARGIN, MARGIN, width() - 2 * MARGIN, height() - 2 * MARGIN - HANDLE_SIZE); + if (m_gradient) { + QImage image = m_gradient->generatePreview(width() - 2 * MARGIN - 2, height() - 2 * MARGIN - HANDLE_SIZE - 2); + QPixmap pixmap(image.width(), image.height()); + if (!image.isNull()) { + painter.drawImage(MARGIN + 1, MARGIN + 1, image); + } + + QPolygon triangle(3); + QList handlePositions = m_gradient->stops(); + int position; + for (int i = 0; i < handlePositions.count(); i++) { + position = qRound(handlePositions[i].first * (double)(width() - 2*MARGIN)) + MARGIN; + triangle[0] = QPoint(position, height() - HANDLE_SIZE - MARGIN); + triangle[1] = QPoint(position + (HANDLE_SIZE / 2 - 1), height() - MARGIN); + triangle[2] = QPoint(position - (HANDLE_SIZE / 2 - 1), height() - MARGIN); + + if(i != m_selectedStop) + painter.setPen(QPen(Qt::black, 2.0)); + else + painter.setPen(QPen(palette().highlight(), 2.0)); + painter.setBrush(QBrush(handlePositions[i].second.toQColor())); + painter.setRenderHint(QPainter::Antialiasing); + painter.drawPolygon(triangle); + } + } +} + +void KisStopGradientSliderWidget::mousePressEvent(QMouseEvent * e) +{ + if (e->x() < MARGIN || e->x() > width() - MARGIN) { + QWidget::mousePressEvent(e); + return; + } + + double t = (double)(e->x() - MARGIN) / (double)(width() - 2 * MARGIN); + if(e->y() < height() - HANDLE_SIZE - MARGIN) { + if(e->button() == Qt::LeftButton) + insertStop(t); + } + else { + QPolygon triangle(3); + QList stops = m_gradient->stops(); + int position; + for (int i = 0; i < stops.count(); i++) { + position = qRound(stops[i].first * (double)(width() - 2*MARGIN)) + MARGIN; + triangle[0] = QPoint(position, height() - HANDLE_SIZE - MARGIN); + triangle[1] = QPoint(position + (HANDLE_SIZE / 2 - 1), height() - MARGIN); + triangle[2] = QPoint(position - (HANDLE_SIZE / 2 - 1), height() - MARGIN); + + if(triangle.containsPoint(e->pos(), Qt::WindingFill)) + { + if(e->button() == Qt::LeftButton) { + m_selectedStop = i; + emit sigSelectedStop(m_selectedStop); + if(m_selectedStop > 0 && m_selectedStop < stops.size()-1) + m_drag = true; + } + else if (e->button() == Qt::RightButton && (i > 0 && i < stops.size()-1)) { + QList stops = m_gradient->stops(); + stops.removeAt(i); + m_gradient->setStops(stops); + if(m_selectedStop == i) + m_selectedStop = i-1; + else if (m_selectedStop > i) + m_selectedStop--; + } + break; + } + } + } + update(); +} + +void KisStopGradientSliderWidget::mouseReleaseEvent(QMouseEvent * e) +{ + Q_UNUSED(e); + m_drag = false; +} + +void KisStopGradientSliderWidget::mouseMoveEvent(QMouseEvent * e) +{ + if ((e->y() < MARGIN || e->y() > height() - MARGIN) || (e->x() < MARGIN || e->x() > width() - MARGIN)) { + QWidget::mouseMoveEvent(e); + return; + } + + double t = (double)(e->x() - MARGIN) / (double)(width() - 2 * MARGIN); + if (m_drag) { + QList stops = m_gradient->stops(); + + KoGradientStop dragedStop = stops[m_selectedStop]; + + t = qBound(stops[m_selectedStop-1].first, t, stops[m_selectedStop+1].first); + dragedStop.first = t; + + stops.removeAt(m_selectedStop); + stops.insert(m_selectedStop, dragedStop); + + m_gradient->setStops(stops); + } + + update(); +} + +void KisStopGradientSliderWidget::insertStop(double t) +{ + QList stopPositions = m_gradient->stops(); + int i = 0; + while(stopPositions[i].first < t) + i++; + + KoColor color; + m_gradient->colorAt(color, t); + stopPositions.insert(i, KoGradientStop(t, color)); + m_gradient->setStops(stopPositions); + + m_selectedStop = i; + emit sigSelectedStop(m_selectedStop); +} + +int KisStopGradientSliderWidget::selectedStop() +{ + return m_selectedStop; +} + +void KisStopGradientSliderWidget::setSeletectStop(int selected) +{ + m_selectedStop = selected; + emit sigSelectedStop(m_selectedStop); +} + + + diff --git a/libs/ui/widgets/kis_stopgradient_slider_widget.h b/libs/ui/widgets/kis_stopgradient_slider_widget.h new file mode 100644 index 0000000000..79335fbae9 --- /dev/null +++ b/libs/ui/widgets/kis_stopgradient_slider_widget.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2004 Cyrille Berger + * 2016 Sven Langkamp + * + * 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_STOP_GRADIENT_SLIDER_WIDGET_H_ +#define _KIS_STOP_GRADIENT_SLIDER_WIDGET_H_ + +#include +#include +#include + +#include + +class KisStopGradientSliderWidget : public QWidget +{ + Q_OBJECT + +public: + KisStopGradientSliderWidget(QWidget *parent = 0, const char* name = 0, Qt::WFlags f = 0); + +public: + virtual void paintEvent(QPaintEvent *); + void setGradientResource(KoStopGradient* gradient); + + int selectedStop(); + + void setSeletectStop(int selected); + +Q_SIGNALS: + void sigSelectedStop(int stop); + +protected: + virtual void mousePressEvent(QMouseEvent * e); + virtual void mouseReleaseEvent(QMouseEvent * e); + virtual void mouseMoveEvent(QMouseEvent * e); + +private Q_SLOTS: + +private: + void insertStop(double t); + +private: + KoStopGradient* m_gradient; + int m_selectedStop; + bool m_drag; +}; + +#endif