OSDN Git Service

Ver0.18
authorMasayuki Satoh <miyabi.satoh@gmail.com>
Fri, 29 Aug 2014 23:13:53 +0000 (08:13 +0900)
committerMasayuki Satoh <miyabi.satoh@gmail.com>
Fri, 29 Aug 2014 23:13:53 +0000 (08:13 +0900)
12 files changed:
Gefu.pro
README.md
ReadMe.txt
anyview.cpp
anyview.ui
bookmarkdialog.ui
installer-full.nsi
installer.nsi
keybind.txt
mainwindow.ui
simpleimageview.cpp
simpleimageview.h

index e9c4f08..0ee3130 100644 (file)
--- a/Gefu.pro
+++ b/Gefu.pro
@@ -40,10 +40,10 @@ SOURCES += main.cpp\
     searchbox.cpp \
     folderview.cpp \
     locationbox.cpp \
-    simpleimageview.cpp \
     anyview.cpp \
     folderpanel.cpp \
-    bookmarkdialog.cpp
+    bookmarkdialog.cpp \
+    simpleimageview.cpp
 
 HEADERS  += mainwindow.h \
     renamesingledialog.h \
@@ -67,10 +67,10 @@ HEADERS  += mainwindow.h \
     folderview.h \
     locationbox.h \
     version.h \
-    simpleimageview.h \
     anyview.h \
     folderpanel.h \
-    bookmarkdialog.h
+    bookmarkdialog.h \
+    simpleimageview.h
 
 FORMS    += mainwindow.ui \
     renamesingledialog.ui \
index 8fed84a..2b1703f 100644 (file)
--- a/README.md
+++ b/README.md
@@ -11,6 +11,9 @@ Gefu is an Experimental File Utility.
   * 簡易FTPクライアント
   * SNS連携(タイムライン表示とか) ← ファイラーの機能か?
 
+#### 2014/08/30 Ver0.18
+  * 画像ビューアに拡大・縮小・回転表示機能を追加。
+
 #### 2014/08/29 Ver0.17
   * コンテキストメニューにファイル操作系アクションを追加。
   * ブックマーク機能を実装。
index f9123f3..8d7d75c 100644 (file)
@@ -1,8 +1,8 @@
 ===============================================================================\r
     Gefu(げふぅ) - Gefu is an Experimental File Utility - \r
-    Version 0.17\r
+    Version 0.18\r
 ===============================================================================\r
-                                                       2014/08/29 @miyabi_satoh\r
+                                                       2014/08/30 @miyabi_satoh\r
 \r
 ◇ 概要 ◇\r
 \r
  ドラッグ&ドロップすれば、コピーします。\r
 \r
 ◇ 関連リソース ◇\r
Webページ ... http://gefu.sourceforge.jp/\r
公式サイト ... http://gefu.sourceforge.jp/\r
    導入方法などを解説しています。\r
- Wiki ... http://sourceforge.jp/projects/gefu/wiki/FrontPage\r
プロジェクトWiki ... http://sourceforge.jp/projects/gefu/wiki/FrontPage\r
    各種ドキュメントを閲覧できます。\r
  Gefuの作業部屋 ... http://masayuki_satoh.b.sourceforge.jp/\r
    開発ブログです。\r
 \r
 ◇ 免責事項 ◇\r
- - Gefu(げふぅ)はオープンソース・フリーソフトウェアです。\r
+ - Gefuはオープンソース・フリーソフトウェアです。\r
    個人・法人に限らず、どなたでも自由にご使用ください。\r
  - 著作権は @miyabi_satoh が保有します。\r
- - Gefu(げふぅ)を利用したことによる損害には、一切の責任を負いません。\r
+ - Gefuを利用したことによる損害には、一切の責任を負いません。\r
    自己の責任の上でご利用ください。\r
  - 配布・転載を行う場合は @miyabi_satoh までご連絡ください。\r
    特に利益を生じる無断配布・無断転載は固く禁じます。\r
@@ -96,6 +96,9 @@
  Twitter: https://twitter.com/miyabi_satoh\r
 \r
 ◇ 履歴 ◇\r
+#### 2014/08/30 Ver0.18\r
+  * 画像ビューアに拡大・縮小・回転表示機能を追加。\r
+\r
 #### 2014/08/29 Ver0.17\r
   * コンテキストメニューにファイル操作系アクションを追加。\r
   * ブックマーク機能を実装。\r
index f2d003a..244ce8a 100644 (file)
@@ -54,8 +54,8 @@ bool AnyView::setViewItem(const QFileInfo &info)
     }
 
     // 画像ファイル
+    changeView(ViewImage);
     if (ui->graphicsView->setSource(info.absoluteFilePath())) {
-        changeView(ViewImage);
         return true;
     }
 
index 1def817..f9ce915 100644 (file)
@@ -46,6 +46,9 @@
     </widget>
    </item>
    <item>
+    <widget class="SimpleImageView" name="graphicsView"/>
+   </item>
+   <item>
     <widget class="FolderPanel" name="folderPanel" native="true">
      <property name="sizePolicy">
       <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
@@ -55,9 +58,6 @@
      </property>
     </widget>
    </item>
-   <item>
-    <widget class="SimpleImageView" name="graphicsView"/>
-   </item>
   </layout>
  </widget>
  <customwidgets>
    <header>simpletextview.h</header>
   </customwidget>
   <customwidget>
-   <class>SimpleImageView</class>
-   <extends>QGraphicsView</extends>
-   <header>simpleimageview.h</header>
-  </customwidget>
-  <customwidget>
    <class>FolderPanel</class>
    <extends>QWidget</extends>
    <header>folderpanel.h</header>
    <container>1</container>
   </customwidget>
+  <customwidget>
+   <class>SimpleImageView</class>
+   <extends>QGraphicsView</extends>
+   <header>simpleimageview.h</header>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>
index 24f5556..d615216 100644 (file)
@@ -88,6 +88,9 @@
        </item>
        <item>
         <widget class="QPushButton" name="buttonAdd">
+         <property name="focusPolicy">
+          <enum>Qt::StrongFocus</enum>
+         </property>
          <property name="text">
           <string>追加</string>
          </property>
    </item>
   </layout>
  </widget>
+ <tabstops>
+  <tabstop>tableWidget</tabstop>
+  <tabstop>buttonUp</tabstop>
+  <tabstop>buttonDown</tabstop>
+  <tabstop>buttonAdd</tabstop>
+  <tabstop>buttonDelete</tabstop>
+  <tabstop>buttonBox</tabstop>
+ </tabstops>
  <resources/>
  <connections>
   <connection>
index 49de10f..0667031 100644 (file)
@@ -2,7 +2,7 @@
 \r
 ; HM NIS Edit Wizard helper defines\r
 !define PRODUCT_NAME "Gefu"\r
-!define PRODUCT_VERSION "0.17"\r
+!define PRODUCT_VERSION "0.18"\r
 !define PRODUCT_PUBLISHER "@miyabi_satoh"\r
 !define PRODUCT_WEB_SITE "http://gefu.sourceforge.jp/"\r
 !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Gefu.exe"\r
@@ -51,7 +51,7 @@ var ICONS_GROUP
 ; MUI end ------\r
 \r
 Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"\r
-OutFile "Gefu017_full_setup.exe"\r
+OutFile "Gefu018_full_setup.exe"\r
 InstallDir "$PROGRAMFILES\Gefu"\r
 InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""\r
 ShowInstDetails show\r
index e6aa11f..77a6658 100644 (file)
@@ -2,7 +2,7 @@
 \r
 ; HM NIS Edit Wizard helper defines\r
 !define PRODUCT_NAME "Gefu"\r
-!define PRODUCT_VERSION "0.17"\r
+!define PRODUCT_VERSION "0.18"\r
 !define PRODUCT_PUBLISHER "@miyabi_satoh"\r
 !define PRODUCT_WEB_SITE "http://gefu.sourceforge.jp/"\r
 !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Gefu.exe"\r
@@ -51,7 +51,7 @@ var ICONS_GROUP
 ; MUI end ------\r
 \r
 Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"\r
-OutFile "Gefu017_Setup.exe"\r
+OutFile "Gefu018_Setup.exe"\r
 InstallDir "$PROGRAMFILES\Gefu"\r
 InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""\r
 ShowInstDetails show\r
index 07aa33d..9414926 100644 (file)
@@ -6,11 +6,11 @@
 ||C         ||ファイル名をクリップボードにコピー ||フルパスをクリップボードにコピー ||                               ||隣のペインにアイテムをコピー ||Copy                           ||
 ||D         ||                                   ||                                 ||                               ||選択アイテムを削除           ||Delete                         ||
 ||E         ||外部エディタで開く                 ||                                 ||                               ||ファイルを作成               ||Edit, newの「E」               ||
-||G         ||ã\82«ã\83¼ã\82½ã\83«ã\82\92å\85\88é ­ã\81«ç§»å\8b\95               ||ã\82«ã\83¼ã\82½ã\83«ã\82\92æ\9c«å°¾ã\81«ç§»å\8b\95             ||                               ||                             ||Go                             ||
+||G         ||ã\83\95ã\82©ã\83«ã\83\80ã\82\92é\81¸æ\8a\9eã\81\97ã\81¦ç§»å\8b\95             ||                                 ||                               ||                             ||Go                             ||
 ||H         ||ホームフォルダに移動               ||隠しファイルを表示/非表示        ||                               ||                             ||Home, Hide                     ||
 ||I         ||マークを反転                       ||                                 ||                               ||                             ||Invert                         ||
-||J         ||ã\82«ã\83¼ã\82½ã\83«ã\82\92ä¸\8bã\81«ç§»å\8b\95                 ||ã\83\95ã\82©ã\83«ã\83\80ã\82\92é\81¸æ\8a\9eã\81\97ã\81¦ç§»å\8b\95           ||                               ||                             ||viã\81®ã\82­ã\83¼ã\83\90ã\82¤ã\83³ã\83\89, Jump         ||
-||K         ||カーソルを上に移動                 ||                                 ||                               ||フォルダを作成               ||viのキーバインド, mkdirの「K」 ||
+||J         ||ã\82«ã\83¼ã\82½ã\83«ã\82\92ä¸\8bã\81«ç§»å\8b\95                 ||ã\82«ã\83¼ã\82½ã\83«ã\82\92æ\9c«å°¾ã\81«ç§»å\8b\95             ||                               ||                             ||viã\81®ã\82­ã\83¼ã\83\90ã\82¤ã\83³ã\83\89               ||
+||K         ||カーソルを上に移動                 ||カーソルを先頭に移動             ||                               ||フォルダを作成               ||viのキーバインド, mkdirの「K」 ||
 ||L         ||最新の情報に更新                   ||                                 ||                               ||                             ||Load                           ||
 ||M         ||開く                               ||アプリケーションで開く           ||                               ||隣のペインにアイテムを移動   ||viのキーバインド, Move         ||
 ||O         ||隣のパネルと同じフォルダを表示     ||隣のパネルに同じフォルダを表示   ||                               ||                             ||Onaji(同じ)                    ||
index 6e3d95a..470f399 100644 (file)
     <string>フォルダを選択して移動</string>\r
    </property>\r
    <property name="shortcut">\r
-    <string>Shift+J</string>\r
+    <string>G</string>\r
    </property>\r
   </action>\r
   <action name="move_Home">\r
     <string>カーソルを先頭に</string>\r
    </property>\r
    <property name="shortcut">\r
-    <string>G</string>\r
+    <string>Shift+J</string>\r
    </property>\r
   </action>\r
   <action name="move_End">\r
     <string>カーソルを末尾に</string>\r
    </property>\r
    <property name="shortcut">\r
-    <string>Shift+G</string>\r
+    <string>Shift+K</string>\r
    </property>\r
   </action>\r
   <action name="action_OpenEditor">\r
   </action>\r
   <action name="check_Update">\r
    <property name="text">\r
-    <string>ã\82¢ã\83\83ã\83\97ã\83\87ã\83¼ã\83\88ã\81®確認</string>\r
+    <string>ã\82¢ã\83\83ã\83\97ã\83\87ã\83¼ã\83\88ã\82\92確認</string>\r
    </property>\r
    <property name="toolTip">\r
-    <string>ã\82¢ã\83\83ã\83\97ã\83\87ã\83¼ã\83\88ã\81®確認</string>\r
+    <string>ã\82¢ã\83\83ã\83\97ã\83\87ã\83¼ã\83\88ã\82\92確認</string>\r
    </property>\r
    <property name="shortcut">\r
     <string>Shift+Z</string>\r
index 9635264..3f6a6a3 100644 (file)
 #include "simpleimageview.h"
 
 #include <QDebug>
+#include <QSettings>
 #include <QKeyEvent>
+#include <QContextMenuEvent>
+#include <QResizeEvent>
 #include <QAction>
 #include <QMenu>
-#include <QSettings>
 
 SimpleImageView::SimpleImageView(QWidget *parent) :
     QGraphicsView(parent),
-    m_img(),
-    m_back(NULL)
+    m_back(NULL),
+    m_fitToWindow(NULL),
+    m_scaleUp(NULL),
+    m_scaleDown(NULL),
+    m_scaleNormal(NULL),
+    m_rot90(NULL),
+    m_rot180(NULL),
+    m_imgSrc(),
+    m_scaleFactor(0),
+    m_rotateDeg(0)
 {
+    QSettings settings;
+    QPalette pal = palette();
+    pal.setColor(QPalette::Base, settings.value(IniKey_ViewColorBgNormal).value<QColor>());
+    setBackgroundRole(QPalette::Base);
+    setPalette(pal);
+
     setContextMenuPolicy(Qt::DefaultContextMenu);
-    m_back = new QAction(tr("戻る"), this);
-    m_back->setObjectName("back");
 
     QList<QKeySequence> shortcuts;
+    //>>>>> 「戻る」メニュー
+    m_back = new QAction(tr("戻る"), this);
+    m_back->setObjectName("back");
+    shortcuts.clear();
     shortcuts << QKeySequence("Return");
     shortcuts << QKeySequence("Backspace");
     m_back->setShortcuts(shortcuts);
 
-    connect(m_back, SIGNAL(triggered()), this, SLOT(back()));
+    //>>>>> 「ウィンドウにフィット」メニュー
+    m_fitToWindow = new QAction(tr("ウィンドウにフィット"), this);
+    m_fitToWindow->setObjectName("fitToWindow");
+    m_fitToWindow->setCheckable(true);
+    m_fitToWindow->setChecked(true);
+    m_fitToWindow->setShortcut(QKeySequence("Space"));
+
+    //>>>>> 「拡大」メニュー
+    m_scaleUp = new QAction(tr("拡大"), this);
+    m_scaleUp->setObjectName("scaleUp");
+    shortcuts.clear();
+    shortcuts << QKeySequence("+");
+    shortcuts << QKeySequence("Shift++");
+    m_scaleUp->setShortcuts(shortcuts);
+
+    //>>>>> 「縮小」メニュー
+    m_scaleDown = new QAction(tr("縮小"), this);
+    m_scaleDown->setObjectName("scaleDown");
+    m_scaleDown->setShortcut(QKeySequence("-"));
+
+    //>>>>> 「等倍」メニュー
+    m_scaleNormal = new QAction(tr("等倍"), this);
+    m_scaleNormal->setObjectName("scaleUp");
+    shortcuts.clear();
+    shortcuts << QKeySequence("=");
+    shortcuts << QKeySequence("Shift+=");
+    m_scaleNormal->setShortcuts(shortcuts);
+
+    //>>>>> 「右に90度回転」メニュー
+    m_rot90 = new QAction(tr("右に90度回転"), this);
+    m_rot90->setObjectName("rot90");
+    m_rot90->setShortcut(QKeySequence("9"));
+
+    //>>>>> 「右に180度回転」メニュー
+    m_rot180 = new QAction(tr("右に180度回転"), this);
+    m_rot180->setObjectName("rot180");
+    m_rot180->setShortcut(QKeySequence("0"));
+
+    connect(m_back, SIGNAL(triggered()), this, SIGNAL(viewFinished()));
+    connect(m_fitToWindow, SIGNAL(toggled(bool)), this, SLOT(fitToWindow(bool)));
+    connect(m_scaleDown, SIGNAL(triggered()), this, SLOT(scaleDown()));
+    connect(m_scaleNormal, SIGNAL(triggered()), this, SLOT(scaleNormal()));
+    connect(m_scaleUp, SIGNAL(triggered()), this, SLOT(scaleUp()));
+    connect(m_rot90, SIGNAL(triggered()), this, SLOT(rotate90()));
+    connect(m_rot180, SIGNAL(triggered()), this, SLOT(rotate180()));
+
+    setDragMode(ScrollHandDrag);
 }
 
 bool SimpleImageView::setSource(const QString &path)
 {
-    qDebug() << "SimpleImageView::setSource()";
+    QPixmap pixmap(path);
+    if (pixmap.isNull()) {
+        return false;
+    }
 
-    m_img = QPixmap(path);
+    m_imgSrc = pixmap;
+    m_rotateDeg = 0;
+    m_scaleFactor = 0;
+    m_fitToWindow->blockSignals(true);
+    m_fitToWindow->setChecked(true);
+    m_fitToWindow->blockSignals(false);
+
+    QGraphicsScene *scene = new QGraphicsScene(this);
+    scene->addPixmap(pixmap);
+    setScene(scene);
+    return true;
+}
 
-    emit fileInfo(QString("%1x%2x%3bpp")
-                  .arg(m_img.width())
-                  .arg(m_img.height())
-                  .arg(m_img.depth()));
+double SimpleImageView::scaleFactor(const QSize &size)
+{
+    double scaleFactor;
+    if (m_scaleFactor == 0) {
+        double scaleX, scaleY;
+        if (m_rotateDeg == 90 || m_rotateDeg == 270) {
+            scaleX = 1.0 * size.width() / m_imgSrc.height();
+            scaleY = 1.0 * size.height() / m_imgSrc.width();
+        }
+        else {
+            scaleX = 1.0 * size.width() / m_imgSrc.width();
+            scaleY = 1.0 * size.height() / m_imgSrc.height();
+        }
+        scaleFactor =  (scaleX > scaleY) ? scaleY : scaleX;
+    }
+    else {
+        scaleFactor = m_scaleFactor;
+    }
 
-    return !m_img.isNull();
+    return scaleFactor;
 }
 
-void SimpleImageView::back()
+void SimpleImageView::sizeChanged()
 {
-    emit viewFinished();
+    QString str;
+    str = tr("%1px x %2px x %3bpp(%4%)")
+            .arg(m_imgSrc.width())
+            .arg(m_imgSrc.height())
+            .arg(m_imgSrc.depth())
+            .arg(int(scaleFactor(viewport()->size()) * 100));
+    emit fileInfo(str);
 }
 
-void SimpleImageView::paintEvent(QPaintEvent *)
+double SimpleImageView::resizeImage()
 {
-    qDebug() << "SimpleImageView::paintEvent();";
+    double scaleFactor = this->scaleFactor(viewport()->size());
+    m_rotateDeg %= 360;
 
-    QPainter painter(viewport());
-    QPixmap scaledImg;
+    this->setTransform(QTransform());
+    this->translate(width() / 2, height() / 2);
+    this->rotate(m_rotateDeg);
+    this->scale(scaleFactor, scaleFactor);
+    sizeChanged();
 
-    if (m_img.width() < viewport()->width() &&
-        m_img.height() < viewport()->height())
-    {
-        scaledImg = m_img;
+    return scaleFactor;
+}
+
+void SimpleImageView::fitToWindow(bool checked)
+{
+    if (checked) {
+        m_scaleFactor = 0;
     }
-    else {
-        scaledImg = m_img.scaled(viewport()->size(),
-                                 Qt::KeepAspectRatio,
-                                 Qt::SmoothTransformation);
+
+    double scaleFactor = resizeImage();
+
+    if (!checked) {
+        m_scaleFactor = scaleFactor;
     }
 
-    QSettings settings;
-    painter.setBrush(settings.value(IniKey_ViewColorBgNormal).value<QColor>());
-    painter.drawRect(viewport()->rect());
-    painter.drawPixmap(
-                (viewport()->width() - scaledImg.width()) / 2,
-                (viewport()->height() - scaledImg.height()) / 2,
-                scaledImg);
+    sizeChanged();
+}
+
+void SimpleImageView::scaleNormal()
+{
+    m_scaleFactor = 1;
+    resizeImage();
+
+    m_fitToWindow->blockSignals(true);
+    m_fitToWindow->setChecked(false);
+    m_fitToWindow->blockSignals(false);
+}
+
+void SimpleImageView::scaleUp()
+{
+    m_scaleFactor = scaleFactor(viewport()->size()) * 1.25;
+    resizeImage();
+
+    m_fitToWindow->blockSignals(true);
+    m_fitToWindow->setChecked(false);
+    m_fitToWindow->blockSignals(false);
+}
+
+void SimpleImageView::scaleDown()
+{
+    m_scaleFactor = scaleFactor(viewport()->size()) * 0.8;
+    resizeImage();
+
+    m_fitToWindow->blockSignals(true);
+    m_fitToWindow->setChecked(false);
+    m_fitToWindow->blockSignals(false);
+}
+
+void SimpleImageView::rotate90()
+{
+    m_rotateDeg += 90;
+    resizeImage();
+}
+
+void SimpleImageView::rotate180()
+{
+    m_rotateDeg += 180;
+    resizeImage();
 }
 
 void SimpleImageView::keyPressEvent(QKeyEvent *event)
@@ -92,6 +234,22 @@ void SimpleImageView::contextMenuEvent(QContextMenuEvent *event)
     qDebug() << "SimpleImageView::contextMenuEvent();";
 
     QMenu menu(this);
+    menu.addAction(m_fitToWindow);
+    menu.addAction(m_scaleUp);
+    menu.addAction(m_scaleDown);
+    menu.addAction(m_scaleNormal);
+    menu.addSeparator();
+    menu.addAction(m_rot90);
+    menu.addAction(m_rot180);
+    menu.addSeparator();
     menu.addAction(m_back);
     menu.exec(event->globalPos());
 }
+
+void SimpleImageView::resizeEvent(QResizeEvent *event)
+{
+    if (!m_imgSrc.isNull()) {
+        resizeImage();
+    }
+    QGraphicsView::resizeEvent(event);
+}
index e181826..ef62295 100644 (file)
@@ -12,21 +12,40 @@ public:
     bool setSource(const QString &path);
 
 private:
-    QPixmap m_img;
     QAction *m_back;
+    QAction *m_fitToWindow;
+    QAction *m_scaleUp;
+    QAction *m_scaleDown;
+    QAction *m_scaleNormal;
+    QAction *m_rot90;
+    QAction *m_rot180;
+    QPixmap m_imgSrc;
+    double m_scaleFactor;
+    int m_rotateDeg;
+
+private:
+    double scaleFactor(const QSize &size);
+    void updateActions();
+    void sizeChanged();
+    double resizeImage();
 
 signals:
     void viewFinished();
     void fileInfo(const QString &info);
 
-public slots:
-    void back();
+private slots:
+    void fitToWindow(bool checked);
+    void scaleNormal();
+    void scaleUp();
+    void scaleDown();
+    void rotate90();
+    void rotate180();
 
     // QWidget interface
 protected:
-    void paintEvent(QPaintEvent *);
     void keyPressEvent(QKeyEvent *event);
     void contextMenuEvent(QContextMenuEvent *event);
+    void resizeEvent(QResizeEvent *event);
 };
 
 #endif // SIMPLEIMAGEVIEW_H