[mythtv] [patch] setup improvements
Daniel Thor Kristjansson
danielk at mrl.nyu.edu
Tue Jan 18 10:25:44 EST 2005
There are three features added in this patch
* The keys 'D' and 'E' are bound to the signals editButtonPressed()
and deleteButtonPressed(), which are bound to the edit() and delete()
functions in CaptureCardGroup and CaptureCardEditor, this allows
you to edit these by pressing 'E' and delete these by pressing 'D'
* VideoDevice has now accepts an optional minimum and maximum
videodevice minor number. This lets you filter out videodevices
we know are not valid for a particular capture card, such as
PVR and pcHDTV cards which always accept a card with a minor number
greater than or equal to 32. I've also removed duplicate card
entries, by minor number, so that if you have a device at
/dev/v4l/video32, /dev/video32, /dev/dtv0, and /dev/dtv1 all
referring to the same device only /dev/v4l/video32 will be
added to the list.
* Two new configuration groups are added. MPEGConfigurationGroup
and pcHDTVConfigurationGroup, these remove configration entries
which have no meaning for these cards, such as the VBI and audio
capture devices. These confuse new users, and are not needed.
NOTE: I've put the pcHDTV entries in a "ATSC (Digital Television)"
VerticalConfiguration group, which will disambiguate it from
the Analog device configration later on. Also: these two
configuration groups ask VideoDevice for video devices with
minor numbers greater than or equal to 32.
The breakdown by file is
libs/libmyth/settings.cpp:
actions DELETE & EDIT added to
ConfigurationDialogWidget::keyPressEvent(QKeyEvent* e)
libs/libmyth/settings.h:
adds signals editButtonPressed(), deleteButtonPressed()
setup/main.cpp:
'D' & 'E' keys bound to DELETE & EDIT, resp
libs/libmythtv/videosource.cpp:
* VideoDevice changes: minor number range, and duplicate removal
* New configuration groups for MPEG and pcHDTV
* Binding of editButtonPressed(), deleteButtonPressed()
to edit() and delete(), resp.
-- Daniel
-------------- next part --------------
Index: libs/libmyth/settings.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmyth/settings.cpp,v
retrieving revision 1.84
diff -u -r1.84 settings.cpp
--- libs/libmyth/settings.cpp 29 May 2004 18:30:43 -0000 1.84
+++ libs/libmyth/settings.cpp 18 Jan 2005 15:23:03 -0000
@@ -630,6 +630,10 @@
accept();
else if (action == "ESCAPE")
reject();
+ else if (action == "EDIT")
+ emit editButtonPressed();
+ else if (action == "DELETE")
+ emit deleteButtonPressed();
else
handled = false;
}
Index: libs/libmyth/settings.h
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmyth/settings.h,v
retrieving revision 1.55
diff -u -r1.55 settings.h
--- libs/libmyth/settings.h 29 May 2004 18:30:44 -0000 1.55
+++ libs/libmyth/settings.h 18 Jan 2005 15:23:04 -0000
@@ -169,12 +169,17 @@
};
class ConfigurationDialogWidget: public MythDialog {
+ Q_OBJECT
public:
ConfigurationDialogWidget(MythMainWindow *parent,
const char* widgetName = 0):
MythDialog(parent, widgetName) {};
virtual void keyPressEvent(QKeyEvent* e);
+
+signals:
+ void editButtonPressed();
+ void deleteButtonPressed();
};
class ConfigurationDialog: virtual public Configurable {
Index: libs/libmythtv/videosource.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/videosource.cpp,v
retrieving revision 1.53
diff -u -r1.53 videosource.cpp
--- libs/libmythtv/videosource.cpp 30 Dec 2004 02:40:16 -0000 1.53
+++ libs/libmythtv/videosource.cpp 18 Jan 2005 15:23:04 -0000
@@ -8,6 +8,7 @@
#include <qcursor.h>
#include <qlayout.h>
#include <qfile.h>
+#include <qmap.h>
#include <iostream>
#ifdef USING_DVB
@@ -476,19 +477,67 @@
class VideoDevice: public PathSetting, public CCSetting {
public:
- VideoDevice(const CaptureCard& parent):
- PathSetting(true),
- CCSetting(parent, "videodevice") {
+ VideoDevice(const CaptureCard& parent,
+ uint minor_min=0, uint minor_max=UINT_MAX):
+ PathSetting(true), CCSetting(parent, "videodevice") {
setLabel(QObject::tr("Video device"));
- QDir dev("/dev", "video*", QDir::Name, QDir::System);
- fillSelectionsFromDir(dev);
- dev.setPath("/dev/v4l");
- fillSelectionsFromDir(dev);
+
+ // /dev/v4l/video*
+ QDir dev("/dev/v4l", "video*", QDir::Name, QDir::System);
+ fillSelectionsFromDir(dev, minor_min, minor_max, false);
+
+ // /dev/video*
+ dev.setPath("/dev");
+ fillSelectionsFromDir(dev, minor_min, minor_max, false);
+
+ // /dev/dtv/video*
dev.setPath("/dev/dtv");
- fillSelectionsFromDir(dev);
+ fillSelectionsFromDir(dev, minor_min, minor_max, false);
+
+ // /dev/dtv*
+ dev.setPath("/dev");
+ dev.setNameFilter("dtv*");
+ fillSelectionsFromDir(dev, minor_min, minor_max, false);
+
+ VERBOSE(VB_IMPORTANT, "");
};
+ void fillSelectionsFromDir(const QDir& dir,
+ uint minor_min, uint minor_max,
+ bool allow_duplicates) {
+ const QFileInfoList *il = dir.entryInfoList();
+ if (!il)
+ return;
+
+ QFileInfoListIterator it( *il );
+ QFileInfo *fi;
+
+ for(; (fi = it.current()) != 0; ++it) {
+ struct stat st;
+ QString filepath = fi->absFilePath();
+ int err = lstat(filepath, &st);
+ if (0==err) {
+ if (S_ISCHR(st.st_mode)) {
+ uint minor_num = minor(st.st_rdev);
+ // this is a character device, if it is in range add it to list
+ if (minor_min<=minor_num &&
+ minor_max>=minor_num &&
+ (allow_duplicates ||
+ (minor_list.find(minor_num)==minor_list.end())))
+ {
+ addSelection(filepath);
+ minor_list[minor_num]=1;
+ }
+ }
+ }
+ else
+ VERBOSE(VB_IMPORTANT, QString("could not stat file: %1").arg(filepath));
+ }
+ }
+
static QStringList probeInputs(QString device);
+private:
+ QMap<uint, uint> minor_list;
};
class VbiDevice: public PathSetting, public CCSetting {
@@ -736,6 +785,48 @@
CaptureCard& parent;
};
+class MPEGConfigurationGroup: public VerticalConfigurationGroup {
+public:
+ MPEGConfigurationGroup(CaptureCard& a_parent):
+ parent(a_parent) {
+ setUseLabel(false);
+
+ VideoDevice* device;
+ TunerCardInput* input;
+
+ addChild(device = new VideoDevice(parent, 0, 15));
+ addChild(input = new TunerCardInput(parent));
+ connect(device, SIGNAL(valueChanged(const QString&)),
+ input, SLOT(fillSelections(const QString&)));
+ input->fillSelections(device->getValue());
+ };
+private:
+ CaptureCard& parent;
+};
+
+class pcHDTVConfigurationGroup: public VerticalConfigurationGroup {
+public:
+ pcHDTVConfigurationGroup(CaptureCard& a_parent):
+ parent(a_parent) {
+
+ setUseLabel(false);
+
+ VerticalConfigurationGroup *atsc =
+ new VerticalConfigurationGroup(true, true);
+ atsc->setLabel(tr("ATSC (Digital Television)"));
+ VideoDevice *atsc_device = new VideoDevice(parent, 32);
+ TunerCardInput *atsc_input = new TunerCardInput(parent);
+ atsc->addChild(atsc_device);
+ atsc->addChild(atsc_input);
+ addChild(atsc);
+ connect(atsc_device, SIGNAL(valueChanged(const QString&)),
+ atsc_input, SLOT(fillSelections(const QString&)));
+ atsc_input->fillSelections(atsc_device->getValue());
+ };
+private:
+ CaptureCard& parent;
+};
+
CaptureCardGroup::CaptureCardGroup(CaptureCard& parent)
{
setLabel(QObject::tr("Capture Card Setup"));
@@ -747,13 +838,13 @@
addTarget("V4L", new V4LConfigurationGroup(parent));
addTarget("DVB", new DVBConfigurationGroup(parent));
+ addTarget("HDTV", new pcHDTVConfigurationGroup(parent));
+ addTarget("MPEG", new MPEGConfigurationGroup(parent));
}
void CaptureCardGroup::triggerChanged(const QString& value)
{
- QString own = value;
- if (own == "HDTV" || own == "MPEG" || own == "MJPEG")
- own = "V4L";
+ QString own = (value == "MJPEG") ? "V4L" : value;
TriggeredConfigurationGroup::triggerChanged(own);
}
@@ -1026,6 +1117,8 @@
{
dialog = ConfigurationDialog::dialogWidget(parent, widgetName);
connect(dialog, SIGNAL(menuButtonPressed()), this, SLOT(menu()));
+ connect(dialog, SIGNAL(editButtonPressed()), this, SLOT(edit()));
+ connect(dialog, SIGNAL(deleteButtonPressed()), this, SLOT(del()));
return dialog;
}
@@ -1087,6 +1180,8 @@
{
dialog = ConfigurationDialog::dialogWidget(parent, widgetName);
connect(dialog, SIGNAL(menuButtonPressed()), this, SLOT(menu()));
+ connect(dialog, SIGNAL(editButtonPressed()), this, SLOT(edit()));
+ connect(dialog, SIGNAL(deleteButtonPressed()), this, SLOT(del()));
return dialog;
}
Index: setup/main.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/setup/main.cpp,v
retrieving revision 1.50
diff -u -r1.50 main.cpp
--- setup/main.cpp 1 Jan 2005 22:46:53 -0000 1.50
+++ setup/main.cpp 18 Jan 2005 15:23:05 -0000
@@ -161,6 +161,9 @@
if (dboxProg.exec() == 2)
clearAllDB();
+ REG_KEY("qt", "DELETE", "Delete", "D");
+ REG_KEY("qt", "EDIT", "Edit", "E");
+
SetupMenu();
cout << "If this is the master backend server:\n";
More information about the mythtv-dev
mailing list