Ejemplo n.º 1
0
void
KeyboardPage::updateVariants( const QPersistentModelIndex& currentItem,
                              QString currentVariant )
{
    // Block signals
    ui->listVariant->blockSignals( true );

    QMap< QString, QString > variants =
        currentItem.data( KeyboardLayoutModel::KeyboardVariantsRole )
        .value< QMap< QString, QString > >();
    QMapIterator< QString, QString > li( variants );
    LayoutItem* defaultItem = nullptr;

    ui->listVariant->clear();

    while ( li.hasNext() )
    {
        li.next();

        LayoutItem* item = new LayoutItem();
        item->setText( li.key() );
        item->data = li.value();
        ui->listVariant->addItem( item );

        // currentVariant defaults to QString(). It is only non-empty during the
        // initial setup.
        if ( li.value() == currentVariant )
            defaultItem = item;
    }

    // Unblock signals
    ui->listVariant->blockSignals( false );

    // Set to default value
    if ( defaultItem )
        ui->listVariant->setCurrentItem( defaultItem );
}
void Page_Keyboard::listLayout_currentItemChanged(QListWidgetItem * current, QListWidgetItem *) {
    LayoutItem *item = dynamic_cast<LayoutItem*>(current);
    if (!item)
        return;

    // Block signals
    ui->listVariant->blockSignals(true);

    QMap< QString, QString > variants = item->info.variants;
    QMapIterator<QString, QString> li(variants);
    LayoutItem *defaultItem = NULL;

    ui->listVariant->clear();

    while (li.hasNext()) {
        li.next();

        item = new LayoutItem(ui->listVariant);
        item->setText(li.key());
        item->data = li.value();

        if (li.value() == "")
            defaultItem = item;
    }

    // Set to default value
    if (defaultItem)
        ui->listVariant->setCurrentItem(defaultItem);

    // Trigger signals
    listVariant_currentItemChanged(ui->listVariant->currentItem(), ui->listVariant->currentItem());

    // Unblock signals
    ui->listVariant->blockSignals(false);

    updateApplyEnabledState();
}
void Page_Keyboard::activated() {
    // Clean up first
    ui->listLayout->clear();
    ui->listVariant->clear();
    ui->comboBoxModel->clear();

    // Default focus
    ui->listLayout->setFocus();


    //### Detect current keyboard layout and variant
    QString currentLayout, currentVariant;

    if (!Global::getCurrentXorgKeyboardLayout(currentLayout, currentVariant))
        QMessageBox::warning(this, tr("Error"), tr("Failed to determind current Xorg keyboard layout!"), QMessageBox::Ok, QMessageBox::Ok);


    //### Models
    models = Global::getKeyboardModels();
    QMapIterator<QString, QString> mi(models);

    ui->comboBoxModel->blockSignals(true);

    while (mi.hasNext()) {
        mi.next();

        if (mi.value() == "pc105")
            defaultIndex = ui->comboBoxModel->count();

        ui->comboBoxModel->addItem(mi.key());
    }

    ui->comboBoxModel->blockSignals(false);

    // Set to default value pc105
    ui->comboBoxModel->setCurrentIndex(defaultIndex);




    //### Layouts and Variants

    // Block signals
    ui->listLayout->blockSignals(true);

    QMap<QString, Global::KeyboardInfo> layouts = Global::getKeyboardLayouts();
    QMapIterator<QString, Global::KeyboardInfo> li(layouts);
    LayoutItem *currentLayoutItem = NULL;

    if (layouts.isEmpty())
        return;

    while (li.hasNext()) {
        li.next();

        LayoutItem *item = new LayoutItem(ui->listLayout);
        Global::KeyboardInfo info = li.value();

        item->setText(info.description);
        item->data = li.key();
        item->info = info;

        // Find current layout index
        if (li.key() == currentLayout)
            currentLayoutItem = item;
    }

    ui->listLayout->sortItems();

    // Set current layout
    if (currentLayoutItem)
        ui->listLayout->setCurrentItem(currentLayoutItem);
    else if (ui->listLayout->count() > 0)
        ui->listLayout->setCurrentRow(0);

    // Trigger signal
    listLayout_currentItemChanged(ui->listLayout->currentItem(), ui->listLayout->currentItem());

    // Set current variant
    if (!currentVariant.isEmpty()) {
        for(int i = 0; i < ui->listVariant->count(); ++i) {
            LayoutItem *item = dynamic_cast<LayoutItem*>(ui->listVariant->item(i));
            if (item && item->data == currentVariant) {
                ui->listVariant->setCurrentItem(item);
                break;
            }
        }
    }

    // Unblock signals
    ui->listLayout->blockSignals(false);
}