Tags: patch
I completely forgot about this bug, sorry :) Maybe it's too obsolete now...
This patch changes the name of a bunch of variables (kde code is hard
to understand), adds docs, and (to actually fix the bug), adds a
signal itemSelected -> slotResetAffect... This resets the affect
position pointer every time we select a new view so operations happen
on the new view until the user makes a new right click. I also
removed some calls to the reset function which are redundant now.
This also fixes moving a tab after moving *to* a different tab using
shift+arrow which I didn't notice in the original report.
diff --git a/yakuake/src/main_window.cpp b/yakuake/src/main_window.cpp
index 7a15bde..62e8703 100644
--- a/yakuake/src/main_window.cpp
+++ b/yakuake/src/main_window.cpp
@@ -380,10 +380,9 @@ void MainWindow::slotRemoveSession(int session_id)
void MainWindow::slotHandleRemoveSession(KAction::ActivationReason reason, Qt::ButtonState /* state */)
{
if (reason == KAction::PopupMenuActivation
- && tab_bar->pressedPosition() != -1)
+ && tab_bar->affectPosition() != -1)
{
- slotRemoveSession(tab_bar->sessionIdForTabPosition(tab_bar->pressedPosition()));
- tab_bar->resetPressedPosition();
+ slotRemoveSession(tab_bar->sessionIdForTabPosition(tab_bar->affectPosition()));
}
else
slotRemoveSession();
@@ -653,10 +652,9 @@ void MainWindow::windowActivationChange(bool old_active)
void MainWindow::slotHandleHorizontalSplit(KAction::ActivationReason reason, Qt::ButtonState /* state */)
{
if (reason == KAction::PopupMenuActivation
- && tab_bar->pressedPosition() != -1)
+ && tab_bar->affectPosition() != -1)
{
- slotSplitHorizontally(tab_bar->sessionIdForTabPosition(tab_bar->pressedPosition()));
- tab_bar->resetPressedPosition();
+ slotSplitHorizontally(tab_bar->sessionIdForTabPosition(tab_bar->affectPosition()));
}
else
slotSplitHorizontally();
@@ -665,10 +663,9 @@ void MainWindow::slotHandleHorizontalSplit(KAction::ActivationReason reason, Qt:
void MainWindow::slotHandleVerticalSplit(KAction::ActivationReason reason, Qt::ButtonState /* state */)
{
if (reason == KAction::PopupMenuActivation
- && tab_bar->pressedPosition() != -1)
+ && tab_bar->affectPosition() != -1)
{
- slotSplitVertically(tab_bar->sessionIdForTabPosition(tab_bar->pressedPosition()));
- tab_bar->resetPressedPosition();
+ slotSplitVertically(tab_bar->sessionIdForTabPosition(tab_bar->affectPosition()));
}
else
slotSplitVertically();
@@ -678,10 +675,9 @@ void MainWindow::slotHandleVerticalSplit(KAction::ActivationReason reason, Qt::B
void MainWindow::slotHandleRemoveTerminal(KAction::ActivationReason reason, Qt::ButtonState /* state */)
{
if (reason == KAction::PopupMenuActivation
- && tab_bar->pressedPosition() != -1)
+ && tab_bar->affectPosition() != -1)
{
- slotRemoveTerminal(tab_bar->sessionIdForTabPosition(tab_bar->pressedPosition()));
- tab_bar->resetPressedPosition();
+ slotRemoveTerminal(tab_bar->sessionIdForTabPosition(tab_bar->affectPosition()));
}
else
slotRemoveTerminal();
@@ -1323,7 +1319,7 @@ void MainWindow::slotPollMouse()
if (pos.y() == 0)
{
- if (Settings::screen() == 0)
+ if (Settings::screen() == 0)
slotToggleState(); // no need to check x since yakuake should open where the mouse pointer is
else if (pos.x() >= getDesktopGeometry().x() && pos.x() <= (getDesktopGeometry().x() + getDesktopGeometry().width()))
slotToggleState();
diff --git a/yakuake/src/tab_bar.cpp b/yakuake/src/tab_bar.cpp
index 72347db..52aa26b 100644
--- a/yakuake/src/tab_bar.cpp
+++ b/yakuake/src/tab_bar.cpp
@@ -21,7 +21,6 @@
#include <klocale.h>
#include <kpopupmenu.h>
-
TabBar::TabBar(QWidget* parent, const char* name, bool translucency, const QString & skin)
: TranslucentWidget(parent, name, translucency)
{
@@ -41,15 +40,9 @@ TabBar::~TabBar()
delete minus_button;
}
-int TabBar::pressedPosition()
-{
- return tabs_widget->pressedPosition();
-}
-
-
-void TabBar::resetPressedPosition()
+int TabBar::affectPosition()
{
- tabs_widget->resetPressedPosition();
+ return tabs_widget->affectPosition();
}
void TabBar::addItem(int session_id)
diff --git a/yakuake/src/tab_bar.h b/yakuake/src/tab_bar.h
index 6e8f3a0..2e05449 100644
--- a/yakuake/src/tab_bar.h
+++ b/yakuake/src/tab_bar.h
@@ -41,8 +41,8 @@ class TabBar : public TranslucentWidget
void setSessionMenu(KPopupMenu* menu);
- int pressedPosition();
- void resetPressedPosition();
+ int affectPosition();
+ // void resetAffectPosition();
void addItem(int session_id);
int removeItem(int session_id);
diff --git a/yakuake/src/tabbed_widget.cpp b/yakuake/src/tabbed_widget.cpp
index c2b3961..46c4649 100644
--- a/yakuake/src/tabbed_widget.cpp
+++ b/yakuake/src/tabbed_widget.cpp
@@ -23,13 +23,12 @@
#include <kmainwindow.h>
#include <kiconloader.h>
-
TabbedWidget::TabbedWidget(QWidget* parent, const char* name, bool translucency)
: TranslucentWidget(parent, name, translucency)
{
- current_position = -1;
pressed = false;
- pressed_position = -1;
+ active_position = -1;
+ affect_position = -1;
edited_position = -1;
context_menu = 0;
@@ -44,6 +43,7 @@ TabbedWidget::TabbedWidget(QWidget* parent, const char* name, bool translucency)
inline_edit->hide();
connect(inline_edit, SIGNAL(returnPressed()), this, SLOT(slotRenameSelected()));
+ connect(this, SIGNAL(itemSelected(int)), this, SLOT(slotResetAffectPosition()));
connect(inline_edit, SIGNAL(lostFocus()), inline_edit, SLOT(hide()));
connect(inline_edit, SIGNAL(lostFocus()), this, SLOT(slotResetEditedPosition()));
@@ -59,9 +59,14 @@ TabbedWidget::~TabbedWidget()
delete context_menu;
}
-int TabbedWidget::pressedPosition()
+void TabbedWidget::slotResetAffectPosition()
+{
+ resetAffectPosition();
+}
+
+int TabbedWidget::affectPosition()
{
- return pressed_position;
+ return affect_position;
}
void TabbedWidget::createContextMenu()
@@ -148,18 +153,18 @@ int TabbedWidget::removeItem(int session_id)
captions.remove(captions.at(position));
if (position != items.count())
- current_position = position;
+ active_position = position;
else if (position != 0)
- current_position = position - 1;
+ active_position = position - 1;
else
- current_position = -1;
+ active_position = -1;
refreshBuffer();
- if (current_position != -1)
- emit itemSelected(items[current_position]);
+ if (activePosition() != -1)
+ emit itemSelected(items[activePosition()]);
- return current_position;
+ return activePosition();
}
const QString TabbedWidget::itemName(int session_id)
@@ -185,14 +190,14 @@ void TabbedWidget::renameItem(int session_id, const QString& namep)
void TabbedWidget::interactiveRename()
{
- if (pressed_position != -1)
+ if (affectPosition() != -1)
{
- interactiveRename(pressed_position);
- pressed_position = -1;
+ interactiveRename(affectPosition());
+ affect_position = -1;
}
else
{
- interactiveRename(current_position);
+ interactiveRename(activePosition());
}
}
@@ -257,7 +262,7 @@ void TabbedWidget::selectItem(int session_id)
if (new_position != -1)
{
- current_position = new_position;
+ active_position = new_position;
refreshBuffer();
}
}
@@ -266,47 +271,49 @@ void TabbedWidget::selectPosition(int position)
{
if (position < int(items.count()) && !items.isEmpty())
{
- current_position = position;
+ active_position = position;
refreshBuffer();
- emit itemSelected(items[current_position]);
+ emit itemSelected(items[activePosition()]);
}
}
void TabbedWidget::selectNextItem()
{
- if (current_position != int(items.count()) - 1)
- current_position++;
+ if (activePosition() != int(items.count()) - 1)
+ active_position++;
else
- current_position = 0;
+ active_position = 0;
refreshBuffer();
- emit itemSelected(items[current_position]);
+ emit itemSelected(items[activePosition()]);
}
void TabbedWidget::selectPreviousItem()
{
- if (current_position != 0)
- current_position--;
+ if (activePosition() != 0)
+ active_position--;
else
- current_position = items.count() - 1;
+ active_position = items.count() - 1;
refreshBuffer();
- emit itemSelected(items[current_position]);
+ emit itemSelected(items[activePosition()]);
}
+/* Disambiguate between affectPosition and activePosition */
void TabbedWidget::moveItemLeft()
{
- if (pressed_position != -1)
+ if (affectPosition() != -1)
{
- moveItemLeft(pressed_position);
- pressed_position = -1;
+ moveItemLeft(affectPosition());
+ resetAffectPosition();
+ }
+ else {
+ moveItemLeft(activePosition());
}
- else
- moveItemLeft(current_position);
}
@@ -326,24 +333,25 @@ void TabbedWidget::moveItemLeft(int position)
items[position] = neighbor_session_id;
captions[position] = neighbor_caption;
- if (position == current_position)
- current_position--;
- else if (position == current_position + 1)
- current_position++;
+ if (position == activePosition())
+ active_position--;
+ else if (position == activePosition() + 1)
+ active_position++;
refreshBuffer();
}
}
+/* Disambiguate between affectPosition and activePosition */
void TabbedWidget::moveItemRight()
{
- if (pressed_position != -1)
+ if (affectPosition() != -1)
{
- moveItemRight(pressed_position);
- pressed_position = -1;
+ moveItemRight(affectPosition());
+ affect_position = -1;
}
else
- moveItemRight(current_position);
+ moveItemRight(activePosition());
}
void TabbedWidget::moveItemRight(int position)
@@ -362,10 +370,10 @@ void TabbedWidget::moveItemRight(int position)
items[position] = neighbor_session_id;
captions[position] = neighbor_caption;
- if (position == current_position)
- current_position++;
- else if (position == current_position - 1)
- current_position--;
+ if (position == activePosition())
+ active_position += 1;
+ else if (position == activePosition() - 1)
+ active_position -= 1;
refreshBuffer();
}
@@ -441,14 +449,14 @@ void TabbedWidget::mousePressEvent(QMouseEvent* e)
for (position = 0, width = 0; (position < int(areas.count())) && (e->x() >= width); position++)
width += areas[position];
- if ((e->x() <= width) && (e->button() == Qt::LeftButton) && !(current_position == position - 1))
+ if ((e->x() <= width) && (e->button() == Qt::LeftButton) && !(activePosition() == position - 1))
{
pressed = true;
- pressed_position = position - 1;
+ affect_position = position - 1;
}
else if ((e->x() <= width) && (e->button() == Qt::RightButton))
{
- pressed_position = position - 1;
+ affect_position = position - 1;
if (!context_menu) createContextMenu();
@@ -479,15 +487,15 @@ void TabbedWidget::mouseReleaseEvent(QMouseEvent* e)
for (position = 0, width = 0; (position < int(areas.count())) && (e->x() >= width); position++)
width += areas[position];
- if ((e->x() <= width) && (e->button() == Qt::LeftButton) && !(current_position == position - 1))
+ if ((e->x() <= width) && (e->button() == Qt::LeftButton) && !(activePosition() == position - 1))
{
- if (pressed && pressed_position == (position - 1))
+ if (pressed && affectPosition() == (position - 1))
{
- current_position = position - 1;
+ active_position = position - 1;
refreshBuffer();
- emit itemSelected(items[current_position]);
+ emit itemSelected(items[activePosition()]);
}
}
@@ -509,7 +517,7 @@ void TabbedWidget::mouseDoubleClickEvent(QMouseEvent* e)
for (position = 0, width = 0; (position < int(areas.count())) && (e->x() >= width); position++)
width += areas[position];
- if ((e->x() <= width) && (e->button() == Qt::LeftButton) && current_position == position - 1)
+ if ((e->x() <= width) && (e->button() == Qt::LeftButton) && activePosition() == position - 1)
{
interactiveRename(position - 1);
}
@@ -566,12 +574,12 @@ const int TabbedWidget::drawButton(int position, QPainter& painter)
// Initialize the painter.
painter.setPen(font_color);
- painter.setFont((position == current_position) ? selected_font : unselected_font);
+ painter.setFont((position == activePosition()) ? selected_font : unselected_font);
// Draw the left border.
- if (position == current_position)
+ if (position == activePosition())
tmp_pixmap = selected_left_image;
- else if (position != current_position + 1)
+ else if (position != activePosition() + 1)
tmp_pixmap = separator_image;
painter.drawPixmap(x, 0, tmp_pixmap);
@@ -584,7 +592,7 @@ const int TabbedWidget::drawButton(int position, QPainter& painter)
width = metrics.width(captions[position]) + 10;
- tmp_pixmap = (position == current_position) ? selected_image : unselected_image;
+ tmp_pixmap = (position == activePosition()) ? selected_image : unselected_image;
painter.drawTiledPixmap(x, 0, width, height(), tmp_pixmap);
painter.drawText(x, 0, width + 1, height() + 1,
@@ -594,7 +602,7 @@ const int TabbedWidget::drawButton(int position, QPainter& painter)
x += width;
// Draw the right border if needed.
- if (position == current_position)
+ if (position == activePosition())
{
painter.drawPixmap(x, 0, selected_right_image);
areas[position] += selected_right_image.width();
diff --git a/yakuake/src/tabbed_widget.h b/yakuake/src/tabbed_widget.h
index f3a42b8..3e18302 100644
--- a/yakuake/src/tabbed_widget.h
+++ b/yakuake/src/tabbed_widget.h
@@ -41,8 +41,10 @@ class TabbedWidget : public TranslucentWidget
explicit TabbedWidget(QWidget* parent = 0, const char* name = 0, bool translucency = false);
~TabbedWidget();
- int pressedPosition();
- void resetPressedPosition() { pressed_position = -1; }
+ int affectPosition();
+ /* The operation is complete or cancelled; subsequent ops will use the
+ * active position. */
+ void resetAffectPosition() { affect_position = -1; }
void addItem(int session_id);
int removeItem(int session_id);
@@ -105,9 +107,19 @@ class TabbedWidget : public TranslucentWidget
QString defaultTabCaption(int session_id);
QString lowestAvailableCaption();
- int current_position;
+ int activePosition() const {
+ return active_position;
+ }
+
+ /* Which tab is active now. */
+ int active_position;
+ /* True if we recieved a click event *on* a tab. */
bool pressed;
- int pressed_position;
+ /* Which position will be affected by changes. -1 if none. Eg, for
+ * a right-click context menu. */
+ int affect_position;
+ /* Position we are editing the name of. Separate from affect_position
+ * because we can have a right click while we're editing. */
int edited_position;
/* Tabs properties */
@@ -144,6 +156,9 @@ class TabbedWidget : public TranslucentWidget
void slotRenameSelected();
void slotUpdateBuffer(const QPixmap& pixmap);
void slotResetEditedPosition();
+ /* Called after every new item selection to disregard the pointer set
+ * up by a previous right click. */
+ void slotResetAffectPosition();
};
#endif /* TABBED_WIDGET_H */