in progress
This commit is contained in:
		
						commit
						6cd510e389
					
				
							
								
								
									
										244
									
								
								GlobalActionHelper.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								GlobalActionHelper.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,244 @@
 | 
			
		||||
#include "GlobalActionHelper.h"
 | 
			
		||||
 | 
			
		||||
#include <qt_windows.h>
 | 
			
		||||
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
#include <QApplication>
 | 
			
		||||
 | 
			
		||||
QHash<QPair<quint32, quint32>, QAction*> GlobalActionHelper::actions_;
 | 
			
		||||
 | 
			
		||||
bool GlobalActionHelper::nativeEventFilter(const QByteArray& eventType,
 | 
			
		||||
                                           void* message, long* result)
 | 
			
		||||
{
 | 
			
		||||
  Q_UNUSED (eventType);
 | 
			
		||||
  Q_UNUSED (result);
 | 
			
		||||
  MSG* msg = static_cast<MSG*>(message);
 | 
			
		||||
  if (msg->message == WM_HOTKEY)
 | 
			
		||||
  {
 | 
			
		||||
    const quint32 keycode = HIWORD(msg->lParam);
 | 
			
		||||
    const quint32 modifiers = LOWORD(msg->lParam);
 | 
			
		||||
    QAction* action = actions_.value (qMakePair (keycode, modifiers));
 | 
			
		||||
    Q_CHECK_PTR (action);
 | 
			
		||||
    action->activate (QAction::Trigger);
 | 
			
		||||
  }
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GlobalActionHelper::init()
 | 
			
		||||
{
 | 
			
		||||
  qApp->installNativeEventFilter (new GlobalActionHelper);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool GlobalActionHelper::makeGlobal(QAction* action)
 | 
			
		||||
{
 | 
			
		||||
  QKeySequence hotKey = action->shortcut ();
 | 
			
		||||
  Qt::KeyboardModifiers allMods = Qt::ShiftModifier | Qt::ControlModifier |
 | 
			
		||||
                                  Qt::AltModifier | Qt::MetaModifier;
 | 
			
		||||
  Qt::Key key = hotKey.isEmpty() ?
 | 
			
		||||
                  Qt::Key(0) :
 | 
			
		||||
                  Qt::Key((hotKey[0] ^ allMods) & hotKey[0]);
 | 
			
		||||
  Qt::KeyboardModifiers mods = hotKey.isEmpty() ?
 | 
			
		||||
                                 Qt::KeyboardModifiers(0) :
 | 
			
		||||
                                 Qt::KeyboardModifiers(hotKey[0] & allMods);
 | 
			
		||||
  const quint32 nativeKey = nativeKeycode(key);
 | 
			
		||||
  const quint32 nativeMods = nativeModifiers(mods);
 | 
			
		||||
  const bool res = registerHotKey(nativeKey, nativeMods);
 | 
			
		||||
  if (res)
 | 
			
		||||
    actions_.insert (qMakePair(nativeKey, nativeMods), action);
 | 
			
		||||
  else
 | 
			
		||||
    qWarning() << "Failed to register global hotkey:" << hotKey.toString();
 | 
			
		||||
  return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
quint32 GlobalActionHelper::nativeKeycode(Qt::Key key)
 | 
			
		||||
{
 | 
			
		||||
  switch (key)
 | 
			
		||||
  {
 | 
			
		||||
    case Qt::Key_Escape:
 | 
			
		||||
      return VK_ESCAPE;
 | 
			
		||||
    case Qt::Key_Tab:
 | 
			
		||||
    case Qt::Key_Backtab:
 | 
			
		||||
      return VK_TAB;
 | 
			
		||||
    case Qt::Key_Backspace:
 | 
			
		||||
      return VK_BACK;
 | 
			
		||||
    case Qt::Key_Return:
 | 
			
		||||
    case Qt::Key_Enter:
 | 
			
		||||
      return VK_RETURN;
 | 
			
		||||
    case Qt::Key_Insert:
 | 
			
		||||
      return VK_INSERT;
 | 
			
		||||
    case Qt::Key_Delete:
 | 
			
		||||
      return VK_DELETE;
 | 
			
		||||
    case Qt::Key_Pause:
 | 
			
		||||
      return VK_PAUSE;
 | 
			
		||||
    case Qt::Key_Print:
 | 
			
		||||
      return VK_PRINT;
 | 
			
		||||
    case Qt::Key_Clear:
 | 
			
		||||
      return VK_CLEAR;
 | 
			
		||||
    case Qt::Key_Home:
 | 
			
		||||
      return VK_HOME;
 | 
			
		||||
    case Qt::Key_End:
 | 
			
		||||
      return VK_END;
 | 
			
		||||
    case Qt::Key_Left:
 | 
			
		||||
      return VK_LEFT;
 | 
			
		||||
    case Qt::Key_Up:
 | 
			
		||||
      return VK_UP;
 | 
			
		||||
    case Qt::Key_Right:
 | 
			
		||||
      return VK_RIGHT;
 | 
			
		||||
    case Qt::Key_Down:
 | 
			
		||||
      return VK_DOWN;
 | 
			
		||||
    case Qt::Key_PageUp:
 | 
			
		||||
      return VK_PRIOR;
 | 
			
		||||
    case Qt::Key_PageDown:
 | 
			
		||||
      return VK_NEXT;
 | 
			
		||||
    case Qt::Key_F1:
 | 
			
		||||
      return VK_F1;
 | 
			
		||||
    case Qt::Key_F2:
 | 
			
		||||
      return VK_F2;
 | 
			
		||||
    case Qt::Key_F3:
 | 
			
		||||
      return VK_F3;
 | 
			
		||||
    case Qt::Key_F4:
 | 
			
		||||
      return VK_F4;
 | 
			
		||||
    case Qt::Key_F5:
 | 
			
		||||
      return VK_F5;
 | 
			
		||||
    case Qt::Key_F6:
 | 
			
		||||
      return VK_F6;
 | 
			
		||||
    case Qt::Key_F7:
 | 
			
		||||
      return VK_F7;
 | 
			
		||||
    case Qt::Key_F8:
 | 
			
		||||
      return VK_F8;
 | 
			
		||||
    case Qt::Key_F9:
 | 
			
		||||
      return VK_F9;
 | 
			
		||||
    case Qt::Key_F10:
 | 
			
		||||
      return VK_F10;
 | 
			
		||||
    case Qt::Key_F11:
 | 
			
		||||
      return VK_F11;
 | 
			
		||||
    case Qt::Key_F12:
 | 
			
		||||
      return VK_F12;
 | 
			
		||||
    case Qt::Key_F13:
 | 
			
		||||
      return VK_F13;
 | 
			
		||||
    case Qt::Key_F14:
 | 
			
		||||
      return VK_F14;
 | 
			
		||||
    case Qt::Key_F15:
 | 
			
		||||
      return VK_F15;
 | 
			
		||||
    case Qt::Key_F16:
 | 
			
		||||
      return VK_F16;
 | 
			
		||||
    case Qt::Key_F17:
 | 
			
		||||
      return VK_F17;
 | 
			
		||||
    case Qt::Key_F18:
 | 
			
		||||
      return VK_F18;
 | 
			
		||||
    case Qt::Key_F19:
 | 
			
		||||
      return VK_F19;
 | 
			
		||||
    case Qt::Key_F20:
 | 
			
		||||
      return VK_F20;
 | 
			
		||||
    case Qt::Key_F21:
 | 
			
		||||
      return VK_F21;
 | 
			
		||||
    case Qt::Key_F22:
 | 
			
		||||
      return VK_F22;
 | 
			
		||||
    case Qt::Key_F23:
 | 
			
		||||
      return VK_F23;
 | 
			
		||||
    case Qt::Key_F24:
 | 
			
		||||
      return VK_F24;
 | 
			
		||||
    case Qt::Key_Space:
 | 
			
		||||
      return VK_SPACE;
 | 
			
		||||
    case Qt::Key_Asterisk:
 | 
			
		||||
      return VK_MULTIPLY;
 | 
			
		||||
    case Qt::Key_Plus:
 | 
			
		||||
      return VK_ADD;
 | 
			
		||||
    case Qt::Key_Comma:
 | 
			
		||||
      return VK_SEPARATOR;
 | 
			
		||||
    case Qt::Key_Minus:
 | 
			
		||||
      return VK_SUBTRACT;
 | 
			
		||||
    case Qt::Key_Slash:
 | 
			
		||||
      return VK_DIVIDE;
 | 
			
		||||
    case Qt::Key_MediaNext:
 | 
			
		||||
      return VK_MEDIA_NEXT_TRACK;
 | 
			
		||||
    case Qt::Key_MediaPrevious:
 | 
			
		||||
      return VK_MEDIA_PREV_TRACK;
 | 
			
		||||
    case Qt::Key_MediaPlay:
 | 
			
		||||
      return VK_MEDIA_PLAY_PAUSE;
 | 
			
		||||
    case Qt::Key_MediaStop:
 | 
			
		||||
      return VK_MEDIA_STOP;
 | 
			
		||||
      // couldn't find those in VK_*
 | 
			
		||||
      //case Qt::Key_MediaLast:
 | 
			
		||||
      //case Qt::Key_MediaRecord:
 | 
			
		||||
    case Qt::Key_VolumeDown:
 | 
			
		||||
      return VK_VOLUME_DOWN;
 | 
			
		||||
    case Qt::Key_VolumeUp:
 | 
			
		||||
      return VK_VOLUME_UP;
 | 
			
		||||
    case Qt::Key_VolumeMute:
 | 
			
		||||
      return VK_VOLUME_MUTE;
 | 
			
		||||
 | 
			
		||||
      // numbers
 | 
			
		||||
    case Qt::Key_0:
 | 
			
		||||
    case Qt::Key_1:
 | 
			
		||||
    case Qt::Key_2:
 | 
			
		||||
    case Qt::Key_3:
 | 
			
		||||
    case Qt::Key_4:
 | 
			
		||||
    case Qt::Key_5:
 | 
			
		||||
    case Qt::Key_6:
 | 
			
		||||
    case Qt::Key_7:
 | 
			
		||||
    case Qt::Key_8:
 | 
			
		||||
    case Qt::Key_9:
 | 
			
		||||
      return key;
 | 
			
		||||
 | 
			
		||||
      // letters
 | 
			
		||||
    case Qt::Key_A:
 | 
			
		||||
    case Qt::Key_B:
 | 
			
		||||
    case Qt::Key_C:
 | 
			
		||||
    case Qt::Key_D:
 | 
			
		||||
    case Qt::Key_E:
 | 
			
		||||
    case Qt::Key_F:
 | 
			
		||||
    case Qt::Key_G:
 | 
			
		||||
    case Qt::Key_H:
 | 
			
		||||
    case Qt::Key_I:
 | 
			
		||||
    case Qt::Key_J:
 | 
			
		||||
    case Qt::Key_K:
 | 
			
		||||
    case Qt::Key_L:
 | 
			
		||||
    case Qt::Key_M:
 | 
			
		||||
    case Qt::Key_N:
 | 
			
		||||
    case Qt::Key_O:
 | 
			
		||||
    case Qt::Key_P:
 | 
			
		||||
    case Qt::Key_Q:
 | 
			
		||||
    case Qt::Key_R:
 | 
			
		||||
    case Qt::Key_S:
 | 
			
		||||
    case Qt::Key_T:
 | 
			
		||||
    case Qt::Key_U:
 | 
			
		||||
    case Qt::Key_V:
 | 
			
		||||
    case Qt::Key_W:
 | 
			
		||||
    case Qt::Key_X:
 | 
			
		||||
    case Qt::Key_Y:
 | 
			
		||||
    case Qt::Key_Z:
 | 
			
		||||
      return key;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
      return 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
quint32 GlobalActionHelper::nativeModifiers(Qt::KeyboardModifiers modifiers)
 | 
			
		||||
{
 | 
			
		||||
  // MOD_ALT, MOD_CONTROL, (MOD_KEYUP), MOD_SHIFT, MOD_WIN
 | 
			
		||||
  quint32 native = 0;
 | 
			
		||||
  if (modifiers & Qt::ShiftModifier)
 | 
			
		||||
    native |= MOD_SHIFT;
 | 
			
		||||
  if (modifiers & Qt::ControlModifier)
 | 
			
		||||
    native |= MOD_CONTROL;
 | 
			
		||||
  if (modifiers & Qt::AltModifier)
 | 
			
		||||
    native |= MOD_ALT;
 | 
			
		||||
  if (modifiers & Qt::MetaModifier)
 | 
			
		||||
    native |= MOD_WIN;
 | 
			
		||||
  // TODO: resolve these?
 | 
			
		||||
  //if (modifiers & Qt::KeypadModifier)
 | 
			
		||||
  //if (modifiers & Qt::GroupSwitchModifier)
 | 
			
		||||
  return native;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool GlobalActionHelper::registerHotKey(quint32 nativeKey, quint32 nativeMods)
 | 
			
		||||
{
 | 
			
		||||
  return RegisterHotKey(0, nativeMods ^ nativeKey, nativeMods, nativeKey);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool GlobalActionHelper::unregisterHotKey(quint32 nativeKey, quint32 nativeMods)
 | 
			
		||||
{
 | 
			
		||||
  return UnregisterHotKey(0, nativeMods ^ nativeKey);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										28
									
								
								GlobalActionHelper.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								GlobalActionHelper.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
			
		||||
#ifndef GLOBALACTIONHELPER_H
 | 
			
		||||
#define GLOBALACTIONHELPER_H
 | 
			
		||||
 | 
			
		||||
// Some functions copied from QXT lib
 | 
			
		||||
 | 
			
		||||
#include <QAbstractNativeEventFilter>
 | 
			
		||||
#include <QAction>
 | 
			
		||||
 | 
			
		||||
class GlobalActionHelper : public QAbstractNativeEventFilter
 | 
			
		||||
{
 | 
			
		||||
  public:
 | 
			
		||||
    bool nativeEventFilter (const QByteArray &eventType, void *message,
 | 
			
		||||
                            long *result);
 | 
			
		||||
 | 
			
		||||
    static void init ();
 | 
			
		||||
    static bool makeGlobal (QAction* action);
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
    static QHash<QPair<quint32, quint32>, QAction*> actions_;
 | 
			
		||||
 | 
			
		||||
    static quint32 nativeKeycode (Qt::Key key);
 | 
			
		||||
    static quint32 nativeModifiers (Qt::KeyboardModifiers modifiers);
 | 
			
		||||
    static bool registerHotKey (quint32 nativeKey, quint32 nativeMods);
 | 
			
		||||
    static bool unregisterHotKey (quint32 nativeKey, quint32 nativeMods);
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // GLOBALACTIONHELPER_H
 | 
			
		||||
							
								
								
									
										73
									
								
								Manager.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								Manager.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,73 @@
 | 
			
		||||
#include "Manager.h"
 | 
			
		||||
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
#include <QSystemTrayIcon>
 | 
			
		||||
#include <QMenu>
 | 
			
		||||
#include <QApplication>
 | 
			
		||||
#include <QDesktopWidget>
 | 
			
		||||
#include <QScreen>
 | 
			
		||||
 | 
			
		||||
#include "SettingsEditor.h"
 | 
			
		||||
#include "SelectionDialog.h"
 | 
			
		||||
#include "GlobalActionHelper.h"
 | 
			
		||||
 | 
			
		||||
Manager::Manager(QObject *parent) :
 | 
			
		||||
  QObject(parent),
 | 
			
		||||
  trayIcon_ (new QSystemTrayIcon (QIcon (":/images/icon.png"), this)),
 | 
			
		||||
  selection_ (new SelectionDialog)
 | 
			
		||||
{
 | 
			
		||||
  trayIcon_->show ();
 | 
			
		||||
  trayIcon_->setContextMenu (trayContextMenu ());
 | 
			
		||||
 | 
			
		||||
  selection_->setWindowIcon (trayIcon_->icon ());
 | 
			
		||||
  connect (this, SIGNAL (showPixmap (QPixmap)),
 | 
			
		||||
           selection_, SLOT (setPixmap (QPixmap)));
 | 
			
		||||
  connect (selection_, SIGNAL (selected (QPixmap)),
 | 
			
		||||
            SLOT (processRegion (QPixmap)));
 | 
			
		||||
 | 
			
		||||
  GlobalActionHelper::init ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Manager::~Manager()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QMenu*Manager::trayContextMenu()
 | 
			
		||||
{
 | 
			
		||||
  QMenu* menu = new QMenu ();
 | 
			
		||||
  QAction* capture = menu->addAction (tr ("Захват"), this, SLOT (capture ()),
 | 
			
		||||
                                      tr ("Ctrl+Alt+Z"));
 | 
			
		||||
  GlobalActionHelper::makeGlobal (capture);
 | 
			
		||||
  menu->addAction (tr ("Настройки"), this, SLOT (settings ()));
 | 
			
		||||
  menu->addAction (tr ("Выход"), this, SLOT (close ()));
 | 
			
		||||
  return menu;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Manager::capture()
 | 
			
		||||
{
 | 
			
		||||
  QList<QScreen*> screens = QApplication::screens ();
 | 
			
		||||
  Q_ASSERT (!screens.isEmpty ());
 | 
			
		||||
  QScreen* screen = screens.first ();
 | 
			
		||||
  Q_CHECK_PTR (screen);
 | 
			
		||||
  WId desktopId = QApplication::desktop ()->winId ();
 | 
			
		||||
  QPixmap pixmap = screen->grabWindow (desktopId);
 | 
			
		||||
  Q_ASSERT (!pixmap.isNull ());
 | 
			
		||||
  emit showPixmap (pixmap);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Manager::settings()
 | 
			
		||||
{
 | 
			
		||||
  SettingsEditor editor;
 | 
			
		||||
  editor.setWindowIcon (trayIcon_->icon ());
 | 
			
		||||
  editor.exec ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Manager::close()
 | 
			
		||||
{
 | 
			
		||||
  QApplication::quit ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Manager::processRegion(QPixmap selected)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										38
									
								
								Manager.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								Manager.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,38 @@
 | 
			
		||||
#ifndef MANAGER_H
 | 
			
		||||
#define MANAGER_H
 | 
			
		||||
 | 
			
		||||
#include <QObject>
 | 
			
		||||
#include <QPixmap>
 | 
			
		||||
 | 
			
		||||
class QMenu;
 | 
			
		||||
class QSystemTrayIcon;
 | 
			
		||||
 | 
			
		||||
class SelectionDialog;
 | 
			
		||||
 | 
			
		||||
class Manager : public QObject
 | 
			
		||||
{
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
  public:
 | 
			
		||||
    explicit Manager(QObject *parent = 0);
 | 
			
		||||
    ~Manager ();
 | 
			
		||||
 | 
			
		||||
  signals:
 | 
			
		||||
    void showPixmap (QPixmap pixmap);
 | 
			
		||||
 | 
			
		||||
  private slots:
 | 
			
		||||
    void capture ();
 | 
			
		||||
    void settings ();
 | 
			
		||||
    void close ();
 | 
			
		||||
 | 
			
		||||
    void processRegion (QPixmap selected);
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
    QMenu* trayContextMenu ();
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
    QSystemTrayIcon* trayIcon_;
 | 
			
		||||
    SelectionDialog* selection_;
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // MANAGER_H
 | 
			
		||||
							
								
								
									
										5
									
								
								Recources.qrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								Recources.qrc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
			
		||||
<RCC>
 | 
			
		||||
    <qresource prefix="/images">
 | 
			
		||||
        <file alias="icon.png">images/icon.png</file>
 | 
			
		||||
    </qresource>
 | 
			
		||||
</RCC>
 | 
			
		||||
							
								
								
									
										32
									
								
								ScreenTranslator.pro
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								ScreenTranslator.pro
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,32 @@
 | 
			
		||||
#-------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
# Project created by QtCreator 2013-11-22T12:00:23
 | 
			
		||||
#
 | 
			
		||||
#-------------------------------------------------
 | 
			
		||||
 | 
			
		||||
QT       += core gui
 | 
			
		||||
 | 
			
		||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 | 
			
		||||
 | 
			
		||||
TARGET = ScreenTranslator
 | 
			
		||||
TEMPLATE = app
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SOURCES += main.cpp\
 | 
			
		||||
    Manager.cpp \
 | 
			
		||||
    SettingsEditor.cpp \
 | 
			
		||||
    SelectionDialog.cpp \
 | 
			
		||||
    GlobalActionHelper.cpp
 | 
			
		||||
 | 
			
		||||
HEADERS  += \
 | 
			
		||||
    Manager.h \
 | 
			
		||||
    SettingsEditor.h \
 | 
			
		||||
    SelectionDialog.h \
 | 
			
		||||
    GlobalActionHelper.h
 | 
			
		||||
 | 
			
		||||
FORMS    += \
 | 
			
		||||
    SettingsEditor.ui \
 | 
			
		||||
    SelectionDialog.ui
 | 
			
		||||
 | 
			
		||||
RESOURCES += \
 | 
			
		||||
    Recources.qrc
 | 
			
		||||
							
								
								
									
										88
									
								
								SelectionDialog.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								SelectionDialog.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,88 @@
 | 
			
		||||
#include "SelectionDialog.h"
 | 
			
		||||
#include "ui_SelectionDialog.h"
 | 
			
		||||
 | 
			
		||||
#include <QMouseEvent>
 | 
			
		||||
#include <QPainter>
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
 | 
			
		||||
SelectionDialog::SelectionDialog(QWidget *parent) :
 | 
			
		||||
  QDialog(parent),
 | 
			
		||||
  ui(new Ui::SelectionDialog)
 | 
			
		||||
{
 | 
			
		||||
  ui->setupUi(this);
 | 
			
		||||
  setWindowFlags (Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint |
 | 
			
		||||
                  Qt::WindowStaysOnTopHint);
 | 
			
		||||
 | 
			
		||||
  ui->label->setAutoFillBackground(false);
 | 
			
		||||
  ui->label->installEventFilter (this);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SelectionDialog::~SelectionDialog()
 | 
			
		||||
{
 | 
			
		||||
  delete ui;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool SelectionDialog::eventFilter(QObject* object, QEvent* event)
 | 
			
		||||
{
 | 
			
		||||
  if (object != ui->label)
 | 
			
		||||
  {
 | 
			
		||||
    return QDialog::eventFilter (object, event);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (event->type () == QEvent::MouseButtonPress)
 | 
			
		||||
  {
 | 
			
		||||
    QMouseEvent* mouseEvent = static_cast <QMouseEvent*> (event);
 | 
			
		||||
    if (mouseEvent->button () == Qt::LeftButton)
 | 
			
		||||
    {
 | 
			
		||||
      startSelectPos_ = mouseEvent->pos ();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else if (event->type () == QEvent::MouseButtonRelease)
 | 
			
		||||
  {
 | 
			
		||||
    QMouseEvent* mouseEvent = static_cast <QMouseEvent*> (event);
 | 
			
		||||
    if (mouseEvent->button () == Qt::LeftButton)
 | 
			
		||||
    {
 | 
			
		||||
      if (startSelectPos_.isNull () || currentPixmap_.isNull ())
 | 
			
		||||
      {
 | 
			
		||||
        QDialog::eventFilter (object, event);
 | 
			
		||||
      }
 | 
			
		||||
      QPoint endPos = mouseEvent->pos ();
 | 
			
		||||
      QRect selection = QRect (startSelectPos_, endPos).normalized ();
 | 
			
		||||
      startSelectPos_ = currentSelectPos_ = QPoint ();
 | 
			
		||||
      QPixmap selectedPixmap = currentPixmap_.copy (selection);
 | 
			
		||||
      emit selected (selectedPixmap);
 | 
			
		||||
//      accept (); //DEBUG
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else if (event->type () == QEvent::MouseMove)
 | 
			
		||||
  {
 | 
			
		||||
    QMouseEvent* mouseEvent = static_cast <QMouseEvent*> (event);
 | 
			
		||||
    if (mouseEvent->buttons () & Qt::LeftButton)
 | 
			
		||||
    {
 | 
			
		||||
      currentSelectPos_ = mouseEvent->pos ();
 | 
			
		||||
      ui->label->repaint ();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else if (event->type () == QEvent::Paint)
 | 
			
		||||
  {
 | 
			
		||||
    QPainter painter (ui->label);
 | 
			
		||||
    painter.setPen (Qt::red);
 | 
			
		||||
    QRect selection = QRect (startSelectPos_, currentSelectPos_).normalized ();
 | 
			
		||||
    painter.drawRect (selection);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return QDialog::eventFilter (object, event);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SelectionDialog::setPixmap(QPixmap pixmap)
 | 
			
		||||
{
 | 
			
		||||
  Q_ASSERT (!pixmap.isNull ());
 | 
			
		||||
  currentPixmap_ = pixmap;
 | 
			
		||||
  QPalette palette = this->palette ();
 | 
			
		||||
  palette.setBrush (this->backgroundRole (), pixmap);
 | 
			
		||||
  this->setPalette (palette);
 | 
			
		||||
  this->resize (pixmap.size ());
 | 
			
		||||
 | 
			
		||||
  show ();
 | 
			
		||||
  setFocus ();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										34
									
								
								SelectionDialog.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								SelectionDialog.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,34 @@
 | 
			
		||||
#ifndef SELECTIONDIALOG_H
 | 
			
		||||
#define SELECTIONDIALOG_H
 | 
			
		||||
 | 
			
		||||
#include <QDialog>
 | 
			
		||||
#include <QPixmap>
 | 
			
		||||
 | 
			
		||||
namespace Ui {
 | 
			
		||||
  class SelectionDialog;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class SelectionDialog : public QDialog
 | 
			
		||||
{
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
 | 
			
		||||
  public:
 | 
			
		||||
    explicit SelectionDialog(QWidget *parent = 0);
 | 
			
		||||
    ~SelectionDialog();
 | 
			
		||||
 | 
			
		||||
    bool eventFilter (QObject *object, QEvent *event);
 | 
			
		||||
 | 
			
		||||
  signals:
 | 
			
		||||
    void selected (QPixmap pixmap);
 | 
			
		||||
 | 
			
		||||
  public slots:
 | 
			
		||||
    void setPixmap (QPixmap pixmap);
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
    Ui::SelectionDialog *ui;
 | 
			
		||||
    QPoint startSelectPos_;
 | 
			
		||||
    QPoint currentSelectPos_;
 | 
			
		||||
    QPixmap currentPixmap_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // SELECTIONDIALOG_H
 | 
			
		||||
							
								
								
									
										31
									
								
								SelectionDialog.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								SelectionDialog.ui
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,31 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<ui version="4.0">
 | 
			
		||||
 <class>SelectionDialog</class>
 | 
			
		||||
 <widget class="QDialog" name="SelectionDialog">
 | 
			
		||||
  <property name="geometry">
 | 
			
		||||
   <rect>
 | 
			
		||||
    <x>0</x>
 | 
			
		||||
    <y>0</y>
 | 
			
		||||
    <width>400</width>
 | 
			
		||||
    <height>300</height>
 | 
			
		||||
   </rect>
 | 
			
		||||
  </property>
 | 
			
		||||
  <property name="windowTitle">
 | 
			
		||||
   <string>Dialog</string>
 | 
			
		||||
  </property>
 | 
			
		||||
  <layout class="QGridLayout" name="gridLayout">
 | 
			
		||||
   <property name="margin">
 | 
			
		||||
    <number>0</number>
 | 
			
		||||
   </property>
 | 
			
		||||
   <item row="0" column="0">
 | 
			
		||||
    <widget class="QLabel" name="label">
 | 
			
		||||
     <property name="text">
 | 
			
		||||
      <string/>
 | 
			
		||||
     </property>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
  </layout>
 | 
			
		||||
 </widget>
 | 
			
		||||
 <resources/>
 | 
			
		||||
 <connections/>
 | 
			
		||||
</ui>
 | 
			
		||||
							
								
								
									
										14
									
								
								SettingsEditor.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								SettingsEditor.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
			
		||||
#include "SettingsEditor.h"
 | 
			
		||||
#include "ui_SettingsEditor.h"
 | 
			
		||||
 | 
			
		||||
SettingsEditor::SettingsEditor(QWidget *parent) :
 | 
			
		||||
  QDialog(parent),
 | 
			
		||||
  ui(new Ui::SettingsEditor)
 | 
			
		||||
{
 | 
			
		||||
  ui->setupUi(this);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SettingsEditor::~SettingsEditor()
 | 
			
		||||
{
 | 
			
		||||
  delete ui;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								SettingsEditor.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								SettingsEditor.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
			
		||||
#ifndef SETTINGSEDITOR_H
 | 
			
		||||
#define SETTINGSEDITOR_H
 | 
			
		||||
 | 
			
		||||
#include <QDialog>
 | 
			
		||||
 | 
			
		||||
namespace Ui {
 | 
			
		||||
  class SettingsEditor;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class SettingsEditor : public QDialog
 | 
			
		||||
{
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
 | 
			
		||||
  public:
 | 
			
		||||
    explicit SettingsEditor(QWidget *parent = 0);
 | 
			
		||||
    ~SettingsEditor();
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
    Ui::SettingsEditor *ui;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // SETTINGSEDITOR_H
 | 
			
		||||
							
								
								
									
										127
									
								
								SettingsEditor.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								SettingsEditor.ui
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,127 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<ui version="4.0">
 | 
			
		||||
 <class>SettingsEditor</class>
 | 
			
		||||
 <widget class="QDialog" name="SettingsEditor">
 | 
			
		||||
  <property name="geometry">
 | 
			
		||||
   <rect>
 | 
			
		||||
    <x>0</x>
 | 
			
		||||
    <y>0</y>
 | 
			
		||||
    <width>400</width>
 | 
			
		||||
    <height>300</height>
 | 
			
		||||
   </rect>
 | 
			
		||||
  </property>
 | 
			
		||||
  <property name="windowTitle">
 | 
			
		||||
   <string>Dialog</string>
 | 
			
		||||
  </property>
 | 
			
		||||
  <widget class="QDialogButtonBox" name="buttonBox">
 | 
			
		||||
   <property name="geometry">
 | 
			
		||||
    <rect>
 | 
			
		||||
     <x>30</x>
 | 
			
		||||
     <y>240</y>
 | 
			
		||||
     <width>341</width>
 | 
			
		||||
     <height>32</height>
 | 
			
		||||
    </rect>
 | 
			
		||||
   </property>
 | 
			
		||||
   <property name="orientation">
 | 
			
		||||
    <enum>Qt::Horizontal</enum>
 | 
			
		||||
   </property>
 | 
			
		||||
   <property name="standardButtons">
 | 
			
		||||
    <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
 | 
			
		||||
   </property>
 | 
			
		||||
  </widget>
 | 
			
		||||
  <widget class="QLabel" name="label">
 | 
			
		||||
   <property name="geometry">
 | 
			
		||||
    <rect>
 | 
			
		||||
     <x>50</x>
 | 
			
		||||
     <y>40</y>
 | 
			
		||||
     <width>46</width>
 | 
			
		||||
     <height>13</height>
 | 
			
		||||
    </rect>
 | 
			
		||||
   </property>
 | 
			
		||||
   <property name="text">
 | 
			
		||||
    <string>TextLabel</string>
 | 
			
		||||
   </property>
 | 
			
		||||
  </widget>
 | 
			
		||||
  <widget class="QLabel" name="label_2">
 | 
			
		||||
   <property name="geometry">
 | 
			
		||||
    <rect>
 | 
			
		||||
     <x>40</x>
 | 
			
		||||
     <y>80</y>
 | 
			
		||||
     <width>46</width>
 | 
			
		||||
     <height>13</height>
 | 
			
		||||
    </rect>
 | 
			
		||||
   </property>
 | 
			
		||||
   <property name="text">
 | 
			
		||||
    <string>TextLabel</string>
 | 
			
		||||
   </property>
 | 
			
		||||
  </widget>
 | 
			
		||||
  <widget class="QLabel" name="label_3">
 | 
			
		||||
   <property name="geometry">
 | 
			
		||||
    <rect>
 | 
			
		||||
     <x>50</x>
 | 
			
		||||
     <y>120</y>
 | 
			
		||||
     <width>46</width>
 | 
			
		||||
     <height>13</height>
 | 
			
		||||
    </rect>
 | 
			
		||||
   </property>
 | 
			
		||||
   <property name="text">
 | 
			
		||||
    <string>One time select</string>
 | 
			
		||||
   </property>
 | 
			
		||||
  </widget>
 | 
			
		||||
  <widget class="QComboBox" name="comboBox">
 | 
			
		||||
   <property name="geometry">
 | 
			
		||||
    <rect>
 | 
			
		||||
     <x>160</x>
 | 
			
		||||
     <y>80</y>
 | 
			
		||||
     <width>69</width>
 | 
			
		||||
     <height>22</height>
 | 
			
		||||
    </rect>
 | 
			
		||||
   </property>
 | 
			
		||||
  </widget>
 | 
			
		||||
  <widget class="QComboBox" name="comboBox_2">
 | 
			
		||||
   <property name="geometry">
 | 
			
		||||
    <rect>
 | 
			
		||||
     <x>160</x>
 | 
			
		||||
     <y>40</y>
 | 
			
		||||
     <width>69</width>
 | 
			
		||||
     <height>22</height>
 | 
			
		||||
    </rect>
 | 
			
		||||
   </property>
 | 
			
		||||
  </widget>
 | 
			
		||||
 </widget>
 | 
			
		||||
 <resources/>
 | 
			
		||||
 <connections>
 | 
			
		||||
  <connection>
 | 
			
		||||
   <sender>buttonBox</sender>
 | 
			
		||||
   <signal>accepted()</signal>
 | 
			
		||||
   <receiver>SettingsEditor</receiver>
 | 
			
		||||
   <slot>accept()</slot>
 | 
			
		||||
   <hints>
 | 
			
		||||
    <hint type="sourcelabel">
 | 
			
		||||
     <x>248</x>
 | 
			
		||||
     <y>254</y>
 | 
			
		||||
    </hint>
 | 
			
		||||
    <hint type="destinationlabel">
 | 
			
		||||
     <x>157</x>
 | 
			
		||||
     <y>274</y>
 | 
			
		||||
    </hint>
 | 
			
		||||
   </hints>
 | 
			
		||||
  </connection>
 | 
			
		||||
  <connection>
 | 
			
		||||
   <sender>buttonBox</sender>
 | 
			
		||||
   <signal>rejected()</signal>
 | 
			
		||||
   <receiver>SettingsEditor</receiver>
 | 
			
		||||
   <slot>reject()</slot>
 | 
			
		||||
   <hints>
 | 
			
		||||
    <hint type="sourcelabel">
 | 
			
		||||
     <x>316</x>
 | 
			
		||||
     <y>260</y>
 | 
			
		||||
    </hint>
 | 
			
		||||
    <hint type="destinationlabel">
 | 
			
		||||
     <x>286</x>
 | 
			
		||||
     <y>274</y>
 | 
			
		||||
    </hint>
 | 
			
		||||
   </hints>
 | 
			
		||||
  </connection>
 | 
			
		||||
 </connections>
 | 
			
		||||
</ui>
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								images/icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								images/icon.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 6.5 KiB  | 
		Loading…
	
		Reference in New Issue
	
	Block a user