29#include <tqapplication.h>
34#include <tqscrollbar.h>
36#include <tqdockarea.h>
37#include <tqstringlist.h>
39#include <tqpopupmenu.h>
40#include <tqvaluelist.h>
41#include <tqstringlist.h>
42#include <tqobjectlist.h>
45#include <kis_meta_registry.h>
46#include <tdeglobalsettings.h>
47#include <dcopobject.h>
49#include <kcolordialog.h>
50#include <kiconloader.h>
51#include <tdefiledialog.h>
53#include <tdemessagebox.h>
54#include <knotifyclient.h>
56#include <kpushbutton.h>
57#include <kstatusbar.h>
58#include <kstdaction.h>
59#include <kinputdialog.h>
61#include <tdepopupmenu.h>
63#include <ksharedptr.h>
64#include <tdetoolbar.h>
65#include <tdeparts/plugin.h>
68#include <tdeparts/componentfactory.h>
69#include <tdeparts/event.h>
72#include <KoPartSelectAction.h>
73#include <KoFilterManager.h>
74#include <KoMainWindow.h>
77#include <ko_gray_widget.h>
78#include <ko_hsv_widget.h>
79#include <ko_rgb_widget.h>
80#include <kopalettemanager.h>
85#include "kis_button_press_event.h"
86#include "kis_button_release_event.h"
87#include "kis_canvas.h"
88#include "kis_canvas_painter.h"
90#include "kis_colorspace_factory_registry.h"
91#include "kis_config.h"
92#include "kis_controlframe.h"
93#include "kis_cursor.h"
95#include "kis_double_click_event.h"
96#include "kis_factory.h"
97#include "kis_filter_strategy.h"
98#include "kis_gradient.h"
99#include "kis_group_layer.h"
100#include "kis_adjustment_layer.h"
101#include "kis_paint_device.h"
102#include "kis_tool_freehand.h"
104#include "kis_layerbox.h"
105#include "kis_import_catcher.h"
106#include "kis_layer.h"
107#include "kis_paint_layer.h"
108#include "kis_move_event.h"
109#include "kis_paint_device.h"
110#include "kis_painter.h"
111#include "kis_paintop_registry.h"
112#include "kis_part_layer.h"
113#include "kis_part_layer_handler.h"
114#include "kis_pattern.h"
115#include "kis_profile.h"
117#include "kis_resource.h"
118#include "kis_palette.h"
119#include "kis_ruler.h"
120#include "kis_selection.h"
121#include "KoToolBox.h"
123#include "kis_tool_manager.h"
124#include "kis_transaction.h"
125#include "kis_selected_transaction.h"
126#include "kis_types.h"
127#include "kis_undo_adapter.h"
129#include "kis_view_iface.h"
130#include "kis_label_progress.h"
131#include "kis_opengl_image_context.h"
132#include "kis_background.h"
133#include "kis_paint_device_action.h"
134#include "kis_filter_configuration.h"
135#include "kis_transform_worker.h"
136#include "kis_shear_visitor.h"
138#include <kis_resourceserver.h>
139#include <kis_resource_mediator.h>
141#include "kis_icon_item.h"
142#include "kis_palette_widget.h"
143#include "kis_birdeye_box.h"
144#include "kis_color.h"
145#include "kis_factory.h"
148#include "kis_dlg_new_layer.h"
149#include "kis_dlg_layer_properties.h"
150#include "kis_dlg_preferences.h"
151#include "kis_dlg_image_properties.h"
152#include "kis_dlg_adjustment_layer.h"
153#include "kis_dlg_adj_layer_props.h"
156#include "kis_selection_manager.h"
157#include "kis_filter_manager.h"
158#include "kis_grid_manager.h"
159#include "kis_perspective_grid_manager.h"
161#include "kis_custom_palette.h"
162#include "wdgpalettechooser.h"
169#define MOUSE_CHANGE_EVENT_DELAY 100
171KisView::KisView(KisDoc *doc, KisUndoAdapter *adapter, TQWidget *parent,
const char *name)
172 : super(doc, parent, name)
173 , KXMLGUIBuilder( shell() )
180 , m_perspectiveGridManager( 0 )
181 , m_selectionManager( 0 )
182 , m_filterManager( 0 )
183 , m_paletteManager( 0 )
185 , m_actLayerVis( false )
189 , m_imgMergeLayer( 0 )
191 , m_imgResizeToLayer( 0 )
193 , m_actionPartLayer( 0 )
199 , m_layerProperties( 0 )
206 , m_actualPixels( 0 )
210 , m_imgProperties( 0 )
218 , m_canvasXOffset( 0)
219 , m_canvasYOffset( 0)
220 , m_paintViewEnabled( false )
221 , m_guiActivateEventReceived( false )
222 , m_showEventReceived( false )
223 , m_imageLoaded( false )
225 , m_adapter( adapter )
226 , m_statusBarZoomLabel( 0 )
227 , m_statusBarSelectionLabel( 0 )
228 , m_statusBarProfileLabel( 0 )
235 , m_toolIsPainting( false )
236 , m_monitorProfile( 0 )
246 m_currentColorChooserDisplay =
KisID(
"BLA");
247 setFocusPolicy( TQWidget::StrongFocus );
251 KisCanvasWidget::initX11Support();
255 tqApp->installEventFilter(
this);
257 m_tabletEventTimer.start();
258 m_inputDevice = KisInputDevice::mouse();
260 connect(&m_initialZoomTimer, TQ_SIGNAL(timeout()), TQ_SLOT(slotInitialZoomTimeout()));
262 m_paletteManager =
new KoPaletteManager(
this, actionCollection(),
"Chalk palette manager");
263 if (cfg.fixDockerWidth()) m_paletteManager->setFixedWidth( 360 );
265 m_paletteManager->createPalette( chalk::CONTROL_PALETTE, i18n(
"Control box"));
266 m_paletteManager->createPalette( chalk::COLORBOX, i18n(
"Colors"));
267 m_paletteManager->createPalette( chalk::LAYERBOX, i18n(
"Layers"));
271 m_toolManager =
new KisToolManager(canvasSubject(), getCanvasController());
272 m_gridManager =
new KisGridManager(
this);
273 m_perspectiveGridManager =
new KisPerspectiveGridManager(
this);
276 m_image = m_doc->currentImage();
283 setInstance(KisFactory::instance(),
false);
284 setClientBuilder(
this );
286 if (!doc->isReadWrite())
287 setXMLFile(
"chalk_readonly.rc");
289 setXMLFile(
"chalk.rc");
291 KStdAction::keyBindings( mainWindow()->guiFactory(), TQ_SLOT( configureShortcuts() ), actionCollection() );
305 connect(
this, TQ_SIGNAL(autoScroll(
const TQPoint &)), TQ_SLOT(slotAutoScroll(
const TQPoint &)));
307 setMouseTracking(
true);
309 resetMonitorProfile();
316 TDETrader::OfferList offers = TDETrader::self()->query(TQString::fromLatin1(
"Chalk/ViewPlugin"),
317 TQString::fromLatin1(
"(Type == 'Service') and "
318 "([X-Chalk-Version] == 2)"));
319 TDETrader::OfferList::ConstIterator iter;
320 for(iter = offers.begin(); iter != offers.end(); ++iter)
322 KService::Ptr service = *iter;
324 KParts::Plugin* plugin =
325 KParts::ComponentFactory::createInstanceFromService<KParts::Plugin> ( service,
this, 0, TQStringList(), &errCode);
327 kdDebug(41006) <<
"found plugin " << service->property(
"Name").toString() <<
"\n";
328 insertChildClient(plugin);
331 kdDebug(41006) <<
"found plugin " << service->property(
"Name").toString() <<
", " << errCode <<
"\n";
332 if( errCode == KParts::ComponentFactory::ErrNoLibrary)
334 kdWarning(41006) <<
" Error loading plugin was : ErrNoLibrary " << KLibLoader::self()->lastErrorMessage() << endl;
339 if(!doc->isLoading())
341 slotLoadingFinished();
343 connect(doc, TQ_SIGNAL(loadingFinished()),
this, TQ_SLOT(slotLoadingFinished()));
352 cfg.setShowRulers( m_RulerAction->isChecked() );
355 delete m_paletteManager;
356 delete m_selectionManager;
357 delete m_filterManager;
358 delete m_toolManager;
363static TQt::Dock stringToDock(
const TQString& attrPosition )
365 TDEToolBar::Dock dock = TDEToolBar::DockTop;
366 if ( !attrPosition.isEmpty() ) {
367 if ( attrPosition ==
"top" )
369 else if ( attrPosition ==
"left" )
370 dock = TQt::DockLeft;
371 else if ( attrPosition ==
"right" )
372 dock = TQt::DockRight;
373 else if ( attrPosition ==
"bottom" )
374 dock = TQt::DockBottom;
375 else if ( attrPosition ==
"floating" )
376 dock = TQt::DockTornOff;
377 else if ( attrPosition ==
"flat" )
378 dock = TQt::DockMinimized;
383TQWidget * KisView::createContainer( TQWidget *parent,
int index,
const TQDomElement &element,
int &
id )
385 if( element.attribute(
"name" ) ==
"ToolBox" )
387 m_toolBox =
new KoToolBox(mainWindow(),
"ToolBox", KisFactory::instance(), NUMBER_OF_TOOLTYPES);
388 m_toolBox->setLabel(i18n(
"Chalk"));
389 m_toolManager->setUp(m_toolBox, m_paletteManager, actionCollection());
391 Dock dock = stringToDock( element.attribute(
"position" ).lower() );
393 mainWindow()->addDockWindow( m_toolBox, dock,
false);
394 mainWindow()->moveDockWindow( m_toolBox, dock,
false, 0, 0 );
397 return KXMLGUIBuilder::createContainer( parent, index, element,
id );
401void KisView::removeContainer( TQWidget *container, TQWidget *parent, TQDomElement &element,
int id )
405 if( shell() && container == m_toolBox )
408 m_toolManager->youAintGotNoToolBox();
411 KXMLGUIBuilder::removeContainer( container, parent, element,
id );
415KoPaletteManager * KisView::paletteManager()
417 if (!m_paletteManager) {
418 m_paletteManager =
new KoPaletteManager(
this, actionCollection(),
"Chalk palette manager");
419 TQ_CHECK_PTR(m_paletteManager);
421 return m_paletteManager;
424void KisView::createLayerBox()
426 m_layerBox =
new KisLayerBox(
this);
427 m_layerBox->setCaption(i18n(
"Layers"));
429 connect(m_layerBox, TQ_SIGNAL(sigRequestLayer(KisGroupLayerSP, KisLayerSP)),
430 this, TQ_SLOT(addLayer(KisGroupLayerSP, KisLayerSP)));
431 connect(m_layerBox, TQ_SIGNAL(sigRequestGroupLayer(KisGroupLayerSP, KisLayerSP)),
432 this, TQ_SLOT(addGroupLayer(KisGroupLayerSP, KisLayerSP)));
433 connect(m_layerBox, TQ_SIGNAL(sigRequestAdjustmentLayer(KisGroupLayerSP, KisLayerSP)),
434 this, TQ_SLOT(addAdjustmentLayer(KisGroupLayerSP, KisLayerSP)));
435 connect(m_layerBox, TQ_SIGNAL(sigRequestPartLayer(KisGroupLayerSP, KisLayerSP,
const KoDocumentEntry&)),
436 this, TQ_SLOT(addPartLayer(KisGroupLayerSP, KisLayerSP,
const KoDocumentEntry&)));
437 connect(m_layerBox, TQ_SIGNAL(sigRequestLayerProperties(KisLayerSP)),
438 this, TQ_SLOT(showLayerProperties(KisLayerSP)));
439 connect(m_layerBox, TQ_SIGNAL(sigOpacityChanged(
int,
bool)),
this, TQ_SLOT(layerOpacity(
int,
bool)));
440 connect(m_layerBox, TQ_SIGNAL(sigOpacityFinishedChanging(
int,
int)),
441 this, TQ_SLOT(layerOpacityFinishedChanging(
int,
int)));
442 connect(m_layerBox, TQ_SIGNAL(sigItemComposite(
const KisCompositeOp&)),
this, TQ_SLOT(layerCompositeOp(
const KisCompositeOp&)));
444 paletteManager()->addWidget(m_layerBox,
"layerbox", chalk::LAYERBOX, 0);
448DCOPObject* KisView::dcopObject()
452 TQ_CHECK_PTR(m_dcop);
457void KisView::setupScrollBars()
461 m_vScroll =
new TQScrollBar(TQt::Vertical,
this);
462 TQ_CHECK_PTR(m_vScroll);
464 m_hScroll =
new TQScrollBar(TQt::Horizontal,
this);
465 TQ_CHECK_PTR(m_hScroll);
467 m_vScroll->setGeometry(width() - 16, 20, 16, height() - 36);
468 m_hScroll->setGeometry(20, height() - 16, width() - 36, 16);
469 m_hScroll->setValue(0);
470 m_vScroll->setValue(0);
471 TQObject::connect(m_vScroll, TQ_SIGNAL(valueChanged(
int)),
this, TQ_SLOT(scrollV(
int)));
472 TQObject::connect(m_hScroll, TQ_SIGNAL(valueChanged(
int)),
this, TQ_SLOT(scrollH(
int)));
475void KisView::setupRulers()
477 m_hRuler =
new KisRuler(TQt::Horizontal,
this);
478 TQ_CHECK_PTR(m_hRuler);
480 m_vRuler =
new KisRuler(TQt::Vertical,
this);
481 TQ_CHECK_PTR(m_vRuler);
483 m_hRuler->setGeometry(20, 0, width() - 20, 20);
484 m_vRuler->setGeometry(0, 20, 20, height() - 20);
487 m_hRuler->installEventFilter(
this);
488 m_vRuler->installEventFilter(
this);
494void KisView::updateStatusBarZoomLabel ()
496 if (zoom() < 1 - EPSILON) {
497 m_statusBarZoomLabel->setText(i18n(
"Zoom %1%").arg(zoom() * 100, 0,
'g', 4));
499 m_statusBarZoomLabel->setText(i18n(
"Zoom %1%").arg(zoom() * 100, 0,
'f', 0));
501 m_statusBarZoomLabel->setMaximumWidth(m_statusBarZoomLabel->fontMetrics().width(i18n(
"Zoom %1%").arg(
"0.8888 ")));
504void KisView::updateStatusBarSelectionLabel()
506 if (m_statusBarSelectionLabel == 0) {
510 KisImageSP img = currentImg();
512 KisPaintDeviceSP dev = img->activeDevice();
514 if (dev->hasSelection()) {
515 TQRect r = dev->selection()->selectedExactRect();
516 m_statusBarSelectionLabel->setText( i18n(
"Selection Active: x = %1 y = %2 width = %3 height = %4").arg(r.x()).arg(r.y()).arg( r.width()).arg( r.height()));
522 m_statusBarSelectionLabel->setText(i18n(
"No Selection"));
525void KisView::updateStatusBarProfileLabel()
527 if (m_statusBarProfileLabel == 0) {
531 KisImageSP img = currentImg();
534 if (img->getProfile() == 0) {
535 m_statusBarProfileLabel->setText(i18n(
"No profile"));
538 m_statusBarProfileLabel->setText(img->colorSpace()->id().name() +
" " + img->getProfile()->productName());
543KisProfile * KisView::monitorProfile()
545 if (m_monitorProfile == 0) {
546 resetMonitorProfile();
548 return m_monitorProfile;
552void KisView::resetMonitorProfile()
554 m_monitorProfile = KisProfile::getScreenProfile();
556 if (m_monitorProfile == 0) {
558 TQString monitorProfileName = cfg.monitorProfile();
559 m_monitorProfile = KisMetaRegistry::instance()->csRegistry()->
getProfileByName(monitorProfileName);
564void KisView::setupStatusBar()
566 KStatusBar *sb = statusBar();
569 m_statusBarZoomLabel =
new TQLabel(sb);
570 addStatusBarItem(m_statusBarZoomLabel,1);
571 updateStatusBarZoomLabel();
573 m_statusBarSelectionLabel =
new KSqueezedTextLabel(sb);
574 addStatusBarItem(m_statusBarSelectionLabel,2);
575 updateStatusBarSelectionLabel();
577 m_statusBarProfileLabel =
new KSqueezedTextLabel(sb);
578 addStatusBarItem(m_statusBarProfileLabel,3);
579 updateStatusBarProfileLabel();
583 m_progress =
new KisLabelProgress(
this);
584 m_progress->setMaximumWidth(225);
585 m_progress->setMinimumWidth(225);
586 m_progress->setMaximumHeight(fontMetrics().height() );
587 addStatusBarItem(m_progress, 2,
true);
593void KisView::setupActions()
597 m_selectionManager->setup(actionCollection());
598 m_filterManager->setup(actionCollection());
599 m_gridManager->setup(actionCollection());
600 m_perspectiveGridManager->setup(actionCollection());
603 m_fullScreen = KStdAction::fullScreen( NULL, NULL, actionCollection(),
this );
604 connect( m_fullScreen, TQ_SIGNAL( toggled(
bool )),
this, TQ_SLOT( slotUpdateFullScreen(
bool )));
606 m_imgProperties =
new TDEAction(i18n(
"Image Properties"), 0,
this, TQ_SLOT(slotImageProperties()), actionCollection(),
"img_properties");
608 m_imgResizeToLayer =
new TDEAction(i18n(
"Resize Image to Size of Current Layer"), 0,
this, TQ_SLOT(imgResizeToActiveLayer()), actionCollection(),
"resizeimgtolayer");
611 m_zoomIn = KStdAction::zoomIn(
this, TQ_SLOT(slotZoomIn()), actionCollection(),
"zoom_in");
612 m_zoomOut = KStdAction::zoomOut(
this, TQ_SLOT(slotZoomOut()), actionCollection(),
"zoom_out");
613 m_actualPixels =
new TDEAction(i18n(
"Actual Pixels"),
"Ctrl+0",
this, TQ_SLOT(slotActualPixels()), actionCollection(),
"actual_pixels");
614 m_actualSize = KStdAction::actualSize(
this, TQ_SLOT(slotActualSize()), actionCollection(),
"actual_size");
615 m_actualSize->setEnabled(
false);
616 m_fitToCanvas = KStdAction::fitToPage(
this, TQ_SLOT(slotFitToCanvas()), actionCollection(),
"fit_to_canvas");
619 m_layerAdd =
new TDEAction(i18n(
"&Add..."),
"Ctrl+Shift+N",
this, TQ_SLOT(layerAdd()), actionCollection(),
"insert_layer");
621 m_actionPartLayer =
new KoPartSelectAction( i18n(
"&Object Layer" ),
"frame_query",
622 this, TQ_SLOT( addPartLayer() ),
623 actionCollection(),
"insert_part_layer" );
626 m_actionAdjustmentLayer =
new TDEAction( i18n(
"&Adjustment Layer" ), 0,
627 this, TQ_SLOT( addAdjustmentLayer() ),
628 actionCollection(),
"insert_adjustment_layer" );
631 m_layerRm =
new TDEAction(i18n(
"&Remove"), 0,
this, TQ_SLOT(layerRemove()), actionCollection(),
"remove_layer");
632 m_layerDup =
new TDEAction(i18n(
"Duplicate"), 0,
this, TQ_SLOT(layerDuplicate()), actionCollection(),
"duplicate_layer");
633 m_layerHide =
new TDEToggleAction(i18n(
"&Hide"), 0,
this, TQ_SLOT(layerToggleVisible()), actionCollection(),
"hide_layer");
634 m_layerHide->setCheckedState(KGuiItem(i18n(
"&Show")));
635 m_layerHide->setChecked(
false);
637 m_layerRaise =
new TDEAction(i18n(
"Raise"),
"raise",
"Ctrl+]",
this, TQ_SLOT(layerRaise()), actionCollection(),
"raiselayer");
638 m_layerLower =
new TDEAction(i18n(
"Lower"),
"lower",
"Ctrl+[",
this, TQ_SLOT(layerLower()), actionCollection(),
"lowerlayer");
639 m_layerTop =
new TDEAction(i18n(
"To Top"),
"bring_forward",
"Ctrl+Shift+]",
this, TQ_SLOT(layerFront()), actionCollection(),
"toplayer");
640 m_layerBottom =
new TDEAction(i18n(
"To Bottom"),
"send_backward",
"Ctrl+Shift+[",
this, TQ_SLOT(layerBack()), actionCollection(),
"bottomlayer");
641 m_layerProperties =
new TDEAction(i18n(
"Properties"), 0,
this, TQ_SLOT(layerProperties()), actionCollection(),
"layer_properties");
642 (void)
new TDEAction(i18n(
"I&nsert Image as Layer..."), 0,
this, TQ_SLOT(slotInsertImageAsLayer()), actionCollection(),
"insert_image_as_layer");
643 m_layerSaveAs =
new TDEAction(i18n(
"Save Layer as Image..."),
"document-save",
this, TQ_SLOT(saveLayerAsImage()), actionCollection(),
"save_layer_as_image");
644 (void)
new TDEAction(i18n(
"Flip on &X Axis"),
"view_left_right", 0,
this, TQ_SLOT(mirrorLayerX()), actionCollection(),
"mirrorLayerX");
645 (void)
new TDEAction(i18n(
"Flip on &Y Axis"),
"view_top_bottom", 0,
this, TQ_SLOT(mirrorLayerY()), actionCollection(),
"mirrorLayerY");
647 m_createMask =
new TDEAction(i18n(
"Create Mask"), 0,
this,
648 TQ_SLOT(slotCreateMask()), actionCollection(),
"create_mask");
649 m_maskFromSelection =
new TDEAction(i18n(
"Mask From Selection"), 0,
this,
650 TQ_SLOT(slotMaskFromSelection()), actionCollection(),
652 m_maskToSelection =
new TDEAction(i18n(
"Mask to Selection"), 0,
this,
653 TQ_SLOT(slotMaskToSelection()), actionCollection(),
"mask_tosel");
654 m_applyMask =
new TDEAction(i18n(
"Apply Mask"), 0,
this, TQ_SLOT(slotApplyMask()),
655 actionCollection(),
"apply_mask");
656 m_removeMask =
new TDEAction(i18n(
"Remove Mask"), 0,
this,
657 TQ_SLOT(slotRemoveMask()), actionCollection(),
"remove_mask");
658 m_showMask =
new TDEToggleAction(i18n(
"Show Mask" ), 0,
this,
659 TQ_SLOT(slotShowMask()), actionCollection(),
"show_mask");
660 m_editMask =
new TDEToggleAction(i18n(
"Edit Mask" ), 0,
this,
661 TQ_SLOT(slotEditMask()), actionCollection(),
"edit_mask");
664 m_imgFlatten =
new TDEAction(i18n(
"&Flatten Image"),
"Ctrl+Shift+E",
this, TQ_SLOT(flattenImage()), actionCollection(),
"flatten_image");
665 m_imgMergeLayer =
new TDEAction(i18n(
"&Merge with Layer Below"),
"Ctrl+E",
this, TQ_SLOT(mergeLayer()), actionCollection(),
"merge_layer");
668 KStdAction::preferences(
this, TQ_SLOT(preferences()), actionCollection(),
"preferences");
670 m_RulerAction =
new TDEToggleAction( i18n(
"Show Rulers" ),
"Ctrl+R",
this, TQ_SLOT( showRuler() ), actionCollection(),
"view_ruler" );
671 m_RulerAction->setChecked(cfg.showRulers());
672 m_RulerAction->setCheckedState(i18n(
"Hide Rulers"));
673 m_RulerAction->setWhatsThis( i18n(
"The rulers show the horizontal and vertical positions of the mouse on the image "
674 "and can be used to position your mouse at the right place on the canvas. <p>Uncheck this to disable "
675 "the rulers from being displayed." ) );
680 new TDEAction(i18n(
"Add New Palette..."), 0,
this, TQ_SLOT(slotAddPalette()),
681 actionCollection(),
"add_palette");
682 new TDEAction(i18n(
"Edit Palette..."), 0,
this, TQ_SLOT(slotEditPalette()),
683 actionCollection(),
"edit_palette");
690void KisView::resizeEvent(TQResizeEvent *)
692 if (!m_paintViewEnabled) {
693 startInitialZoomTimerIfReady();
696 KisImageSP img = currentImg();
697 TQ_INT32 scrollBarExtent = style().pixelMetric(TQStyle::PM_ScrollBarExtent);
708 docW =
static_cast<TQ_INT32
>(ceil(docWidth() * zoom()));
709 docH =
static_cast<TQ_INT32
>(ceil(docHeight() * zoom()));
711 m_rulerThickness = m_RulerAction->isChecked() ? RULER_THICKNESS : 0;
712 drawH = height() - m_rulerThickness;
713 drawW = width() - m_rulerThickness;
717 drawW -= scrollBarExtent;
720 drawH -= scrollBarExtent;
721 }
else if (drawW < docW) {
723 drawH -= scrollBarExtent;
726 drawW -= scrollBarExtent;
729 m_vScroll->setEnabled(docH > drawH);
730 m_hScroll->setEnabled(docW > drawW);
732 if (docH <= drawH && docW <= drawW) {
736 m_vScroll->setValue(0);
737 m_hScroll->setValue(0);
738 m_vScrollBarExtent = 0;
739 m_hScrollBarExtent = 0;
740 }
else if (docH <= drawH) {
743 m_vScroll->setValue(0);
744 m_hScroll->setRange(0, docW - drawW);
745 m_hScroll->setGeometry(m_rulerThickness,
746 height() - scrollBarExtent,
747 width() - m_rulerThickness,
750 m_hScrollBarExtent = scrollBarExtent;
751 m_hScrollBarExtent = scrollBarExtent;
752 }
else if(docW <= drawW) {
755 m_hScroll->setValue(0);
756 m_vScroll->setRange(0, docH - drawH);
757 m_vScroll->setGeometry(width() - scrollBarExtent, m_rulerThickness, scrollBarExtent, height() - m_rulerThickness);
759 m_vScrollBarExtent = scrollBarExtent;
762 m_vScroll->setRange(0, docH - drawH);
763 m_vScroll->setGeometry(width() - scrollBarExtent,
766 height() -2* m_rulerThickness);
767 m_hScroll->setRange(0, docW - drawW);
768 m_hScroll->setGeometry(m_rulerThickness,
769 height() - scrollBarExtent,
770 width() - 2*m_rulerThickness,
774 m_vScrollBarExtent = scrollBarExtent;
775 m_hScrollBarExtent = scrollBarExtent;
778 TQ_INT32 oldCanvasXOffset = m_canvasXOffset;
779 TQ_INT32 oldCanvasYOffset = m_canvasYOffset;
782 m_canvasXOffset = (drawW - docW) / 2;
788 m_canvasYOffset = (drawH - docH) / 2;
794 if( m_RulerAction->isChecked() )
795 m_canvas->setGeometry(m_rulerThickness, m_rulerThickness, drawW, drawH);
797 m_canvas->setGeometry(0, 0, drawW, drawH);
800 if (!m_canvas->isOpenGLCanvas()) {
802 if (m_canvasPixmap.size() != TQSize(drawW, drawH)) {
804 TQ_INT32 oldCanvasWidth = m_canvasPixmap.width();
805 TQ_INT32 oldCanvasHeight = m_canvasPixmap.height();
807 TQ_INT32 newCanvasWidth = drawW;
808 TQ_INT32 newCanvasHeight = drawH;
810 TQRegion exposedRegion = TQRect(0, 0, newCanvasWidth, newCanvasHeight);
813 m_canvasPixmap.resize(TQMAX(oldCanvasWidth, newCanvasWidth), TQMAX(oldCanvasHeight, newCanvasHeight));
815 if (!m_canvasPixmap.isNull()) {
817 if (oldCanvasXOffset != m_canvasXOffset || oldCanvasYOffset != m_canvasYOffset) {
826 if (oldCanvasXOffset <= m_canvasXOffset) {
829 dstX = m_canvasXOffset - oldCanvasXOffset;
830 srcWidth = oldCanvasWidth;
833 srcX = oldCanvasXOffset - m_canvasXOffset;
835 srcWidth = newCanvasWidth;
838 if (oldCanvasYOffset <= m_canvasYOffset) {
841 dstY = m_canvasYOffset - oldCanvasYOffset;
842 srcHeight = oldCanvasHeight;
845 srcY = oldCanvasYOffset - m_canvasYOffset;
847 srcHeight = newCanvasHeight;
850 bitBlt(&m_canvasPixmap, dstX, dstY, &m_canvasPixmap, srcX, srcY, srcWidth, srcHeight);
851 exposedRegion -= TQRegion(TQRect(dstX, dstY, srcWidth, srcHeight));
853 exposedRegion -= TQRegion(TQRect(0, 0, oldCanvasWidth, oldCanvasHeight));
857 m_canvasPixmap.resize(newCanvasWidth, newCanvasHeight);
859 if (!m_canvasPixmap.isNull() && !exposedRegion.isEmpty()) {
861 TQMemArray<TQRect> rects = exposedRegion.rects();
863 for (
unsigned int i = 0; i < rects.count(); i++) {
865 updateTQPaintDeviceCanvas(viewToWindow(r));
871 int fontheight = TQFontMetrics(TDEGlobalSettings::generalFont()).height() * 3;
872 m_vScroll->setPageStep(drawH);
873 m_vScroll->setLineStep(fontheight);
874 m_hScroll->setPageStep(drawW);
875 m_hScroll->setLineStep(fontheight);
877 m_hRuler->setGeometry(m_rulerThickness + m_canvasXOffset, 0, TQMIN(docW, drawW), m_rulerThickness);
878 m_vRuler->setGeometry(0, m_rulerThickness + m_canvasYOffset, m_rulerThickness, TQMIN(docH, drawH));
880 if (m_vScroll->isVisible())
881 m_vRuler->updateVisibleArea(0, m_vScroll->value());
883 m_vRuler->updateVisibleArea(0, 0);
885 if (m_hScroll->isVisible())
886 m_hRuler->updateVisibleArea(m_hScroll->value(), 0);
888 m_hRuler->updateVisibleArea(0, 0);
890 if( m_RulerAction->isChecked() )
900 emit viewTransformationsChanged();
903void KisView::styleChange(TQStyle& oldStyle)
906 m_canvas->updateGeometry();
910void KisView::paletteChange(
const TQPalette& oldPalette)
912 Q_UNUSED(oldPalette);
916void KisView::showEvent(TQShowEvent *)
918 if (!m_showEventReceived) {
919 m_showEventReceived =
true;
920 startInitialZoomTimerIfReady();
924void KisView::updateReadWrite(
bool readwrite)
926 layerUpdateGUI(readwrite);
929TQ_INT32 KisView::horzValue()
const
931 return m_hScroll->value() - m_canvasXOffset;
934TQ_INT32 KisView::vertValue()
const
936 return m_vScroll->value() - m_canvasYOffset;
939void KisView::updateTQPaintDeviceCanvas(
const TQRect& imageRect)
941 TQRect vr = windowToView(imageRect);
942 vr &= TQRect(0, 0, m_canvas->width(), m_canvas->height());
948 if (!m_canvasPixmap.isNull() && gc.begin(&m_canvasPixmap)) {
950 KisImageSP img = currentImg();
952 if (img && m_paintViewEnabled) {
954 TQRect wr = viewToWindow(vr);
956 if (wr.left() < 0 || wr.right() >= img->width() || wr.top() < 0 || wr.bottom() >= img->height()) {
959 rg -= TQRegion(windowToView(TQRect(0, 0, img->width(), img->height())));
961 TQMemArray<TQRect> rects = rg.rects();
963 for (
unsigned int i = 0; i < rects.count(); i++) {
964 TQRect er = rects[i];
965 gc.fillRect(er, colorGroup().mid());
967 wr &= TQRect(0, 0, img->width(), img->height());
972 KisImage::PaintFlags paintFlags = (KisImage::PaintFlags)KisImage::PAINT_BACKGROUND;
975 paintFlags = (KisImage::PaintFlags)(paintFlags|KisImage::PAINT_MASKINACTIVELAYERS);
978 if (m_selectionManager->displaySelection())
980 paintFlags = (KisImage::PaintFlags)(paintFlags|KisImage::PAINT_SELECTION);
983 if (zoom() > 1.0 - EPSILON) {
985 gc.setWorldXForm(
true);
986 gc.translate(-horzValue(), -vertValue());
987 gc.scale(zoomFactor(), zoomFactor());
989 m_image->renderToPainter(wr.left(), wr.top(),
990 wr.right(), wr.bottom(), gc, monitorProfile(),
991 paintFlags, HDRExposure());
994 TQRect canvasRect = windowToView(wr);
995 TQRect scaledImageRect = canvasRect;
996 scaledImageRect.moveBy(horzValue(), vertValue());
998 TQSize scaledImageSize(
static_cast<TQ_INT32
>(ceil(docWidth() * zoom())),
999 static_cast<TQ_INT32
>(ceil(docHeight() * zoom())));
1001 TQImage image = m_image->convertToTQImage(scaledImageRect, scaledImageSize,
1002 monitorProfile(), paintFlags, HDRExposure());
1004 gc.drawImage(canvasRect.topLeft(), image, image.rect());
1007 gc.setWorldXForm(
true);
1008 gc.translate(-horzValue(), -vertValue());
1009 gc.scale(zoomFactor(), zoomFactor());
1012 m_gridManager->drawGrid( wr, &gc );
1013 m_perspectiveGridManager->drawGrid( wr, &gc );
1017 gc.fillRect(vr, colorGroup().mid());
1023void KisView::paintTQPaintDeviceView(
const TQRegion& canvasRegion)
1025 Q_ASSERT(m_canvas->TQPaintDeviceWidget() != 0);
1027 if (m_canvas->TQPaintDeviceWidget() != 0 && !m_canvasPixmap.isNull()) {
1028 TQMemArray<TQRect> rects = canvasRegion.rects();
1030 for (
unsigned int i = 0; i < rects.count(); i++) {
1031 TQRect r = rects[i];
1033 bitBlt(m_canvas->TQPaintDeviceWidget(), r.x(), r.y(), &m_canvasPixmap,
1034 r.x(), r.y(), r.width(), r.height());
1037 paintToolOverlay(canvasRegion);
1041void KisView::updateOpenGLCanvas(
const TQRect& imageRect)
1044 KisImageSP img = currentImg();
1046 if (img && m_paintViewEnabled) {
1047 Q_ASSERT(m_OpenGLImageContext != 0);
1049 if (m_OpenGLImageContext != 0) {
1050 m_OpenGLImageContext->update(imageRect);
1054 Q_UNUSED(imageRect);
1058void KisView::paintOpenGLView(
const TQRect& canvasRect)
1061 if (!m_canvas->isUpdatesEnabled()) {
1065 m_canvas->OpenGLWidget()->makeCurrent();
1067 glDrawBuffer(GL_BACK);
1069 TQColor widgetBackgroundColor = colorGroup().mid();
1071 glClearColor(widgetBackgroundColor.red() / 255.0, widgetBackgroundColor.green() / 255.0, widgetBackgroundColor.blue() / 255.0, 1.0);
1072 glClear(GL_COLOR_BUFFER_BIT);
1074 KisImageSP img = currentImg();
1076 if (img && m_paintViewEnabled) {
1078 TQRect vr = canvasRect;
1079 vr &= TQRect(0, 0, m_canvas->width(), m_canvas->height());
1083 glMatrixMode(GL_PROJECTION);
1085 glViewport(0, 0, m_canvas->width(), m_canvas->height());
1086 glOrtho(0, m_canvas->width(), m_canvas->height(), 0, -1, 1);
1088 glMatrixMode(GL_MODELVIEW);
1091 glBindTexture(GL_TEXTURE_2D, m_OpenGLImageContext->backgroundTexture());
1093 glTranslatef(m_canvasXOffset, m_canvasYOffset, 0.0);
1095 glEnable(GL_TEXTURE_2D);
1098 glTexCoord2f(0.0, 0.0);
1099 glVertex2f(0.0, 0.0);
1101 glTexCoord2f((img->width() * zoom()) / KisOpenGLImageContext::BACKGROUND_TEXTURE_WIDTH, 0.0);
1102 glVertex2f(img->width() * zoom(), 0.0);
1104 glTexCoord2f((img->width() * zoom()) / KisOpenGLImageContext::BACKGROUND_TEXTURE_WIDTH,
1105 (img->height() * zoom()) / KisOpenGLImageContext::BACKGROUND_TEXTURE_HEIGHT);
1106 glVertex2f(img->width() * zoom(), img->height() * zoom());
1108 glTexCoord2f(0.0, (img->height() * zoom()) / KisOpenGLImageContext::BACKGROUND_TEXTURE_HEIGHT);
1109 glVertex2f(0.0, img->height() * zoom());
1113 glTranslatef(-m_canvasXOffset, -m_canvasYOffset, 0.0);
1115 glTranslatef(-horzValue(), -vertValue(), 0.0);
1116 glScalef(zoomFactor(), zoomFactor(), 1.0);
1119 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1121 TQRect wr = viewToWindow(TQRect(0, 0, m_canvas->width(), m_canvas->height()));
1122 wr &= TQRect(0, 0, img->width(), img->height());
1124 m_OpenGLImageContext->setHDRExposure(HDRExposure());
1126 m_canvas->OpenGLWidget()->makeCurrent();
1128 for (
int x = (wr.left() / m_OpenGLImageContext->imageTextureTileWidth()) * m_OpenGLImageContext->imageTextureTileWidth();
1130 x += m_OpenGLImageContext->imageTextureTileWidth()) {
1131 for (
int y = (wr.top() / m_OpenGLImageContext->imageTextureTileHeight()) * m_OpenGLImageContext->imageTextureTileHeight();
1133 y += m_OpenGLImageContext->imageTextureTileHeight()) {
1135 glBindTexture(GL_TEXTURE_2D, m_OpenGLImageContext->imageTextureTile(x, y));
1139 glTexCoord2f(0.0, 0.0);
1142 glTexCoord2f(1.0, 0.0);
1143 glVertex2f(x + m_OpenGLImageContext->imageTextureTileWidth(), y);
1145 glTexCoord2f(1.0, 1.0);
1146 glVertex2f(x + m_OpenGLImageContext->imageTextureTileWidth(), y + m_OpenGLImageContext->imageTextureTileHeight());
1148 glTexCoord2f(0.0, 1.0);
1149 glVertex2f(x, y + m_OpenGLImageContext->imageTextureTileHeight());
1155 glDisable(GL_TEXTURE_2D);
1156 glDisable(GL_BLEND);
1158 m_gridManager->drawGrid(wr, 0,
true);
1159 m_perspectiveGridManager->drawGrid( wr, 0,
true );
1163 glBindTexture(GL_TEXTURE_2D, 0);
1169 m_canvas->OpenGLWidget()->swapBuffers();
1171 paintToolOverlay(TQRegion(canvasRect));
1174 Q_UNUSED(canvasRect);
1178void KisView::setInputDevice(KisInputDevice inputDevice)
1180 if (inputDevice != m_inputDevice) {
1181 m_inputDevice = inputDevice;
1183 m_toolManager->setToolForInputDevice(m_inputDevice, inputDevice);
1185 if (m_toolManager->currentTool() == 0) {
1186 m_toolManager->setCurrentTool(m_toolManager->findTool(
"tool_brush", m_inputDevice));
1189 m_toolManager->setCurrentTool(m_toolManager->currentTool());
1191 m_toolManager->activateCurrentTool();
1193 emit sigInputDeviceChanged(inputDevice);
1198KisInputDevice KisView::currentInputDevice()
const
1200 return m_inputDevice;
1204KisCanvas *KisView::kiscanvas()
const
1209void KisView::updateCanvas()
1212 updateCanvas(m_image->bounds());
1216void KisView::updateCanvas(TQ_INT32 x, TQ_INT32 y, TQ_INT32 w, TQ_INT32 h)
1218 updateCanvas(TQRect(x, y, w, h));
1221void KisView::updateCanvas(
const TQRect& imageRect)
1223 if (m_canvas->isOpenGLCanvas()) {
1224 updateOpenGLCanvas(imageRect);
1225 paintOpenGLView(windowToView(imageRect));
1227 updateTQPaintDeviceCanvas(imageRect);
1229 m_canvas->repaint(windowToView(imageRect));
1233void KisView::refreshKisCanvas()
1235 TQRect imageRect = viewToWindow(TQRect(0, 0, m_canvas->width(), m_canvas->height()));
1238 imageRect |= m_image->bounds();
1241 updateCanvas(imageRect);
1247void KisView::selectionDisplayToggled(
bool displaySelection)
1250 if (m_canvas->isOpenGLCanvas()) {
1251 if (m_OpenGLImageContext) {
1252 m_OpenGLImageContext->setSelectionDisplayEnabled(displaySelection);
1256 Q_UNUSED(displaySelection);
1261void KisView::layerUpdateGUI(
bool enable)
1263 KisImageSP img = currentImg();
1266 TQ_INT32 nlayers = 0;
1267 TQ_INT32 nvisible = 0;
1272 layer = img->activeLayer();
1273 nlayers = img->nlayers();
1274 nvisible = nlayers - img->nHiddenLayers();
1279 if (pl && ( m_currentColorChooserDisplay !=
KisID(
"BLA") ||
1280 pl->paintDevice()->colorSpace()->id() != m_currentColorChooserDisplay)) {
1281 if (pl->paintDevice()->colorSpace()->id() ==
KisID(
"WET")) {
1282 m_paletteManager->hideWidget(
"hsvwidget" );
1283 m_paletteManager->hideWidget(
"rgbwidget" );
1284 m_paletteManager->hideWidget(
"graywidget" );
1285 m_paletteManager->hideWidget(
"palettewidget" );
1286 m_paletteManager->showWidget(
"watercolor docker" );
1289 m_paletteManager->hideWidget(
"watercolor docker" );
1290 m_paletteManager->showWidget(
"palettewidget" );
1291 m_paletteManager->showWidget(
"graywidget" );
1292 m_paletteManager->showWidget(
"rgbwidget" );
1293 m_paletteManager->showWidget(
"hsvwidget" );
1295 m_currentColorChooserDisplay = pl->paintDevice()->colorSpace()->id();
1298 enable = enable && img && layer && layer->visible() && !layer->locked();
1299 m_layerDup->setEnabled(enable);
1300 m_layerRm->setEnabled(enable);
1301 m_layerHide->setEnabled(img && layer);
1302 m_layerProperties->setEnabled(enable);
1303 m_layerSaveAs->setEnabled(enable);
1304 m_layerRaise->setEnabled(enable && layer->prevSibling());
1305 m_layerLower->setEnabled(enable && layer->nextSibling());
1306 m_layerTop->setEnabled(enable && nlayers > 1 && layer != img->rootLayer()->firstChild());
1307 m_layerBottom->setEnabled(enable && nlayers > 1 && layer != img->rootLayer()->lastChild());
1310 m_imgFlatten->setEnabled(nlayers > 1);
1311 m_imgMergeLayer->setEnabled(nlayers > 1 && layer && layer->nextSibling());
1314 m_selectionManager->updateGUI();
1315 m_filterManager->updateGUI();
1316 m_toolManager->updateGUI();
1317 m_gridManager->updateGUI();
1318 m_perspectiveGridManager->updateGUI();
1323 setCanvasCursor( KisCursor::arrowCursor() );
1326 if (img && img->activeDevice())
1327 emit currentColorSpaceChanged(img->activeDevice()->colorSpace());
1333void KisView::imgUpdateGUI()
1335 KisImageSP img = currentImg();
1337 m_imgResizeToLayer->setEnabled(img && img->activeLayer());
1339 updateStatusBarProfileLabel();
1342static const double zoomLevels[] = {
1374#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
1375#define NUM_ZOOM_LEVELS ARRAY_SIZE(zoomLevels)
1377#define FIRST_ZOOM_LEVEL_INDEX 0
1378#define LAST_ZOOM_LEVEL_INDEX (NUM_ZOOM_LEVELS - 1)
1380#define KISVIEW_MIN_ZOOM (zoomLevels[FIRST_ZOOM_LEVEL_INDEX])
1381#define KISVIEW_MAX_ZOOM (zoomLevels[LAST_ZOOM_LEVEL_INDEX])
1383double KisView::nextZoomInLevel()
const
1385 uint zoomLevelIndex = FIRST_ZOOM_LEVEL_INDEX;
1387 while (zoom() >= zoomLevels[zoomLevelIndex] && zoomLevelIndex < LAST_ZOOM_LEVEL_INDEX) {
1391 return zoomLevels[zoomLevelIndex];
1394double KisView::nextZoomOutLevel(
double zoomLevel)
const
1396 int zoomLevelIndex = LAST_ZOOM_LEVEL_INDEX;
1398 while (zoomLevel <= zoomLevels[zoomLevelIndex] && zoomLevelIndex > FIRST_ZOOM_LEVEL_INDEX) {
1402 return zoomLevels[zoomLevelIndex];
1405double KisView::nextZoomOutLevel()
const
1407 return nextZoomOutLevel(zoom());
1410void KisView::zoomAroundPoint(
double x,
double y,
double zf)
1413 m_canvas->setUpdatesEnabled(
false);
1414 m_hScroll->setUpdatesEnabled(
false);
1415 m_vScroll->setUpdatesEnabled(
false);
1417 if (x < 0 || y < 0) {
1419 KisImageSP img = currentImg();
1422 if (m_hScroll->isVisible()) {
1423 KisPoint c = viewToWindow(
KisPoint(m_canvas->width() / 2.0, m_canvas->height() / 2.0));
1427 x = img->width() / 2.0;
1430 if (m_vScroll->isVisible()) {
1431 KisPoint c = viewToWindow(
KisPoint(m_canvas->width() / 2.0, m_canvas->height() / 2.0));
1435 y = img->height() / 2.0;
1447 Q_ASSERT(m_zoomOut);
1449 updateStatusBarZoomLabel ();
1451 m_zoomIn->setEnabled(zf < KISVIEW_MAX_ZOOM);
1452 m_zoomOut->setEnabled(zf > KISVIEW_MIN_ZOOM);
1455 m_hRuler->setZoom(zf);
1456 m_vRuler->setZoom(zf);
1458 if (m_hScroll->isVisible()) {
1459 double vcx = m_canvas->width() / 2.0;
1460 TQ_INT32 scrollX = tqRound(x * zoom() - vcx);
1461 m_hScroll->setValue(scrollX);
1464 if (m_vScroll->isVisible()) {
1465 double vcy = m_canvas->height() / 2.0;
1466 TQ_INT32 scrollY = tqRound(y * zoom() - vcy);
1467 m_vScroll->setValue(scrollY);
1471 m_canvas->setUpdatesEnabled(
true);
1472 m_hScroll->setUpdatesEnabled(
true);
1473 m_vScroll->setUpdatesEnabled(
true);
1474 m_hScroll->update();
1475 m_vScroll->update();
1477 if (m_canvas->isOpenGLCanvas()) {
1478 paintOpenGLView(TQRect(0, 0, m_canvas->width(), m_canvas->height()));
1483 emit viewTransformationsChanged();
1486void KisView::zoomTo(
const KisRect& r)
1490 double wZoom = fabs(m_canvas->width() / r.width());
1491 double hZoom = fabs(m_canvas->height() / r.height());
1493 double zf = kMin(wZoom, hZoom);
1495 if (zf < KISVIEW_MIN_ZOOM) {
1496 zf = KISVIEW_MIN_ZOOM;
1499 if (zf > KISVIEW_MAX_ZOOM) {
1500 zf = KISVIEW_MAX_ZOOM;
1503 zoomAroundPoint(r.center().x(), r.center().y(), zf);
1507void KisView::zoomTo(
const TQRect& r)
1512void KisView::zoomTo(TQ_INT32 x, TQ_INT32 y, TQ_INT32 w, TQ_INT32 h)
1517void KisView::zoomIn(TQ_INT32 x, TQ_INT32 y)
1519 zoomAroundPoint(x, y, nextZoomInLevel());
1522void KisView::zoomOut(TQ_INT32 x, TQ_INT32 y)
1524 zoomAroundPoint(x, y, nextZoomOutLevel());
1527void KisView::zoomIn()
1532void KisView::zoomOut()
1537void KisView::slotZoomIn()
1542void KisView::slotZoomOut()
1547void KisView::slotActualPixels()
1549 zoomAroundPoint(-1, -1, 1.0);
1552void KisView::slotActualSize()
1555 zoomAroundPoint(-1, -1, 1.0);
1558double KisView::fitToCanvasZoomLevel()
const
1560 int fullCanvasWidth = width();
1562 if (m_vRuler->isVisible()) {
1563 fullCanvasWidth -= m_vRuler->width();
1566 int fullCanvasHeight = height();
1568 if (m_hRuler->isVisible()) {
1569 fullCanvasHeight -= m_hRuler->height();
1572 KisImageSP img = currentImg();
1574 double xZoomLevel =
static_cast<double>(fullCanvasWidth) / img->width();
1575 double yZoomLevel =
static_cast<double>(fullCanvasHeight) / img->height();
1577 return TQMIN(xZoomLevel, yZoomLevel);
1584void KisView::slotFitToCanvas()
1586 zoomAroundPoint(-1, -1, fitToCanvasZoomLevel());
1589void KisView::setInitialZoomLevel()
1591 double zoomLevel = fitToCanvasZoomLevel();
1593 if (zoomLevel > 1) {
1596 zoomLevel = nextZoomOutLevel(zoomLevel);
1599 zoomAroundPoint(-1, -1, zoomLevel);
1602void KisView::imgResizeToActiveLayer()
1604 KisImageSP img = currentImg();
1607 if (img && (layer = img->activeLayer())) {
1609 if (m_adapter && m_adapter->undo()) {
1610 m_adapter->beginMacro(i18n(
"Resize Image to Size of Current Layer"));
1615 TQRect r = layer->exactBounds();
1616 img->resize(r.width(), r.height(), r.x(), r.y(),
true);
1620 if (m_adapter && m_adapter->undo()) {
1621 m_adapter->endMacro();
1626void KisView::slotImageProperties()
1628 KisImageSP img = currentImg();
1632 KisDlgImageProperties dlg(img,
this);
1634 if (dlg.exec() == TQDialog::Accepted) {
1635 if (dlg.imageWidth() != img->width() ||
1636 dlg.imageHeight() != img->height()) {
1638 resizeCurrentImage(dlg.imageWidth(),
1641 TQ_INT32 opacity = dlg.opacity();
1642 opacity = opacity * 255 / 100;
1643 img->setName(dlg.imageName());
1644 img->setColorSpace(dlg.colorSpace());
1645 img->setResolution(dlg.resolution(), dlg.resolution());
1646 img->setDescription(dlg.description());
1647 img->setProfile(dlg.profile());
1651void KisView::slotInsertImageAsLayer()
1653 if (importImage() > 0)
1654 m_doc->setModified(
true);
1657void KisView::slotAddPalette()
1659 KDialogBase* base =
new KDialogBase(
this, 0,
true, i18n(
"Add Palette"), KDialogBase::Ok | KDialogBase::Cancel);
1660 KisCustomPalette* p =
new KisCustomPalette(base,
"add palette", i18n(
"Add Palette"),
this);
1661 base->setMainWidget(p);
1665void KisView::slotEditPalette()
1667 KisPaletteChooser chooser(
this);
1668 KisResourceServerBase* srv = KisResourceServerRegistry::instance()->get(
"PaletteServer");
1672 TQValueList<KisResource*> resources = srv->resources();
1673 TQValueList<KisPalette*> palettes;
1675 for(uint i = 0; i < resources.count(); i++) {
1678 chooser.paletteList->insertItem(palette->name());
1679 palettes.append(palette);
1682 if (chooser.exec() != TQDialog::Accepted ) {
1686 int index = chooser.paletteList->currentItem();
1688 KMessageBox::error(
this, i18n(
"No palette selected."), i18n(
"Palette"));
1692 KDialogBase* base =
new KDialogBase(
this, 0,
true, i18n(
"Edit Palette") , KDialogBase::Ok);
1693 KisCustomPalette* cp =
new KisCustomPalette(base,
"edit palette",
1694 i18n(
"Edit Palette"),
this);
1695 cp->setEditMode(
true);
1696 cp->setPalette(*palettes.at(index));
1697 base->setMainWidget(cp);
1701void KisView::saveLayerAsImage()
1703 TQStringList listMimeFilter = KoFilterManager::mimeFilter(
"application/x-chalk", KoFilterManager::Export);
1704 TQString mimelist = listMimeFilter.join(
" ");
1706 KFileDialog fd (TQString(), mimelist,
this,
"Export Layer",
true);
1707 fd.setCaption(i18n(
"Export Layer"));
1708 fd.setMimeFilter(listMimeFilter);
1709 fd.setOperationMode(KFileDialog::Saving);
1711 if (!fd.exec())
return;
1713 KURL url = fd.selectedURL();
1714 TQString mimefilter = fd.currentMimeFilter();
1720 KisImageSP img = currentImg();
1723 KisLayerSP l = img->activeLayer();
1726 TQRect r = l->exactBounds();
1729 d.prepareForImport();
1731 KisImageSP dst =
new KisImage(d.undoAdapter(), r.width(), r.height(), img->colorSpace(), l->name());
1732 d.setCurrentImage( dst );
1733 dst->addLayer(l->clone(),dst->rootLayer(),0);
1735 d.setOutputMimeType(mimefilter.latin1());
1741TQ_INT32 KisView::importImage(
const KURL& urlArg)
1743 KisImageSP currentImage = currentImg();
1745 if (!currentImage) {
1752 if (urlArg.isEmpty()) {
1753 TQString mimelist = KoFilterManager::mimeFilter(
"application/x-chalk", KoFilterManager::Import).join(
" ");
1754 urls = KFileDialog::getOpenURLs(TQString(), mimelist, 0, i18n(
"Import Image"));
1756 urls.push_back(urlArg);
1762 for (KURL::List::iterator it = urls.begin(); it != urls.end(); ++it) {
1771void KisView::rotateLayer180()
1773 rotateLayer( M_PI );
1776void KisView::rotateLayerLeft90()
1778 rotateLayer( M_PI/2 - 2*M_PI );
1781void KisView::rotateLayerRight90()
1783 rotateLayer( M_PI/2 );
1786void KisView::mirrorLayerX()
1788 if (!currentImg())
return;
1789 KisPaintDeviceSP dev = currentImg()->activeDevice();
1792 KisTransaction * t = 0;
1793 if (undoAdapter() && undoAdapter()->undo()) {
1794 t =
new KisTransaction(i18n(
"Mirror Layer X"), dev);
1800 if (t) undoAdapter()->addCommand(t);
1802 m_doc->setModified(
true);
1807void KisView::mirrorLayerY()
1809 if (!currentImg())
return;
1810 KisPaintDeviceSP dev = currentImg()->activeDevice();
1813 KisTransaction * t = 0;
1814 if (undoAdapter() && undoAdapter()->undo()) {
1815 t =
new KisTransaction(i18n(
"Mirror Layer Y"), dev);
1821 if (t) undoAdapter()->addCommand(t);
1823 m_doc->setModified(
true);
1828void KisView::scaleLayer(
double sx,
double sy, KisFilterStrategy *filterStrategy)
1830 if (!currentImg())
return;
1832 KisPaintDeviceSP dev = currentImg()->activeDevice();
1835 KisSelectedTransaction * t = 0;
1836 if (undoAdapter() && undoAdapter()->undo()) {
1837 t =
new KisSelectedTransaction(i18n(
"Scale Layer"), dev);
1841 KisTransformWorker worker(dev, sx, sy, 0, 0, 0.0, 0, 0, m_progress, filterStrategy);
1844 if (t) undoAdapter()->addCommand(t);
1845 currentImg()->rootLayer()->setDirty(
false);
1846 m_doc->setModified(
true);
1851void KisView::rotateLayer(
double radians)
1853 if (!currentImg())
return;
1855 KisPaintDeviceSP dev = currentImg()->activeDevice();
1858 KisSelectedTransaction * t = 0;
1859 if (undoAdapter() && undoAdapter()->undo()) {
1860 t =
new KisSelectedTransaction(i18n(
"Rotate Layer"), dev);
1864 KisFilterStrategy *filter = KisFilterStrategyRegistry::instance()->get(
KisID(
"Triangle"));
1866 if(dev->hasSelection())
1867 r = dev->selection()->selectedExactRect();
1869 r = dev->exactBounds();
1870 double cx = r.x()+r.width()/2.0;
1871 double cy = r.y()+r.height()/2.0;
1872 TQ_INT32 tx = TQ_INT32(cx*cos(radians) - cy*sin(radians) - cx + 0.5);
1873 TQ_INT32 ty = TQ_INT32(cy*cos(radians) + cx*sin(radians) - cy + 0.5);
1875 KisTransformWorker tw(dev, 1.0, 1.0, 0, 0, radians, -tx, -ty, m_progress, filter);
1878 if (t) undoAdapter()->addCommand(t);
1880 m_doc->setModified(
true);
1885void KisView::shearLayer(
double angleX,
double angleY)
1887 if (!currentImg())
return;
1889 KisLayerSP layer = currentImg()->activeLayer();
1892 KisUndoAdapter * undo = 0;
1893 if ((undo = currentImg()->undoAdapter())) {
1894 undo->beginMacro(i18n(
"Shear layer"));
1897 KisShearVisitor v(angleX, angleY, m_progress);
1898 v.setUndoAdapter(undo);
1901 if (undo) undo->endMacro();
1903 m_doc->setModified(
true);
1908void KisView::flattenImage()
1910 KisImageSP img = currentImg();
1915 if (img->nHiddenLayers() > 0) {
1916 int answer = KMessageBox::warningYesNo(
this,
1917 i18n(
"The image contains hidden layers that will be lost."),
1918 i18n(
"Flatten Image"),
1919 i18n(
"&Flatten Image"),
1920 KStdGuiItem::cancel());
1922 if (answer != KMessageBox::Yes) {
1933void KisView::mergeLayer()
1935 KisImageSP img = currentImg();
1938 KisLayerSP layer = img->activeLayer();
1941 img->mergeLayer(layer);
1944void KisView::preferences()
1947 bool canvasWasOpenGL = m_canvas->isOpenGLCanvas();
1950 if (PreferencesDialog::editPreferences())
1953 m_paletteManager->slotResetFont();
1954 resetMonitorProfile();
1957 if (cfg.useOpenGL() != canvasWasOpenGL) {
1959 disconnectCurrentImg();
1962 if (cfg.useOpenGL()) {
1963 m_OpenGLImageContext = KisOpenGLImageContext::getImageContext(m_image, monitorProfile());
1964 m_canvas->createOpenGLCanvas(m_OpenGLImageContext->sharedContextWidget());
1967 m_OpenGLImageContext = 0;
1968 m_canvas->createTQPaintDeviceCanvas();
1971 connectCurrentImg();
1976 if (cfg.useOpenGL()) {
1977 m_OpenGLImageContext->setMonitorProfile(monitorProfile());
1983 if (m_toolManager->currentTool()) {
1984 setCanvasCursor(m_toolManager->currentTool()->cursor());
1987#if defined(EXTENDED_X11_TABLET_SUPPORT)
1988 m_canvas->selectTabletDeviceEvents();
1994void KisView::layerCompositeOp(
const KisCompositeOp& compositeOp)
1996 KisImageSP img = currentImg();
1999 KisLayerSP layer = img->activeLayer();
2003 KNamedCommand *cmd = layer->setCompositeOpCommand(compositeOp);
2005 undoAdapter()->addCommand(cmd);
2010void KisView::layerOpacity(
int opacity,
bool dontundo)
2012 KisImageSP img = currentImg();
2015 KisLayerSP layer = img->activeLayer();
2018 opacity = int(
float(opacity * 255) / 100 + 0.5);
2022 if (opacity == layer->opacity())
return;
2025 layer->setOpacity( opacity );
2029 KNamedCommand *cmd = layer->setOpacityCommand(opacity);
2031 undoAdapter()->addCommand(cmd);
2036void KisView::layerOpacityFinishedChanging(
int previous,
int opacity )
2038 KisImageSP img = currentImg();
2041 KisLayerSP layer = img->activeLayer();
2044 opacity = int(
float(opacity * 255) / 100 + 0.5);
2048 previous = int(
float(previous * 255) / 100 + 0.5);
2052 if (previous == opacity)
return;
2055 KNamedCommand *cmd = layer->setOpacityCommand(previous, opacity);
2056 m_adapter->addCommand(cmd);
2061void KisView::showRuler()
2063 if( m_RulerAction->isChecked() )
2078void KisView::slotUpdateFullScreen(
bool toggle)
2080 if (KoView::shell()) {
2082 uint newState = KoView::shell()->windowState();
2085 newState |= TQt::WindowFullScreen;
2087 newState &= ~TQt::WindowFullScreen;
2090 KoView::shell()->setWindowState(newState);
2094TQ_INT32 KisView::docWidth()
const
2096 return currentImg() ? currentImg()->width() : 0;
2099TQ_INT32 KisView::docHeight()
const
2101 return currentImg() ? currentImg()->height() : 0;
2104void KisView::scrollTo(TQ_INT32 x, TQ_INT32 y)
2106 if (m_hScroll->isVisible()) {
2107 m_hScroll->setValue(x);
2109 if (m_vScroll->isVisible()) {
2110 m_vScroll->setValue(y);
2117 m_brush =
dynamic_cast<KisBrush*
>(brush);
2121 emit brushChanged(m_brush);
2126void KisView::patternActivated(
KisResource *pattern)
2128 m_pattern =
dynamic_cast<KisPattern*
>(pattern);
2131 emit patternChanged(m_pattern);
2136void KisView::gradientActivated(
KisResource *gradient)
2139 m_gradient =
dynamic_cast<KisGradient*
>(gradient);
2142 emit gradientChanged(m_gradient);
2147void KisView::paintopActivated(
const KisID & paintop,
const KisPaintOpSettings *paintopSettings)
2149 if (paintop.id().isNull() || paintop.id().isEmpty()) {
2153 m_paintop = paintop;
2154 m_paintopSettings = paintopSettings;
2155 emit paintopChanged(m_paintop, paintopSettings);
2159void KisView::setBGColor(
const KisColor& c)
2163 emit sigBGQColorChanged( c.
toTQColor() );
2166void KisView::setFGColor(
const KisColor& c)
2170 emit sigFGQColorChanged( c.
toTQColor() );
2173void KisView::slotSetFGColor(
const KisColor& c)
2180void KisView::slotSetBGColor(
const KisColor& c)
2187void KisView::slotSetFGQColor(
const TQColor& c)
2190 setFGColor(
KisColor(c, monitorSpace));
2191 emit sigFGQColorChanged(c);
2194void KisView::slotSetBGQColor(
const TQColor& c)
2197 setBGColor(
KisColor(c, monitorSpace));
2198 emit sigBGQColorChanged(c);
2202void KisView::setupPrinter(KPrinter& printer)
2204 KisImageSP img = currentImg();
2207 printer.setPageSelection(KPrinter::ApplicationSide);
2208 printer.setPageSize(KPrinter::A4);
2209 printer.setOrientation(KPrinter::Portrait);
2213void KisView::print(KPrinter& printer)
2215 TQPainter gc(&printer);
2217 KisImageSP img = currentImg();
2220 printer.setFullPage(
true);
2221 gc.setClipping(
false);
2224 TQString printerProfileName = cfg.printerProfile();
2225 KisProfile * printerProfile = KisMetaRegistry::instance()->csRegistry() ->
getProfileByName(printerProfileName);
2227 TQRect r = img->bounds();
2228 img->renderToPainter(r.x(), r.y(), r.width(), r.height(), gc, printerProfile, KisImage::PAINT_IMAGE_ONLY, HDRExposure());
2231void KisView::paintToolOverlay(
const TQRegion& region)
2233 if (!region.isEmpty() && m_toolManager->currentTool() && !m_toolIsPainting) {
2234 KisCanvasPainter gc(m_canvas);
2236 gc.setClipRegion(region);
2237 gc.setClipping(
true);
2240 m_toolIsPainting =
true;
2241 m_toolManager->currentTool()->paint(gc, region.boundingRect());
2242 m_toolIsPainting =
false;
2246void KisView::canvasGotPaintEvent(TQPaintEvent *event)
2248 if (m_canvas->isOpenGLCanvas()) {
2249 paintOpenGLView(event->rect());
2251 paintTQPaintDeviceView(event->region());
2255void KisView::canvasGotButtonPressEvent(KisButtonPressEvent *e)
2257#if defined(EXTENDED_X11_TABLET_SUPPORT)
2259 if (e->device() != KisInputDevice::mouse()) {
2260 m_tabletEventTimer.start();
2264 if (e->device() != currentInputDevice()) {
2265 if (e->device() == KisInputDevice::mouse()) {
2266 if (m_tabletEventTimer.elapsed() > MOUSE_CHANGE_EVENT_DELAY) {
2267 setInputDevice(KisInputDevice::mouse());
2270 setInputDevice(e->device());
2274 KisImageSP img = currentImg();
2306 if (e->button() == TQt::RightButton) {
2307 TQPopupMenu * m_popup = 0;
2309 Q_ASSERT(factory());
2310 m_popup = (TQPopupMenu *)factory()->container(
"image_popup",
this);
2313 m_popup->popup(e->globalPos().roundTQPoint());
2316 else if (e->device() == currentInputDevice() && m_toolManager->currentTool()) {
2317 KisPoint p = viewToWindow(e->pos());
2320 if (m_vScroll->draggingSlider() || m_hScroll->draggingSlider())
2323 if (m_toolManager->currentTool()->wantsAutoScroll()) {
2327 KisButtonPressEvent ev(e->device(), p, e->globalPos(), e->pressure(), e->xTilt(), e->yTilt(), e->button(), e->state());
2328 m_toolManager->currentTool()->buttonPress(&ev);
2332void KisView::canvasGotMoveEvent(KisMoveEvent *e)
2334#if defined(EXTENDED_X11_TABLET_SUPPORT)
2336 if (e->device() != KisInputDevice::mouse()) {
2337 m_tabletEventTimer.start();
2341 if (e->device() != currentInputDevice()) {
2342 if (e->device() == KisInputDevice::mouse()) {
2343 if (m_tabletEventTimer.elapsed() > MOUSE_CHANGE_EVENT_DELAY) {
2344 setInputDevice(KisInputDevice::mouse());
2347 setInputDevice(e->device());
2351 KisImageSP img = currentImg();
2353 m_hRuler->updatePointer(e->pos().floorX() - m_canvasXOffset, e->pos().floorY() - m_canvasYOffset);
2354 m_vRuler->updatePointer(e->pos().floorX() - m_canvasXOffset, e->pos().floorY() - m_canvasYOffset);
2356 KisPoint wp = viewToWindow(e->pos());
2359 if (img && m_currentGuide) {
2360 TQPoint p = mapToScreen(e->pos().floorTQPoint());
2361 KisGuideMgr *mgr = img->guides();
2363 if (((e->state() & TQt::LeftButton) == TQt::LeftButton) && mgr->hasSelected()) {
2365 p -= m_lastGuidePoint;
2368 mgr->moveSelectedByX(p.x() / zoom());
2371 mgr->moveSelectedByY(p.y() / zoom());
2373 m_doc->setModified(
true);
2378 if (e->device() == currentInputDevice() && m_toolManager->currentTool()) {
2379 KisMoveEvent ev(e->device(), wp, e->globalPos(), e->pressure(), e->xTilt(), e->yTilt(), e->state());
2381 m_toolManager->currentTool()->move(&ev);
2385 emit cursorPosition(wp.floorX(), wp.floorY());
2388int KisView::leftBorder()
const
2390 return m_rulerThickness;
2393int KisView::rightBorder()
const
2395 return m_hScrollBarExtent;
2398int KisView::topBorder()
const
2400 return m_rulerThickness;
2403int KisView::bottomBorder()
const
2405 return m_vScrollBarExtent;
2408void KisView::mouseMoveEvent(TQMouseEvent *e)
2410 KisMoveEvent ke(currentInputDevice(),
KisPoint(e->pos()),
KisPoint(e->globalPos()), PRESSURE_DEFAULT, 0, 0, e->state());
2411 canvasGotMoveEvent(&ke);
2414void KisView::slotAutoScroll(
const TQPoint &p)
2416 scrollTo(horzValue()+p.x(), vertValue()+p.y());
2419void KisView::canvasGotButtonReleaseEvent(KisButtonReleaseEvent *e)
2421#if defined(EXTENDED_X11_TABLET_SUPPORT)
2423 if (e->device() != KisInputDevice::mouse()) {
2424 m_tabletEventTimer.start();
2428 if (e->device() != currentInputDevice()) {
2429 if (e->device() == KisInputDevice::mouse()) {
2430 if (m_tabletEventTimer.elapsed() > MOUSE_CHANGE_EVENT_DELAY) {
2431 setInputDevice(KisInputDevice::mouse());
2434 setInputDevice(e->device());
2438 KisImageSP img = currentImg();
2443 if (e->device() == currentInputDevice() && m_toolManager->currentTool()) {
2444 KisPoint p = viewToWindow(e->pos());
2445 KisButtonReleaseEvent ev(e->device(), p, e->globalPos(), e->pressure(), e->xTilt(), e->yTilt(), e->button(), e->state());
2447 disableAutoScroll();
2448 if (m_toolManager->currentTool()) {
2449 m_toolManager->currentTool()->buttonRelease(&ev);
2454void KisView::canvasGotDoubleClickEvent(KisDoubleClickEvent *e)
2456#if defined(EXTENDED_X11_TABLET_SUPPORT)
2458 if (e->device() != KisInputDevice::mouse()) {
2459 m_tabletEventTimer.start();
2463 if (e->device() != currentInputDevice()) {
2464 if (e->device() == KisInputDevice::mouse()) {
2465 if (m_tabletEventTimer.elapsed() > MOUSE_CHANGE_EVENT_DELAY) {
2466 setInputDevice(KisInputDevice::mouse());
2469 setInputDevice(e->device());
2473 if (e->device() == currentInputDevice() && m_toolManager->currentTool()) {
2474 KisPoint p = viewToWindow(e->pos());
2475 KisDoubleClickEvent ev(e->device(), p, e->globalPos(), e->pressure(), e->xTilt(), e->yTilt(), e->button(), e->state());
2477 if (m_toolManager->currentTool()) {
2478 m_toolManager->currentTool()->doubleClick(&ev);
2483void KisView::canvasGotEnterEvent(TQEvent *e)
2488void KisView::canvasGotLeaveEvent (TQEvent *e)
2493void KisView::canvasGotMouseWheelEvent(TQWheelEvent *event)
2497 if(event->delta() / 120 != 0)
2499 if(event->delta() > 0)
2506 KisCanvasPainter gc(m_canvas);
2507 m_oldTool->paint(gc);
2515void KisView::canvasGotKeyPressEvent(TQKeyEvent *event)
2517 if (!m_toolManager->currentTool()) {
2522 if (event->key() == TQt::Key_Space) {
2526 m_oldTool = m_toolManager->currentTool();
2527 m_toolManager->setCurrentTool(
"tool_pan" );
2532 m_toolManager->setCurrentTool( m_oldTool );
2536 if (m_toolManager->currentTool())
2537 m_toolManager->currentTool()->keyPress(event);
2540void KisView::canvasGotKeyReleaseEvent(TQKeyEvent *event)
2542 if (m_toolManager->currentTool())
2543 m_toolManager->currentTool()->keyRelease(event);
2546void KisView::canvasGotDragEnterEvent(TQDragEnterEvent *event)
2548 bool accept =
false;
2552 if (KURLDrag::canDecode(event) && TQApplication::overrideCursor() == 0) {
2556 event->accept(accept);
2559void KisView::canvasGotDropEvent(TQDropEvent *event)
2563 if (KURLDrag::decode(event, urls))
2565 if (urls.count() > 0) {
2572 TDEPopupMenu popup(
this,
"drop_popup");
2574 if (urls.count() == 1) {
2575 if (currentImg() != 0) {
2576 popup.insertItem(i18n(
"Insert as New Layer"), addLayerId);
2578 popup.insertItem(i18n(
"Open in New Document"), addDocumentId);
2581 if (currentImg() != 0) {
2582 popup.insertItem(i18n(
"Insert as New Layers"), addLayerId);
2584 popup.insertItem(i18n(
"Open in New Documents"), addDocumentId);
2587 popup.insertSeparator();
2588 popup.insertItem(i18n(
"Cancel"), cancelId);
2590 int actionId = popup.exec(TQCursor::pos());
2592 if (actionId >= 0 && actionId != cancelId) {
2593 for (KURL::List::ConstIterator it = urls.begin (); it != urls.end (); ++it) {
2602 shell()->openDocument(url);
2612void KisView::layerProperties()
2614 if (currentImg() && currentImg()->activeLayer())
2615 showLayerProperties(currentImg()->activeLayer());
2619 class KisChangeFilterCmd :
public KNamedCommand {
2620 typedef KNamedCommand super;
2624 KisChangeFilterCmd(KisAdjustmentLayerSP layer,
2626 const TQString& before,
2627 const TQString& after) : super(i18n(
"Change Filter"))
2635 virtual void execute()
2637 TQApplication::setOverrideCursor(KisCursor::waitCursor());
2638 m_config->fromXML(m_after);
2640 m_layer->setFilter(m_config);
2641 m_layer->setDirty();
2642 TQApplication::restoreOverrideCursor();
2645 virtual void unexecute()
2647 TQApplication::setOverrideCursor(KisCursor::waitCursor());
2648 m_config->fromXML(m_before);
2650 m_layer->setFilter(m_config);
2651 m_layer->setDirty();
2652 TQApplication::restoreOverrideCursor();
2655 KisAdjustmentLayerSP m_layer;
2662void KisView::showLayerProperties(KisLayerSP layer)
2665 if ( !layer )
return;
2670 cs = pl->paintDevice()->colorSpace();
2673 cs = layer->image()->colorSpace();
2679 KisDlgAdjLayerProps dlg(alayer, alayer->name(), i18n(
"Adjustment Layer Properties"),
this,
"dlgadjlayerprops");
2680 TQString before = dlg.filterConfiguration()->toString();
2681 if (dlg.exec() == TQDialog::Accepted)
2683 KisChangeFilterCmd * cmd =
new KisChangeFilterCmd(alayer,
2684 dlg.filterConfiguration(),
2686 dlg.filterConfiguration()->toString());
2688 m_adapter->addCommand(cmd);
2689 m_doc->setModified(
true );
2694 KisDlgLayerProperties dlg(layer->name(),
2696 layer->compositeOp(),
2698 if (dlg.exec() == TQDialog::Accepted)
2700 if (layer->name() != dlg.getName() ||
2701 layer->opacity() != dlg.getOpacity() ||
2702 layer->compositeOp() != dlg.getCompositeOp())
2704 TQApplication::setOverrideCursor(KisCursor::waitCursor());
2705 m_adapter->beginMacro(i18n(
"Property Changes"));
2706 layer->image()->setLayerProperties(layer, dlg.getOpacity(), dlg.getCompositeOp(), dlg.getName());
2708 m_adapter->endMacro();
2709 TQApplication::restoreOverrideCursor();
2710 m_doc->setModified(
true );
2716void KisView::layerAdd()
2718 KisImageSP img = currentImg();
2719 if (img && img->activeLayer()) {
2720 addLayer(img->activeLayer()->parent(), img->activeLayer());
2723 addLayer(
static_cast<KisGroupLayer*
>(img->rootLayer().data()), 0);
2726void KisView::addLayer(KisGroupLayerSP parent, KisLayerSP above)
2728 KisImageSP img = currentImg();
2731 TQString profilename;
2732 if(img->colorSpace()->getProfile())
2733 profilename = img->colorSpace()->getProfile()->productName();
2734 NewLayerDialog dlg(img->colorSpace()->id(), profilename, img->nextLayerName(),
this);
2736 if (dlg.exec() == TQDialog::Accepted) {
2737 KisColorSpace* cs = KisMetaRegistry::instance()-> csRegistry() ->
2738 getColorSpace(dlg.colorSpaceID(),dlg.profileName());
2739 KisLayerSP layer =
new KisPaintLayer(img, dlg.layerName(), dlg.opacity(), cs);
2741 layer->setCompositeOp(dlg.compositeOp());
2742 img->addLayer(layer, parent.data(), above);
2745 KMessageBox::error(
this, i18n(
"Could not add layer to image."), i18n(
"Layer Error"));
2749 img->rollBackLayerName();
2754void KisView::addGroupLayer(KisGroupLayerSP parent, KisLayerSP above)
2756 KisImageSP img = currentImg();
2758 TQString profilename;
2759 if(img->colorSpace()->getProfile())
2760 profilename = img->colorSpace()->getProfile()->productName();
2762 NewLayerDialog dlg(img->colorSpace()->id(), profilename, img->nextLayerName(),
this);
2763 dlg.setColorSpaceEnabled(
false);
2765 if (dlg.exec() == TQDialog::Accepted) {
2766 KisLayerSP layer =
new KisGroupLayer(img, dlg.layerName(), dlg.opacity());
2768 layer->setCompositeOp(dlg.compositeOp());
2769 img->addLayer(layer, parent.data(), above);
2772 KMessageBox::error(
this, i18n(
"Could not add layer to image."), i18n(
"Layer Error"));
2778void KisView::addPartLayer()
2780 KisImageSP img = currentImg();
2783 addPartLayer(img->rootLayer(), img->rootLayer()->firstChild(), m_actionPartLayer->documentEntry());
2786void KisView::addPartLayer(KisGroupLayerSP parent, KisLayerSP above,
const KoDocumentEntry& entry)
2788 delete m_partHandler;
2789 m_partHandler =
new KisPartLayerHandler(
this, entry, parent, above);
2791 disconnect(m_canvas, TQ_SIGNAL(sigGotButtonPressEvent(KisButtonPressEvent*)),
this, 0);
2792 disconnect(m_canvas, TQ_SIGNAL(sigGotButtonReleaseEvent(KisButtonReleaseEvent*)),
this, 0);
2793 disconnect(m_canvas, TQ_SIGNAL(sigGotMoveEvent(KisMoveEvent*)),
this, 0);
2794 disconnect(m_canvas, TQ_SIGNAL(sigGotKeyPressEvent(TQKeyEvent*)),
this, 0);
2796 connect(m_canvas, TQ_SIGNAL(sigGotButtonPressEvent(KisButtonPressEvent*)),
2797 m_partHandler, TQ_SLOT(gotButtonPressEvent(KisButtonPressEvent*)));
2798 connect(m_canvas, TQ_SIGNAL(sigGotButtonReleaseEvent(KisButtonReleaseEvent*)),
2799 m_partHandler, TQ_SLOT(gotButtonReleaseEvent(KisButtonReleaseEvent*)));
2800 connect(m_canvas, TQ_SIGNAL(sigGotMoveEvent(KisMoveEvent*)),
2801 m_partHandler, TQ_SLOT(gotMoveEvent(KisMoveEvent*)));
2802 connect(m_canvas, TQ_SIGNAL(sigGotKeyPressEvent(TQKeyEvent*)),
2803 m_partHandler, TQ_SLOT(gotKeyPressEvent(TQKeyEvent*)));
2805 connect(m_partHandler, TQ_SIGNAL(sigGotMoveEvent(KisMoveEvent*)),
2806 this, TQ_SLOT(canvasGotMoveEvent(KisMoveEvent*)));
2807 connect(m_partHandler, TQ_SIGNAL(sigGotKeyPressEvent(TQKeyEvent*)),
2808 this, TQ_SLOT(canvasGotKeyPressEvent(TQKeyEvent*)));
2809 connect(m_partHandler, TQ_SIGNAL(handlerDone()),
2810 this, TQ_SLOT(reconnectAfterPartInsert()));
2813void KisView::insertPart(
const TQRect& viewRect,
const KoDocumentEntry& entry,
2814 KisGroupLayerSP parent, KisLayerSP above) {
2815 KisImageSP img = currentImg();
2818 KoDocument* doc = entry.createDoc(m_doc);
2822 if ( !doc->showEmbedInitDialog(
this) )
2825 TQRect rect = viewToWindow(viewRect);
2827 KisChildDoc * childDoc = m_doc->createChildDoc(rect, doc);
2830 partLayer->setDocType(entry.service()->genericName());
2831 img->addLayer(partLayer, parent, above);
2832 m_doc->setModified(
true);
2834 reconnectAfterPartInsert();
2837void KisView::reconnectAfterPartInsert() {
2838 connect(m_canvas, TQ_SIGNAL(sigGotButtonPressEvent(KisButtonPressEvent*)),
2839 this, TQ_SLOT(canvasGotButtonPressEvent(KisButtonPressEvent*)));
2840 connect(m_canvas, TQ_SIGNAL(sigGotButtonReleaseEvent(KisButtonReleaseEvent*)),
2841 this, TQ_SLOT(canvasGotButtonReleaseEvent(KisButtonReleaseEvent*)));
2842 connect(m_canvas, TQ_SIGNAL(sigGotMoveEvent(KisMoveEvent*)),
2843 this, TQ_SLOT(canvasGotMoveEvent(KisMoveEvent*)));
2844 connect(m_canvas, TQ_SIGNAL(sigGotKeyPressEvent(TQKeyEvent*)),
2845 this, TQ_SLOT(canvasGotKeyPressEvent(TQKeyEvent*)));
2847 delete m_partHandler;
2851void KisView::addAdjustmentLayer()
2853 KisImageSP img = currentImg();
2856 addAdjustmentLayer( img->activeLayer()->parent(), img->activeLayer() );
2859void KisView::addAdjustmentLayer(KisGroupLayerSP parent, KisLayerSP above)
2864 KisImageSP img = currentImg();
2867 KisLayerSP l = img->activeLayer();
2869 KisPaintDeviceSP dev;
2874 dev = pl->paintDevice();
2884 dev = al->cachedPaintDevice();
2892 KisDlgAdjustmentLayer dlg(img, img->nextLayerName(), i18n(
"New Adjustment Layer"),
this,
"dlgadjustmentlayer");
2893 if (dlg.exec() == TQDialog::Accepted) {
2894 KisSelectionSP selection = 0;
2895 if (dev->hasSelection()) {
2896 selection = dev->selection();
2899 TQString name = dlg.layerName();
2901 addAdjustmentLayer( parent, above, name, filter, selection);
2906void KisView::addAdjustmentLayer(KisGroupLayerSP parent, KisLayerSP above,
const TQString & name,
2913 KisImageSP img = currentImg();
2917 img->addLayer(l, parent, above);
2920void KisView::slotChildActivated(
bool a) {
2922 if (currentImg() && currentImg()->activeLayer())
2925 currentImg()->activeLayer()->activate();
2927 currentImg()->activeLayer()->deactivate();
2931 super::slotChildActivated(a);
2934void KisView::layerRemove()
2936 KisImageSP img = currentImg();
2939 KisLayerSP layer = img->activeLayer();
2944 img->removeLayer(layer);
2946 if (layer->parent())
2947 layer->parent()->setDirty(layer->extent());
2950 layerUpdateGUI(img->activeLayer() != 0);
2955void KisView::layerDuplicate()
2957 KisImageSP img = currentImg();
2962 KisLayerSP active = img->activeLayer();
2967 KisLayerSP dup = active->clone();
2968 dup->setName(i18n(
"Duplicate of '%1'").arg(active->name()));
2969 img->addLayer(dup, active->parent().data(), active);
2971 img->activate( dup );
2974 KMessageBox::error(
this, i18n(
"Could not add layer to image."), i18n(
"Layer Error"));
2978void KisView::layerRaise()
2980 KisImageSP img = currentImg();
2986 layer = img->activeLayer();
2988 img->raiseLayer(layer);
2991void KisView::layerLower()
2993 KisImageSP img = currentImg();
2999 layer = img->activeLayer();
3001 img->lowerLayer(layer);
3004void KisView::layerFront()
3006 KisImageSP img = currentImg();
3012 layer = img->activeLayer();
3016void KisView::layerBack()
3018 KisImageSP img = currentImg();
3023 layer = img->activeLayer();
3024 img->toBottom(layer);
3027void KisView::layersUpdated()
3029 KisImageSP img = currentImg();
3032 KisLayerSP layer = img->activeLayer();
3034 layerUpdateGUI(img && layer);
3039void KisView::layerToggleVisible()
3041 KisImageSP img = currentImg();
3044 KisLayerSP layer = img->activeLayer();
3047 layer->setVisible(!layer->visible());
3050void KisView::layerToggleLocked()
3052 KisImageSP img = currentImg();
3055 KisLayerSP layer = img->activeLayer();
3058 layer->setLocked(!layer->locked());
3061void KisView::actLayerVisChanged(
int show)
3063 m_actLayerVis = (show != 0);
3066bool KisView::activeLayerHasSelection()
3068 return m_image && m_image->activeDevice() && m_image->activeDevice()->hasSelection();
3071void KisView::scrollH(
int value)
3073 m_hRuler->updateVisibleArea(value, 0);
3075 int xShift = m_scrollX - value;
3078 if (m_canvas->isUpdatesEnabled()) {
3081 if (m_canvas->isOpenGLCanvas()) {
3082 paintOpenGLView(TQRect(0, 0, m_canvas->width(), m_canvas->height()));
3084 TQRect drawRect(0, 0, xShift, m_canvasPixmap.height());
3086 bitBlt(&m_canvasPixmap, xShift, 0, &m_canvasPixmap, 0, 0, m_canvasPixmap.width() - xShift, m_canvasPixmap.height());
3088 updateTQPaintDeviceCanvas(viewToWindow(drawRect));
3089 m_canvas->repaint();
3091 }
else if (xShift < 0) {
3093 TQRect drawRect(m_canvasPixmap.width() + xShift, 0, -xShift, m_canvasPixmap.height());
3095 if (m_canvas->isOpenGLCanvas()) {
3096 paintOpenGLView(TQRect(0, 0, m_canvas->width(), m_canvas->height()));
3098 bitBlt(&m_canvasPixmap, 0, 0, &m_canvasPixmap, -xShift, 0, m_canvasPixmap.width() + xShift, m_canvasPixmap.height());
3100 updateTQPaintDeviceCanvas(viewToWindow(drawRect));
3101 m_canvas->repaint();
3105 KisCanvasPainter gc(m_canvas);
3106 m_oldTool->paint(gc);
3113 emit viewTransformationsChanged();
3116void KisView::scrollV(
int value)
3118 m_vRuler->updateVisibleArea(0, value);
3120 int yShift = m_scrollY - value;
3123 if (m_canvas->isUpdatesEnabled()) {
3126 if (m_canvas->isOpenGLCanvas()) {
3127 paintOpenGLView(TQRect(0, 0, m_canvas->width(), m_canvas->height()));
3129 TQRect drawRect(0, 0, m_canvasPixmap.width(), yShift);
3131 bitBlt(&m_canvasPixmap, 0, yShift, &m_canvasPixmap, 0, 0, m_canvasPixmap.width(), m_canvasPixmap.height() - yShift);
3133 updateTQPaintDeviceCanvas(viewToWindow(drawRect));
3134 m_canvas->repaint();
3136 }
else if (yShift < 0) {
3138 if (m_canvas->isOpenGLCanvas()) {
3139 paintOpenGLView(TQRect(0, 0, m_canvas->width(), m_canvas->height()));
3141 TQRect drawRect(0, m_canvasPixmap.height() + yShift, m_canvasPixmap.width(), -yShift);
3143 bitBlt(&m_canvasPixmap, 0, 0, &m_canvasPixmap, 0, -yShift, m_canvasPixmap.width(), m_canvasPixmap.height() + yShift);
3145 updateTQPaintDeviceCanvas(viewToWindow(drawRect));
3146 m_canvas->repaint();
3150 KisCanvasPainter gc(m_canvas);
3151 m_oldTool->paint(gc);
3158 emit viewTransformationsChanged();
3161void KisView::setupCanvas()
3163 m_canvas =
new KisCanvas(
this,
"kis_canvas");
3164 m_canvas->setFocusPolicy( TQWidget::StrongFocus );
3165 TQObject::connect(m_canvas, TQ_SIGNAL(sigGotButtonPressEvent(KisButtonPressEvent*)),
this, TQ_SLOT(canvasGotButtonPressEvent(KisButtonPressEvent*)));
3166 TQObject::connect(m_canvas, TQ_SIGNAL(sigGotButtonReleaseEvent(KisButtonReleaseEvent*)),
this, TQ_SLOT(canvasGotButtonReleaseEvent(KisButtonReleaseEvent*)));
3167 TQObject::connect(m_canvas, TQ_SIGNAL(sigGotDoubleClickEvent(KisDoubleClickEvent*)),
this, TQ_SLOT(canvasGotDoubleClickEvent(KisDoubleClickEvent*)));
3168 TQObject::connect(m_canvas, TQ_SIGNAL(sigGotMoveEvent(KisMoveEvent*)),
this, TQ_SLOT(canvasGotMoveEvent(KisMoveEvent*)));
3169 TQObject::connect(m_canvas, TQ_SIGNAL(sigGotPaintEvent(TQPaintEvent*)),
this, TQ_SLOT(canvasGotPaintEvent(TQPaintEvent*)));
3170 TQObject::connect(m_canvas, TQ_SIGNAL(sigGotEnterEvent(TQEvent*)),
this, TQ_SLOT(canvasGotEnterEvent(TQEvent*)));
3171 TQObject::connect(m_canvas, TQ_SIGNAL(sigGotLeaveEvent(TQEvent*)),
this, TQ_SLOT(canvasGotLeaveEvent(TQEvent*)));
3172 TQObject::connect(m_canvas, TQ_SIGNAL(sigGotMouseWheelEvent(TQWheelEvent*)),
this, TQ_SLOT(canvasGotMouseWheelEvent(TQWheelEvent*)));
3173 TQObject::connect(m_canvas, TQ_SIGNAL(sigGotKeyPressEvent(TQKeyEvent*)),
this, TQ_SLOT(canvasGotKeyPressEvent(TQKeyEvent*)));
3174 TQObject::connect(m_canvas, TQ_SIGNAL(sigGotKeyReleaseEvent(TQKeyEvent*)),
this, TQ_SLOT(canvasGotKeyReleaseEvent(TQKeyEvent*)));
3175 TQObject::connect(m_canvas, TQ_SIGNAL(sigGotDragEnterEvent(TQDragEnterEvent*)),
this, TQ_SLOT(canvasGotDragEnterEvent(TQDragEnterEvent*)));
3176 TQObject::connect(m_canvas, TQ_SIGNAL(sigGotDropEvent(TQDropEvent*)),
this, TQ_SLOT(canvasGotDropEvent(TQDropEvent*)));
3179void KisView::connectCurrentImg()
3182 connect(m_image, TQ_SIGNAL(sigActiveSelectionChanged(KisImageSP)), m_selectionManager, TQ_SLOT(imgSelectionChanged(KisImageSP)));
3183 connect(m_image, TQ_SIGNAL(sigActiveSelectionChanged(KisImageSP)),
this, TQ_SLOT(updateCanvas()));
3184 connect(m_image, TQ_SIGNAL(sigColorSpaceChanged(
KisColorSpace *)),
this, TQ_SLOT(updateStatusBarProfileLabel()));
3185 connect(m_image, TQ_SIGNAL(sigProfileChanged(KisProfile * )), TQ_SLOT(profileChanged(KisProfile * )));
3187 connect(m_image, TQ_SIGNAL(sigLayersChanged(KisGroupLayerSP)), TQ_SLOT(layersUpdated()));
3188 connect(m_image, TQ_SIGNAL(sigMaskInfoChanged()), TQ_SLOT(maskUpdated()));
3189 connect(m_image, TQ_SIGNAL(sigLayerAdded(KisLayerSP)), TQ_SLOT(layersUpdated()));
3190 connect(m_image, TQ_SIGNAL(sigLayerRemoved(KisLayerSP, KisGroupLayerSP, KisLayerSP)), TQ_SLOT(layersUpdated()));
3191 connect(m_image, TQ_SIGNAL(sigLayerMoved(KisLayerSP, KisGroupLayerSP, KisLayerSP)), TQ_SLOT(layersUpdated()));
3192 connect(m_image, TQ_SIGNAL(sigLayerActivated(KisLayerSP)), TQ_SLOT(layersUpdated()));
3193 connect(m_image, TQ_SIGNAL(sigLayerActivated(KisLayerSP)), TQ_SLOT(updateCanvas()));
3194 connect(m_image, TQ_SIGNAL(sigLayerPropertiesChanged(KisLayerSP)), TQ_SLOT(layersUpdated()));
3197 m_image->rootLayer()->accept(v);
3198 connect(m_image, TQ_SIGNAL(sigLayerAdded(KisLayerSP)),
3199 TQ_SLOT(handlePartLayerAdded(KisLayerSP)));
3203 if (m_OpenGLImageContext != 0) {
3204 connect(m_OpenGLImageContext, TQ_SIGNAL(sigImageUpdated(TQRect)), TQ_SLOT(slotOpenGLImageUpdated(TQRect)));
3205 connect(m_OpenGLImageContext, TQ_SIGNAL(sigSizeChanged(TQ_INT32, TQ_INT32)), TQ_SLOT(slotImageSizeChanged(TQ_INT32, TQ_INT32)));
3209 connect(m_image, TQ_SIGNAL(sigImageUpdated(TQRect)), TQ_SLOT(imgUpdated(TQRect)));
3210 connect(m_image, TQ_SIGNAL(sigSizeChanged(TQ_INT32, TQ_INT32)), TQ_SLOT(slotImageSizeChanged(TQ_INT32, TQ_INT32)));
3214 m_layerBox->setImage(m_image);
3215 m_birdEyeBox->setImage(m_image);
3218void KisView::disconnectCurrentImg()
3221 m_image->disconnect(
this);
3222 m_layerBox->setImage(0);
3223 m_birdEyeBox->setImage(0);
3226 m_image->rootLayer()->accept(v);
3230 if (m_OpenGLImageContext != 0) {
3231 m_OpenGLImageContext->disconnect(
this);
3236void KisView::handlePartLayerAdded(KisLayerSP layer)
3242 connect(
this, TQ_SIGNAL(childActivated(KoDocumentChild*)),
3243 layer, TQ_SLOT(childActivated(KoDocumentChild*)));
3246void KisView::imgUpdated(TQRect rc)
3251void KisView::slotOpenGLImageUpdated(TQRect rc)
3253 paintOpenGLView(windowToView(rc));
3256void KisView::profileChanged(KisProfile * )
3258 updateStatusBarProfileLabel();
3261void KisView::slotImageSizeChanged(TQ_INT32 , TQ_INT32 )
3267void KisView::resizeCurrentImage(TQ_INT32 w, TQ_INT32 h,
bool cropLayers)
3269 if (!currentImg())
return;
3271 currentImg()->resize(w, h, cropLayers);
3272 m_doc->setModified(
true);
3276void KisView::scaleCurrentImage(
double sx,
double sy, KisFilterStrategy *filterStrategy)
3278 if (!currentImg())
return;
3279 currentImg()->scale(sx, sy, m_progress, filterStrategy);
3280 m_doc->setModified(
true);
3284void KisView::rotateCurrentImage(
double radians)
3286 if (!currentImg())
return;
3287 currentImg()->rotate(radians, m_progress);
3288 m_doc->setModified(
true);
3292void KisView::shearCurrentImage(
double angleX,
double angleY)
3294 if (!currentImg())
return;
3295 currentImg()->shear(angleX, angleY, m_progress);
3296 m_doc->setModified(
true);
3301TQPoint KisView::viewToWindow(
const TQPoint& pt)
3305 converted.rx() =
static_cast<int>((pt.x() + horzValue()) / zoom());
3306 converted.ry() =
static_cast<int>((pt.y() + vertValue()) / zoom());
3311TQPoint KisView::viewToWindow(
const TQPoint& pt)
const
3315 converted.rx() =
static_cast<int>((pt.x() + horzValue()) / zoom());
3316 converted.ry() =
static_cast<int>((pt.y() + vertValue()) / zoom());
3325 converted.setX((pt.x() + horzValue()) / zoom());
3326 converted.setY((pt.y() + vertValue()) / zoom());
3331TQRect KisView::viewToWindow(
const TQRect& rc)
3335 r.setTopLeft(viewToWindow(rc.topLeft()));
3336 r.setRight((
int)(ceil((rc.right() + 1.0 + horzValue()) / zoom()) - 1));
3337 r.setBottom((
int)(ceil((rc.bottom() + 1.0 + vertValue()) / zoom()) - 1));
3348 r.setWidth(rc.width() / zoom());
3349 r.setHeight(rc.height() / zoom());
3354void KisView::viewToWindow(TQ_INT32 *x, TQ_INT32 *y)
3357 TQPoint p = viewToWindow(TQPoint(*x, *y));
3363TQPoint KisView::windowToView(
const TQPoint& pt)
3366 p.setX(
static_cast<int>(pt.x() * zoom() - horzValue()));
3367 p.setY(
static_cast<int>(pt.y() * zoom() - vertValue()));
3372TQPoint KisView::windowToView(
const TQPoint& pt)
const
3375 p.setX(
static_cast<int>(pt.x() * zoom() - horzValue()));
3376 p.setY(
static_cast<int>(pt.y() * zoom() - vertValue()));
3384 p.setX(pt.x() * zoom() - horzValue());
3385 p.setY(pt.y() * zoom() - vertValue());
3390TQRect KisView::windowToView(
const TQRect& rc)
3394 r.setTopLeft(windowToView(rc.topLeft()));
3395 r.setRight((
int)(ceil((rc.right() + 1.0) * zoom()) - horzValue() - 1));
3396 r.setBottom((
int)(ceil((rc.bottom() + 1.0) * zoom()) - vertValue() - 1));
3407 r.setWidth(rc.width() * zoom());
3408 r.setHeight(rc.height() * zoom());
3413void KisView::windowToView(TQ_INT32 *x, TQ_INT32 *y)
3416 TQPoint p = windowToView(TQPoint(*x, *y));
3422void KisView::guiActivateEvent(KParts::GUIActivateEvent *event)
3426 if (event->activated()) {
3428 KStatusBar *sb = statusBar();
3433 if (!m_guiActivateEventReceived) {
3434 m_guiActivateEventReceived =
true;
3435 startInitialZoomTimerIfReady();
3439 super::guiActivateEvent(event);
3442bool KisView::eventFilter(TQObject *o, TQEvent *e)
3447 switch (e->type()) {
3448 case TQEvent::TabletMove:
3449 case TQEvent::TabletPress:
3450 case TQEvent::TabletRelease:
3452 TQTabletEvent *te =
static_cast<TQTabletEvent*
>(e);
3453 KisInputDevice device;
3455 switch (te->device()) {
3457 case TQTabletEvent::Stylus:
3458 case TQTabletEvent::NoDevice:
3459 device = KisInputDevice::stylus();
3461 case TQTabletEvent::Puck:
3462 device = KisInputDevice::puck();
3464 case TQTabletEvent::Eraser:
3465 device = KisInputDevice::eraser();
3469 setInputDevice(device);
3474 m_tabletEventTimer.start();
3477 case TQEvent::MouseButtonPress:
3478 case TQEvent::MouseMove:
3479 case TQEvent::MouseButtonRelease:
3481#ifdef EXTENDED_X11_TABLET_SUPPORT
3482 KisInputDevice device = KisCanvasWidget::findActiveInputDevice();
3484 if (device != KisInputDevice::mouse()) {
3485 setInputDevice(device);
3486 m_tabletEventTimer.start();
3490 if (currentInputDevice() != KisInputDevice::mouse() && m_tabletEventTimer.elapsed() > MOUSE_CHANGE_EVENT_DELAY) {
3491 setInputDevice(KisInputDevice::mouse());
3496 case TQEvent::KeyPress:
3497 case TQEvent::KeyRelease:
3499 if (m_canvas->cursorIsOverCanvas()) {
3500 m_canvas->handleKeyEvent(e);
3510 case TQEvent::ChildInserted:
3512 TQChildEvent *childEvent =
static_cast<TQChildEvent *
>(e);
3513 TQObject *child = childEvent->child();
3514 if ( child->isWidgetType() ) {
3516 child->installEventFilter(
this);
3518 TQObjectList *objectList = child->queryList(
"TQWidget");
3519 TQObjectListIt it(*objectList);
3521 while ((obj = it.current()) != 0) {
3522 obj->installEventFilter(
this);
3535 if ((o == m_hRuler || o == m_vRuler) && (e->type() == TQEvent::MouseMove || e->type() == TQEvent::MouseButtonRelease)) {
3536 TQMouseEvent *me =
dynamic_cast<TQMouseEvent*
>(e);
3537 TQPoint pt = mapFromGlobal(me->globalPos());
3538 KisImageSP img = currentImg();
3542 return super::eventFilter(o, e);
3544 mgr = img->guides();
3546 if (e->type() == TQEvent::MouseMove && (me->state() & TQt::LeftButton)) {
3547 bool flag = geometry().contains(pt);
3550 if (m_currentGuide == 0 && flag) {
3558 gd = mgr->add((pt.x() - m_vRuler->width() + horzValue()) / zoom(), TQt::Vertical);
3560 gd = mgr->add((pt.y() - m_hRuler->height() + vertValue()) / zoom(), TQt::Horizontal);
3562 m_currentGuide = gd;
3564 m_lastGuidePoint = mapToScreen(pt);
3565 }
else if (m_currentGuide) {
3568 KisMoveEvent kme(currentInputDevice(), pt, me->globalPos(), PRESSURE_DEFAULT, 0, 0, me->state());
3569 canvasGotMoveEvent(&kme);
3574 mgr->remove(m_currentGuide);
3579 }
else if (e->type() == TQEvent::MouseButtonRelease && m_currentGuide) {
3581 mgr->unselect(m_currentGuide);
3585 KisMoveEvent kme(currentInputDevice(), pt, me->globalPos(), PRESSURE_DEFAULT, 0, 0, TQt::NoButton);
3586 canvasGotMoveEvent(&kme);
3591 return super::eventFilter(o, e);
3595void KisView::eraseGuides()
3597 KisImageSP img = currentImg();
3600 KisGuideMgr *mgr = img->guides();
3603 mgr->erase(&m_canvasPixmap,
this, horzValue(), vertValue(), zoom());
3607void KisView::paintGuides()
3609 KisImageSP img = currentImg();
3612 KisGuideMgr *mgr = img->guides();
3615 mgr->paint(&m_canvasPixmap,
this, horzValue(), vertValue(), zoom());
3619void KisView::updateGuides()
3630TQPoint KisView::mapToScreen(
const TQPoint& pt)
3634 converted.rx() = pt.x() + horzValue();
3635 converted.ry() = pt.y() + vertValue();
3643 m_observers.push_back(observer);
3650 vKisCanvasObserver_it it = std::find(m_observers.begin(), m_observers.end(), observer);
3652 if (it != m_observers.end())
3653 m_observers.erase(it);
3657void KisView::notifyObservers()
3659 for (vKisCanvasObserver_it it = m_observers.begin(); it != m_observers.end(); ++it) {
3660 (*it)->update(
this);
3664KisImageSP KisView::currentImg()
const
3669void KisView::setCurrentImage(KisImageSP image)
3673 disconnectCurrentImg();
3679 if (cfg.useOpenGL()) {
3680 m_OpenGLImageContext = KisOpenGLImageContext::getImageContext(image, monitorProfile());
3681 m_canvas->createOpenGLCanvas(m_OpenGLImageContext->sharedContextWidget());
3684 connectCurrentImg();
3685 m_layerBox->setImage(currentImg());
3687 zoomAroundPoint(0, 0, 1.0);
3694 image->blockSignals(
false);
3707KisBrush *KisView::currentBrush()
const
3712KisPattern *KisView::currentPattern()
const
3717KisGradient *KisView::currentGradient()
const
3722KisID KisView::currentPaintop()
const
3727const KisPaintOpSettings *KisView::currentPaintopSettings()
const
3729 return m_paintopSettings;
3732double KisView::zoomFactor()
const
3737KisUndoAdapter *KisView::undoAdapter()
const
3747KisToolControllerInterface *KisView::toolController()
const
3749 return const_cast<KisToolControllerInterface*
>(
static_cast<const KisToolControllerInterface*
>(m_toolManager));
3752KisDoc *KisView::document()
const
3757KisProgressDisplayInterface *KisView::progressDisplay()
const
3762TQCursor KisView::setCanvasCursor(
const TQCursor & cursor)
3764 TQCursor oldCursor = m_canvas->cursor();
3769 switch (cfg.cursorStyle()) {
3770 case CURSOR_STYLE_TOOLICON:
3773 case CURSOR_STYLE_CROSSHAIR:
3774 newCursor = KisCursor::crossCursor();
3776 case CURSOR_STYLE_POINTER:
3777 newCursor = KisCursor::arrowCursor();
3779 case CURSOR_STYLE_OUTLINE:
3786 m_canvas->setCursor(newCursor);
3790float KisView::HDRExposure()
const
3792 return m_HDRExposure;
3795void KisView::setHDRExposure(
float exposure)
3797 if (exposure != m_HDRExposure) {
3798 m_HDRExposure = exposure;
3804void KisView::createDockers()
3807 m_birdEyeBox =
new KisBirdEyeBox(
this);
3808 m_birdEyeBox->setCaption(i18n(
"Overview"));
3809 m_paletteManager->addWidget( m_birdEyeBox,
"birdeyebox", chalk::CONTROL_PALETTE);
3811 m_hsvwidget =
new KoHSVWidget(
this,
"hsv");
3812 m_hsvwidget->setCaption(i18n(
"HSV"));
3814 connect(m_hsvwidget, TQ_SIGNAL(sigFgColorChanged(
const TQColor &)),
this, TQ_SLOT(slotSetFGQColor(
const TQColor &)));
3815 connect(m_hsvwidget, TQ_SIGNAL(sigBgColorChanged(
const TQColor &)),
this, TQ_SLOT(slotSetBGQColor(
const TQColor &)));
3816 connect(
this, TQ_SIGNAL(sigFGQColorChanged(
const TQColor &)), m_hsvwidget, TQ_SLOT(setFgColor(
const TQColor &)));
3817 connect(
this, TQ_SIGNAL(sigBGQColorChanged(
const TQColor &)), m_hsvwidget, TQ_SLOT(setBgColor(
const TQColor &)));
3818 m_paletteManager->addWidget( m_hsvwidget,
"hsvwidget", chalk::COLORBOX, 0, PALETTE_DOCKER,
true);
3820 m_rgbwidget =
new KoRGBWidget(
this,
"rgb");
3821 m_rgbwidget->setCaption(i18n(
"RGB"));
3822 connect(m_rgbwidget, TQ_SIGNAL(sigFgColorChanged(
const TQColor &)),
this, TQ_SLOT(slotSetFGQColor(
const TQColor &)));
3823 connect(m_rgbwidget, TQ_SIGNAL(sigBgColorChanged(
const TQColor &)),
this, TQ_SLOT(slotSetBGQColor(
const TQColor &)));
3824 connect(
this, TQ_SIGNAL(sigFGQColorChanged(
const TQColor &)), m_rgbwidget, TQ_SLOT(setFgColor(
const TQColor &)));
3825 connect(
this, TQ_SIGNAL(sigBGQColorChanged(
const TQColor &)), m_rgbwidget, TQ_SLOT(setBgColor(
const TQColor &)));
3826 m_paletteManager->addWidget( m_rgbwidget,
"rgbwidget", chalk::COLORBOX);
3828 m_graywidget =
new KoGrayWidget(
this,
"gray");
3829 m_graywidget->setCaption(i18n(
"Gray"));
3830 connect(m_graywidget, TQ_SIGNAL(sigFgColorChanged(
const TQColor &)),
this, TQ_SLOT(slotSetFGQColor(
const TQColor &)));
3831 connect(m_graywidget, TQ_SIGNAL(sigBgColorChanged(
const TQColor &)),
this, TQ_SLOT(slotSetBGQColor(
const TQColor &)));
3832 connect(
this, TQ_SIGNAL(sigFGQColorChanged(
const TQColor &)), m_graywidget, TQ_SLOT(setFgColor(
const TQColor &)));
3833 connect(
this, TQ_SIGNAL(sigBGQColorChanged(
const TQColor &)), m_graywidget, TQ_SLOT(setBgColor(
const TQColor &)));
3834 m_paletteManager->addWidget( m_graywidget,
"graywidget", chalk::COLORBOX);
3837 emit sigFGQColorChanged(m_fg.toTQColor());
3838 emit sigBGQColorChanged(m_bg.toTQColor());
3841 m_palettewidget->setCaption(i18n(
"Palettes"));
3842 connect(m_palettewidget, TQ_SIGNAL(colorSelected(
const TQColor &)),
3843 this, TQ_SLOT(slotSetFGQColor(
const TQColor &)));
3846 KisResourceServerBase* rServer;
3847 rServer = KisResourceServerRegistry::instance()->get(
"PaletteServer");
3848 TQValueList<KisResource*> resources = rServer->resources();
3849 TQValueList<KisResource*>::iterator it;
3850 for ( it = resources.begin(); it != resources.end(); ++it ) {
3851 m_palettewidget->slotAddPalette( *it );
3853 connect(m_palettewidget, TQ_SIGNAL(colorSelected(
const KisColor &)),
this, TQ_SLOT(slotSetFGColor(
const KisColor &)));
3854 m_paletteManager->addWidget( m_palettewidget,
"palettewidget", chalk::COLORBOX, 10, PALETTE_DOCKER,
true);
3857TQPoint KisView::applyViewTransformations(
const TQPoint& p)
const {
3858 TQPoint point(windowToView(p));
3860 if (m_hRuler->isShown())
3861 point.ry() += m_hRuler->height();
3862 if (m_vRuler -> isShown())
3863 point.rx() += m_vRuler->width();
3868TQPoint KisView::reverseViewTransformations(
const TQPoint& p)
const {
3873 if (m_hRuler -> isShown())
3874 point.ry() -= m_hRuler -> height();
3875 if (m_vRuler -> isShown())
3876 point.rx() -= m_vRuler -> width();
3878 return viewToWindow(point);
3881void KisView::canvasAddChild(KoViewChild *child) {
3882 super::canvasAddChild(child);
3883 connect(
this, TQ_SIGNAL(viewTransformationsChanged()), child, TQ_SLOT(reposition()));
3891void KisView::slotLoadingFinished()
3894 setCurrentImage(document()->currentImage());
3895 m_paletteManager->showWidget(
"layerbox" );
3897 disconnect(document(), TQ_SIGNAL(loadingFinished()),
this, TQ_SLOT(slotLoadingFinished()));
3899 m_imageLoaded =
true;
3900 startInitialZoomTimerIfReady();
3903void KisView::startInitialZoomTimerIfReady()
3905 if (m_imageLoaded && m_showEventReceived && m_guiActivateEventReceived) {
3906 m_initialZoomTimer.start(250,
true);
3910void KisView::slotInitialZoomTimeout()
3912 Q_ASSERT(!m_paintViewEnabled);
3914 m_paintViewEnabled =
true;
3915 setInitialZoomLevel();
3919void KisView::slotCreateMask() {
3926 if (undoAdapter() && undoAdapter()->undo()) {
3927 undoAdapter()->addCommand(cmd);
3931void KisView::slotMaskFromSelection() {
3938 if (undoAdapter() && undoAdapter()->undo()) {
3939 undoAdapter()->addCommand(cmd);
3943void KisView::slotMaskToSelection() {
3950 if (undoAdapter() && undoAdapter()->undo()) {
3951 undoAdapter()->addCommand(cmd);
3955void KisView::slotApplyMask() {
3962 if (undoAdapter() && undoAdapter()->undo()) {
3963 undoAdapter()->addCommand(cmd);
3967void KisView::slotRemoveMask() {
3974 if (undoAdapter() && undoAdapter()->undo()) {
3975 undoAdapter()->addCommand(cmd);
3979void KisView::slotEditMask() {
3987void KisView::slotShowMask() {
3995void KisView::maskUpdated() {
3998 m_createMask->setEnabled(
false);
3999 m_applyMask->setEnabled(
false);
4000 m_removeMask->setEnabled(
false);
4001 m_editMask->setEnabled(
false);
4002 m_showMask->setEnabled(
false);
4005 m_createMask->setEnabled(!layer->
hasMask());
4006 m_maskFromSelection->setEnabled(
true);
4007 m_maskToSelection->setEnabled(layer->
hasMask());
4008 m_applyMask->setEnabled(layer->
hasMask());
4009 m_removeMask->setEnabled(layer->
hasMask());
4011 m_editMask->setEnabled(layer->
hasMask());
4012 m_editMask->setChecked(layer->
editMask());
4013 m_showMask->setEnabled(layer->
hasMask());
4017#include "kis_view.moc"
Class that contains a KisFilter and optionally a KisSelection.
Interface for classes that implement a canvas; i.e., a widget where KisImages are painted onto.
This is the base interface plugins use to implement the Observer design pattern.
The child document is responsible for saving and loading the embedded layers.
KisColorSpace * getRGB8()
Convenience method to get an RGB colorspace with the default lcms profile.
KisColorSpace * getColorSpace(const KisID &csID, const TQString &profileName)
Return the colorspace + profile as named, or NULL if impossible combination.
KisProfile * getProfileByName(const TQString &name)
Return the profile associated with the given product name, or 0.
A colorspace is the definition of a certain color model in Chalk.
A KisColor describes a color in a certain colorspace.
void toTQColor(TQColor *c) const
To save the user the trouble of doing color->colorSpace()->toTQColor(color->data(),...
Visitor that connects all partlayers in an image to a KisView's signals.
Control Frame - status display with access to color selector, brushes, patterns, and preview.
Create a new adjustment layer.
Create a new adjustment layer.
A KisFilterConfiguration is the serializable representation of the filter parameters.
Create all the filter actions for the specified view and implement re-apply filter.
A KisLayer that bundles child layers into a single layer.
virtual KisPaintDeviceSP projection(const TQRect &rect)
will copy from to, if !0, CoW!!
Chalk has a large number of extensible resources.
This small helper class takes an url and an image; tries to import the image at the url and shove the...
This layer is of a type that can be painted on.
void setEditMask(bool b)
Sets the editMask property.
KNamedCommand * createMaskCommand()
Undoable version of createMask.
bool editMask() const
When this returns true, the KisPaintDevice returned in paintDevice will actually be the layer mask (i...
void setRenderMask(bool b)
Set the renderMask property.
KNamedCommand * applyMaskCommand()
Undoable version of applyMask.
KNamedCommand * maskFromSelectionCommand()
Undoable version of createMaskFromSelection.
KNamedCommand * removeMaskCommand()
Undoable version of removeMask.
bool renderMask() const
Returns true if the masked part of the mask will be rendered instead of being transparent.
bool hasMask() const
Does this layer have a layer mask?
KNamedCommand * maskToSelectionCommand()
Undoable, removes the current mask, but converts it to the current selection.
Open Gimp, Photoshop or RIFF palette files.
A PartLayer is a layer that contains a KOffice Part like a KWord document or a KSpread spreadsheet.
An interface for the Part Layer so that we can use it in core/, but can implement it in ui/.
A double-based point class that can return it's coordinates approximated to integers.
A double-based rect class that can return a TQRect that encloses the KisRect.
The KisResource class provides a representation of Chalk image resources.
The selection manager is responsible selections and the clipboard.
This is the definition of the interface Chalk presents to dcop.