Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
PIM
Trojitá
Commits
abffc02c
Commit
abffc02c
authored
Aug 20, 2013
by
Thomas Lübking
Browse files
other attachment changes
parent
e1f6ecf8
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/Gui/AttachmentView.cpp
View file @
abffc02c
...
...
@@ -30,6 +30,7 @@
#include
"Imap/Model/Utils.h"
#include
<QAction>
#include
<QApplication>
#include
<QDesktopServices>
#include
<QDrag>
#include
<QFileDialog>
...
...
@@ -39,6 +40,8 @@
#include
<QMouseEvent>
#include
<QPushButton>
#include
<QLabel>
#include
<QStyle>
#include
<QStyleOption>
#include
<QTemporaryFile>
#include
<QToolButton>
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
...
...
@@ -52,41 +55,68 @@ namespace Gui
AttachmentView
::
AttachmentView
(
QWidget
*
parent
,
Imap
::
Network
::
MsgPartNetAccessManager
*
manager
,
const
QModelIndex
&
partIndex
,
MessageView
*
messageView
,
QWidget
*
contentWidget
)
:
QFrame
(
parent
),
m_partIndex
(
partIndex
),
m_downloadButton
(
0
),
m_messageView
(
messageView
),
m_downloadAttachment
(
0
),
QFrame
(
parent
),
m_partIndex
(
partIndex
),
m_messageView
(
messageView
),
m_downloadAttachment
(
0
),
m_openAttachment
(
0
),
m_showHideAttachment
(
0
),
m_netAccess
(
manager
),
m_tmpFile
(
0
),
m_contentWidget
(
contentWidget
)
{
QVBoxLayout
*
contentLayout
=
new
QVBoxLayout
(
this
);
QWidget
*
attachmentControls
=
new
QWidget
();
contentLayout
->
addWidget
(
attachmentControls
);
if
(
m_contentWidget
)
{
contentLayout
->
addWidget
(
m_contentWidget
);
}
setSizePolicy
(
QSizePolicy
::
Preferred
,
QSizePolicy
::
Fixed
);
setFrameStyle
(
QFrame
::
NoFrame
);
QHBoxLayout
*
layout
=
new
QHBoxLayout
(
attachmentControls
);
QStyleOption
opt
;
opt
.
initFrom
(
this
);
// not actually required by styles may assume the parameter and segfault otherwise
const
int
padding
=
style
()
->
pixelMetric
(
QStyle
::
PM_DefaultFrameWidth
,
&
opt
,
this
);
setContentsMargins
(
padding
,
0
,
padding
,
0
);
QHBoxLayout
*
layout
=
new
QHBoxLayout
();
layout
->
setContentsMargins
(
0
,
0
,
0
,
0
);
// should be PM_LayoutHorizontalSpacing, but is not implemented by many Qt4 styles -including oxygen- for other conflicts
const
int
spacing
=
style
()
->
pixelMetric
(
QStyle
::
PM_DefaultLayoutSpacing
,
&
opt
,
this
);
layout
->
setSpacing
(
0
);
// Icon on the left
QLabel
*
lbl
=
new
QLabel
();
static
const
QSize
iconSize
(
22
,
22
);
m_icon
=
new
QToolButton
(
this
);
m_icon
->
setAttribute
(
Qt
::
WA_NoMousePropagation
,
false
);
// inform us for DnD
m_icon
->
setAutoRaise
(
true
);
m_icon
->
setIconSize
(
QSize
(
22
,
22
));
m_icon
->
setToolButtonStyle
(
Qt
::
ToolButtonIconOnly
);
m_menu
=
new
QMenu
(
this
);
m_downloadAttachment
=
m_menu
->
addAction
(
loadIcon
(
QLatin1String
(
"document-save-as"
)),
tr
(
"Download"
));
m_openAttachment
=
m_menu
->
addAction
(
tr
(
"Open Directly"
));
connect
(
m_downloadAttachment
,
SIGNAL
(
triggered
()),
this
,
SLOT
(
slotDownloadAttachment
()));
connect
(
m_openAttachment
,
SIGNAL
(
triggered
()),
this
,
SLOT
(
slotOpenAttachment
()));
if
(
m_contentWidget
)
{
m_showHideAttachment
=
m_menu
->
addAction
(
loadIcon
(
QLatin1String
(
"view-preview"
)),
tr
(
"Show Preview"
));
m_showHideAttachment
->
setCheckable
(
true
);
m_showHideAttachment
->
setChecked
(
!
m_contentWidget
->
isHidden
());
connect
(
m_showHideAttachment
,
SIGNAL
(
triggered
(
bool
)),
m_contentWidget
,
SLOT
(
setVisible
(
bool
)));
}
m_icon
->
setDefaultAction
(
m_downloadAttachment
);
QString
mimeDescription
=
partIndex
.
data
(
Imap
::
Mailbox
::
RolePartMimeType
).
toString
();
QString
rawMime
=
mimeDescription
;
QMimeType
mimeType
=
QMimeDatabase
().
mimeTypeForName
(
mimeDescription
);
if
(
mimeType
.
isValid
()
&&
!
mimeType
.
isDefault
())
{
mimeDescription
=
mimeType
.
comment
();
QIcon
ic
o
n
=
QIcon
::
fromTheme
(
mimeType
.
iconName
(),
QIcon
::
fromTheme
(
mimeType
.
genericIconName
(),
loadIcon
(
QLatin1String
(
"mail-attachment"
)))
);
lbl
->
setPixmap
(
icon
.
pixmap
(
iconSize
)
);
QIcon
icn
=
QIcon
::
fromTheme
(
mimeType
.
iconName
(),
QIcon
::
fromTheme
(
mimeType
.
genericIconName
(),
loadIcon
(
QLatin1String
(
"mail-attachment"
)))
);
m_icon
->
setIcon
(
icn
);
}
else
{
lbl
->
setPixmap
(
loadIcon
(
QLatin1String
(
"mail-attachment"
))
.
pixmap
(
iconSize
)
);
m_icon
->
setIcon
(
loadIcon
(
QLatin1String
(
"mail-attachment"
)));
}
layout
->
addWidget
(
lbl
);
layout
->
addWidget
(
m_icon
);
// space between icon and label
layout
->
addSpacing
(
spacing
);
Q
Widget
*
labelArea
=
new
QWidget
()
;
QVBoxLayout
*
subLayout
=
new
QVBoxLayout
(
labelArea
);
Q
VBoxLayout
*
subLayout
=
new
QVBoxLayout
;
subLayout
->
setContentsMargins
(
0
,
0
,
0
,
0
);
// The file name shall be mouse-selectable
lbl
=
new
QLabel
();
QLabel
*
lbl
=
new
QLabel
(
this
);
lbl
->
setTextFormat
(
Qt
::
PlainText
);
lbl
->
setText
(
partIndex
.
data
(
Imap
::
Mailbox
::
RolePartFileName
).
toString
());
lbl
->
setTextInteractionFlags
(
Qt
::
TextSelectableByMouse
);
...
...
@@ -98,43 +128,40 @@ AttachmentView::AttachmentView(QWidget *parent, Imap::Network::MsgPartNetAccessM
if
(
rawMime
!=
mimeDescription
)
{
lbl
->
setToolTip
(
rawMime
);
}
QFont
f
=
lbl
->
font
();
QFont
f
(
lbl
->
font
()
)
;
f
.
setItalic
(
true
);
f
.
setPointSizeF
(
f
.
pointSizeF
()
*
0.8
);
if
(
f
.
pointSize
()
>
-
1
)
// don't try the below on pixel fonts ever.
f
.
setPointSizeF
(
f
.
pointSizeF
()
*
0.8
);
lbl
->
setFont
(
f
);
subLayout
->
addWidget
(
lbl
);
layout
->
addWidget
(
labelArea
);
layout
->
addStretch
();
// Download/Open buttons
m_downloadButton
=
new
QToolButton
();
m_downloadButton
->
setPopupMode
(
QToolButton
::
MenuButtonPopup
);
m_downloadButton
->
setSizePolicy
(
QSizePolicy
::
Fixed
,
QSizePolicy
::
Fixed
);
m_downloadButton
->
setToolButtonStyle
(
Qt
::
ToolButtonTextBesideIcon
);
QMenu
*
menu
=
new
QMenu
(
this
);
m_downloadAttachment
=
menu
->
addAction
(
loadIcon
(
QLatin1String
(
"document-save-as"
)),
tr
(
"Download"
));
m_openAttachment
=
menu
->
addAction
(
tr
(
"Open Directly"
));
connect
(
m_downloadAttachment
,
SIGNAL
(
triggered
()),
this
,
SLOT
(
slotDownloadAttachment
()));
connect
(
m_openAttachment
,
SIGNAL
(
triggered
()),
this
,
SLOT
(
slotOpenAttachment
()));
if
(
m_contentWidget
)
{
m_showHideAttachment
=
menu
->
addAction
(
loadIcon
(
QLatin1String
(
"view-preview"
)),
tr
(
"Show Preview"
));
m_showHideAttachment
->
setCheckable
(
true
);
m_showHideAttachment
->
setChecked
(
!
m_contentWidget
->
isHidden
());
connect
(
m_showHideAttachment
,
SIGNAL
(
triggered
(
bool
)),
m_contentWidget
,
SLOT
(
setVisible
(
bool
)));
}
layout
->
addLayout
(
subLayout
);
m_downloadButton
->
setMenu
(
menu
);
m_downloadButton
->
setDefaultAction
(
m_downloadAttachment
);
// space between label and arrow
layout
->
addSpacing
(
spacing
);
layout
->
addWidget
(
m_downloadButton
);
setSizePolicy
(
QSizePolicy
::
Preferred
,
QSizePolicy
::
Fixed
);
setFrameStyle
(
QFrame
::
StyledPanel
|
QFrame
::
Raised
);
// Arrow
QToolButton
*
arrow
=
new
QToolButton
(
this
);
connect
(
arrow
,
SIGNAL
(
pressed
()),
SLOT
(
showMenu
()));
arrow
->
setArrowType
(
Qt
::
DownArrow
);
arrow
->
setAutoRaise
(
true
);
layout
->
addWidget
(
arrow
);
// push to left against non expanding labels
layout
->
addStretch
(
100
);
QVBoxLayout
*
contentLayout
=
new
QVBoxLayout
(
this
);
contentLayout
->
addLayout
(
layout
);
if
(
m_contentWidget
)
{
contentLayout
->
addWidget
(
m_contentWidget
);
}
}
void
AttachmentView
::
slotDownloadAttachment
()
{
m_downloadButton
->
setEnabled
(
false
);
QIcon
icn
=
m_icon
->
icon
();
// set to the default action by ::setEnabled
m_downloadAttachment
->
setEnabled
(
false
);
m_icon
->
setIcon
(
icn
);
Imap
::
Network
::
FileDownloadManager
*
manager
=
new
Imap
::
Network
::
FileDownloadManager
(
this
,
m_netAccess
,
m_partIndex
);
connect
(
manager
,
SIGNAL
(
fileNameRequested
(
QString
*
)),
this
,
SLOT
(
slotFileNameRequested
(
QString
*
)));
...
...
@@ -180,7 +207,9 @@ void AttachmentView::slotFileNameRequested(QString *fileName)
void
AttachmentView
::
enableDownloadAgain
()
{
m_downloadButton
->
setEnabled
(
true
);
QIcon
icn
=
m_icon
->
icon
();
// set to the default action by ::setEnabled
m_downloadAttachment
->
setEnabled
(
true
);
m_icon
->
setIcon
(
icn
);
}
void
AttachmentView
::
onOpenFailed
()
...
...
@@ -206,13 +235,26 @@ void AttachmentView::openDownloadedAttachment()
m_openAttachment
->
setEnabled
(
true
);
}
void
AttachmentView
::
showMenu
()
{
static_cast
<
QToolButton
*>
(
sender
())
->
setDown
(
false
);
QPoint
p
=
QCursor
::
pos
();
p
.
rx
()
-=
m_menu
->
width
()
/
2
;
m_menu
->
popup
(
p
);
}
void
AttachmentView
::
mousePressEvent
(
QMouseEvent
*
event
)
{
QWidget
*
child
=
childAt
(
event
->
pos
());
if
(
child
==
m_downloadButton
)
{
// We shouldn't really interfere with its operation
m_dragStartPos
=
event
->
pos
();
QFrame
::
mousePressEvent
(
event
);
}
void
AttachmentView
::
mouseMoveEvent
(
QMouseEvent
*
event
)
{
QFrame
::
mouseMoveEvent
(
event
);
if
((
m_dragStartPos
-
event
->
pos
()).
manhattanLength
()
<
QApplication
::
startDragDistance
())
return
;
}
if
(
m_partIndex
.
data
(
Imap
::
Mailbox
::
RoleMessageUid
)
==
0
)
{
return
;
...
...
src/Gui/AttachmentView.h
View file @
abffc02c
...
...
@@ -26,6 +26,7 @@
#include
<QModelIndex>
#include
"Gui/AbstractPartWidget.h"
class
QMenu
;
class
QNetworkReply
;
class
QPushButton
;
class
QTemporaryFile
;
...
...
@@ -60,6 +61,7 @@ public:
virtual
QString
quoteMe
()
const
;
virtual
void
reloadContents
();
protected:
virtual
void
mouseMoveEvent
(
QMouseEvent
*
event
);
virtual
void
mousePressEvent
(
QMouseEvent
*
event
);
private
slots
:
void
slotDownloadAttachment
();
...
...
@@ -70,22 +72,26 @@ private slots:
void
slotFileNameRequested
(
QString
*
fileName
);
void
enableDownloadAgain
();
void
onOpenFailed
();
void
showMenu
();
private:
QPersistentModelIndex
m_partIndex
;
QToolButton
*
m_downloadButton
;
MessageView
*
m_messageView
;
QAction
*
m_downloadAttachment
;
QAction
*
m_openAttachment
;
QAction
*
m_showHideAttachment
;
QMenu
*
m_menu
;
QToolButton
*
m_icon
;
Imap
::
Network
::
MsgPartNetAccessManager
*
m_netAccess
;
QTemporaryFile
*
m_tmpFile
;
QWidget
*
m_contentWidget
;
QPoint
m_dragStartPos
;
AttachmentView
(
const
AttachmentView
&
);
// don't implement
AttachmentView
&
operator
=
(
const
AttachmentView
&
);
// don't implement
};
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment