Summary: | Click on a legend entry to edit a curve | ||
---|---|---|---|
Product: | [Applications] kst | Reporter: | D. V. Wiebe <dvw> |
Component: | general | Assignee: | kst |
Status: | RESOLVED FIXED | ||
Severity: | wishlist | ||
Priority: | NOR | ||
Version: | 1.0.0 | ||
Target Milestone: | --- | ||
Platform: | unspecified | ||
OS: | Linux | ||
Latest Commit: | Version Fixed In: | ||
Attachments: | patch to implement something like this feature |
Description
D. V. Wiebe
2004-12-03 20:13:25 UTC
One problem would be that left-click is reserved for zooming and right-click for the context menu. To achieve the desired effect we'd either have to disallow a zoom operation which starts under the legend, or use a modifier key with a right-click, as the left-click + modifier are all used for zooming. Its seem doubtful that a modifier key with a right-click is any longer much of a shortcut. Let's wait until we have view labels. Legends will change then and we can redesign it as we need. I agree with all points, including the original poster... I have often done the same thing, even though I know it won't work. We can i) use double click: it's not currently assigned to anything, and is sort of a 'select' kind of action. ii) close the bug as wontfix for the reasons outlined by Andrew Opinions? Created attachment 9133 [details]
patch to implement something like this feature
This patch makes it so that a double click that is close to a curve (not in the
legend, but inside the plot itself) opens the curve properties or the data
object properties, depending on which seems more applicable. The same code
could easily be applied to legends if desired, but the legend needs a way to
map an entry back to its curve object.
CVS commit by staikos: Double click near a curve (within 5 pixels) opens an editor for the best-guessed properties of that curve. For instance, equation editor, PSD editor, Plugin editor, or curve editor. There is a little bug with log plots I think. Blast folks say this is sufficient as an alternative for clicking on the legend. FEATURE: 94345 M +63 -0 kst2dplot.cpp 1.359 M +1 -0 kst2dplot.h 1.141 --- kdeextragear-2/kst/kst/kst2dplot.cpp #1.358:1.359 @@ -6461,4 +6461,67 @@ QString Kst2DPlot::menuTitle() const { } + +void Kst2DPlot::mouseDoubleClickEvent(QWidget *view, QMouseEvent *e) { + Q_UNUSED(view) + KstBaseCurvePtr curve; + QRect pr = GetPlotRegion(); + QPoint pos = e->pos(); + int i_near_x; + double best_distance = 1.0E300; + double xmin, ymin, xmax, ymax; + getLScale(xmin, ymin, xmax, ymax); + + // find mouse location in plot units + double xpos = double(pos.x() - pr.left())/double(pr.width()) * (xmax - xmin) + xmin; + if (isXLog()) { + xpos = pow(10.0, xpos); + } + + double ypos = double(pos.y() - pr.top()) / double(pr.height()) * (ymin - ymax) + ymax; + + if (isYLog()) { + ypos = pow(10.0, ypos); + } + + // convert 1 pixel to plot units. + double dx_per_pix = double(pos.x()+2 - pr.left()) / double(pr.width()) * (xmax - xmin) + xmin; + if (isXLog()) { + dx_per_pix = pow(10.0, dx_per_pix); + } + dx_per_pix -= xpos; + + for (KstBaseCurveList::Iterator i = Curves.begin(); i != Curves.end(); ++i) { + i_near_x = (*i)->getIndexNearXY(xpos, dx_per_pix, ypos); + double near_x, near_y; + (*i)->point(i_near_x, near_x, near_y); + double distance = fabs(ypos - near_y); + if (distance < best_distance || curve.data() == 0L) { + best_distance = distance; + curve = *i; + } + } + + if (curve && best_distance/fabs((ymax - ymin) / pr.height()) <= 5) { + KST::vectorList.lock().readLock(); + KstVectorPtr vp = *KST::vectorList.findTag(curve->yVTag()); + KST::vectorList.lock().readUnlock(); + KstDataObjectPtr provider; + if (vp) { + vp->readLock(); + provider = kst_cast<KstDataObject>(vp->provider()); + vp->readUnlock(); + } + + if (provider) { + provider->showDialog(); + } else { + curve->showDialog(); + } + } + + e->accept(); +} + + #undef LABEL_PRECISION #include "kst2dplot.moc" --- kdeextragear-2/kst/kst/kst2dplot.h #1.140:1.141 @@ -193,4 +193,5 @@ public: virtual void mouseMoveEvent(QWidget *view, QMouseEvent *e); virtual void mousePressEvent(QWidget *view, QMouseEvent *e); + virtual void mouseDoubleClickEvent(QWidget *view, QMouseEvent *e); virtual void mouseReleaseEvent(QWidget *view, QMouseEvent *e); virtual void keyPressEvent(QWidget *view, QKeyEvent *e); |