/* * This file is part of RawTherapee. * * Copyright (c) 2004-2010 Gabor Horvath * * RawTherapee 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 3 of the License, or * (at your option) any later version. * * RawTherapee 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 RawTherapee. If not, see . */ #include "cursormanager.h" #include "rtimage.h" CursorManager mainWindowCursorManager; CursorManager editWindowCursorManager; void CursorManager::init (Glib::RefPtr mainWindow) { display = Gdk::Display::get_default (); #ifndef NDEBUG if (!display) { printf("Error: no default display!\n"); } #endif Glib::RefPtr add = RTImage::createPixbufFromFile("crosshair-small.png"); Glib::RefPtr colPick = RTImage::createPixbufFromFile("color-picker-hicontrast.png"); Glib::RefPtr colPickAdd = RTImage::createPixbufFromFile("color-picker-add-hicontrast.png"); Glib::RefPtr cropDraw = RTImage::createPixbufFromFile("crop-point-hicontrast.png"); Glib::RefPtr crosshair = RTImage::createPixbufFromFile("crosshair-hicontrast.png"); Glib::RefPtr empty = RTImage::createPixbufFromFile("empty.png"); Glib::RefPtr handClosed = RTImage::createPixbufFromFile("hand-closed-hicontrast.png"); Glib::RefPtr handOpen = RTImage::createPixbufFromFile("hand-open-hicontrast.png"); Glib::RefPtr moveBL = RTImage::createPixbufFromFile("node-move-sw-ne-hicontrast.png"); Glib::RefPtr moveBR = RTImage::createPixbufFromFile("node-move-nw-se-hicontrast.png"); Glib::RefPtr moveL = RTImage::createPixbufFromFile("node-move-x-hicontrast.png"); Glib::RefPtr moveR = RTImage::createPixbufFromFile("node-move-x-hicontrast.png"); Glib::RefPtr moveTL = RTImage::createPixbufFromFile("node-move-nw-se-hicontrast.png"); Glib::RefPtr moveTR = RTImage::createPixbufFromFile("node-move-sw-ne-hicontrast.png"); Glib::RefPtr moveX = RTImage::createPixbufFromFile("node-move-x-hicontrast.png"); Glib::RefPtr moveXY = RTImage::createPixbufFromFile("node-move-xy-hicontrast.png"); Glib::RefPtr moveY = RTImage::createPixbufFromFile("node-move-y-hicontrast.png"); Glib::RefPtr rotate = RTImage::createPixbufFromFile("rotate-aroundnode-hicontrast.png"); Glib::RefPtr wait = RTImage::createPixbufFromFile("gears.png"); // Currently unused, create *-hicontrast once used. double s = RTScalable::getTweakedDPI() / RTScalable::baseDPI; // RTScalable::getDPI() might be preferable, however it imply a lot of work to support this option cAdd = add ? Gdk::Cursor::create(display, add, (int)(8.*s), (int)(8.*s)) : Gdk::Cursor::create(display, Gdk::PLUS); cAddPicker = colPickAdd ? Gdk::Cursor::create(display, colPickAdd, (int)(4.*s), (int)(21.*s)) : Gdk::Cursor::create(display, Gdk::PLUS); cCropDraw = cropDraw ? Gdk::Cursor::create(display, cropDraw, (int)(3.*s), (int)(3.*s)) : Gdk::Cursor::create(display, Gdk::DIAMOND_CROSS); cCrosshair = crosshair ? Gdk::Cursor::create(display, crosshair, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::CROSSHAIR); cEmpty = empty ? Gdk::Cursor::create(display, empty, 12, 12) /* PNG: do not scale */ : Gdk::Cursor::create(display, Gdk::BLANK_CURSOR); cHandClosed = handClosed ? Gdk::Cursor::create(display, handClosed, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::HAND1); cHandOpen = handOpen ? Gdk::Cursor::create(display, handOpen, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::HAND2); cMoveBL = moveBL ? Gdk::Cursor::create(display, moveBL, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::BOTTOM_LEFT_CORNER); cMoveBR = moveBR ? Gdk::Cursor::create(display, moveBR, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::BOTTOM_RIGHT_CORNER); cMoveL = moveL ? Gdk::Cursor::create(display, moveL, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::SB_LEFT_ARROW); cMoveR = moveR ? Gdk::Cursor::create(display, moveR, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::SB_RIGHT_ARROW); cMoveTL = moveTL ? Gdk::Cursor::create(display, moveTL, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::TOP_LEFT_CORNER); cMoveTR = moveTR ? Gdk::Cursor::create(display, moveTR, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::TOP_RIGHT_CORNER); cMoveX = moveX ? Gdk::Cursor::create(display, moveX, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::SB_H_DOUBLE_ARROW); cMoveXY = moveXY ? Gdk::Cursor::create(display, moveXY, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::FLEUR); cMoveY = moveY ? Gdk::Cursor::create(display, moveY, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::SB_V_DOUBLE_ARROW); cRotate = rotate ? Gdk::Cursor::create(display, rotate, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::EXCHANGE); cWB = colPick ? Gdk::Cursor::create(display, colPick, (int)(4.*s), (int)(21.*s)) : Gdk::Cursor::create(display, Gdk::TARGET); cWait = wait ? Gdk::Cursor::create(display, wait, (int)(12.*s), (int)(12.*s)) : Gdk::Cursor::create(display, Gdk::CLOCK); window = mainWindow; } void CursorManager::cleanup() { cAdd.reset(); cAddPicker.reset(); cCropDraw.reset(); cCrosshair.reset(); cHandClosed.reset(); cHandOpen.reset(); cEmpty.reset(); cMoveBL.reset(); cMoveBR.reset(); cMoveL.reset(); cMoveR.reset(); cMoveTL.reset(); cMoveTR.reset(); cMoveX.reset(); cMoveY.reset(); cMoveXY.reset(); cRotate.reset(); cWB.reset(); cWait.reset(); } /* Set the cursor of the given window */ void CursorManager::setCursor (Glib::RefPtr window, CursorShape shape) { switch (shape) { case CursorShape::CSAddColPicker: window->set_cursor(cAddPicker); break; case CursorShape::CSArrow: window->set_cursor(); // set_cursor without any arguments to select system default break; case CursorShape::CSCropSelect: window->set_cursor(cCropDraw); break; case CursorShape::CSCrosshair: window->set_cursor(cCrosshair); break; case CursorShape::CSEmpty: window->set_cursor(cEmpty); break; case CursorShape::CSHandClosed: window->set_cursor(cHandClosed); break; case CursorShape::CSHandOpen: window->set_cursor(cHandOpen); break; case CursorShape::CSMove: window->set_cursor(cHandClosed); break; case CursorShape::CSMove1DH: window->set_cursor(cMoveX); break; case CursorShape::CSMove1DV: window->set_cursor(cMoveY); break; case CursorShape::CSMove2D: window->set_cursor(cMoveXY); break; case CursorShape::CSMoveLeft: window->set_cursor(cMoveL); break; case CursorShape::CSMoveRight: window->set_cursor(cMoveR); break; case CursorShape::CSMoveRotate: window->set_cursor(cRotate); break; case CursorShape::CSPlus: window->set_cursor(cAdd); break; case CursorShape::CSResizeBottomLeft: window->set_cursor(cMoveBL); break; case CursorShape::CSResizeBottomRight: window->set_cursor(cMoveBR); break; case CursorShape::CSResizeDiagonal: window->set_cursor(cMoveXY); break; case CursorShape::CSResizeHeight: window->set_cursor(cMoveY); break; case CursorShape::CSResizeTopLeft: window->set_cursor(cMoveTL); break; case CursorShape::CSResizeTopRight: window->set_cursor(cMoveTR); break; case CursorShape::CSResizeWidth: window->set_cursor(cMoveX); break; case CursorShape::CSSpotWB: window->set_cursor(cWB); break; case CursorShape::CSStraighten: window->set_cursor(cRotate); break; case CursorShape::CSUndefined: break; case CursorShape::CSWait: window->set_cursor(cWait); break; default: window->set_cursor(cCrosshair); } } void CursorManager::setWidgetCursor (Glib::RefPtr window, CursorShape shape) { if (window->get_display() == mainWindowCursorManager.display) { mainWindowCursorManager.setCursor(window, shape); } else if (window->get_display() == editWindowCursorManager.display) { editWindowCursorManager.setCursor(window, shape); } #ifndef NDEBUG else { printf("CursorManager::setWidgetCursor / Error: Display not found!\n"); } #endif } void CursorManager::setCursorOfMainWindow (Glib::RefPtr window, CursorShape shape) { if (window->get_display() == mainWindowCursorManager.display) { mainWindowCursorManager.setCursor(shape); } else if (window->get_display() == editWindowCursorManager.display) { editWindowCursorManager.setCursor(shape); } #ifndef NDEBUG else { printf("CursorManager::setCursorOfMainWindow / Error: Display not found!\n"); } #endif } /* Set the cursor of the main window */ void CursorManager::setCursor (CursorShape shape) { setCursor (window, shape); }