[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-devel
Subject: Re: [PATCH] kcalc: add "bitset" panel
From: Michel Marti <mma () objectxp ! com>
Date: 2006-07-31 18:47:57
Message-ID: 44CE505D.6030107 () objectxp ! com
[Download RAW message or body]
Albert Astals Cid wrote:
> Yeah, i'd say Klaus is the most similar to a mantainer kcalc has.
Thanks, I just forwarded a slightly modified patch (also attached to this email)
to him.
Michel
["kcalc-bitset.patch" (text/plain)]
Index: kcalcdisplay.cpp
===================================================================
--- kcalcdisplay.cpp (revision 568278)
+++ kcalcdisplay.cpp (working copy)
@@ -286,6 +286,7 @@
}
setText(display_str);
+ emit changedAmount(_display_amount);
return true;
}
@@ -415,7 +416,7 @@
default:
return false;
}
-
+ emit changedAmount(_display_amount);
return true;
}
Index: kcalc.cpp
===================================================================
--- kcalc.cpp (revision 568278)
+++ kcalc.cpp (working copy)
@@ -71,9 +71,9 @@
#include "constants.h"
#include <kaccelmanager.h>
#include "kcalc_settings.h"
+#include "kcalc_bitset.h"
-
static const char description[] = I18N_NOOP("KDE Calculator");
static const char version[] = KCALCVERSION;
@@ -121,11 +121,6 @@
"Octal-Switch");
QToolTip::add(pbBaseChoose[2], i18n("Switch base to octal."));
- pbBaseChoose[3] = new QRadioButton(i18n("&Bin"), BaseChooseGroup,
- "Binary-Switch");
- QToolTip::add(pbBaseChoose[3], i18n("Switch base to binary."));
-
-
// Create Button to select AngleMode
pbAngleChoose = new QPushButton(i18n("&Angle"),
central, "ChooseAngleMode-Button");
@@ -151,6 +146,10 @@
pbInv, SLOT(slotSetAccelDisplayMode(bool)));
pbInv->setToggleButton(true);
+ // Create Bitset Display
+ mBitset = new KCalcBitset(central);
+ QToolTip::add(mBitset, i18n("Click on a Bit to toggle it."));
+
//
// Create Calculator Buttons
//
@@ -237,16 +236,20 @@
mInternalSpacing);
QHBoxLayout *topLayout = new QHBoxLayout();
+ QHBoxLayout *mdlLayout = new QHBoxLayout();
QHBoxLayout *btnLayout = new QHBoxLayout();
+
// bring them all together
QVBoxLayout *mainLayout = new QVBoxLayout(central, mInternalSpacing,
mInternalSpacing);
mainLayout->addLayout(topLayout);
+ mainLayout->addLayout(mdlLayout);
mainLayout->addLayout(btnLayout);
// button layout
+ mdlLayout->addWidget(mBitset, 0, AlignTop);
btnLayout->addWidget(mSmallPage, 0, AlignTop);
btnLayout->addSpacing(2*mInternalSpacing);
btnLayout->addWidget(mNumericPage, 0, AlignTop);
@@ -1123,11 +1126,6 @@
// set display & statusbar (if item exist in statusbar)
switch(base)
{
- case 3:
- current_base = calc_display->setBase(NumBase(2));
- if (statusBar()->hasItem(1)) statusBar()->changeItem("BIN",1);
- calc_display->setStatusText(1, "Bin");
- break;
case 2:
current_base = calc_display->setBase(NumBase(8));
if (statusBar()->hasItem(1)) statusBar()->changeItem("OCT",1);
@@ -1993,7 +1991,13 @@
{
if(toggled)
{
- pbLogic["AND"]->show();
+ mBitset->show();
+ connect(mBitset, SIGNAL(valueChanged(unsigned long long)),
+ this, SLOT(slotBitsetChanged(unsigned long long)));
+ connect(calc_display, SIGNAL(changedAmount(const KNumber &)),
+ SLOT(slotUpdateBitset(const KNumber &)));
+
+ pbLogic["AND"]->show();
pbLogic["OR"]->show();
pbLogic["XOR"]->show();
pbLogic["One-Complement"]->show();
@@ -2010,7 +2014,12 @@
}
else
{
- pbLogic["AND"]->hide();
+ mBitset->hide();
+ disconnect(mBitset, SIGNAL(valueChanged(unsigned long long)),
+ this, SLOT(slotBitsetChanged(unsigned long long)));
+ disconnect(calc_display, SIGNAL(changedAmount(const KNumber &)),
+ this, SLOT(slotUpdateBitset(const KNumber &)));
+ pbLogic["AND"]->hide();
pbLogic["OR"]->hide();
pbLogic["XOR"]->hide();
pbLogic["One-Complement"]->hide();
@@ -2087,6 +2096,15 @@
if(actionConstantsShow->isChecked()) actionConstantsShow->activate();
}
+void KCalculator::slotBitsetChanged(unsigned long long value) {
+ calc_display->setAmount(value);
+ UpdateDisplay(false);
+}
+
+void KCalculator::slotUpdateBitset(const KNumber &nr) {
+ mBitset->setValue(nr);
+}
+
void KCalculator::updateSettings()
{
changeButtonNames();
Index: kcalc_bitset.cpp
===================================================================
--- kcalc_bitset.cpp (revision 0)
+++ kcalc_bitset.cpp (revision 0)
@@ -0,0 +1,102 @@
+/*
+ Copyright (C) 2006 Michel Marti <mma@objectxp.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include <qlayout.h>
+#include <qhbox.h>
+
+#include "kcalc_bitset.h"
+
+KCalcBitset::KCalcBitset( QWidget *parent, const char *name )
+ : QFrame(parent, name), mValue(0)
+{
+ setFrameStyle( QFrame::Panel | QFrame::Sunken );
+ QGridLayout *layout = new QGridLayout(this, 4, 8, 2, 0);
+
+ for( int i=0, r=0; r<3; r+=2 )
+ {
+ for(int c=0; c<8; c++)
+ {
+ // Labels on column 0, 4, 7
+ if(c==0 || c ==4 || c==7)
+ {
+ QLabel *label = new QLabel(this);
+ int bn = 63-i;
+ if(c==7)
+ {
+ label->setAlignment(Qt::AlignRight);
+ bn-=3;
+ }
+ label->setText(QString::number(bn));
+ label->setPaletteForegroundColor(QColor(0,0,255));
+ layout->addWidget(label, r+1,c);
+ }
+ QHBox *box = new QHBox(this);
+ layout->addWidget(box, r, c);
+ for( int b=0; b<4; b++ )
+ {
+ mBits[i]=new QLabel(box, QString::number(i).ascii());
+ mBits[i]->installEventFilter(this);
+ mBits[i]->setText("0");
+ i++;
+ }
+ if(c != 7 )
+ {
+ // Add a "spacer"
+ QLabel *sp = new QLabel(box);
+ sp->setMinimumWidth(5);
+ }
+ }
+ }
+
+}
+
+
+void KCalcBitset::setValue(unsigned long long value)
+{
+ mValue=value;
+ for(int i=0; i<64; i++)
+ {
+ mBits[63-i]->setText(value&1?"1":"0");
+ value>>=1;
+ }
+}
+
+unsigned long long KCalcBitset::getValue()
+{
+ return mValue;
+}
+
+bool KCalcBitset::eventFilter( QObject *o, QEvent *e )
+{
+ if(e->type() == QEvent::MouseButtonPress && o->isA("QLabel") )
+ {
+ QString name(o->name());
+ bool ok;
+ int bit = 63-name.toInt(&ok);
+ if(ok)
+ {
+ unsigned long long nv = getValue()^(1LL<<bit);
+ setValue(nv);
+ emit valueChanged(mValue);
+ return true;
+ }
+ }
+ return false;
+}
+
Index: kcalcdisplay.h
===================================================================
--- kcalcdisplay.h (revision 568278)
+++ kcalcdisplay.h (working copy)
@@ -139,6 +139,7 @@
signals:
void clicked(void);
void changedText(QString const &);
+ void changedAmount(const KNumber &);
public slots:
void slotCut(void);
Index: kcalc.h
===================================================================
--- kcalc.h (revision 568278)
+++ kcalc.h (working copy)
@@ -31,6 +31,7 @@
class QWidget;
class DispLogic;
class Constants;
+class KCalcBitset;
#include <kmainwindow.h>
/*
@@ -157,6 +158,9 @@
void slotChooseScientificConst4(int option);
void slotChooseScientificConst5(int option);
+ void slotBitsetChanged(unsigned long long);
+ void slotUpdateBitset(const KNumber &);
+
private:
bool inverse;
bool hyp_mode;
@@ -172,12 +176,14 @@
private:
+
QWidget *mSmallPage;
QWidget *mLargePage;
QWidget *mNumericPage;
+ KCalcBitset *mBitset;
DispLogic* calc_display; // for historic reasons in "dlabel.h"
- QRadioButton* pbBaseChoose[4];
+ QRadioButton* pbBaseChoose[3];
QPushButton* pbAngleChoose;
QDict<KCalcButton> pbStat;
QDict<KCalcButton> pbScientific;
Index: Makefile.am
===================================================================
--- Makefile.am (revision 568278)
+++ Makefile.am (working copy)
@@ -8,7 +8,7 @@
kcalc_la_SOURCES = kcalc.cpp kcalc_button.cpp kcalc_const_button.cpp \
kcalc_const_menu.cpp kcalc_core.cpp kcalcdisplay.cpp \
- dlabel.cpp stats.cpp colors.ui general.ui \
+ dlabel.cpp stats.cpp kcalc_bitset.cpp colors.ui general.ui \
constants.ui kcalc_settings.kcfgc
@@ -16,7 +16,7 @@
noinst_HEADERS = kcalc.h kcalc_button.h kcalc_const_button.h \
kcalc_const_menu.h kcalc_core.h kcalcdisplay.h \
- kcalctype.h dlabel.h stats.h
+ kcalctype.h dlabel.h stats.h kcalc_bitset.h
kcalc_la_LDFLAGS = $(all_libraries) -module -avoid-version
kcalc_la_LIBADD = $(LIB_KDEUI) knumber/libknumber.la
Index: kcalc_bitset.h
===================================================================
--- kcalc_bitset.h (revision 0)
+++ kcalc_bitset.h (revision 0)
@@ -0,0 +1,43 @@
+/*
+ Copyright (C) 2006 Michel Marti <mma@objectxp.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+#ifndef _KCALC_BITSET_H_
+#define _KCALC_BITSET_H_
+
+#include <qframe.h>
+#include <qlabel.h>
+
+class KCalcBitset : public QFrame
+{
+Q_OBJECT
+public:
+ KCalcBitset( QWidget *parent=0, const char *name=0 );
+ unsigned long long getValue();
+public slots:
+ void setValue( unsigned long long value );
+signals:
+ void valueChanged( unsigned long long value );
+protected:
+ bool eventFilter( QObject *o, QEvent *e );
+private:
+ QLabel *mBits[64];
+ unsigned long long mValue;
+};
+
+#endif
+
>> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic