Initial commit
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
build
|
||||
DEBIAN
|
||||
tools
|
||||
src0.9.4
|
||||
src0.9.5
|
||||
src0.9.6
|
||||
*.deb
|
||||
*.pro.user
|
16
BUILDING
Normal file
@ -0,0 +1,16 @@
|
||||
#######################
|
||||
## Building QupZilla ##
|
||||
#######################
|
||||
|
||||
in src/ folder:
|
||||
qmake QupZilla.pro
|
||||
make (unix) or nmake (Windows)
|
||||
compiled binary is moved to bin folder
|
||||
|
||||
Windows:
|
||||
execute binary from bin folder
|
||||
|
||||
Unix
|
||||
move all folders (data, locale, plugins) to /usr/share/qupzilla
|
||||
move binary to /usr/bin
|
||||
execute binary here
|
159
COPYRIGHT
Normal file
@ -0,0 +1,159 @@
|
||||
*********************************************************************
|
||||
*********************************************************************
|
||||
The QupZilla application itself is licensed under following licension
|
||||
if it is not explicitly defined in source file or in exceptions bellow
|
||||
*********************************************************************
|
||||
*********************************************************************
|
||||
|
||||
QupZilla - very fast web browser based on WebKit
|
||||
Copyright (C) 2010-2011 nowrep
|
||||
|
||||
This program 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.
|
||||
|
||||
This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
******************************************************************
|
||||
******************************************************************
|
||||
Some files in 3rdparty/ folder are under different licenses
|
||||
|
||||
-----------------------------------------------------------
|
||||
lineedit.h, lineedit.cpp, squeezelabel.h, squeezelabel.cpp:
|
||||
-----------------------------------------------------------
|
||||
* Copyright (c) 2008 - 2009, Benjamin C. Meyer <ben@meyerhome.net>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the Benjamin Meyer nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
qtlocalpeer.h, qtlocalpeer.cpp, qtsingleapplication.h, qtsingleapplication.cpp,
|
||||
qtlockedfile.h, qtlockedfile_unix.cpp, qtlockedfile_win.cpp:
|
||||
-----------------------------------------------------------------------------
|
||||
**
|
||||
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of a Qt Solutions component.
|
||||
**
|
||||
** Commercial Usage
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Solutions Commercial License Agreement provided
|
||||
** with the Software or, alternatively, in accordance with the terms
|
||||
** contained in a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain
|
||||
** additional rights. These rights are described in the Nokia Qt LGPL
|
||||
** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
|
||||
** package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Please note Third Party Software included with Qt Solutions may impose
|
||||
** additional restrictions and it is the user's responsibility to ensure
|
||||
** that they have met the licensing requirements of the GPL, LGPL, or Qt
|
||||
** Solutions Commercial license and the relevant license of the Third
|
||||
** Party Software they are using.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact Nokia at qt-info@nokia.com.
|
||||
**
|
||||
---------------------------------------------------------------------------
|
||||
Files clicktoflash.cpp and clicktoflash.h:
|
||||
---------------------------------------------------------------------------
|
||||
/* ============================================================
|
||||
*
|
||||
* Copyright (C) 2009 by Benjamin C. Meyer <ben@meyerhome.net>
|
||||
* Copyright (C) 2010 by Matthieu Gicquel <matgic78@gmail.com>
|
||||
*
|
||||
* This program 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) version 3 or any later version
|
||||
* accepted by the membership of KDE e.V. (or its successor approved
|
||||
* by the membership of KDE e.V.), which shall act as a proxy
|
||||
* defined in Section 14 of version 3 of the license.
|
||||
*
|
||||
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* ============================================================ */
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
Files ecwin7.cpp and ecwin7.h:
|
||||
---------------------------------------------------------------------------
|
||||
/* EcWin7 - Support library for integrating Windows 7 taskbar features
|
||||
* into any Qt application
|
||||
* Copyright (C) 2010 Emanuele Colombo
|
||||
*
|
||||
* This program 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.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
Files qtwin.cpp and qtwin.h are used from
|
||||
http://labs.qt.nokia.com/2009/09/15/using-blur-behind-on-windows/
|
||||
-----------------------------------------------------------------------------
|
||||
In application are used also some icons from Faenza icon set, which are
|
||||
licensed under the GNU/GPL license.
|
||||
More info at http://tiheum.deviantart.com/art/Faenza-Icons-173323228
|
||||
-----------------------------------------------------------------------------
|
675
GPLv3
Normal file
@ -0,0 +1,675 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program 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.
|
||||
|
||||
This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
|
9
README
Normal file
@ -0,0 +1,9 @@
|
||||
#################################
|
||||
## QUPZILLA - WEB BROWSER ##
|
||||
#################################
|
||||
Version: 0.9.7
|
||||
|
||||
QupZilla is new and very fast browser based on WebKit core http://www.webkit.org
|
||||
Written in Qt Framework http://qt.nokia.com
|
||||
|
||||
More informations at http://www.qupzilla.ic.cz (Czech only)
|
BIN
bin/data/default/profiles/default/background.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
bin/data/default/profiles/default/browsedata.db
Normal file
2
bin/data/default/profiles/profiles.ini
Normal file
@ -0,0 +1,2 @@
|
||||
[Profiles]
|
||||
startProfile="default"
|
BIN
bin/locale/cs_CZ.qm
Normal file
BIN
bin/locale/qt_cs.qm
Normal file
BIN
bin/locale/qt_sk.qm
Normal file
BIN
bin/locale/sk_SK.qm
Normal file
1
plugins/TestPlugin/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
build
|
37
plugins/TestPlugin/cs_CZ.ts
Normal file
@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.0" language="cs_CZ" sourcelanguage="en_US">
|
||||
<context>
|
||||
<name>TestPlugin</name>
|
||||
<message>
|
||||
<location filename="src/testplugin.h" line="23"/>
|
||||
<source>Example Plugin</source>
|
||||
<translation>Příkladový doplněk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/testplugin.h" line="24"/>
|
||||
<source>Example minimal plugin</source>
|
||||
<translation>Ukázkový minimální doplněk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/testplugin.h" line="25"/>
|
||||
<source>Very simple minimal plugin example</source>
|
||||
<translation>Velice jednoduchý minimální doplněk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/testplugin.cpp" line="40"/>
|
||||
<source>My first plugin action</source>
|
||||
<translation>Moje první akce z doplňku</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/testplugin.cpp" line="45"/>
|
||||
<source>Hello</source>
|
||||
<translation>Ahoj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/testplugin.cpp" line="45"/>
|
||||
<source>First plugin action works :-)</source>
|
||||
<translation>První akce funguje :-)</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
37
plugins/TestPlugin/sk_SK.ts
Normal file
@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.0" language="sk_SK" sourcelanguage="en_US">
|
||||
<context>
|
||||
<name>TestPlugin</name>
|
||||
<message>
|
||||
<location filename="src/testplugin.h" line="23"/>
|
||||
<source>Example Plugin</source>
|
||||
<translation>Ukázkovy doplnek</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/testplugin.h" line="24"/>
|
||||
<source>Example minimal plugin</source>
|
||||
<translation>Ukázkovy minimálny doplnek</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/testplugin.h" line="25"/>
|
||||
<source>Very simple minimal plugin example</source>
|
||||
<translation>Vel'mi jednoduchy minimálny doplnek</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/testplugin.cpp" line="40"/>
|
||||
<source>My first plugin action</source>
|
||||
<translation>Moje první akce z doplnku</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/testplugin.cpp" line="45"/>
|
||||
<source>Hello</source>
|
||||
<translation>Ahoj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/testplugin.cpp" line="45"/>
|
||||
<source>First plugin action works :-)</source>
|
||||
<translation>První doplnek funguje :-)</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
21
plugins/TestPlugin/src/TestPlugin.pro
Normal file
@ -0,0 +1,21 @@
|
||||
#-------------------------------------------------
|
||||
#
|
||||
# Project created by QtCreator 2011-02-13T10:23:13
|
||||
#
|
||||
#-------------------------------------------------
|
||||
QT += network webkit
|
||||
|
||||
TEMPLATE = lib
|
||||
|
||||
CONFIG += plugin
|
||||
|
||||
TARGET = ExamplePlugin
|
||||
|
||||
DESTDIR = ../../../bin/plugins
|
||||
|
||||
SOURCES += testplugin.cpp
|
||||
|
||||
HEADERS += testplugin.h
|
||||
|
||||
RESOURCES += \
|
||||
data.qrc
|
BIN
plugins/TestPlugin/src/cs_CZ.qm
Normal file
7
plugins/TestPlugin/src/data.qrc
Normal file
@ -0,0 +1,7 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>cs_CZ.qm</file>
|
||||
<file>qupzilla.png</file>
|
||||
<file>sk_SK.qm</file>
|
||||
</qresource>
|
||||
</RCC>
|
BIN
plugins/TestPlugin/src/sk_SK.qm
Normal file
68
plugins/TestPlugin/src/testplugin.cpp
Normal file
@ -0,0 +1,68 @@
|
||||
#include "testplugin.h"
|
||||
|
||||
void TestPlugin::init(QString sPath)
|
||||
{
|
||||
settingsPath = sPath;
|
||||
//This function is called right after plugin is loaded
|
||||
qDebug() << __FUNCTION__ << "called";
|
||||
}
|
||||
|
||||
bool TestPlugin::testPlugin()
|
||||
{
|
||||
//This function is loaded right after init()
|
||||
//There should be some testing if plugin is loaded correctly
|
||||
//If this function returns false, plugin is automatically unloaded
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
QTranslator* TestPlugin::getTranslator(QString locale)
|
||||
{
|
||||
QTranslator* translator = new QTranslator();
|
||||
translator->load(":/"+locale);
|
||||
return translator;
|
||||
}
|
||||
|
||||
void TestPlugin::showSettings()
|
||||
{
|
||||
QWidget* widget = new QWidget();
|
||||
new QLabel("Example Plugin v0.0.1", widget);
|
||||
widget->resize(200,200);
|
||||
widget->setAttribute(Qt::WA_DeleteOnClose);
|
||||
widget->setWindowModality(Qt::WindowModal); //As the preferences window is modal too
|
||||
widget->setWindowTitle("Example Plugin Settings");
|
||||
widget->setWindowIcon(pluginIcon());
|
||||
widget->show();
|
||||
}
|
||||
|
||||
void TestPlugin::populateWebViewMenu(QMenu *menu, QWebView *view, QWebHitTestResult r)
|
||||
{
|
||||
Q_UNUSED(view)
|
||||
QString title;
|
||||
if (!r.imageUrl().isEmpty())
|
||||
title += " on image";
|
||||
if (!r.linkUrl().isEmpty())
|
||||
title += " on link";
|
||||
QWebElement element = r.element();
|
||||
if (!element.isNull() && (element.tagName().toLower() == "input" || element.tagName().toLower() == "textarea"))
|
||||
title += " on input";
|
||||
menu->addAction(tr("My first plugin action") + title, this, SLOT(actionSlot()));
|
||||
}
|
||||
|
||||
void TestPlugin::populateHelpMenu(QMenu *menu)
|
||||
{
|
||||
menu->addAction(tr("My first plugin action"), this, SLOT(actionSlot()));
|
||||
}
|
||||
|
||||
void TestPlugin::populateToolsMenu(QMenu *menu)
|
||||
{
|
||||
menu->addAction(tr("My first plugin action"), this, SLOT(actionSlot()));
|
||||
}
|
||||
|
||||
void TestPlugin::actionSlot()
|
||||
{
|
||||
QMessageBox::information(0, tr("Hello"), tr("First plugin action works :-)"));
|
||||
}
|
||||
|
||||
//Export plugin macro
|
||||
Q_EXPORT_PLUGIN2(ExamplePlugin, TestPlugin)
|
47
plugins/TestPlugin/src/testplugin.h
Normal file
@ -0,0 +1,47 @@
|
||||
#ifndef TESTPLUGIN_H
|
||||
#define TESTPLUGIN_H
|
||||
|
||||
//Include actual plugininterface.h for your version of QupZilla
|
||||
//This file is available to download at QupZilla website
|
||||
|
||||
#include "../../../src/plugins/plugininterface.h"
|
||||
|
||||
|
||||
//For clean plugin directory, please build necessary files into
|
||||
//plugin in .qrc data files
|
||||
|
||||
#include <QDebug>
|
||||
#include <QLabel>
|
||||
#include <QMessageBox>
|
||||
#include <QWebElement>
|
||||
|
||||
class TestPlugin : public QObject, public PluginInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(PluginInterface)
|
||||
|
||||
public:
|
||||
QString pluginName() { return tr("Example Plugin"); }
|
||||
QString pluginInfo() { return tr("Example minimal plugin"); }
|
||||
QString pluginDescription() { return tr("Very simple minimal plugin example"); }
|
||||
QString pluginVersion() { return "0.0.1"; }
|
||||
QString pluginAuthor() { return "nowrep <nowrep@gmail.com>"; }
|
||||
void init(QString sPath);
|
||||
bool testPlugin();
|
||||
|
||||
QTranslator* getTranslator(QString locale);
|
||||
QIcon pluginIcon() { return QIcon(":/qupzilla.png"); }
|
||||
bool hasSettings() { return true; }
|
||||
void showSettings();
|
||||
|
||||
void populateWebViewMenu(QMenu *menu, QWebView *view, QWebHitTestResult r);
|
||||
void populateHelpMenu(QMenu *menu);
|
||||
void populateToolsMenu(QMenu *menu);
|
||||
|
||||
private slots:
|
||||
void actionSlot();
|
||||
private:
|
||||
QString settingsPath;
|
||||
};
|
||||
|
||||
#endif // TESTPLUGIN_H
|
96
src/3rdparty/ecwin7.cpp
vendored
Normal file
@ -0,0 +1,96 @@
|
||||
/* EcWin7 - Support library for integrating Windows 7 taskbar features
|
||||
* into any Qt application
|
||||
* Copyright (C) 2010 Emanuele Colombo
|
||||
*
|
||||
* This program 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.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "ecwin7.h"
|
||||
|
||||
// Windows only definitions
|
||||
#ifdef Q_WS_WIN
|
||||
DEFINE_GUID(CLSID_TaskbarList,0x56fdf344,0xfd6d,0x11d0,0x95,0x8a,0x0,0x60,0x97,0xc9,0xa0,0x90);
|
||||
DEFINE_GUID(IID_ITaskbarList3,0xea1afb91,0x9e28,0x4b86,0x90,0xE9,0x9e,0x9f,0x8a,0x5e,0xef,0xaf);
|
||||
|
||||
// Constructor: variabiles initialization
|
||||
EcWin7::EcWin7()
|
||||
{
|
||||
mOverlayIcon = NULL;
|
||||
}
|
||||
|
||||
// Init taskbar communication
|
||||
void EcWin7::init(WId wid)
|
||||
{
|
||||
mWindowId = wid;
|
||||
mTaskbarMessageId = RegisterWindowMessage(L"TaskbarButtonCreated");
|
||||
}
|
||||
|
||||
// Windows event handler callback function
|
||||
// (handles taskbar communication initial message)
|
||||
bool EcWin7::winEvent(MSG * message, long * result)
|
||||
{
|
||||
if (message->message == mTaskbarMessageId)
|
||||
{
|
||||
HRESULT hr = CoCreateInstance(CLSID_TaskbarList,
|
||||
0,
|
||||
CLSCTX_INPROC_SERVER,
|
||||
IID_ITaskbarList3,
|
||||
reinterpret_cast<void**> (&(mTaskbar)));
|
||||
*result = hr;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Set progress bar current value
|
||||
void EcWin7::setProgressValue(int value, int max)
|
||||
{
|
||||
mTaskbar->SetProgressValue(mWindowId, value, max);
|
||||
|
||||
}
|
||||
|
||||
// Set progress bar current state (active, error, pause, ecc...)
|
||||
void EcWin7::setProgressState(ToolBarProgressState state)
|
||||
{
|
||||
mTaskbar->SetProgressState(mWindowId, (TBPFLAG)state);
|
||||
}
|
||||
|
||||
// Set new overlay icon and corresponding description (for accessibility)
|
||||
// (call with iconName == "" and description == "" to remove any previous overlay icon)
|
||||
void EcWin7::setOverlayIcon(QString iconName, QString description)
|
||||
{
|
||||
HICON oldIcon = NULL;
|
||||
if (mOverlayIcon != NULL) oldIcon = mOverlayIcon;
|
||||
if (iconName == "")
|
||||
{
|
||||
mTaskbar->SetOverlayIcon(mWindowId, NULL, NULL);
|
||||
mOverlayIcon = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
mOverlayIcon = (HICON) LoadImage(GetModuleHandle(NULL),
|
||||
iconName.toStdWString().c_str(),
|
||||
IMAGE_ICON,
|
||||
0,
|
||||
0,
|
||||
NULL);
|
||||
mTaskbar->SetOverlayIcon(mWindowId, mOverlayIcon, description.toStdWString().c_str());
|
||||
}
|
||||
if ((oldIcon != NULL) && (oldIcon != mOverlayIcon))
|
||||
{
|
||||
DestroyIcon(oldIcon);
|
||||
}
|
||||
}
|
||||
#endif
|
141
src/3rdparty/ecwin7.h
vendored
Normal file
@ -0,0 +1,141 @@
|
||||
/* EcWin7 - Support library for integrating Windows 7 taskbar features
|
||||
* into any Qt application
|
||||
* Copyright (C) 2010 Emanuele Colombo
|
||||
*
|
||||
* This program 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.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef ECWIN7_H
|
||||
#define ECWIN7_H
|
||||
|
||||
#include <QtGlobal>
|
||||
#include <QWidget>
|
||||
|
||||
// Windows only data definitions
|
||||
#ifdef Q_WS_WIN
|
||||
|
||||
#include <windows.h>
|
||||
#include <initguid.h>
|
||||
#define CMIC_MASK_ASYNCOK SEE_MASK_ASYNCOK
|
||||
|
||||
// Structs types and enums definitions for Windows 7 taskbar
|
||||
|
||||
typedef enum THUMBBUTTONMASK
|
||||
{
|
||||
THB_BITMAP = 0x1,
|
||||
THB_ICON = 0x2,
|
||||
THB_TOOLTIP = 0x4,
|
||||
THB_FLAGS = 0x8
|
||||
} THUMBBUTTONMASK;
|
||||
|
||||
typedef enum THUMBBUTTONFLAGS
|
||||
{
|
||||
THBF_ENABLED = 0,
|
||||
THBF_DISABLED = 0x1,
|
||||
THBF_DISMISSONCLICK = 0x2,
|
||||
THBF_NOBACKGROUND = 0x4,
|
||||
THBF_HIDDEN = 0x8,
|
||||
THBF_NONINTERACTIVE = 0x10
|
||||
} THUMBBUTTONFLAGS;
|
||||
|
||||
typedef struct THUMBBUTTON
|
||||
{
|
||||
THUMBBUTTONMASK dwMask;
|
||||
UINT iId;
|
||||
UINT iBitmap;
|
||||
HICON hIcon;
|
||||
WCHAR szTip[260];
|
||||
THUMBBUTTONFLAGS dwFlags;
|
||||
} THUMBBUTTON;
|
||||
typedef struct THUMBBUTTON *LPTHUMBBUTTON;
|
||||
|
||||
typedef enum TBPFLAG
|
||||
{
|
||||
TBPF_NOPROGRESS = 0,
|
||||
TBPF_INDETERMINATE = 0x1,
|
||||
TBPF_NORMAL = 0x2,
|
||||
TBPF_ERROR = 0x4,
|
||||
TBPF_PAUSED = 0x8
|
||||
} TBPFLAG;
|
||||
|
||||
typedef IUnknown *HIMAGELIST;
|
||||
|
||||
// Taskbar interface
|
||||
DECLARE_INTERFACE_(ITaskbarList3,IUnknown)
|
||||
{
|
||||
// IUnknown
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID riid,void **ppv) PURE;
|
||||
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||||
// ITaskbarList
|
||||
STDMETHOD(HrInit) (THIS) PURE;
|
||||
STDMETHOD(AddTab) (THIS_ HWND hwnd) PURE;
|
||||
STDMETHOD(DeleteTab) (THIS_ HWND hwnd) PURE;
|
||||
STDMETHOD(ActivateTab) (THIS_ HWND hwnd) PURE;
|
||||
STDMETHOD(SetActiveAlt) (THIS_ HWND hwnd) PURE;
|
||||
STDMETHOD (MarkFullscreenWindow) (THIS_ HWND hwnd, int fFullscreen) PURE;
|
||||
// ITaskbarList3
|
||||
STDMETHOD (SetProgressValue) (THIS_ HWND hwnd, ULONGLONG ullCompleted, ULONGLONG ullTotal) PURE;
|
||||
STDMETHOD (SetProgressState) (THIS_ HWND hwnd, TBPFLAG tbpFlags) PURE;
|
||||
STDMETHOD (RegisterTab) (THIS_ HWND hwndTab,HWND hwndMDI) PURE;
|
||||
STDMETHOD (UnregisterTab) (THIS_ HWND hwndTab) PURE;
|
||||
STDMETHOD (SetTabOrder) (THIS_ HWND hwndTab, HWND hwndInsertBefore) PURE;
|
||||
STDMETHOD (SetTabActive) (THIS_ HWND hwndTab, HWND hwndMDI, DWORD dwReserved) PURE;
|
||||
STDMETHOD (ThumbBarAddButtons) (THIS_ HWND hwnd, UINT cButtons, LPTHUMBBUTTON pButton) PURE;
|
||||
STDMETHOD (ThumbBarUpdateButtons) (THIS_ HWND hwnd, UINT cButtons, LPTHUMBBUTTON pButton) PURE;
|
||||
STDMETHOD (ThumbBarSetImageList) (THIS_ HWND hwnd, HIMAGELIST himl) PURE;
|
||||
STDMETHOD (SetOverlayIcon) (THIS_ HWND hwnd, HICON hIcon, LPCWSTR pszDescription) PURE;
|
||||
STDMETHOD (SetThumbnailTooltip) (THIS_ HWND hwnd, LPCWSTR pszTip) PURE;
|
||||
STDMETHOD (SetThumbnailClip) (THIS_ HWND hwnd, RECT *prcClip) PURE;
|
||||
};
|
||||
typedef ITaskbarList3 *LPITaskbarList3;
|
||||
|
||||
|
||||
// ********************************************************************
|
||||
// EcWin7 class - Windows 7 taskbar handling for Qt and MinGW
|
||||
|
||||
class EcWin7
|
||||
{
|
||||
public:
|
||||
|
||||
// Initialization methods
|
||||
EcWin7();
|
||||
void init(WId wid);
|
||||
bool winEvent(MSG * message, long * result);
|
||||
|
||||
// Overlay icon handling
|
||||
void setOverlayIcon(QString iconName, QString description);
|
||||
|
||||
// Progress indicator handling
|
||||
enum ToolBarProgressState {
|
||||
NoProgress = 0,
|
||||
Indeterminate = 1,
|
||||
Normal = 2,
|
||||
Error = 4,
|
||||
Paused = 8
|
||||
};
|
||||
void setProgressValue(int value, int max);
|
||||
void setProgressState(ToolBarProgressState state);
|
||||
|
||||
private:
|
||||
WId mWindowId;
|
||||
UINT mTaskbarMessageId;
|
||||
ITaskbarList3 *mTaskbar;
|
||||
HICON mOverlayIcon;
|
||||
};
|
||||
// Windows only data definitions - END
|
||||
#endif
|
||||
|
||||
#endif // ECWIN7_H
|
214
src/3rdparty/lineedit.cpp
vendored
Normal file
@ -0,0 +1,214 @@
|
||||
#include "lineedit.h"
|
||||
|
||||
#include <QEvent>
|
||||
#include <QLayout>
|
||||
#include <QStyleOption>
|
||||
#include <QPainter>
|
||||
#include <QFocusEvent>
|
||||
|
||||
#include <qdebug.h>
|
||||
SideWidget::SideWidget(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
{
|
||||
}
|
||||
|
||||
bool SideWidget::event(QEvent *event)
|
||||
{
|
||||
if (event->type() == QEvent::LayoutRequest)
|
||||
emit sizeHintChanged();
|
||||
return QWidget::event(event);
|
||||
}
|
||||
|
||||
LineEdit::LineEdit(QWidget *parent)
|
||||
: QLineEdit(parent)
|
||||
, m_leftLayout(0)
|
||||
, m_rightLayout(0)
|
||||
, m_leftMargin(0)
|
||||
{
|
||||
init();
|
||||
}
|
||||
|
||||
LineEdit::LineEdit(const QString &contents, QWidget *parent)
|
||||
: QLineEdit(contents, parent)
|
||||
, m_leftWidget(0)
|
||||
, m_rightWidget(0)
|
||||
, m_leftLayout(0)
|
||||
, m_rightLayout(0)
|
||||
, m_leftMargin(0)
|
||||
{
|
||||
init();
|
||||
}
|
||||
|
||||
void LineEdit::setLeftMargin(int margin)
|
||||
{
|
||||
m_leftMargin = margin;
|
||||
}
|
||||
|
||||
void LineEdit::init()
|
||||
{
|
||||
m_leftWidget = new SideWidget(this);
|
||||
m_leftWidget->resize(0, 0);
|
||||
m_leftLayout = new QHBoxLayout(m_leftWidget);
|
||||
m_leftLayout->setContentsMargins(0, 0, 0, 0);
|
||||
|
||||
if (isRightToLeft())
|
||||
m_leftLayout->setDirection(QBoxLayout::RightToLeft);
|
||||
else
|
||||
m_leftLayout->setDirection(QBoxLayout::LeftToRight);
|
||||
m_leftLayout->setSizeConstraint(QLayout::SetFixedSize);
|
||||
|
||||
m_rightWidget = new SideWidget(this);
|
||||
m_rightWidget->resize(0, 0);
|
||||
m_rightLayout = new QHBoxLayout(m_rightWidget);
|
||||
if (isRightToLeft())
|
||||
m_rightLayout->setDirection(QBoxLayout::RightToLeft);
|
||||
else
|
||||
m_rightLayout->setDirection(QBoxLayout::LeftToRight);
|
||||
m_rightLayout->setContentsMargins(0, 0, 0, 0);
|
||||
|
||||
QSpacerItem *horizontalSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
|
||||
m_rightLayout->addItem(horizontalSpacer);
|
||||
|
||||
setWidgetSpacing(3);
|
||||
connect(m_leftWidget, SIGNAL(sizeHintChanged()),
|
||||
this, SLOT(updateTextMargins()));
|
||||
connect(m_rightWidget, SIGNAL(sizeHintChanged()),
|
||||
this, SLOT(updateTextMargins()));
|
||||
}
|
||||
|
||||
bool LineEdit::event(QEvent *event)
|
||||
{
|
||||
if (event->type() == QEvent::LayoutDirectionChange) {
|
||||
if (isRightToLeft()) {
|
||||
m_leftLayout->setDirection(QBoxLayout::RightToLeft);
|
||||
m_rightLayout->setDirection(QBoxLayout::RightToLeft);
|
||||
} else {
|
||||
m_leftLayout->setDirection(QBoxLayout::LeftToRight);
|
||||
m_rightLayout->setDirection(QBoxLayout::LeftToRight);
|
||||
}
|
||||
}
|
||||
return QLineEdit::event(event);
|
||||
}
|
||||
|
||||
void LineEdit::addWidget(QWidget *widget, WidgetPosition position)
|
||||
{
|
||||
if (!widget)
|
||||
return;
|
||||
|
||||
bool rtl = isRightToLeft();
|
||||
if (rtl)
|
||||
position = (position == LeftSide) ? RightSide : LeftSide;
|
||||
if (position == LeftSide) {
|
||||
m_leftLayout->addWidget(widget);
|
||||
} else {
|
||||
m_rightLayout->insertWidget(1, widget);
|
||||
}
|
||||
}
|
||||
|
||||
void LineEdit::removeWidget(QWidget *widget)
|
||||
{
|
||||
if (!widget)
|
||||
return;
|
||||
|
||||
m_leftLayout->removeWidget(widget);
|
||||
m_rightLayout->removeWidget(widget);
|
||||
widget->hide();
|
||||
}
|
||||
|
||||
void LineEdit::setWidgetSpacing(int spacing)
|
||||
{
|
||||
m_leftLayout->setSpacing(spacing);
|
||||
m_rightLayout->setSpacing(spacing);
|
||||
updateTextMargins();
|
||||
}
|
||||
|
||||
int LineEdit::widgetSpacing() const
|
||||
{
|
||||
return m_leftLayout->spacing();
|
||||
}
|
||||
|
||||
int LineEdit::textMargin(WidgetPosition position) const
|
||||
{
|
||||
int spacing = m_rightLayout->spacing();
|
||||
int w = 0;
|
||||
if (position == LeftSide)
|
||||
w = m_leftWidget->sizeHint().width();
|
||||
else
|
||||
w = m_rightWidget->sizeHint().width();
|
||||
if (w == 0)
|
||||
return 0;
|
||||
return w + spacing * 2;
|
||||
}
|
||||
|
||||
void LineEdit::updateTextMargins()
|
||||
{
|
||||
int left;
|
||||
if (m_leftMargin == 0)
|
||||
left = textMargin(LineEdit::LeftSide);
|
||||
else
|
||||
left = m_leftMargin;
|
||||
int right = textMargin(LineEdit::RightSide);
|
||||
int top = 0;
|
||||
int bottom = 0;
|
||||
setTextMargins(left, top, right, bottom);
|
||||
updateSideWidgetLocations();
|
||||
}
|
||||
|
||||
void LineEdit::updateSideWidgetLocations()
|
||||
{
|
||||
QStyleOptionFrameV2 opt;
|
||||
initStyleOption(&opt);
|
||||
QRect textRect = style()->subElementRect(QStyle::SE_LineEditContents, &opt, this);
|
||||
int spacing = m_rightLayout->spacing();
|
||||
textRect.adjust(spacing, 0, -spacing, 0);
|
||||
|
||||
int left = textMargin(LineEdit::LeftSide);
|
||||
|
||||
int midHeight = textRect.center().y() + 1;
|
||||
|
||||
if (m_leftLayout->count() > 0) {
|
||||
int leftHeight = midHeight - m_leftWidget->height() / 2;
|
||||
int leftWidth = m_leftWidget->width();
|
||||
if (leftWidth == 0)
|
||||
leftHeight = midHeight - m_leftWidget->sizeHint().height() / 2;
|
||||
m_leftWidget->move(textRect.x(), leftHeight);
|
||||
}
|
||||
textRect.setX(left);
|
||||
textRect.setY(midHeight - m_rightWidget->sizeHint().height() / 2);
|
||||
textRect.setHeight(m_rightWidget->sizeHint().height());
|
||||
m_rightWidget->setGeometry(textRect);
|
||||
}
|
||||
|
||||
void LineEdit::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
updateSideWidgetLocations();
|
||||
QLineEdit::resizeEvent(event);
|
||||
}
|
||||
|
||||
QString LineEdit::inactiveText() const
|
||||
{
|
||||
return m_inactiveText;
|
||||
}
|
||||
|
||||
void LineEdit::setInactiveText(const QString &text)
|
||||
{
|
||||
m_inactiveText = text;
|
||||
}
|
||||
|
||||
void LineEdit::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
QLineEdit::paintEvent(event);
|
||||
if (text().isEmpty() && !m_inactiveText.isEmpty() && !hasFocus()) {
|
||||
QStyleOptionFrameV2 panel;
|
||||
initStyleOption(&panel);
|
||||
QRect textRect = style()->subElementRect(QStyle::SE_LineEditContents, &panel, this);
|
||||
int horizontalMargin = 2;
|
||||
textRect.adjust(horizontalMargin, 0, 0, 0);
|
||||
int left = textMargin(LineEdit::LeftSide);
|
||||
int right = textMargin(LineEdit::RightSide);
|
||||
textRect.adjust(left, 0, -right, 0);
|
||||
QPainter painter(this);
|
||||
painter.setPen(palette().brush(QPalette::Disabled, QPalette::Text).color());
|
||||
painter.drawText(textRect, Qt::AlignLeft | Qt::AlignVCenter, m_inactiveText);
|
||||
}
|
||||
}
|
107
src/3rdparty/lineedit.h
vendored
Normal file
@ -0,0 +1,107 @@
|
||||
#ifndef LINEEDIT_H
|
||||
#define LINEEDIT_H
|
||||
/**
|
||||
* Copyright (c) 2008 - 2009, Benjamin C. Meyer <ben@meyerhome.net>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the Benjamin Meyer nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <QLineEdit>
|
||||
|
||||
class QHBoxLayout;
|
||||
|
||||
/*
|
||||
LineEdit is a subclass of QLineEdit that provides an easy and simple
|
||||
way to add widgets on the left or right hand side of the text.
|
||||
|
||||
The layout of the widgets on either side are handled by a QHBoxLayout.
|
||||
You can set the spacing around the widgets with setWidgetSpacing().
|
||||
|
||||
As widgets are added to the class they are inserted from the outside
|
||||
into the center of the widget.
|
||||
*/
|
||||
class SideWidget;
|
||||
class LineEdit : public QLineEdit
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(QString inactiveText READ inactiveText WRITE setInactiveText)
|
||||
|
||||
public:
|
||||
enum WidgetPosition {
|
||||
LeftSide,
|
||||
RightSide
|
||||
};
|
||||
|
||||
LineEdit(QWidget *parent = 0);
|
||||
LineEdit(const QString &contents, QWidget *parent = 0);
|
||||
|
||||
void addWidget(QWidget *widget, WidgetPosition position);
|
||||
void removeWidget(QWidget *widget);
|
||||
void setWidgetSpacing(int spacing);
|
||||
int widgetSpacing() const;
|
||||
int textMargin(WidgetPosition position) const;
|
||||
QString inactiveText() const;
|
||||
void setInactiveText(const QString &text);
|
||||
|
||||
void paintEvent(QPaintEvent *event);
|
||||
|
||||
void setLeftMargin(int margin);
|
||||
|
||||
protected:
|
||||
void resizeEvent(QResizeEvent *event);
|
||||
bool event(QEvent *event);
|
||||
|
||||
protected slots:
|
||||
void updateTextMargins();
|
||||
|
||||
private:
|
||||
void init();
|
||||
void updateSideWidgetLocations();
|
||||
|
||||
SideWidget *m_leftWidget;
|
||||
SideWidget *m_rightWidget;
|
||||
QHBoxLayout *m_leftLayout;
|
||||
QHBoxLayout *m_rightLayout;
|
||||
QString m_inactiveText;
|
||||
int m_leftMargin;
|
||||
};
|
||||
|
||||
|
||||
class SideWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
signals:
|
||||
void sizeHintChanged();
|
||||
|
||||
public:
|
||||
SideWidget(QWidget *parent = 0);
|
||||
|
||||
protected:
|
||||
bool event(QEvent *event);
|
||||
|
||||
};
|
||||
|
||||
#endif // LINEEDIT_H
|
203
src/3rdparty/qtlocalpeer.cpp
vendored
Normal file
@ -0,0 +1,203 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of a Qt Solutions component.
|
||||
**
|
||||
** Commercial Usage
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Solutions Commercial License Agreement provided
|
||||
** with the Software or, alternatively, in accordance with the terms
|
||||
** contained in a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain
|
||||
** additional rights. These rights are described in the Nokia Qt LGPL
|
||||
** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
|
||||
** package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Please note Third Party Software included with Qt Solutions may impose
|
||||
** additional restrictions and it is the user's responsibility to ensure
|
||||
** that they have met the licensing requirements of the GPL, LGPL, or Qt
|
||||
** Solutions Commercial license and the relevant license of the Third
|
||||
** Party Software they are using.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact Nokia at qt-info@nokia.com.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
#include "qtlocalpeer.h"
|
||||
#include <QtCore/QCoreApplication>
|
||||
#include <QtCore/QTime>
|
||||
|
||||
#if defined(Q_OS_WIN)
|
||||
#include <QtCore/QLibrary>
|
||||
#include <QtCore/qt_windows.h>
|
||||
typedef BOOL(WINAPI*PProcessIdToSessionId)(DWORD,DWORD*);
|
||||
static PProcessIdToSessionId pProcessIdToSessionId = 0;
|
||||
#endif
|
||||
#if defined(Q_OS_UNIX)
|
||||
#include <time.h>
|
||||
#endif
|
||||
|
||||
namespace QtLP_Private {
|
||||
#include "qtlockedfile.cpp"
|
||||
#if defined(Q_OS_WIN)
|
||||
#include "qtlockedfile_win.cpp"
|
||||
#else
|
||||
#include "qtlockedfile_unix.cpp"
|
||||
#endif
|
||||
}
|
||||
|
||||
const char* QtLocalPeer::ack = "ack";
|
||||
|
||||
QtLocalPeer::QtLocalPeer(QObject* parent, const QString &appId)
|
||||
: QObject(parent), id(appId)
|
||||
{
|
||||
QString prefix = id;
|
||||
if (id.isEmpty()) {
|
||||
id = QCoreApplication::applicationFilePath();
|
||||
#if defined(Q_OS_WIN)
|
||||
id = id.toLower();
|
||||
#endif
|
||||
prefix = id.section(QLatin1Char('/'), -1);
|
||||
}
|
||||
prefix.remove(QRegExp("[^a-zA-Z]"));
|
||||
prefix.truncate(6);
|
||||
|
||||
QByteArray idc = id.toUtf8();
|
||||
quint16 idNum = qChecksum(idc.constData(), idc.size());
|
||||
socketName = QLatin1String("qtsingleapp-") + prefix
|
||||
+ QLatin1Char('-') + QString::number(idNum, 16);
|
||||
|
||||
#if defined(Q_OS_WIN)
|
||||
if (!pProcessIdToSessionId) {
|
||||
QLibrary lib("kernel32");
|
||||
pProcessIdToSessionId = (PProcessIdToSessionId)lib.resolve("ProcessIdToSessionId");
|
||||
}
|
||||
if (pProcessIdToSessionId) {
|
||||
DWORD sessionId = 0;
|
||||
pProcessIdToSessionId(GetCurrentProcessId(), &sessionId);
|
||||
socketName += QLatin1Char('-') + QString::number(sessionId, 16);
|
||||
}
|
||||
#else
|
||||
socketName += QLatin1Char('-') + QString::number(::getuid(), 16);
|
||||
#endif
|
||||
|
||||
server = new QLocalServer(this);
|
||||
QString lockName = QDir(QDir::tempPath()).absolutePath()
|
||||
+ QLatin1Char('/') + socketName
|
||||
+ QLatin1String("-lockfile");
|
||||
lockFile.setFileName(lockName);
|
||||
lockFile.open(QIODevice::ReadWrite);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool QtLocalPeer::isClient()
|
||||
{
|
||||
if (lockFile.isLocked())
|
||||
return false;
|
||||
|
||||
if (!lockFile.lock(QtLP_Private::QtLockedFile::WriteLock, false))
|
||||
return true;
|
||||
|
||||
bool res = server->listen(socketName);
|
||||
#if defined(Q_OS_UNIX) && (QT_VERSION >= QT_VERSION_CHECK(4,5,0))
|
||||
// ### Workaround
|
||||
if (!res && server->serverError() == QAbstractSocket::AddressInUseError) {
|
||||
QFile::remove(QDir::cleanPath(QDir::tempPath())+QLatin1Char('/')+socketName);
|
||||
res = server->listen(socketName);
|
||||
}
|
||||
#endif
|
||||
if (!res)
|
||||
qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qPrintable(server->errorString()));
|
||||
QObject::connect(server, SIGNAL(newConnection()), SLOT(receiveConnection()));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool QtLocalPeer::sendMessage(const QString &message, int timeout)
|
||||
{
|
||||
if (!isClient())
|
||||
return false;
|
||||
|
||||
QLocalSocket socket;
|
||||
bool connOk = false;
|
||||
for(int i = 0; i < 2; i++) {
|
||||
// Try twice, in case the other instance is just starting up
|
||||
socket.connectToServer(socketName);
|
||||
connOk = socket.waitForConnected(timeout/2);
|
||||
if (connOk || i)
|
||||
break;
|
||||
int ms = 250;
|
||||
#if defined(Q_OS_WIN)
|
||||
Sleep(DWORD(ms));
|
||||
#else
|
||||
struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 };
|
||||
nanosleep(&ts, NULL);
|
||||
#endif
|
||||
}
|
||||
if (!connOk)
|
||||
return false;
|
||||
|
||||
QByteArray uMsg(message.toUtf8());
|
||||
QDataStream ds(&socket);
|
||||
ds.writeBytes(uMsg.constData(), uMsg.size());
|
||||
bool res = socket.waitForBytesWritten(timeout);
|
||||
res &= socket.waitForReadyRead(timeout); // wait for ack
|
||||
res &= (socket.read(qstrlen(ack)) == ack);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
void QtLocalPeer::receiveConnection()
|
||||
{
|
||||
QLocalSocket* socket = server->nextPendingConnection();
|
||||
if (!socket)
|
||||
return;
|
||||
|
||||
while (socket->bytesAvailable() < (int)sizeof(quint32))
|
||||
socket->waitForReadyRead();
|
||||
QDataStream ds(socket);
|
||||
QByteArray uMsg;
|
||||
quint32 remaining;
|
||||
ds >> remaining;
|
||||
uMsg.resize(remaining);
|
||||
int got = 0;
|
||||
char* uMsgBuf = uMsg.data();
|
||||
do {
|
||||
got = ds.readRawData(uMsgBuf, remaining);
|
||||
remaining -= got;
|
||||
uMsgBuf += got;
|
||||
} while (remaining && got >= 0 && socket->waitForReadyRead(2000));
|
||||
if (got < 0) {
|
||||
qWarning() << "QtLocalPeer: Message reception failed" << socket->errorString();
|
||||
delete socket;
|
||||
return;
|
||||
}
|
||||
QString message(QString::fromUtf8(uMsg));
|
||||
socket->write(ack, qstrlen(ack));
|
||||
socket->waitForBytesWritten(1000);
|
||||
delete socket;
|
||||
emit messageReceived(message); //### (might take a long time to return)
|
||||
}
|
81
src/3rdparty/qtlocalpeer.h
vendored
Normal file
@ -0,0 +1,81 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of a Qt Solutions component.
|
||||
**
|
||||
** Commercial Usage
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Solutions Commercial License Agreement provided
|
||||
** with the Software or, alternatively, in accordance with the terms
|
||||
** contained in a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain
|
||||
** additional rights. These rights are described in the Nokia Qt LGPL
|
||||
** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
|
||||
** package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Please note Third Party Software included with Qt Solutions may impose
|
||||
** additional restrictions and it is the user's responsibility to ensure
|
||||
** that they have met the licensing requirements of the GPL, LGPL, or Qt
|
||||
** Solutions Commercial license and the relevant license of the Third
|
||||
** Party Software they are using.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact Nokia at qt-info@nokia.com.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
#include <QtNetwork/QLocalServer>
|
||||
#include <QtNetwork/QLocalSocket>
|
||||
#include <QtCore/QDir>
|
||||
|
||||
namespace QtLP_Private {
|
||||
#include "qtlockedfile.h"
|
||||
}
|
||||
|
||||
class QtLocalPeer : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QtLocalPeer(QObject *parent = 0, const QString &appId = QString());
|
||||
bool isClient();
|
||||
bool sendMessage(const QString &message, int timeout);
|
||||
QString applicationId() const
|
||||
{ return id; }
|
||||
|
||||
Q_SIGNALS:
|
||||
void messageReceived(const QString &message);
|
||||
|
||||
protected Q_SLOTS:
|
||||
void receiveConnection();
|
||||
|
||||
protected:
|
||||
QString id;
|
||||
QString socketName;
|
||||
QLocalServer* server;
|
||||
QtLP_Private::QtLockedFile lockFile;
|
||||
|
||||
private:
|
||||
static const char* ack;
|
||||
};
|
199
src/3rdparty/qtlockedfile.cpp
vendored
Normal file
@ -0,0 +1,199 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of a Qt Solutions component.
|
||||
**
|
||||
** Commercial Usage
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Solutions Commercial License Agreement provided
|
||||
** with the Software or, alternatively, in accordance with the terms
|
||||
** contained in a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain
|
||||
** additional rights. These rights are described in the Nokia Qt LGPL
|
||||
** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
|
||||
** package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Please note Third Party Software included with Qt Solutions may impose
|
||||
** additional restrictions and it is the user's responsibility to ensure
|
||||
** that they have met the licensing requirements of the GPL, LGPL, or Qt
|
||||
** Solutions Commercial license and the relevant license of the Third
|
||||
** Party Software they are using.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact Nokia at qt-info@nokia.com.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qtlockedfile.h"
|
||||
|
||||
/*!
|
||||
\class QtLockedFile
|
||||
|
||||
\brief The QtLockedFile class extends QFile with advisory locking
|
||||
functions.
|
||||
|
||||
A file may be locked in read or write mode. Multiple instances of
|
||||
\e QtLockedFile, created in multiple processes running on the same
|
||||
machine, may have a file locked in read mode. Exactly one instance
|
||||
may have it locked in write mode. A read and a write lock cannot
|
||||
exist simultaneously on the same file.
|
||||
|
||||
The file locks are advisory. This means that nothing prevents
|
||||
another process from manipulating a locked file using QFile or
|
||||
file system functions offered by the OS. Serialization is only
|
||||
guaranteed if all processes that access the file use
|
||||
QLockedFile. Also, while holding a lock on a file, a process
|
||||
must not open the same file again (through any API), or locks
|
||||
can be unexpectedly lost.
|
||||
|
||||
The lock provided by an instance of \e QtLockedFile is released
|
||||
whenever the program terminates. This is true even when the
|
||||
program crashes and no destructors are called.
|
||||
*/
|
||||
|
||||
/*! \enum QtLockedFile::LockMode
|
||||
|
||||
This enum describes the available lock modes.
|
||||
|
||||
\value ReadLock A read lock.
|
||||
\value WriteLock A write lock.
|
||||
\value NoLock Neither a read lock nor a write lock.
|
||||
*/
|
||||
|
||||
/*!
|
||||
Constructs an unlocked \e QtLockedFile object. This constructor
|
||||
behaves in the same way as \e QFile::QFile().
|
||||
|
||||
\sa QFile::QFile()
|
||||
*/
|
||||
QtLockedFile::QtLockedFile()
|
||||
: QFile()
|
||||
{
|
||||
#ifdef Q_OS_WIN
|
||||
wmutex = 0;
|
||||
rmutex = 0;
|
||||
#endif
|
||||
m_lock_mode = NoLock;
|
||||
}
|
||||
|
||||
/*!
|
||||
Constructs an unlocked QtLockedFile object with file \a name. This
|
||||
constructor behaves in the same way as \e QFile::QFile(const
|
||||
QString&).
|
||||
|
||||
\sa QFile::QFile()
|
||||
*/
|
||||
QtLockedFile::QtLockedFile(const QString &name)
|
||||
: QFile(name)
|
||||
{
|
||||
#ifdef Q_OS_WIN
|
||||
wmutex = 0;
|
||||
rmutex = 0;
|
||||
#endif
|
||||
m_lock_mode = NoLock;
|
||||
}
|
||||
|
||||
/*!
|
||||
Opens the file in OpenMode \a mode.
|
||||
|
||||
This is identical to QFile::open(), with the one exception that the
|
||||
Truncate mode flag is disallowed. Truncation would conflict with the
|
||||
advisory file locking, since the file would be modified before the
|
||||
write lock is obtained. If truncation is required, use resize(0)
|
||||
after obtaining the write lock.
|
||||
|
||||
Returns true if successful; otherwise false.
|
||||
|
||||
\sa QFile::open(), QFile::resize()
|
||||
*/
|
||||
bool QtLockedFile::open(OpenMode mode)
|
||||
{
|
||||
if (mode & QIODevice::Truncate) {
|
||||
qWarning("QtLockedFile::open(): Truncate mode not allowed.");
|
||||
return false;
|
||||
}
|
||||
return QFile::open(mode);
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns \e true if this object has a in read or write lock;
|
||||
otherwise returns \e false.
|
||||
|
||||
\sa lockMode()
|
||||
*/
|
||||
bool QtLockedFile::isLocked() const
|
||||
{
|
||||
return m_lock_mode != NoLock;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the type of lock currently held by this object, or \e
|
||||
QtLockedFile::NoLock.
|
||||
|
||||
\sa isLocked()
|
||||
*/
|
||||
QtLockedFile::LockMode QtLockedFile::lockMode() const
|
||||
{
|
||||
return m_lock_mode;
|
||||
}
|
||||
|
||||
/*!
|
||||
\fn bool QtLockedFile::lock(LockMode mode, bool block = true)
|
||||
|
||||
Obtains a lock of type \a mode. The file must be opened before it
|
||||
can be locked.
|
||||
|
||||
If \a block is true, this function will block until the lock is
|
||||
aquired. If \a block is false, this function returns \e false
|
||||
immediately if the lock cannot be aquired.
|
||||
|
||||
If this object already has a lock of type \a mode, this function
|
||||
returns \e true immediately. If this object has a lock of a
|
||||
different type than \a mode, the lock is first released and then a
|
||||
new lock is obtained.
|
||||
|
||||
This function returns \e true if, after it executes, the file is
|
||||
locked by this object, and \e false otherwise.
|
||||
|
||||
\sa unlock(), isLocked(), lockMode()
|
||||
*/
|
||||
|
||||
/*!
|
||||
\fn bool QtLockedFile::unlock()
|
||||
|
||||
Releases a lock.
|
||||
|
||||
If the object has no lock, this function returns immediately.
|
||||
|
||||
This function returns \e true if, after it executes, the file is
|
||||
not locked by this object, and \e false otherwise.
|
||||
|
||||
\sa lock(), isLocked(), lockMode()
|
||||
*/
|
||||
|
||||
/*!
|
||||
\fn QtLockedFile::~QtLockedFile()
|
||||
|
||||
Destroys the \e QtLockedFile object. If any locks were held, they
|
||||
are released.
|
||||
*/
|
101
src/3rdparty/qtlockedfile.h
vendored
Normal file
@ -0,0 +1,101 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of a Qt Solutions component.
|
||||
**
|
||||
** Commercial Usage
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Solutions Commercial License Agreement provided
|
||||
** with the Software or, alternatively, in accordance with the terms
|
||||
** contained in a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain
|
||||
** additional rights. These rights are described in the Nokia Qt LGPL
|
||||
** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
|
||||
** package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Please note Third Party Software included with Qt Solutions may impose
|
||||
** additional restrictions and it is the user's responsibility to ensure
|
||||
** that they have met the licensing requirements of the GPL, LGPL, or Qt
|
||||
** Solutions Commercial license and the relevant license of the Third
|
||||
** Party Software they are using.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact Nokia at qt-info@nokia.com.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QTLOCKEDFILE_H
|
||||
#define QTLOCKEDFILE_H
|
||||
|
||||
#include <QtCore/QFile>
|
||||
#ifdef Q_OS_WIN
|
||||
#include <QtCore/QVector>
|
||||
#endif
|
||||
|
||||
#if defined(Q_WS_WIN)
|
||||
# if !defined(QT_QTLOCKEDFILE_EXPORT) && !defined(QT_QTLOCKEDFILE_IMPORT)
|
||||
# define QT_QTLOCKEDFILE_EXPORT
|
||||
# elif defined(QT_QTLOCKEDFILE_IMPORT)
|
||||
# if defined(QT_QTLOCKEDFILE_EXPORT)
|
||||
# undef QT_QTLOCKEDFILE_EXPORT
|
||||
# endif
|
||||
# define QT_QTLOCKEDFILE_EXPORT __declspec(dllimport)
|
||||
# elif defined(QT_QTLOCKEDFILE_EXPORT)
|
||||
# undef QT_QTLOCKEDFILE_EXPORT
|
||||
# define QT_QTLOCKEDFILE_EXPORT __declspec(dllexport)
|
||||
# endif
|
||||
#else
|
||||
# define QT_QTLOCKEDFILE_EXPORT
|
||||
#endif
|
||||
|
||||
class QT_QTLOCKEDFILE_EXPORT QtLockedFile : public QFile
|
||||
{
|
||||
public:
|
||||
enum LockMode { NoLock = 0, ReadLock, WriteLock };
|
||||
|
||||
QtLockedFile();
|
||||
QtLockedFile(const QString &name);
|
||||
~QtLockedFile();
|
||||
|
||||
bool open(OpenMode mode);
|
||||
|
||||
bool lock(LockMode mode, bool block = true);
|
||||
bool unlock();
|
||||
bool isLocked() const;
|
||||
LockMode lockMode() const;
|
||||
|
||||
private:
|
||||
#ifdef Q_OS_WIN
|
||||
Qt::HANDLE wmutex;
|
||||
Qt::HANDLE rmutex;
|
||||
QVector<Qt::HANDLE> rmutexes;
|
||||
QString mutexname;
|
||||
|
||||
Qt::HANDLE getMutexHandle(int idx, bool doCreate);
|
||||
bool waitMutex(Qt::HANDLE mutex, bool doBlock);
|
||||
|
||||
#endif
|
||||
LockMode m_lock_mode;
|
||||
};
|
||||
|
||||
#endif
|
121
src/3rdparty/qtlockedfile_unix.cpp
vendored
Normal file
@ -0,0 +1,121 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of a Qt Solutions component.
|
||||
**
|
||||
** Commercial Usage
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Solutions Commercial License Agreement provided
|
||||
** with the Software or, alternatively, in accordance with the terms
|
||||
** contained in a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain
|
||||
** additional rights. These rights are described in the Nokia Qt LGPL
|
||||
** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
|
||||
** package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Please note Third Party Software included with Qt Solutions may impose
|
||||
** additional restrictions and it is the user's responsibility to ensure
|
||||
** that they have met the licensing requirements of the GPL, LGPL, or Qt
|
||||
** Solutions Commercial license and the relevant license of the Third
|
||||
** Party Software they are using.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact Nokia at qt-info@nokia.com.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "qtlockedfile.h"
|
||||
|
||||
bool QtLockedFile::lock(LockMode mode, bool block)
|
||||
{
|
||||
if (!isOpen()) {
|
||||
qWarning("QtLockedFile::lock(): file is not opened");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mode == NoLock)
|
||||
return unlock();
|
||||
|
||||
if (mode == m_lock_mode)
|
||||
return true;
|
||||
|
||||
if (m_lock_mode != NoLock)
|
||||
unlock();
|
||||
|
||||
struct flock fl;
|
||||
fl.l_whence = SEEK_SET;
|
||||
fl.l_start = 0;
|
||||
fl.l_len = 0;
|
||||
fl.l_type = (mode == ReadLock) ? F_RDLCK : F_WRLCK;
|
||||
int cmd = block ? F_SETLKW : F_SETLK;
|
||||
int ret = fcntl(handle(), cmd, &fl);
|
||||
|
||||
if (ret == -1) {
|
||||
if (errno != EINTR && errno != EAGAIN)
|
||||
qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
m_lock_mode = mode;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool QtLockedFile::unlock()
|
||||
{
|
||||
if (!isOpen()) {
|
||||
qWarning("QtLockedFile::unlock(): file is not opened");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!isLocked())
|
||||
return true;
|
||||
|
||||
struct flock fl;
|
||||
fl.l_whence = SEEK_SET;
|
||||
fl.l_start = 0;
|
||||
fl.l_len = 0;
|
||||
fl.l_type = F_UNLCK;
|
||||
int ret = fcntl(handle(), F_SETLKW, &fl);
|
||||
|
||||
if (ret == -1) {
|
||||
qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno));
|
||||
return false;
|
||||
}
|
||||
|
||||
m_lock_mode = NoLock;
|
||||
return true;
|
||||
}
|
||||
|
||||
QtLockedFile::~QtLockedFile()
|
||||
{
|
||||
if (isOpen())
|
||||
unlock();
|
||||
}
|
||||
|
213
src/3rdparty/qtlockedfile_win.cpp
vendored
Normal file
@ -0,0 +1,213 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of a Qt Solutions component.
|
||||
**
|
||||
** Commercial Usage
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Solutions Commercial License Agreement provided
|
||||
** with the Software or, alternatively, in accordance with the terms
|
||||
** contained in a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain
|
||||
** additional rights. These rights are described in the Nokia Qt LGPL
|
||||
** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
|
||||
** package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Please note Third Party Software included with Qt Solutions may impose
|
||||
** additional restrictions and it is the user's responsibility to ensure
|
||||
** that they have met the licensing requirements of the GPL, LGPL, or Qt
|
||||
** Solutions Commercial license and the relevant license of the Third
|
||||
** Party Software they are using.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact Nokia at qt-info@nokia.com.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qtlockedfile.h"
|
||||
#include <qt_windows.h>
|
||||
#include <QtCore/QFileInfo>
|
||||
|
||||
#define MUTEX_PREFIX "QtLockedFile mutex "
|
||||
// Maximum number of concurrent read locks. Must not be greater than MAXIMUM_WAIT_OBJECTS
|
||||
#define MAX_READERS MAXIMUM_WAIT_OBJECTS
|
||||
|
||||
Qt::HANDLE QtLockedFile::getMutexHandle(int idx, bool doCreate)
|
||||
{
|
||||
if (mutexname.isEmpty()) {
|
||||
QFileInfo fi(*this);
|
||||
mutexname = QString::fromLatin1(MUTEX_PREFIX)
|
||||
+ fi.absoluteFilePath().toLower();
|
||||
}
|
||||
QString mname(mutexname);
|
||||
if (idx >= 0)
|
||||
mname += QString::number(idx);
|
||||
|
||||
Qt::HANDLE mutex;
|
||||
if (doCreate) {
|
||||
QT_WA( { mutex = CreateMutexW(NULL, FALSE, (TCHAR*)mname.utf16()); },
|
||||
{ mutex = CreateMutexA(NULL, FALSE, mname.toLocal8Bit().constData()); } );
|
||||
if (!mutex) {
|
||||
qErrnoWarning("QtLockedFile::lock(): CreateMutex failed");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
QT_WA( { mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (TCHAR*)mname.utf16()); },
|
||||
{ mutex = OpenMutexA(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, mname.toLocal8Bit().constData()); } );
|
||||
if (!mutex) {
|
||||
if (GetLastError() != ERROR_FILE_NOT_FOUND)
|
||||
qErrnoWarning("QtLockedFile::lock(): OpenMutex failed");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return mutex;
|
||||
}
|
||||
|
||||
bool QtLockedFile::waitMutex(Qt::HANDLE mutex, bool doBlock)
|
||||
{
|
||||
Q_ASSERT(mutex);
|
||||
DWORD res = WaitForSingleObject(mutex, doBlock ? INFINITE : 0);
|
||||
switch (res) {
|
||||
case WAIT_OBJECT_0:
|
||||
case WAIT_ABANDONED:
|
||||
return true;
|
||||
break;
|
||||
case WAIT_TIMEOUT:
|
||||
break;
|
||||
default:
|
||||
qErrnoWarning("QtLockedFile::lock(): WaitForSingleObject failed");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool QtLockedFile::lock(LockMode mode, bool block)
|
||||
{
|
||||
if (!isOpen()) {
|
||||
qWarning("QtLockedFile::lock(): file is not opened");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mode == NoLock)
|
||||
return unlock();
|
||||
|
||||
if (mode == m_lock_mode)
|
||||
return true;
|
||||
|
||||
if (m_lock_mode != NoLock)
|
||||
unlock();
|
||||
|
||||
if (!wmutex && !(wmutex = getMutexHandle(-1, true)))
|
||||
return false;
|
||||
|
||||
if (!waitMutex(wmutex, block))
|
||||
return false;
|
||||
|
||||
if (mode == ReadLock) {
|
||||
int idx = 0;
|
||||
for (; idx < MAX_READERS; idx++) {
|
||||
rmutex = getMutexHandle(idx, false);
|
||||
if (!rmutex || waitMutex(rmutex, false))
|
||||
break;
|
||||
CloseHandle(rmutex);
|
||||
}
|
||||
bool ok = true;
|
||||
if (idx >= MAX_READERS) {
|
||||
qWarning("QtLockedFile::lock(): too many readers");
|
||||
rmutex = 0;
|
||||
ok = false;
|
||||
}
|
||||
else if (!rmutex) {
|
||||
rmutex = getMutexHandle(idx, true);
|
||||
if (!rmutex || !waitMutex(rmutex, false))
|
||||
ok = false;
|
||||
}
|
||||
if (!ok && rmutex) {
|
||||
CloseHandle(rmutex);
|
||||
rmutex = 0;
|
||||
}
|
||||
ReleaseMutex(wmutex);
|
||||
if (!ok)
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
Q_ASSERT(rmutexes.isEmpty());
|
||||
for (int i = 0; i < MAX_READERS; i++) {
|
||||
Qt::HANDLE mutex = getMutexHandle(i, false);
|
||||
if (mutex)
|
||||
rmutexes.append(mutex);
|
||||
}
|
||||
if (rmutexes.size()) {
|
||||
DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(),
|
||||
TRUE, block ? INFINITE : 0);
|
||||
if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) {
|
||||
if (res != WAIT_TIMEOUT)
|
||||
qErrnoWarning("QtLockedFile::lock(): WaitForMultipleObjects failed");
|
||||
m_lock_mode = WriteLock; // trick unlock() to clean up - semiyucky
|
||||
unlock();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_lock_mode = mode;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool QtLockedFile::unlock()
|
||||
{
|
||||
if (!isOpen()) {
|
||||
qWarning("QtLockedFile::unlock(): file is not opened");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!isLocked())
|
||||
return true;
|
||||
|
||||
if (m_lock_mode == ReadLock) {
|
||||
ReleaseMutex(rmutex);
|
||||
CloseHandle(rmutex);
|
||||
rmutex = 0;
|
||||
}
|
||||
else {
|
||||
foreach(Qt::HANDLE mutex, rmutexes) {
|
||||
ReleaseMutex(mutex);
|
||||
CloseHandle(mutex);
|
||||
}
|
||||
rmutexes.clear();
|
||||
ReleaseMutex(wmutex);
|
||||
}
|
||||
|
||||
m_lock_mode = QtLockedFile::NoLock;
|
||||
return true;
|
||||
}
|
||||
|
||||
QtLockedFile::~QtLockedFile()
|
||||
{
|
||||
if (isOpen())
|
||||
unlock();
|
||||
if (wmutex)
|
||||
CloseHandle(wmutex);
|
||||
}
|
352
src/3rdparty/qtsingleapplication.cpp
vendored
Normal file
@ -0,0 +1,352 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of a Qt Solutions component.
|
||||
**
|
||||
** Commercial Usage
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Solutions Commercial License Agreement provided
|
||||
** with the Software or, alternatively, in accordance with the terms
|
||||
** contained in a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain
|
||||
** additional rights. These rights are described in the Nokia Qt LGPL
|
||||
** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
|
||||
** package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Please note Third Party Software included with Qt Solutions may impose
|
||||
** additional restrictions and it is the user's responsibility to ensure
|
||||
** that they have met the licensing requirements of the GPL, LGPL, or Qt
|
||||
** Solutions Commercial license and the relevant license of the Third
|
||||
** Party Software they are using.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact Nokia at qt-info@nokia.com.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
#include "qtsingleapplication.h"
|
||||
#include "qtlocalpeer.h"
|
||||
#include <QtGui/QWidget>
|
||||
|
||||
|
||||
/*!
|
||||
\class QtSingleApplication qtsingleapplication.h
|
||||
\brief The QtSingleApplication class provides an API to detect and
|
||||
communicate with running instances of an application.
|
||||
|
||||
This class allows you to create applications where only one
|
||||
instance should be running at a time. I.e., if the user tries to
|
||||
launch another instance, the already running instance will be
|
||||
activated instead. Another usecase is a client-server system,
|
||||
where the first started instance will assume the role of server,
|
||||
and the later instances will act as clients of that server.
|
||||
|
||||
By default, the full path of the executable file is used to
|
||||
determine whether two processes are instances of the same
|
||||
application. You can also provide an explicit identifier string
|
||||
that will be compared instead.
|
||||
|
||||
The application should create the QtSingleApplication object early
|
||||
in the startup phase, and call isRunning() or sendMessage() to
|
||||
find out if another instance of this application is already
|
||||
running. Startup parameters (e.g. the name of the file the user
|
||||
wanted this new instance to open) can be passed to the running
|
||||
instance in the sendMessage() function.
|
||||
|
||||
If isRunning() or sendMessage() returns false, it means that no
|
||||
other instance is running, and this instance has assumed the role
|
||||
as the running instance. The application should continue with the
|
||||
initialization of the application user interface before entering
|
||||
the event loop with exec(), as normal. The messageReceived()
|
||||
signal will be emitted when the application receives messages from
|
||||
another instance of the same application.
|
||||
|
||||
If isRunning() or sendMessage() returns true, another instance is
|
||||
already running, and the application should terminate or enter
|
||||
client mode.
|
||||
|
||||
If a message is received it might be helpful to the user to raise
|
||||
the application so that it becomes visible. To facilitate this,
|
||||
QtSingleApplication provides the setActivationWindow() function
|
||||
and the activateWindow() slot.
|
||||
|
||||
Here's an example that shows how to convert an existing
|
||||
application to use QtSingleApplication. It is very simple and does
|
||||
not make use of all QtSingleApplication's functionality (see the
|
||||
examples for that).
|
||||
|
||||
\code
|
||||
// Original
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
QApplication app(argc, argv);
|
||||
|
||||
MyMainWidget mmw;
|
||||
|
||||
mmw.show();
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
// Single instance
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
QtSingleApplication app(argc, argv);
|
||||
|
||||
if (app.isRunning())
|
||||
return 0;
|
||||
|
||||
MyMainWidget mmw;
|
||||
|
||||
app.setActivationWindow(&mmw);
|
||||
|
||||
mmw.show();
|
||||
return app.exec();
|
||||
}
|
||||
\endcode
|
||||
|
||||
Once this QtSingleApplication instance is destroyed(for example,
|
||||
when the user quits), when the user next attempts to run the
|
||||
application this instance will not, of course, be encountered. The
|
||||
next instance to call isRunning() or sendMessage() will assume the
|
||||
role as the new running instance.
|
||||
|
||||
For console (non-GUI) applications, QtSingleCoreApplication may be
|
||||
used instead of this class, to avoid the dependency on the QtGui
|
||||
library.
|
||||
|
||||
\sa QtSingleCoreApplication
|
||||
*/
|
||||
|
||||
|
||||
void QtSingleApplication::sysInit(const QString &appId)
|
||||
{
|
||||
actWin = 0;
|
||||
peer = new QtLocalPeer(this, appId);
|
||||
connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&)));
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
Creates a QtSingleApplication object. The application identifier
|
||||
will be QCoreApplication::applicationFilePath(). \a argc, \a
|
||||
argv, and \a GUIenabled are passed on to the QAppliation constructor.
|
||||
|
||||
If you are creating a console application (i.e. setting \a
|
||||
GUIenabled to false), you may consider using
|
||||
QtSingleCoreApplication instead.
|
||||
*/
|
||||
|
||||
QtSingleApplication::QtSingleApplication(int &argc, char **argv, bool GUIenabled)
|
||||
: QApplication(argc, argv, GUIenabled)
|
||||
{
|
||||
sysInit();
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
Creates a QtSingleApplication object with the application
|
||||
identifier \a appId. \a argc and \a argv are passed on to the
|
||||
QAppliation constructor.
|
||||
*/
|
||||
|
||||
QtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char **argv)
|
||||
: QApplication(argc, argv)
|
||||
{
|
||||
sysInit(appId);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
Creates a QtSingleApplication object. The application identifier
|
||||
will be QCoreApplication::applicationFilePath(). \a argc, \a
|
||||
argv, and \a type are passed on to the QAppliation constructor.
|
||||
*/
|
||||
QtSingleApplication::QtSingleApplication(int &argc, char **argv, Type type)
|
||||
: QApplication(argc, argv, type)
|
||||
{
|
||||
sysInit();
|
||||
}
|
||||
|
||||
|
||||
#if defined(Q_WS_X11)
|
||||
/*!
|
||||
Special constructor for X11, ref. the documentation of
|
||||
QApplication's corresponding constructor. The application identifier
|
||||
will be QCoreApplication::applicationFilePath(). \a dpy, \a visual,
|
||||
and \a cmap are passed on to the QApplication constructor.
|
||||
*/
|
||||
QtSingleApplication::QtSingleApplication(Display* dpy, Qt::HANDLE visual, Qt::HANDLE cmap)
|
||||
: QApplication(dpy, visual, cmap)
|
||||
{
|
||||
sysInit();
|
||||
}
|
||||
|
||||
/*!
|
||||
Special constructor for X11, ref. the documentation of
|
||||
QApplication's corresponding constructor. The application identifier
|
||||
will be QCoreApplication::applicationFilePath(). \a dpy, \a argc, \a
|
||||
argv, \a visual, and \a cmap are passed on to the QApplication
|
||||
constructor.
|
||||
*/
|
||||
QtSingleApplication::QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap)
|
||||
: QApplication(dpy, argc, argv, visual, cmap)
|
||||
{
|
||||
sysInit();
|
||||
}
|
||||
|
||||
/*!
|
||||
Special constructor for X11, ref. the documentation of
|
||||
QApplication's corresponding constructor. The application identifier
|
||||
will be \a appId. \a dpy, \a argc, \a
|
||||
argv, \a visual, and \a cmap are passed on to the QApplication
|
||||
constructor.
|
||||
*/
|
||||
QtSingleApplication::QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap)
|
||||
: QApplication(dpy, argc, argv, visual, cmap)
|
||||
{
|
||||
sysInit(appId);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
Returns true if another instance of this application is running;
|
||||
otherwise false.
|
||||
|
||||
This function does not find instances of this application that are
|
||||
being run by a different user (on Windows: that are running in
|
||||
another session).
|
||||
|
||||
\sa sendMessage()
|
||||
*/
|
||||
|
||||
bool QtSingleApplication::isRunning()
|
||||
{
|
||||
return peer->isClient();
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
Tries to send the text \a message to the currently running
|
||||
instance. The QtSingleApplication object in the running instance
|
||||
will emit the messageReceived() signal when it receives the
|
||||
message.
|
||||
|
||||
This function returns true if the message has been sent to, and
|
||||
processed by, the current instance. If there is no instance
|
||||
currently running, or if the running instance fails to process the
|
||||
message within \a timeout milliseconds, this function return false.
|
||||
|
||||
\sa isRunning(), messageReceived()
|
||||
*/
|
||||
bool QtSingleApplication::sendMessage(const QString &message, int timeout)
|
||||
{
|
||||
return peer->sendMessage(message, timeout);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
Returns the application identifier. Two processes with the same
|
||||
identifier will be regarded as instances of the same application.
|
||||
*/
|
||||
QString QtSingleApplication::id() const
|
||||
{
|
||||
return peer->applicationId();
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
Sets the activation window of this application to \a aw. The
|
||||
activation window is the widget that will be activated by
|
||||
activateWindow(). This is typically the application's main window.
|
||||
|
||||
If \a activateOnMessage is true (the default), the window will be
|
||||
activated automatically every time a message is received, just prior
|
||||
to the messageReceived() signal being emitted.
|
||||
|
||||
\sa activateWindow(), messageReceived()
|
||||
*/
|
||||
|
||||
void QtSingleApplication::setActivationWindow(QWidget* aw, bool activateOnMessage)
|
||||
{
|
||||
actWin = aw;
|
||||
if (activateOnMessage)
|
||||
connect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow()));
|
||||
else
|
||||
disconnect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow()));
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
Returns the applications activation window if one has been set by
|
||||
calling setActivationWindow(), otherwise returns 0.
|
||||
|
||||
\sa setActivationWindow()
|
||||
*/
|
||||
QWidget* QtSingleApplication::activationWindow() const
|
||||
{
|
||||
return actWin;
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
De-minimizes, raises, and activates this application's activation window.
|
||||
This function does nothing if no activation window has been set.
|
||||
|
||||
This is a convenience function to show the user that this
|
||||
application instance has been activated when he has tried to start
|
||||
another instance.
|
||||
|
||||
This function should typically be called in response to the
|
||||
messageReceived() signal. By default, that will happen
|
||||
automatically, if an activation window has been set.
|
||||
|
||||
\sa setActivationWindow(), messageReceived(), initialize()
|
||||
*/
|
||||
void QtSingleApplication::activateWindow()
|
||||
{
|
||||
if (actWin) {
|
||||
actWin->setWindowState(actWin->windowState() & ~Qt::WindowMinimized);
|
||||
actWin->raise();
|
||||
actWin->activateWindow();
|
||||
actWin->setFocus();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
\fn void QtSingleApplication::messageReceived(const QString& message)
|
||||
|
||||
This signal is emitted when the current instance receives a \a
|
||||
message from another instance of this application.
|
||||
|
||||
\sa sendMessage(), setActivationWindow(), activateWindow()
|
||||
*/
|
||||
|
||||
|
||||
/*!
|
||||
\fn void QtSingleApplication::initialize(bool dummy = true)
|
||||
|
||||
\obsolete
|
||||
*/
|
105
src/3rdparty/qtsingleapplication.h
vendored
Normal file
@ -0,0 +1,105 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of a Qt Solutions component.
|
||||
**
|
||||
** Commercial Usage
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Solutions Commercial License Agreement provided
|
||||
** with the Software or, alternatively, in accordance with the terms
|
||||
** contained in a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain
|
||||
** additional rights. These rights are described in the Nokia Qt LGPL
|
||||
** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
|
||||
** package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Please note Third Party Software included with Qt Solutions may impose
|
||||
** additional restrictions and it is the user's responsibility to ensure
|
||||
** that they have met the licensing requirements of the GPL, LGPL, or Qt
|
||||
** Solutions Commercial license and the relevant license of the Third
|
||||
** Party Software they are using.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact Nokia at qt-info@nokia.com.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
#include <QtGui/QApplication>
|
||||
|
||||
class QtLocalPeer;
|
||||
|
||||
#if defined(Q_WS_WIN)
|
||||
# if !defined(QT_QTSINGLEAPPLICATION_EXPORT) && !defined(QT_QTSINGLEAPPLICATION_IMPORT)
|
||||
# define QT_QTSINGLEAPPLICATION_EXPORT
|
||||
# elif defined(QT_QTSINGLEAPPLICATION_IMPORT)
|
||||
# if defined(QT_QTSINGLEAPPLICATION_EXPORT)
|
||||
# undef QT_QTSINGLEAPPLICATION_EXPORT
|
||||
# endif
|
||||
# define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllimport)
|
||||
# elif defined(QT_QTSINGLEAPPLICATION_EXPORT)
|
||||
# undef QT_QTSINGLEAPPLICATION_EXPORT
|
||||
# define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllexport)
|
||||
# endif
|
||||
#else
|
||||
# define QT_QTSINGLEAPPLICATION_EXPORT
|
||||
#endif
|
||||
|
||||
class QT_QTSINGLEAPPLICATION_EXPORT QtSingleApplication : public QApplication
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QtSingleApplication(int &argc, char **argv, bool GUIenabled = true);
|
||||
QtSingleApplication(const QString &id, int &argc, char **argv);
|
||||
QtSingleApplication(int &argc, char **argv, Type type);
|
||||
#if defined(Q_WS_X11)
|
||||
QtSingleApplication(Display* dpy, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0);
|
||||
QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap= 0);
|
||||
QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0);
|
||||
#endif
|
||||
|
||||
bool isRunning();
|
||||
QString id() const;
|
||||
|
||||
void setActivationWindow(QWidget* aw, bool activateOnMessage = true);
|
||||
QWidget* activationWindow() const;
|
||||
|
||||
// Obsolete:
|
||||
void initialize(bool dummy = true)
|
||||
{ isRunning(); Q_UNUSED(dummy) }
|
||||
|
||||
public Q_SLOTS:
|
||||
bool sendMessage(const QString &message, int timeout = 5000);
|
||||
void activateWindow();
|
||||
|
||||
|
||||
Q_SIGNALS:
|
||||
void messageReceived(const QString &message);
|
||||
|
||||
|
||||
private:
|
||||
void sysInit(const QString &appId = QString());
|
||||
QtLocalPeer *peer;
|
||||
QWidget *actWin;
|
||||
};
|
15
src/3rdparty/qtsingleapplication.pri
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
INCLUDEPATH += $$PWD
|
||||
DEPENDPATH += $$PWD
|
||||
QT *= network
|
||||
|
||||
qtsingleapplication-uselib:!qtsingleapplication-buildlib {
|
||||
LIBS += -L$$QTSINGLEAPPLICATION_LIBDIR -l$$QTSINGLEAPPLICATION_LIBNAME
|
||||
} else {
|
||||
SOURCES += $$PWD/qtsingleapplication.cpp $$PWD/qtlocalpeer.cpp
|
||||
HEADERS += $$PWD/qtsingleapplication.h $$PWD/qtlocalpeer.h
|
||||
}
|
||||
|
||||
win32 {
|
||||
contains(TEMPLATE, lib):contains(CONFIG, shared):DEFINES += QT_QTSINGLEAPPLICATION_EXPORT
|
||||
else:qtsingleapplication-uselib:DEFINES += QT_QTSINGLEAPPLICATION_IMPORT
|
||||
}
|
225
src/3rdparty/qtwin.cpp
vendored
Normal file
@ -0,0 +1,225 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Use, modification and distribution is allowed without limitation,
|
||||
** warranty, liability or support of any kind.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qtwin.h"
|
||||
#include <QLibrary>
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QList>
|
||||
#include <QPointer>
|
||||
|
||||
#ifdef Q_WS_WIN
|
||||
|
||||
#include <qt_windows.h>
|
||||
|
||||
// Blur behind data structures
|
||||
#define DWM_BB_ENABLE 0x00000001 // fEnable has been specified
|
||||
#define DWM_BB_BLURREGION 0x00000002 // hRgnBlur has been specified
|
||||
#define DWM_BB_TRANSITIONONMAXIMIZED 0x00000004 // fTransitionOnMaximized has been specified
|
||||
#define WM_DWMCOMPOSITIONCHANGED 0x031E // Composition changed window message
|
||||
|
||||
typedef struct _DWM_BLURBEHIND
|
||||
{
|
||||
DWORD dwFlags;
|
||||
BOOL fEnable;
|
||||
HRGN hRgnBlur;
|
||||
BOOL fTransitionOnMaximized;
|
||||
} DWM_BLURBEHIND, *PDWM_BLURBEHIND;
|
||||
|
||||
typedef struct _MARGINS
|
||||
{
|
||||
int cxLeftWidth;
|
||||
int cxRightWidth;
|
||||
int cyTopHeight;
|
||||
int cyBottomHeight;
|
||||
} MARGINS, *PMARGINS;
|
||||
|
||||
typedef HRESULT (WINAPI *PtrDwmIsCompositionEnabled)(BOOL* pfEnabled);
|
||||
typedef HRESULT (WINAPI *PtrDwmExtendFrameIntoClientArea)(HWND hWnd, const MARGINS* pMarInset);
|
||||
typedef HRESULT (WINAPI *PtrDwmEnableBlurBehindWindow)(HWND hWnd, const DWM_BLURBEHIND* pBlurBehind);
|
||||
typedef HRESULT (WINAPI *PtrDwmGetColorizationColor)(DWORD *pcrColorization, BOOL *pfOpaqueBlend);
|
||||
|
||||
static PtrDwmIsCompositionEnabled pDwmIsCompositionEnabled= 0;
|
||||
static PtrDwmEnableBlurBehindWindow pDwmEnableBlurBehindWindow = 0;
|
||||
static PtrDwmExtendFrameIntoClientArea pDwmExtendFrameIntoClientArea = 0;
|
||||
static PtrDwmGetColorizationColor pDwmGetColorizationColor = 0;
|
||||
|
||||
|
||||
/*
|
||||
* Internal helper class that notifies windows if the
|
||||
* DWM compositing state changes and updates the widget
|
||||
* flags correspondingly.
|
||||
*/
|
||||
class WindowNotifier : public QWidget
|
||||
{
|
||||
public:
|
||||
WindowNotifier() { winId(); }
|
||||
void addWidget(QWidget *widget) { widgets.append(widget); }
|
||||
void removeWidget(QWidget *widget) { widgets.removeAll(widget); }
|
||||
bool winEvent(MSG *message, long *result);
|
||||
|
||||
private:
|
||||
QWidgetList widgets;
|
||||
};
|
||||
|
||||
static bool resolveLibs()
|
||||
{
|
||||
if (!pDwmIsCompositionEnabled) {
|
||||
QLibrary dwmLib(QString::fromAscii("dwmapi"));
|
||||
pDwmIsCompositionEnabled =(PtrDwmIsCompositionEnabled)dwmLib.resolve("DwmIsCompositionEnabled");
|
||||
pDwmExtendFrameIntoClientArea = (PtrDwmExtendFrameIntoClientArea)dwmLib.resolve("DwmExtendFrameIntoClientArea");
|
||||
pDwmEnableBlurBehindWindow = (PtrDwmEnableBlurBehindWindow)dwmLib.resolve("DwmEnableBlurBehindWindow");
|
||||
pDwmGetColorizationColor = (PtrDwmGetColorizationColor)dwmLib.resolve("DwmGetColorizationColor");
|
||||
}
|
||||
return pDwmIsCompositionEnabled != 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* Chekcs and returns true if Windows DWM composition
|
||||
* is currently enabled on the system.
|
||||
*
|
||||
* To get live notification on the availability of
|
||||
* this feature, you will currently have to
|
||||
* reimplement winEvent() on your widget and listen
|
||||
* for the WM_DWMCOMPOSITIONCHANGED event to occur.
|
||||
*
|
||||
*/
|
||||
bool QtWin::isCompositionEnabled()
|
||||
{
|
||||
#ifdef Q_WS_WIN
|
||||
if (resolveLibs()) {
|
||||
HRESULT hr = S_OK;
|
||||
BOOL isEnabled = false;
|
||||
hr = pDwmIsCompositionEnabled(&isEnabled);
|
||||
if (SUCCEEDED(hr))
|
||||
return isEnabled;
|
||||
}
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Enables Blur behind on a Widget.
|
||||
*
|
||||
* \a enable tells if the blur should be enabled or not
|
||||
*/
|
||||
bool QtWin::enableBlurBehindWindow(QWidget *widget, bool enable)
|
||||
{
|
||||
Q_UNUSED(enable);
|
||||
Q_UNUSED(widget);
|
||||
Q_ASSERT(widget);
|
||||
bool result = false;
|
||||
#ifdef Q_WS_WIN
|
||||
if (resolveLibs()) {
|
||||
DWM_BLURBEHIND bb = {0};
|
||||
HRESULT hr = S_OK;
|
||||
bb.fEnable = enable;
|
||||
bb.dwFlags = DWM_BB_ENABLE;
|
||||
bb.hRgnBlur = NULL;
|
||||
widget->setAttribute(Qt::WA_TranslucentBackground, enable);
|
||||
widget->setAttribute(Qt::WA_NoSystemBackground, enable);
|
||||
hr = pDwmEnableBlurBehindWindow(widget->winId(), &bb);
|
||||
if (SUCCEEDED(hr)) {
|
||||
result = true;
|
||||
windowNotifier()->addWidget(widget);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
|
||||
/*!
|
||||
* ExtendFrameIntoClientArea.
|
||||
*
|
||||
* This controls the rendering of the frame inside the window.
|
||||
* Note that passing margins of -1 (the default value) will completely
|
||||
* remove the frame from the window.
|
||||
*
|
||||
* \note you should not call enableBlurBehindWindow before calling
|
||||
* this functions
|
||||
*
|
||||
* \a enable tells if the blur should be enabled or not
|
||||
*/
|
||||
bool QtWin::extendFrameIntoClientArea(QWidget *widget, int left, int top, int right, int bottom)
|
||||
{
|
||||
|
||||
Q_ASSERT(widget);
|
||||
Q_UNUSED(left);
|
||||
Q_UNUSED(top);
|
||||
Q_UNUSED(right);
|
||||
Q_UNUSED(bottom);
|
||||
Q_UNUSED(widget);
|
||||
|
||||
bool result = false;
|
||||
#ifdef Q_WS_WIN
|
||||
if (resolveLibs()) {
|
||||
QLibrary dwmLib(QString::fromAscii("dwmapi"));
|
||||
HRESULT hr = S_OK;
|
||||
MARGINS m = {left, top, right, bottom};
|
||||
hr = pDwmExtendFrameIntoClientArea(widget->winId(), &m);
|
||||
if (SUCCEEDED(hr)) {
|
||||
result = true;
|
||||
windowNotifier()->addWidget(widget);
|
||||
}
|
||||
widget->setAttribute(Qt::WA_TranslucentBackground, result);
|
||||
}
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Returns the current colorizationColor for the window.
|
||||
*
|
||||
* \a enable tells if the blur should be enabled or not
|
||||
*/
|
||||
QColor QtWin::colorizatinColor()
|
||||
{
|
||||
QColor resultColor = QApplication::palette().window().color();
|
||||
|
||||
#ifdef Q_WS_WIN
|
||||
if (resolveLibs()) {
|
||||
DWORD color = 0;
|
||||
BOOL opaque = FALSE;
|
||||
QLibrary dwmLib(QString::fromAscii("dwmapi"));
|
||||
HRESULT hr = S_OK;
|
||||
hr = pDwmGetColorizationColor(&color, &opaque);
|
||||
if (SUCCEEDED(hr))
|
||||
resultColor = QColor(color);
|
||||
}
|
||||
#endif
|
||||
return resultColor;
|
||||
}
|
||||
|
||||
#ifdef Q_WS_WIN
|
||||
WindowNotifier *QtWin::windowNotifier()
|
||||
{
|
||||
static WindowNotifier *windowNotifierInstance = 0;
|
||||
if (!windowNotifierInstance)
|
||||
windowNotifierInstance = new WindowNotifier;
|
||||
return windowNotifierInstance;
|
||||
}
|
||||
|
||||
|
||||
/* Notify all enabled windows that the DWM state changed */
|
||||
bool WindowNotifier::winEvent(MSG *message, long *result)
|
||||
{
|
||||
if (message && message->message == WM_DWMCOMPOSITIONCHANGED) {
|
||||
bool compositionEnabled = QtWin::isCompositionEnabled();
|
||||
foreach(QWidget * widget, widgets) {
|
||||
if (widget) {
|
||||
widget->setAttribute(Qt::WA_NoSystemBackground, compositionEnabled);
|
||||
}
|
||||
widget->update();
|
||||
}
|
||||
}
|
||||
return QWidget::winEvent(message, result);
|
||||
}
|
||||
#endif
|
37
src/3rdparty/qtwin.h
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Use, modification and distribution is allowed without limitation,
|
||||
** warranty, liability or support of any kind.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QTWIN_H
|
||||
#define QTWIN_H
|
||||
|
||||
#include <QColor>
|
||||
#include <QWidget>
|
||||
/**
|
||||
* This is a helper class for using the Desktop Window Manager
|
||||
* functionality on Windows 7 and Windows Vista. On other platforms
|
||||
* these functions will simply not do anything.
|
||||
*/
|
||||
|
||||
class WindowNotifier;
|
||||
|
||||
class QtWin
|
||||
{
|
||||
public:
|
||||
static bool enableBlurBehindWindow(QWidget *widget, bool enable = true);
|
||||
static bool extendFrameIntoClientArea(QWidget *widget,
|
||||
int left = -1, int top = -1,
|
||||
int right = -1, int bottom = -1);
|
||||
static bool isCompositionEnabled();
|
||||
static QColor colorizatinColor();
|
||||
|
||||
private:
|
||||
static WindowNotifier *windowNotifier();
|
||||
};
|
||||
|
||||
#endif // QTWIN_H
|
19
src/3rdparty/squeezelabel.cpp
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
#include "squeezelabel.h"
|
||||
|
||||
SqueezeLabel::SqueezeLabel(QWidget *parent)
|
||||
: QLabel(parent)
|
||||
{
|
||||
}
|
||||
|
||||
void SqueezeLabel::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
if (m_SqueezedTextCache != text()) {
|
||||
m_SqueezedTextCache = text();
|
||||
QFontMetrics fm = fontMetrics();
|
||||
if (fm.width(m_SqueezedTextCache) > contentsRect().width()) {
|
||||
QString elided = fm.elidedText(text(), Qt::ElideMiddle, width());
|
||||
setText(elided);
|
||||
}
|
||||
}
|
||||
QLabel::paintEvent(event);
|
||||
}
|
52
src/3rdparty/squeezelabel.h
vendored
Normal file
@ -0,0 +1,52 @@
|
||||
#ifndef SQUEEZELABEL_H
|
||||
#define SQUEEZELABEL_H
|
||||
|
||||
/**
|
||||
* Copyright (c) 2009, Benjamin C. Meyer <ben@meyerhome.net>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the Benjamin Meyer nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <QLabel>
|
||||
|
||||
/*
|
||||
A label that will squeeze the set text to fit within the size of the
|
||||
widget. The text will be elided in the middle.
|
||||
*/
|
||||
class SqueezeLabel : public QLabel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
SqueezeLabel(QWidget *parent = 0);
|
||||
|
||||
protected:
|
||||
void paintEvent(QPaintEvent *event);
|
||||
|
||||
private:
|
||||
QString m_SqueezedTextCache;
|
||||
};
|
||||
|
||||
#endif // SQUEEZELABEL_H
|
168
src/QupZilla.pro
Normal file
@ -0,0 +1,168 @@
|
||||
#-------------------------------------------------
|
||||
#
|
||||
# Project created by QtCreator 2010-12-18T14:53:41
|
||||
#
|
||||
#-------------------------------------------------
|
||||
|
||||
DESTDIR = ../bin
|
||||
|
||||
QT += core gui webkit sql network
|
||||
|
||||
TARGET = qupzilla
|
||||
|
||||
TEMPLATE = app
|
||||
|
||||
INCLUDEPATH += 3rdparty\
|
||||
app\
|
||||
autofill\
|
||||
bookmarks\
|
||||
cookies\
|
||||
downloads\
|
||||
history\
|
||||
navigation\
|
||||
network\
|
||||
other\
|
||||
preferences\
|
||||
rss\
|
||||
tools\
|
||||
utils\
|
||||
webview\
|
||||
plugins\
|
||||
sidebar\
|
||||
data\
|
||||
|
||||
SOURCES += main.cpp\
|
||||
3rdparty/squeezelabel.cpp \
|
||||
3rdparty/qtwin.cpp \
|
||||
3rdparty/lineedit.cpp \
|
||||
app/qupzilla.cpp \
|
||||
app/mainapplication.cpp \
|
||||
app/autosaver.cpp \
|
||||
autofill/autofillmodel.cpp \
|
||||
preferences/autofillmanager.cpp \
|
||||
bookmarks/bookmarkstoolbar.cpp \
|
||||
bookmarks/bookmarksmanager.cpp \
|
||||
cookies/cookiemanager.cpp \
|
||||
cookies/cookiejar.cpp \
|
||||
downloads/downloadmanager.cpp \
|
||||
history/historymodel.cpp \
|
||||
history/historymanager.cpp \
|
||||
navigation/websearchbar.cpp \
|
||||
navigation/locationcompleter.cpp \
|
||||
navigation/locationbar.cpp \
|
||||
network/networkmanagerproxy.cpp \
|
||||
network/networkmanager.cpp \
|
||||
other/updater.cpp \
|
||||
other/sourceviewer.cpp \
|
||||
preferences/preferences.cpp \
|
||||
rss/rssmanager.cpp \
|
||||
other/clearprivatedata.cpp \
|
||||
webview/webview.cpp \
|
||||
webview/webpage.cpp \
|
||||
webview/tabwidget.cpp \
|
||||
webview/tabbar.cpp \
|
||||
webview/siteinfo.cpp \
|
||||
webview/searchtoolbar.cpp \
|
||||
app/commandlineoptions.cpp \
|
||||
other/aboutdialog.cpp \
|
||||
plugins/plugins.cpp \
|
||||
preferences/pluginslist.cpp \
|
||||
plugins/pluginproxy.cpp \
|
||||
app/appui.cpp \
|
||||
tools/clickablelabel.cpp \
|
||||
downloads/downloadoptionsdialog.cpp \
|
||||
tools/treewidget.cpp \
|
||||
bookmarks/bookmarkswidget.cpp \
|
||||
tools/frame.cpp \
|
||||
bookmarks/bookmarksmodel.cpp \
|
||||
sidebar/sidebar.cpp \
|
||||
webview/siteinfowidget.cpp \
|
||||
plugins/clicktoflash.cpp \
|
||||
plugins/webpluginfactory.cpp \
|
||||
downloads/downloaditem.cpp \
|
||||
3rdparty/ecwin7.cpp \
|
||||
autofill/autofillwidget.cpp \
|
||||
webview/webtab.cpp
|
||||
|
||||
HEADERS += 3rdparty/squeezelabel.h \
|
||||
3rdparty/qtwin.h \
|
||||
3rdparty/lineedit.h \
|
||||
app/qupzilla.h \
|
||||
app/mainapplication.h \
|
||||
app/autosaver.h \
|
||||
autofill/autofillmodel.h \
|
||||
preferences/autofillmanager.h \
|
||||
bookmarks/bookmarkstoolbar.h \
|
||||
bookmarks/bookmarksmanager.h \
|
||||
cookies/cookiemanager.h \
|
||||
cookies/cookiejar.h \
|
||||
downloads/downloadmanager.h \
|
||||
history/historymodel.h \
|
||||
history/historymanager.h \
|
||||
navigation/websearchbar.h \
|
||||
navigation/locationcompleter.h \
|
||||
navigation/locationbar.h \
|
||||
network/networkmanagerproxy.h \
|
||||
network/networkmanager.h \
|
||||
other/updater.h \
|
||||
other/sourceviewer.h \
|
||||
preferences/preferences.h \
|
||||
rss/rssmanager.h \
|
||||
other/clearprivatedata.h \
|
||||
webview/webview.h \
|
||||
webview/webpage.h \
|
||||
webview/tabwidget.h \
|
||||
webview/tabbar.h \
|
||||
webview/siteinfo.h \
|
||||
webview/searchtoolbar.h \
|
||||
app/commandlineoptions.h \
|
||||
other/aboutdialog.h \
|
||||
plugins/plugininterface.h \
|
||||
plugins/plugins.h \
|
||||
preferences/pluginslist.h \
|
||||
plugins/pluginproxy.h \
|
||||
tools/clickablelabel.h \
|
||||
downloads/downloadoptionsdialog.h \
|
||||
tools/treewidget.h \
|
||||
bookmarks/bookmarkswidget.h \
|
||||
tools/frame.h \
|
||||
bookmarks/bookmarksmodel.h \
|
||||
sidebar/sidebar.h \
|
||||
webview/siteinfowidget.h \
|
||||
plugins/clicktoflash.h \
|
||||
plugins/webpluginfactory.h \
|
||||
downloads/downloaditem.h \
|
||||
3rdparty/ecwin7.h \
|
||||
autofill/autofillwidget.h \
|
||||
webview/webtab.h
|
||||
|
||||
FORMS += \
|
||||
preferences/autofillmanager.ui \
|
||||
bookmarks/bookmarksmanager.ui \
|
||||
cookies/cookiemanager.ui \
|
||||
history/historymanager.ui \
|
||||
preferences/preferences.ui \
|
||||
rss/rssmanager.ui \
|
||||
webview/siteinfo.ui \
|
||||
other/aboutdialog.ui \
|
||||
preferences/pluginslist.ui \
|
||||
downloads/downloadoptionsdialog.ui \
|
||||
bookmarks/bookmarkswidget.ui \
|
||||
webview/siteinfowidget.ui \
|
||||
downloads/downloaditem.ui \
|
||||
downloads/downloadmanager.ui \
|
||||
autofill/autofillwidget.ui
|
||||
|
||||
RESOURCES += \
|
||||
data/icons.qrc \
|
||||
data/html.qrc
|
||||
|
||||
OTHER_FILES += \
|
||||
appicon.rc \
|
||||
|
||||
TRANSLATIONS +=cs_CZ.ts
|
||||
|
||||
include(3rdparty/qtsingleapplication.pri)
|
||||
|
||||
win32:RC_FILE = appicon.rc
|
||||
win32:LIBS += libole32
|
294
src/app/appui.cpp
Normal file
@ -0,0 +1,294 @@
|
||||
#include "qupzilla.h"
|
||||
#include "autofillmodel.h"
|
||||
#include "bookmarkstoolbar.h"
|
||||
#include "locationbar.h"
|
||||
|
||||
void QupZilla::postLaunch()
|
||||
{
|
||||
loadSettings();
|
||||
//Open tab from command line argument
|
||||
bool addTab = true;
|
||||
QStringList arguments = qApp->arguments();
|
||||
for (int i = 0;i<qApp->arguments().count();i++) {
|
||||
QString arg = arguments.at(i);
|
||||
if (arg.startsWith("-url=")) {
|
||||
m_tabWidget->addView(QUrl(arg.replace("-url=","")));
|
||||
addTab = false;
|
||||
}
|
||||
}
|
||||
|
||||
QSettings settings(m_activeProfil+"settings.ini", QSettings::IniFormat);
|
||||
settings.beginGroup("Web-URL-Settings");
|
||||
int afterLaunch = settings.value("afterLaunch",1).toInt();
|
||||
settings.endGroup();
|
||||
settings.beginGroup("SessionRestore");
|
||||
bool startingAfterCrash = settings.value("isCrashed",false).toBool();
|
||||
settings.endGroup();
|
||||
qDebug() << "startingaftercrash" << startingAfterCrash;
|
||||
|
||||
QUrl startUrl;
|
||||
if (m_tryRestore) {
|
||||
if (afterLaunch == 0)
|
||||
startUrl = QUrl("");
|
||||
else if (afterLaunch == 1)
|
||||
startUrl = m_homepage;
|
||||
else
|
||||
startUrl = m_homepage;
|
||||
|
||||
if ( startingAfterCrash || (addTab && afterLaunch == 2) ) {
|
||||
p_mainApp->restoreStateSlot(this);
|
||||
addTab = false;
|
||||
}
|
||||
} else
|
||||
startUrl = m_homepage;
|
||||
|
||||
if (!m_startingUrl.isEmpty()) {
|
||||
startUrl = WebView::guessUrlFromString(m_startingUrl.toString());
|
||||
addTab = true;
|
||||
}
|
||||
|
||||
if (addTab)
|
||||
m_tabWidget->addView(startUrl);
|
||||
|
||||
aboutToShowHistoryMenu();
|
||||
aboutToShowBookmarksMenu();
|
||||
|
||||
if (m_tabWidget->count() == 0) //Something went really wrong .. add one tab
|
||||
m_tabWidget->addView(m_homepage);
|
||||
|
||||
QApplication::restoreOverrideCursor();
|
||||
setUpdatesEnabled(true);
|
||||
emit startingCompleted();
|
||||
}
|
||||
|
||||
void QupZilla::setupUi()
|
||||
{
|
||||
setContentsMargins(0,0,0,0);
|
||||
|
||||
m_navigation = new QToolBar(this);
|
||||
m_navigation->setWindowTitle(tr("Navigation"));
|
||||
m_navigation->setObjectName("Navigation bar");
|
||||
addToolBar(m_navigation);
|
||||
m_navigation->setMovable(false);
|
||||
m_navigation->setStyleSheet("QToolBar{background-image:url(:icons/transp.png); border:none;}");
|
||||
|
||||
m_buttonBack = new QAction(QIcon(":/icons/navigation/zpet.png"),tr("Back"),this);
|
||||
m_buttonBack->setEnabled(false);
|
||||
m_buttonNext = new QAction(QIcon(":/icons/navigation/vpred.png"),tr("Forward"),this);
|
||||
m_buttonNext->setEnabled(false);
|
||||
m_buttonStop = new QAction(QIcon(":/icons/navigation/stop.png"),tr("Stop"),this);
|
||||
m_buttonReload = new QAction(QIcon(":/icons/navigation/reload.png"),tr("Reload"),this);
|
||||
m_buttonReload->setShortcut(QKeySequence("F5"));
|
||||
m_buttonHome = new QAction(QIcon(":/icons/navigation/home.png"),tr("Home"),this);
|
||||
|
||||
m_menuBack = new QMenu();
|
||||
m_buttonBack->setMenu(m_menuBack);
|
||||
connect(m_menuBack, SIGNAL(aboutToShow()),this, SLOT(aboutToShowHistoryBackMenu()));
|
||||
|
||||
m_menuForward = new QMenu();
|
||||
m_buttonNext->setMenu(m_menuForward);
|
||||
connect(m_menuForward, SIGNAL(aboutToShow()),this, SLOT(aboutToShowHistoryNextMenu()));
|
||||
|
||||
m_supMenu = new QToolButton(this);
|
||||
m_supMenu->setPopupMode(QToolButton::InstantPopup);
|
||||
m_supMenu->setIcon(QIcon(":/icons/qupzilla.png"));
|
||||
m_supMenu->setToolTip(tr("Main Menu"));
|
||||
m_superMenu = new QMenu(this);
|
||||
m_supMenu->setMenu(m_superMenu);
|
||||
|
||||
m_navigation->addAction(m_buttonBack);
|
||||
m_navigation->addAction(m_buttonNext);
|
||||
m_navigation->addAction(m_buttonReload);
|
||||
m_navigation->addAction(m_buttonStop);
|
||||
m_navigation->addAction(m_buttonHome);
|
||||
|
||||
m_locationBar = new LocationBar(this);
|
||||
m_searchLine = new WebSearchBar(this);
|
||||
|
||||
m_navigationSplitter = new QSplitter(m_navigation);
|
||||
m_navigationSplitter->addWidget(m_locationBar);
|
||||
m_navigationSplitter->addWidget(m_searchLine);
|
||||
|
||||
m_navigationSplitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
|
||||
m_navigationSplitter->setCollapsible(0, false);
|
||||
|
||||
m_navigation->addWidget(m_navigationSplitter);
|
||||
int splitterWidth = m_navigationSplitter->width();
|
||||
QList<int> sizes;
|
||||
sizes << (int)((double)splitterWidth * .75) << (int)((double)splitterWidth * .25);
|
||||
m_navigationSplitter->setSizes(sizes);
|
||||
|
||||
m_actionExitFullscreen = new QAction(tr("Exit Fullscreen"),this);
|
||||
m_actionExitFullscreen->setVisible(false);
|
||||
m_navigation->addAction(m_actionExitFullscreen);
|
||||
m_navigation->addWidget(m_supMenu);
|
||||
m_navigation->addWidget(new QLabel()); //Elegant spacer -,-
|
||||
m_navigation->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
|
||||
m_progressBar = new QProgressBar(this);
|
||||
m_progressBar->setMaximumSize(QSize(150, 16));
|
||||
m_privateBrowsing = new QLabel(this);
|
||||
m_privateBrowsing->setPixmap(QPixmap(":/icons/locationbar/privatebrowsing.png"));
|
||||
m_privateBrowsing->setVisible(false);
|
||||
m_privateBrowsing->setToolTip(tr("Private Browsing Enabled"));
|
||||
m_allowFlashIcon = new QLabel(this);
|
||||
m_allowFlashIcon->setPixmap(QPixmap(":/icons/menu/flash.png"));
|
||||
m_allowFlashIcon->setVisible(false);
|
||||
m_allowFlashIcon->setToolTip(tr("Flash Plugin Enabled"));
|
||||
m_ipLabel = new QLabel(this);
|
||||
m_ipLabel->setStyleSheet("padding-right: 5px;");
|
||||
m_ipLabel->setToolTip(tr("IP Address of current page"));
|
||||
|
||||
statusBar()->insertPermanentWidget(0, m_progressBar);
|
||||
statusBar()->insertPermanentWidget(1, m_ipLabel);
|
||||
statusBar()->insertPermanentWidget(2, m_privateBrowsing);
|
||||
statusBar()->insertPermanentWidget(3, m_allowFlashIcon);
|
||||
|
||||
m_bookmarksToolbar = new BookmarksToolbar(this);
|
||||
addToolBar(m_bookmarksToolbar);
|
||||
insertToolBarBreak(m_bookmarksToolbar);
|
||||
|
||||
m_tabWidget = new TabWidget(this);
|
||||
setCentralWidget(m_tabWidget);
|
||||
}
|
||||
|
||||
void QupZilla::setupMenu()
|
||||
{
|
||||
m_menuTools = new QMenu(tr("Tools"));
|
||||
m_menuHelp = new QMenu(tr("Help"));
|
||||
m_menuBookmarks = new QMenu(tr("Bookmarks"));
|
||||
m_menuHistory = new QMenu(tr("History"));
|
||||
connect(m_menuHistory, SIGNAL(aboutToShow()), this, SLOT(aboutToShowHistoryMenu()));
|
||||
connect(m_menuBookmarks, SIGNAL(aboutToShow()), this, SLOT(aboutToShowBookmarksMenu()));
|
||||
connect(m_menuHelp, SIGNAL(aboutToShow()), this, SLOT(aboutToShowHelpMenu()));
|
||||
connect(m_menuTools, SIGNAL(aboutToShow()), this, SLOT(aboutToShowToolsMenu()));
|
||||
|
||||
m_menuFile = new QMenu(tr("File"));
|
||||
m_menuFile->addAction(QIcon::fromTheme("window-new"), tr("New Window"), this, SLOT(newWindow()))->setShortcut(QKeySequence("Ctrl+N"));
|
||||
m_menuFile->addAction(QIcon(":/icons/menu/popup.png"), tr("New Tab"), this, SLOT(addTab()))->setShortcut(QKeySequence("Ctrl+T"));
|
||||
m_menuFile->addAction(tr("Open Location"), this, SLOT(openLocation()))->setShortcut(QKeySequence("Ctrl+L"));
|
||||
m_menuFile->addAction(QIcon::fromTheme("document-open"), tr("Open File"), this, SLOT(openFile()))->setShortcut(QKeySequence("Ctrl+O"));
|
||||
m_menuFile->addAction(tr("Close Tab"), m_tabWidget, SLOT(closeTab()))->setShortcut(QKeySequence("Ctrl+W"));
|
||||
m_menuFile->addAction(QIcon::fromTheme("window-close"), tr("Close Window"), this, SLOT(close()))->setShortcut(QKeySequence("Ctrl+Shift+W"));
|
||||
m_menuFile->addSeparator();
|
||||
m_menuFile->addAction(QIcon::fromTheme("document-save"), tr("Save Page As..."), this, SLOT(savePage()))->setShortcut(QKeySequence("Ctrl+S"));
|
||||
m_menuFile->addAction(tr("Send Link..."), this, SLOT(sendLink()));
|
||||
m_menuFile->addAction(QIcon::fromTheme("document-print"), tr("Print"), this, SLOT(printPage()));
|
||||
m_menuFile->addSeparator();
|
||||
m_menuFile->addAction(QIcon::fromTheme("application-exit"), tr("Quit"), this, SLOT(quitApp()))->setShortcut(QKeySequence("Ctrl+Q"));
|
||||
menuBar()->addMenu(m_menuFile);
|
||||
|
||||
m_menuEdit = new QMenu(tr("Edit"));
|
||||
m_menuEdit->addAction(QIcon::fromTheme("edit-undo"), tr("Undo"))->setShortcut(QKeySequence("Ctrl+Z"));
|
||||
m_menuEdit->addAction(QIcon::fromTheme("edit-redo"), tr("Redo"))->setShortcut(QKeySequence("Ctrl+Shift+Z"));
|
||||
m_menuEdit->addSeparator();
|
||||
m_menuEdit->addAction(QIcon::fromTheme("edit-cut"), tr("Cut"))->setShortcut(QKeySequence("Ctrl+X"));
|
||||
m_menuEdit->addAction(QIcon::fromTheme("edit-copy"), tr("Copy"), this, SLOT(copy()))->setShortcut(QKeySequence("Ctrl+C"));
|
||||
m_menuEdit->addAction(QIcon::fromTheme("edit-paste"), tr("Paste"))->setShortcut(QKeySequence("Ctrl+V"));
|
||||
m_menuEdit->addAction(QIcon::fromTheme("edit-delete"), tr("Delete"))->setShortcut(QKeySequence("Del"));
|
||||
m_menuEdit->addSeparator();
|
||||
m_menuEdit->addAction(QIcon::fromTheme("edit-select-all"), tr("Select All"), this, SLOT(selectAll()))->setShortcut(QKeySequence("Ctrl+A"));
|
||||
m_menuEdit->addSeparator();
|
||||
m_menuEdit->addAction(QIcon::fromTheme("edit-find"), tr("Find"), this, SLOT(searchOnPage()))->setShortcut(QKeySequence("Ctrl+F"));
|
||||
menuBar()->addMenu(m_menuEdit);
|
||||
|
||||
m_menuView = new QMenu(tr("View"));
|
||||
m_actionShowToolbar = new QAction(tr("Navigation Toolbar"), this);
|
||||
m_actionShowToolbar->setCheckable(true);
|
||||
connect(m_actionShowToolbar, SIGNAL(triggered(bool)), this, SLOT(showNavigationToolbar()));
|
||||
m_actionShowBookmarksToolbar = new QAction(tr("Bookmarks Toolbar"), this);
|
||||
m_actionShowBookmarksToolbar->setCheckable(true);
|
||||
connect(m_actionShowBookmarksToolbar, SIGNAL(triggered(bool)), this, SLOT(showBookmarksToolbar()));
|
||||
m_actionShowStatusbar = new QAction(tr("Status Bar"), this);
|
||||
m_actionShowStatusbar->setCheckable(true);
|
||||
connect(m_actionShowStatusbar, SIGNAL(triggered(bool)), this, SLOT(showStatusbar()));
|
||||
m_actionShowMenubar = new QAction(tr("Menu Bar"), this);
|
||||
m_actionShowMenubar->setCheckable(true);
|
||||
connect(m_actionShowMenubar, SIGNAL(triggered(bool)), this, SLOT(showMenubar()));
|
||||
m_actionShowFullScreen = new QAction(tr("Fullscreen"), this);
|
||||
m_actionShowFullScreen->setCheckable(true);
|
||||
m_actionShowFullScreen->setShortcut(QKeySequence("F11"));
|
||||
connect(m_actionShowFullScreen, SIGNAL(triggered(bool)), this, SLOT(fullScreen(bool)));
|
||||
m_actionStop = new QAction(
|
||||
#ifdef Q_WS_X11
|
||||
style()->standardIcon(QStyle::SP_BrowserStop)
|
||||
#else
|
||||
QIcon(":/icons/faenza/stop.png")
|
||||
#endif
|
||||
, tr("Stop"), this);
|
||||
connect(m_actionStop, SIGNAL(triggered()), this, SLOT(stop()));
|
||||
m_actionStop->setShortcut(QKeySequence("Esc"));
|
||||
m_actionReload = new QAction(
|
||||
#ifdef Q_WS_X11
|
||||
style()->standardIcon(QStyle::SP_BrowserReload)
|
||||
#else
|
||||
QIcon(":/icons/faenza/reload.png")
|
||||
#endif
|
||||
, tr("Reload"), this);
|
||||
connect(m_actionReload, SIGNAL(triggered()), this, SLOT(reload()));
|
||||
m_actionReload->setShortcut(QKeySequence("Ctrl+R"));
|
||||
|
||||
m_menuView->addAction(m_actionShowMenubar);
|
||||
m_menuView->addAction(m_actionShowToolbar);
|
||||
m_menuView->addAction(m_actionShowBookmarksToolbar);
|
||||
m_menuView->addAction(m_actionShowStatusbar);
|
||||
m_menuView->addSeparator();
|
||||
m_menuView->addAction(m_actionStop);
|
||||
m_menuView->addAction(m_actionReload);
|
||||
m_menuView->addSeparator();
|
||||
m_menuView->addAction(QIcon::fromTheme("zoom-in"), tr("Zoom In"), this, SLOT(zoomIn()))->setShortcut(QKeySequence("Ctrl++"));
|
||||
m_menuView->addAction(QIcon::fromTheme("zoom-out"), tr("Zoom Out"), this, SLOT(zoomOut()))->setShortcut(QKeySequence("Ctrl+-"));
|
||||
m_menuView->addAction(QIcon::fromTheme("zoom-original"), tr("Reset"), this, SLOT(zoomReset()))->setShortcut(QKeySequence("Ctrl+0"));
|
||||
m_menuView->addSeparator();
|
||||
m_menuView->addAction(QIcon::fromTheme("text-html"), tr("Page Source"), this, SLOT(showSource()))->setShortcut(QKeySequence("Ctrl+U"));
|
||||
m_menuView->addAction(m_actionShowFullScreen);
|
||||
menuBar()->addMenu(m_menuView);
|
||||
connect(m_menuView, SIGNAL(aboutToShow()), this, SLOT(aboutToShowViewMenu()));
|
||||
|
||||
menuBar()->addMenu(m_menuHistory);
|
||||
menuBar()->addMenu(m_menuBookmarks);
|
||||
menuBar()->addMenu(m_menuTools);
|
||||
menuBar()->addMenu(m_menuHelp);
|
||||
|
||||
menuBar()->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
|
||||
aboutToShowToolsMenu();
|
||||
aboutToShowHelpMenu();
|
||||
|
||||
connect(m_locationBar, SIGNAL(returnPressed()), this, SLOT(urlEnter()));
|
||||
connect(m_buttonBack, SIGNAL(triggered()), this, SLOT(goBack()));
|
||||
connect(m_buttonNext, SIGNAL(triggered()), this, SLOT(goNext()));
|
||||
connect(m_buttonStop, SIGNAL(triggered()), this, SLOT(stop()));
|
||||
connect(m_buttonReload, SIGNAL(triggered()), this, SLOT(reload()));
|
||||
connect(m_buttonHome, SIGNAL(triggered()), this, SLOT(goHome()));
|
||||
connect(m_actionExitFullscreen, SIGNAL(triggered(bool)), this, SLOT(fullScreen(bool)));
|
||||
|
||||
//Make shortcuts available even in fullscreen (menu hidden)
|
||||
QList<QAction*> actions = menuBar()->actions();
|
||||
foreach (QAction *action, actions) {
|
||||
if (action->menu())
|
||||
actions += action->menu()->actions();
|
||||
addAction(action);
|
||||
}
|
||||
|
||||
m_superMenu->addMenu(m_menuFile);
|
||||
m_superMenu->addMenu(m_menuEdit);
|
||||
m_superMenu->addMenu(m_menuView);
|
||||
m_superMenu->addMenu(m_menuHistory);
|
||||
m_superMenu->addMenu(m_menuBookmarks);
|
||||
m_superMenu->addMenu(m_menuTools);
|
||||
m_superMenu->addMenu(m_menuHelp);
|
||||
}
|
||||
|
||||
void QupZilla::setBackground(QColor textColor)
|
||||
{
|
||||
QString color = textColor.name();
|
||||
setStyleSheet("QMainWindow { background-image: url("+m_activeProfil+"background.png); background-position: top right; } QToolBar{background-image:url(:icons/transp.png); border:none;}"
|
||||
"QMenuBar{color:"+color+";background-image:url(:icons/transp.png); border:none;} QStatusBar{background-image:url(:icons/transp.png); border:none; color:"+color+";}"
|
||||
"QMenuBar:item{spacing: 5px; padding: 2px 6px;background: transparent;}"
|
||||
"QMenuBar::item:pressed { background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,stop:0 lightgray, stop:1 darkgray); border: 1px solid darkgrey; border-top-left-radius: 4px;border-top-right-radius: 4px; border-bottom: none;}"
|
||||
"QSplitter::handle{background-color:transparent;}"
|
||||
);
|
||||
|
||||
}
|
||||
|
17
src/app/autosaver.cpp
Normal file
@ -0,0 +1,17 @@
|
||||
#include "autosaver.h"
|
||||
#include "mainapplication.h"
|
||||
|
||||
AutoSaver::AutoSaver(QObject *parent) :
|
||||
QObject(parent)
|
||||
,p_mainApp(MainApplication::getInstance())
|
||||
{
|
||||
m_timer.start(1000*5, this);
|
||||
}
|
||||
|
||||
void AutoSaver::timerEvent(QTimerEvent *event)
|
||||
{
|
||||
if (event->timerId() == m_timer.timerId() && p_mainApp->isChanged())
|
||||
emit saveApp();
|
||||
else
|
||||
QObject::timerEvent(event);
|
||||
}
|
37
src/app/autosaver.h
Normal file
@ -0,0 +1,37 @@
|
||||
#ifndef AUTOSAVER_H
|
||||
#define AUTOSAVER_H
|
||||
|
||||
#if defined(QT_NO_DEBUG) & !defined(QT_NO_DEBUG_OUTPUT)
|
||||
#define QT_NO_DEBUG_OUTPUT
|
||||
#endif
|
||||
|
||||
#ifdef QT_NO_DEBUG
|
||||
#ifdef DEVELOPING
|
||||
#error "TRYING TO RELEASE WITH DEVELOPING FLAG"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <QObject>
|
||||
#include <QBasicTimer>
|
||||
#include <QDebug>
|
||||
|
||||
class MainApplication;
|
||||
class AutoSaver : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit AutoSaver(QObject *parent = 0);
|
||||
|
||||
signals:
|
||||
void saveApp();
|
||||
|
||||
public slots:
|
||||
|
||||
private:
|
||||
void timerEvent(QTimerEvent *);
|
||||
MainApplication* p_mainApp;
|
||||
QBasicTimer m_timer;
|
||||
|
||||
};
|
||||
|
||||
#endif // AUTOSAVER_H
|
100
src/app/commandlineoptions.cpp
Normal file
@ -0,0 +1,100 @@
|
||||
#include "commandlineoptions.h"
|
||||
#include "qupzilla.h"
|
||||
|
||||
CommandLineOptions::CommandLineOptions(int &argc, char **argv) :
|
||||
QObject(0)
|
||||
,m_actionString("")
|
||||
,m_argc(argc)
|
||||
,m_argv(argv)
|
||||
,m_action(NoAction)
|
||||
{
|
||||
parseActions();
|
||||
}
|
||||
|
||||
void CommandLineOptions::showHelp()
|
||||
{
|
||||
using namespace std;
|
||||
|
||||
const char* help= " Usage: qupzilla [options] URL \n"
|
||||
"\n"
|
||||
" QupZilla options:\n"
|
||||
" -h or -help print this message \n"
|
||||
" -a or -authors print QupZilla authors \n"
|
||||
" -v or -version print QupZilla version \n"
|
||||
" -p or -profile=PROFILE start with specified profile \n"
|
||||
" -np or -no-plugins start without plugins \n"
|
||||
"\n"
|
||||
" QupZilla is a new, fast and secure web browser\n"
|
||||
" based on WebKit core (http://webkit.org) and\n"
|
||||
" written in Qt Framework (http://qt.nokia.com) \n"
|
||||
;
|
||||
cout << help << " " << QupZilla::WWWADDRESS.toAscii().data() << endl;
|
||||
}
|
||||
|
||||
void CommandLineOptions::parseActions()
|
||||
{
|
||||
using namespace std;
|
||||
|
||||
bool found = false;
|
||||
// Skip first argument (program itself)
|
||||
for (int i = 1; i < m_argc; i++) {
|
||||
QString arg(m_argv[i]);
|
||||
if (arg == "-h" || arg == "-help") {
|
||||
showHelp();
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
if (arg == "-a" || arg == "-authors") {
|
||||
cout << "QupZilla authors: " << endl;
|
||||
cout << " nowrep <nowrep@gmail.com>" << endl;
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
if (arg == "-v" || arg == "-version") {
|
||||
cout << "QupZilla v" << QupZilla::VERSION.toAscii().data()
|
||||
<< "(build " << QupZilla::BUILDTIME.toAscii().data() << ")"
|
||||
<< endl;
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (arg.startsWith("-p=") || arg.startsWith("-profile=")) {
|
||||
arg.remove("-p=");
|
||||
arg.remove("-profile=");
|
||||
found = true;
|
||||
cout << "starting with profile " << arg.toAscii().data() << endl;
|
||||
m_actionString = arg;
|
||||
m_action = StartWithProfile;
|
||||
}
|
||||
|
||||
if (arg.startsWith("-np") || arg.startsWith("-no-plugins")) {
|
||||
found = true;
|
||||
m_action = StartWithoutAddons;
|
||||
}
|
||||
}
|
||||
|
||||
QString url(m_argv[m_argc-1]);
|
||||
if (m_argc > 1 && !url.isEmpty() && !url.startsWith("-")) {
|
||||
found = true;
|
||||
cout << "starting with url " << url.toAscii().data() << endl;
|
||||
m_actionString = url;
|
||||
m_action = OpenUrl;
|
||||
}
|
||||
|
||||
if (m_argc > 1 && !found) {
|
||||
cout << "bad arguments!" << endl;
|
||||
showHelp();
|
||||
}
|
||||
|
||||
}
|
||||
CommandLineOptions::Action CommandLineOptions::getAction()
|
||||
{
|
||||
return m_action;
|
||||
}
|
||||
|
||||
QString CommandLineOptions::getActionString()
|
||||
{
|
||||
return m_actionString;
|
||||
}
|
||||
|
||||
|
31
src/app/commandlineoptions.h
Normal file
@ -0,0 +1,31 @@
|
||||
#ifndef COMMANDLINEOPTIONS_H
|
||||
#define COMMANDLINEOPTIONS_H
|
||||
|
||||
#if defined(QT_NO_DEBUG) & !defined(QT_NO_DEBUG_OUTPUT)
|
||||
#define QT_NO_DEBUG_OUTPUT
|
||||
#endif
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
class CommandLineOptions : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum Action {NoAction, OpenUrl, StartWithProfile, StartWithoutAddons};
|
||||
explicit CommandLineOptions(int &argc, char **argv);
|
||||
Action getAction();
|
||||
QString getActionString();
|
||||
|
||||
private:
|
||||
void showHelp();
|
||||
void parseActions();
|
||||
|
||||
QString m_actionString;
|
||||
int m_argc;
|
||||
char **m_argv;
|
||||
Action m_action;
|
||||
};
|
||||
|
||||
#endif // COMMANDLINEOPTIONS_H
|
555
src/app/mainapplication.cpp
Normal file
@ -0,0 +1,555 @@
|
||||
#include "mainapplication.h"
|
||||
#include "qupzilla.h"
|
||||
#include "tabwidget.h"
|
||||
#include "bookmarkstoolbar.h"
|
||||
#include "bookmarksmanager.h"
|
||||
#include "cookiemanager.h"
|
||||
#include "cookiejar.h"
|
||||
#include "historymanager.h"
|
||||
#include "historymodel.h"
|
||||
#include "networkmanager.h"
|
||||
#include "rssmanager.h"
|
||||
#include "updater.h"
|
||||
#include "autosaver.h"
|
||||
#include "commandlineoptions.h"
|
||||
#include "pluginproxy.h"
|
||||
#include "bookmarksmodel.h"
|
||||
#include "downloadmanager.h"
|
||||
#include "autofillmodel.h"
|
||||
|
||||
MainApplication::MainApplication(int &argc, char **argv)
|
||||
: QtSingleApplication("qupzillaMainApp", argc, argv)
|
||||
,m_bookmarksmanager(0)
|
||||
,m_cookiemanager(0)
|
||||
,m_historymanager(0)
|
||||
,m_historymodel(0)
|
||||
,m_websettings(0)
|
||||
,m_networkmanager(0)
|
||||
,m_cookiejar(0)
|
||||
,m_rssmanager(0)
|
||||
,m_plugins(0)
|
||||
,m_bookmarksModel(0)
|
||||
,m_downloadManager(0)
|
||||
,m_autofill(0)
|
||||
,m_isClosing(false)
|
||||
,m_isChanged(false)
|
||||
,m_isExited(false)
|
||||
{
|
||||
#if defined(Q_WS_X11) & !defined(DEVELOPING)
|
||||
DATADIR = "/usr/share/qupzilla/";
|
||||
#else
|
||||
DATADIR = qApp->applicationDirPath()+"/";
|
||||
#endif
|
||||
setOverrideCursor(Qt::WaitCursor);
|
||||
setWindowIcon(QIcon(":/icons/qupzilla.png"));
|
||||
bool noAddons = false;
|
||||
QUrl startUrl("");
|
||||
QString message;
|
||||
if (argc > 1) {
|
||||
CommandLineOptions cmd(argc, argv);
|
||||
switch (cmd.getAction()) {
|
||||
case CommandLineOptions::StartWithoutAddons:
|
||||
noAddons = true;
|
||||
break;
|
||||
case CommandLineOptions::OpenUrl:
|
||||
startUrl = QUrl(cmd.getActionString());
|
||||
message = "URL:"+startUrl.toString();
|
||||
break;
|
||||
default:
|
||||
m_isExited = true;
|
||||
return;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isRunning()) {
|
||||
sendMessage(message);
|
||||
m_isExited = true;
|
||||
return;
|
||||
}
|
||||
|
||||
connect(this, SIGNAL(messageReceived(QString)), this, SLOT(receiveAppMessage(QString)));
|
||||
|
||||
setQuitOnLastWindowClosed(true);
|
||||
setApplicationName("QupZilla");
|
||||
setApplicationVersion(QupZilla::VERSION);
|
||||
setOrganizationDomain("qupzilla");
|
||||
|
||||
QString homePath = QDir::homePath();
|
||||
homePath+="/.qupzilla/";
|
||||
|
||||
checkProfileDir();
|
||||
|
||||
QSettings::setDefaultFormat(QSettings::IniFormat);
|
||||
QSettings settings(homePath+"profiles/profiles.ini", QSettings::IniFormat);
|
||||
if (settings.value("Profiles/startProfile","default").toString().contains("/"))
|
||||
m_activeProfil=homePath+"profiles/default/";
|
||||
else
|
||||
m_activeProfil=homePath+"profiles/"+settings.value("Profiles/startProfile","default").toString()+"/";
|
||||
if (!QDir(m_activeProfil).exists())
|
||||
m_activeProfil=homePath+"profiles/default/";
|
||||
|
||||
QSettings settings2(m_activeProfil+"settings.ini", QSettings::IniFormat);
|
||||
settings2.beginGroup("SessionRestore");
|
||||
if (settings2.value("isRunning",false).toBool() )
|
||||
settings2.setValue("isCrashed", true);
|
||||
settings2.setValue("isRunning", true);
|
||||
settings2.endGroup();
|
||||
|
||||
QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, m_activeProfil);
|
||||
|
||||
translateApp();
|
||||
connectDatabase();
|
||||
|
||||
QupZilla* qupzilla = new QupZilla(true, startUrl);
|
||||
m_mainWindows.append(qupzilla);
|
||||
connect(qupzilla, SIGNAL(message(MainApplication::MessageType,bool)), this, SLOT(sendMessages(MainApplication::MessageType,bool)));
|
||||
qupzilla->show();
|
||||
|
||||
AutoSaver* saver = new AutoSaver();
|
||||
connect(saver, SIGNAL(saveApp()), this, SLOT(saveStateSlot()));
|
||||
m_updater = new Updater(qupzilla);
|
||||
|
||||
if (noAddons) {
|
||||
settings2.setValue("Plugin-Settings/AllowedPlugins",QStringList());
|
||||
settings2.setValue("Plugin-Settings/EnablePlugins",false);
|
||||
}
|
||||
|
||||
networkManager()->loadCertExceptions();
|
||||
plugins()->loadPlugins();
|
||||
loadSettings();
|
||||
}
|
||||
|
||||
void MainApplication::loadSettings()
|
||||
{
|
||||
QSettings settings(m_activeProfil+"settings.ini", QSettings::IniFormat);
|
||||
webSettings();
|
||||
//Web browsing settings
|
||||
settings.beginGroup("Web-Browser-Settings");
|
||||
bool allowFlash = settings.value("allowFlash",true).toBool();
|
||||
bool allowJavaScript = settings.value("allowJavaScript",true).toBool();
|
||||
bool allowJavaScriptOpenWindow = settings.value("allowJavaScriptOpenWindow",false).toBool();
|
||||
bool allowJava = settings.value("allowJava",true).toBool();
|
||||
bool allowPersistentStorage = settings.value("allowPersistentStorage",true).toBool();
|
||||
bool allowImages = settings.value("autoLoadImages",true).toBool();
|
||||
bool dnsPrefetch = settings.value("DNS-Prefetch", false).toBool();
|
||||
bool jsClipboard = settings.value("JavaScriptCanAccessClipboard", true).toBool();
|
||||
bool linkInFocuschain = settings.value("IncludeLinkInFocusChain", false).toBool();
|
||||
bool zoomTextOnly = settings.value("zoomTextOnly", false).toBool();
|
||||
bool printElBg = settings.value("PrintElementBackground", true).toBool();
|
||||
int maxCachedPages = settings.value("maximumCachedPages",3).toInt();
|
||||
int scrollingLines = settings.value("wheelScrollLines", wheelScrollLines()).toInt();
|
||||
settings.endGroup();
|
||||
|
||||
m_websettings->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
|
||||
m_websettings->setAttribute(QWebSettings::PluginsEnabled, allowFlash);
|
||||
m_websettings->setAttribute(QWebSettings::JavascriptEnabled, allowJavaScript);
|
||||
m_websettings->setAttribute(QWebSettings::JavascriptCanOpenWindows, allowJavaScriptOpenWindow);
|
||||
m_websettings->setAttribute(QWebSettings::JavaEnabled, allowJava);
|
||||
m_websettings->setAttribute(QWebSettings::AutoLoadImages, allowImages);
|
||||
m_websettings->setAttribute(QWebSettings::DnsPrefetchEnabled, dnsPrefetch);
|
||||
m_websettings->setAttribute(QWebSettings::JavascriptCanAccessClipboard, jsClipboard);
|
||||
m_websettings->setAttribute(QWebSettings::LinksIncludedInFocusChain, linkInFocuschain);
|
||||
m_websettings->setAttribute(QWebSettings::ZoomTextOnly, zoomTextOnly);
|
||||
m_websettings->setAttribute(QWebSettings::PrintElementBackgrounds, printElBg);
|
||||
|
||||
if (allowPersistentStorage) m_websettings->enablePersistentStorage(m_activeProfil);
|
||||
m_websettings->setMaximumPagesInCache(maxCachedPages);
|
||||
|
||||
setWheelScrollLines(scrollingLines);
|
||||
}
|
||||
|
||||
QupZilla* MainApplication::getWindow()
|
||||
{
|
||||
QupZilla *active = qobject_cast<QupZilla*>(QApplication::activeWindow());
|
||||
if (active)
|
||||
return active;
|
||||
|
||||
for(int i=0; i<m_mainWindows.count(); i++) {
|
||||
if (!m_mainWindows.at(i))
|
||||
continue;
|
||||
return m_mainWindows.at(i);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool MainApplication::isChanged()
|
||||
{
|
||||
if (m_isChanged) {
|
||||
m_isChanged = false;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void MainApplication::sendMessages(MainApplication::MessageType mes, bool state)
|
||||
{
|
||||
qDebug() << mes << state;
|
||||
emit message(mes, state);
|
||||
}
|
||||
|
||||
void MainApplication::receiveAppMessage(QString message)
|
||||
{
|
||||
if (message.startsWith("URL:")) {
|
||||
QString url(message.remove("URL:"));
|
||||
addNewTab(WebView::guessUrlFromString(url));
|
||||
}
|
||||
|
||||
QupZilla* actWin = getWindow();
|
||||
if (!actWin) { // It can only occur if download manager window was still open
|
||||
makeNewWindow(true);
|
||||
return;
|
||||
}
|
||||
actWin->setWindowState(actWin->windowState() & ~Qt::WindowMinimized);
|
||||
actWin->raise();
|
||||
actWin->activateWindow();
|
||||
actWin->setFocus();
|
||||
}
|
||||
|
||||
void MainApplication::addNewTab(QUrl url)
|
||||
{
|
||||
if (!getWindow())
|
||||
return;
|
||||
getWindow()->tabWidget()->addView(url);
|
||||
}
|
||||
|
||||
void MainApplication::makeNewWindow(bool tryRestore, const QUrl &startUrl)
|
||||
{
|
||||
QupZilla* newWindow = new QupZilla(tryRestore, startUrl);
|
||||
newWindow->show();
|
||||
connect(newWindow, SIGNAL(message(MainApplication::MessageType,bool)), this, SLOT(sendMessages(MainApplication::MessageType,bool)));
|
||||
m_mainWindows.append(newWindow);
|
||||
}
|
||||
|
||||
void MainApplication::connectDatabase()
|
||||
{
|
||||
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
|
||||
db.setDatabaseName(m_activeProfil+"browsedata.db");
|
||||
if (!QFile::exists(m_activeProfil+"browsedata.db")) {
|
||||
QFile(DATADIR+"data/default/profiles/default/browsedata.db").copy(m_activeProfil+"browsedata.db");
|
||||
qWarning("Cannot find SQLite database file! Copying and using the defaults!");
|
||||
}
|
||||
if (!db.open())
|
||||
qWarning("Cannot open SQLite database! Continuing without database....");
|
||||
|
||||
}
|
||||
|
||||
void MainApplication::translateApp()
|
||||
{
|
||||
QLocale locale;
|
||||
QSettings settings(m_activeProfil+"settings.ini", QSettings::IniFormat);
|
||||
settings.beginGroup("Browser-Window-Settings");
|
||||
QString file = settings.value("language",locale.name()+".qm").toString();
|
||||
QString shortLoc = file.left(2);
|
||||
|
||||
if (file == "" || !QFile::exists(DATADIR+"locale/"+file) )
|
||||
return;
|
||||
|
||||
QTranslator* app = new QTranslator();
|
||||
app->load(DATADIR+"locale/"+file);
|
||||
QTranslator* sys = new QTranslator();
|
||||
|
||||
if (QFile::exists(DATADIR+"locale/qt_"+shortLoc+".qm"))
|
||||
sys->load(DATADIR+"locale/qt_"+shortLoc+".qm");
|
||||
|
||||
m_activeLanguage = file;
|
||||
|
||||
installTranslator(app);
|
||||
installTranslator(sys);
|
||||
}
|
||||
|
||||
void MainApplication::quitApplication()
|
||||
{
|
||||
if (m_downloadManager && !m_downloadManager->canClose()) {
|
||||
m_downloadManager->show();
|
||||
return;
|
||||
}
|
||||
|
||||
delete m_updater;
|
||||
m_isClosing = true;
|
||||
|
||||
if (m_mainWindows.count() > 0)
|
||||
saveStateSlot();
|
||||
|
||||
qDebug() << __FUNCTION__ << "called";
|
||||
QSettings settings(m_activeProfil+"settings.ini", QSettings::IniFormat);
|
||||
settings.beginGroup("SessionRestore");
|
||||
settings.setValue("isRunning",false);
|
||||
settings.setValue("isCrashed", false);
|
||||
settings.endGroup();
|
||||
|
||||
bool deleteCookies = settings.value("Web-Browser-Settings/deleteCookiesOnClose",false).toBool();
|
||||
bool deleteHistory = settings.value("Web-Browser-Settings/deleteHistoryOnClose",false).toBool();
|
||||
|
||||
if (deleteCookies)
|
||||
QFile::remove(m_activeProfil+"cookies.dat");
|
||||
if (deleteHistory) {
|
||||
QSqlQuery query;
|
||||
query.exec("DELETE FROM history");
|
||||
query.exec("VACUUM");
|
||||
}
|
||||
|
||||
cookieJar()->saveCookies();
|
||||
m_networkmanager->saveCertExceptions();
|
||||
m_plugins->c2f_saveSettings();
|
||||
|
||||
quit();
|
||||
}
|
||||
|
||||
BookmarksManager* MainApplication::bookmarksManager()
|
||||
{
|
||||
if (!m_bookmarksmanager)
|
||||
m_bookmarksmanager = new BookmarksManager(getWindow());
|
||||
return m_bookmarksmanager;
|
||||
}
|
||||
|
||||
PluginProxy* MainApplication::plugins()
|
||||
{
|
||||
if (!m_plugins)
|
||||
m_plugins = new PluginProxy();
|
||||
return m_plugins;
|
||||
}
|
||||
|
||||
CookieManager* MainApplication::cookieManager()
|
||||
{
|
||||
if (!m_cookiemanager)
|
||||
m_cookiemanager = new CookieManager();
|
||||
return m_cookiemanager;
|
||||
}
|
||||
|
||||
HistoryManager* MainApplication::historyManager()
|
||||
{
|
||||
if (!m_historymanager)
|
||||
m_historymanager = new HistoryManager(getWindow());
|
||||
return m_historymanager;
|
||||
}
|
||||
|
||||
HistoryModel* MainApplication::history()
|
||||
{
|
||||
if (!m_historymodel)
|
||||
m_historymodel = new HistoryModel(getWindow());
|
||||
return m_historymodel;
|
||||
}
|
||||
|
||||
QWebSettings* MainApplication::webSettings()
|
||||
{
|
||||
if (!m_websettings)
|
||||
m_websettings = QWebSettings::globalSettings();
|
||||
return m_websettings;
|
||||
}
|
||||
|
||||
NetworkManager* MainApplication::networkManager()
|
||||
{
|
||||
if (!m_networkmanager)
|
||||
m_networkmanager = new NetworkManager(getWindow());
|
||||
return m_networkmanager;
|
||||
}
|
||||
|
||||
CookieJar* MainApplication::cookieJar()
|
||||
{
|
||||
if (!m_cookiejar) {
|
||||
m_cookiejar = new CookieJar(getWindow());
|
||||
m_cookiejar->restoreCookies();
|
||||
}
|
||||
return m_cookiejar;
|
||||
}
|
||||
|
||||
RSSManager* MainApplication::rssManager()
|
||||
{
|
||||
if (!m_rssmanager)
|
||||
m_rssmanager = new RSSManager(getWindow());
|
||||
return m_rssmanager;
|
||||
}
|
||||
|
||||
BookmarksModel* MainApplication::bookmarks()
|
||||
{
|
||||
if (!m_bookmarksModel)
|
||||
m_bookmarksModel = new BookmarksModel();
|
||||
return m_bookmarksModel;
|
||||
}
|
||||
|
||||
DownloadManager* MainApplication::downManager()
|
||||
{
|
||||
if (!m_downloadManager)
|
||||
m_downloadManager = new DownloadManager();
|
||||
return m_downloadManager;
|
||||
}
|
||||
|
||||
AutoFillModel* MainApplication::autoFill()
|
||||
{
|
||||
if (!m_autofill)
|
||||
m_autofill = new AutoFillModel(getWindow());
|
||||
return m_autofill;
|
||||
}
|
||||
|
||||
void MainApplication::aboutToCloseWindow(QupZilla *window)
|
||||
{
|
||||
if (!window)
|
||||
return;
|
||||
|
||||
m_mainWindows.removeOne(window);
|
||||
if (m_mainWindows.count() == 0 )
|
||||
quitApplication();
|
||||
}
|
||||
|
||||
//Version of sessin.dat file
|
||||
static const int sessionVersion = 0x0002;
|
||||
|
||||
bool MainApplication::saveStateSlot()
|
||||
{
|
||||
if (m_websettings->testAttribute(QWebSettings::PrivateBrowsingEnabled))
|
||||
return false;
|
||||
|
||||
qDebug() << "Saving state";
|
||||
|
||||
QSettings settings(m_activeProfil+"settings.ini", QSettings::IniFormat);
|
||||
settings.beginGroup("SessionRestore");
|
||||
settings.setValue("restoreSession",false);
|
||||
|
||||
QFile file(m_activeProfil+"session.dat");
|
||||
file.open(QIODevice::WriteOnly);
|
||||
QDataStream stream(&file);
|
||||
|
||||
stream << sessionVersion;
|
||||
stream << m_mainWindows.count();
|
||||
for (int i = 0; i < m_mainWindows.count(); i++) {
|
||||
stream << m_mainWindows.at(i)->tabWidget()->saveState();
|
||||
stream << m_mainWindows.at(i)->saveState();
|
||||
}
|
||||
file.close();
|
||||
|
||||
settings.setValue("restoreSession",true);
|
||||
settings.endGroup();
|
||||
|
||||
QupZilla* qupzilla_ = getWindow();
|
||||
if (qupzilla_) {
|
||||
settings.setValue("Browser-View-Settings/showBookmarksToolbar",qupzilla_->bookmarksToolbar()->isVisible());
|
||||
settings.setValue("Browser-View-Settings/showNavigationToolbar",qupzilla_->navigationToolbar()->isVisible());
|
||||
settings.setValue("Browser-View-Settings/showStatusbar",qupzilla_->statusBar()->isVisible());
|
||||
settings.setValue("Browser-View-Settings/showMenubar",qupzilla_->menuBar()->isVisible());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MainApplication::restoreStateSlot(QupZilla *window)
|
||||
{
|
||||
QSettings settings(m_activeProfil+"settings.ini", QSettings::IniFormat);
|
||||
settings.beginGroup("SessionRestore");
|
||||
if (!settings.value("restoreSession",false).toBool())
|
||||
return false;
|
||||
if (settings.value("isCrashed",false).toBool()) {
|
||||
QMessageBox::StandardButton button = QMessageBox::warning(window, tr("Last session crashed"),
|
||||
tr("<b>QupZilla crashed :-(</b><br/>Oops, last session of QupZilla ends with its crash. We are very sorry. Would you try to restore saved state?"),
|
||||
QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
|
||||
if (button != QMessageBox::Yes)
|
||||
return false;
|
||||
}
|
||||
if (!QFile::exists(m_activeProfil+"session.dat"))
|
||||
return false;
|
||||
|
||||
settings.setValue("isCrashed",false);
|
||||
QFile file(m_activeProfil+"session.dat");
|
||||
file.open(QIODevice::ReadOnly);
|
||||
QDataStream stream(&file);
|
||||
|
||||
QByteArray tabState;
|
||||
QByteArray qMainWindowState;
|
||||
int version;
|
||||
int windowCount;
|
||||
|
||||
stream >> version;
|
||||
if (version != sessionVersion)
|
||||
return false;
|
||||
stream >> windowCount;
|
||||
stream >> tabState;
|
||||
stream >> qMainWindowState;
|
||||
|
||||
file.close();
|
||||
|
||||
window->tabWidget()->restoreState(tabState);
|
||||
window->restoreState(qMainWindowState);
|
||||
|
||||
settings.endGroup();
|
||||
|
||||
if (windowCount > 1) {
|
||||
for (int i = 0; i<(windowCount-1); i++) {
|
||||
stream >> tabState;
|
||||
stream >> qMainWindowState;
|
||||
|
||||
QupZilla* window = new QupZilla(false);
|
||||
m_mainWindows.append(window);
|
||||
connect(window, SIGNAL(message(MainApplication::MessageType,bool)), this, SLOT(sendMessages(MainApplication::MessageType,bool)));
|
||||
QEventLoop eLoop;
|
||||
connect(window, SIGNAL(startingCompleted()), &eLoop, SLOT(quit()));
|
||||
eLoop.exec();
|
||||
|
||||
window->tabWidget()->restoreState(tabState);
|
||||
window->restoreState(qMainWindowState);
|
||||
window->tabWidget()->closeTab(0);
|
||||
window->show();
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MainApplication::checkProfileDir()
|
||||
{
|
||||
/*
|
||||
$HOMEDIR
|
||||
|
|
||||
.qupzilla/
|
||||
|
|
||||
profiles/-----------
|
||||
| |
|
||||
default/ profiles.ini
|
||||
|
|
||||
browsedata.db
|
||||
*/
|
||||
QString homePath = QDir::homePath();
|
||||
homePath+="/.qupzilla/";
|
||||
|
||||
if (QDir(homePath).exists()) {
|
||||
QFile versionFile(homePath+"version");
|
||||
versionFile.open(QFile::ReadOnly);
|
||||
if (versionFile.readAll().contains(QupZilla::VERSION.toAscii())) {
|
||||
versionFile.close();
|
||||
return true;
|
||||
}
|
||||
versionFile.close();
|
||||
#ifdef DEVELOPING
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
std::cout << "Creating new profile directory" << std::endl;
|
||||
|
||||
QDir dir = QDir::home();
|
||||
dir.mkdir(".qupzilla");
|
||||
dir.cd(".qupzilla");
|
||||
|
||||
//.qupzilla
|
||||
QFile(homePath+"version").remove();
|
||||
QFile versionFile(homePath+"version");
|
||||
versionFile.open(QFile::WriteOnly);
|
||||
versionFile.write(QupZilla::VERSION.toAscii());
|
||||
versionFile.close();
|
||||
|
||||
dir.mkdir("profiles");
|
||||
dir.cd("profiles");
|
||||
|
||||
//.qupzilla/profiles
|
||||
QFile(homePath+"profiles/profiles.ini").remove();
|
||||
QFile(DATADIR+"data/default/profiles/profiles.ini").copy(homePath+"profiles/profiles.ini");
|
||||
|
||||
dir.mkdir("default");
|
||||
dir.cd("default");
|
||||
|
||||
//.qupzilla/profiles/default
|
||||
QFile(homePath+"profiles/default/browsedata.db").remove();
|
||||
QFile(DATADIR+"data/default/profiles/default/browsedata.db").copy(homePath+"profiles/default/browsedata.db");
|
||||
QFile(homePath+"profiles/default/background.png").remove();
|
||||
QFile(DATADIR+"data/default/profiles/default/background.png").copy(homePath+"profiles/default/background.png");
|
||||
|
||||
return dir.isReadable();
|
||||
}
|
108
src/app/mainapplication.h
Normal file
@ -0,0 +1,108 @@
|
||||
#ifndef MAINAPPLICATION_H
|
||||
#define MAINAPPLICATION_H
|
||||
|
||||
#if defined(QT_NO_DEBUG) & !defined(QT_NO_DEBUG_OUTPUT)
|
||||
#define QT_NO_DEBUG_OUTPUT
|
||||
#endif
|
||||
|
||||
#include <QToolBar>
|
||||
#include <QWebSettings>
|
||||
#include <QUrl>
|
||||
#include <QPointer>
|
||||
#include <iostream>
|
||||
|
||||
#include "qtsingleapplication.h"
|
||||
|
||||
class QupZilla;
|
||||
class BookmarksManager;
|
||||
class CookieManager;
|
||||
class HistoryManager;
|
||||
class HistoryModel;
|
||||
class NetworkManager;
|
||||
class CookieJar;
|
||||
class RSSManager;
|
||||
class Updater;
|
||||
class PluginProxy;
|
||||
class BookmarksModel;
|
||||
class DownloadManager;
|
||||
class AutoFillModel;
|
||||
|
||||
class MainApplication : public QtSingleApplication
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QString DATADIR;
|
||||
explicit MainApplication(int &argc, char **argv);
|
||||
|
||||
enum MessageType{ ShowFlashIcon, CheckPrivateBrowsing };
|
||||
|
||||
void loadSettings();
|
||||
bool restoreStateSlot(QupZilla* window);
|
||||
void makeNewWindow(bool tryRestore, const QUrl &startUrl=QUrl());
|
||||
void addNewTab(QUrl url);
|
||||
void aboutToCloseWindow(QupZilla* window);
|
||||
bool isChanged();
|
||||
|
||||
inline static MainApplication* getInstance() { return static_cast<MainApplication*>(QCoreApplication::instance()); }
|
||||
inline QString getActiveProfil() { return m_activeProfil; }
|
||||
inline QString getActiveLanguage() { return m_activeLanguage; }
|
||||
inline bool isClosing() { return m_isClosing; }
|
||||
inline bool isExited() { return m_isExited; }
|
||||
|
||||
bool checkProfileDir();
|
||||
|
||||
QupZilla* getWindow();
|
||||
BookmarksManager* bookmarksManager();
|
||||
CookieManager* cookieManager();
|
||||
HistoryManager* historyManager();
|
||||
HistoryModel* history();
|
||||
QWebSettings* webSettings();
|
||||
NetworkManager* networkManager();
|
||||
CookieJar* cookieJar();
|
||||
RSSManager* rssManager();
|
||||
PluginProxy* plugins();
|
||||
BookmarksModel* bookmarks();
|
||||
DownloadManager* downManager();
|
||||
AutoFillModel* autoFill();
|
||||
|
||||
public slots:
|
||||
bool saveStateSlot();
|
||||
void quitApplication();
|
||||
void sendMessages(MainApplication::MessageType mes, bool state);
|
||||
void receiveAppMessage(QString message);
|
||||
inline void setChanged() { m_isChanged = true; }
|
||||
|
||||
signals:
|
||||
void message(MainApplication::MessageType mes, bool state);
|
||||
|
||||
private:
|
||||
void connectDatabase();
|
||||
void translateApp();
|
||||
void restoreOtherWindows();
|
||||
|
||||
BookmarksManager* m_bookmarksmanager;
|
||||
CookieManager* m_cookiemanager;
|
||||
HistoryManager* m_historymanager;
|
||||
HistoryModel* m_historymodel;
|
||||
QWebSettings* m_websettings;
|
||||
NetworkManager* m_networkmanager;
|
||||
CookieJar* m_cookiejar;
|
||||
RSSManager* m_rssmanager;
|
||||
Updater* m_updater;
|
||||
PluginProxy* m_plugins;
|
||||
BookmarksModel* m_bookmarksModel;
|
||||
DownloadManager* m_downloadManager;
|
||||
AutoFillModel* m_autofill;
|
||||
|
||||
QList<QPointer<QupZilla> > m_mainWindows;
|
||||
|
||||
QString m_activeProfil;
|
||||
QString m_activeLanguage;
|
||||
|
||||
bool m_isClosing;
|
||||
bool m_isChanged;
|
||||
bool m_isExited;
|
||||
};
|
||||
|
||||
#endif // MAINAPPLICATION_H
|
703
src/app/qupzilla.cpp
Normal file
@ -0,0 +1,703 @@
|
||||
#include "qupzilla.h"
|
||||
#include "tabwidget.h"
|
||||
#include "tabbar.h"
|
||||
#include "webpage.h"
|
||||
#include "webview.h"
|
||||
#include "lineedit.h"
|
||||
#include "historymodel.h"
|
||||
#include "locationbar.h"
|
||||
#include "searchtoolbar.h"
|
||||
#include "websearchbar.h"
|
||||
#include "downloadmanager.h"
|
||||
#include "cookiejar.h"
|
||||
#include "cookiemanager.h"
|
||||
#include "historymanager.h"
|
||||
#include "bookmarksmanager.h"
|
||||
#include "bookmarkstoolbar.h"
|
||||
#include "clearprivatedata.h"
|
||||
#include "sourceviewer.h"
|
||||
#include "siteinfo.h"
|
||||
#include "preferences.h"
|
||||
#include "networkmanager.h"
|
||||
#include "autofillmodel.h"
|
||||
#include "networkmanagerproxy.h"
|
||||
#include "rssmanager.h"
|
||||
#include "mainapplication.h"
|
||||
#include "aboutdialog.h"
|
||||
#include "pluginproxy.h"
|
||||
#include "qtwin.h"
|
||||
|
||||
const QString QupZilla::VERSION="0.9.7";
|
||||
const QString QupZilla::BUILDTIME="03/05/2011 14:48";
|
||||
const QString QupZilla::AUTHOR="nowrep";
|
||||
const QString QupZilla::COPYRIGHT="2010-2011";
|
||||
const QString QupZilla::WWWADDRESS="http://qupzilla.ic.cz";
|
||||
const QString QupZilla::WEBKITVERSION=qWebKitVersion();
|
||||
|
||||
QupZilla::QupZilla(bool tryRestore, QUrl startUrl) :
|
||||
QMainWindow()
|
||||
,p_mainApp(MainApplication::getInstance())
|
||||
,m_tryRestore(tryRestore)
|
||||
,m_startingUrl(startUrl)
|
||||
,m_actionPrivateBrowsing(0)
|
||||
,m_webInspectorDock(0)
|
||||
,m_webSearchToolbar(0)
|
||||
{
|
||||
this->resize(640,480);
|
||||
this->setWindowState(Qt::WindowMaximized);
|
||||
this->setWindowTitle("QupZilla");
|
||||
setUpdatesEnabled(false);
|
||||
|
||||
m_activeProfil = p_mainApp->getActiveProfil();
|
||||
m_activeLanguage = p_mainApp->getActiveLanguage();
|
||||
|
||||
QDesktopServices::setUrlHandler("http", this, "loadAddress");
|
||||
|
||||
setupUi();
|
||||
setupMenu();
|
||||
QTimer::singleShot(0, this, SLOT(postLaunch()));
|
||||
connect(p_mainApp, SIGNAL(message(MainApplication::MessageType,bool)), this, SLOT(receiveMessage(MainApplication::MessageType,bool)));
|
||||
}
|
||||
|
||||
void QupZilla::loadSettings()
|
||||
{
|
||||
QSettings settings(m_activeProfil+"settings.ini", QSettings::IniFormat);
|
||||
|
||||
//Url settings
|
||||
settings.beginGroup("Web-URL-Settings");
|
||||
m_homepage = settings.value("homepage","http://qupzilla.ic.cz/search/").toUrl();
|
||||
m_newtab = settings.value("newTabUrl","").toUrl();
|
||||
settings.endGroup();
|
||||
|
||||
QWebSettings* websettings=p_mainApp->webSettings();
|
||||
websettings->setAttribute(QWebSettings::JavascriptCanAccessClipboard, true);
|
||||
//Web browsing settings
|
||||
settings.beginGroup("Web-Browser-Settings");
|
||||
bool allowFlash = settings.value("allowFlash",true).toBool();
|
||||
settings.endGroup();
|
||||
m_allowFlashIcon->setVisible(allowFlash);
|
||||
|
||||
//Browser Window settings
|
||||
settings.beginGroup("Browser-View-Settings");
|
||||
m_menuTextColor = settings.value("menuTextColor", QColor(Qt::black)).value<QColor>();
|
||||
setBackground(m_menuTextColor);
|
||||
m_bookmarksToolbar->setColor(m_menuTextColor);
|
||||
m_ipLabel->setStyleSheet("QLabel {color: "+m_menuTextColor.name()+";}");
|
||||
bool showStatusBar = settings.value("showStatusBar",true).toBool();
|
||||
bool showHomeIcon = settings.value("showHomeButton",true).toBool();
|
||||
bool showBackForwardIcons = settings.value("showBackForwardButtons",true).toBool();
|
||||
bool showBookmarksToolbar = settings.value("showBookmarksToolbar",true).toBool();
|
||||
bool showNavigationToolbar = settings.value("showNavigationToolbar",true).toBool();
|
||||
bool showMenuBar = settings.value("showMenubar",true).toBool();
|
||||
bool makeTransparent = settings.value("useTransparentBackground",false).toBool();
|
||||
settings.endGroup();
|
||||
|
||||
statusBar()->setVisible(showStatusBar);
|
||||
m_actionShowStatusbar->setChecked(showStatusBar);
|
||||
|
||||
m_bookmarksToolbar->setVisible(showBookmarksToolbar);
|
||||
m_actionShowBookmarksToolbar->setChecked(showBookmarksToolbar);
|
||||
|
||||
m_navigation->setVisible(showNavigationToolbar);
|
||||
m_actionShowToolbar->setChecked(showNavigationToolbar);
|
||||
|
||||
m_actionShowMenubar->setChecked(showMenuBar);
|
||||
menuBar()->setVisible(showMenuBar);
|
||||
m_navigation->actions().at(m_navigation->actions().count()-2)->setVisible(!showMenuBar);
|
||||
|
||||
m_buttonHome->setVisible(showHomeIcon);
|
||||
m_buttonBack->setVisible(showBackForwardIcons);
|
||||
m_buttonNext->setVisible(showBackForwardIcons);
|
||||
|
||||
//Private browsing
|
||||
m_actionPrivateBrowsing->setChecked( p_mainApp->webSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled) );
|
||||
m_privateBrowsing->setVisible( p_mainApp->webSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled) );
|
||||
|
||||
if (!makeTransparent)
|
||||
return;
|
||||
//Opacity
|
||||
#ifdef Q_WS_X11
|
||||
setAttribute(Qt::WA_TranslucentBackground);
|
||||
setAttribute(Qt::WA_NoSystemBackground, false);
|
||||
QPalette pal = palette();
|
||||
QColor bg = pal.window().color();
|
||||
bg.setAlpha(180);
|
||||
pal.setColor(QPalette::Window, bg);
|
||||
setPalette(pal);
|
||||
ensurePolished(); // workaround Oxygen filling the background
|
||||
setAttribute(Qt::WA_StyledBackground, false);
|
||||
#endif
|
||||
if (QtWin::isCompositionEnabled()) {
|
||||
QtWin::extendFrameIntoClientArea(this);
|
||||
setContentsMargins(0, 0, 0, 0);
|
||||
}
|
||||
setWindowIcon(QIcon(":/icons/qupzilla.png"));
|
||||
}
|
||||
|
||||
void QupZilla::receiveMessage(MainApplication::MessageType mes, bool state)
|
||||
{
|
||||
switch (mes) {
|
||||
case MainApplication::ShowFlashIcon:
|
||||
m_allowFlashIcon->setVisible(state);
|
||||
break;
|
||||
|
||||
case MainApplication::CheckPrivateBrowsing:
|
||||
m_privateBrowsing->setVisible(state);
|
||||
m_actionPrivateBrowsing->setChecked(state);
|
||||
break;
|
||||
|
||||
default:
|
||||
qWarning() << "Unresolved message sent!";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void QupZilla::refreshHistory(int index)
|
||||
{
|
||||
QWebHistory* history;
|
||||
if (index == -1)
|
||||
history = weView()->page()->history();
|
||||
else
|
||||
history = weView()->page()->history();
|
||||
|
||||
if (history->canGoBack()) {
|
||||
m_buttonBack->setEnabled(true);
|
||||
}else{
|
||||
m_buttonBack->setEnabled(false);
|
||||
}
|
||||
|
||||
if (history->canGoForward()) {
|
||||
m_buttonNext->setEnabled(true);
|
||||
}else{
|
||||
m_buttonNext->setEnabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
void QupZilla::goAtHistoryIndex()
|
||||
{
|
||||
if (QAction *action = qobject_cast<QAction*>(sender())) {
|
||||
weView()->page()->history()->goToItem(weView()->page()->history()->itemAt(action->data().toInt()));
|
||||
}
|
||||
refreshHistory();
|
||||
}
|
||||
|
||||
void QupZilla::aboutToShowHistoryBackMenu()
|
||||
{
|
||||
if (!m_menuBack || !weView())
|
||||
return;
|
||||
m_menuBack->clear();
|
||||
QWebHistory* history = weView()->history();
|
||||
int curindex = history->currentItemIndex();
|
||||
for (int i = curindex-1;i>=0;i--) {
|
||||
QWebHistoryItem item = history->itemAt(i);
|
||||
if (item.isValid()) {
|
||||
QString title = item.title();
|
||||
if (title.length()>40) {
|
||||
title.truncate(40);
|
||||
title+="..";
|
||||
}
|
||||
QAction* action = m_menuBack->addAction(m_locationBar->icon(item.url()),title, this, SLOT(goAtHistoryIndex()));
|
||||
action->setData(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QupZilla::aboutToShowHistoryNextMenu()
|
||||
{
|
||||
if (!m_menuForward || !weView())
|
||||
return;
|
||||
m_menuForward->clear();
|
||||
QWebHistory* history = weView()->history();
|
||||
int curindex = history->currentItemIndex();
|
||||
for (int i = curindex+1;i<history->count();i++) {
|
||||
QWebHistoryItem item = history->itemAt(i);
|
||||
if (item.isValid()) {
|
||||
QString title = item.title();
|
||||
if (title.length()>40) {
|
||||
title.truncate(40);
|
||||
title+="..";
|
||||
}
|
||||
QAction* action = m_menuForward->addAction(m_locationBar->icon(item.url()),title, this, SLOT(goAtHistoryIndex()));
|
||||
action->setData(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QupZilla::aboutToShowBookmarksMenu()
|
||||
{
|
||||
m_menuBookmarks->clear();
|
||||
m_menuBookmarks->addAction(tr("Bookmark This Page"), this, SLOT(bookmarkPage()))->setShortcut(QKeySequence("Ctrl+D"));
|
||||
m_menuBookmarks->addAction(tr("Bookmark All Tabs"), this, SLOT(bookmarkAllTabs()));
|
||||
m_menuBookmarks->addAction(QIcon::fromTheme("user-bookmarks"), tr("Organize Bookmarks"), this, SLOT(showBookmarksManager()))->setShortcut(QKeySequence("Ctrl+Shift+O"));
|
||||
m_menuBookmarks->addSeparator();
|
||||
if (m_tabWidget->count() == 1)
|
||||
m_menuBookmarks->actions().at(1)->setEnabled(false);
|
||||
QSqlQuery query;
|
||||
query.exec("SELECT title, url FROM bookmarks WHERE folder='bookmarksMenu'");
|
||||
while(query.next()) {
|
||||
QUrl url = query.value(1).toUrl();
|
||||
QString title = query.value(0).toString();
|
||||
if (title.length()>40) {
|
||||
title.truncate(40);
|
||||
title+="..";
|
||||
}
|
||||
m_menuBookmarks->addAction(LocationBar::icon(url), title, this, SLOT(loadActionUrl()))->setData(url);
|
||||
}
|
||||
|
||||
QMenu* folderBookmarks = new QMenu(tr("Bookmarks In ToolBar"), m_menuBookmarks);
|
||||
folderBookmarks->setIcon(QIcon(style()->standardIcon(QStyle::SP_DirOpenIcon)));
|
||||
|
||||
query.exec("SELECT title, url FROM bookmarks WHERE folder='bookmarksToolbar'");
|
||||
while(query.next()) {
|
||||
QUrl url = query.value(1).toUrl();
|
||||
QString title = query.value(0).toString();
|
||||
if (title.length()>40) {
|
||||
title.truncate(40);
|
||||
title+="..";
|
||||
}
|
||||
folderBookmarks->addAction(LocationBar::icon(url), title, this, SLOT(loadActionUrl()))->setData(url);
|
||||
}
|
||||
if (folderBookmarks->isEmpty())
|
||||
folderBookmarks->addAction(tr("Empty"));
|
||||
m_menuBookmarks->addMenu(folderBookmarks);
|
||||
|
||||
query.exec("SELECT name FROM folders");
|
||||
while(query.next()) {
|
||||
QMenu* tempFolder = new QMenu(query.value(0).toString(), m_menuBookmarks);
|
||||
tempFolder->setIcon(QIcon(style()->standardIcon(QStyle::SP_DirOpenIcon)));
|
||||
|
||||
QSqlQuery query2;
|
||||
query2.exec("SELECT title, url FROM bookmarks WHERE folder='"+query.value(0).toString()+"'");
|
||||
while(query2.next()) {
|
||||
QUrl url = query2.value(1).toUrl();
|
||||
QString title = query2.value(0).toString();
|
||||
if (title.length()>40) {
|
||||
title.truncate(40);
|
||||
title+="..";
|
||||
}
|
||||
tempFolder->addAction(LocationBar::icon(url), title, this, SLOT(loadActionUrl()))->setData(url);
|
||||
}
|
||||
if (tempFolder->isEmpty())
|
||||
tempFolder->addAction(tr("Empty"));
|
||||
m_menuBookmarks->addMenu(tempFolder);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void QupZilla::aboutToShowHistoryMenu()
|
||||
{
|
||||
if (!weView())
|
||||
return;
|
||||
m_menuHistory->clear();
|
||||
m_menuHistory->addAction(
|
||||
#ifdef Q_WS_X11
|
||||
style()->standardIcon(QStyle::SP_ArrowBack)
|
||||
#else
|
||||
QIcon(":/icons/faenza/back.png")
|
||||
#endif
|
||||
, tr("Back"), this, SLOT(goBack()))->setShortcut(QKeySequence("Ctrl+Left"));
|
||||
m_menuHistory->addAction(
|
||||
#ifdef Q_WS_X11
|
||||
style()->standardIcon(QStyle::SP_ArrowForward)
|
||||
#else
|
||||
QIcon(":/icons/faenza/forward.png")
|
||||
#endif
|
||||
, tr("Forward"), this, SLOT(goNext()))->setShortcut(QKeySequence("Ctrl+Right"));
|
||||
m_menuHistory->addAction(
|
||||
#ifdef Q_WS_X11
|
||||
QIcon::fromTheme("go-home")
|
||||
#else
|
||||
QIcon(":/icons/faenza/home.png")
|
||||
#endif
|
||||
, tr("Home"), this, SLOT(goHome()))->setShortcut(QKeySequence("Alt+Home"));
|
||||
|
||||
if (!weView()->history()->canGoBack())
|
||||
m_menuHistory->actions().at(0)->setEnabled(false);
|
||||
if (!weView()->history()->canGoForward())
|
||||
m_menuHistory->actions().at(1)->setEnabled(false);
|
||||
|
||||
m_menuHistory->addAction(QIcon(":/icons/menu/history.png"), tr("Show All History"), this, SLOT(showHistoryManager()))->setShortcut(QKeySequence("Ctrl+H"));
|
||||
m_menuHistory->addSeparator();
|
||||
|
||||
QSqlQuery query;
|
||||
query.exec("SELECT title, url FROM history ORDER BY date DESC LIMIT 10");
|
||||
while(query.next()) {
|
||||
QUrl url = query.value(1).toUrl();
|
||||
QString title = query.value(0).toString();
|
||||
if (title.length()>40) {
|
||||
title.truncate(40);
|
||||
title+="..";
|
||||
}
|
||||
m_menuHistory->addAction(LocationBar::icon(url), title, this, SLOT(loadActionUrl()))->setData(url);
|
||||
}
|
||||
}
|
||||
|
||||
void QupZilla::aboutToShowHelpMenu()
|
||||
{
|
||||
m_menuHelp->clear();
|
||||
m_menuHelp->addAction(tr("Report Bug"), this, SLOT(reportBug()));
|
||||
m_menuHelp->addSeparator();
|
||||
p_mainApp->plugins()->populateHelpMenu(m_menuHelp);
|
||||
m_menuHelp->addAction(QIcon(":/icons/menu/qt.png"), tr("About Qt"), qApp, SLOT(aboutQt()));
|
||||
m_menuHelp->addAction(QIcon(":/icons/qupzilla.png"), tr("About QupZilla"), this, SLOT(aboutQupZilla()));
|
||||
}
|
||||
|
||||
void QupZilla::aboutToShowToolsMenu()
|
||||
{
|
||||
m_menuTools->clear();
|
||||
m_menuTools->addAction(tr("Web Search"), this, SLOT(webSearch()))->setShortcut(QKeySequence("Ctrl+K"));
|
||||
m_menuTools->addAction(QIcon::fromTheme("dialog-information"), tr("Page Info"), this, SLOT(showPageInfo()))->setShortcut(QKeySequence("Ctrl+I"));
|
||||
m_menuTools->addSeparator();
|
||||
m_menuTools->addAction(tr("Download Manager"), this, SLOT(showDownloadManager()))->setShortcut(QKeySequence("Ctrl+Y"));
|
||||
m_menuTools->addAction(tr("Cookies Manager"), this, SLOT(showCookieManager()));
|
||||
m_menuTools->addAction(QIcon(":/icons/menu/rss.png"), tr("RSS Reader"), this, SLOT(showRSSManager()));
|
||||
m_menuTools->addAction(QIcon::fromTheme("edit-clear"), tr("Clear Recent History"), this, SLOT(showClearPrivateData()));
|
||||
m_actionPrivateBrowsing = new QAction(tr("Private Browsing"), this);
|
||||
m_actionPrivateBrowsing->setCheckable(true);
|
||||
m_actionPrivateBrowsing->setChecked(p_mainApp->webSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled));
|
||||
connect(m_actionPrivateBrowsing, SIGNAL(triggered(bool)), this, SLOT(startPrivate(bool)));
|
||||
m_menuTools->addAction(m_actionPrivateBrowsing);
|
||||
m_menuTools->addSeparator();
|
||||
p_mainApp->plugins()->populateToolsMenu(m_menuTools);
|
||||
m_menuTools->addAction(QIcon(":/icons/faenza/settings.png"), tr("Preferences"), this, SLOT(showPreferences()))->setShortcut(QKeySequence("Ctrl+P"));
|
||||
}
|
||||
|
||||
void QupZilla::aboutToShowViewMenu()
|
||||
{
|
||||
if (!weView())
|
||||
return;
|
||||
|
||||
if (weView()->isLoading())
|
||||
m_actionStop->setEnabled(true);
|
||||
else
|
||||
m_actionStop->setEnabled(false);
|
||||
}
|
||||
|
||||
void QupZilla::bookmarkPage()
|
||||
{
|
||||
p_mainApp->bookmarksManager()->addBookmark(weView());
|
||||
}
|
||||
|
||||
void QupZilla::addBookmark(const QUrl &url, const QString &title)
|
||||
{
|
||||
p_mainApp->bookmarksManager()->insertBookmark(url, title);
|
||||
}
|
||||
|
||||
void QupZilla::bookmarkAllTabs()
|
||||
{
|
||||
p_mainApp->bookmarksManager()->insertAllTabs();
|
||||
}
|
||||
|
||||
void QupZilla::loadActionUrl()
|
||||
{
|
||||
if (QAction *action = qobject_cast<QAction*>(sender())) {
|
||||
loadAddress(action->data().toUrl());
|
||||
}
|
||||
}
|
||||
|
||||
void QupZilla::urlEnter()
|
||||
{
|
||||
if (m_locationBar->text().isEmpty())
|
||||
return;
|
||||
loadAddress(QUrl(WebView::guessUrlFromString(m_locationBar->text())));
|
||||
weView()->setFocus();
|
||||
}
|
||||
|
||||
void QupZilla::showCookieManager()
|
||||
{
|
||||
CookieManager* m = p_mainApp->cookieManager();
|
||||
m->refreshTable();
|
||||
m->show();
|
||||
}
|
||||
|
||||
void QupZilla::showHistoryManager()
|
||||
{
|
||||
HistoryManager* m = p_mainApp->historyManager();
|
||||
m->refreshTable();
|
||||
m->setMainWindow(this);
|
||||
m->show();
|
||||
}
|
||||
|
||||
void QupZilla::showRSSManager()
|
||||
{
|
||||
RSSManager* m = p_mainApp->rssManager();
|
||||
m->refreshTable();
|
||||
m->setMainWindow(this);
|
||||
m->show();
|
||||
}
|
||||
|
||||
void QupZilla::showBookmarksManager()
|
||||
{
|
||||
BookmarksManager* m = p_mainApp->bookmarksManager();
|
||||
m->refreshTable();
|
||||
m->setMainWindow(this);
|
||||
m->show();
|
||||
}
|
||||
|
||||
void QupZilla::showClearPrivateData()
|
||||
{
|
||||
ClearPrivateData clear(this, this);
|
||||
clear.exec();
|
||||
}
|
||||
|
||||
void QupZilla::showDownloadManager()
|
||||
{
|
||||
MainApplication::getInstance()->downManager()->show();
|
||||
}
|
||||
|
||||
void QupZilla::showPreferences()
|
||||
{
|
||||
bool flashIconVisibility = m_allowFlashIcon->isVisible();
|
||||
Preferences prefs(this, this);
|
||||
prefs.exec();
|
||||
|
||||
if (flashIconVisibility != m_allowFlashIcon->isVisible())
|
||||
emit message(MainApplication::ShowFlashIcon, m_allowFlashIcon->isVisible());
|
||||
}
|
||||
|
||||
void QupZilla::showSource()
|
||||
{
|
||||
SourceViewer* source = new SourceViewer(this);
|
||||
source->setAttribute(Qt::WA_DeleteOnClose);
|
||||
source->show();
|
||||
}
|
||||
|
||||
void QupZilla::showPageInfo()
|
||||
{
|
||||
SiteInfo* info = new SiteInfo(this, this);
|
||||
info->setAttribute(Qt::WA_DeleteOnClose);
|
||||
info->show();
|
||||
}
|
||||
|
||||
void QupZilla::showBookmarksToolbar()
|
||||
{
|
||||
if (m_bookmarksToolbar->isVisible()) {
|
||||
m_bookmarksToolbar->setVisible(false);
|
||||
m_actionShowBookmarksToolbar->setChecked(false);
|
||||
}else{
|
||||
m_bookmarksToolbar->setVisible(true);
|
||||
m_actionShowBookmarksToolbar->setChecked(true);
|
||||
}
|
||||
}
|
||||
|
||||
void QupZilla::showNavigationToolbar()
|
||||
{
|
||||
if (!menuBar()->isVisible() && !m_actionShowToolbar->isChecked())
|
||||
showMenubar();
|
||||
|
||||
if (m_navigation->isVisible()) {
|
||||
m_navigation->setVisible(false);
|
||||
m_actionShowToolbar->setChecked(false);
|
||||
}else{
|
||||
m_navigation->setVisible(true);
|
||||
m_actionShowToolbar->setChecked(true);
|
||||
}
|
||||
}
|
||||
|
||||
void QupZilla::showMenubar()
|
||||
{
|
||||
if (!m_navigation->isVisible() && !m_actionShowMenubar->isChecked())
|
||||
showNavigationToolbar();
|
||||
|
||||
menuBar()->setVisible(!menuBar()->isVisible());
|
||||
m_navigation->actions().at(m_navigation->actions().count()-2)->setVisible(!menuBar()->isVisible());
|
||||
m_actionShowMenubar->setChecked(menuBar()->isVisible());
|
||||
}
|
||||
|
||||
void QupZilla::showStatusbar()
|
||||
{
|
||||
if (statusBar()->isVisible()) {
|
||||
statusBar()->setVisible(false);
|
||||
m_actionShowStatusbar->setChecked(false);
|
||||
}else{
|
||||
statusBar()->setVisible(true);
|
||||
m_actionShowStatusbar->setChecked(true);
|
||||
}
|
||||
}
|
||||
|
||||
void QupZilla::showInspector()
|
||||
{
|
||||
if (!m_webInspectorDock) {
|
||||
m_webInspectorDock = new QDockWidget(this);
|
||||
if (m_webInspector)
|
||||
delete m_webInspector;
|
||||
m_webInspector = new QWebInspector(this);
|
||||
m_webInspector->setPage(weView()->page());
|
||||
addDockWidget(Qt::BottomDockWidgetArea, m_webInspectorDock);
|
||||
m_webInspectorDock->setWindowTitle(tr("Web Inspector"));
|
||||
m_webInspectorDock->setObjectName("WebInspector");
|
||||
m_webInspectorDock->setWidget(m_webInspector);
|
||||
m_webInspectorDock->setFeatures(QDockWidget::DockWidgetClosable);
|
||||
m_webInspectorDock->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
} else if (m_webInspectorDock->isVisible()) { //Next tab
|
||||
m_webInspectorDock->show();
|
||||
m_webInspector->setPage(weView()->page());
|
||||
m_webInspectorDock->setWidget(m_webInspector);
|
||||
} else { //Showing hidden dock
|
||||
m_webInspectorDock->show();
|
||||
if (m_webInspector->page() != weView()->page()) {
|
||||
m_webInspector->setPage(weView()->page());
|
||||
m_webInspectorDock->setWidget(m_webInspector);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QupZilla::aboutQupZilla()
|
||||
{
|
||||
AboutDialog about(this);
|
||||
about.exec();
|
||||
}
|
||||
|
||||
void QupZilla::searchOnPage()
|
||||
{
|
||||
if (!m_webSearchToolbar) {
|
||||
m_webSearchToolbar = new SearchToolBar(this);
|
||||
addToolBar(Qt::BottomToolBarArea, m_webSearchToolbar);
|
||||
m_webSearchToolbar->showBar();
|
||||
return;
|
||||
}
|
||||
if (m_webSearchToolbar->isVisible()) {
|
||||
m_webSearchToolbar->hideBar();
|
||||
weView()->setFocus();
|
||||
}else{
|
||||
m_webSearchToolbar->showBar();
|
||||
}
|
||||
}
|
||||
|
||||
void QupZilla::openFile()
|
||||
{
|
||||
QString filePath = QFileDialog::getOpenFileName(this, tr("Open file..."), QDir::homePath(), "(*.html *.htm *.jpg *.png)");
|
||||
if (!filePath.isEmpty())
|
||||
loadAddress(QUrl(filePath));
|
||||
}
|
||||
|
||||
void QupZilla::fullScreen(bool make)
|
||||
{
|
||||
if (make) {
|
||||
m_menuBarVisible = menuBar()->isVisible();
|
||||
m_statusBarVisible = statusBar()->isVisible();
|
||||
setWindowState(windowState() | Qt::WindowFullScreen);
|
||||
menuBar()->hide();
|
||||
statusBar()->hide();
|
||||
}else{
|
||||
setWindowState(windowState() & ~Qt::WindowFullScreen);
|
||||
if (m_menuBarVisible)
|
||||
showMenubar();
|
||||
if (m_statusBarVisible)
|
||||
showStatusbar();
|
||||
}
|
||||
m_actionShowFullScreen->setChecked(make);
|
||||
m_actionExitFullscreen->setVisible(make);
|
||||
}
|
||||
|
||||
void QupZilla::savePage()
|
||||
{
|
||||
QNetworkRequest request(weView()->url());
|
||||
|
||||
DownloadManager* dManager = MainApplication::getInstance()->downManager();
|
||||
dManager->download(request);
|
||||
}
|
||||
|
||||
void QupZilla::printPage()
|
||||
{
|
||||
QPrintPreviewDialog* dialog = new QPrintPreviewDialog(this);
|
||||
connect(dialog, SIGNAL(paintRequested(QPrinter*)), weView(), SLOT(print(QPrinter*)));
|
||||
dialog->exec();
|
||||
delete dialog;
|
||||
}
|
||||
|
||||
void QupZilla::startPrivate(bool state)
|
||||
{
|
||||
if (state) {
|
||||
QString title = tr("Are you sure you want to turn on private browsing?");
|
||||
QString text1 = tr("When private browsing is turned on, some actions concerning your privacy will be disabled:");
|
||||
|
||||
QStringList actions;
|
||||
actions.append(tr("Webpages are not added to the history."));
|
||||
actions.append(tr("New cookies are not stored, but current cookies can be accessed."));
|
||||
actions.append(tr("Your session won't be stored."));
|
||||
|
||||
QString text2 = tr("Until you close the window, you can still click the Back and Forward "
|
||||
"buttons to return to the webpages you have opened.");
|
||||
|
||||
QString message = QString(QLatin1String("<b>%1</b><p>%2</p><ul><li>%3</li></ul><p>%4</p>")).arg(title, text1, actions.join(QLatin1String("</li><li>")), text2);
|
||||
|
||||
QMessageBox::StandardButton button = QMessageBox::question(this, tr("Start Private Browsing"),
|
||||
message, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
|
||||
if (button != QMessageBox::Yes)
|
||||
return;
|
||||
}
|
||||
p_mainApp->webSettings()->setAttribute(QWebSettings::PrivateBrowsingEnabled, state);
|
||||
p_mainApp->history()->setSaving(!state);
|
||||
p_mainApp->cookieJar()->setAllowCookies(!state);
|
||||
emit message(MainApplication::CheckPrivateBrowsing, state);
|
||||
}
|
||||
|
||||
void QupZilla::closeEvent(QCloseEvent* event)
|
||||
{
|
||||
if (p_mainApp->isClosing())
|
||||
return;
|
||||
|
||||
QSettings settings(m_activeProfil+"settings.ini", QSettings::IniFormat);
|
||||
settings.beginGroup("Web-URL-Settings");
|
||||
|
||||
if (settings.value("afterLaunch",0).toInt()!=2 && m_tabWidget->count()>1) {
|
||||
QMessageBox::StandardButton button = QMessageBox::warning(this, tr("There are still open tabs"),
|
||||
tr("There are still %1 open tabs and your session won't be stored. Are you sure to quit?").arg(m_tabWidget->count()), QMessageBox::Yes | QMessageBox::No);
|
||||
if (button != QMessageBox::Yes) {
|
||||
event->ignore();
|
||||
return;
|
||||
}
|
||||
}
|
||||
settings.endGroup();
|
||||
|
||||
p_mainApp->cookieJar()->saveCookies();
|
||||
p_mainApp->saveStateSlot();
|
||||
p_mainApp->aboutToCloseWindow(this);
|
||||
|
||||
this->~QupZilla();
|
||||
event->accept();
|
||||
}
|
||||
|
||||
void QupZilla::quitApp()
|
||||
{
|
||||
QSettings settings(m_activeProfil+"settings.ini", QSettings::IniFormat);
|
||||
settings.beginGroup("Web-URL-Settings");
|
||||
|
||||
if (settings.value("afterLaunch",0).toInt()!=2 && m_tabWidget->count()>1) {
|
||||
QMessageBox::StandardButton button = QMessageBox::warning(this, tr("There are still open tabs"),
|
||||
tr("There are still %1 open tabs and your session won't be stored. Are you sure to quit?").arg(m_tabWidget->count()), QMessageBox::Yes | QMessageBox::No);
|
||||
if (button != QMessageBox::Yes)
|
||||
return;
|
||||
}
|
||||
settings.endGroup();
|
||||
|
||||
p_mainApp->quitApplication();
|
||||
}
|
||||
|
||||
QupZilla::~QupZilla()
|
||||
{
|
||||
delete m_tabWidget;
|
||||
delete m_privateBrowsing;
|
||||
delete m_allowFlashIcon;
|
||||
delete m_menuBack;
|
||||
delete m_menuForward;
|
||||
delete m_locationBar;
|
||||
delete m_searchLine;
|
||||
delete m_bookmarksToolbar;
|
||||
delete m_webSearchToolbar;
|
||||
delete m_buttonBack;
|
||||
delete m_buttonNext;
|
||||
delete m_buttonHome;
|
||||
delete m_buttonStop;
|
||||
delete m_buttonReload;
|
||||
delete m_actionExitFullscreen;
|
||||
delete m_navigationSplitter;
|
||||
delete m_navigation;
|
||||
delete m_progressBar;
|
||||
|
||||
if (m_webInspectorDock) {
|
||||
delete m_webInspector;
|
||||
delete m_webInspectorDock;
|
||||
}
|
||||
}
|
234
src/app/qupzilla.h
Normal file
@ -0,0 +1,234 @@
|
||||
#ifndef QUPZILLA_H
|
||||
#define QUPZILLA_H
|
||||
|
||||
#if defined(QT_NO_DEBUG) & !defined(QT_NO_DEBUG_OUTPUT)
|
||||
#define QT_NO_DEBUG_OUTPUT
|
||||
#endif
|
||||
|
||||
//Comment for release building
|
||||
#define DEVELOPING
|
||||
//Check if i don't fuck anything
|
||||
|
||||
#ifdef QT_NO_DEBUG
|
||||
#ifdef DEVELOPING
|
||||
#error "TRYING TO RELEASE WITH DEVELOPING FLAG"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <QMainWindow>
|
||||
#include <QMenuBar>
|
||||
#include <QTranslator>
|
||||
#include <QDesktopWidget>
|
||||
#include <QDebug>
|
||||
#include <QUrl>
|
||||
#include <QWebView>
|
||||
#include <QWebFrame>
|
||||
#include <QWebHistory>
|
||||
#include <QtNetwork/QtNetwork>
|
||||
#include <QtSql/QtSql>
|
||||
#include <QMessageBox>
|
||||
#include <QFile>
|
||||
#include <QMovie>
|
||||
#include <QDesktopServices>
|
||||
#include <QStatusBar>
|
||||
#include <QSplitter>
|
||||
#include <QPushButton>
|
||||
#include <QProgressBar>
|
||||
#include <QPrintPreviewDialog>
|
||||
#include <QToolButton>
|
||||
#include <QWebInspector>
|
||||
#include <QPointer>
|
||||
#include "qwebkitversion.h"
|
||||
|
||||
#include "webtab.h"
|
||||
#include "webview.h"
|
||||
#include "tabwidget.h"
|
||||
#include "locationbar.h"
|
||||
#include "mainapplication.h"
|
||||
#include "websearchbar.h"
|
||||
|
||||
class TabWidget;
|
||||
class WebView;
|
||||
class LineEdit;
|
||||
class LocationBar;
|
||||
class SearchToolBar;
|
||||
class WebSearchBar;
|
||||
class BookmarksToolbar;
|
||||
class AutoFillModel;
|
||||
class MainApplication;
|
||||
class WebTab;
|
||||
class QupZilla : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
static const QString VERSION;
|
||||
static const QString BUILDTIME;
|
||||
static const QString AUTHOR;
|
||||
static const QString COPYRIGHT;
|
||||
static const QString WWWADDRESS;
|
||||
static const QString WEBKITVERSION;
|
||||
|
||||
explicit QupZilla(bool m_tryRestore=true, QUrl startUrl=QUrl());
|
||||
~QupZilla();
|
||||
|
||||
void refreshAddressBar();
|
||||
void addBookmark(const QUrl &url, const QString &title);
|
||||
void installTranslator();
|
||||
void loadSettings();
|
||||
void showInspector();
|
||||
void setBackground(QColor textColor);
|
||||
|
||||
inline WebView* weView() const { return qobject_cast<WebTab*>(m_tabWidget->widget(m_tabWidget->currentIndex()))->view(); }
|
||||
inline WebView* weView(int index) const { return qobject_cast<WebTab*>(m_tabWidget->widget(index))->view(); }
|
||||
inline LocationBar* locationBar(){ return m_locationBar; }
|
||||
inline TabWidget* tabWidget(){ return m_tabWidget; }
|
||||
inline BookmarksToolbar* bookmarksToolbar(){ return m_bookmarksToolbar; }
|
||||
inline MainApplication* getMainApp() { return p_mainApp; }
|
||||
|
||||
inline QAction* buttonStop(){ return m_buttonStop; }
|
||||
inline QAction* buttonReload(){ return m_buttonReload; }
|
||||
inline QProgressBar* progressBar(){ return m_progressBar; }
|
||||
inline QToolBar* navigationToolbar(){ return m_navigation; }
|
||||
inline QString activeProfil(){ return m_activeProfil; }
|
||||
inline QString activeLanguage(){ return m_activeLanguage; }
|
||||
inline QDockWidget* inspectorDock(){ return m_webInspectorDock; }
|
||||
inline QLabel* ipLabel(){ return m_ipLabel; }
|
||||
inline QColor menuTextColor() { return m_menuTextColor; }
|
||||
inline QAction* acShowBookmarksToolbar() { return m_actionShowBookmarksToolbar; }
|
||||
|
||||
signals:
|
||||
void loadHistory();
|
||||
void startingCompleted();
|
||||
void message(MainApplication::MessageType mes, bool state);
|
||||
|
||||
public slots:
|
||||
void refreshHistory(int index=-1);
|
||||
void loadActionUrl();
|
||||
void bookmarkPage();
|
||||
void loadAddress(QUrl url) { weView()->load(url); m_locationBar->setText(url.toEncoded()); }
|
||||
void showSource();
|
||||
void showPageInfo();
|
||||
void receiveMessage(MainApplication::MessageType mes, bool state);
|
||||
|
||||
private slots:
|
||||
void closeEvent(QCloseEvent* event);
|
||||
void postLaunch();
|
||||
void goAtHistoryIndex();
|
||||
void goNext() { weView()->forward(); }
|
||||
void goBack() { weView()->back(); }
|
||||
void goHome() { loadAddress(m_homepage); }
|
||||
void stop() { weView()->stop(); }
|
||||
void reload() { weView()->reload(); }
|
||||
void urlEnter();
|
||||
void aboutQupZilla();
|
||||
void addTab() { m_tabWidget->addView(QUrl(), tr("New tab"), TabWidget::NewTab, true); }
|
||||
void printPage();
|
||||
|
||||
void aboutToShowHistoryBackMenu();
|
||||
void aboutToShowHistoryNextMenu();
|
||||
void aboutToShowHistoryMenu();
|
||||
void aboutToShowBookmarksMenu();
|
||||
void aboutToShowToolsMenu();
|
||||
void aboutToShowHelpMenu();
|
||||
void aboutToShowViewMenu();
|
||||
|
||||
void searchOnPage();
|
||||
void showCookieManager();
|
||||
void showHistoryManager();
|
||||
void showBookmarksManager();
|
||||
void showRSSManager();
|
||||
void showDownloadManager();
|
||||
|
||||
void showMenubar();
|
||||
void showNavigationToolbar();
|
||||
void showBookmarksToolbar();
|
||||
void showStatusbar();
|
||||
void showClearPrivateData();
|
||||
void showPreferences();
|
||||
|
||||
void bookmarkAllTabs();
|
||||
void newWindow() { p_mainApp->makeNewWindow(false); }
|
||||
|
||||
void openLocation() { m_locationBar->setFocus(); m_locationBar->selectAll(); }
|
||||
void openFile();
|
||||
void savePage();
|
||||
void sendLink() { QDesktopServices::openUrl(QUrl("mailto:?body="+weView()->url().toString())); }
|
||||
void webSearch() { m_searchLine->setFocus(); }
|
||||
|
||||
void copy() { QApplication::clipboard()->setText(weView()->selectedText()); }
|
||||
void selectAll() { weView()->selectAll(); }
|
||||
void reportBug() { m_tabWidget->addView(QUrl("http://qupzilla.ic.cz/bugzilla/?do=newtask&project=2")); }
|
||||
|
||||
void zoomIn() { weView()->zoomIn(); }
|
||||
void zoomOut() { weView()->zoomOut(); }
|
||||
void zoomReset() { weView()->zoomReset(); }
|
||||
void fullScreen(bool make);
|
||||
void startPrivate(bool state);
|
||||
|
||||
void quitApp();
|
||||
|
||||
private:
|
||||
void setupUi();
|
||||
void setupMenu();
|
||||
|
||||
MainApplication* p_mainApp;
|
||||
|
||||
bool m_tryRestore;
|
||||
QUrl m_startingUrl;
|
||||
QUrl m_newtab;
|
||||
QUrl m_homepage;
|
||||
|
||||
QToolButton* m_supMenu;
|
||||
QMenu* m_superMenu;
|
||||
QMenu* m_menuFile;
|
||||
QMenu* m_menuEdit;
|
||||
QMenu* m_menuTools;
|
||||
QMenu* m_menuHelp;
|
||||
QMenu* m_menuView;
|
||||
QMenu* m_menuBookmarks;
|
||||
QMenu* m_menuHistory;
|
||||
QMenu* m_menuBack;
|
||||
QMenu* m_menuForward;
|
||||
QAction* m_actionShowToolbar;
|
||||
QAction* m_actionShowBookmarksToolbar;
|
||||
QAction* m_actionShowStatusbar;
|
||||
QAction* m_actionShowMenubar;
|
||||
QAction* m_actionShowFullScreen;
|
||||
QAction* m_actionPrivateBrowsing;
|
||||
QAction* m_actionStop;
|
||||
QAction* m_actionReload;
|
||||
|
||||
QLabel* m_privateBrowsing;
|
||||
QLabel* m_allowFlashIcon;
|
||||
QPointer<QWebInspector> m_webInspector;
|
||||
QPointer<QDockWidget> m_webInspectorDock;
|
||||
|
||||
WebSearchBar* m_searchLine;
|
||||
SearchToolBar* m_webSearchToolbar;
|
||||
BookmarksToolbar* m_bookmarksToolbar;
|
||||
LocationBar* m_locationBar;
|
||||
TabWidget* m_tabWidget;
|
||||
|
||||
QSplitter* m_navigationSplitter;
|
||||
QAction* m_buttonBack;
|
||||
QAction* m_buttonNext;
|
||||
QAction* m_buttonHome;
|
||||
QAction* m_buttonStop;
|
||||
QAction* m_buttonReload;
|
||||
QAction* m_actionExitFullscreen;
|
||||
QProgressBar* m_progressBar;
|
||||
QLabel* m_ipLabel;
|
||||
QToolBar* m_navigation;
|
||||
|
||||
QString m_activeProfil;
|
||||
QString m_activeLanguage;
|
||||
QColor m_menuTextColor;
|
||||
|
||||
//Used for F11 FullScreen remember visibility
|
||||
//of menubar and statusbar
|
||||
bool m_menuBarVisible;
|
||||
bool m_statusBarVisible;
|
||||
};
|
||||
|
||||
#endif // QUPZILLA_H
|
32
src/appicon.rc
Normal file
@ -0,0 +1,32 @@
|
||||
#include "winver.h"
|
||||
|
||||
IDI_ICON1 ICON DISCARDABLE "icon.ico"
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 0,9,7,0
|
||||
PRODUCTVERSION 0,9,7,0
|
||||
FILEFLAGS 0x0L
|
||||
FILEFLAGSMASK 0x3fL
|
||||
FILEOS 0x00040004L
|
||||
FILETYPE 0x1L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "000004b0"
|
||||
BEGIN
|
||||
VALUE "CompanyName", "QupZilla Association"
|
||||
VALUE "FileDescription", "QupZilla Web Browser"
|
||||
VALUE "FileVersion", "0.9.7.0"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2010-2011 nowrep"
|
||||
VALUE "InternalName", "qupzilla"
|
||||
VALUE "OriginalFilename", "qupzilla.exe"
|
||||
VALUE "ProductName", "QupZilla"
|
||||
VALUE "ProductVersion", "0.9.7.0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x0, 1200
|
||||
END
|
||||
END
|
183
src/autofill/autofillmodel.cpp
Normal file
@ -0,0 +1,183 @@
|
||||
#include "autofillmodel.h"
|
||||
#include "qupzilla.h"
|
||||
#include "webview.h"
|
||||
#include "mainapplication.h"
|
||||
#include "autofillwidget.h"
|
||||
|
||||
AutoFillModel::AutoFillModel(QupZilla* mainClass, QObject *parent) :
|
||||
QObject(parent)
|
||||
,p_QupZilla(mainClass)
|
||||
,m_isStoring(false)
|
||||
{
|
||||
QTimer::singleShot(0, this, SLOT(loadSettings()));
|
||||
}
|
||||
|
||||
void AutoFillModel::loadSettings()
|
||||
{
|
||||
QSettings settings(MainApplication::getInstance()->getActiveProfil()+"settings.ini", QSettings::IniFormat);
|
||||
settings.beginGroup("Web-Browser-Settings");
|
||||
m_isStoring = settings.value("AutoFillForms",true).toBool();
|
||||
settings.endGroup();
|
||||
}
|
||||
|
||||
bool AutoFillModel::isStored(const QUrl &url)
|
||||
{
|
||||
QString server = url.host();
|
||||
QSqlQuery query;
|
||||
query.exec("SELECT count(id) FROM autofill WHERE server='"+server+"'");
|
||||
query.next();
|
||||
if (query.value(0).toInt()>0)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool AutoFillModel::isStoringEnabled(const QUrl &url)
|
||||
{
|
||||
if (!m_isStoring)
|
||||
return false;
|
||||
QString server = url.host();
|
||||
QSqlQuery query;
|
||||
query.exec("SELECT count(id) FROM autofill_exceptions WHERE server='"+server+"'");
|
||||
query.next();
|
||||
if (query.value(0).toInt()>0)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void AutoFillModel::blockStoringfor (const QUrl &url)
|
||||
{
|
||||
QString server = url.host();
|
||||
QSqlQuery query;
|
||||
query.exec("INSERT INTO autofill_exceptions (server) VALUES ('"+server+"')");
|
||||
}
|
||||
|
||||
QString AutoFillModel::getUsername(const QUrl &url)
|
||||
{
|
||||
QString server = url.host();
|
||||
QSqlQuery query;
|
||||
query.exec("SELECT username FROM autofill WHERE server='"+server+"'");
|
||||
query.next();
|
||||
return query.value(0).toString();
|
||||
}
|
||||
|
||||
QString AutoFillModel::getPassword(const QUrl &url)
|
||||
{
|
||||
QString server = url.host();
|
||||
QSqlQuery query;
|
||||
query.exec("SELECT password FROM autofill WHERE server='"+server+"'");
|
||||
query.next();
|
||||
return query.value(0).toString();
|
||||
}
|
||||
|
||||
///HTTP Authorization
|
||||
bool AutoFillModel::addEntry(const QUrl &url, const QString &name, const QString &pass)
|
||||
{
|
||||
QSqlQuery query;
|
||||
query.exec("SELECT username FROM autofill WHERE server='"+url.host()+"'");
|
||||
if (query.next())
|
||||
return false;
|
||||
query.prepare("INSERT INTO autofill (server, username, password) VALUES (?,?,?)");
|
||||
query.bindValue(0, url.host());
|
||||
query.bindValue(1, name);
|
||||
query.bindValue(2, pass);
|
||||
return query.exec();
|
||||
}
|
||||
|
||||
///WEB Form
|
||||
bool AutoFillModel::addEntry(const QUrl &url, const QByteArray &data, const QString &pass)
|
||||
{
|
||||
QSqlQuery query;
|
||||
query.exec("SELECT data FROM autofill WHERE server='"+url.host()+"'");
|
||||
if (query.next())
|
||||
return false;
|
||||
|
||||
query.prepare("INSERT INTO autofill (server, data, password) VALUES (?,?,?)");
|
||||
query.bindValue(0, url.host());
|
||||
query.bindValue(1, data);
|
||||
query.bindValue(2, pass);
|
||||
return query.exec();
|
||||
}
|
||||
|
||||
void AutoFillModel::completePage(WebView* view)
|
||||
{
|
||||
if (!isStored(view->url()))
|
||||
return;
|
||||
|
||||
QWebFrame* frame = view->page()->mainFrame();
|
||||
QWebElementCollection inputs = frame->findAllElements("input");
|
||||
QSqlQuery query;
|
||||
query.exec("SELECT data FROM autofill WHERE server='"+view->url().host()+"'");
|
||||
query.next();
|
||||
QByteArray data = query.value(0).toByteArray();
|
||||
if (data.isEmpty())
|
||||
return;
|
||||
|
||||
QList<QPair<QString, QString> > arguments = QUrl::fromEncoded(QByteArray("http://bla.com/?"+data)).queryItems();
|
||||
for (int i = 0; i<arguments.count(); i++) {
|
||||
QString key = arguments.at(i).first;
|
||||
QString value = arguments.at(i).second;
|
||||
key.replace("+"," ");
|
||||
value.replace("+"," ");
|
||||
|
||||
for (int i = 0; i<inputs.count(); i++) {
|
||||
QWebElement element = inputs.at(i);
|
||||
|
||||
if (element.attribute("type")!="text" && element.attribute("type")!="password" && element.attribute("type")!="")
|
||||
continue;
|
||||
if (key == element.attribute("name"))
|
||||
element.setAttribute("value",value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AutoFillModel::post(const QNetworkRequest &request, const QByteArray &outgoingData)
|
||||
{
|
||||
//Dont save in private browsing
|
||||
if (MainApplication::getInstance()->webSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled))
|
||||
return;
|
||||
m_lastOutgoingData = outgoingData;
|
||||
|
||||
QVariant v = request.attribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 100));
|
||||
QWebPage* webPage = (QWebPage*)(v.value<void*>());
|
||||
v = request.attribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 102));
|
||||
WebView* webView = (WebView*)(v.value<void*>());
|
||||
if (!webPage || !webView)
|
||||
return;
|
||||
|
||||
v = request.attribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 101));
|
||||
QWebPage::NavigationType type = (QWebPage::NavigationType)v.toInt();
|
||||
|
||||
if (type!=QWebPage::NavigationTypeFormSubmitted)
|
||||
return;
|
||||
|
||||
QString passwordName="";
|
||||
QWebFrame* frame = webPage->mainFrame();
|
||||
QWebElementCollection inputs = frame->findAllElements("input");
|
||||
for (int i = 0; i<inputs.count(); i++) {
|
||||
QWebElement element = inputs.at(i);
|
||||
QString type = element.attribute("type");
|
||||
|
||||
if (type == "password")
|
||||
passwordName = element.attribute("name");
|
||||
}
|
||||
|
||||
//Return if storing is not enabled, data for this page is already stored, no password element found in sent data
|
||||
if (!isStoringEnabled(request.url()) || isStored(request.url()) || passwordName.isEmpty())
|
||||
return;
|
||||
//Return if no password form has been sent
|
||||
if (!outgoingData.contains((passwordName+"=").toAscii()))
|
||||
return;
|
||||
|
||||
QString pass = "";
|
||||
QList<QPair<QString, QString> > arguments = QUrl::fromEncoded(QByteArray("http://bla.com/?"+outgoingData)).queryItems();
|
||||
for (int i = 0; i<arguments.count(); i++) {
|
||||
if (arguments.at(i).first == passwordName) {
|
||||
pass = arguments.at(i).second;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
AutoFillWidget* aWidget = new AutoFillWidget(request.url(), outgoingData, pass);
|
||||
webView->addNotification(aWidget);
|
||||
|
||||
}
|
44
src/autofill/autofillmodel.h
Normal file
@ -0,0 +1,44 @@
|
||||
#ifndef AUTOFILLMODEL_H
|
||||
#define AUTOFILLMODEL_H
|
||||
|
||||
#if defined(QT_NO_DEBUG) & !defined(QT_NO_DEBUG_OUTPUT)
|
||||
#define QT_NO_DEBUG_OUTPUT
|
||||
#endif
|
||||
|
||||
#include <QObject>
|
||||
#include <QUrl>
|
||||
#include <QNetworkRequest>
|
||||
|
||||
class QupZilla;
|
||||
class WebView;
|
||||
class AutoFillModel : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit AutoFillModel(QupZilla* mainClass, QObject *parent = 0);
|
||||
void completePage(WebView* view);
|
||||
|
||||
bool isStored(const QUrl &url);
|
||||
bool isStoringEnabled(const QUrl &url);
|
||||
void blockStoringfor (const QUrl &url);
|
||||
|
||||
QString getUsername(const QUrl &url);
|
||||
QString getPassword(const QUrl &url);
|
||||
bool addEntry(const QUrl &url, const QString &name, const QString &pass);
|
||||
bool addEntry(const QUrl &url, const QByteArray &data, const QString &pass);
|
||||
|
||||
void post(const QNetworkRequest &request, const QByteArray &outgoingData);
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
void loadSettings();
|
||||
|
||||
private:
|
||||
QupZilla* p_QupZilla;
|
||||
QByteArray m_lastOutgoingData;
|
||||
bool m_isStoring;
|
||||
|
||||
};
|
||||
|
||||
#endif // AUTOFILLMODEL_H
|
46
src/autofill/autofillwidget.cpp
Normal file
@ -0,0 +1,46 @@
|
||||
#include "autofillwidget.h"
|
||||
#include "ui_autofillwidget.h"
|
||||
#include "autofillmodel.h"
|
||||
#include "mainapplication.h"
|
||||
|
||||
AutoFillWidget::AutoFillWidget(QUrl url, QByteArray data, QString pass, QWidget *parent)
|
||||
:QWidget(parent)
|
||||
,ui(new Ui::AutoFillWidget)
|
||||
,m_url(url)
|
||||
,m_data(data)
|
||||
,m_pass(pass)
|
||||
{
|
||||
setAttribute(Qt::WA_DeleteOnClose);
|
||||
ui->setupUi(this);
|
||||
ui->label->setText(tr("Do you want QupZilla to remember password on %1?").arg(url.host()));
|
||||
ui->closeButton->setIcon(
|
||||
#ifdef Q_WS_X11
|
||||
style()->standardIcon(QStyle::SP_DialogCloseButton)
|
||||
#else
|
||||
QIcon(":/icons/faenza/close.png")
|
||||
#endif
|
||||
);
|
||||
|
||||
connect(ui->remember, SIGNAL(clicked()), this, SLOT(remember()));
|
||||
connect(ui->never, SIGNAL(clicked()), this, SLOT(never()));
|
||||
connect(ui->notnow, SIGNAL(clicked()), this, SLOT(close()));
|
||||
connect(ui->closeButton, SIGNAL(clicked()), this, SLOT(close()));
|
||||
}
|
||||
// addEntry(request.url(), outgoingData, pass);
|
||||
|
||||
void AutoFillWidget::never()
|
||||
{
|
||||
MainApplication::getInstance()->autoFill()->blockStoringfor(m_url);
|
||||
close();
|
||||
}
|
||||
|
||||
void AutoFillWidget::remember()
|
||||
{
|
||||
MainApplication::getInstance()->autoFill()->addEntry(m_url, m_data, m_pass);
|
||||
close();
|
||||
}
|
||||
|
||||
AutoFillWidget::~AutoFillWidget()
|
||||
{
|
||||
delete ui;
|
||||
}
|
30
src/autofill/autofillwidget.h
Normal file
@ -0,0 +1,30 @@
|
||||
#ifndef AUTOFILLWIDGET_H
|
||||
#define AUTOFILLWIDGET_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QUrl>
|
||||
|
||||
namespace Ui {
|
||||
class AutoFillWidget;
|
||||
}
|
||||
|
||||
class AutoFillWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit AutoFillWidget(QUrl url, QByteArray data, QString pass, QWidget *parent = 0);
|
||||
~AutoFillWidget();
|
||||
|
||||
private slots:
|
||||
void remember();
|
||||
void never();
|
||||
|
||||
private:
|
||||
Ui::AutoFillWidget *ui;
|
||||
QUrl m_url;
|
||||
QByteArray m_data;
|
||||
QString m_pass;
|
||||
};
|
||||
|
||||
#endif // AUTOFILLWIDGET_H
|
126
src/autofill/autofillwidget.ui
Normal file
@ -0,0 +1,126 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>AutoFillWidget</class>
|
||||
<widget class="QWidget" name="AutoFillWidget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>897</width>
|
||||
<height>40</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string notr="true">Form</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<property name="spacing">
|
||||
<number>3</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="icon">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap resource="../data/icons.qrc">:/icons/other/keys.png</pixmap>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QPushButton" name="remember">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Remember</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="never">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Never For This Site</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="notnow">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Not Now</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="closeButton">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="autoRaise">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="../data/icons.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
343
src/bookmarks/bookmarksmanager.cpp
Normal file
@ -0,0 +1,343 @@
|
||||
#include "mainapplication.h"
|
||||
#include "bookmarksmanager.h"
|
||||
#include "ui_bookmarksmanager.h"
|
||||
#include "qupzilla.h"
|
||||
#include "locationbar.h"
|
||||
#include "webview.h"
|
||||
#include "bookmarkstoolbar.h"
|
||||
#include "tabwidget.h"
|
||||
#include "bookmarksmodel.h"
|
||||
|
||||
//Won't be bad idea to rewrite bookmarks access via bookmarksmodel
|
||||
|
||||
BookmarksManager::BookmarksManager(QupZilla* mainClass, QWidget *parent) :
|
||||
QWidget(parent)
|
||||
,m_isRefreshing(false)
|
||||
,ui(new Ui::BookmarksManager)
|
||||
,p_QupZilla(mainClass)
|
||||
,m_bookmarksModel(MainApplication::getInstance()->bookmarks())
|
||||
{
|
||||
ui->setupUi(this);
|
||||
//CENTER on scren
|
||||
const QRect screen = QApplication::desktop()->screenGeometry();
|
||||
const QRect &size = QWidget::geometry();
|
||||
QWidget::move( (screen.width()-size.width())/2, (screen.height()-size.height())/2 );
|
||||
|
||||
connect(ui->deleteB, SIGNAL(clicked()), this, SLOT(deleteItem()));
|
||||
connect(ui->close, SIGNAL(clicked(QAbstractButton*)), this, SLOT(hide()));
|
||||
connect(ui->bookmarksTree, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(itemChanged(QTreeWidgetItem*)));
|
||||
connect(ui->addFolder, SIGNAL(clicked()), this, SLOT(addFolder()));
|
||||
connect(ui->bookmarksTree, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(contextMenuRequested(const QPoint &)));
|
||||
connect(ui->bookmarksTree, SIGNAL(itemControlClicked(QTreeWidgetItem*)), this, SLOT(itemControlClicked(QTreeWidgetItem*)));
|
||||
//QTimer::singleShot(0, this, SLOT(refreshTable()));
|
||||
}
|
||||
|
||||
QupZilla* BookmarksManager::getQupZilla()
|
||||
{
|
||||
if (!p_QupZilla)
|
||||
p_QupZilla = MainApplication::getInstance()->getWindow();
|
||||
return p_QupZilla;
|
||||
}
|
||||
|
||||
void BookmarksManager::setMainWindow(QupZilla *window)
|
||||
{
|
||||
if (window)
|
||||
p_QupZilla = window;
|
||||
}
|
||||
|
||||
void BookmarksManager::addFolder()
|
||||
{
|
||||
QString text = QInputDialog::getText(this, tr("Add new folder"), tr("Choose name for new bookmark folder: "));
|
||||
if (text.isEmpty())
|
||||
return;
|
||||
QSqlQuery query;
|
||||
query.exec("INSERT INTO folders (name) VALUES ('"+text+"')");
|
||||
refreshTable();
|
||||
}
|
||||
|
||||
void BookmarksManager::itemChanged(QTreeWidgetItem *item)
|
||||
{
|
||||
if (!item || m_isRefreshing)
|
||||
return;
|
||||
|
||||
QString name = item->text(0);
|
||||
QUrl url = QUrl(item->text(1));
|
||||
int id = item->whatsThis(1).toInt();
|
||||
|
||||
m_bookmarksModel->editBookmark(id, url, name);
|
||||
}
|
||||
|
||||
void BookmarksManager::itemControlClicked(QTreeWidgetItem *item)
|
||||
{
|
||||
if (!item || item->text(1).isEmpty())
|
||||
return;
|
||||
getQupZilla()->tabWidget()->addView(QUrl(item->text(1)));
|
||||
}
|
||||
|
||||
void BookmarksManager::loadInNewTab()
|
||||
{
|
||||
if (QAction *action = qobject_cast<QAction*>(sender()))
|
||||
getQupZilla()->tabWidget()->addView(action->data().toUrl(), tr("New Tab"), TabWidget::NewNotSelectedTab);
|
||||
}
|
||||
|
||||
void BookmarksManager::deleteItem()
|
||||
{
|
||||
QTreeWidgetItem* item = ui->bookmarksTree->currentItem();
|
||||
if (!item)
|
||||
return;
|
||||
QSqlQuery query;
|
||||
|
||||
if (item->text(1).isEmpty()) { // Delete folder
|
||||
QString folder = item->text(0);
|
||||
if (folder == tr("Bookmarks In Menu") || folder == tr("Bookmarks In ToolBar"))
|
||||
return;
|
||||
|
||||
query.exec("DELETE FROM folders WHERE name='"+folder+"'");
|
||||
query.exec("DELETE FROM bookmarks WHERE folder='"+folder+"'");
|
||||
delete item;
|
||||
return;
|
||||
}
|
||||
|
||||
QString id = item->whatsThis(1);
|
||||
|
||||
query.exec("DELETE FROM bookmarks WHERE id="+id);
|
||||
delete item;
|
||||
getQupZilla()->bookmarksToolbar()->refreshBookmarks();
|
||||
}
|
||||
|
||||
void BookmarksManager::addBookmark(WebView *view)
|
||||
{
|
||||
insertBookmark(view->url(), view->title());
|
||||
}
|
||||
|
||||
void BookmarksManager::moveBookmark()
|
||||
{
|
||||
QTreeWidgetItem* item = ui->bookmarksTree->currentItem();
|
||||
if (!item)
|
||||
return;
|
||||
if (QAction *action = qobject_cast<QAction*>(sender())) {
|
||||
m_bookmarksModel->editBookmark(item->whatsThis(1).toInt(), item->text(0), action->data().toString());
|
||||
}
|
||||
refreshTable();
|
||||
}
|
||||
|
||||
void BookmarksManager::contextMenuRequested(const QPoint &position)
|
||||
{
|
||||
if (!ui->bookmarksTree->itemAt(position))
|
||||
return;
|
||||
QString link = ui->bookmarksTree->itemAt(position)->text(1);
|
||||
if (link.isEmpty())
|
||||
return;
|
||||
|
||||
QMenu menu;
|
||||
menu.addAction(tr("Open link in actual tab"), getQupZilla(), SLOT(loadActionUrl()))->setData(link);
|
||||
menu.addAction(tr("Open link in new tab"), this, SLOT(loadInNewTab()))->setData(link);
|
||||
menu.addSeparator();
|
||||
|
||||
QMenu moveMenu;
|
||||
moveMenu.setTitle(tr("Move bookmark to folder"));
|
||||
moveMenu.addAction(QIcon(":icons/other/unsortedbookmarks.png"), tr("Unsorted Bookmarks"), this, SLOT(moveBookmark()))->setData("unsorted");
|
||||
moveMenu.addAction(style()->standardIcon(QStyle::SP_DirOpenIcon), tr("Bookmarks In Menu"), this, SLOT(moveBookmark()))->setData("bookmarksMenu");
|
||||
moveMenu.addAction(style()->standardIcon(QStyle::SP_DirOpenIcon), tr("Bookmarks In ToolBar"), this, SLOT(moveBookmark()))->setData("bookmarksToolbar");
|
||||
QSqlQuery query;
|
||||
query.exec("SELECT name FROM folders");
|
||||
while(query.next())
|
||||
moveMenu.addAction(style()->standardIcon(QStyle::SP_DirIcon), query.value(0).toString(), this, SLOT(moveBookmark()))->setData(query.value(0).toString());
|
||||
menu.addMenu(&moveMenu);
|
||||
|
||||
menu.addSeparator();
|
||||
menu.addAction(tr("Close"), this, SLOT(close()));
|
||||
|
||||
//Prevent choosing first option with double rightclick
|
||||
QPoint pos = QCursor::pos();
|
||||
QPoint p(pos.x(), pos.y()+1);
|
||||
menu.exec(p);
|
||||
}
|
||||
|
||||
void BookmarksManager::refreshTable()
|
||||
{
|
||||
m_isRefreshing = true;
|
||||
ui->bookmarksTree->setUpdatesEnabled(false);
|
||||
ui->bookmarksTree->clear();
|
||||
|
||||
QSqlQuery query;
|
||||
QTreeWidgetItem* newItem = new QTreeWidgetItem(ui->bookmarksTree);
|
||||
newItem->setText(0, tr("Bookmarks In Menu"));
|
||||
newItem->setIcon(0, style()->standardIcon(QStyle::SP_DirIcon));
|
||||
ui->bookmarksTree->addTopLevelItem(newItem);
|
||||
|
||||
newItem = new QTreeWidgetItem(ui->bookmarksTree);
|
||||
newItem->setText(0, tr("Bookmarks In ToolBar"));
|
||||
newItem->setIcon(0, style()->standardIcon(QStyle::SP_DirIcon));
|
||||
ui->bookmarksTree->addTopLevelItem(newItem);
|
||||
|
||||
query.exec("SELECT name FROM folders");
|
||||
while(query.next()) {
|
||||
newItem = new QTreeWidgetItem(ui->bookmarksTree);
|
||||
newItem->setText(0, query.value(0).toString());
|
||||
newItem->setIcon(0, style()->standardIcon(QStyle::SP_DirIcon));
|
||||
ui->bookmarksTree->addTopLevelItem(newItem);
|
||||
}
|
||||
|
||||
query.exec("SELECT title, url, id, folder FROM bookmarks");
|
||||
while(query.next()) {
|
||||
QString title = query.value(0).toString();
|
||||
QUrl url = query.value(1).toUrl();
|
||||
int id = query.value(2).toInt();
|
||||
QString folder = query.value(3).toString();
|
||||
QTreeWidgetItem* item;
|
||||
if (folder == "bookmarksMenu")
|
||||
folder = tr("Bookmarks In Menu");
|
||||
if (folder == "bookmarksToolbar")
|
||||
folder = tr("Bookmarks In ToolBar");
|
||||
|
||||
if (folder != "unsorted") {
|
||||
QList<QTreeWidgetItem*> findParent = ui->bookmarksTree->findItems(folder, 0);
|
||||
if (findParent.count() == 1) {
|
||||
item = new QTreeWidgetItem(findParent.at(0));
|
||||
}else{
|
||||
QTreeWidgetItem* newParent = new QTreeWidgetItem(ui->bookmarksTree);
|
||||
newParent->setText(0, folder);
|
||||
newParent->setIcon(0, style()->standardIcon(QStyle::SP_DirIcon));
|
||||
ui->bookmarksTree->addTopLevelItem(newParent);
|
||||
item = new QTreeWidgetItem(newParent);
|
||||
}
|
||||
} else
|
||||
item = new QTreeWidgetItem(ui->bookmarksTree);
|
||||
|
||||
item->setText(0, title);
|
||||
item->setText(1, url.toEncoded());
|
||||
item->setToolTip(0, title);
|
||||
item->setToolTip(1, url.toEncoded());
|
||||
|
||||
item->setWhatsThis(1, QString::number(id));
|
||||
item->setIcon(0, LocationBar::icon(url));
|
||||
item->setFlags(item->flags() | Qt::ItemIsEditable);
|
||||
ui->bookmarksTree->addTopLevelItem(item);
|
||||
}
|
||||
ui->bookmarksTree->expandAll();
|
||||
|
||||
ui->bookmarksTree->setUpdatesEnabled(true);
|
||||
m_isRefreshing = false;
|
||||
}
|
||||
|
||||
void BookmarksManager::insertBookmark(const QUrl &url, const QString &title)
|
||||
{
|
||||
if (url.isEmpty() || title.isEmpty())
|
||||
return;
|
||||
QDialog* dialog = new QDialog(getQupZilla());
|
||||
QBoxLayout* layout = new QBoxLayout(QBoxLayout::TopToBottom, dialog);
|
||||
QLabel* label = new QLabel(dialog);
|
||||
QLineEdit* edit = new QLineEdit(dialog);
|
||||
QComboBox* combo = new QComboBox(dialog);
|
||||
QDialogButtonBox* box = new QDialogButtonBox(dialog);
|
||||
box->addButton(QDialogButtonBox::Ok);
|
||||
box->addButton(QDialogButtonBox::Cancel);
|
||||
connect(box, SIGNAL(rejected()), dialog, SLOT(reject()));
|
||||
connect(box, SIGNAL(accepted()), dialog, SLOT(accept()));
|
||||
layout->addWidget(label);
|
||||
layout->addWidget(edit);
|
||||
layout->addWidget(combo);
|
||||
if (m_bookmarksModel->isBookmarked(url))
|
||||
layout->addWidget(new QLabel(tr("<b>Warning: </b>You already have this page bookmarked!")));
|
||||
layout->addWidget(box);
|
||||
|
||||
combo->addItem(QIcon(":icons/other/unsortedbookmarks.png"), tr("Unsorted Bookmarks"));
|
||||
combo->addItem(style()->standardIcon(QStyle::SP_DirOpenIcon), tr("Bookmarks In Menu"));
|
||||
combo->addItem(style()->standardIcon(QStyle::SP_DirOpenIcon), tr("Bookmarks In ToolBar"));
|
||||
QSqlQuery query;
|
||||
query.exec("SELECT name FROM folders");
|
||||
while(query.next())
|
||||
combo->addItem(style()->standardIcon(QStyle::SP_DirIcon), query.value(0).toString());
|
||||
|
||||
label->setText(tr("Choose name and location of bookmark."));
|
||||
edit->setText(title);
|
||||
edit->setCursorPosition(0);
|
||||
dialog->setWindowIcon(LocationBar::icon(url));
|
||||
dialog->setWindowTitle(tr("Add New Bookmark"));
|
||||
|
||||
QSize size = dialog->size();
|
||||
size.setWidth(350);
|
||||
dialog->resize(size);
|
||||
dialog->exec();
|
||||
if (dialog->result() == QDialog::Rejected)
|
||||
return;
|
||||
if (edit->text().isEmpty())
|
||||
return;
|
||||
|
||||
query.prepare("INSERT INTO bookmarks (title, url, folder) VALUES (?,?,?)");
|
||||
query.bindValue(0, edit->text());
|
||||
query.bindValue(1, url.toString());
|
||||
if (combo->currentText() == tr("Bookmarks In Menu"))
|
||||
query.bindValue(2,"bookmarksMenu");
|
||||
else if (combo->currentText() == tr("Bookmarks In ToolBar"))
|
||||
query.bindValue(2,"bookmarksToolbar");
|
||||
else if (combo->currentText() == tr("Unsorted Bookmarks"))
|
||||
query.bindValue(2, "unsorted");
|
||||
else query.bindValue(2, combo->currentText());
|
||||
query.exec();
|
||||
|
||||
getQupZilla()->bookmarksToolbar()->refreshBookmarks();
|
||||
getQupZilla()->locationBar()->checkBookmark();
|
||||
delete dialog;
|
||||
}
|
||||
|
||||
void BookmarksManager::insertAllTabs()
|
||||
{
|
||||
QDialog* dialog = new QDialog(getQupZilla());
|
||||
QBoxLayout* layout = new QBoxLayout(QBoxLayout::TopToBottom, dialog);
|
||||
QLabel* label = new QLabel(dialog);
|
||||
QComboBox* combo = new QComboBox(dialog);
|
||||
QDialogButtonBox* box = new QDialogButtonBox(dialog);
|
||||
box->addButton(QDialogButtonBox::Ok);
|
||||
box->addButton(QDialogButtonBox::Cancel);
|
||||
connect(box, SIGNAL(rejected()), dialog, SLOT(reject()));
|
||||
connect(box, SIGNAL(accepted()), dialog, SLOT(accept()));
|
||||
layout->addWidget(label);
|
||||
layout->addWidget(combo);
|
||||
layout->addWidget(box);
|
||||
|
||||
combo->addItem(QIcon(":icons/other/unsortedbookmarks.png"), tr("Unsorted Bookmarks"));
|
||||
combo->addItem(style()->standardIcon(QStyle::SP_DirOpenIcon), tr("Bookmarks In Menu"));
|
||||
combo->addItem(style()->standardIcon(QStyle::SP_DirOpenIcon), tr("Bookmarks In ToolBar"));
|
||||
QSqlQuery query;
|
||||
query.exec("SELECT name FROM folders");
|
||||
while(query.next())
|
||||
combo->addItem(style()->standardIcon(QStyle::SP_DirIcon), query.value(0).toString());
|
||||
|
||||
label->setText(tr("Choose folder for bookmarks:"));
|
||||
dialog->setWindowIcon(QIcon(":/icons/qupzilla.png"));
|
||||
dialog->setWindowTitle(tr("Bookmark All Tabs"));
|
||||
|
||||
QSize size = dialog->size();
|
||||
size.setWidth(350);
|
||||
dialog->resize(size);
|
||||
dialog->exec();
|
||||
if (dialog->result() == QDialog::Rejected)
|
||||
return;
|
||||
|
||||
for (int i = 0; i<getQupZilla()->tabWidget()->count(); i++) {
|
||||
WebView* view = getQupZilla()->weView(i);
|
||||
if (!view || view->url().isEmpty())
|
||||
continue;
|
||||
query.prepare("INSERT INTO bookmarks (title, url, folder) VALUES (?,?,?)");
|
||||
query.bindValue(0, view->title());
|
||||
query.bindValue(1, view->url().toString());
|
||||
if (combo->currentText() == tr("Bookmarks In Menu"))
|
||||
query.bindValue(2,"bookmarksMenu");
|
||||
else if (combo->currentText() == tr("Bookmarks In ToolBar"))
|
||||
query.bindValue(2,"bookmarksToolbar");
|
||||
else if (combo->currentText() == tr("Unsorted Bookmarks"))
|
||||
query.bindValue(2, "unsorted");
|
||||
else query.bindValue(2, combo->currentText());
|
||||
query.exec();
|
||||
}
|
||||
getQupZilla()->bookmarksToolbar()->refreshBookmarks();
|
||||
getQupZilla()->locationBar()->checkBookmark();
|
||||
delete dialog;
|
||||
}
|
||||
|
||||
BookmarksManager::~BookmarksManager()
|
||||
{
|
||||
delete ui;
|
||||
}
|
53
src/bookmarks/bookmarksmanager.h
Normal file
@ -0,0 +1,53 @@
|
||||
#ifndef BOOKMARKSMANAGER_H
|
||||
#define BOOKMARKSMANAGER_H
|
||||
|
||||
#if defined(QT_NO_DEBUG) & !defined(QT_NO_DEBUG_OUTPUT)
|
||||
#define QT_NO_DEBUG_OUTPUT
|
||||
#endif
|
||||
|
||||
#include <QWidget>
|
||||
#include <QTreeWidgetItem>
|
||||
#include <QInputDialog>
|
||||
#include <QPointer>
|
||||
|
||||
namespace Ui {
|
||||
class BookmarksManager;
|
||||
}
|
||||
|
||||
class WebView;
|
||||
class QupZilla;
|
||||
class BookmarksModel;
|
||||
class BookmarksManager : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit BookmarksManager(QupZilla* mainClass, QWidget *parent = 0);
|
||||
~BookmarksManager();
|
||||
void addBookmark(WebView* view);
|
||||
void insertBookmark(const QUrl &url, const QString &title);
|
||||
void setMainWindow(QupZilla* window);
|
||||
|
||||
public slots:
|
||||
void refreshTable();
|
||||
void insertAllTabs();
|
||||
|
||||
private slots:
|
||||
void deleteItem();
|
||||
void itemChanged(QTreeWidgetItem* item);
|
||||
void addFolder();
|
||||
void contextMenuRequested(const QPoint &position);
|
||||
void loadInNewTab();
|
||||
void itemControlClicked(QTreeWidgetItem* item);
|
||||
void moveBookmark();
|
||||
|
||||
private:
|
||||
QupZilla* getQupZilla();
|
||||
|
||||
bool m_isRefreshing;
|
||||
Ui::BookmarksManager *ui;
|
||||
QPointer<QupZilla> p_QupZilla;
|
||||
BookmarksModel* m_bookmarksModel;
|
||||
};
|
||||
|
||||
#endif // BOOKMARKSMANAGER_H
|
81
src/bookmarks/bookmarksmanager.ui
Normal file
@ -0,0 +1,81 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>BookmarksManager</class>
|
||||
<widget class="QWidget" name="BookmarksManager">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>735</width>
|
||||
<height>547</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Bookmarks</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset resource="../icons.qrc">
|
||||
<normaloff>:/icons/qupzilla.png</normaloff>:/icons/qupzilla.png</iconset>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0" colspan="5">
|
||||
<widget class="TreeWidget" name="bookmarksTree">
|
||||
<property name="contextMenuPolicy">
|
||||
<enum>Qt::CustomContextMenu</enum>
|
||||
</property>
|
||||
<property name="alternatingRowColors">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<attribute name="headerDefaultSectionSize">
|
||||
<number>330</number>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Title</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Url</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="4">
|
||||
<widget class="QDialogButtonBox" name="close">
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Close</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="3">
|
||||
<widget class="QPushButton" name="deleteB">
|
||||
<property name="text">
|
||||
<string>Delete</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Del</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<widget class="QPushButton" name="addFolder">
|
||||
<property name="text">
|
||||
<string>Add Folder</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>TreeWidget</class>
|
||||
<extends>QTreeWidget</extends>
|
||||
<header>treewidget.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources>
|
||||
<include location="../icons.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
150
src/bookmarks/bookmarksmodel.cpp
Normal file
@ -0,0 +1,150 @@
|
||||
#include "mainapplication.h"
|
||||
#include "bookmarksmodel.h"
|
||||
#include "webview.h"
|
||||
|
||||
// SQLite DB -> table bookmarks + folders
|
||||
// Unique in bookmarks table is id
|
||||
// However from bookmark icon, it is not possible to add more than one bookmark
|
||||
// Only from Ctrl+D dialog it is possible
|
||||
|
||||
BookmarksModel::BookmarksModel()
|
||||
{
|
||||
loadSettings();
|
||||
}
|
||||
|
||||
void BookmarksModel::loadSettings()
|
||||
{
|
||||
QSettings settings(MainApplication::getInstance()->getActiveProfil()+"settings.ini", QSettings::IniFormat);
|
||||
settings.beginGroup("Web-Browser-Settings");
|
||||
m_showMostVisited = settings.value("showMostVisited",true).toBool();
|
||||
settings.endGroup();
|
||||
}
|
||||
|
||||
void BookmarksModel::setShowingMostVisited(bool state)
|
||||
{
|
||||
QSettings settings(MainApplication::getInstance()->getActiveProfil()+"settings.ini", QSettings::IniFormat);
|
||||
settings.beginGroup("Web-Browser-Settings");
|
||||
settings.setValue("showMostVisited",state);
|
||||
settings.endGroup();
|
||||
m_showMostVisited = state;
|
||||
}
|
||||
|
||||
bool BookmarksModel::isBookmarked(QUrl url)
|
||||
{
|
||||
QSqlQuery query;
|
||||
query.prepare("SELECT count(id) FROM bookmarks WHERE url=?");
|
||||
query.bindValue(0, url.toString());
|
||||
query.exec();
|
||||
query.next();
|
||||
return query.value(0).toInt()>0;
|
||||
}
|
||||
|
||||
// Bookmark search priority:
|
||||
// Bookmarks in menu > bookmarks in toolbar -> user folders and unsorted
|
||||
int BookmarksModel::bookmarkId(QUrl url)
|
||||
{
|
||||
QSqlQuery query;
|
||||
query.prepare("SELECT id FROM bookmarks WHERE url=? AND folder='bookmarksMenu' ");
|
||||
query.bindValue(0, url.toString());
|
||||
query.exec();
|
||||
if (query.next())
|
||||
return query.value(0).toInt();
|
||||
|
||||
query.prepare("SELECT id FROM bookmarks WHERE url=? AND folder='bookmarksToolbar' ");
|
||||
query.bindValue(0, url.toString());
|
||||
query.exec();
|
||||
if (query.next())
|
||||
return query.value(0).toInt();
|
||||
|
||||
query.prepare("SELECT id FROM bookmarks WHERE url=? ");
|
||||
query.bindValue(0, url.toString());
|
||||
query.exec();
|
||||
if (query.next())
|
||||
return query.value(0).toInt();
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int BookmarksModel::bookmarkId(QUrl url, QString title, QString folder)
|
||||
{
|
||||
QSqlQuery query;
|
||||
query.prepare("SELECT id FROM bookmarks WHERE url=? AND title=? AND folder=? ");
|
||||
query.bindValue(0, url.toString());
|
||||
query.bindValue(1, title);
|
||||
query.bindValue(2, folder);
|
||||
query.exec();
|
||||
if (query.next())
|
||||
return query.value(0).toInt();
|
||||
return -1;
|
||||
}
|
||||
|
||||
QStringList BookmarksModel::getBookmark(int id)
|
||||
{
|
||||
QSqlQuery query;
|
||||
query.prepare("SELECT url, title, folder FROM bookmarks WHERE id=?");
|
||||
query.bindValue(0, id);
|
||||
query.exec();
|
||||
if (!query.next())
|
||||
return QStringList();
|
||||
QStringList list;
|
||||
list.append(query.value(0).toString());
|
||||
list.append(query.value(1).toString());
|
||||
list.append(query.value(2).toString());
|
||||
return list;
|
||||
}
|
||||
|
||||
bool BookmarksModel::saveBookmark(QUrl url, QString title, QString folder)
|
||||
{
|
||||
if (url.isEmpty() || title.isEmpty() || folder.isEmpty())
|
||||
return false;
|
||||
|
||||
QSqlQuery query;
|
||||
query.prepare("INSERT INTO bookmarks (url, title, folder) VALUES (?,?,?)");
|
||||
query.bindValue(0, url.toString());
|
||||
query.bindValue(1, title);
|
||||
query.bindValue(2, folder);
|
||||
return query.exec();
|
||||
}
|
||||
|
||||
bool BookmarksModel::saveBookmark(WebView *view, QString folder)
|
||||
{
|
||||
return saveBookmark(view->url(), view->title(), folder);
|
||||
}
|
||||
|
||||
bool BookmarksModel::removeBookmark(int id)
|
||||
{
|
||||
QSqlQuery query;
|
||||
query.prepare("DELETE FROM bookmarks WHERE id = ?");
|
||||
query.bindValue(0, id);
|
||||
return query.exec();
|
||||
}
|
||||
|
||||
bool BookmarksModel::removeBookmark(QUrl url)
|
||||
{
|
||||
return removeBookmark(bookmarkId(url));
|
||||
}
|
||||
|
||||
bool BookmarksModel::removeBookmark(WebView *view)
|
||||
{
|
||||
return removeBookmark(bookmarkId(view->url()));
|
||||
}
|
||||
|
||||
bool BookmarksModel::editBookmark(int id, QString title, QString folder)
|
||||
{
|
||||
QSqlQuery query;
|
||||
query.prepare("UPDATE bookmarks SET title=?, folder=? WHERE id=?");
|
||||
query.bindValue(0, title);
|
||||
query.bindValue(1, folder);
|
||||
query.bindValue(2, id);
|
||||
return query.exec();
|
||||
}
|
||||
|
||||
bool BookmarksModel::editBookmark(int id, QUrl url, QString title)
|
||||
{
|
||||
QSqlQuery query;
|
||||
query.prepare("UPDATE bookmarks SET title=?, url=? WHERE id=?");
|
||||
query.bindValue(0, title);
|
||||
query.bindValue(1, url.toString());
|
||||
query.bindValue(2, id);
|
||||
return query.exec();
|
||||
}
|
44
src/bookmarks/bookmarksmodel.h
Normal file
@ -0,0 +1,44 @@
|
||||
#ifndef BOOKMARKSMODEL_H
|
||||
#define BOOKMARKSMODEL_H
|
||||
#if defined(QT_NO_DEBUG) & !defined(QT_NO_DEBUG_OUTPUT)
|
||||
#define QT_NO_DEBUG_OUTPUT
|
||||
#endif
|
||||
|
||||
#include <QUrl>
|
||||
#include <QSettings>
|
||||
#include <QSqlQuery>
|
||||
|
||||
class WebView;
|
||||
class BookmarksModel
|
||||
{
|
||||
public:
|
||||
explicit BookmarksModel();
|
||||
void loadSettings();
|
||||
inline bool isShowingMostVisited() { return m_showMostVisited; }
|
||||
void setShowingMostVisited(bool state);
|
||||
|
||||
bool isBookmarked(QUrl url);
|
||||
int bookmarkId(QUrl url);
|
||||
int bookmarkId(QUrl url, QString title, QString folder);
|
||||
QStringList getBookmark(int id);
|
||||
|
||||
bool saveBookmark(QUrl url, QString title, QString folder = "unsorted");
|
||||
bool saveBookmark(WebView* view, QString folder = "unsorted");
|
||||
|
||||
bool removeBookmark(int id);
|
||||
bool removeBookmark(QUrl url);
|
||||
bool removeBookmark(WebView* view);
|
||||
|
||||
bool editBookmark(int id, QString title, QString folder);
|
||||
bool editBookmark(int id, QUrl url, QString title);
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
|
||||
private:
|
||||
bool m_showMostVisited;
|
||||
|
||||
};
|
||||
|
||||
#endif // BOOKMARKSMODEL_H
|
125
src/bookmarks/bookmarkstoolbar.cpp
Normal file
@ -0,0 +1,125 @@
|
||||
#include "bookmarkstoolbar.h"
|
||||
#include "qupzilla.h"
|
||||
#include "locationbar.h"
|
||||
#include "bookmarksmodel.h"
|
||||
|
||||
BookmarksToolbar::BookmarksToolbar(QupZilla* mainClass, QWidget *parent) :
|
||||
QToolBar(parent)
|
||||
,p_QupZilla(mainClass)
|
||||
,m_bookmarksModel(0)
|
||||
{
|
||||
setObjectName("bookmarksToolbar");
|
||||
setWindowTitle(tr("Bookmarks"));
|
||||
setStyleSheet("QToolBar{background-image:url(:icons/transp.png); border:none;}");
|
||||
setMovable(false);
|
||||
setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
|
||||
connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(customContextMenuRequested(QPoint)));
|
||||
QTimer::singleShot(0, this, SLOT(refreshBookmarks()));
|
||||
}
|
||||
|
||||
void BookmarksToolbar::setColor(QColor color)
|
||||
{
|
||||
setStyleSheet("QToolButton {color: "+color.name()+";}");
|
||||
}
|
||||
|
||||
void BookmarksToolbar::customContextMenuRequested(const QPoint &pos)
|
||||
{
|
||||
if (actionAt(pos))
|
||||
return;
|
||||
|
||||
QMenu menu;
|
||||
menu.addAction(tr("Bookmark Current Page"), p_QupZilla, SLOT(bookmarkPage()));
|
||||
menu.addAction(tr("Bookmark All Tabs"), p_QupZilla, SLOT(bookmarkAllTabs()));
|
||||
menu.addAction(QIcon::fromTheme("user-bookmarks"), tr("Organize Bookmarks"), p_QupZilla, SLOT(showBookmarksManager()));
|
||||
menu.addSeparator();
|
||||
menu.addAction(
|
||||
#ifdef Q_WS_X11
|
||||
style()->standardIcon(QStyle::SP_BrowserReload)
|
||||
#else
|
||||
QIcon(":/icons/faenza/reload.png")
|
||||
#endif
|
||||
,tr("Reload Toolbar"), this, SLOT(refreshBookmarks()));
|
||||
menu.addSeparator();
|
||||
menu.addAction(m_bookmarksModel->isShowingMostVisited() ? tr("Hide Most Visited") : tr("Show Most Visited"), this, SLOT(showMostVisited()));
|
||||
menu.addAction(tr("Hide Toolbar"), this, SLOT(hidePanel()));
|
||||
|
||||
//Prevent choosing first option with double rightclick
|
||||
QPoint position = QCursor::pos();
|
||||
QPoint p(position.x(), position.y()+1);
|
||||
menu.exec(p);
|
||||
}
|
||||
|
||||
void BookmarksToolbar::showMostVisited()
|
||||
{
|
||||
m_bookmarksModel->setShowingMostVisited(!m_bookmarksModel->isShowingMostVisited());
|
||||
refreshBookmarks();
|
||||
}
|
||||
|
||||
void BookmarksToolbar::hidePanel()
|
||||
{
|
||||
this->hide();
|
||||
p_QupZilla->acShowBookmarksToolbar()->setChecked(false);
|
||||
}
|
||||
|
||||
void BookmarksToolbar::refreshBookmarks()
|
||||
{
|
||||
if (!m_bookmarksModel)
|
||||
m_bookmarksModel =MainApplication::getInstance()->bookmarks();
|
||||
|
||||
clear();
|
||||
QSqlQuery query;
|
||||
query.exec("SELECT title, url FROM bookmarks WHERE folder='bookmarksToolbar'");
|
||||
while(query.next()) {
|
||||
QUrl url = query.value(1).toUrl();
|
||||
QString title = query.value(0).toString();
|
||||
QAction* action = new QAction(this);
|
||||
if (title.length()>15) {
|
||||
title.truncate(13);
|
||||
title+="..";
|
||||
}
|
||||
|
||||
action->setText(title);
|
||||
action->setData(url);
|
||||
action->setIcon(LocationBar::icon(url));
|
||||
QToolButton* button = new QToolButton(this);
|
||||
button->setDefaultAction(action);
|
||||
button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
|
||||
button->setMaximumHeight(25);
|
||||
connect(action, SIGNAL(triggered()), p_QupZilla, SLOT(loadActionUrl()));
|
||||
addWidget(button);
|
||||
}
|
||||
|
||||
if (!m_bookmarksModel->isShowingMostVisited())
|
||||
return;
|
||||
|
||||
QToolButton* mostVis = new QToolButton(this);
|
||||
mostVis->setPopupMode(QToolButton::InstantPopup);
|
||||
mostVis->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
|
||||
mostVis->setMaximumHeight(25);
|
||||
mostVis->setIcon(style()->standardIcon(QStyle::SP_DirIcon));
|
||||
mostVis->setText(tr("Most visited"));
|
||||
mostVis->setToolTip(tr("Sites You visited the most"));
|
||||
m_menuMostVisited = new QMenu();
|
||||
mostVis->setMenu(m_menuMostVisited);
|
||||
connect(m_menuMostVisited, SIGNAL(aboutToShow()), this, SLOT(refreshMostVisited()));
|
||||
|
||||
addWidget(mostVis);
|
||||
}
|
||||
|
||||
void BookmarksToolbar::refreshMostVisited()
|
||||
{
|
||||
m_menuMostVisited->clear();
|
||||
|
||||
QSqlQuery query;
|
||||
query.exec("SELECT title, url FROM history ORDER BY count DESC LIMIT 10");
|
||||
while(query.next()) {
|
||||
QUrl url = query.value(1).toUrl();
|
||||
QString title = query.value(0).toString();
|
||||
if (title.length()>40) {
|
||||
title.truncate(40);
|
||||
title+="..";
|
||||
}
|
||||
m_menuMostVisited->addAction(LocationBar::icon(url), title, p_QupZilla, SLOT(loadActionUrl()))->setData(url);
|
||||
}
|
||||
}
|
38
src/bookmarks/bookmarkstoolbar.h
Normal file
@ -0,0 +1,38 @@
|
||||
#ifndef BOOKMARKSTOOLBAR_H
|
||||
#define BOOKMARKSTOOLBAR_H
|
||||
|
||||
#if defined(QT_NO_DEBUG) & !defined(QT_NO_DEBUG_OUTPUT)
|
||||
#define QT_NO_DEBUG_OUTPUT
|
||||
#endif
|
||||
|
||||
#include <QToolBar>
|
||||
#include <QMenu>
|
||||
#include <QToolButton>
|
||||
|
||||
class QupZilla;
|
||||
class BookmarksModel;
|
||||
|
||||
class BookmarksToolbar : public QToolBar
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit BookmarksToolbar(QupZilla* mainClass, QWidget *parent = 0);
|
||||
void setColor(QColor color);
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
void refreshBookmarks();
|
||||
void refreshMostVisited();
|
||||
void customContextMenuRequested(const QPoint &pos);
|
||||
void hidePanel();
|
||||
void showMostVisited();
|
||||
|
||||
private:
|
||||
QupZilla* p_QupZilla;
|
||||
BookmarksModel* m_bookmarksModel;
|
||||
QMenu* m_menuMostVisited;
|
||||
|
||||
};
|
||||
|
||||
#endif // BOOKMARKSTOOLBAR_H
|
63
src/bookmarks/bookmarkswidget.cpp
Normal file
@ -0,0 +1,63 @@
|
||||
#include "bookmarkswidget.h"
|
||||
#include "ui_bookmarkswidget.h"
|
||||
#include "bookmarksmodel.h"
|
||||
#include "mainapplication.h"
|
||||
|
||||
BookmarksWidget::BookmarksWidget(int bookmarkId, QWidget *parent) :
|
||||
QMenu(parent)
|
||||
,ui(new Ui::BookmarksWidget)
|
||||
,m_bookmarkId(bookmarkId)
|
||||
,m_bookmarksModel(0)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
setAttribute(Qt::WA_DeleteOnClose);
|
||||
connect(ui->close, SIGNAL(clicked()), this, SLOT(close()));
|
||||
connect(ui->removeBookmark, SIGNAL(clicked()), this, SLOT(removeBookmark()));
|
||||
connect(ui->save, SIGNAL(clicked()), this, SLOT(saveBookmark()));
|
||||
|
||||
m_bookmarksModel = MainApplication::getInstance()->bookmarks();
|
||||
loadBookmark();
|
||||
}
|
||||
|
||||
void BookmarksWidget::loadBookmark()
|
||||
{
|
||||
QStringList bookmark = m_bookmarksModel->getBookmark(m_bookmarkId);
|
||||
ui->name->setText( bookmark.at(1) );
|
||||
|
||||
// Bookmark folders
|
||||
ui->folder->addItem(QIcon(":icons/other/unsortedbookmarks.png"), tr("Unsorted Bookmarks"), "unsorted");
|
||||
ui->folder->addItem(style()->standardIcon(QStyle::SP_DirOpenIcon), tr("Bookmarks In Menu"), "bookmarksMenu");
|
||||
ui->folder->addItem(style()->standardIcon(QStyle::SP_DirOpenIcon), tr("Bookmarks In ToolBar"), "bookmarksToolbar");
|
||||
QSqlQuery query;
|
||||
query.exec("SELECT name FROM folders");
|
||||
while(query.next())
|
||||
ui->folder->addItem(style()->standardIcon(QStyle::SP_DirIcon), query.value(0).toString(), query.value(0).toString());
|
||||
|
||||
ui->folder->setCurrentIndex( ui->folder->findData(bookmark.at(2)) );
|
||||
ui->name->setCursorPosition(0);
|
||||
}
|
||||
|
||||
void BookmarksWidget::removeBookmark()
|
||||
{
|
||||
m_bookmarksModel->removeBookmark(m_bookmarkId);
|
||||
emit bookmarkDeleted();
|
||||
close();
|
||||
}
|
||||
|
||||
void BookmarksWidget::saveBookmark()
|
||||
{
|
||||
m_bookmarksModel->editBookmark(m_bookmarkId, ui->name->text(), ui->folder->itemData(ui->folder->currentIndex()).toString() );
|
||||
close();
|
||||
}
|
||||
|
||||
void BookmarksWidget::showAt(QWidget* _parent)
|
||||
{
|
||||
QPoint p = _parent->mapToGlobal(QPoint(0, 0));
|
||||
move( (p.x()+_parent->width() ) - width(), p.y() + _parent->height());
|
||||
show();
|
||||
}
|
||||
|
||||
BookmarksWidget::~BookmarksWidget()
|
||||
{
|
||||
delete ui;
|
||||
}
|
48
src/bookmarks/bookmarkswidget.h
Normal file
@ -0,0 +1,48 @@
|
||||
#ifndef BOOKMARKSWIDGET_H
|
||||
#define BOOKMARKSWIDGET_H
|
||||
#if defined(QT_NO_DEBUG) & !defined(QT_NO_DEBUG_OUTPUT)
|
||||
#define QT_NO_DEBUG_OUTPUT
|
||||
#endif
|
||||
|
||||
#include <QMenu>
|
||||
#include <QFormLayout>
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
#include <QComboBox>
|
||||
#include <QLineEdit>
|
||||
#include <QMouseEvent>
|
||||
#include <QDebug>
|
||||
#include <QSqlQuery>
|
||||
#include <QSqlError>
|
||||
|
||||
namespace Ui {
|
||||
class BookmarksWidget;
|
||||
}
|
||||
|
||||
class BookmarksModel;
|
||||
class BookmarksWidget : public QMenu
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit BookmarksWidget(int bookmarkId, QWidget *parent = 0);
|
||||
~BookmarksWidget();
|
||||
void showAt(QWidget* _parent);
|
||||
|
||||
signals:
|
||||
void bookmarkDeleted();
|
||||
|
||||
public slots:
|
||||
|
||||
private slots:
|
||||
void removeBookmark();
|
||||
void saveBookmark();
|
||||
|
||||
private:
|
||||
void loadBookmark();
|
||||
|
||||
Ui::BookmarksWidget* ui;
|
||||
int m_bookmarkId;
|
||||
BookmarksModel* m_bookmarksModel;
|
||||
};
|
||||
|
||||
#endif // BOOKMARKSWIDGET_H
|
142
src/bookmarks/bookmarkswidget.ui
Normal file
@ -0,0 +1,142 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>BookmarksWidget</class>
|
||||
<widget class="QWidget" name="BookmarksWidget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>282</width>
|
||||
<height>166</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string/>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="Frame" name="frame">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<property name="horizontalSpacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="margin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="0" column="0" rowspan="2">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap resource="../icons.qrc">:/icons/other/bigstar.png</pixmap>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Edit This Bookmark</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QPushButton" name="removeBookmark">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Remove Bookmark</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Name:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="name"/>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>Folder:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QComboBox" name="folder"/>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<property name="spacing">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="save">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Save</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="close">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Close</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>Frame</class>
|
||||
<extends>QFrame</extends>
|
||||
<header>frame.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources>
|
||||
<include location="../icons.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
112
src/cookies/cookiejar.cpp
Normal file
@ -0,0 +1,112 @@
|
||||
#include "cookiejar.h"
|
||||
#include "qupzilla.h"
|
||||
#define COOKIE_DEBUG
|
||||
|
||||
//TODO: black/white listing
|
||||
CookieJar::CookieJar(QupZilla* mainClass, QObject *parent) :
|
||||
QNetworkCookieJar(parent)
|
||||
,p_QupZilla(mainClass)
|
||||
{
|
||||
loadSettings();
|
||||
// activeProfil = MainApplication::getInstance()->getActiveProfil();
|
||||
m_activeProfil = MainApplication::getInstance()->getActiveProfil();
|
||||
}
|
||||
|
||||
void CookieJar::loadSettings()
|
||||
{
|
||||
QSettings settings(m_activeProfil+"settings.ini", QSettings::IniFormat);
|
||||
settings.beginGroup("Web-Browser-Settings");
|
||||
m_allowCookies = settings.value("allowCookies",true).toBool();
|
||||
m_allowCookiesFromDomain = settings.value("allowCookiesFromVisitedDomainOnly",false).toBool();
|
||||
m_filterTrackingCookie = settings.value("filterTrackingCookie",false).toBool();
|
||||
m_deleteOnClose = settings.value("deleteCookiesOnClose", false).toBool();
|
||||
}
|
||||
|
||||
void CookieJar::setAllowCookies(bool allow)
|
||||
{
|
||||
m_allowCookies = allow;
|
||||
}
|
||||
|
||||
bool CookieJar::setCookiesFromUrl(const QList<QNetworkCookie> &cookieList, const QUrl &url)
|
||||
{
|
||||
if (!m_allowCookies)
|
||||
return QNetworkCookieJar::setCookiesFromUrl(QList<QNetworkCookie>(), url);
|
||||
|
||||
QList<QNetworkCookie> newList = cookieList;
|
||||
QDateTime now = QDateTime::currentDateTime();
|
||||
|
||||
foreach (QNetworkCookie cok, newList) {
|
||||
if (m_allowCookiesFromDomain && !url.toString().contains(cok.domain())) {
|
||||
#ifdef COOKIE_DEBUG
|
||||
qDebug() << "purged for domain mismatch" << cok;
|
||||
#endif
|
||||
newList.removeOne(cok);
|
||||
continue;
|
||||
}
|
||||
if (m_filterTrackingCookie && cok.expirationDate() > now.addYears(2)) {
|
||||
#ifdef COOKIE_DEBUG
|
||||
qDebug() << "purged as tracking " << cok;
|
||||
#endif
|
||||
newList.removeOne(cok);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return QNetworkCookieJar::setCookiesFromUrl(newList, url);
|
||||
}
|
||||
|
||||
void CookieJar::saveCookies()
|
||||
{
|
||||
if (m_deleteOnClose)
|
||||
return;
|
||||
|
||||
QList<QNetworkCookie> allCookies = getAllCookies();
|
||||
QFile file(m_activeProfil+"cookies.dat");
|
||||
file.open(QIODevice::WriteOnly);
|
||||
QDataStream stream(&file);
|
||||
int count = allCookies.count();
|
||||
|
||||
stream << count;
|
||||
for (int i = 0; i<count; i++) {
|
||||
stream << allCookies.at(i).toRawForm();
|
||||
}
|
||||
|
||||
file.close();
|
||||
}
|
||||
|
||||
void CookieJar::restoreCookies()
|
||||
{
|
||||
if (!QFile::exists(m_activeProfil+"cookies.dat"))
|
||||
return;
|
||||
QDateTime now = QDateTime::currentDateTime();
|
||||
|
||||
QList<QNetworkCookie> restoredCookies;
|
||||
QFile file(m_activeProfil+"cookies.dat");
|
||||
file.open(QIODevice::ReadOnly);
|
||||
QDataStream stream(&file);
|
||||
int count;
|
||||
|
||||
stream >> count;
|
||||
for (int i = 0; i<count; i++) {
|
||||
QByteArray rawForm;
|
||||
stream >> rawForm;
|
||||
QNetworkCookie cok = QNetworkCookie::parseCookies(rawForm).at(0);
|
||||
if (cok.expirationDate() < now)
|
||||
continue;
|
||||
if (cok.isSessionCookie())
|
||||
continue;
|
||||
restoredCookies.append(cok);
|
||||
}
|
||||
|
||||
file.close();
|
||||
setAllCookies(restoredCookies);
|
||||
}
|
||||
|
||||
QList<QNetworkCookie> CookieJar::getAllCookies()
|
||||
{
|
||||
return QNetworkCookieJar::allCookies();
|
||||
}
|
||||
|
||||
void CookieJar::setAllCookies(const QList<QNetworkCookie> &cookieList)
|
||||
{
|
||||
QNetworkCookieJar::setAllCookies(cookieList);
|
||||
}
|
43
src/cookies/cookiejar.h
Normal file
@ -0,0 +1,43 @@
|
||||
#ifndef COOKIEJAR_H
|
||||
#define COOKIEJAR_H
|
||||
|
||||
#if defined(QT_NO_DEBUG) & !defined(QT_NO_DEBUG_OUTPUT)
|
||||
#define QT_NO_DEBUG_OUTPUT
|
||||
#endif
|
||||
|
||||
#include <QNetworkCookieJar>
|
||||
#include <QDebug>
|
||||
#include <QSettings>
|
||||
#include <QDateTime>
|
||||
#include <QFile>
|
||||
|
||||
class QupZilla;
|
||||
class CookieJar : public QNetworkCookieJar
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit CookieJar(QupZilla* mainClass, QObject *parent = 0);
|
||||
|
||||
void loadSettings();
|
||||
bool setCookiesFromUrl(const QList<QNetworkCookie> &cookieList, const QUrl &url);
|
||||
QList<QNetworkCookie> getAllCookies();
|
||||
void setAllCookies(const QList<QNetworkCookie> &cookieList);
|
||||
void saveCookies();
|
||||
void restoreCookies();
|
||||
void setAllowCookies(bool allow);
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
|
||||
private:
|
||||
QupZilla* p_QupZilla;
|
||||
bool m_allowCookies;
|
||||
bool m_filterTrackingCookie;
|
||||
bool m_allowCookiesFromDomain;
|
||||
bool m_deleteOnClose;
|
||||
|
||||
QString m_activeProfil;
|
||||
};
|
||||
|
||||
#endif // COOKIEJAR_H
|
171
src/cookies/cookiemanager.cpp
Normal file
@ -0,0 +1,171 @@
|
||||
#include "cookiemanager.h"
|
||||
#include "ui_cookiemanager.h"
|
||||
#include "qupzilla.h"
|
||||
#include "cookiejar.h"
|
||||
#include "mainapplication.h"
|
||||
|
||||
CookieManager::CookieManager(QWidget *parent) :
|
||||
QWidget(parent)
|
||||
,ui(new Ui::CookieManager)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
//CENTER on scren
|
||||
const QRect screen = QApplication::desktop()->screenGeometry();
|
||||
const QRect &size = QWidget::geometry();
|
||||
QWidget::move( (screen.width()-size.width())/2, (screen.height()-size.height())/2 );
|
||||
|
||||
//QTimer::singleShot(0, this, SLOT(refreshTable()));
|
||||
|
||||
connect(ui->cookieTree, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),this, SLOT(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)));
|
||||
connect(ui->removeAll, SIGNAL(clicked()), this, SLOT(removeAll()));
|
||||
connect(ui->removeCookie, SIGNAL(clicked()), this, SLOT(removeCookie()));
|
||||
connect(ui->close, SIGNAL(clicked(QAbstractButton*)), this, SLOT(hide()));
|
||||
connect(ui->search, SIGNAL(returnPressed()), this, SLOT(search()));
|
||||
connect(ui->search, SIGNAL(cursorPositionChanged(int, int)), this, SLOT(search()));
|
||||
|
||||
ui->search->setInactiveText(tr("Search"));
|
||||
}
|
||||
|
||||
void CookieManager::removeAll()
|
||||
{
|
||||
QMessageBox::StandardButton button = QMessageBox::warning(this, tr("Confirmation"),
|
||||
tr("Are you sure to delete all cookies on your computer?"), QMessageBox::Yes | QMessageBox::No);
|
||||
if (button != QMessageBox::Yes)
|
||||
return;
|
||||
|
||||
m_cookies.clear();
|
||||
MainApplication::getInstance()->cookieJar()->setAllCookies(m_cookies);
|
||||
ui->cookieTree->clear();
|
||||
}
|
||||
|
||||
void CookieManager::removeCookie()
|
||||
{
|
||||
QTreeWidgetItem* current = ui->cookieTree->currentItem();
|
||||
if (!current)
|
||||
return;
|
||||
|
||||
if (current->text(1).isEmpty()) { //Remove whole cookie group
|
||||
QString domain = current->whatsThis(0);
|
||||
foreach(QNetworkCookie cok, m_cookies) {
|
||||
if (cok.domain() == domain || cok.domain() == domain.mid(1))
|
||||
m_cookies.removeOne(cok);
|
||||
}
|
||||
|
||||
delete current;
|
||||
MainApplication::getInstance()->cookieJar()->setAllCookies(m_cookies);
|
||||
refreshTable(false);
|
||||
return;
|
||||
}
|
||||
|
||||
int index = current->whatsThis(1).toInt();
|
||||
m_cookies.removeAt(index);
|
||||
MainApplication::getInstance()->cookieJar()->setAllCookies(m_cookies);
|
||||
refreshTable(false);
|
||||
|
||||
if (!ui->search->text().isEmpty())
|
||||
search();
|
||||
}
|
||||
|
||||
void CookieManager::currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *parent)
|
||||
{
|
||||
Q_UNUSED(parent);
|
||||
if (!current)
|
||||
return;
|
||||
|
||||
ui->removeCookie->setEnabled(true);
|
||||
|
||||
if (current->text(1).isEmpty()) {
|
||||
ui->name->setText(tr("<cookie not selected>"));
|
||||
ui->value->setText(tr("<cookie not selected>"));
|
||||
ui->server->setText(tr("<cookie not selected>"));
|
||||
ui->path->setText(tr("<cookie not selected>"));
|
||||
ui->secure->setText(tr("<cookie not selected>"));
|
||||
ui->expiration->setText(tr("<cookie not selected>"));
|
||||
ui->removeCookie->setText(tr("Remove cookies"));
|
||||
return;
|
||||
}
|
||||
ui->removeCookie->setText(tr("Remove cookie"));
|
||||
|
||||
int index = current->whatsThis(1).toInt();
|
||||
QNetworkCookie cok = m_cookies.at(index);
|
||||
|
||||
ui->name->setText(cok.name());
|
||||
ui->value->setText(cok.value());
|
||||
ui->server->setText(cok.domain());
|
||||
ui->path->setText(cok.path());
|
||||
cok.isSecure() ? ui->secure->setText(tr("Secure only")) : ui->secure->setText(tr("All connections"));
|
||||
cok.isSessionCookie() ? ui->expiration->setText(tr("Session cookie")) : ui->expiration->setText(QDateTime(cok.expirationDate()).toString("hh:mm:ss dddd d. MMMM yyyy"));
|
||||
|
||||
}
|
||||
|
||||
void CookieManager::refreshTable(bool refreshCookieJar)
|
||||
{
|
||||
if (refreshCookieJar)
|
||||
m_cookies = MainApplication::getInstance()->cookieJar()->getAllCookies();
|
||||
|
||||
ui->cookieTree->setUpdatesEnabled(false);
|
||||
ui->cookieTree->clear();
|
||||
|
||||
QString cookServer;
|
||||
for (int i = 0; i<m_cookies.count(); i++) {
|
||||
QNetworkCookie cok = m_cookies.at(i);
|
||||
QTreeWidgetItem* item;
|
||||
|
||||
cookServer = cok.domain();
|
||||
if (cookServer.startsWith("."))
|
||||
cookServer = cookServer.mid(1);
|
||||
|
||||
QList<QTreeWidgetItem*> findParent = ui->cookieTree->findItems(cookServer, 0);
|
||||
if (findParent.count() == 1) {
|
||||
item = new QTreeWidgetItem(findParent.at(0));
|
||||
}else{
|
||||
QTreeWidgetItem* newParent = new QTreeWidgetItem(ui->cookieTree);
|
||||
newParent->setText(0, cookServer);
|
||||
newParent->setIcon(0, style()->standardIcon(QStyle::SP_DirIcon));
|
||||
newParent->setWhatsThis(0, cok.domain());
|
||||
ui->cookieTree->addTopLevelItem(newParent);
|
||||
item = new QTreeWidgetItem(newParent);
|
||||
}
|
||||
|
||||
item->setText(0,"."+cookServer);
|
||||
item->setText(1, cok.name());
|
||||
item->setWhatsThis(1, QString::number(i));
|
||||
ui->cookieTree->addTopLevelItem(item);
|
||||
}
|
||||
|
||||
ui->cookieTree->setUpdatesEnabled(true);
|
||||
}
|
||||
|
||||
void CookieManager::search()
|
||||
{
|
||||
QString searchText = ui->search->text();
|
||||
if (searchText.isEmpty()) {
|
||||
refreshTable(false);
|
||||
return;
|
||||
}
|
||||
|
||||
refreshTable(false);
|
||||
ui->cookieTree->setUpdatesEnabled(false);
|
||||
|
||||
QList<QTreeWidgetItem*> items = ui->cookieTree->findItems(".*"+searchText+"*", Qt::MatchRecursive | Qt::MatchWildcard);
|
||||
|
||||
QList<QTreeWidgetItem*> foundItems;
|
||||
foreach(QTreeWidgetItem* fitem, items) {
|
||||
if (!fitem->text(0).startsWith("."))
|
||||
continue;
|
||||
QTreeWidgetItem* item = new QTreeWidgetItem();
|
||||
item->setText(0, fitem->text(0));
|
||||
item->setText(1, fitem->text(1));
|
||||
item->setWhatsThis(1, fitem->whatsThis(1));
|
||||
foundItems.append(item);
|
||||
}
|
||||
ui->cookieTree->clear();
|
||||
ui->cookieTree->addTopLevelItems(foundItems);
|
||||
ui->cookieTree->setUpdatesEnabled(true);
|
||||
}
|
||||
|
||||
CookieManager::~CookieManager()
|
||||
{
|
||||
qDebug() << __FUNCTION__ << "called";
|
||||
delete ui;
|
||||
}
|
41
src/cookies/cookiemanager.h
Normal file
@ -0,0 +1,41 @@
|
||||
#ifndef COOKIEMANAGER_H
|
||||
#define COOKIEMANAGER_H
|
||||
|
||||
#if defined(QT_NO_DEBUG) & !defined(QT_NO_DEBUG_OUTPUT)
|
||||
#define QT_NO_DEBUG_OUTPUT
|
||||
#endif
|
||||
|
||||
#include <QWidget>
|
||||
#include <QTimer>
|
||||
#include <QNetworkCookie>
|
||||
#include <QTreeWidgetItem>
|
||||
|
||||
namespace Ui {
|
||||
class CookieManager;
|
||||
}
|
||||
|
||||
class QupZilla;
|
||||
class CookieManager : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit CookieManager(QWidget *parent = 0);
|
||||
~CookieManager();
|
||||
|
||||
public slots:
|
||||
void refreshTable(bool refreshCookieJar = true);
|
||||
|
||||
private slots:
|
||||
void currentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* parent);
|
||||
void removeCookie();
|
||||
void removeAll();
|
||||
void search();
|
||||
|
||||
private:
|
||||
Ui::CookieManager *ui;
|
||||
|
||||
QList<QNetworkCookie> m_cookies;
|
||||
};
|
||||
|
||||
#endif // COOKIEMANAGER_H
|
250
src/cookies/cookiemanager.ui
Normal file
@ -0,0 +1,250 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>CookieManager</class>
|
||||
<widget class="QWidget" name="CookieManager">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>617</width>
|
||||
<height>415</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Cookies</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset resource="../icons.qrc">
|
||||
<normaloff>:/icons/qupzilla.png</normaloff>:/icons/qupzilla.png</iconset>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Find: </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="LineEdit" name="search"/>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="2">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>These cookies are stored on your computer:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2">
|
||||
<widget class="QTreeWidget" name="cookieTree">
|
||||
<property name="sortingEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<attribute name="headerVisible">
|
||||
<bool>true</bool>
|
||||
</attribute>
|
||||
<attribute name="headerDefaultSectionSize">
|
||||
<number>200</number>
|
||||
</attribute>
|
||||
<attribute name="headerMinimumSectionSize">
|
||||
<number>22</number>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Server</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Cookie name</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="2">
|
||||
<widget class="QFrame" name="frame">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::StyledPanel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="horizontalSpacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="verticalSpacing">
|
||||
<number>3</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Name:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>Value:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string>Server:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>Path:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string>Secure:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QLabel" name="label_8">
|
||||
<property name="text">
|
||||
<string>Expiration:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="SqueezeLabel" name="name">
|
||||
<property name="text">
|
||||
<string><cookie not selected></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="SqueezeLabel" name="value">
|
||||
<property name="text">
|
||||
<string><cookie not selected></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="SqueezeLabel" name="server">
|
||||
<property name="text">
|
||||
<string><cookie not selected></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="SqueezeLabel" name="path">
|
||||
<property name="text">
|
||||
<string><cookie not selected></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="SqueezeLabel" name="secure">
|
||||
<property name="text">
|
||||
<string><cookie not selected></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="SqueezeLabel" name="expiration">
|
||||
<property name="text">
|
||||
<string><cookie not selected></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0" colspan="2">
|
||||
<widget class="QFrame" name="frame_2">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<property name="margin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QPushButton" name="removeAll">
|
||||
<property name="text">
|
||||
<string>Remove all cookies</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="removeCookie">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Remove cookie</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Del</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="close">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Close</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>LineEdit</class>
|
||||
<extends>QLineEdit</extends>
|
||||
<header>lineedit.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>SqueezeLabel</class>
|
||||
<extends>QLabel</extends>
|
||||
<header>squeezelabel.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources>
|
||||
<include location="../icons.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
6
src/data/html.qrc
Normal file
@ -0,0 +1,6 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>html/errorPage.html</file>
|
||||
<file>html/info.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
73
src/data/html/errorPage.html
Normal file
@ -0,0 +1,73 @@
|
||||
<html><head>
|
||||
<title>%TITLE%</title>
|
||||
<link rel="icon" href="data:image/png;base64,%FAVICON%" type="image/x-icon" />
|
||||
<style>
|
||||
body {
|
||||
padding: 3em 0em;
|
||||
background: #eeeeee;
|
||||
}
|
||||
hr {
|
||||
color: lightgray;
|
||||
width: 100%;
|
||||
}
|
||||
img {
|
||||
float: left;
|
||||
margin-left: -20px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
#box {
|
||||
background: white;
|
||||
border: 1px solid lightgrey;
|
||||
max-width: 700px;
|
||||
max-height: 330px;
|
||||
overflow:auto;
|
||||
padding: 20px 20px 30px 50px;
|
||||
margin: auto;
|
||||
border-radius: 15px;
|
||||
|
||||
}
|
||||
h1 {
|
||||
font-size: 150%;
|
||||
font-weight: bold;
|
||||
border-bottom: 1px solid #f4f4f4;
|
||||
margin-left: 48px;
|
||||
margin-right: 50px;
|
||||
}
|
||||
h2 {
|
||||
font-size: 100%;
|
||||
font-weight: normal;
|
||||
border-bottom: 1px solid #f4f4f4;
|
||||
margin-left: 48px;
|
||||
padding: 5px 0px 20px 2px;
|
||||
margin-right: 50px;
|
||||
}
|
||||
ul {
|
||||
font-size: 90%;
|
||||
padding-left: 48px;
|
||||
margin: 20px 0;
|
||||
max-width:600px;
|
||||
}
|
||||
|
||||
li {
|
||||
padding: 5px;
|
||||
}
|
||||
#reloadButton {
|
||||
padding-left: 48px;
|
||||
margin-top: 20px;
|
||||
min-width: 100px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="box">
|
||||
<img src="data:image/png;base64,%IMAGE%" >
|
||||
<h1>%HEADING%</h1>
|
||||
<h2>%HEADING2%</h2>
|
||||
<ul>
|
||||
<li>%LI-1%</li>
|
||||
<li>%LI-2%</li>
|
||||
<li>%LI-3%</li>
|
||||
<input type="submit" id="reloadButton" value="%TRY-AGAIN%" onclick="window.location.reload()">
|
||||
</ul>
|
||||
</div>
|
||||
</body></html>
|
BIN
src/data/html/info.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
68
src/data/icons.qrc
Normal file
@ -0,0 +1,68 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>icons/navigation/home.png</file>
|
||||
<file>icons/navigation/reload.png</file>
|
||||
<file>icons/navigation/stop.png</file>
|
||||
<file>icons/navigation/vpred.png</file>
|
||||
<file>icons/navigation/zpet.png</file>
|
||||
<file>icons/qupzilla.png</file>
|
||||
<file>icons/qupzillaupdate.png</file>
|
||||
<file>icons/preferences/applications-accessories.png</file>
|
||||
<file>icons/preferences/applications-internet.png</file>
|
||||
<file>icons/preferences/applications-system.png</file>
|
||||
<file>icons/preferences/applications-webbrowsers.png</file>
|
||||
<file>icons/preferences/contact-new.png</file>
|
||||
<file>icons/preferences/preferences-desktop.png</file>
|
||||
<file>icons/preferences/gnome-window-manager.png</file>
|
||||
<file>icons/preferences/history_entry.png</file>
|
||||
<file>icons/preferences/stock_inbox.png</file>
|
||||
<file>icons/faenza/back.png</file>
|
||||
<file>icons/faenza/close.png</file>
|
||||
<file>icons/faenza/forward.png</file>
|
||||
<file>icons/faenza/home.png</file>
|
||||
<file>icons/faenza/reload.png</file>
|
||||
<file>icons/faenza/source.png</file>
|
||||
<file>icons/faenza/stop.png</file>
|
||||
<file>icons/preferences/extension.png</file>
|
||||
<file>icons/faenza/settings.png</file>
|
||||
<file>qupzilla.png</file>
|
||||
<file>icons/locationbar/arrow-down.gif</file>
|
||||
<file>icons/locationbar/gotoaddress.png</file>
|
||||
<file>icons/locationbar/lineedit.png</file>
|
||||
<file>icons/locationbar/privatebrowsing.png</file>
|
||||
<file>icons/locationbar/safeline.png</file>
|
||||
<file>icons/locationbar/search.png</file>
|
||||
<file>icons/locationbar/searchchoose.png</file>
|
||||
<file>icons/locationbar/secure.gif</file>
|
||||
<file>icons/locationbar/unknownpage.png</file>
|
||||
<file>icons/menu/bookmark_add.png</file>
|
||||
<file>icons/menu/book_open_mark.png</file>
|
||||
<file>icons/menu/bug_magnify.png</file>
|
||||
<file>icons/menu/circle.png</file>
|
||||
<file>icons/menu/csfd.png</file>
|
||||
<file>icons/menu/cz_seznam.png</file>
|
||||
<file>icons/menu/flash.png</file>
|
||||
<file>icons/menu/google.png</file>
|
||||
<file>icons/menu/history.png</file>
|
||||
<file>icons/menu/history_entry.png</file>
|
||||
<file>icons/menu/icon-wikipedia.png</file>
|
||||
<file>icons/menu/popup.png</file>
|
||||
<file>icons/menu/qt.png</file>
|
||||
<file>icons/menu/rss.png</file>
|
||||
<file>icons/menu/youtube.png</file>
|
||||
<file>icons/other/about.png</file>
|
||||
<file>icons/other/feed.png</file>
|
||||
<file>icons/other/plus.png</file>
|
||||
<file>icons/other/progress.gif</file>
|
||||
<file>icons/navigation/search.gif</file>
|
||||
<file>icons/locationbar/star.png</file>
|
||||
<file>icons/locationbar/starg.png</file>
|
||||
<file>icons/other/bigstar.png</file>
|
||||
<file>icons/other/unsortedbookmarks.png</file>
|
||||
<file>icons/locationbar/accept.png</file>
|
||||
<file>icons/locationbar/warning.png</file>
|
||||
<file>icons/other/flash.png</file>
|
||||
<file>icons/other/flashstart.png</file>
|
||||
<file>icons/other/keys.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
BIN
src/data/icons/faenza/back.png
Normal file
After Width: | Height: | Size: 533 B |
BIN
src/data/icons/faenza/close.png
Normal file
After Width: | Height: | Size: 693 B |
BIN
src/data/icons/faenza/forward.png
Normal file
After Width: | Height: | Size: 546 B |
BIN
src/data/icons/faenza/home.png
Normal file
After Width: | Height: | Size: 562 B |
BIN
src/data/icons/faenza/reload.png
Normal file
After Width: | Height: | Size: 773 B |
BIN
src/data/icons/faenza/settings.png
Normal file
After Width: | Height: | Size: 584 B |
BIN
src/data/icons/faenza/source.png
Normal file
After Width: | Height: | Size: 601 B |
BIN
src/data/icons/faenza/stop.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/data/icons/lineedit.psd
Normal file
BIN
src/data/icons/locationbar/accept.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/data/icons/locationbar/arrow-down.gif
Normal file
After Width: | Height: | Size: 54 B |
BIN
src/data/icons/locationbar/gotoaddress.png
Normal file
After Width: | Height: | Size: 612 B |
BIN
src/data/icons/locationbar/lineedit.png
Normal file
After Width: | Height: | Size: 569 B |
BIN
src/data/icons/locationbar/privatebrowsing.png
Normal file
After Width: | Height: | Size: 963 B |
BIN
src/data/icons/locationbar/safeline.png
Normal file
After Width: | Height: | Size: 997 B |
BIN
src/data/icons/locationbar/search.png
Normal file
After Width: | Height: | Size: 808 B |
BIN
src/data/icons/locationbar/searchchoose.png
Normal file
After Width: | Height: | Size: 655 B |
BIN
src/data/icons/locationbar/secure.gif
Normal file
After Width: | Height: | Size: 249 B |
BIN
src/data/icons/locationbar/star.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
src/data/icons/locationbar/starg.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
src/data/icons/locationbar/unknownpage.png
Normal file
After Width: | Height: | Size: 819 B |
BIN
src/data/icons/locationbar/warning.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
src/data/icons/menu/book_open_mark.png
Normal file
After Width: | Height: | Size: 658 B |
BIN
src/data/icons/menu/bookmark_add.png
Normal file
After Width: | Height: | Size: 767 B |
BIN
src/data/icons/menu/bug_magnify.png
Normal file
After Width: | Height: | Size: 852 B |
BIN
src/data/icons/menu/circle.png
Normal file
After Width: | Height: | Size: 459 B |