Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] Navy, mon navigateur internet personnel

Sujet résolu
7 mai 2012 à 19:45:11

Information : Le projet est abandonné, les fichiers à télécharger ne sont plus disponible !!!

Introduction

Bonjour, je suis Aero15, j'ai 15 ans (2012) et je suis au lycée. J'ai créé un navigateur internet open source et libre parce que j'en avais besoin pour éradiquer IE et surtout renforcer mes bases du C++ et Qt.

Présentation

Navy est un navigateur internet basée sur rien du tout, mais reprenant les fonctionnalités principaux de l'ancien Navy. Dans cette version, j'ai décidé de faire des classes, une meilleur gestion des thèmes, j'ai rajouté un écran verrouiller et un petit speed dial qui ne fonctionne pas ;( et j'ai pu gerer l'historique et les favoris. Depuis la sortie de Navy 2.1, j'ai décidé de changer de cycle, maintenant, Navy sortira tous les 15 du mois en version beta (sauf s'il y a un dérangement), et la version finale sortira le premier jour du prochain mois !


PS : Navy 2.0 et 2.1 a été développé par moi et un membre du site du zéro, il m'a bien aidé, alors que je ne lui ai rien demandé, c'est pour cela que je vais mentionner son nom ici : CPlusPlusdric :)

Capture d'écran

Navy 2.6 sous Windows 7 Basic

Navy 2.6 sous Windows 7

Liens

Le site : http://navy.legtux.org/

Télécharger : http://navy.legtux.org/get.php

Etat du projet

Abandonné

Je l'ai abandonné aux alentours du 20 Juin 2013, parce que je m’ennuyais beaucoup, donc j'ai décidé de l'abandonner et de chercher une idée assez originale comme projet. Bref, si vous êtes développeur C++ Qt, et que vous voulez un petit souvenir de Navy, c'est par ici. Les fichiers à télécharger ne sont plus disponibles, dommage.

Maintenant, Dooscape

Comme j'ai abandonné Navy, je l'ai regretté quelques mois plus tard, donc j'ai développé un nouveau navigateur appelé Dooscape, dont les premières version sont basé sur le Browser Example de Qt. Ce navigateur par rapport à Navy, est plus complet, et mis à jour. La version actuelle est la 0.3 (sera à partir du 1er Juillet 2014). Après on fera un voyage dans le temps pour passer à la version 1.0.

Modifs

v0.1 :

  • Retouche de l'interface (bye bye la barre de menu qui est regroupé dans un bouton menu, barre des favoris cachée, interface "stylisé")
  • Nouvelles icones
  • Traduction en français et en anglais
  • Nouvelle page d'accueil

v0.2 :

  • Retouche de l'interface (Style flat mais en pire)
  • Nouvelles icones (Style flat aussi en pire)
  • Page d'accueil revisité (Style affreux et moche)
  • Correction des bugs (téléchargement des fichiers, connexion interrompue, et encodage des éléments texte de l'interface en UTF-8)

v0.3 :

  • Nouvelle interface (icones, thèmes)
  • Interface personnalisable (Choisir la couleur pour l'arrière plan)
  • Nouvelle page d'erreur
  • Le logo chargement dans la barre d'outils n'est plus là
  • Changement de moteur de recherche (Bing)
  • Nouvelle page d'accueil en ligne (http://doosearch.esy.es)
  • Nouvelle fonction Verrouiller l'écran avec la possibilité de mettre un mot de passe
  • Fenêtre Configuration agrandie
  • Démarrage plus rapide (un bug ralentissait le démarrage)

-
Edité par aero15 15 juillet 2014 à 13:55:52

  • Partager sur Facebook
  • Partager sur Twitter
7 mai 2012 à 21:02:20

(bon je te descends un peu mais après je serai gentil hein :p )

Je vois que c'est un projet assez soigné, mais actuellement je ne vois pas ce qu'il apporte par rapport aux autres navigateurs. Je dois en avoir 6 différents installés sur mon PC (pour des raisons de compatibilité) et je ne vois pas en quoi l'un se démarque vraiment d'un autre. A la limite certains jouent sur la simplicité, d'autres sur les fonctionnalités... mais au final rien de bien méchant.
Donc je me pose la question : qu'aportera le tien ?

Bon maintenant que j'ai été un peu méchant, je voudrais aborder ce point :

Citation

Navy propose actuellement aucune innovation (pour l'instant), mais on peut voir qu'il a un avenir bien à lui (par rapport à zNavigo). Loin d'être le meilleur, son bût n'est pas de concurrencer les autres navigateurs, mais de corriger les défauts des autres navigateurs.


Donc apparemment, tu voudrais corriger les défauts actuels. C'est déjà un bon point, tu te mets une ambition autre qu'un simple exercice.
Ce que je pense que tu pourrais faire (en réponse à la première partie de mon post), pour apporter vraiment quelque chose de plus par rapport aux autres, ça serait de faire une interface entièrement (ou presque) gérée par la souris. Opera permet déjà un peu la navigation via la souris, mais je pense qu'il y aurait moyen de pousser le concept encore plus loin.

Voilà c'est une idée, c'est ce que je rechercherais pour un navigateur acuellement. Donc qui sait, si tu pouvais faire ça, t'aurais au moins un utilisateur :)
  • Partager sur Facebook
  • Partager sur Twitter
8 mai 2012 à 11:34:07

Je suis débutant ! J'ai des difficultés et je suis très largement en retard par rapport aux autres navigateur donc je fais de mon mieux. Et c'était à l'origine mon navigateur personnel.
Et pour la navigation à la souris, c'est trop compliqué. Je commence par intégrer les fonctionnalités de base d'un navigateur. Puis à la fin je "compliquerai" les choses.

Sinon t'as pas d'autres idées.
  • Partager sur Facebook
  • Partager sur Twitter
8 mai 2012 à 22:51:40

Ca à l'air sympa !

Dans les autres idées : essaye d'implémenter des gestures pour les trackpads le permettant (ce qui est assez courant de nos jours). Ca, ça serait une vraie innovation par rapport aux autres navigateurs !
  • Partager sur Facebook
  • Partager sur Twitter
9 mai 2012 à 4:46:26

OK, je verrai merci !!! :-°
  • Partager sur Facebook
  • Partager sur Twitter
14 mai 2012 à 16:22:36

Intéressant.
Mais, ton navigateur est-il compatible sous Mac et Linux ?
Sur le site, il est dit que non !
^^
Après, je sais pas ce que ton naviguateur apportera de mieux aux autre, mais faut dire que je suis impressioné :D
Quel language utilisé ?
  • Partager sur Facebook
  • Partager sur Twitter

Null.

14 mai 2012 à 16:34:59

Citation : Saiyajin

Intéressant.
Mais, ton navigateur est-il compatible sous Mac et Linux ?
Sur le site, il est dit que non !
^^
Après, je sais pas ce que ton naviguateur apportera de mieux aux autre, mais faut dire que je suis impressioné :D
Quel language utilisé ?


La réponse est donnée sur le post juste au-dessus :-°
  • Partager sur Facebook
  • Partager sur Twitter
15 mai 2012 à 0:20:33

J'ai lu toute la présentation hein ... :-°
  • Partager sur Facebook
  • Partager sur Twitter

Null.

16 mai 2012 à 20:48:54

Un projet ambitieux mais bien fondé , que du bonheur pour toi. Et même si ton navigateur ne devient pas le meilleur des supers mega bon navigateur, tu auras appris des milliers de choses :) bonne continuation .
  • Partager sur Facebook
  • Partager sur Twitter
21 mai 2012 à 13:05:49

J'ai refait l'interface de Navy mais des bugs énormes (juste pour exagerer) surgissent, etj'ai besoin d'internet pour savoir d'ou vient le problème et je suis coupé d'internet pendant 1 semaine à cause des travaux chez moi, et la je suis sur le poste du CDI. L'interface de Navy 1.7 est similaire à Google Chrome et beaucoup de nouveautés mais des bugs restent à corriger. Je publierai quelques aperçu quand je le pourrait.
---------------------------------
J'ai mis à jour mon 1er post j'ai ajouté la capture d'écran de Navy 1.7 Beta
  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2012 à 14:10:41

Les commandes gestuelles sont trop compliquées pour moi, et je doit faire face aux bugs de mon navigateur.

Quelques fonctionnalités tels que Ouvrir Enregistrer Etc ne fonctionnent pas nettement comme il faut, je pense que la nouvelle interface pause problème ou sinon faut que je vérifie toutes les connections.

Je mets le code ici car je ne supporte plus d’être coupé d'internet (chez moi):

FenPrincipale.cpp


#include "FenPrincipale.h"
#include "mylineedit.h"
#include "mylineedit.cpp"

#ifdef Q_WS_WIN
#include <windows.h>
#include <qt_windows.h>

using namespace std;

typedef struct
{
  int cxLeftWidth;
  int cxRightWidth;
  int cyTopHeight;
  int cyBottomHeight;
} MARGINS;
typedef HRESULT (WINAPI *PtrDwmExtendFrameIntoClientArea)(HWND hWnd, const MARGINS *margins);
typedef HRESULT (WINAPI *PtrDwmIsCompositionEnabled)(BOOL *pfEnabled);
#endif


FenPrincipale::FenPrincipale()
{
    // Génération des widgets de la fenêtre principale
    creerActions();
    //creerMenusEtBarresOutils();
    creerBarreEtat();

    // Génération des onglets et chargement de la page d'accueil
    onglets = new QTabWidget;

            setStyleSheet("QTabBar::tab {width:200px;height:30;\
}\
         QTabBar::close-button {\
             image: url(\":/images/fermerOnglet.png\");\
             subcontrol-position: right;\
         }\
         QTabBar::close-button:hover {\
             image: url(\":/images/fermerOngletHover.png\");}");

    onglets->setMovable(true);
    onglets->setDocumentMode(true);
    onglets->setTabsClosable(true);
    onglets->addTab(creerOngletPageWeb(tr("http://www.google.fr")), tr("(Nouvelle page)"));
    onglets->setTabIcon(onglets->currentIndex(),QIcon(QWebSettings::iconForUrl(pageActuelle()->url())));
    connect(onglets, SIGNAL(currentChanged(int)), this, SLOT(changementOnglet(int)));
    connect(onglets, SIGNAL(tabCloseRequested(int)), this, SLOT(fermerOnglet(int)));
    setCentralWidget(onglets);

    creerBoutonsOnglets();
    appliquerParametres();

    // Accès Easter egg (censuré pour que les gens ne savent pas comment activer l'easter et cherchent encore et encore desespérément)

    // Définition de quelques propriétés de la fenêtre
    setMinimumSize(500, 350);
    setWindowIcon(QIcon(":images/icone.ico"));
    setWindowTitle(tr("Navy"));
    enableDwmComposition();
}

void FenPrincipale::creerActions()
{
    actionMenuNavy = new QAction(QIcon(":images/logo.png"), tr("Menu de Navy"), this);
    connect(actionMenuNavy, SIGNAL(triggered()), this, SLOT(execMenu()));

    actionNouvelOnglet = new QAction(QIcon(":images/plus.png"), tr("&Nouvel onglet"), this);
    actionNouvelOnglet->setShortcut(tr("Ctrl+T"));
    connect(actionNouvelOnglet, SIGNAL(triggered()), this, SLOT(nouvelOnglet()));
    actionFermerOnglet = new QAction(QIcon(":images/fermerOnglet.png"), tr("&Fermer l'onglet"), this);
    actionFermerOnglet->setShortcut(tr("Ctrl+W"));
    //actionFermerOnglet->setEnabled(false);
    connect(actionFermerOnglet, SIGNAL(triggered()), this, SLOT(fermerOnglet()));
    actionDupliquerOnglet = new QAction(QIcon(":images/dupliquer.png"), tr("&Dupliquer l'onglet"), this);
    actionDupliquerOnglet->setShortcut(tr("Ctrl+G"));
    connect(actionDupliquerOnglet, SIGNAL(triggered()), this, SLOT(dupliquerOnglet()));

    actionOuvrir = new QAction(QIcon(":images/ouvrir.png"), tr("&Ouvrir un fichier"), this);
    actionOuvrir->setShortcut(tr("Ctrl+O"));
    connect(actionOuvrir, SIGNAL(triggered()), this, SLOT(ouvrirFichier()));
    actionEnregistrer = new QAction(QIcon(":images/enregistrer.png"), tr("&Enregistrer"), this);
    actionEnregistrer->setShortcut(tr("Ctrl+S"));
    connect(actionEnregistrer, SIGNAL(triggered()), this, SLOT(enregistrerFichier()));
    actionImprimer = new QAction(QIcon(":images/imprimer.png"), tr("&Imprimer"), this);
    actionImprimer->setShortcut(tr("Ctrl+P"));
    connect(actionImprimer, SIGNAL(triggered()), this, SLOT(imprimer()));
    actionQuitter = new QAction(QIcon(":images/fermerOngletHover.png"), tr("&Quitter"), this);
    actionQuitter->setShortcut(tr("Ctrl+Q"));
    connect(actionQuitter, SIGNAL(triggered()), this, SLOT(quitter()));

    actionPleinEcran = new QAction(QIcon(":images/pleinEcran.png"), tr("Plein écran"), this);
    connect(actionPleinEcran, SIGNAL(triggered()), this, SLOT(pleinEcran()));
    actionPleinEcran->setShortcut(tr("F11"));
    actionPleinEcran->setCheckable(true);
    actionZoomPlus = new QAction(tr("Zoom +"), this);
    actionZoomPlus->setShortcut(QKeySequence::ZoomIn);
    actionZoomPlus->setIcon(QIcon(QString(":images/zoom+.png")));
    actionZoomPlus->setAutoRepeat(true);
    connect(actionZoomPlus, SIGNAL(triggered()), this, SLOT(zoomPlus()));
    actionZoomMoins = new QAction(tr("Zoom -"), this);
    actionZoomMoins->setShortcut(QKeySequence::ZoomOut);
    actionZoomMoins->setIcon(QIcon(QString(":images/zoom-.png")));
    actionZoomMoins->setAutoRepeat(true);
    connect(actionZoomMoins, SIGNAL(triggered()), this, SLOT(zoomMoins()));
    actionZoomNormal = new QAction(tr("Zoom 100%"), this);
    actionZoomNormal->setShortcut(tr("Ctrl+0"));
    actionZoomNormal->setIcon(QIcon(QString(":images/zoom_normal.png")));
    actionZoomNormal->setAutoRepeat(true);
    connect(actionZoomNormal, SIGNAL(triggered()), this, SLOT(zoomNormal()));

    actionAnnuler = new QAction(QIcon(":images/annuler.png"), tr("&Annuler"), this);
    actionAnnuler->setShortcut(tr("Ctrl+Z"));
    connect(actionAnnuler, SIGNAL(triggered()), this, SLOT(annuler()));
    actionRefaire = new QAction(QIcon(":images/refaire.png"), tr("&Refaire"), this);
    actionRefaire->setShortcut(tr("Ctrl+Y"));
    connect(actionRefaire, SIGNAL(triggered()), this, SLOT(refaire()));
    actionCouper = new QAction(QIcon(":images/couper.png"), tr("Couper"), this);
    actionCouper->setShortcut(tr("Ctrl+X"));
    connect(actionCouper, SIGNAL(triggered()), this, SLOT(couper()));
    actionCopier = new QAction(QIcon(":images/copier.png"), tr("Copier"), this);
    actionCopier->setShortcut(tr("Ctrl+C"));
    connect(actionCopier, SIGNAL(triggered()), this, SLOT(copier()));
    actionColler = new QAction(QIcon(":images/coller.png"), tr("Coller"), this);
    actionColler->setShortcut(tr("Ctrl+V"));
    connect(actionColler, SIGNAL(triggered()), this, SLOT(coller()));
    actionToutSelectionner = new QAction(QIcon(":images/tout_selectionner.png"), tr("&Tout selectionner"), this);
    actionToutSelectionner->setShortcut(tr("Ctrl+A"));
    connect(actionToutSelectionner, SIGNAL(triggered()), this, SLOT(toutSelectionner()));

    actionPrecedente = new QAction(QIcon(":images/precedente.png"), tr("&Precedente"), this);
    actionPrecedente->setShortcut(QKeySequence::Back);
    connect(actionPrecedente, SIGNAL(triggered()), this, SLOT(precedente()));
    actionSuivante = new QAction(QIcon(":images/suivante.png"), tr("&Suivante"), this);
    actionSuivante->setShortcut(QKeySequence::Forward);
    connect(actionSuivante, SIGNAL(triggered()), this, SLOT(suivante()));
    actionStop = new QAction(QIcon(":images/stop.png"), tr("S&top"), this);
    connect(actionStop, SIGNAL(triggered()), this, SLOT(stop()));
    actionActualiser = new QAction(QIcon(":images/actualiser.png"), tr("&Actualiser"), this);
    actionActualiser->setShortcut(QKeySequence::Refresh);
    connect(actionActualiser, SIGNAL(triggered()), this, SLOT(actualiser()));
    actionAccueil = new QAction(QIcon(":images/accueil.png"), tr("A&ccueil"), this);
    connect(actionAccueil, SIGNAL(triggered()), this, SLOT(accueil()));
    actionGo = new QAction(QIcon(":images/go.png"), tr("A&ller à"), this);
    connect(actionGo, SIGNAL(triggered()), this, SLOT(chargerPage()));

    rechercherGoogle = new QAction(QIcon(":images/google.png"), tr("Google"), this);
    connect(rechercherGoogle, SIGNAL(triggered()), this, SLOT(rechercherPage()));
    rechercherBing = new QAction(QIcon(":images/bing.png"), tr("Bing"), this);
    connect(rechercherBing, SIGNAL(triggered()), this, SLOT(bing()));
    rechercherYahoo = new QAction(QIcon(":images/yahoo.png"), tr("yahoo"), this);
    connect(rechercherYahoo, SIGNAL(triggered()), this, SLOT(yahoo()));
    rechercherYoutube = new QAction(QIcon(":images/youtube.png"), tr("YouTube"), this);
    connect(rechercherYoutube, SIGNAL(triggered()), this, SLOT(youtube()));
    rechercherFlickr = new QAction(QIcon(":images/flickr.png"), tr("Flickr"), this);
    connect(rechercherFlickr, SIGNAL(triggered()), this, SLOT(flickr()));
    rechercherDeviantart = new QAction(QIcon(":images/deviantart.png"), tr("DeviantArt"), this);
    connect(rechercherDeviantart, SIGNAL(triggered()), this, SLOT(deviantart()));
    rechercherAsk = new QAction(QIcon(":images/ask.png"), tr("Ask"), this);
    connect(rechercherAsk, SIGNAL(triggered()), this, SLOT(ask()));
    rechercherWikipedia = new QAction(QIcon(":images/wikipedia.png"), tr("Wikipedia"), this);
    connect(rechercherWikipedia, SIGNAL(triggered()), this, SLOT(wikipedia()));
    rechercherDailyMotion = new QAction(QIcon(":images/dailymotion.png"), tr("DailyMotion"), this);
    connect(rechercherDailyMotion, SIGNAL(triggered()), this, SLOT(dailyMotion()));

    actionAide = new QAction(QIcon(":images/aide.png"), tr("&Aide"), this);
    connect(actionAide, SIGNAL(triggered()), this, SLOT(aide()));
    actionAide->setShortcut(QKeySequence::HelpContents);
    actionAPropos = new QAction(tr("A &propos"), this);
    connect(actionAPropos, SIGNAL(triggered()), this, SLOT(aPropos()));
    actionAProposQt = new QAction(tr("A propos de &Qt"), this);
    connect(actionAProposQt, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
    actionLicenceGPL = new QAction(tr("&Licence GPL"), this);
    connect(actionLicenceGPL, SIGNAL(triggered()), this, SLOT(licenceGPL()));
}

void FenPrincipale::creerMenusEtBarresOutils()
{
    QMenuBar *barreMenu = new QMenuBar; // On crée notre QMenuBar pour cacher les menus
    QMenu *menuFichier = barreMenu->addMenu(tr("&Fichier"));

    menuFichier->addAction(actionOuvrir);
    menuFichier->addSeparator();
    menuFichier->addAction(actionEnregistrer);
    menuFichier->addSeparator();
    menuFichier->addAction(actionImprimer);
    menuFichier->addSeparator();
    menuFichier->addAction(actionQuitter);

    QMenu *menuEdition = barreMenu->addMenu("&Edition");
    menuEdition->addAction(actionAnnuler);
    menuEdition->addAction(actionRefaire);
    menuEdition->addSeparator();
    menuEdition->addAction(actionCouper);
    menuEdition->addAction(actionCopier);
    menuEdition->addAction(actionColler);
    menuEdition->addSeparator();
    menuEdition->addAction(actionToutSelectionner);

    QMenu *menuAffichage = barreMenu->addMenu(tr("&Affichage"));

    menuAffichage->addAction(actionZoomPlus);
    menuAffichage->addAction(actionZoomMoins);
    menuAffichage->addAction(actionZoomNormal);
    menuAffichage->addSeparator();
    menuAffichage->addAction(actionPleinEcran);

    QMenu *menuOnglets = barreMenu->addMenu(tr("&Onglets"));

    menuOnglets->addAction(actionNouvelOnglet);
    menuOnglets->addAction(actionFermerOnglet);
    menuOnglets->addAction(actionDupliquerOnglet);

    QMenu *menuNavigation = barreMenu->addMenu(tr("&Navigation"));

    menuNavigation->addAction(actionPrecedente);
    menuNavigation->addAction(actionSuivante);
    menuNavigation->addAction(actionActualiser);
    menuNavigation->addAction(actionStop);
    menuNavigation->addAction(actionAccueil);

    QMenu *menuAide = barreMenu->addMenu(tr("&Aide"));

    menuAide->addAction(actionAide);
    menuAide->addSeparator();
    menuAide->addAction(actionAPropos);
    menuAide->addAction(actionAProposQt);
    menuAide->addSeparator();
    menuAide->addAction(actionLicenceGPL);

    // Menus et barres outils utilisés

    QMenu *menuNavy = barreMenu->addMenu(tr("&Navy"));
    menuNavy->setStyle(new QCleanlooksStyle);

    menuNavy->addAction(actionNouvelOnglet);
    menuNavy->addAction(actionDupliquerOnglet);
    menuNavy->addAction(actionFermerOnglet);
    menuNavy->addSeparator();
    QMenu *pageActuelle = menuNavy->addMenu("Fichier");
    pageActuelle->setStyle(new QCleanlooksStyle);
    pageActuelle->addAction(actionOuvrir);
    pageActuelle->addAction(actionEnregistrer);
    pageActuelle->addSeparator();
    pageActuelle->addAction(actionImprimer);
    menuNavy->addSeparator();
    menuNavy->addAction(actionAnnuler);
    menuNavy->addAction(actionRefaire);
    QMenu *pressePapier = menuNavy->addMenu("Presse papier");
    pressePapier->setStyle(new QCleanlooksStyle);
    pressePapier->addAction(actionCouper);
    pressePapier->addAction(actionCopier);
    pressePapier->addAction(actionColler);
    menuNavy->addSeparator();
    menuNavy->addAction(actionPleinEcran);
    QMenu *menuZoom = menuNavy->addMenu("Zoom");
    menuZoom->setStyle(new QCleanlooksStyle);
    menuZoom->addAction(actionZoomPlus);
    menuZoom->addAction(actionZoomMoins);
    menuZoom->addAction(actionZoomNormal);
    menuNavy->addSeparator();
    QMenu *navigation = menuNavy->addMenu("Navigation");
    navigation->setStyle(new QCleanlooksStyle);
    navigation->addAction(actionPrecedente);
    navigation->addAction(actionSuivante);
    navigation->addAction(actionActualiser);
    navigation->addAction(actionStop);
    navigation->addAction(actionAccueil);
    menuNavy->addSeparator();
    menuNavy->addAction(actionAide);
    menuNavy->addSeparator();
    menuNavy->addAction(actionAPropos);
    menuNavy->addAction(actionAProposQt);
    menuNavy->addSeparator();
    menuNavy->addAction(actionQuitter);

    QPushButton *boutonNavy = new QPushButton("", this);
    boutonNavy->setIcon(QIcon(":/images/logo.png"));
    boutonNavy->setToolTip("Affiche/Cache le menu de Navy");
    boutonNavy->setIconSize(QSize(25, 25));
    boutonNavy->setMenu(menuNavy);


    champAdresse = new QLineEdit;
    champAdresse->setStyleSheet("QLineEdit{height: 23px; border: 1px inset grey; border-radius: 6px; padding-left:4px; background-color: white; color: black;}");
    connect(champAdresse, SIGNAL(returnPressed()), this, SLOT(chargerPage()));
    /*champAdresse->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(champAdresse, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(menuContext(const QPoint&)));*/


    QToolBar *toolBarNavigation = addToolBar(tr("Général"));
    toolBarNavigation->setFloatable(false);
    toolBarNavigation->setMovable(false);
    toolBarNavigation->setVisible(true);
    toolBarNavigation->setIconSize(QSize(30, 30));
    toolBarNavigation->setStyleSheet("QToolBar{border : none; spacing: 5px;}");


    toolBarNavigation->addAction(actionPrecedente);
    toolBarNavigation->addAction(actionSuivante);
    toolBarNavigation->addAction(actionActualiser);
    toolBarNavigation->addAction(actionStop);
    toolBarNavigation->addAction(actionAccueil);
    toolBarNavigation->addWidget(champAdresse);
    toolBarNavigation->addAction(actionGo);

    toolBarNavigation->addSeparator();

    QMenu *menuRecherche = barreMenu->addMenu(tr("&Recherche"));
    menuRecherche->setStyle(new QCleanlooksStyle);
    menuRecherche->addAction(rechercherGoogle);
    menuRecherche->addAction(rechercherBing);
    menuRecherche->addAction(rechercherYahoo);
    menuRecherche->addAction(rechercherAsk);
    menuRecherche->addSeparator();
    menuRecherche->addAction(rechercherWikipedia);
    menuRecherche->addSeparator();
    menuRecherche->addAction(rechercherDeviantart);
    menuRecherche->addAction(rechercherFlickr);
    menuRecherche->addSeparator();
    menuRecherche->addAction(rechercherYoutube);
    menuRecherche->addAction(rechercherDailyMotion);

    QPushButton *boutonRecherche = new QPushButton(this);
    boutonRecherche->setIcon(QIcon(":/images/recherche.png"));
    boutonRecherche->setFixedHeight(25);
    boutonRecherche->setIconSize(QSize(35, 35));
    boutonRecherche->setMenu(menuRecherche);
    boutonRecherche->setStyle(new QCleanlooksStyle);


    champRecherche = new QLineEdit;
    champRecherche->setStyleSheet("QLineEdit{border: 1px inset grey; border-radius: 6px; padding-left:24px; background-color: white; color: black;background-image:url(\":images/recherche.png\");background-repeat:no-repeat;background-position:left center;}");
    champRecherche->setFixedHeight(25);
    champRecherche->setMaximumWidth(200);
    champRecherche->setMinimumWidth(25);
    connect(champRecherche, SIGNAL(returnPressed()), this, SLOT(rechercherPage()));

    toolBarNavigation->addWidget(champRecherche);
    toolBarNavigation->addWidget(boutonRecherche);
    toolBarNavigation->addSeparator();
    toolBarNavigation->addWidget(boutonNavy);

}

void FenPrincipale::creerBoutonsOnglets()
{
    /*boutonOnglet1 = new QPushButton(this);
    boutonOnglet1->setIcon(QIcon(":/images/plus.png"));
    boutonOnglet1->setFlat(true);
    boutonOnglet1->setIconSize(QSize(22, 22));*/

    QToolBar *toolBarRapide = addToolBar(tr("Accès rapide"));
    toolBarRapide->setStyleSheet("QToolBar{border : none;}");

    toolBarRapide->addAction(actionNouvelOnglet);
    toolBarRapide->addAction(actionDupliquerOnglet);
    toolBarRapide->addAction(actionFermerOnglet);
    toolBarRapide->addSeparator();
    toolBarRapide->addAction(actionQuitter);

    //onglets->setCornerWidget(boutonOnglet1, Qt::TopLeftCorner);
    onglets->setCornerWidget(toolBarRapide, Qt::TopRightCorner);

    //connect(boutonOnglet1, SIGNAL(clicked()), this, SLOT(nouvelOnglet()));
}

void FenPrincipale::appliquerParametres()
{
    actionActualiser->setVisible(false);
    actionStop->setVisible(false);

    QWebSettings::globalSettings()->setAttribute(QWebSettings::AcceleratedCompositingEnabled, true);
    QWebSettings::globalSettings()->setAttribute(QWebSettings::AutoLoadImages, true);
    QWebSettings::globalSettings()->setAttribute(QWebSettings::DnsPrefetchEnabled, true);
    QWebSettings::globalSettings()->setAttribute(QWebSettings::JavaEnabled, true);
    QWebSettings::globalSettings()->setAttribute(QWebSettings::JavascriptCanOpenWindows, true);
    QWebSettings::globalSettings()->setAttribute(QWebSettings::JavascriptEnabled, true);
    QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled, true);
    QWebSettings::globalSettings()->setAttribute(QWebSettings::PrintElementBackgrounds, true);
    QWebSettings::globalSettings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
    QWebSettings::globalSettings()->setAttribute(QWebSettings::JavascriptCanAccessClipboard, true);
    QWebSettings::globalSettings()->setAttribute(QWebSettings::LocalContentCanAccessFileUrls, true);
    QWebSettings::globalSettings()->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, true);
    QWebSettings::globalSettings()->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled, true);
    QWebSettings::globalSettings()->setAttribute(QWebSettings::LocalStorageEnabled, true);
    QWebSettings::setMaximumPagesInCache(300);
    QWebSettings::setIconDatabasePath(QCoreApplication::applicationDirPath ()+"/"+"iconeDataBase");
}

void FenPrincipale::creerBarreEtat()
{
    progression = new QProgressBar(this);
    progression->setStyle(new QCleanlooksStyle);
    progression->setVisible(false);
    progression->setMaximumHeight(20);
    statusBar()->addWidget(progression, 1);
}


// Slots

void FenPrincipale::precedente()
{
    pageActuelle()->back();
}

void FenPrincipale::suivante()
{
    pageActuelle()->forward();
}

void FenPrincipale::accueil()
{
    pageActuelle()->load(QUrl(tr("http://www.google.fr")));
}

void FenPrincipale::stop()
{
    pageActuelle()->stop();
}

void FenPrincipale::actualiser()
{
    pageActuelle()->reload();
}


void FenPrincipale::aPropos()
{
    fenetreInfo = new QDialog(this);
    fenetreInfo->setStyle(new QCleanlooksStyle);
    fenetreInfo->setWindowTitle("A propos de Navy");

    QHBoxLayout *layoutHori1 = new QHBoxLayout(this);

    QLabel *texte = new QLabel("<h2>Navy</h2> Copyright © 2012 Ultimate <br /> Développeur : Anonyme <br /> Version : 1.7 <br /> Nom de code : Zenith <br /> Site officiel : http://mynavy.jimdo.com/ <br /> Version Qt : 4.8.0 ", fenetreInfo);
    QLabel *image = new QLabel(fenetreInfo);
        image->setPixmap(QPixmap(":images/logo.png"));


    QPushButton *boutonLicence = new QPushButton("Licence", fenetreInfo);
    QPushButton *boutonSite = new QPushButton("Site officiel", fenetreInfo);
    QPushButton *boutonOk = new QPushButton("OK", fenetreInfo);

    layoutHori1->addWidget(image);
    layoutHori1->addWidget(texte);

    QHBoxLayout *layoutLicence = new QHBoxLayout;
          layoutLicence->addWidget(boutonLicence);
          layoutLicence->addWidget(boutonSite);
          layoutLicence->addWidget(boutonOk);

    QVBoxLayout *layoutApropos = new QVBoxLayout;
       layoutApropos->addLayout(layoutHori1);
       layoutApropos->addLayout(layoutLicence);

    fenetreInfo->setLayout(layoutApropos);

    fenetreInfo->show();

    QObject::connect(boutonLicence, SIGNAL(clicked()), this, SLOT(licenceGPL()));
    QObject::connect(boutonSite, SIGNAL(clicked()), this, SLOT(siteOfficiel()));
    QObject::connect(boutonOk, SIGNAL(clicked()), this, SLOT(ok()));
}

void FenPrincipale::quitter()
{
    if (onglets->count() > 1)
    {
        int reponse = QMessageBox::warning(this, "Onglets ouverts", "Attention ! Vous êtes sur le point de fermer plusieurs onglets.<br /> Voulez vous continuer ?", QMessageBox::Yes | QMessageBox::No);
        if (reponse == QMessageBox::Yes)
        {
            qApp->exit(0);
        }
        else if (reponse == QMessageBox::No)
        {

        }
    }
    else
        qApp->exit(0);
}

void FenPrincipale::nouvelOnglet()
{
    int indexNouvelOnglet = onglets->addTab(creerOngletPageWeb(), tr("(Nouvelle onglet)"));
    onglets->setCurrentIndex(indexNouvelOnglet);
    //onglets->setTabIcon(onglets->currentIndex(),QIcon(QWebSettings::iconForUrl(pageActuelle()->url())));

    champAdresse->setText("");
    champAdresse->setFocus(Qt::OtherFocusReason);

    int reponse = QMessageBox::question(this, "Que voulez vous faire ?", "<h2>Que voulez vous faire ?</h2> Cliquez sur Oui pour ouvrir la page d'accueil <br /> ou sur Ouvrir pour ouvrir un fichier ou sur <br /> Non pour laisser la page vide.", QMessageBox::Yes | QMessageBox::Open | QMessageBox::No);
    if (reponse == QMessageBox::Yes)
    {
        accueil();
    }
    if (reponse == QMessageBox::No)
    {

    }
    else if (reponse == QMessageBox::Open)
    {
        ouvrirFichier();
    }

}

void FenPrincipale::fermerOnglet()
{
    // On ne doit pas fermer le dernier onglet, sinon le QTabWidget ne marche plus
    if (onglets->count() > 1)
    {
        delete pageActuelle();
        delete barreActuelle();
        onglets->removeTab(onglets->currentIndex());
    }
    // Donc on ferme carrement la fenêtre
    else
        qApp->exit(0);
}

void FenPrincipale::chargerPage()
{
    QString query = champAdresse->text();
    QUrl url = query;

    if(url.scheme() == "http")
        Q_UNUSED(query)
    else if(url.scheme() == "https")
        Q_UNUSED(query)
    else if(url.scheme() == "mxs")
        Q_UNUSED(query)
    else
    {
        QString rechercherQuoi = "http://www.google.com/search?q=";
        url = rechercherQuoi + query;
    }
    pageActuelle()->load(url);

    QIcon icone = pageActuelle()->icon();
    QString nomIcone = icone.name();
    onglets->setTabIcon(onglets->currentIndex(), icone);
}

void FenPrincipale::changementOnglet(int index)
{
    changementTitre(pageActuelle()->title());
    //changementUrl(pageActuelle()->url());
}


void FenPrincipale::changementTitre(const QString & titreComplet)
{
    int senderIndex = onglets->indexOf(qobject_cast<QWidget *>(sender()->parent()));
    bool isCurrentIndex = (senderIndex == onglets->currentIndex());
    if(senderIndex == -1) isCurrentIndex = true;

    QString shortTitle = titreComplet;

    if(titreComplet.size() > 18)
        shortTitle = titreComplet.left(18) + "...";

    if(isCurrentIndex)
    {
        if(!titreComplet.isEmpty())
            setWindowTitle(titreComplet + " - " + QString("Navy"));
        else
            setWindowTitle("Navy");
    }
    onglets->setTabText(senderIndex, shortTitle);
    onglets->setTabToolTip(onglets->currentIndex(), titreComplet);
    QIcon icone = pageActuelle()->icon();
    QString nomIcone = icone.name();
    onglets->setTabIcon(onglets->currentIndex(), icone);
}

void FenPrincipale::changementUrl(const QUrl & url)
{
    if (url.toString() != tr("html/page_blanche.html"))
    {
        champAdresse->setText(url.toString());
    }
}

void FenPrincipale::chargementDebut()
{
    progression->setVisible(true);
    actionActualiser->setVisible(false);
    actionStop->setVisible(true);
    statusBar()->setVisible(true);
}

void FenPrincipale::chargementEnCours(int pourcentage)
{
    progression->setVisible(true);
    progression->setValue(pourcentage);
    actionActualiser->setVisible(false);
    actionStop->setVisible(true);
}

void FenPrincipale::chargementTermine(bool ok)
{
    progression->setVisible(false);
    actionActualiser->setVisible(true);
    actionStop->setVisible(false);
    statusBar()->setVisible(false);
}



// Autres méthodes


QWidget *FenPrincipale::creerOngletPageWeb(QString url)
{
    QWidget *pageOnglet = new QWidget;
    QWebView *pageWeb = new QWebView;

    // --------
    //QMenuBar *barreMenu = new QMenuBar; // On crée notre QMenuBar pour cacher les menus
    //QMenu *menuNavy = barreMenu->addMenu(tr("&Navy"));
    menuNavy = new QMenu(this);
    menuNavy->setStyle(new QCleanlooksStyle);

    menuNavy->addAction(actionNouvelOnglet);
    menuNavy->addAction(actionDupliquerOnglet);
    menuNavy->addAction(actionFermerOnglet);
    menuNavy->addSeparator();
    QMenu *pageActuelle = menuNavy->addMenu("Fichier");
    pageActuelle->setStyle(new QCleanlooksStyle);
    pageActuelle->addAction(actionOuvrir);
    pageActuelle->addAction(actionEnregistrer);
    pageActuelle->addSeparator();
    pageActuelle->addAction(actionImprimer);
    menuNavy->addSeparator();
    menuNavy->addAction(actionAnnuler);
    menuNavy->addAction(actionRefaire);
    QMenu *pressePapier = menuNavy->addMenu("Presse papier");
    pressePapier->setStyle(new QCleanlooksStyle);
    pressePapier->addAction(actionCouper);
    pressePapier->addAction(actionCopier);
    pressePapier->addAction(actionColler);
    menuNavy->addSeparator();
    menuNavy->addAction(actionPleinEcran);
    QMenu *menuZoom = menuNavy->addMenu("Zoom");
    menuZoom->setStyle(new QCleanlooksStyle);
    menuZoom->addAction(actionZoomPlus);
    menuZoom->addAction(actionZoomMoins);
    menuZoom->addAction(actionZoomNormal);
    menuNavy->addSeparator();
    QMenu *navigation = menuNavy->addMenu("Navigation");
    navigation->setStyle(new QCleanlooksStyle);
    navigation->addAction(actionPrecedente);
    navigation->addAction(actionSuivante);
    navigation->addAction(actionActualiser);
    navigation->addAction(actionStop);
    navigation->addAction(actionAccueil);
    menuNavy->addSeparator();
    menuNavy->addAction(actionAide);
    menuNavy->addSeparator();
    menuNavy->addAction(actionAPropos);
    menuNavy->addAction(actionAProposQt);
    menuNavy->addSeparator();
    menuNavy->addAction(actionQuitter);

    QPushButton *boutonNavy = new QPushButton("", this);
    boutonNavy->setIcon(QIcon(":/images/logo.png"));
    boutonNavy->setToolTip("Affiche/Cache le menu de Navy");
    boutonNavy->setIconSize(QSize(25, 25));
    boutonNavy->setFixedSize(QSize(35, 35));
    boutonNavy->setFlat(true);
    boutonNavy->setMenu(menuNavy);


    champAdresse = new MyLineEdit;
    champAdresse->setPlaceholderText("Adresse URL");
    connect(champAdresse, SIGNAL(returnPressed()), this, SLOT(chargerPage()));


    QToolBar *toolBarGeneral = addToolBar(tr("Général"));
    toolBarGeneral->setIconSize(QSize(23, 23));
    toolBarGeneral->setStyleSheet("QToolBar{background-image:url(\":images/barre.png\"); border-top: none; border-bottom : 1px solid grey; border-left : 1px solid grey; border-right : 1px solid grey; spacing: 5px;}");

    //toolBarGeneral->addAction(actionMenuNavy);
    toolBarGeneral->addWidget(boutonNavy);
    toolBarGeneral->addAction(actionPrecedente);
    toolBarGeneral->addAction(actionSuivante);
    toolBarGeneral->addAction(actionActualiser);
    toolBarGeneral->addAction(actionStop);
    toolBarGeneral->addAction(actionAccueil);
    toolBarGeneral->addWidget(champAdresse);
    toolBarGeneral->addAction(actionGo);

    menuRecherche = new QMenu(this);
    menuRecherche->setStyle(new QCleanlooksStyle);
    menuRecherche->addAction(rechercherGoogle);
    menuRecherche->addAction(rechercherBing);
    menuRecherche->addAction(rechercherYahoo);
    menuRecherche->addAction(rechercherAsk);
    menuRecherche->addSeparator();
    menuRecherche->addAction(rechercherWikipedia);
    menuRecherche->addSeparator();
    menuRecherche->addAction(rechercherDeviantart);
    menuRecherche->addAction(rechercherFlickr);
    menuRecherche->addSeparator();
    menuRecherche->addAction(rechercherYoutube);
    menuRecherche->addAction(rechercherDailyMotion);

    QPushButton *boutonRecherche = new QPushButton(this);
    boutonRecherche->setIcon(QIcon(":/images/recherche.png"));
    boutonRecherche->setFixedSize(40, 25);
    boutonRecherche->setIconSize(QSize(35, 35));
    boutonRecherche->setMenu(menuRecherche);
    boutonRecherche->setStyle(new QCleanlooksStyle);


    champRecherche = new MyLineEdit;
    champRecherche->setStyleSheet("QLineEdit{border: 1px inset grey; border-radius: 6px; padding-left:24px; background-color: white; color: black;background-image:url(\":images/recherche.png\");background-repeat:no-repeat;background-position:left center;}");
    champRecherche->setMaximumWidth(200);
    champRecherche->setMinimumWidth(25);
    champRecherche->setPlaceholderText("Rechercher ...");
    connect(champRecherche, SIGNAL(returnPressed()), this, SLOT(rechercherPage()));

    toolBarGeneral->addWidget(champRecherche);
    toolBarGeneral->addWidget(boutonRecherche);
    //----------

    QVBoxLayout *layout = new QVBoxLayout;
    layout->setContentsMargins(0,0,0,0);
    layout->setSpacing(0);
    layout->addWidget(toolBarGeneral);
    layout->addWidget(pageWeb);
    pageOnglet->setLayout(layout);

    if (url.isEmpty())
    {
        pageWeb->load(QUrl(tr("")));
    }
    else
    {
        if (url.left(7) != "http://")
        {
            url = "http://" + url;
        }
        pageWeb->load(QUrl(url));
    }

    // Gestion des signaux envoyés par la page web
    connect(pageWeb, SIGNAL(titleChanged(QString)), this, SLOT(changementTitre(QString)));
    connect(pageWeb, SIGNAL(urlChanged(QUrl)), this, SLOT(changementUrl(QUrl)));
    connect(pageWeb, SIGNAL(loadStarted()), this, SLOT(chargementDebut()));
    connect(pageWeb, SIGNAL(loadProgress(int)), this, SLOT(chargementEnCours(int)));
    connect(pageWeb, SIGNAL(loadFinished(bool)), this, SLOT(chargementTermine(bool)));

    return pageOnglet;
}

QWebView *FenPrincipale::pageActuelle()
{
    return onglets->currentWidget()->findChild<QWebView *>();
}

QToolBar *FenPrincipale::barreActuelle()
{
    return onglets->currentWidget()->findChild<QToolBar *>();
}

void FenPrincipale::fermerOnglet(int index)
{
    if (onglets->count() > 1)
    {
        onglets->widget(index)->deleteLater();
        onglets->removeTab(index);
    }
    else
    {
        qApp->exit(0);
    }
}

void FenPrincipale::ok()
{
    fenetreInfo->close();
}

void FenPrincipale::siteOfficiel()
{
    int indexNouvelOnglet = onglets->addTab(creerOngletPageWeb(), tr("(Nouvelle page)"));
    onglets->setCurrentIndex(indexNouvelOnglet);
    onglets->setTabIcon(onglets->currentIndex(),QIcon(QWebSettings::iconForUrl(pageActuelle()->url())));

    champAdresse->setText("");
    champAdresse->setFocus(Qt::OtherFocusReason);
    pageActuelle()->load(QUrl(tr("http://mynavy.jimdo.com/")));
}

void FenPrincipale::dupliquerOnglet()
{
    QString origine = champAdresse->text();
    int indexNouvelOnglet = onglets->addTab(creerOngletPageWeb( origine ), tr("(Nouvelle page)"));
    onglets->setCurrentIndex(indexNouvelOnglet);
    onglets->setTabIcon(onglets->currentIndex(),QIcon(QWebSettings::iconForUrl(pageActuelle()->url())));
}

void FenPrincipale::licenceGPL()
{
    QMessageBox::information(this, "Licence GPL", " Copyright © 2012 Anonyme\n\n This program is free software; you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation; either version 2 of the License, or\n (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU General Public License for more details.\n\n You should have received a copy of the GNU General Public License along\n with this program; if not, write to the Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n");
}

void FenPrincipale::imprimer()
{
    QPrinter *printer = new QPrinter;

    QPrintDialog *boiteDeDialogueImprimer = new QPrintDialog(printer, this);
    if (boiteDeDialogueImprimer->exec() != QDialog::Accepted)
        return;

    pageActuelle()->print(printer);
}

void FenPrincipale::pleinEcran()
{
    if(isFullScreen())
    {
        showMaximized();
        actionPleinEcran->setChecked(false);
    }
    else
    {
        showFullScreen();
        actionPleinEcran->setChecked(true);
    }
}

void FenPrincipale::zoomPlus()
{
    if(pageActuelle()->zoomFactor() < sizeof(qreal))
        pageActuelle()->setZoomFactor(pageActuelle()->zoomFactor()+0.25);
}

void FenPrincipale::zoomMoins()
{
    if(pageActuelle()->zoomFactor() > 0.25)
        pageActuelle()->setZoomFactor(pageActuelle()->zoomFactor()-0.25);
}

void FenPrincipale::zoomNormal()
{
    pageActuelle()->setZoomFactor(1);
}

void FenPrincipale::ouvrirFichier()
{
    QUrl path = QFileDialog::getOpenFileName(this, tr("Ouvrir"), QString(), "Page web (*.html *.xhtlm *.htm *.shtm *.php);;Fichiers texte (*.txt);;Images (*.bmp *.gif *.jpeg *.jpg *.png);;Tous les fichiers (*)");
    path.setScheme("file");
    pageActuelle()->load(path);
}

void FenPrincipale::enregistrerFichier()
{
    QString chemin = QFileDialog::getSaveFileName(this, "Enregistrer un fichier", QDir::homePath(), "Fichiers HTML (*.html);;Fichiers texte (*.txt);;Documents PDF (*.pdf);;Tous les fichiers (*)");

    if (!chemin.isEmpty())
    {
      QFile fichierAEnregistrer(chemin);

       if (fichierAEnregistrer.open(QIODevice::WriteOnly | QIODevice::Text))
      {
        QTextStream flux(&fichierAEnregistrer);
        flux << pageActuelle()->page()->mainFrame()->toHtml();
        fichierAEnregistrer.close();
      }
    }
}

void FenPrincipale::annuler()
{
    pageActuelle()->page()->triggerAction(QWebPage::Undo);
}

void FenPrincipale::refaire()
{
    pageActuelle()->page()->triggerAction(QWebPage::Redo);
}

void FenPrincipale::couper()
{
    pageActuelle()->page()->triggerAction(QWebPage::Cut);
}

void FenPrincipale::copier()
{
    pageActuelle()->page()->triggerAction(QWebPage::Copy);
}

void FenPrincipale::coller()
{
    pageActuelle()->page()->triggerAction(QWebPage::Paste);
}

void FenPrincipale::toutSelectionner()
{
    pageActuelle()->page()->triggerAction(QWebPage::SelectAll);
}

void FenPrincipale::rechercherPage()
{
    QString query = champRecherche->text();
    QUrl url = query;
    QString rechercherQuoi = "http://www.google.com/search?q=";
    url = rechercherQuoi + query;
    pageActuelle()->load(url);
}

void FenPrincipale::bing()
{
    QString url = champRecherche->text();
    url = "http://www.bing.com/search?setmkt=fr-FR&q=" + url;
    pageActuelle()->load(QUrl(url));
}

void FenPrincipale::deviantart()
{
    QString url = champRecherche->text();
    url = "http://browse.deviantart.com/?qh=&section=&q=" + url;
    pageActuelle()->load(QUrl(url));
}

void FenPrincipale::flickr()
{
    QString url = champRecherche->text();
    url = "http://www.flickr.com/search/?q=" + url;
    pageActuelle()->load(QUrl(url));
}

void FenPrincipale::wikipedia()
{
    QString url = champRecherche->text();
    url = "http://fr.wikipedia.org/wiki/" + url;
    pageActuelle()->load(QUrl(url));
}

void FenPrincipale::yahoo()
{
    QString url = champRecherche->text();
    url = "http://fr.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&p=" + url;
    pageActuelle()->load(QUrl(url));
}

void FenPrincipale::youtube()
{
    QString url = champRecherche->text();
    url = "http://www.youtube.com/results?search_query=" + url;
    pageActuelle()->load(QUrl(url));
}

void FenPrincipale::ask()
{
    QString url = champRecherche->text();
    url = "http://fr.ask.com/web?q=" + url;
    pageActuelle()->load(QUrl(url));
}

void FenPrincipale::dailyMotion()
{
    QString url = champRecherche->text();
    url = "http://www.dailymotion.com/relevance/search/" + url;
    pageActuelle()->load(QUrl(url));
}

void FenPrincipale::aide()
{
    if (QFile::exists(QCoreApplication::applicationDirPath ()+"/"+"documents"))
    {
        int reponse = QMessageBox::critical(this, "Crash potentiel", "Navy a détecté un crash potentiel du navigateur<br />car le panel d'aide de Navy n'est pas lisible.<br /> Voulez vous continuer ?", QMessageBox::Yes | QMessageBox::No);
        if (reponse == QMessageBox::Yes)
        {
            int indexNouvelOnglet = onglets->addTab(creerOngletPageWeb(), tr("Aide"));
            onglets->setCurrentIndex(indexNouvelOnglet);
            onglets->setTabIcon(onglets->currentIndex(),QIcon(":/images/aide.png"));
            pageActuelle()->load(QUrl(tr("documents/aide.txt")));
        }
        else if (reponse == QMessageBox::No)
        {

        }
    }
    else
        QMessageBox::critical(this, "Attention", "Le fichier d'aide (aide.txt) est manquant !");
}

void FenPrincipale::easterEgg1()
{
    QMessageBox::information(this, "Easter Egg trouvé", "Bravo ! Vous avez trouvé le easter egg n°1 !<br /> Easter eggs au total : 1/1");
}

void FenPrincipale::execMenu()
{
    menuNavy->popup(QCursor::pos());
}

void FenPrincipale::enableDwmComposition()
{
#ifdef Q_WS_WIN
    QLibrary dwmapi("dwmapi");
    if(QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA)
    {
        BOOL enabled;
        ((PtrDwmIsCompositionEnabled)dwmapi.resolve("DwmIsCompositionEnabled"))(&enabled);
        if(enabled)
        {
            MARGINS margins = {-1};
            RECT rcClient;
            GetWindowRect(winId(), &rcClient);
            SetWindowPos(winId(),
                         NULL,
                         rcClient.left, rcClient.top,
                         rcClient.right-rcClient.left, rcClient.bottom-rcClient.top,
                         SWP_FRAMECHANGED);
            ((PtrDwmExtendFrameIntoClientArea)dwmapi.resolve("DwmExtendFrameIntoClientArea"))(winId(), &margins);
            setAttribute(Qt::WA_TranslucentBackground);
        }
    }

    dwmapi.unload();
#endif
}


FenPrincipale.h


#ifndef HEADER_FENPRINCIPALE
#define HEADER_FENPRINCIPALE

#include <QtGui>
#include <QtWebKit>

class FenPrincipale : public QMainWindow
{
    Q_OBJECT

    public:
        FenPrincipale();

    private:
        void creerActions();
        void creerMenusEtBarresOutils();
        void creerBoutonsOnglets();
        void appliquerParametres();
        void creerBarreEtat();
        QWidget *creerOngletPageWeb(QString url = "");
        QWebView *pageActuelle();
        QToolBar *barreActuelle();
        void enableDwmComposition();

    private slots:
        void precedente();
        void suivante();
        void accueil();
        void stop();
        void actualiser();

        void ouvrirFichier();
        void enregistrerFichier();
        void imprimer();

        void annuler();
        void refaire();
        void couper();
        void copier();
        void coller();
        void toutSelectionner();

        void aPropos();

        void quitter();

        void nouvelOnglet();
        void fermerOnglet();
        void dupliquerOnglet();

        void pleinEcran();
        void zoomPlus();
        void zoomMoins();
        void zoomNormal();

        void aide();
        void siteOfficiel();
        void ok();
        void licenceGPL();

        void fermerOnglet(int index);
        void chargerPage();
        void rechercherPage();
        void changementOnglet(int index);

        void changementTitre(const QString & titreComplet);
        void changementUrl(const QUrl & url);
        void chargementDebut();
        void chargementEnCours(int pourcentage);
        void chargementTermine(bool ok);

        void bing();
        void deviantart();
        void flickr();
        void wikipedia();
        void yahoo();
        void youtube();
        void ask();
        void dailyMotion();

        void easterEgg1();

        void execMenu();

    private:
        QTabWidget *onglets;

        QDialog *fenetreInfo;

        QPushButton *boutonOnglet1;

        QAction *actionMenuNavy;
        QMenu   *menuNavy;
        QMenu   *menuRecherche;

        QAction *actionNouvelOnglet;
        QAction *actionFermerOnglet;
        QAction *actionDupliquerOnglet;

        QAction *actionOuvrir;
        QAction *actionEnregistrer;
        QAction *actionImprimer;
        QAction *actionQuitter;

        QAction *actionPleinEcran;
        QAction *actionZoomPlus;
        QAction *actionZoomMoins;
        QAction *actionZoomNormal;

        QAction *actionAnnuler;
        QAction *actionRefaire;
        QAction *actionCouper;
        QAction *actionCopier;
        QAction *actionColler;
        QAction *actionToutSelectionner;

        QAction *rechercherGoogle;
        QAction *rechercherBing;
        QAction *rechercherDeviantart;
        QAction *rechercherFlickr;
        QAction *rechercherWikipedia;
        QAction *rechercherYahoo;
        QAction *rechercherYoutube;
        QAction *rechercherAsk;
        QAction *rechercherDailyMotion;

        QAction *actionAide;
        QAction *actionAPropos;
        QAction *actionAProposQt;
        QAction *actionLicenceGPL;

        QAction *actionPrecedente;
        QAction *actionSuivante;
        QAction *actionStop;
        QAction *actionActualiser;
        QAction *actionAccueil;
        QAction *actionGo;

        QLineEdit *champAdresse;
        QLineEdit *champRecherche;
        QProgressBar *progression;
};


#endif


mylineedit.cpp


#include "mylineedit.h"
#include <QToolButton>

MyLineEdit::MyLineEdit(QWidget *parent)
    : QLineEdit(parent)
{
    setStyleSheet("QLineEdit{border: 1px inset grey; border-radius: 6px; padding-left:4px; background-color: white; color: black;}");
    setFixedHeight(25);
}


mylineedit.h


#ifndef MYLINEEDIT_H
#define MYLINEEDIT_H

#include <QLineEdit>

class QToolButton;

class MyLineEdit : public QLineEdit
{
    Q_OBJECT

public:
    MyLineEdit(QWidget *parent = 0);

protected:
    

private slots:
    

private:
    
};

#endif // MYLIENEDIT_H


Je publierai les nouveaux code Lundi car le code que je vous ai donné date de Mardi sera perimé (je travaillerai dessus le week end).

Si vous trouvez la solution à tout mes problèmes, merci de me faire parvenir.

-
Edité par aero15 11 mars 2014 à 16:23:53

  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2012 à 14:18:16

Intéressant, c'est formateur ce genre de projet !
  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2012 à 19:36:36

Citation : Hyneman

Intéressant, c'est formateur ce genre de projet !



+1 Effectivement, sa apprend énormément, j'avais fait aussi un navigateur en VB.NET pour "tester" et j'étais arriver à faire un système multi-onglet, historique, favoris, téléchargement et d'autre fonction encore, et j'avais appris un max de chose !!!


Sinon pour ton projet, le design de la version 1.6 est top !! :o J'adore ce type de design. <3
  • Partager sur Facebook
  • Partager sur Twitter
29 mai 2012 à 7:04:51

Bein t'a pas encore vu le nouveau design que je viens de faire à Navy 1.7 ce week-end (j'avais rien à faire :D ) "tout" à changé les onglets ont un nouveau style ! ;)
Image utilisateur
Et en plus un easter egg ajouté, c'est la fenêtre Wiggly, je trouve qu'elle est magnifique. A vous de le trouver lorsque je le metterai en ligne.
Il sera compatible Linux et Mac (Plus aucun problème de compatibilité) mais je ne pourrait pas fournir les executables car je n'ai pas Qt sous Linux et je ne pas en avoir car ... et je n'ai pas non plus un Mac (Mon rêve !).
----------------------
Pour ceux qui souhaiterai m'aider, je croit avoir trouvé l'origine d'un bug visible sur la capture (la barre d'url affiche l'adresse url de la page de l'onglet le precedent). Je vais voir si je me rappelle de corriger ce bug à la maison.
  • Partager sur Facebook
  • Partager sur Twitter
30 mai 2012 à 19:49:19

pas mal de navigateur basé sur le znavigo ont déjà sombré dans les nombreuses vielles page du forum de présentation
  • Partager sur Facebook
  • Partager sur Twitter
31 mai 2012 à 11:18:24

Mais Navy fonctionne grâce à des navigateurs qui ont sombrés, le plus célébre d'entre-eux (selon moi) est MixShark, les fonctionnalités vient généralement de Mixshark (25%), je ne sais pas si tu connait Mixshark. Cherche sur Google ou sur le site du zero et tu vera comme Mixshark est riche en fonctionnalité, mais malheureseument, je pense que son develeopement s'est arreté ;(
  • Partager sur Facebook
  • Partager sur Twitter
31 mai 2012 à 14:15:10

Et au final, ça apporte quoi de nouveau ?
  • Partager sur Facebook
  • Partager sur Twitter
31 mai 2012 à 17:25:53

Il faut que ton navigateur apporte quelque chose de nouveau comme dit plus haut
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2012 à 6:37:08

Rien mais par rapport a la version 1.6 y'a :

-Nouveau style d'onglet
-Nouvel interface
-Bouton nouvel onglet amélioré
-Barre de navigation simplifié + Nouveau style
-Barre de chargement (nouveau style)
-Navigation amélioré
-Bug panel d'aide : corrigé
-Lorsque on ferme 3 onglets directement : Vous être sur le point de fermer plusieurs onglets
-Barre d'adresse combinée avec la barre de recherche
-Menu Navy presque amélioré
-Nouvelle fonctionnalité : Remonter en haut de page
-Nouvelle fonctionnalité : Menu via la touche Ctrl+M
-Nouvelle fonctionnalité : Nouvel onglet et afficher page accueil (evite d'ajouter un onglet et ouvrir la page d'accueil)
-Nouvelle fonctionnalité : Nouvel onglet et afficher page vide
-Nouvelle fonctionnalité : Nouvel onglet et ouvrir un fichier
-Nouveaux icônes (Bof, pas très intéressent)
-Code amélioré
-Compatible Linux et Mac maintenant, mais je ne pourrais pas fournir les exécutables

A venir (Si j'ai le temps, et que j'ai du courage)

-Téléchargement
-Mise à jours
-Code source de la page
-Fenêtre nouveautés comme la fenêtre accueil de Windows Vista après installation.
-Restaurer onglets (Pas trop sur, trop difficile)
-Historique, favoris et fenêtre options (A s'informer)
  • Partager sur Facebook
  • Partager sur Twitter
7 juin 2012 à 12:27:08

La version 1.7 Beta est arrivée, testez-le et dites moi des nouvelles ;)
Petit problème, des crash automatique sont possibles, votre ordi ne risque rien, mais le programme crash tout seul, désolé :D !
Pour afficher le code source de la page, Ctrl+F ! ( :D Désolé, j'était trop pressé)

Télécharger Navy 1.7 Beta

  • Partager sur Facebook
  • Partager sur Twitter
7 juin 2012 à 12:37:19

Dommage sa différencie des autres navigateurs.
Car généralement dans un éditeur de texte, un navigateur ou autre chose, le CTRL - F sert à chercher un mot/text ect ...
Mais bon ^^
  • Partager sur Facebook
  • Partager sur Twitter

Null.

7 juin 2012 à 20:37:26

Personnellement, je l'utilise pour tester, et pis j'aime bien le style x).
  • Partager sur Facebook
  • Partager sur Twitter
7 juin 2012 à 20:40:53

Désolé mais le ctrl+f est le standard pour la recherche, tout le monde est calqué dessus, n'essaie pas de changer des habitudes ancrés depuis belle lurette, ça déprécie ton logiciel.
  • Partager sur Facebook
  • Partager sur Twitter
7 juin 2012 à 21:21:26

Salut,

Ctrl+U pour la source ! Ctrl+F pour la recherche ! Sinon pas mal :)
  • Partager sur Facebook
  • Partager sur Twitter
Louis Guidez :)
8 juin 2012 à 7:10:13

:D Oui en effet, vous avez raison mais je venai d'implémenter cette fonctionnalité, et elle etait caché, donc je lui ai attribué Ctrl+F pour le môment mais ça va changer, pas de problème ok.
  • Partager sur Facebook
  • Partager sur Twitter
23 juin 2012 à 10:42:06

Sans vouloir être rabat joie, il y a une faute d'orthographe sur la capture d'écran.
Nouvelle onglet -> Nouvel onglet
  • Partager sur Facebook
  • Partager sur Twitter
23 juin 2012 à 11:30:16

Desolé ! Je reconnais que je ne suis pas fort en maths et en français ^^
Je corrigerai cela tout de suite, mais je ne remetterai pas la capture à jour.
  • Partager sur Facebook
  • Partager sur Twitter
24 juin 2012 à 4:46:04

J'ai plusieurs idées d'amélioration.
  • Les plugins imageformats sont fournis en double. Pour chacun des formats, il y a une DLL pour la release (ex : qjpeg4.dll) et une pour le debug (qjpegd4.dll). Ces derniers, en plus de peser 5x plus, ne servent strictement à rien dans le programme étant donné qu'il est distribué en mode release.
  • La base de données des icônes est placée dans un sous-dossier juste à côté de l'exécutable. C'est problématique pour les comptes limités dans Windows et pour les linuxiens. Il vaudrait mieux de le placer autre part.
  • L'archive du code source est mal organisé, il faudrait séparer code source et images.
  • La fonction FenPrincipale::voirCodeSource() retélécharge la page, ce qui est inutile car il suffit de faire pageActuelle()->page()->mainFrame()->toHtml(); pour récupérer directement le code source.
  • void FenPrincipale::rechercherPage()
    {
        QString query = champAdresse->text();
        QUrl url = query;
        QString rechercherQuoi = "http://www.google.com/search?q=";
        url = rechercherQuoi + query;
        pageActuelle()->load(url);
    }
    
    void FenPrincipale::bing()
    {
        QString url = champAdresse->text();
        url = "http://www.bing.com/search?setmkt=fr-FR&q=" + url;
        pageActuelle()->load(QUrl(url));
    }
    
    Je l'avoue, c'est cool de créer des variables comme ça :soleil: Plus sérieusemlent, tu pourrais t'en passer. Les variables url et query ne servent pas à grand chose.
    void FenPrincipale::bing()
    {
        pageActuelle()->load(QString("http://www.bing.com/search?setmkt=fr-FR&q=")+ champAdresse->text());
    }
    
  • Partager sur Facebook
  • Partager sur Twitter
24 juin 2012 à 6:35:53

Merci, tu m'aide vraiment beaucoup :
-Plugins images_format : Je savait que j'avais oublié quelque chose mais quoi o_O ! (Résolu)
-Le 2eme, j'ai pas compris ... :euh:
-C'est vrai, je vais séparer les images et les fichiers + je vais créer des classes (je viens de l'apprendre ;) )
-Oui tu as raison, en fait j'ai copié sur la doc, je testerai ton code bientôt*
-Et merci beaucoup pour le code minimaliste :-° pour la recherche !!!!
---------------------------------------
*En fait je travail sur un autre projet (personne ne le connait) depuis trois jours, c'est un outil pour les "webmaster" en partie : il fait éditeur de code + visionneuse de la page + (peut-être) gestionnaire de fichier. L'avantage, c'est qu'il évitera d'ouvrir un navigateur web + un éditeur de code + un navigateur de fichier. Je n'ai pas encore terminé, et je me demande si je vais tenir le coup et ne rien abandonner.
---------------------------------------
Et personnellement, pourquoi ton navigateur n'est plus à jour, tu as décidé d'arrêter son développement ou tu est au chômage complet ?
  • Partager sur Facebook
  • Partager sur Twitter
24 juin 2012 à 14:39:57

Citation : aero15

-Le 2eme, j'ai pas compris ... :euh:


C'est simple. Dans Linux, tu mets toutes les données dans QDesktopServices::storageLocation(QDesktopServices::DataLocation) au lieu de QCoreApplication::applicationDirPath().

C'est dans la fonction FenPrincipale::appliquerParametres() qu'il faut changer.

Citation : aero15

*En fait je travail sur un autre projet (personne ne le connait) depuis trois jours, c'est un outil pour les "webmaster" en partie : il fait éditeur de code + visionneuse de la page + (peut-être) gestionnaire de fichier. L'avantage, c'est qu'il évitera d'ouvrir un navigateur web + un éditeur de code + un navigateur de fichier. Je n'ai pas encore terminé, et je me demande si je vais tenir le coup et ne rien abandonner.


Et un client FTP ? :D

Citation : aero15

Et personnellement, pourquoi ton navigateur n'est plus à jour, tu as décidé d'arrêter son développement ou tu est au chômage complet ?


Il m'avait soulé :( . J'ai ensuite délaissé de développement, pour me consacrer à mes devoirs :pirate: . Aujourd'hui, je suis déjà sur un projet professionnel, en Qt.
  • Partager sur Facebook
  • Partager sur Twitter