mainwindow.cpp 22.6 KB
Newer Older
Mehrdad Momeny's avatar
Mehrdad Momeny committed
1 2 3
/*
    This file is part of Blogilo, A KDE Blogging Client

4 5
    Copyright (C) 2008-2010 Mehrdad Momeny <mehrdad.momeny@gmail.com>
    Copyright (C) 2008-2010 Golnaz Nilieh <g382nilieh@gmail.com>
Laurent Montel's avatar
Cleanup  
Laurent Montel committed
6
    Copyright (C) 2013 Laurent Montel <montel@kde.org>
Mehrdad Momeny's avatar
Mehrdad Momeny committed
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

    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/
*/
25 26 27 28 29 30 31 32 33 34 35 36

#include "mainwindow.h"
#include "global.h"
#include "dbman.h"
#include "toolbox.h"
#include "postentry.h"
#include "addeditblog.h"
#include "backend.h"
#include "bilbomedia.h"
#include "settings.h"
#include "bilboblog.h"
#include "blogsettings.h"
37
#include "poststabwidget.h"
Laurent Montel's avatar
Laurent Montel committed
38
#include "uploadmediadialog.h"
39 40
#include "configuredialog.h"
#include "storageservice/storageservicemanagersettingsjob.h"
41 42 43 44 45

#include "ui_advancedsettingsbase.h"
#include "ui_settingsbase.h"
#include "ui_editorsettingsbase.h"

46 47 48 49
#include "pimcommon/storageservice/storageservicemanager.h"
#include "pimcommon/storageservice/storageservicejobconfig.h"
#include "pimcommon/storageservice/storageserviceabstract.h"

50
#include <ktabwidget.h>
51
#include <KStatusNotifierItem>
52 53 54 55 56 57 58
#include <kstatusbar.h>
#include <KToggleAction>
#include <kactioncollection.h>
#include <kconfigdialog.h>
#include <kdebug.h>
#include <kmessagebox.h>
#include <KDE/KLocale>
Laurent Montel's avatar
Laurent Montel committed
59 60 61 62 63
#include <KSelectAction>
#include <kimagefilepreview.h>
#include <KToolInvocation>
#include <KMenu>

Laurent Montel's avatar
Laurent Montel committed
64 65
#include <QDockWidget>
#include <QProgressBar>
Mehrdad Momeny's avatar
Mehrdad Momeny committed
66
#include <QTimer>
67
#include <QKeyEvent>
68 69 70 71

#define TIMEOUT 5000

MainWindow::MainWindow()
Laurent Montel's avatar
Laurent Montel committed
72 73 74 75 76 77 78
    : KXmlGuiWindow(),
      activePost(0),
      systemTray(0),
      previousActivePostIndex(-1),
      busyNumber(0),
      progress(0),
      mCurrentBlogId(__currentBlogId)
79
{
Mehrdad Momeny's avatar
Mehrdad Momeny committed
80
    setWindowTitle( i18n("Blogilo") );
81

82
    tabPosts = new PostsTabWidget(this);
83
    setCentralWidget( tabPosts );
84 85
    connect(tabPosts,SIGNAL(createNewPost()),SLOT(slotCreateNewPost()));
    connect(tabPosts,SIGNAL(closeTabClicked()),SLOT(slotCloseTabClicked()));
86 87
    connect(tabPosts,SIGNAL(tabCloseRequested(int)), this, SLOT(slotRemovePostEntry(int)));
    connect(tabPosts,SIGNAL(tabRemoveAllExclude(int)), this, SLOT(slotRemoveAllExclude(int)));
88

89 90 91 92 93
    toolbox = new Toolbox( this );
    toolboxDock = new QDockWidget( i18n( "Toolbox" ), this );
    toolboxDock->setAllowedAreas( Qt::RightDockWidgetArea | Qt::LeftDockWidgetArea );
    toolboxDock->setFeatures( QDockWidget::AllDockWidgetFeatures );
    toolboxDock->setWidget( toolbox );
Laurent Montel's avatar
Laurent Montel committed
94 95 96 97

    toolboxDock->setObjectName( QLatin1String("dock_toolbox") );
    toolbox->setObjectName( QLatin1String("toolbox") );

98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
    this->addDockWidget( Qt::RightDockWidgetArea, toolboxDock );

    // then, setup our actions
    setupActions();

    // add a status bar
    statusBar()->show();

    // a call to KXmlGuiWindow::setupGUI() populates the GUI
    // with actions, using KXMLGUI.
    // It also applies the saved mainwindow settings, if any, and ask the
    // mainwindow to automatically save settings if changed: window size,
    // toolbar position, icon size, etc.
    setupGUI();

    toolbox->setVisible( Settings::showToolboxOnStart() );
Laurent Montel's avatar
Laurent Montel committed
114
    actionCollection()->action(QLatin1String("toggle_toolbox"))->setChecked( Settings::showToolboxOnStart() );
115 116 117

    setupSystemTray();

Laurent Montel's avatar
Laurent Montel committed
118 119 120 121
    connect( tabPosts, SIGNAL(currentChanged(int)), this, SLOT(slotActivePostChanged(int)) );
    connect( toolbox, SIGNAL(sigEntrySelected(BilboPost&,int)), this, SLOT(slotNewPostOpened(BilboPost&,int)) );
    connect( toolbox, SIGNAL(sigError(QString)), this, SLOT(slotError(QString)) );
    connect( toolbox, SIGNAL(sigBusy(bool)), this, SLOT(slotBusy(bool)));
122 123

    QList<BilboBlog*> blogList = DBMan::self()->blogList().values();
Laurent Montel's avatar
Laurent Montel committed
124
    const int count = blogList.count();
125
    for(int i=0; i < count; ++i) {
Laurent Montel's avatar
Laurent Montel committed
126
        QAction *act = new QAction( blogList.at(i)->title(), blogs );
127
        act->setCheckable( true );
Laurent Montel's avatar
Laurent Montel committed
128
        act->setData( blogList.at(i)->id() );
129 130
        blogs->addAction( act );
    }
Laurent Montel's avatar
Laurent Montel committed
131 132
    connect( blogs, SIGNAL(triggered(QAction*)), this, SLOT(currentBlogChanged(QAction*)) );
    QTimer::singleShot( 0, this, SLOT(loadTempPosts()) );
133
    initStorageService();
134 135 136 137
}

MainWindow::~MainWindow()
{
138 139
}

140 141 142 143 144 145 146 147 148
void MainWindow::initStorageService()
{
    StorageServiceManagerSettingsJob *settingsJob = new StorageServiceManagerSettingsJob(this);
    PimCommon::StorageServiceJobConfig *configJob = PimCommon::StorageServiceJobConfig::self();
    configJob->registerConfigIf(settingsJob);

    mStorageManager = new PimCommon::StorageServiceManager(this);
}

149 150 151 152 153 154 155 156
void MainWindow::slotCloseTabClicked()
{
    const int currentIndex = tabPosts->currentIndex();
    if (currentIndex != -1) {
        slotRemovePostEntry(currentIndex);
    }
}

157 158
bool MainWindow::queryExit()
{
159
    writeConfigs();
160
    if ( !DBMan::self()->clearTempEntries() )
161
        kDebug()<<"Could not erase temp_post table: "<< DBMan::self()->lastErrorText();
Laurent Montel's avatar
Laurent Montel committed
162
    const int count = tabPosts->count();
163
    if (count > 0) {
Mehrdad Momeny's avatar
Mehrdad Momeny committed
164 165 166 167 168
        toolbox->getFieldsValue(activePost->currentPost());
        for(int i =0; i<count; ++i) {
            PostEntry* pst = qobject_cast<PostEntry*>(tabPosts->widget(i));
            DBMan::self()->saveTempEntry(*pst->currentPost(), pst->currentPostBlogId());
        }
169 170
    }
    return true;
171 172 173 174
}

void MainWindow::setupActions()
{
Laurent Montel's avatar
Laurent Montel committed
175
    KStandardAction::quit( qApp, SLOT(quit()), actionCollection() );
176

Laurent Montel's avatar
Laurent Montel committed
177
    KStandardAction::preferences( this, SLOT(optionsPreferences()), actionCollection() );
178 179

    // custom menu and menu item
Laurent Montel's avatar
Laurent Montel committed
180
    KAction *actNewPost = new KAction( KIcon( QLatin1String("document-new") ), i18n( "New Post" ), this );
181 182
    actionCollection()->addAction( QLatin1String( "new_post" ), actNewPost );
    actNewPost->setShortcut( Qt::CTRL + Qt::Key_N );
Laurent Montel's avatar
Laurent Montel committed
183
    connect( actNewPost, SIGNAL(triggered(bool)), this, SLOT(slotCreateNewPost()) );
184

Laurent Montel's avatar
Laurent Montel committed
185
    KAction *actAddBlog = new KAction( KIcon( QLatin1String("list-add") ), i18n( "Add Blog..." ), this );
186
    actionCollection()->addAction( QLatin1String( "add_blog" ), actAddBlog );
Laurent Montel's avatar
Laurent Montel committed
187
    connect( actAddBlog, SIGNAL(triggered(bool)), this, SLOT(addBlog()) );
188

Laurent Montel's avatar
Laurent Montel committed
189
    KAction *actPublish = new KAction( KIcon( QLatin1String("arrow-up") ), i18n( "Submit..." ), this );
190
    actionCollection()->addAction( QLatin1String( "publish_post" ), actPublish );
Laurent Montel's avatar
Laurent Montel committed
191
    connect( actPublish, SIGNAL(triggered(bool)), this, SLOT(slotPublishPost()) );
192

Laurent Montel's avatar
Laurent Montel committed
193
    KAction *actUpload = new KAction( KIcon( QLatin1String("upload-media") ), i18n( "Upload Media..." ), this );
194
    actionCollection()->addAction( QLatin1String( "upload_media" ), actUpload );
Laurent Montel's avatar
Laurent Montel committed
195
    connect( actUpload, SIGNAL(triggered(bool)), this, SLOT(uploadMediaObject()) );
196

Laurent Montel's avatar
Laurent Montel committed
197
    KAction *actSaveLocally = new KAction( KIcon( QLatin1String("document-save") ), i18n( "Save Locally" ), this );
198 199
    actionCollection()->addAction( QLatin1String( "save_locally" ), actSaveLocally );
    actSaveLocally->setShortcut( Qt::CTRL + Qt::Key_S );
Laurent Montel's avatar
Laurent Montel committed
200
    connect( actSaveLocally, SIGNAL(triggered(bool)), this, SLOT(slotSavePostLocally()) );
201 202 203 204

    KToggleAction *actToggleToolboxVisible = new KToggleAction( i18n( "Show Toolbox" ), this );
    actionCollection()->addAction( QLatin1String( "toggle_toolbox" ), actToggleToolboxVisible );
    actToggleToolboxVisible->setShortcut( Qt::CTRL + Qt::Key_T );
Laurent Montel's avatar
Laurent Montel committed
205 206
    connect( actToggleToolboxVisible, SIGNAL(toggled(bool)),
             this, SLOT(slotToggleToolboxVisible(bool)) );
207
    connect( toolboxDock, SIGNAL(visibilityChanged(bool)),
Laurent Montel's avatar
Laurent Montel committed
208
             this, SLOT(slotToolboxVisibilityChanged(bool)) );
209 210 211

    blogs = new KSelectAction( this );
    actionCollection()->addAction( QLatin1String( "blogs_list" ), blogs );
212

Laurent Montel's avatar
Laurent Montel committed
213
    KAction *actOpenBlog = new KAction(KIcon(QLatin1String("applications-internet")), i18n("Open in browser"), this);
214 215 216
    actionCollection()->addAction( QLatin1String("open_blog_in_browser"), actOpenBlog);
    actOpenBlog->setToolTip(i18n("Open current blog in browser"));
    connect( actOpenBlog, SIGNAL(triggered(bool)), this, SLOT(slotOpenCurrentBlogInBrowser()) );
217 218 219 220 221 222
}

void MainWindow::loadTempPosts()
{
    kDebug();
    QMap<BilboPost*, int> tempList = DBMan::self()->listTempPosts();
Laurent Montel's avatar
Laurent Montel committed
223
    const int count = tempList.count();
224
    if ( count > 0 ){
225 226 227 228 229 230
        QMap<BilboPost*, int>::ConstIterator it = tempList.constBegin();
        QMap<BilboPost*, int>::ConstIterator endIt = tempList.constEnd();
        for( ; it != endIt; ++it ) {
            createPostEntry(it.value(), (*it.key()));
        }
    } else {
231
        slotCreateNewPost();
232 233 234
    }
//     activePost = qobject_cast<PostEntry*>( tabPosts->currentWidget() );
    previousActivePostIndex = 0;
235
    if ( activePost )
236 237 238 239 240 241
        setCurrentBlog( activePost->currentPostBlogId() );
}

void MainWindow::setCurrentBlog( int blog_id )
{
    kDebug()<<blog_id;
242
    if (blog_id == -1) {
243 244 245 246 247
        blogs->setCurrentItem( -1 );
        toolbox->setCurrentBlogId( blog_id );
//         actionCollection()->action("publish_post")->setEnabled( false );
        return;
    }
Laurent Montel's avatar
Laurent Montel committed
248
    const int count = blogs->items().count();
249
    for (int i=0; i<count; ++i) {
250
        if ( blogs->action(i)->data().toInt() == blog_id ) {
251 252 253 254 255 256 257 258 259
            blogs->setCurrentItem( i );
            currentBlogChanged( blogs->action( i ) );
            break;
        }
    }
}

void MainWindow::currentBlogChanged( QAction *act )
{
260 261
    if ( act ) {
        if ( mCurrentBlogId == act->data().toInt() )
262 263 264
            return;
        mCurrentBlogId = act->data().toInt();
//         __currentBlogId = mCurrentBlogId;
265
        if ( activePost ) {
266 267 268 269 270 271 272 273
//             actionCollection()->action("publish_post")->setEnabled( true );
            activePost->setCurrentPostBlogId( mCurrentBlogId );
        } else {
//             actionCollection()->action("publish_post")->setEnabled( false );
        }
        blogs->setToolTip( DBMan::self()->blogList().value( mCurrentBlogId )->blogUrl() );
    } else {
        mCurrentBlogId = -1;
274
        if ( activePost )
275 276 277 278 279
            activePost->setCurrentPostBlogId( mCurrentBlogId );
    }
    toolbox->setCurrentBlogId( mCurrentBlogId );
}

280
void MainWindow::slotCreateNewPost()
281 282 283 284
{
    kDebug();

    tabPosts->setCurrentWidget( createPostEntry( mCurrentBlogId, BilboPost()) );
285 286
    if ( mCurrentBlogId == -1 ) {
        if ( !blogs->items().isEmpty() ) {
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
            blogs->setCurrentItem( 0 );
            currentBlogChanged( blogs->action( 0 ) );
        }
    }
    if ( this->isVisible() == false ) {
        this->show();
    }
}

void MainWindow::optionsPreferences()
{
    // The preference dialog is derived from prefs_base.ui
    //
    // compare the names of the widgets in the .ui file
    // to the names of the variables in the .kcfg file
    //avoid having 2 dialogs shown
Laurent Montel's avatar
Laurent Montel committed
303
    if ( KConfigDialog::showDialog( QLatin1String("settings") ) )  {
304 305
        return;
    }
306 307
    ConfigureDialog *dialog = new ConfigureDialog( this, QLatin1String("settings"), Settings::self() );
    connect( dialog, SIGNAL(blogAdded(BilboBlog)),
Laurent Montel's avatar
Laurent Montel committed
308
             this, SLOT(slotBlogAdded(BilboBlog)) );
309
    connect( dialog, SIGNAL(blogEdited(BilboBlog)),
Laurent Montel's avatar
Laurent Montel committed
310
             this, SLOT(slotBlogEdited(BilboBlog)) );
311
    connect( dialog, SIGNAL(blogRemoved(int)), this, SLOT(slotBlogRemoved(int)) );
Laurent Montel's avatar
Laurent Montel committed
312 313
    connect( dialog, SIGNAL(settingsChanged(QString)), this, SIGNAL(settingsChanged()) );
    connect( dialog, SIGNAL(settingsChanged(QString)), this, SLOT(slotSettingsChanged()) );
314
    connect( dialog, SIGNAL(dialogDestroyed(QObject*)), this, SLOT(slotDialogDestroyed(QObject*)));
315 316 317 318 319 320 321 322 323 324
    dialog->show();
}

void MainWindow::slotSettingsChanged()
{
    setupSystemTray();
}

void MainWindow::slotDialogDestroyed( QObject *win )
{
Laurent Montel's avatar
Cleanup  
Laurent Montel committed
325 326
    const QSize size = qobject_cast<QWidget *>(win)->size();
    const QString name = win->objectName();
327
    if (name == QLatin1String("settings")) {
328 329 330 331 332 333 334 335 336
        Settings::setConfigWindowSize( size );
    }
}

void MainWindow::addBlog()
{
    AddEditBlog *addEditBlogWindow = new AddEditBlog( -1, this );
    addEditBlogWindow->setWindowModality( Qt::ApplicationModal );
    addEditBlogWindow->setAttribute( Qt::WA_DeleteOnClose );
Laurent Montel's avatar
Laurent Montel committed
337 338
    connect( addEditBlogWindow, SIGNAL(sigBlogAdded(BilboBlog)),
             this, SLOT(slotBlogAdded(BilboBlog)) );
339 340 341 342 343 344 345 346 347 348 349
    addEditBlogWindow->show();
}

void MainWindow::slotBlogAdded( const BilboBlog &blog )
{
    QAction *act = new QAction( blog.title(), blogs );
    act->setCheckable( true );
    act->setData( blog.id() );
    blogs->addAction( act );
    blogs->setCurrentAction( act );
    currentBlogChanged( act );
350 351
    toolbox->slotReloadCategoryList();
    toolbox->slotUpdateEntries( 20 );
352 353 354 355
}

void MainWindow::slotBlogEdited( const BilboBlog &blog )
{
Laurent Montel's avatar
Cleanup  
Laurent Montel committed
356
    const int count = blogs->actions().count();
357
    for(int i=0; i< count; ++i){
358
        if ( blogs->action( i )->data().toInt() == blog.id() ) {
359 360 361 362 363 364 365 366
            blogs->action( i )->setText( blog.title() );
            break;
        }
    }
}

void MainWindow::slotBlogRemoved( int blog_id )
{
Laurent Montel's avatar
Laurent Montel committed
367
    const int count = blogs->actions().count();
368
    for(int i=0; i< count; ++i){
369 370
        if ( blogs->action( i )->data().toInt() == blog_id ) {
            if ( blogs->currentItem() == i ) {
371 372 373 374
                blogs->setCurrentItem( i-1 );
                currentBlogChanged( blogs->action( i-1 ) );
            }
            blogs->removeAction( blogs->action( i ) );
375
            if (blogs->currentItem() == -1)
376 377 378 379 380 381 382 383
                toolbox->clearFields();
            break;
        }
    }
}

void MainWindow::setupSystemTray()
{
384
    if ( Settings::enableSysTrayIcon()) {
385
        if ( !systemTray ) {
386
            systemTray = new KStatusNotifierItem( this );
Laurent Montel's avatar
Laurent Montel committed
387 388 389
            systemTray->setIconByName(QLatin1String("blogilo"));
            systemTray->setToolTip( QLatin1String("blogilo"), i18n("Blogilo"), i18n("A KDE Blogging Client") );
            systemTray->contextMenu()->addAction( actionCollection()->action(QLatin1String("new_post")) );
390 391
            systemTray->setCategory(KStatusNotifierItem::ApplicationStatus);
            systemTray->setStatus(KStatusNotifierItem::Active);
392
        }
393
    } else if ( systemTray ) {
394 395 396 397 398
        systemTray->deleteLater();
        systemTray = 0;
    }
}

399
void MainWindow::slotPostTitleChanged( const QString& title )
400 401 402 403 404
{
//     kDebug();
    tabPosts->setTabText( tabPosts->currentIndex(), title );
}

405
void MainWindow::slotToggleToolboxVisible( bool isVisible )
406 407 408 409 410 411 412 413 414
{
    toolboxDock->setVisible( isVisible );
}

void MainWindow::slotToolboxVisibilityChanged(bool)
{
    actionCollection()->action(QLatin1String("toggle_toolbox"))->setChecked( toolboxDock->isVisibleTo(this) );
}

415
void MainWindow::slotActivePostChanged( int index )
416 417 418 419 420 421 422 423 424 425
{
    kDebug() << "new post index: " << index << "\tPrev Index: " << previousActivePostIndex;

    activePost = qobject_cast<PostEntry*>( tabPosts->widget( index ) );
    PostEntry *prevActivePost = qobject_cast<PostEntry*>( tabPosts->widget( previousActivePostIndex ) );
    int activePostBlogId = -1;
    int prevPostBlogId = -1;

    if (( prevActivePost != 0 ) && ( index != previousActivePostIndex ) ) {
        prevPostBlogId = prevActivePost->currentPostBlogId();
426
        toolbox->getFieldsValue( prevActivePost->currentPost() );
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441
        prevActivePost->setCurrentPostBlogId( mCurrentBlogId );
    }

    if ( index >= 0 ) {
        activePostBlogId = activePost->currentPostBlogId();
        if ( activePostBlogId != -1 && activePostBlogId != prevPostBlogId ) {
                setCurrentBlog( activePostBlogId );
        }
        toolbox->setFieldsValue( activePost->currentPost() );
    } else {
        kError() << "ActivePost is NULL! tabPosts Current index is: " << tabPosts->currentIndex() ;
    }
    previousActivePostIndex = index;
}

442
void MainWindow::slotPublishPost()
443 444 445 446 447 448
{
    kDebug();
    if ( mCurrentBlogId == -1 ) {
        KMessageBox::sorry( this, i18n( "You have to select a blog to publish this post to." ) );
        return;
    }
449
    if ( !activePost || tabPosts->currentIndex() == -1) {
Andrew Coles's avatar
Andrew Coles committed
450
        KMessageBox::sorry( this, i18n( "There is no open post to submit." ) );
451 452
        return;
    }
453 454
    toolbox->getFieldsValue( activePost->currentPost() );
    activePost->submitPost( mCurrentBlogId, *activePost->currentPost() );
455 456
}

457 458 459 460 461 462 463
void MainWindow::slotRemoveAllExclude(int pos)
{
    for(int i = tabPosts->count()-1; i >=0; --i) {
        if (i == pos) {
            continue;
        }
        PostEntry *widget = qobject_cast<PostEntry*>( tabPosts->widget( i ) );
464 465
        if ( !widget ) {
            if ( activePost )
466 467 468 469 470 471 472 473
                widget = activePost;
            else
                return;
        }
        DBMan::self()->removeTempEntry( *widget->currentPost() );
        tabPosts->removePage(widget);
        widget->close();
    }
474
    if ( tabPosts->count() < 1 ) {
475 476 477 478 479 480
        activePost = 0;
        toolbox->resetFields();
//         actionCollection()->action("publish_post")->setEnabled( false );
    }
}

481
void MainWindow::slotRemovePostEntry( int pos )
482 483
{
    kDebug();
484 485 486

    PostEntry *widget = qobject_cast<PostEntry*>( tabPosts->widget( pos ) );
    
487 488
    if ( !widget ) {
        if ( activePost )
489 490 491
            widget = activePost;
        else
            return;
492 493 494 495 496
    }
    DBMan::self()->removeTempEntry( *widget->currentPost() );
    tabPosts->removePage(widget);
    widget->close();

497
    if ( tabPosts->count() < 1 ) {
498 499 500 501 502 503
        activePost = 0;
        toolbox->resetFields();
//         actionCollection()->action("publish_post")->setEnabled( false );
    }
}

504
void MainWindow::slotNewPostOpened( BilboPost &newPost, int blog_id )
505 506 507 508 509 510
{
    kDebug();
    QWidget * w = createPostEntry( blog_id, newPost );
    tabPosts->setCurrentWidget( w );
}

511
void MainWindow::slotSavePostLocally()
512 513
{
    kDebug();
Laurent Montel's avatar
Laurent Montel committed
514
    if (activePost && (tabPosts->count() > 0)) {
515
        toolbox->getFieldsValue(activePost->currentPost());
516 517 518 519 520
        activePost->saveLocally();
        toolbox->reloadLocalPosts();
    }
}

521
void MainWindow::slotError( const QString & errorMessage )
522 523
{
    kDebug() << "Error message: " << errorMessage;
Andrew Coles's avatar
Andrew Coles committed
524
    KMessageBox::detailedError( this, i18n( "An error occurred in the last transaction." ), errorMessage );
525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557
    statusBar()->clearMessage();
    slotBusy(false);
}

void MainWindow::writeConfigs()
{
    kDebug();
    if ( toolboxDock->isVisible() )
        Settings::setShowToolboxOnStart( true );
    else
        Settings::setShowToolboxOnStart( false );
}

void MainWindow::keyPressEvent( QKeyEvent * event )
{
    if ( event->modifiers() == Qt::CTRL ) {
        switch ( event->key() ) {
            case  Qt::Key_1:
                toolbox->setCurrentPage( 0 );
                break;
            case Qt::Key_2:
                toolbox->setCurrentPage( 1 );
                break;
            case Qt::Key_3:
                toolbox->setCurrentPage( 2 );
                break;
            case Qt::Key_4:
                toolbox->setCurrentPage( 3 );
                break;
            case Qt::Key_5:
                toolbox->setCurrentPage( 4 );
                break;
            case Qt::Key_W:
558
                slotRemovePostEntry( tabPosts->currentIndex() );
559 560 561 562 563 564 565 566 567 568 569
                break;
            default:
                KXmlGuiWindow::keyPressEvent( event );
                break;
        }
    }
}

void MainWindow::postManipulationDone( bool isError, const QString &customMessage )
{
    kDebug();
570
    if (isError){
Yuri Chornoivan's avatar
Yuri Chornoivan committed
571
        KMessageBox::detailedError(this, i18n("Submitting post failed"), customMessage);
572 573
    } else {
        PostEntry *entry = qobject_cast<PostEntry*>(sender());
574
        if (entry){
575
          if (KMessageBox::questionYesNo(this, i18n("%1\nDo you want to keep the post open?", customMessage),
Laurent Montel's avatar
Laurent Montel committed
576
                    QString(), KStandardGuiItem::yes(), KStandardGuiItem::no(), QLatin1String("KeepPostOpen")) == KMessageBox::No ) {
577
            slotRemovePostEntry( tabPosts->indexOf( entry ) );
578
          } else {
579
            toolbox->setFieldsValue(entry->currentPost());
580
          }
581
        }
582
        toolbox->slotLoadEntriesFromDB( mCurrentBlogId );
583 584 585 586 587 588 589 590
    }
    this->unsetCursor();
    toolbox->unsetCursor();
}

void MainWindow::slotBusy(bool isBusy)
{
    kDebug()<<"isBusy="<<isBusy<<"\tbusyNumber="<<busyNumber;
591
    if (isBusy){
592 593 594
        this->setCursor(Qt::BusyCursor);
        toolbox->setCursor( Qt::BusyCursor );
        ++busyNumber;
595
        if (!progress){
596 597 598 599 600 601 602 603
            progress = new QProgressBar(statusBar());
            progress->setMinimum( 0 );
            progress->setMaximum( 0 );
            progress->setFixedSize(250, 17);
            statusBar()->addPermanentWidget(progress);
        }
    } else {
        --busyNumber;
604
        if ( busyNumber < 1 ){
605 606
            this->unsetCursor();
            toolbox->unsetCursor();
607
            if (progress){
608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624
                statusBar()->removeWidget(progress);
                progress->deleteLater();
                progress = 0;
            }
//             busyNumber = 0;
        }
    }
}

QWidget* MainWindow::createPostEntry(int blog_id, const BilboPost& post)
{
    kDebug();
    PostEntry *temp = new PostEntry( this );
    temp->setAttribute( Qt::WA_DeleteOnClose );
    temp->setCurrentPost(post);
    temp->setCurrentPostBlogId( blog_id );

Laurent Montel's avatar
Laurent Montel committed
625 626 627 628 629 630
    connect( temp, SIGNAL(postTitleChanged(QString)),
             this, SLOT(slotPostTitleChanged(QString)) );
    connect( temp, SIGNAL(postPublishingDone(bool,QString)),
            this, SLOT(postManipulationDone(bool,QString)) );
    connect( this, SIGNAL(settingsChanged()), temp, SLOT(settingsChanged()));
    connect( temp, SIGNAL(showStatusMessage(QString,bool)),
631 632
             this, SLOT(slotShowStatusMessage(QString,bool)));

Laurent Montel's avatar
Laurent Montel committed
633
    connect( temp, SIGNAL(sigBusy(bool)), this, SLOT(slotBusy(bool)) );
634 635 636 637 638 639 640 641 642 643 644 645 646 647

    tabPosts->addTab( temp, post.title() );
    return temp;
}

void MainWindow::slotShowStatusMessage(const QString &message, bool isPermanent)
{
    statusBar()->showMessage(message, (isPermanent ? 0 : TIMEOUT));
}

void MainWindow::uploadMediaObject()
{
    UploadMediaDialog *uploadDlg = new UploadMediaDialog(this);
    connect(uploadDlg, SIGNAL(sigBusy(bool)), SLOT(slotBusy(bool)));
648
    if (mCurrentBlogId == -1)
649 650
        uploadDlg->init( 0 );
    else
Mehrdad Momeny's avatar
Mehrdad Momeny committed
651
        uploadDlg->init( DBMan::self()->blog(mCurrentBlogId) );
652 653
}

654 655
void MainWindow::slotOpenCurrentBlogInBrowser()
{
Mehrdad Momeny's avatar
Mehrdad Momeny committed
656
    if (mCurrentBlogId > -1) {
Mehrdad Momeny's avatar
Mehrdad Momeny committed
657
        KUrl url( DBMan::self()->blog( mCurrentBlogId )->blogUrl() );
658
        if (url.isValid())
Mehrdad Momeny's avatar
Mehrdad Momeny committed
659 660 661
            KToolInvocation::invokeBrowser(url.url());
        else
            KMessageBox::sorry(this, i18n("Cannot find current blog URL."));
662 663
    }
    ///TODO
Laurent Montel's avatar
Cleanup  
Laurent Montel committed
664
    ///else show a message to the user saying that a blog should be selected before.
665 666
}