427 sor
8.1 KiB
C
427 sor
8.1 KiB
C
|
/*
|
||
|
|
||
|
Copyright 2014 S. Razi Alavizadeh
|
||
|
Copyright 2012-2018 Adam Reichold
|
||
|
Copyright 2018 Pavel Sanda
|
||
|
Copyright 2014 Dorian Scholz
|
||
|
|
||
|
This file is part of qpdfview.
|
||
|
|
||
|
qpdfview is free software: you can redistribute it and/or modify
|
||
|
it under the terms of the GNU General Public License as published by
|
||
|
the Free Software Foundation, either version 2 of the License, or
|
||
|
(at your option) any later version.
|
||
|
|
||
|
qpdfview 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 qpdfview. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
*/
|
||
|
|
||
|
#ifndef MISCELLANEOUS_H
|
||
|
#define MISCELLANEOUS_H
|
||
|
|
||
|
#include <QComboBox>
|
||
|
#include <QGraphicsEffect>
|
||
|
#include <QLineEdit>
|
||
|
#include <QMenu>
|
||
|
#include <QPainter>
|
||
|
#include <QProxyStyle>
|
||
|
#include <QSpinBox>
|
||
|
#include <QSplitter>
|
||
|
#include <QTreeView>
|
||
|
|
||
|
class QTextLayout;
|
||
|
|
||
|
namespace qpdfview
|
||
|
{
|
||
|
|
||
|
// graphics composition mode effect
|
||
|
|
||
|
class GraphicsCompositionModeEffect : public QGraphicsEffect
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
GraphicsCompositionModeEffect(QPainter::CompositionMode compositionMode, QObject* parent = 0);
|
||
|
|
||
|
protected:
|
||
|
void draw(QPainter* painter);
|
||
|
|
||
|
private:
|
||
|
QPainter::CompositionMode m_compositionMode;
|
||
|
|
||
|
};
|
||
|
|
||
|
// proxy style
|
||
|
|
||
|
class ProxyStyle : public QProxyStyle
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
ProxyStyle();
|
||
|
|
||
|
bool scrollableMenus() const;
|
||
|
void setScrollableMenus(bool scrollableMenus);
|
||
|
|
||
|
int styleHint(StyleHint hint, const QStyleOption* option, const QWidget* widget, QStyleHintReturn* returnData) const;
|
||
|
|
||
|
private:
|
||
|
Q_DISABLE_COPY(ProxyStyle)
|
||
|
|
||
|
bool m_scrollableMenus;
|
||
|
|
||
|
};
|
||
|
|
||
|
// tool tip menu
|
||
|
|
||
|
class ToolTipMenu : public QMenu
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
explicit ToolTipMenu(QWidget* parent = 0);
|
||
|
ToolTipMenu(const QString& title, QWidget* parent = 0);
|
||
|
|
||
|
protected:
|
||
|
bool event(QEvent* event);
|
||
|
|
||
|
};
|
||
|
|
||
|
// searchable menu
|
||
|
|
||
|
class SearchableMenu : public ToolTipMenu
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
SearchableMenu(const QString& title, QWidget* parent = 0);
|
||
|
|
||
|
bool isSearchable() const;
|
||
|
void setSearchable(bool searchable);
|
||
|
|
||
|
protected:
|
||
|
void hideEvent(QHideEvent* event);
|
||
|
void keyPressEvent(QKeyEvent* event);
|
||
|
|
||
|
private:
|
||
|
bool m_searchable;
|
||
|
QString m_text;
|
||
|
|
||
|
};
|
||
|
|
||
|
// tab bar
|
||
|
|
||
|
class TabBar : public QTabBar
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
explicit TabBar(QWidget* parent = 0);
|
||
|
|
||
|
signals:
|
||
|
void tabDragRequested(int index);
|
||
|
|
||
|
protected:
|
||
|
QSize tabSizeHint(int index) const;
|
||
|
|
||
|
void mousePressEvent(QMouseEvent* event);
|
||
|
void mouseMoveEvent(QMouseEvent* event);
|
||
|
void mouseReleaseEvent(QMouseEvent* event);
|
||
|
|
||
|
private:
|
||
|
Q_DISABLE_COPY(TabBar)
|
||
|
|
||
|
int m_dragIndex;
|
||
|
QPoint m_dragPos;
|
||
|
|
||
|
};
|
||
|
|
||
|
// tab widget
|
||
|
|
||
|
class TabWidget : public QTabWidget
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
explicit TabWidget(QWidget* parent = 0);
|
||
|
|
||
|
bool hasCurrent() const { return currentIndex() != -1; }
|
||
|
|
||
|
QString currentTabText() const { return tabText(currentIndex()); }
|
||
|
void setCurrentTabText(const QString& text) { setTabText(currentIndex(), text); }
|
||
|
|
||
|
QString currentTabToolTip() const { return tabToolTip(currentIndex()); }
|
||
|
void setCurrentTabToolTip(const QString& toolTip) { setTabToolTip(currentIndex(), toolTip); }
|
||
|
|
||
|
int addTab(QWidget* const widget, const bool nextToCurrent,
|
||
|
const QString& label, const QString& toolTip);
|
||
|
|
||
|
enum TabBarPolicy
|
||
|
{
|
||
|
TabBarAsNeeded = 0,
|
||
|
TabBarAlwaysOn = 1,
|
||
|
TabBarAlwaysOff = 2
|
||
|
};
|
||
|
|
||
|
TabBarPolicy tabBarPolicy() const;
|
||
|
void setTabBarPolicy(TabBarPolicy tabBarPolicy);
|
||
|
|
||
|
bool spreadTabs() const;
|
||
|
void setSpreadTabs(bool spreadTabs);
|
||
|
|
||
|
public slots:
|
||
|
void previousTab();
|
||
|
void nextTab();
|
||
|
|
||
|
signals:
|
||
|
void tabDragRequested(int index);
|
||
|
void tabContextMenuRequested(QPoint globalPos, int index);
|
||
|
|
||
|
protected slots:
|
||
|
void on_tabBar_customContextMenuRequested(QPoint pos);
|
||
|
|
||
|
protected:
|
||
|
void tabInserted(int index);
|
||
|
void tabRemoved(int index);
|
||
|
|
||
|
private:
|
||
|
Q_DISABLE_COPY(TabWidget)
|
||
|
|
||
|
TabBarPolicy m_tabBarPolicy;
|
||
|
bool m_spreadTabs;
|
||
|
|
||
|
};
|
||
|
|
||
|
// tree view
|
||
|
|
||
|
class TreeView : public QTreeView
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
explicit TreeView(int expansionRole, QWidget* parent = 0);
|
||
|
|
||
|
public slots:
|
||
|
void expandAbove(const QModelIndex& child);
|
||
|
|
||
|
void expandAll(const QModelIndex& index = QModelIndex());
|
||
|
void collapseAll(const QModelIndex& index = QModelIndex());
|
||
|
|
||
|
int expandedDepth(const QModelIndex& index);
|
||
|
|
||
|
void expandToDepth(const QModelIndex& index, int depth);
|
||
|
void collapseFromDepth(const QModelIndex& index, int depth);
|
||
|
|
||
|
void restoreExpansion(const QModelIndex& index = QModelIndex());
|
||
|
|
||
|
protected:
|
||
|
void keyPressEvent(QKeyEvent* event);
|
||
|
void wheelEvent(QWheelEvent* event);
|
||
|
|
||
|
void contextMenuEvent(QContextMenuEvent* event);
|
||
|
|
||
|
protected slots:
|
||
|
void on_expanded(const QModelIndex& index);
|
||
|
void on_collapsed(const QModelIndex& index);
|
||
|
|
||
|
private:
|
||
|
Q_DISABLE_COPY(TreeView)
|
||
|
|
||
|
int m_expansionRole;
|
||
|
|
||
|
};
|
||
|
|
||
|
// line edit
|
||
|
|
||
|
class LineEdit : public QLineEdit
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
explicit LineEdit(QWidget* parent = 0);
|
||
|
|
||
|
protected:
|
||
|
void mousePressEvent(QMouseEvent* event);
|
||
|
|
||
|
private:
|
||
|
Q_DISABLE_COPY(LineEdit)
|
||
|
|
||
|
};
|
||
|
|
||
|
// combo box
|
||
|
|
||
|
class ComboBox : public QComboBox
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
explicit ComboBox(QWidget* parent = 0);
|
||
|
|
||
|
private:
|
||
|
Q_DISABLE_COPY(ComboBox)
|
||
|
|
||
|
};
|
||
|
|
||
|
// spin box
|
||
|
|
||
|
class SpinBox : public QSpinBox
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
explicit SpinBox(QWidget* parent = 0);
|
||
|
|
||
|
signals:
|
||
|
void returnPressed();
|
||
|
|
||
|
protected:
|
||
|
void keyPressEvent(QKeyEvent* event);
|
||
|
|
||
|
private:
|
||
|
Q_DISABLE_COPY(SpinBox)
|
||
|
|
||
|
};
|
||
|
|
||
|
// mapping spin box
|
||
|
|
||
|
class MappingSpinBox : public SpinBox
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
struct TextValueMapper
|
||
|
{
|
||
|
virtual ~TextValueMapper() {}
|
||
|
|
||
|
virtual QString textFromValue(int val, bool& ok) const = 0;
|
||
|
virtual int valueFromText(const QString& text, bool& ok) const = 0;
|
||
|
};
|
||
|
|
||
|
MappingSpinBox(TextValueMapper* mapper, QWidget* parent = 0);
|
||
|
|
||
|
protected:
|
||
|
QString textFromValue(int val) const;
|
||
|
int valueFromText(const QString& text) const;
|
||
|
|
||
|
QValidator::State validate(QString& input, int& pos) const;
|
||
|
|
||
|
private:
|
||
|
Q_DISABLE_COPY(MappingSpinBox)
|
||
|
|
||
|
QScopedPointer< TextValueMapper > m_mapper;
|
||
|
|
||
|
};
|
||
|
|
||
|
int getMappedNumber(MappingSpinBox::TextValueMapper* mapper,
|
||
|
QWidget* parent, const QString& title, const QString& caption,
|
||
|
int value = 0, int min = -2147483647, int max = 2147483647,
|
||
|
bool* ok = 0, Qt::WindowFlags flags = 0);
|
||
|
|
||
|
// progress line edit
|
||
|
|
||
|
class ProgressLineEdit : public QLineEdit
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
explicit ProgressLineEdit(QWidget* parent = 0);
|
||
|
|
||
|
int progress() const;
|
||
|
void setProgress(int progress);
|
||
|
|
||
|
signals:
|
||
|
void returnPressed(Qt::KeyboardModifiers modifiers);
|
||
|
|
||
|
protected:
|
||
|
void paintEvent(QPaintEvent* event);
|
||
|
void keyPressEvent(QKeyEvent* event);
|
||
|
|
||
|
private:
|
||
|
Q_DISABLE_COPY(ProgressLineEdit)
|
||
|
|
||
|
int m_progress;
|
||
|
|
||
|
};
|
||
|
|
||
|
// search line edit
|
||
|
|
||
|
class SearchLineEdit : public ProgressLineEdit
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
explicit SearchLineEdit(QWidget* parent = 0);
|
||
|
|
||
|
public slots:
|
||
|
void startSearch();
|
||
|
|
||
|
void startTimer();
|
||
|
void stopTimer();
|
||
|
|
||
|
signals:
|
||
|
void searchInitiated(const QString& text, bool modified = false);
|
||
|
|
||
|
protected slots:
|
||
|
void on_timeout();
|
||
|
void on_returnPressed(Qt::KeyboardModifiers modifiers);
|
||
|
|
||
|
private:
|
||
|
Q_DISABLE_COPY(SearchLineEdit)
|
||
|
|
||
|
QTimer* m_timer;
|
||
|
|
||
|
};
|
||
|
|
||
|
// splitter
|
||
|
|
||
|
class Splitter : public QSplitter
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
explicit Splitter(Qt::Orientation orientation, QWidget* parent = 0);
|
||
|
|
||
|
QWidget* currentWidget() const;
|
||
|
void setCurrentWidget(QWidget* const currentWidget);
|
||
|
|
||
|
void setUniformSizes();
|
||
|
|
||
|
signals:
|
||
|
void currentWidgetChanged(QWidget* currentWidget);
|
||
|
|
||
|
protected slots:
|
||
|
void on_focusChanged(QWidget* old, QWidget* now);
|
||
|
|
||
|
private:
|
||
|
Q_DISABLE_COPY(Splitter)
|
||
|
|
||
|
int m_currentIndex;
|
||
|
|
||
|
};
|
||
|
|
||
|
// fallback icons
|
||
|
|
||
|
inline QIcon loadIconWithFallback(const QString& name)
|
||
|
{
|
||
|
QIcon icon = QIcon::fromTheme(name);
|
||
|
|
||
|
if(icon.isNull())
|
||
|
{
|
||
|
icon = QIcon(QLatin1String(":icons/") + name);
|
||
|
}
|
||
|
|
||
|
return icon;
|
||
|
}
|
||
|
|
||
|
void openInNewWindow(const QString& filePath, int page);
|
||
|
|
||
|
} // qpdfview
|
||
|
|
||
|
#endif // MISCELLANEOUS_H
|