浏览代码

New class: FbComboCtrl

Kandrashin Denis 12 年之前
父节点
当前提交
92ac216f8c
共有 5 个文件被更改,包括 75 次插入48 次删除
  1. 0 1
      fb2edit.pro
  2. 59 41
      source/fb2dlgs.cpp
  3. 15 6
      source/fb2dlgs.hpp
  4. 1 0
      source/fb2save.cpp
  5. 二进制
      source/res/dots.png

+ 0 - 1
fb2edit.pro

@@ -52,7 +52,6 @@ QT += network
 QT += xmlpatterns
 
 OTHER_FILES += \
-    source/res/dots.png \
     source/res/style.css \
     source/res/blank.fb2 \
     source/js/export.js \

+ 59 - 41
source/fb2dlgs.cpp

@@ -167,12 +167,43 @@ FbSetupDlg::FbSetupDlg(QWidget *parent)
     ui->setupUi(this);
 }
 
+//---------------------------------------------------------------------------
+//  FbComboCtrl
+//---------------------------------------------------------------------------
+
+FbComboCtrl::FbComboCtrl(QWidget *parent)
+    : QLineEdit(parent)
+{
+    button = new QToolButton(this);
+    button->setCursor(Qt::ArrowCursor);
+    button->setFocusPolicy(Qt::NoFocus);
+    connect(button, SIGNAL(clicked()), SIGNAL(popup()));
+    QVBoxLayout *layout = new QVBoxLayout(this);
+    layout->addWidget(button, 0, Qt::AlignRight);
+    layout->setSpacing(0);
+    layout->setMargin(0);
+}
+
+void FbComboCtrl::resizeEvent(QResizeEvent* event)
+{
+    QLineEdit::resizeEvent(event);
+    QMargins margins(0, 0, button->width(), 0);
+    setTextMargins(margins);
+}
+
+void FbComboCtrl::setIcon(const QIcon &icon)
+{
+    button->setIcon(icon);
+}
+
 //---------------------------------------------------------------------------
 //  FbImageDlg::FbTab
 //---------------------------------------------------------------------------
 
-FbImageDlg::FbTab::FbTab(QWidget* parent)
+FbImageDlg::FbTab::FbTab(QWidget* parent, QAbstractItemModel *model)
     : QWidget(parent)
+    , combo(0)
+    , edit(0)
 {
     QGridLayout * layout = new QGridLayout(this);
 
@@ -180,10 +211,17 @@ FbImageDlg::FbTab::FbTab(QWidget* parent)
     label->setText(tr("File name:"));
     layout->addWidget(label, 0, 0, 1, 1);
 
-    combo = new FbImageCombo(this);
+    QWidget *control;
+    if (model) {
+        control = combo = new QComboBox(this);
+        combo->setModel(model);
+    } else {
+        control = edit = new FbComboCtrl(this);
+    }
+
     QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
-    combo->setSizePolicy(sizePolicy);
-    layout->addWidget(combo, 0, 1, 1, 1);
+    control->setSizePolicy(sizePolicy);
+    layout->addWidget(control, 0, 1, 1, 1);
 
     QFrame *frame = new FbTextFrame(this);
     frame->setMinimumSize(QSize(300, 200));
@@ -193,32 +231,6 @@ FbImageDlg::FbTab::FbTab(QWidget* parent)
     frame->layout()->addWidget(preview);
 }
 
-//---------------------------------------------------------------------------
-//  FbImageCombo
-//---------------------------------------------------------------------------
-
-void FbImageCombo::showPopup()
-{
-    QComboBox::showPopup();
-    if (isEditable()) {
-        emit popup();
-        QComboBox::hidePopup();
-    }
-}
-
-void FbImageCombo::selectFile()
-{
-    QString filters;
-    filters += tr("Common Graphics (*.png *.jpg *.jpeg *.gif)") += ";;";
-    filters += tr("Portable Network Graphics (PNG) (*.png)") += ";;";
-    filters += tr("JPEG (*.jpg *.jpeg)") += ";;";
-    filters += tr("Graphics Interchange Format (*.gif)") += ";;";
-    filters += tr("All Files (*)");
-
-    QString path = QFileDialog::getOpenFileName(this, tr("Insert image..."), QString(), filters);
-    if (!path.isEmpty()) setEditText(path);
-}
-
 //---------------------------------------------------------------------------
 //  FbImageDlg
 //---------------------------------------------------------------------------
@@ -247,29 +259,22 @@ FbImageDlg::FbImageDlg(FbTextEdit *text)
     QUrl url = text->url();
 
     tabFile = new FbTab(notebook);
-    tabFile->combo->setEditable(true);
+    tabFile->edit->setIcon(FbIcon("document-open"));
     tabFile->preview->setHtml(QString(), url);
-    connect(tabFile->combo, SIGNAL(popup()), tabFile->combo, SLOT(selectFile()));
+    connect(tabFile->edit, SIGNAL(popup()), SLOT(selectFile()));
     notebook->addTab(tabFile, tr("Select file"));
 
     if (text->store()->count()) {
         FbListModel *model = new FbListModel(text, this);
-        tabPict = new FbTab(notebook);
+        tabPict = new FbTab(notebook, model);
         tabPict->preview->setHtml(QString(), url);
-        tabPict->combo->setModel(model);
         tabPict->combo->setCurrentIndex(0);
         tabPict->preview->page()->setNetworkAccessManager(text->page()->networkAccessManager());
         notebook->addTab(tabPict, tr("From collection"));
         connect(tabPict->combo, SIGNAL(activated(QString)), SLOT(pictureActivated(QString)));
-        tabPict->combo->setFocus();
     }
 
-    QString style =
-//      "QComboBox::drop-down{border:0px;margin:0px;}"
-        "QComboBox::down-arrow{image:url(:dots.png);}";
-    tabFile->combo->setStyleSheet(style);
-
-    tabFile->combo->setFocus();
+    tabFile->edit->setFocus();
     resize(minimumSizeHint());
 }
 
@@ -281,6 +286,19 @@ void FbImageDlg::notebookChanged(int index)
     }
 }
 
+void FbImageDlg::selectFile()
+{
+    QString filters;
+    filters += tr("Common Graphics (*.png *.jpg *.jpeg *.gif)") += ";;";
+    filters += tr("Portable Network Graphics (PNG) (*.png)") += ";;";
+    filters += tr("JPEG (*.jpg *.jpeg)") += ";;";
+    filters += tr("Graphics Interchange Format (*.gif)") += ";;";
+    filters += tr("All Files (*)");
+    QWidget *p = qobject_cast<QWidget*>(parent());
+    QString path = QFileDialog::getOpenFileName(p, tr("Insert image..."), QString(), filters);
+    if (!path.isEmpty()) tabFile->edit->setText(path);
+}
+
 void FbImageDlg::pictureActivated(const QString & text)
 {
     QUrl url = tabPict->preview->url();

+ 15 - 6
source/fb2dlgs.hpp

@@ -9,6 +9,7 @@ class FbTextBase;
 class FbTextEdit;
 
 QT_BEGIN_NAMESPACE
+class QAbstractItemModel;
 class QLabel;
 class QLineEdit;
 class QTabWidget;
@@ -79,16 +80,22 @@ private:
     Ui::FbSetup * ui;
 };
 
-class FbImageCombo : public QComboBox
+#include <QVBoxLayout>
+#include <QToolButton>
+#include <QLineEdit>
+
+class FbComboCtrl : public QLineEdit
 {
     Q_OBJECT
 public:
-    explicit FbImageCombo(QWidget *parent = 0): QComboBox(parent) {}
-    void showPopup();
+    explicit FbComboCtrl(QWidget *parent = 0);
+    void setIcon(const QIcon &icon);
 signals:
     void popup();
-public slots:
-    void selectFile();
+protected:
+    void resizeEvent(QResizeEvent* event);
+private:
+    QToolButton *button;
 };
 
 class FbImageDlg : public QDialog
@@ -99,9 +106,10 @@ private:
     class FbTab: public QWidget
     {
     public:
-        explicit FbTab(QWidget* parent);
+        explicit FbTab(QWidget* parent, QAbstractItemModel *model = 0);
         QLabel *label;
         QComboBox *combo;
+        FbComboCtrl *edit;
         QWebView *preview;
     };
 
@@ -111,6 +119,7 @@ public:
 private slots:
     void pictureActivated(const QString & text);
     void notebookChanged(int index);
+    void selectFile();
 
 private:
     QTabWidget *notebook;

+ 1 - 0
source/fb2save.cpp

@@ -393,6 +393,7 @@ FbSaveHandler::RootHandler::RootHandler(FbSaveWriter &writer, const QString &nam
 
 FbXmlHandler::NodeHandler * FbSaveHandler::RootHandler::NewTag(const QString &name, const QXmlAttributes &atts)
 {
+    Q_UNUSED(atts);
     return name == "body" ? new BodyHandler(m_writer, name) : NULL;
 }
 

二进制
source/res/dots.png